PH2 / W1 / SELECTでデータを取り出す
SELECTでデータを取り出す
courses テーブルから「月曜の授業だけ」「1限から順に」のように、欲しいデータだけを取り出すクエリを、1語ずつ足しながら書けるようになります。
授業名を全部見たい
まずは courses に入っている授業名を、全部見てみたいです。
「どのカラムを」「どのテーブルから」の2つを伝えれば取り出せるよ。順番に書いていこう。
| id | code | name | … |
|---|---|---|---|
| 1 | CS101 | データベース論 | … |
| 2 | CS102 | プログラミング基礎 | … |
| 3 | MA101 | 線形代数 | … |
SELECTとFROM
SELECTの後ろに取り出すカラムを、FROMの後ろにテーブルを書きます。SQL のキーワードはこの教材では大文字で書きます。
SELECT name FROM courses
完成したクエリ
最後に;(セミコロン)を付けると、クエリの終わりが伝わり、1つのクエリが完成します。結果は8行で、ここでは先頭の4行を載せています。
| name |
|---|
| データベース論 |
| プログラミング基礎 |
| 線形代数 |
| 英語コミュニケーション |
| …(全8行) |
SELECT name FROM courses;
複数のカラム
授業名と担当教員を一緒に見たいときは、カラム名を,(カンマ)で区切って並べます。結果の列も、書いた順に並びます。
| name | teacher |
|---|---|
| データベース論 | 佐藤 |
| プログラミング基礎 | 鈴木 |
| 線形代数 | 高橋 |
| …(全8行) | |
SELECT name, teacher FROM courses;
全部のカラム
カラム名の代わりに*(アスタリスク)を書くと、すべてのカラムを取り出せます。中身をざっと確かめたいときに便利です。
| id | code | name | … |
|---|---|---|---|
| 1 | CS101 | データベース論 | … |
| 2 | CS102 | プログラミング基礎 | … |
| …(全8行) | |||
SELECT * FROM courses;
月曜の授業だけ見たい
全部出せました!でも時間割を作るなら、月曜の授業だけ欲しいです。
行をしぼる条件をクエリに足せばいいんだ。月曜は day が 1 だったね。
WHERE
WHEREの後ろに条件を書くと、条件に合う行だけが返ってきます。8行のうち、day が 1 の2行だけが残りました。
| name | period |
|---|---|
| データベース論 | 2 |
| 線形代数 | 1 |
SELECT name, period FROM courses WHERE day = 1;
比べる記号
条件には = のほかに、大小を比べる記号も使えます。「等しくない」は != ではなく<>と書くのが SQL の標準です。
| 記号 | 意味 | 例 |
|---|---|---|
| = | 等しい | day = 1 |
| <> | 等しくない | day <> 1 |
| < / > | より小さい / より大きい | period < 3 |
| <= / >= | 以下 / 以上 | period >= 4 |
4限以降の授業
period が 4 以上の行を探します。>= は「4 を含む」ので、4限の卒業研究も結果に入ります。
| name | period |
|---|---|
| 卒業研究 | 4 |
| 体育実技 | 5 |
SELECT name, period FROM courses WHERE period >= 4;
文字列で探す
文字列は'(シングルクォート)で囲みます。囲み忘れると、鈴木 をカラム名だと読まれてエラーになります。
| name | teacher |
|---|---|
| プログラミング基礎 | 鈴木 |
| Webアプリ開発 | 鈴木 |
SELECT name, teacher FROM courses WHERE teacher = '鈴木';
条件を2つ使いたい
鈴木先生の授業のうち、火曜のものだけ知りたいです。WHERE を2回書けばいいですか?
WHERE は1回だけで、条件どうしを言葉でつなぐんだ。つなぎ方は「かつ」と「または」の2種類あるよ。
AND
2つの条件をANDでつなぐと、両方に当てはまる行だけが残ります。鈴木先生の授業2つのうち、火曜(day が 2)は1つです。
| name | day |
|---|---|
| プログラミング基礎 | 2 |
SELECT name, day FROM courses WHERE teacher = '鈴木' AND day = 2;
OR
ORでつなぐと、どちらか一方にでも当てはまる行が残ります。月曜か火曜の授業は4つです。
| name | day |
|---|---|
| データベース論 | 1 |
| プログラミング基礎 | 2 |
| 線形代数 | 1 |
| 経済学入門 | 2 |
SELECT name, day FROM courses WHERE day = 1 OR day = 2;
教室が空っぽ?
卒業研究だけ room に何も入っていません。room = '' で探せますか?
そこには「値がない」という印のNULLが入っているんだ。空の文字列とは別物で、= では見つけられないよ。
| name | room |
|---|---|
| 経済学入門 | A101 |
| 卒業研究 | NULL |
| 体育実技 | G001 |
IS NULL
NULL かどうかはIS NULLで確かめます。room = NULL と書くとエラーにはならず、0行が返るので、間違いに気づきにくい点に注意しましょう。
| name | room |
|---|---|
| 卒業研究 | NULL |
SELECT name, room FROM courses WHERE room IS NULL;
LIKE
「CS で始まる」のような探し方にはLIKEを使います。%は「0文字以上の何か」を表すので、'CS%' は CS で始まる文字列に当てはまります。
| code | name |
|---|---|
| CS101 | データベース論 |
| CS102 | プログラミング基礎 |
| CS201 | Webアプリ開発 |
| CS301 | 卒業研究 |
SELECT code, name FROM courses WHERE code LIKE 'CS%';
1限から順に並べたい
月曜の授業を出したら、2限のデータベース論が1限の線形代数より先に出てきました。
並び順を指定しないと、データベースは順番を約束してくれないんだ。並べ方もクエリで伝えよう。
ORDER BY
ORDER BYの後ろに並べる基準のカラムを書きます。ASCは小さい順で、省略しても同じです。大きい順にしたいときは DESC と書きます。
| name | period |
|---|---|
| 線形代数 | 1 |
| データベース論 | 2 |
SELECT name, period FROM courses WHERE day = 1 ORDER BY period ASC;
2つの基準
カンマで基準を2つ並べると、まず day の順に並べ、day が同じ行どうしは period の順に並べます。これで時間割の順になります。
| name | day | period |
|---|---|---|
| 線形代数 | 1 | 1 |
| データベース論 | 1 | 2 |
| プログラミング基礎 | 2 | 1 |
| 経済学入門 | 2 | 2 |
| …(全8行) | ||
SELECT name, day, period FROM courses ORDER BY day, period;
LIMIT
最後にLIMITを付けると、返ってくる行の数を上限で区切れます。並べた結果の先頭3行だけが返ってきます。
| name | day | period |
|---|---|---|
| 線形代数 | 1 | 1 |
| データベース論 | 1 | 2 |
| プログラミング基礎 | 2 | 1 |
SELECT name, day, period FROM courses ORDER BY day, period LIMIT 3;
まとめ
- SELECT でカラムを、FROM でテーブルを指定し、; で締める
- WHERE で行をしぼる。文字列は ' で囲み、NULL は IS NULL で探す
- ORDER BY で並べ、LIMIT で行数を区切る