はじめに
Progateで学習したSQLの基本を自分なりにまとめておく。
サブクエリ
2つ以上のクエリを1つにまとめることができる。
サブクエリを含むクエリの場合、サブクエリから実行される。
-- クエリ1 ( -- ()でサブクエリを囲む
-- クエリ2
-- );
SELECT name -- ウィルより多いゴール数のプレイヤーの名前を取得するクエリ
FROM players
WHERE goals > (
SELECT goals -- ウィルのゴール数を取得するサブクエリ
FROM players
WHERE name = "ウィル"
);
AS
カラム名に別名を定義できる。
-- カラム名 AS "名前"
SELECT name AS "身長180cm以上の選手"
FROM players
WHERE height >= 180;
JOIN
テーブルを紐づけるために、外部キーと主キーが用意されたカラムを用意する。
同じ数字が入っているレコード同士を紐づける。
JOINを用いて、複数のテーブルを1つに結合する。
JOINを含んだクエリでは、はじめにJOINが実行される。
-- SELECT *
-- FROM テーブルA
-- JOIN テーブルB
-- ON 結合条件
--
-- 結合条件は
-- ON テーブル名.カラム名(外部キー) = テーブル名.カラム名(主キー)
-- で指定する
SELECT *
FROM players
JOIN countries
ON players.country_id = countries.id;
複数テーブルでのカラムの指定
テーブルごとにガラム名が重複している可能性がある。
テーブル名.カラム名
とすることで、同名のカラムでも個別に指定することができる。
SELECT countries.name, SUM(goals)
FROM players
JOIN countries
ON players.country_id = countries.id
GROUP BY countries.name;
LEFT JOIN
通常、外部キーがNULLのレコードは実行結果に表示されない。
LEFT JOINを用いると、FROMで指定したテーブルのレコードを全て取得し、外部キーがNULLでもNULLのまま実行結果に表示される。
SELECT players.name AS "選手名", teams.name AS "前年所属していたチーム"
FROM players
LEFT JOIN teams -- teamsテーブルにはNULLが含まれている
ON players.previous_team_id = teams.id;
3つ以上のテーブルの結合
FROMは一つで、JOINを複数使用して3つ以上のテーブルを結合する。
-- SELECT *
-- FROM テーブルA
-- JOIN テーブルB
-- ON 結合条件
-- JOIN テーブルC
-- ON 結合条件
SELECT *
FROM players
JOIN countries
ON players.country_id = countries.id
LEFT JOIN teams
ON players.previous_team_id = teams.id;
全体の実行順序
- テーブルの指定:
FROM - 結合:
JOIN,ON - 取得条件:
WHERE - グループ化:
GROUP BY - 関数:
COUNT,SUM,AVG,MAX,MIN - HAVING:
HAVING - 検索:
SElECT,DISTINCT - 順序:
ORDER BY - 制限:
LIMIT
データの取得・挿入・更新・削除
SELECT(取得)
-- SELECT カラム名1, カラム名2
-- FROM テーブル名;
SELECT name
FROM purchases;
INSERT(挿入)
多くの場合、idカラムにはAUTO INSERT(自動挿入)と呼ばれる機能が使われるため、その値は省略できる。
-- INSERT INTO テーブル名 (カラム名1, カラム名2, カラム名3)
-- VALUES (値1, 値2, 値3); -- 順番通りに挿入される
INSERT INTO students ( name, course)
VALUES ( "Kate", "Java");
UPDATE(更新)
※注意
WHEREで指定しないと、カラム内の全データが更新されるので注意。
-
SELECTで操作するデータを確認する。 -
UPDATEでデータを更新する、実行後にデータを戻すことができない。
-- UPDATE テーブル名
-- SET カラム名1 = 値1, カラム名2 = 値2 -- 指定カラムを新しい値にする
-- WHERE カラム名 = 値; -- 更新するレコードをWHEREで指定する
UPDATE students
SET name = "Jordan", course = "HTML"
WHERE id = 6;
DELETE(削除)
レコード を削除する。
※注意
WHEREで指定しないと、カラム内の全データが削除されるので注意。
実行後はレコードを元に戻せない。
-- DELETE FROM テーブル名
-- WHERE カラム名 = 値;
DELETE FROM students
WHERE id = 7;
おわりに
主なやつは大体まとめられたと思う。
次回からは現在勉強しているRuby on Railsチュートリアルについてまとめていきたいと思う。