この記事の目的・・・!
- 書式とかは抜きにしてぱっと見で知りたい 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