SQL基本コマンド集
基礎・データ取得編
1. SQLの基本
SQLとは
SQL(Structured Query Language)は、リレーショナルデータベースを操作するための言語です。 データの検索、挿入、更新、削除などを行うことができます。
基本概念
- テーブル: データを格納する表(例: users, orders)
- カラム(列): テーブルの各項目(例: id, name, email)
- 行(レコード): テーブルの各データの組
- 主キー: 各行を一意に識別するカラム
主なデータ型
-- 数値型
INT -- 整数
DECIMAL(10,2) -- 小数(全体10桁、小数点2桁)
FLOAT -- 浮動小数点数
-- 文字列型
VARCHAR(100) -- 可変長文字列(最大100文字)
CHAR(10) -- 固定長文字列(10文字)
TEXT -- 長いテキスト
-- 日付・時刻型
DATE -- 日付(YYYY-MM-DD)
DATETIME -- 日付と時刻
TIMESTAMP -- タイムスタンプ
-- 論理型
BOOLEAN -- 真偽値(TRUE/FALSE) 2. SELECT文の基礎
基本的なSELECT
-- 全テカラムを取得
SELECT * FROM users;
-- 特定のカラムを取得
SELECT name, email FROM users;
-- 別名をつける
SELECT name AS 名前, email AS メール FROM users;
SELECT name user_name, email user_email FROM users; -- ASは省略可 WHERE句(条件指定)
-- 基本的な条件
SELECT * FROM users WHERE age>= 20;
-- 複数条件(AND)
SELECT * FROM users WHERE age>= 20 AND age < 30;
-- 複数条件(OR)
SELECT * FROM users WHERE age < 20 OR age>= 65;
-- NOTで否定
SELECT * FROM users WHERE NOT age>= 20;
SELECT * FROM users WHERE age != 20; -- 同じ意味 比較演算子
-- 等しい
SELECT * FROM products WHERE price = 1000;
-- 等しくない
SELECT * FROM products WHERE price != 1000;
SELECT * FROM products WHERE price <> 1000; -- 同じ意味
-- 大小関係
SELECT * FROM products WHERE price> 1000; -- より大きい
SELECT * FROM products WHERE price>= 1000; -- 以上
SELECT * FROM products WHERE price < 1000; -- より小さい
SELECT * FROM products WHERE price <= 1000; -- 以下 LIKE(パターンマッチング)
-- %: 0文字以上の任意の文字列
-- _: 1文字の任意の文字
-- 「Tanaka」で始まる
SELECT * FROM users WHERE name LIKE 'Tanaka%';
-- 「Tanaka」で終わる
SELECT * FROM users WHERE name LIKE '%Tanaka';
-- 「Tanaka」を含む
SELECT * FROM users WHERE name LIKE '%Tanaka%';
-- 2文字目が「a」
SELECT * FROM users WHERE name LIKE '_a%';
-- 大文字小文字を区別しない(MySQL)
SELECT * FROM users WHERE name LIKE '%tanaka%';
-- 大文字小文字を区別しない(PostgreSQL)
SELECT * FROM users WHERE name ILIKE '%tanaka%'; IN(複数値のマッチ)
-- いずれかに一致
SELECT * FROM orders WHERE status IN ('pending', 'processing', 'shipped');
-- どれとも一致しない
SELECT * FROM orders WHERE status NOT IN ('cancelled', 'returned'); BETWEEN(範囲指定)
-- 数値の範囲
SELECT * FROM products WHERE price BETWEEN 1000 AND 5000;
-- 上記は以下と同じ
SELECT * FROM products WHERE price>= 1000 AND price <= 5000;
-- 日付の範囲
SELECT * FROM orders WHERE order_date BETWEEN '2026-01-01' AND '2026-01-31';
-- 範囲外
SELECT * FROM products WHERE price NOT BETWEEN 1000 AND 5000; IS NULL / IS NOT NULL
-- NULL(値がない)
SELECT * FROM users WHERE email IS NULL;
-- NULLではない
SELECT * FROM users WHERE email IS NOT NULL;
-- 注意: = NULL は使えない(常にFALSEになる)
SELECT * FROM users WHERE email = NULL; -- ✕ 間違い 3. データの並び替えと制限
ORDER BY(並び替え)
-- 昇順(ASC)
SELECT * FROM products ORDER BY price ASC;
SELECT * FROM products ORDER BY price; -- ASCは省略可
-- 降順(DESC)
SELECT * FROM products ORDER BY price DESC;
-- 複数カラムで並び替え
SELECT * FROM products ORDER BY category ASC, price DESC;
-- カラム番号で指定(非推奨)
SELECT name, price FROM products ORDER BY 2 DESC; -- 2番目のカラム(price) LIMIT / OFFSET(件数制限)
-- 上位10件を取得
SELECT * FROM products ORDER BY price DESC LIMIT 10;
-- 11件目から10件を取得(ページネーション)
SELECT * FROM products ORDER BY price DESC LIMIT 10 OFFSET 10;
-- 同じこと(MySQLの略記法)
SELECT * FROM products ORDER BY price DESC LIMIT 10, 10; -- OFFSET, LIMIT
-- PostgreSQLの場合
SELECT * FROM products ORDER BY price DESC LIMIT 10 OFFSET 10; DISTINCT(重複排除)
-- 重複を除いて取得
SELECT DISTINCT category FROM products;
-- 複数カラムの組み合わせで重複排除
SELECT DISTINCT category, price FROM products;
-- 重複を含む件数をカウント
SELECT COUNT(*) FROM products;
-- 重複を除いた件数をカウント
SELECT COUNT(DISTINCT category) FROM products; 4. 集計関数
基本的な集計関数
-- 件数をカウント
SELECT COUNT(*) FROM users; -- 全行数
SELECT COUNT(email) FROM users; -- emailがNULLでない行数
SELECT COUNT(DISTINCT age) FROM users; -- ageの種類数
-- 合計
SELECT SUM(amount) FROM orders; -- amountの合計
SELECT SUM(amount) AS total FROM orders; -- 別名をつける
-- 平均
SELECT AVG(price) FROM products; -- priceの平均
SELECT AVG(amount) FROM orders;
-- 最大値・最小値
SELECT MAX(price) FROM products; -- 最高価格
SELECT MIN(price) FROM products; -- 最低価格
SELECT MAX(order_date) FROM orders; -- 最新の注文日 GROUP BY(グループ化)
-- カテゴリ別の商品数
SELECT category, COUNT(*) FROM products
GROUP BY category;
-- カテゴリ別の平均価格
SELECT category, AVG(price) AS avg_price FROM products
GROUP BY category
ORDER BY avg_price DESC;
-- ユーザー別の注文合計金額
SELECT user_id, SUM(amount) AS total_amount FROM orders
GROUP BY user_id;
-- 複数カラムでグループ化
SELECT user_id, status, COUNT(*) AS order_count FROM orders
GROUP BY user_id, status; HAVING(集計結果の絞り込み)
-- 商品数3個以上のカテゴリ
SELECT category, COUNT(*) AS product_count FROM products
GROUP BY category
HAVING COUNT(*)>= 3;
-- 平均価格つ1000円以上のカテゴリ
SELECT category, AVG(price) AS avg_price FROM products
GROUP BY category
HAVING AVG(price)>= 1000;
-- 注文合計が10000円以上のユーザー
SELECT user_id, SUM(amount) AS total_amount FROM orders
GROUP BY user_id
HAVING SUM(amount)>= 10000
ORDER BY total_amount DESC;
-- WHEREとHAVINGの組み合わせ
SELECT category, AVG(price) AS avg_price FROM products
WHERE stock> 0 -- 在庫ありの商品だけ
GROUP BY category
HAVING AVG(price)>= 1000; -- 平均価格1000円以上 WHEREとHAVINGの違い
- WHERE: グループ化前の行を絞り込む
- HAVING: グループ化後の結果を絞り込む
- WHEREでは集計関数を使えないが、HAVINGでは使える