Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What is going on with this article?
@shotaro43

SQLについて

More than 1 year has passed since last update.

はじめに

SQLの勉強をしようと思ったので,学んだことをまとめていきます.随時更新(多分)

ミス等があれば,コメントして頂けると幸いです.

データベースとは

テキストや数値などのデータを保存するためのツール.例えば,TwitterなどのSNSでは「投稿データ」,楽天やAmazonなどのショッピングサイトでは「顧客の購買データ」をデータベースに保管しています.

仕組み

データベースは下図のような表でデータを管理している.この表をテーブル,列をカラム,行をレコードと呼びます.テーブルは必要に応じて複数作成可能です.

データベースの構造
image.png

クエリ

データベースからデータを取得するには,データベースにクエリと呼ばれる命令を送る必要があります.SQLはクエリを書くための言語のことです.
クエリは1行で書くこともできますが,読みやすいように改行して書くことにします.
また,SQLは大文字と小文字を区別しないため,小文字でも問題ありません.(だからついつい小文字で書いてしまう…)

データを取得する

SELECT文を使ってどのカラムのどのデータを取得するかを選びます.

test.sql
SELECT name;

複数のテーブルが存在する場合

FORMを用いてSELECTで選んだカラムがどのテーブルのカラムかを指定する必要があります.

test.sql
SELECT name
FROM people;

複数のカラムからデータを取得する

カラム名をカンマ[ , ]区切りで書きます.

test.sql
SELECT name, type;

全てのカラムからデータを取得する

*の記号を使います.

test.sql
SELECT *
FROM people;

特定のデータだけ取得する

