LoginSignup
3
12

More than 5 years have passed since last update.

SQL初心者が出会う7つの問題と解決策をまとめました

Last updated at Posted at 2018-07-26

まずは初心者になる

「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じゃない」みたいデータを取りたい場合はこう書きます。selectfromwhereそれぞれでインデントするとこなれ感が出せることもポイントです。

test.sql
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で表します。

test.sql
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

3
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
12