LoginSignup
0
0

【ざっくりSQL】疲れててもわかるSQLチートシート(選択, 挿入, 更新, 削除, 結合)

Posted at

この記事の目的・・・!

  • 書式とかは抜きにしてぱっと見で知りたい 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, '作ったお前');

Foods.png

基本

SELECT * FROM foods;

Foods.png

WHERE

stock が 10 以上のデータだけを select してみます

SELECT * FROM foods WHERE stock >= 10;

Foods_where.png

GROUP BY

type_name ごとにまとめてみましょう
尚,GROUP BY で表示できるデータは以下の通りです

  • GROUP BY で指定したカラム
  • SUMCOUNT などの集約関数に指定したカラム
SELECT
	type_name,
	COUNT(stock) AS "行数",
	SUM(stock) AS "残数合計"
FROM foods
GROUP BY type_name;

Foods_groupby.png

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;

Foods_having.png

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;

Foods_orderby.png

挿入

データの挿入は INSERT でやりやす

INSERT INTO foods
VALUES
	('food_7', '素パスタ', 100, 'ベネチアン'),
	('food_8', 'ソーライス', 20, '美食');

insert.png

更新

データの更新は UPDATE でやりやす
food_idfood_8 のデータの,
food_nameバター醬油まぶしご飯
stock30 に更新してみましょう

UPDATE foods
SET
	food_name = 'バター醬油まぶしご飯',
	stock = 30
WHERE
	food_id = 'food_8'

update.png

削除

先ほど挿入・変更したデータを削除してみやしょう
delete でやりやす

DELETE FROM foods WHERE food_id in ('food_7', 'food_8');

delete.png

結合

JOIN

以下のテーブルを用意しておきます
左が menu テーブルで,右が category テーブルです
join_tables.png

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

inner_join_on.png

行数が増える例

見たように左と右で同じものだけを結合するので,行数が減るイメージです
が,結合条件に複数行該当するデータがある場合は増加しますよの例です
increase_join.png

USING

USING を使った結合は以下の通りですます
因みに,USING で指定した category_id が一番左に行ってます

SELECT *
FROM
	menu AS l
INNER JOIN
	category AS r
USING(category_id);

inner_join_using.png

NATURAL

NATURAL にすると,自動的に左と右で同じカラムを結合条件に使って結合いたす
今の例では左と右で同じなのは category_id のみで,それを使って結合です

また,結合に使ったカラムは USING と同じで一番左にいくます

今の例では USING と同じ結果になりまふ

SELECT *
FROM
	menu AS l
NATURAL INNER JOIN
	category AS r;

LEFT JOIN

LEFT JOIN では左と右のテーブルで条件が一致したものを結合しますが,
左の方は条件に当てはまってるやつがいなくても残ります(右には NULL が入りやす)

ONUSINGNATURAL の挙動は INNER JOIN と同じです

では例を見てみましょ

SELECT *
FROM
	menu AS l
LEFT JOIN
	category AS r
ON
	l.category_id = r.category_id

left_join.png

RIGHT JOIN

RIGHT JOIN では左と右のテーブルで条件が一致したものを結合しますが,
右の方は条件に当てはまってるやつがいなくても残ります(左には NULL が入りやす)

ONUSINGNATURAL の挙動は INNER JOIN と同じです

では例を見てみましょ

SELECT *
FROM
	menu AS l
RIGHT JOIN
	category AS r
ON
	l.category_id = r.category_id

right_join.png

CROSS JOIN

左と右の総当たりです
左に n 行,右に m 行ある場合,結果は n×m 行になりやす

SELECT *
FROM
	menu AS l
CROSS JOIN
	category AS r

cross_join.png

UNION

同じカラム数のテーブルを縦に結合するのが UNION です
重複は削除されます
UNION ALL であれば,重複削除はなく純粋に全部縦に結合です

SELECT * FROM up
UNION
SELECT * FROM down

union.png

EXCEPT

同じカラム数のテーブルの内,
上にあるテーブルから下のテーブルと共通のものを減らすのが INTERSECT です
重複は削除されます
EXCEPT ALL であれば,重複削除はなく減らすます

except.png

SELECT * FROM up
UNION
SELECT * FROM down

INTERSECT

同じカラム数のテーブルの内,
上にあるテーブルと下のテーブルで共通のものを取り出すのが INTERSECT です
重複は削除されます
INTERSECT ALL であれば,重複削除はなく純粋に共通のものを抽出すます

SELECT * FROM up
INTERSECT
SELECT * FROM down

intersect.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0