この記事では、SQLの構文句と用例を列挙します。
基本構文
データベース操作
CREATE DATABASE
新しいデータベースを作成する。
CREATE DATABASE my_database;
DROP DATABASE
データベースを削除する。
DROP DATABASE my_database;
テーブル操作
CREATE TABLE
新しいテーブルを作成する。
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
customer_name VARCHAR(255),
email VARCHAR(255)
);
DROP TABLE
テーブルを削除する。
DROP TABLE customers;
ALTER TABLE ADD COLUMN
テーブルに新しい列を追加する。
ALTER TABLE customers
ADD COLUMN phone_number VARCHAR(20);
SELECT FROM
テーブルから特定の列を選択して表示する。
SELECT customer_name, email
FROM customers;
SELECT FROM WHERE
条件に合致するデータを選択して表示する。
SELECT *
FROM customers
WHERE email = 'example@email.com';
算術演算子
基本的な算術演算子
加算(+)
データの値を足したものを作って、表示します。
下記は従業員の給与(salary
)とボーナス(bonus
)を合計して、総収入(total_income
)の計算です。
SELECT salary, bonus, salary + bonus AS total_income FROM employees;
減算 (ー)
データの値を引いたものを作って、表示します。
下記は商品の価格(product_price
)から割引額(discount
)を引いて、割引後の価格(discounted_price
)を求めたものです。
SELECT product_price, discount, product_price - discount AS discounted_price FROM products;
乗算 (*)
データの値を掛けたものを作って、表示します。
下記では、注文された商品の数量(quantity
)と単価(unit_price
)を掛け合わせて、合計金額(total_price
)を計算しています。
SELECT quantity, unit_price, quantity * unit_price AS total_price FROM order_details;
除算 ( / )
データの値を割ったものを作って、表示します。
この例では、旅行の総距離(total_distance
)を総時間(total_time
)で割って、平均速度(average_speed
)を求めています。
SELECT total_distance, total_time, total_distance / total_time AS average_speed FROM trips;
等しい (=)
データの値が指定された値と等しい場合に真となる条件を作ります。
例えば、特定の従業員の情報を取得する場合、次のようにします。
ここでは、従業員ID(employee_id
)が5と等しい従業員の情報を取得しています。
SELECT * FROM employees WHERE employee_id = 5;
等しくない (<>または!=)
データの値が指定された値と異なる場合に真となる条件を作ります。例えば、特定のカテゴリ以外の商品を取得する場合、次のようにします。このクエリでは、カテゴリID(category_id
)が3ではない商品を取得しています。
SELECT * FROM products WHERE category_id <> 3;
以上 (>=)
データの値が指定された値以上である場合に真となる条件を作ります。例えば、特定の金額以上の注文を取得する場合、次のようにします。このクエリでは、合計金額(total_amount
)が500以上の注文を取得しています。
SELECT * FROM orders WHERE total_amount >= 500;
より大きい (>)
データの値が指定された値より大きい場合に真となる条件を作ります。例えば、特定の年齢以上の従業員を取得する場合、次のようにします。このクエリでは、年齢(age
)が30より大きい従業員を取得しています。
SELECT * FROM employees WHERE age > 30;
以下 (<=)
データの値が指定された値以下である場合に真となる条件を作ります。例えば、特定の価格以下の商品を取得する場合、次のようにします。このクエリでは、価格(price
)が100以下の商品を取得しています。
SELECT * FROM products WHERE price <= 100;
より小さい (<)
データの値が指定された値より小さい場合に真となる条件を作ります。例えば、特定の期限以前の注文を取得する場合、次のようにします。このクエリでは、注文日(order_date
)が2024年1月1日より前の注文を取得しています。
SELECT * FROM orders WHERE order_date < '2024-01-01';
NOT
指定された条件と反対の条件を作ります。例えば、特定のカテゴリに属さない商品を取得する場合、次のようにします。このクエリでは、カテゴリID(category_id
)が2でない商品を取得しています。
SELECT * FROM products WHERE NOT category_id = 2;
AND
2つ以上の条件がすべて真である場合に真となる条件を作ります。例えば、特定の価格帯の商品を取得する場合、次のようにします。
SELECT * FROM products WHERE price >= 50 AND price <= 150;
比較演算子
等しい (=)
データの値が指定された値と等しい場合に真となります。
下記は、商品テーブルから価格が1000円の商品を選択するSQL文です。
SELECT * FROM products WHERE price = 1000;
等しくない (<>)
データの値が指定された値と等しくない場合に真となります。
下記は、会員テーブルから会員ランクがプレミアムでない会員を選択する SQL 文です。
SELECT * FROM members WHERE NOT rank = 'プレミアム';
以上 (>=)
データの値が指定された値以上の場合に真となります。
下記は、在庫テーブルから数量が10以上の商品を選択する SQL 文です。
SELECT * FROM inventory WHERE quantity >= 10;
より大きい (>)
データの値が指定された値より大きい場合に真となります。
下記は、売上テーブルから売上が10000円を超える注文を選択する SQL 文です。
SELECT * FROM sales WHERE revenue > 10000;
以下 (<=)
データの値が指定された値以下の場合に真となります。
下記は、年齢テーブルから30歳以下の人を選択する SQL 文です。
SELECT * FROM age WHERE age <= 30;
より小さい (<)
データの値が指定された値より小さい場合に真となります。
下記は、スコアテーブルから60点未満の生徒を選択する SQL 文です。
SELECT * FROM scores WHERE score < 60;
論理演算子
NOT
指定された条件と反対の条件を作ります。
下記は、商品テーブルから在庫がない商品以外を選択する SQL 文です。
SELECT * FROM products WHERE NOT stock = 0;
AND
2つ以上の条件がすべて真である場合に真となります。
下記は、注文テーブルから価格が1000円以上かつ数量が3以上の注文を選択する SQL 文です。
SELECT * FROM orders WHERE price >= 1000 AND quantity >= 3;
OR
いずれかの条件が真である場合に真となります。
下記は、ユーザーテーブルから管理者かVIPユーザーを選択する SQL 文です。
SELECT * FROM users WHERE role = 'admin' OR role = 'vip';
集約文
SELECT COUNT
レコードの数をカウントします。
下記は、商品テーブルの商品数を取得する SQL 文です。
SELECT COUNT(*) FROM products;
SELECT SUM
数値列の合計を計算します。
下記は、売上テーブルの売上金額の総額を取得する SQL 文です。
SELECT SUM(revenue) FROM sales;
SELECT AVG
数値列の平均を計算します。
下記は、スコアテーブルの生徒の平均点を取得する SQL 文です。
SELECT AVG(score) FROM scores;
SELECT MAX
数値列の最大値を求めます。
下記は、在庫テーブルの商品の最大在庫数を取得する SQL 文です。
SELECT MAX(stock) FROM inventory;
SELECT MIN
数値列の最小値を求めます。
下記は、価格テーブルの商品の最低価格を取得する SQL 文です。
SELECT MIN(price) FROM prices;
GROUP BY
指定した列でグループ化し、集約します。
下記は、カテゴリごとに商品数を取得する SQL 文です。
SELECT category, COUNT(*) FROM products GROUP BY category;
GROUP BY HAVING
条件に合致する集約値を表示します。
下記は、売上が一定額以上のカテゴリを取得する SQL 文です。
SELECT category, SUM(revenue) FROM sales GROUP BY category HAVING SUM(revenue) > 10000;
ORDER BY
指定した列で結果を並べ替えます。
下記は、商品テーブルを価格が高い順に取得する SQL 文です。
SELECT * FROM products ORDER BY price DESC;
データ更新
INSERT INTO
テーブルにデータを登録します。
下記は、新しい商品を商品テーブルに追加する SQL 文です。
INSERT INTO products (name, price) VALUES ('新商品', 500);
DELETE FROM
特定のテーブルのデータを削除します。
下記は、在庫がない商品を商品テーブルから削除する SQL 文です。
DELETE FROM products WHERE stock = 0;
UPDATE SET
特定のテーブルのデータを更新します。
下記は、商品テーブルの価格を更新する SQL 文です。
UPDATE products SET price = 600 WHERE name = '新商品';
WINDOW関数
SUM()
指定した列の合計を計算します。オーバーパーティションまたはオーダー バイ節で集計の範囲を指定できます。下記は、部門ごとの売上合計を計算する SQL 文です。
SELECT department, sales, SUM(sales) OVER (PARTITION BY department) as department_total FROM sales_data;
AVG()
指定した列の平均値を計算します。オーバーパーティションまたはオーダー バイ節で集計の範囲を指定できます。下記は、カテゴリごとの商品価格の平均を計算する SQL 文です。
SELECT category, price, AVG(price) OVER (PARTITION BY category) as avg_price FROM products;
MIN() / MAX()
指定した列の最小値(MIN())または最大値(MAX())を計算します。オーバーパーティションまたはオーダー バイ節で集計の範囲を指定できます。下記は、カテゴリごとの在庫の最小値と最大値を計算する SQL 文です。
SELECT category, stock, MIN(stock) OVER (PARTITION BY category) as min_stock, MAX(stock) OVER (PARTITION BY category) as max_stock FROM inventory;
FIRST_VALUE() / LAST_VALUE()
FIRST_VALUE() は指定した列の最初の値、LAST_VALUE() は最後の値を取得します。オーバーパーティションまたはオーダー バイ節で集計の範囲を指定できます。
下記は、カテゴリごとの最初の注文日と最後の注文日を取得する SQL 文です。
SELECT category, order_date, FIRST_VALUE(order_date) OVER (PARTITION BY category ORDER BY order_date) as first_order_date, LAST_VALUE(order_date) OVER (PARTITION BY category ORDER BY order_date) as last_order_date FROM orders;
COUNT()
COUNT()は行の数を計算します。オーバーパーティションまたはオーダーバイ節で集計の範囲を指定でき、各グループの行数を計算することができます。
下記は、カテゴリごとの商品数を計算する SQL 文です。
SELECT category, COUNT(*) OVER (PARTITION BY category) as category_count FROM products;
ROW_NUMBER()
ROW_NUMBER()はソートして順位を付けます。同じ値の場合も順位が重複しません。
下記は、商品を価格で昇順にソートし、各商品に順位を割り当てる SQL 文です。
SELECT product_name, price, ROW_NUMBER() OVER (ORDER BY price) as price_rank FROM products;
RANK()
ソートして順位を付けます。同じ値の場合に重複があり、値は重複分飛びます。
下記は、商品を価格で昇順にソートし、各商品に順位を割り当てる SQL 文です。
SELECT product_name, price, RANK() OVER (ORDER BY price) as price_rank FROM products;
DENSE_RANK()
ソートして順位を付けます。同じ値の場合に重複があり、値は飛びません。
下記は、商品を価格で昇順にソートし、各商品に順位を割り当てる SQL 文です。
SELECT product_name, price, DENSE_RANK() OVER (ORDER BY price) as price_rank FROM products;
NTILE()
レコードを等分割した値を付与します。たとえば、NTILE(4)は四分位数を表します。
下記は、商品を価格で昇順にソートし、価格を四分位数に分割する SQL 文です。
SELECT product_name, price, NTILE(4) OVER (ORDER BY price) as price_quartile FROM products;
LAG()
前の行の値を取得します。
下記は、商品を価格で昇順にソートし、各商品の前の価格を表示する SQL 文です。
SELECT product_name, price, LAG(price) OVER (ORDER BY price) as previous_price FROM products;
LEAD()
次の行の値を取得します。
下記は、商品を価格で昇順にソートし、各商品の次の価格を表示する SQL 文です。
SELECT product_name, price, LEAD(price) OVER (ORDER BY price) as next_price FROM products;