データの結合
- CONCAT関数
SELECT CONCAT(family_name,first_name) FROM users;
# こうするとfamily_nameとfirst_nameが結合する。
# このようにいくつかのデータを用いて1つのデータを作りたいときにCONCAT関数を使う。
# ただ検索結果のカラム名はSQL文そのままとなっているので少し見にくくなる。
検索結果のカラム名の変更
- AS句
SELECT句でデータを取得するとき、AS句を併用するとそのカラムに別名をつけられる。
SELECT CONCAT(family_name,first_name) AS "氏名" FROM users;
# こうすることでfamily_nameとfirst_nameが連結し、連結したカラム名が"氏名"になる。
# またAS句は省略することができる。
SELECT CONCAT(family_name,first_name) "氏名" FROM users;
# AS句を省略した記述。
重複する行の除外
- DISTINCTキーワード
SELECT DISTINCT カラム名; #重複していれば一つしか表示しない。
レコードのグループ化
- GROUP BY句
指定したカラムが同じ値を持つデータを一つのグループとしてまとめることができる。
GROUP BY カラム名;
# 実行するとDISTINCTと同じような結果が返ってくるが、表示されていないだけで内部ではグループ化されたデータが存在する。
レコードの数を数える
- COUNT関数
COUNT関数はグループ化されたデータに対して使用することができる集計関数の一つ。
グループ化されたデータに使用できる集計関数は他に、AVG(平均を求める),MAX(最大値を求める),MIN(最小値を求める)がある。
COUNT関数はカラムを指定して使用することで、そのカラムの値がNULLでないデータの行数を取得することができる。
GROUP BY句を併用している場合は、各グループがレコードを何個持っているかというデータを取得することができる。
SELECT COUNT(カラム名); #グループ化されているカラムを記述する。
SELECT COUNT(*); #ワイルドカードも使用できる。
テーブルの結合
- JOIN
JOINを使用すると、指定したそれぞれのテーブルのカラムの値が一致するデータを結合することができる。
JOINはFROM句の後に記述し、結合の対象となるテーブルを指定する。
FROM テーブル名1 JOIN テーブル名2 ON テーブル名1.カラム名1 = テーブル名2カラム名2;
# 例えば
FROM shifts JOIN users ON shifts.user_id = users.id
# ONの後が冗長になるのでシンプルに書くなら
FROM shifts s JOIN users u ON s.user_id = u.id
# shiftsをs、usersをuと別名をつける。
# 別名をつけることができるAS句は省略することができる。
例文
(わかりやすく短文で区切ります)
SELECT
CONCAT(family_name, first_name) "名前", #shiftsテーブルのfamily_nameと、first_nameを結合させ、名前という別名をつけ、表示させる。
COUNT(*) "コマ数" #グループ化したデータの行数を表示する。(この場合user_idがグループ化されているので同じuser_idが何行あるのかが表示される。)ワイルドカード(*)を使用することでNULLであるレコードも含めて表示する。
FROM shifts s #shiftsテーブルから検索する。(shiftsテーブルにsという別名をつける。)
JOIN users u ON s.user_id = u.id #JOINで連結させたいusersテーブルを選択、ONで一致するカラムを選択し、連結させる。(usersテーブルにもuという別名をつけ、ONで別名を使用しカラム同士を連結させる。)
WHERE date = "2015-07-01" #dateカラムが2015-07-01のものを検索している。
GROUP BY user_id; #複数あるuser_idがグループ化される。
検索した結果からさらに検索
- サブクエリ
例えば
SELECT DISTINCT user_id FROM shifts WHERE date = "2015-07-01";
のような検索結果があったとする。
まず上記のコードの説明。
FROM shiftsでshiftsテーブルを検索対象とし、WHEREでshiftsテーブルのdateカラムが2015-07-01のものを探し、SELECT DISTINCT user_idで重複しているuser_idを一つだけ表示させている。
つまり、dateカラムが2015-07-01に当てはまるuser_idを表示する。
この検索結果を踏まえて逆に2015-07-01に当てはまらないuser_idを調べたい。
その時の検索の仕方がこうだ。
SELECT * #カラムを全て取得
FROM users #usersテーブルの検索
WHERE id NOT IN ( #NOT IN()を使用し、()内の検索結果に当てはまらないレコードを取得する
SELECT DISTINCT user_id
FROM shifts
WHERE date = "2015-07-01"
);
こうすることで()内に記述された検索結果に含まれないusersテーブルのレコードを取得できる。