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では使える