LoginSignup
8
9

More than 1 year has passed since last update.

SQL備忘録

Last updated at Posted at 2021-07-03

初めに

最近、DjangoのORMが発行しているqueryを見る機会がありました。
しかし、僕自身SQLについて勉強をあまりしたことがなかったので、ORMが発行するqueryを見てもチンプンカンプンでした。
そこで、SQLの勉強がしたくなったので勉強し始めました(完全に趣味)

僕のSQL備忘録として、記事に残したいと思います

SQL

データベース(RDBMS)を操作するための言語。

大きく分けて3種類の言語から構成されている

  • データ定義言語(Data Definition Language)

    • DDLと略される
    • RDBMSで扱うオブジェクト(テーブルやインデックスなど)の構造や、オブジェクト同士の関係を定義する構文
    • CREATE, JOIN, DROP, ALTER, TRUNCATEなどが存在
  • データ操作言語(Data Manipulation Language)

    • DMLと略される
    • データベースを操作するための構文
    • データ取得、追加、更新、削除などの操作ができる
    • SQL関数と呼ばれる関数を使用できる
    • SELECT, INSERT, DELETE, UPDATEなどが存在
  • データ制御言語(Data Control Language)

    • DCLと略される
    • データへのアクセスを制御する構文
    • トランザクションやシステムの管理、アクセス権を制御する
    • GRANT, REVOKE, BEGIN, COMMIT, ROLLBACKなどが存在

基本

SELECT: カラムを指定し、データを取得

FROM: テーブルを指定

SELECT 
    id,
    name
FROM
    users;

アスタリスクですべてのカラムを選択できる

-- すべてのカラムを取得
SELECT
    *
FROM
    users;

WHERE: 条件を追加できる。= は完全一致

-- usersテーブルのnameがAliceであるデータを取得
SELECT
    *
FROM
    users
WHERE
    name = "Alice";

LIKE: 指定したカラムが○○を含むようなレコードを取得。WHERE句で使用。 対象のカラムに対して文字列検索

ワイルドカード: どんな文字列にも一致することを指す記号

比較文字列に使用可能なワイルドカード

%: 0文字以上の任意の文字列

_: 1文字の任意の文字列

部分一致

-- purchasesテーブルのnameカラムについて、"アメ"を含むデータ全て取得
SELECT
    *
FROM
    purchases 
WHERE
    name LIKE "%アメ%";

前方一致

-- purchasesテーブルのnameカラムについて、"アメ"から始まる含むデータ全て取得
-- アメ、アメ玉など
SELECT
    *
FROM
    purchases
WHERE
    name LIKE "アメ%";

後方一致

-- purchasesテーブルのnameカラムについて、"アメ"で終わるデータ全て取得
-- アメ、みかんアメ、ラムネアメなど
SELECT
   *
FROM
    purchases
WHERE
    name LIKE "%アメ";

NOT: 否定を意味する

-- purchasesテーブルのpriceカラムの値が1000以下のものを取得
SELECT
    *
FROM
    purchases
WHERE
    NOT price > 1000;
-- purchasesテーブルのnameカラムについて、"アメ"を含まないデータ全て取得
SELECT
    *
FROM
    purchases
WHERE
    name NOT LIKE "%アメ%";

NULLデータ取得

SELECT
    *
FROM
    purchases
WHERE
    price IS NULL;

NULLではないデータ取得

SELECT
    *
FROM
    purchases
WHERE
    price IS NOT NULL;

NULLを扱う時は = ではダメ

-- これはダメ
SELECT
    *
FROM
    purchases
WHERE
    price = NULL;

ORDER BY: 並び替え

ASC(昇順)、DESC(降順)

WHERE条件の後ろに記述。
WHERE条件を指定しない場合はFROM句の後にORDER BY句を記述

-- purchasesテーブルのpriceカラムを降順にし、データを取得
SELECT
    *
FROM
    purchases
ORDER BY
    price DESC;

LIMIT: 最大何件取得するか指定。クエリの末尾に記述し、取得するデータ数を制限

-- purchasesテーブルから最大5件のデータを取得
SELECT
    *
FROM
    purchases
LIMIT
    5;

集合関数

集合関数: 引数に指定したカラムの値を集計し結果を返す。

WHERE条件が指定されている場合は、抽出されたレコードを対象に集計した結果を返す。

SUM: 引数の総和を求める。NULLの場合は集計対象外

MAX: 引数の最大値を求める。

MIN: 引数の最小値を求める。

AVG: 引数の平均値を求める。NULLの場合は集計対象外

COUNT: 引数の値の総数を求める。NULLの場合は集計対象外

-- employeeテーブルから、salary(給料)の総和、最大値、最小値、平均値、総数を求める
SELECT
    SUM(salary),
    MAX(salary),
    MIN(salary),
    AVG(salary),
    COUNT(salary)
FROM
    employee;

ちょい発展

BETWEEN: カラムの値の上限値と下限値を指定。下限値以上、上限値以下の場合、真を返す。WHERE句で使用。

-- employeeテーブルから、salary(給料)が1000以上, 2000以下の従業員のnameとsalaryデータを取得
SELECT
    name,
    salary
FROM
    employee
WHERE
    salary
BETWEEN
    1000 AND 2000;

比較演算子を用いると以下のように書き換え可能

SELECT
    name, 
    salary
FROM
    employee
WHERE
    1000 <= salary
AND salary <= 2000;

否定のときは、BETWEEN演算子の前にNOTを記述

-- employeeテーブルからsalary(給料)が1000未満か、2000より多い従業員のEname, salaryデータを取得
SELECT
    name,
    salary
FROM
    employee
WHERE
    salary
NOT BETWEEN
    1000 AND 2000;

GROUP BY: 指定したカラムごとにグループ化し、集計関数の計算結果を取得できる。

SELECT文に指定できるカラムは、GROUP BYで指定したカラムと、集計関数。

WHERE条件を記述可能。
まず、WHERE条件よりレコードが抽出される。
その後GROUP BY で指定したカラムごとにグループ化され、集計関数で計算結果が求められる。

-- employeeテーブルからdepartment(部署番号)毎に、departmentとsalaryの平均を取得
SELECT
    department,
    AVG(salary)
FROM
    employee
GROUP BY
    department;

参考サイト

さいごに

SQLについてまだまだ勉強中ですので、こちらの記事は随時更新していきたいと思います

8
9
2

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
8
9