この記事の目的・・・!
- 書式とかは抜きにしてぱっと見で知りたい SQL がわかること
- すぐ使えること
環境・・・!
Postgresql 15 で実行してます
ただ,SQL 自体はだいたいどの DBMS でも同じような感じです
選択
select を確認しましょう
まずは下のクエリでテーブルとデータを作成しておきます
CREATE TABLE foods (
food_id VARCHAR(20) PRIMARY KEY,
food_name VARCHAR(20),
stock INTEGER,
type_name VARCHAR(20)
);
INSERT INTO foods
VALUES
('food_1', 'カップラーメン(醬油)', 5, 'インスタント'),
('food_2', 'カップラーメン(塩)', 10, 'インスタント'),
('food_3', 'カップラーメン(高級味噌)', 15, 'インスタント'),
('food_4', '納豆', 1, '米のお供'),
('food_5', '鮭', 1, '米のお供'),
('food_6', '美味しいパスタ', 5, '作ったお前');
基本
SELECT * FROM foods;
WHERE
stock が 10 以上のデータだけを select してみます
SELECT * FROM foods WHERE stock >= 10;
GROUP BY
type_name ごとにまとめてみましょう
尚,GROUP BY で表示できるデータは以下の通りです
-
GROUP BYで指定したカラム -
SUMやCOUNTなどの集約関数に指定したカラム
SELECT
type_name,
COUNT(stock) AS "行数",
SUM(stock) AS "残数合計"
FROM foods
GROUP BY type_name;
HAVING
GROUP BY でまとめた後に条件で絞るときは HAVING を使いやす
WHERE は使えないのでご注意を
では,type_name でまとめたデータの内,
行数が 2 以上のデータを表示しやしょう
SELECT
type_name,
COUNT(stock) AS "行数",
SUM(stock) AS "残数合計"
FROM foods
GROUP BY type_name
HAVING COUNT(stock) >= 2;
ORDER BY
表示順を決めたい時は ORDER BY を使います
一番最後に指定しやす
指定は以下の通りです
- 降順(大きい順)を指定する時は
DESCを指定 - 昇順(小さい順)を指定する時は
ASCを指定 - 何も指定しない場合は降順
では残数合計の降順で表示してみましょう
SELECT
type_name,
COUNT(stock) AS "行数",
SUM(stock) AS "残数合計"
FROM foods
GROUP BY type_name
HAVING COUNT(stock) >= 2
ORDER BY SUM(stock) DESC;
挿入
データの挿入は INSERT でやりやす
INSERT INTO foods
VALUES
('food_7', '素パスタ', 100, 'ベネチアン'),
('food_8', 'ソーライス', 20, '美食');
更新
データの更新は UPDATE でやりやす
food_id が food_8 のデータの,
food_name を バター醬油まぶしご飯,
stock を 30 に更新してみましょう
UPDATE foods
SET
food_name = 'バター醬油まぶしご飯',
stock = 30
WHERE
food_id = 'food_8'
削除
先ほど挿入・変更したデータを削除してみやしょう
delete でやりやす
DELETE FROM foods WHERE food_id in ('food_7', 'food_8');
結合
JOIN
以下のテーブルを用意しておきます
左が menu テーブルで,右が category テーブルです

INNER JOIN
左と右のテーブルで条件が一致したものだけを結合しやす
左(menu)と右(category)で category_id が同じものを結合してみやす
ON
ON を使った結合はこんな感じですます
SELECT *
FROM
menu AS l
INNER JOIN
category AS r
ON
l.category_id = r.category_id
行数が増える例
見たように左と右で同じものだけを結合するので,行数が減るイメージです
が,結合条件に複数行該当するデータがある場合は増加しますよの例です

USING
USING を使った結合は以下の通りですます
因みに,USING で指定した category_id が一番左に行ってます
SELECT *
FROM
menu AS l
INNER JOIN
category AS r
USING(category_id);
NATURAL
NATURAL にすると,自動的に左と右で同じカラムを結合条件に使って結合いたす
今の例では左と右で同じなのは category_id のみで,それを使って結合です
また,結合に使ったカラムは USING と同じで一番左にいくます
今の例では USING と同じ結果になりまふ
SELECT *
FROM
menu AS l
NATURAL INNER JOIN
category AS r;
LEFT JOIN
LEFT JOIN では左と右のテーブルで条件が一致したものを結合しますが,
左の方は条件に当てはまってるやつがいなくても残ります(右には NULL が入りやす)
ON,USING,NATURAL の挙動は INNER JOIN と同じです
では例を見てみましょ
SELECT *
FROM
menu AS l
LEFT JOIN
category AS r
ON
l.category_id = r.category_id
RIGHT JOIN
RIGHT JOIN では左と右のテーブルで条件が一致したものを結合しますが,
右の方は条件に当てはまってるやつがいなくても残ります(左には NULL が入りやす)
ON,USING,NATURAL の挙動は INNER JOIN と同じです
では例を見てみましょ
SELECT *
FROM
menu AS l
RIGHT JOIN
category AS r
ON
l.category_id = r.category_id
CROSS JOIN
左と右の総当たりです
左に n 行,右に m 行ある場合,結果は n×m 行になりやす
SELECT *
FROM
menu AS l
CROSS JOIN
category AS r
UNION
同じカラム数のテーブルを縦に結合するのが UNION です
重複は削除されます
UNION ALL であれば,重複削除はなく純粋に全部縦に結合です
SELECT * FROM up
UNION
SELECT * FROM down
EXCEPT
同じカラム数のテーブルの内,
上にあるテーブルから下のテーブルと共通のものを減らすのが INTERSECT です
重複は削除されます
EXCEPT ALL であれば,重複削除はなく減らすます
SELECT * FROM up
UNION
SELECT * FROM down
INTERSECT
同じカラム数のテーブルの内,
上にあるテーブルと下のテーブルで共通のものを取り出すのが INTERSECT です
重複は削除されます
INTERSECT ALL であれば,重複削除はなく純粋に共通のものを抽出すます
SELECT * FROM up
INTERSECT
SELECT * FROM down















