PH2 / W1 / SELECTでデータを取り出す

SELECTでデータを取り出す

courses テーブルから「月曜の授業だけ」「1限から順に」のように、欲しいデータだけを取り出すクエリを、1語ずつ足しながら書けるようになります。

→

授業名を全部見たい

まずは courses に入っている授業名を、全部見てみたいです。

「どのカラムを」「どのテーブルから」の2つを伝えれば取り出せるよ。順番に書いていこう。

idcodename…
1CS101データベース論…
2CS102プログラミング基礎…
3MA101線形代数…

SELECTとFROM

SELECTの後ろに取り出すカラムを、FROMの後ろにテーブルを書きます。SQL のキーワードはこの教材では大文字で書きます。

①どのカラムを?
②どのテーブルから?
query.sql
SELECT name
FROM courses

完成したクエリ

最後に;(セミコロン)を付けると、クエリの終わりが伝わり、1つのクエリが完成します。結果は8行で、ここでは先頭の4行を載せています。

実行結果
name
データベース論
プログラミング基礎
線形代数
英語コミュニケーション
…(全8行)
query.sql
SELECT name
FROM courses;

複数のカラム

授業名と担当教員を一緒に見たいときは、カラム名を,(カンマ)で区切って並べます。結果の列も、書いた順に並びます。

実行結果
nameteacher
データベース論佐藤
プログラミング基礎鈴木
線形代数高橋
…(全8行)
query.sql
SELECT name, teacher
FROM courses;

全部のカラム

カラム名の代わりに*(アスタリスク)を書くと、すべてのカラムを取り出せます。中身をざっと確かめたいときに便利です。

実行結果(9列のうち先頭3列)
idcodename…
1CS101データベース論…
2CS102プログラミング基礎…
…(全8行)
query.sql
SELECT *
FROM courses;

月曜の授業だけ見たい

全部出せました!でも時間割を作るなら、月曜の授業だけ欲しいです。

行をしぼる条件をクエリに足せばいいんだ。月曜は day が 1 だったね。

WHERE

WHEREの後ろに条件を書くと、条件に合う行だけが返ってきます。8行のうち、day が 1 の2行だけが残りました。

実行結果
nameperiod
データベース論2
線形代数1
query.sql
SELECT name, period
FROM courses
WHERE day = 1;

比べる記号

条件には = のほかに、大小を比べる記号も使えます。「等しくない」は != ではなく<>と書くのが SQL の標準です。

記号意味例
=等しいday = 1
<>等しくないday <> 1
< / >より小さい / より大きいperiod < 3
<= / >=以下 / 以上period >= 4

4限以降の授業

period が 4 以上の行を探します。>= は「4 を含む」ので、4限の卒業研究も結果に入ります。

実行結果
nameperiod
卒業研究4
体育実技5
query.sql
SELECT name, period
FROM courses
WHERE period >= 4;

文字列で探す

文字列は'(シングルクォート)で囲みます。囲み忘れると、鈴木 をカラム名だと読まれてエラーになります。

実行結果
nameteacher
プログラミング基礎鈴木
Webアプリ開発鈴木
query.sql
SELECT name, teacher
FROM courses
WHERE teacher = '鈴木';

条件を2つ使いたい

鈴木先生の授業のうち、火曜のものだけ知りたいです。WHERE を2回書けばいいですか?

WHERE は1回だけで、条件どうしを言葉でつなぐんだ。つなぎ方は「かつ」と「または」の2種類あるよ。

AND

2つの条件をANDでつなぐと、両方に当てはまる行だけが残ります。鈴木先生の授業2つのうち、火曜(day が 2)は1つです。

実行結果
nameday
プログラミング基礎2
query.sql
SELECT name, day
FROM courses
WHERE teacher = '鈴木'
  AND day = 2;

OR

ORでつなぐと、どちらか一方にでも当てはまる行が残ります。月曜か火曜の授業は4つです。

実行結果
nameday
データベース論1
プログラミング基礎2
線形代数1
経済学入門2
query.sql
SELECT name, day
FROM courses
WHERE day = 1
  OR day = 2;

教室が空っぽ?

卒業研究だけ room に何も入っていません。room = '' で探せますか?

そこには「値がない」という印のNULLが入っているんだ。空の文字列とは別物で、= では見つけられないよ。

nameroom
経済学入門A101
卒業研究NULL
体育実技G001

IS NULL

NULL かどうかはIS NULLで確かめます。room = NULL と書くとエラーにはならず、0行が返るので、間違いに気づきにくい点に注意しましょう。

実行結果
nameroom
卒業研究NULL
query.sql
SELECT name, room
FROM courses
WHERE room IS NULL;

LIKE

「CS で始まる」のような探し方にはLIKEを使います。%は「0文字以上の何か」を表すので、'CS%' は CS で始まる文字列に当てはまります。

実行結果
codename
CS101データベース論
CS102プログラミング基礎
CS201Webアプリ開発
CS301卒業研究
query.sql
SELECT code, name
FROM courses
WHERE code LIKE 'CS%';

1限から順に並べたい

月曜の授業を出したら、2限のデータベース論が1限の線形代数より先に出てきました。

並び順を指定しないと、データベースは順番を約束してくれないんだ。並べ方もクエリで伝えよう。

ORDER BY

ORDER BYの後ろに並べる基準のカラムを書きます。ASCは小さい順で、省略しても同じです。大きい順にしたいときは DESC と書きます。

実行結果
nameperiod
線形代数1
データベース論2
query.sql
SELECT name, period
FROM courses
WHERE day = 1
ORDER BY period ASC;

2つの基準

カンマで基準を2つ並べると、まず day の順に並べ、day が同じ行どうしは period の順に並べます。これで時間割の順になります。

実行結果
namedayperiod
線形代数11
データベース論12
プログラミング基礎21
経済学入門22
…(全8行)
query.sql
SELECT name, day, period
FROM courses
ORDER BY day, period;

LIMIT

最後にLIMITを付けると、返ってくる行の数を上限で区切れます。並べた結果の先頭3行だけが返ってきます。

実行結果
namedayperiod
線形代数11
データベース論12
プログラミング基礎21
query.sql
SELECT name, day, period
FROM courses
ORDER BY day, period
LIMIT 3;

まとめ

  • SELECT でカラムを、FROM でテーブルを指定し、; で締める
  • WHERE で行をしぼる。文字列は ' で囲み、NULL は IS NULL で探す
  • ORDER BY で並べ、LIMIT で行数を区切る