WHEREを使ってどこのレコード(行)を取得するかを指定します.
カラムのデータがテキストデータ,日付データの場合にはクォーテーション[ " or ' ]で囲む必要があります.
数値データの場合は囲む必要がありません.
※データ型については他にもありますが,今回は以上の3つを対象にしています.

test.sql
SELECT *
FROM people
WHERE category = "大人"; # テキストデータ,日付データ
------------------------------------------------
WHERE height = 150; # 数値データ

比較演算子

test.sql
SELECT *
FROM people
WHERE height < 150; # 150より小さいデータを検索
------------------------------------------------
WHERE height <= 150; # 150以下のデータを検索
------------------------------------------------
WHERE height > 150; # 150より大きいデータを検索
------------------------------------------------
WHERE height >= 150; # 150以上のデータを検索

比較演算子は数値データ以外にも,日付データにも使用可能です.

test.sql
SELECT *
FROM people
WHERE height < "2020-01-01"; # 2020-01-01以前のデータを検索

ある文字を含むデータの検索

LIKE演算子を使用して,指定したカラムが「カレー」を含むレコードを指定します.

test.sql
SELECT *
FROM people
WHERE food LIKE "カレー";

ワイルドカード

「カレー」を含むどんな文字列にも一致するものを検索できます.

test.sql
SELECT *
FROM people
WHERE food LIKE "%カレー%";
===============================
カレー, 焼きカレー, カレーライス, カツカレーライス

前方一致

「カレー」以降だけどんな文字列にも一致するものを検索できます.

test.sql
SELECT *
FROM people
WHERE food LIKE "%カレー";
===============================
カレー, 焼きカレー

後方一致

「カレー」より前はどんな文字列にも一致するものを検索できます.

test.sql
SELECT *
FROM people
WHERE food LIKE "カレー%";
===============================
カレー, カレーライス

否定の条件

NOT演算子を使用して, 「カレー」を含まないデータ「カレー」に一致しないデータを取得できます.

test.sql
SELECT *
FROM people
WHERE NOT height < 150; # 150より小さいデータではない(150以上のデータ)を取得
-----------------------------------------------------------------------
WHERE NOT food LIKE "%カレー%"; # 「カレー」を含まないデータを取得

NULLデータ

NULL中身が何か分からないデータのことです.
何のデータも保存されていない場合などが該当します.

NULLのデータを取得する

指定したカラムがNULLであるレコードデータを取得します.

test.sql
SELECT *
FROM people
WHERE height IS NULL;

NULLではないデータを取得する

指定したカラムがNULLでないレコードデータを取得できます.

test.sql
SELECT *
FROM people
WHERE height IS NOT NULL;

※NULLデータを取得したい時に,イコール[ = ]を使うことはできません.

AND演算子

WHEREに複数の条件を指定することができます.
以下のようにすることで,2つの条件を共に満たすデータを検索することができます.

test.sql
SELECT *
FROM people
WHERE category = "大人"
AND age >= 40;

OR演算子

AND演算子と同様に,複数の条件を指定することができます.
以下のようにすることで,2つの条件のうちどちらかを満たすデータを検索することができます.

test.sql
SELECT *
FROM people
WHERE category = "大人"
AND age <= 40;

データの並び替え

ORDER BYを使って.並べ替えたいカラム並べ方を指定します.
ASC(昇順):1, 2, 3, …, 100

test.sql
SELECT *
FROM people
ORDER BY height ASC;

DESC(降順):100, 99, 98, …, 1

test.sql
SELECT *
FROM people
ORDER BY height DESC;

どちらもwhereと併用が可能です.

test.sql
SELECT *
FROM people
WHERE category = "大人"
ORDER BY height ASC;
-----------------------
ORDER BY height DESC;

取得するデータ数の制限

LIMITを使って,取得するデータの件数を指定します.

test.sql
SELECT *
FROM people
LIMIT 10;

ORDER BYと同様にWHEREと併用が可能です.

test.sql
SELECT *
FROM people
WHERE category = "大人"
LIMIT 10;

重複したデータを除く

DISTINCT (カラム名)を使って,検索結果から指定したカラムの重複するデータを除くことができます.

test.sql
SELECT DISTINCT(name)
FROM item;

四則演算

+:足す
-:引く
*:かける
/:割る

test.sql
SELECT name, price * 1.08
FROM item;

集計関数

合計,平均などを求めることができます.

合計

SELECTで取得するカラムに使用することで,合計を取得できます.

test.sql
SELECT SUM(price)
FROM item;

WHEREと併用できます.

test.sql
SELECT SUM(price)
FROM item
WHERE name = 'Aさん';

平均

SELECTで取得するカラムに使用することで,平均を取得できます.

test.sql
SELECT AVG(price)
FROM item;

WHEREと併用できます.

test.sql
SELECT AVG(price)
FROM item
WHERE name = 'Aさん';

データ数を数える

SELECTで取得するカラムに使用することで,指定したカラムの合計数を取得できます.
しかし,NULLになっているデータはカウントされません.

test.sql
SELECT COUNT(price)
FROM item;

NULLも含めてデータ数を計算したいときは, COUNT(*)(全てのカラム)を指定します.

test.sql
SELECT COUNT(*)
FROM item;

WHEREと併用できます.

test.sql
SELECT COUNT(*)
FROM item
WHERE name = 'Aさん';

最大・最小

SELECTで取得するカラムに使用することで,最大のデータ,最小のデータを取得できます.

最大

test.sql
SELECT MAX(price)
FROM item;

WHEREと併用できます.

test.sql
SELECT MAX(price)
FROM item
WHERE name = 'Aさん';

最小

test.sql
SELECT MIN(price)
FROM item;

WHEREと併用できます.

test.sql
SELECT MIN(price)
FROM item
WHERE name = 'Aさん';

データのグループ化

GROUP BYを使用することで,日付ごと,人ごとに金額の合計を算出することができます.
※SELECTで使えるのはGROUP BYに指定しているカラム名と集計関数だけです.

test.sql(正解)
SELECT SUM(price), date
FROM item
GROUP BY date;

以下では,SELECTで集計関数を使用していないため,日付ごとに集計された値が取得できません.

test.sql(間違い)
SELECT price, date
FROM item
GROUP BY date;

複数カラムのグループ化

絡む名をカンマ[ , ]でつなげることで,複数のカラム名を適用させることができます.
複数のカラム名でグループ化すると,データの組み合わせの数だけグループができます.
例:「Aさん」の「2020-01-01」のグループ, 「Bさん」の「2020-01-02」のグループ, etc…

test.sql
SELECT SUM(price), date, name
FROM item
GROUP BY date, name;

集計関数を使用することで,各グループごとにデータを集計できます.
例:日付と人ごとの金額の合計, 日付と人ごとの購入数, etc…

より細かい条件でグループ化

WHEREと併用できます.
実行順は,上から

検索 WHERE
グループ化 GROUP BY
関数 COUNT・SUN・AVG・MAX・MIN

のようになっています.

そのため,日付と人ごとの食事に使ったお金の合計を取得するときは,
1. WHEREでカテゴリが「食品」であるレコードを検索
2. 日付とキャラクターでグループ化する
3. 集計関数で集計する

という順番で行います.

test.sql
SELECT SUM(price), date, name
FROM item
WHERE category = '食品'
GROUP BY date, name;

さらに絞り込む

HAVINGを使用することで,条件を満たすグループを取得できます.
HAVINGはグループ化された後のテーブルから検索するため,条件文で使用するカラムは必ずグループ化されたテーブルのカラムを使用します.

test.sql
SELECT SUM(price), date
FROM item
GROUP BY date
HAVING SUM(price) > 2000;

グループ化した後のデータを絞り込む際にWHEREではなくHAVINGを使用するのは,以下の実行順によるためです.

検索 WHERE
グループ化 GROUP BY
関数 COUNT・SUN・AVG・MAX・MIN
HAVING HAVING

WHERE:検索対象がグループ化される前のテーブル全体
HAVING:検索対象がGROUP BYによってグループ化されたデータ

2020 04 01 ~ 04 02

データベースとは 〜 否定の条件

2020 04 02 ~ 04 03

NULLデータ ~ データのグループ化

参考

Progate
フリーイラスト素材集 ジャパクリップ

0
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
shotaro43
NITUC→KIT M2 resume https://www.resume.id/shoyoshi

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
0
Help us understand the problem. What is going on with this article?