まずは初心者になる
「SQLまったくわからないよ」という方はこの記事で手を動かしながら最速で入門できます。僕もこの記事を読んで初心者になることができました。感謝です。
MySQLとSQLのわかりやすい説明が欲しいよっていう方はこれらの記事がおすすめです。↓
MySQL
SQL
入門ができたらこの記事に戻ってきていただけると嬉しいです!!
取得したテーブルが長すぎて折り返される
出力された表が長すぎて折り返され、超絶見にくいことがあります。
そういうときはpagerという機能を使います。といっても簡単でこのコマンドを打てば一発です。
mysql > pager less -S;
-S | 画面幅より長い行を折り返さない |
---|
という意味です。
「やっぱこのpagerいらねーわ」となったらこれを打ち込めば元に戻ります。
mysql > nopager;
テーブル幅が長すぎる
「テーブル幅長くない?横スクロールもできないしどうしよ〜😭」
となった場合テーブルのカラム名だけ取得するという技が使えます。
カラム一覧を取得
mysql > describe テーブル名;
カラム名がわかればどこからデータを取ってくればいいかわかるのでこれで十分です。
sqlファイルを書いて実行
SQL初心者のうちは
select * from database;
みたいなことしか書かないのでいいですがどんどんレベルが上がっていくにつれて6行、、、、10行と
書く量が増えてきます。そんな長いコードをいちいちコマンドラインから打ち込むのは面倒です。
そのようなときは拡張子が.sql
のファイルを作ってコマンドラインから実行してあげます。こんな感じです。
mysql > source ファイルのパス;
例えば/Users/kota/test.sql
にsqlのファイルがあった場合
mysql > source /Users/kota/test.sql;
こんな感じで実行します。
「nullじゃない」という条件指定をしてデータを取りたいとき
usersテーブルからnullじゃないuser_idをとるというシチュエーションを考えます。
これでいいと思いきや、エラーがでます。
mysql > select user_id from users where user_id <> null;
なので!=
ではなくis not null
を使います。
mysql > select user_id from users where user_id is not null;
whereでの複数条件指定
普通にandでつなげていきます。
例えば「3月1日〜3月31日の間に登録」してて「user_idがnullじゃない」みたいデータを取りたい場合はこう書きます。select
、from
、where
それぞれでインデントするとこなれ感が出せることもポイントです。
select
user_id from users
from
users
where
created_at between '2018-03-01 00:00:00' and '2018-03-31 23:59:59' and
user_id is not null;
変数を使いたい
同じ値を使う必要が出てきたとき変数が使いたくなります。SQLでも変数は使えます。
例えばさっき出てきた'2018-03-01 00:00:00'
や'2018-03-31 23:59:59'
を二回使いたい場合、
'2018-03-01 00:00:00'
みたいなのを二回書くのは面倒なので@startDate
という変数に入れることもできます。
3月に登録して3月に退会したみたいなユーザーのidを取りたいというようなシチュエーションを考えてみましょう。
退会日をdeleted_at
で表します。
set @startDate = '2018-03-01 00:00:00';
set @endDate = '2018-03-31 23:59:59';
select
user_id from users
where
created_at between @startDate and @endDate and
deleted_at between @startDate and @endDate;
という感じです。スマートに見えますね。
「30日以内」とかで絞ってデータを取りたい
そんなときは日付の引き算をやってくれるdatediff()
関数を使うとうまくできます。
例えば「3月1日にアカウントを作って3月31日までに退会したユーザー」を取りたい!
となった場合、退会日(deleted_at
)から登録日(created_at
)を引いた日数が30日未満であればいいので次のように書けます。
select
user_id
from
users
where
datediff(deleted_at, created_at) < 30
and deleted_at is not null;
以上です!
またSQL初心者(僕)が問題に出会ったら追記していきたいと思います〜
間違いや意見がありましたら教えていただけると嬉しいです!🙂
参考文献
https://qiita.com/kandachime11/items/915bf3a515eaea431b4e
https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html