0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SQL文でよく見かけるクエリの自分用メモ【随時更新】

Last updated at Posted at 2025-03-29

自分用クエリメモ
Microsoft SQL Server2022で動作確認済み

サンプルテーブル定義

部署テーブル(departments)

CREATE TABLE departments (
    department_id INT PRIMARY KEY,
    department_name VARCHAR(50) NOT NULL,
    location VARCHAR(50),
    manager_id INT
);

-- サンプルデータ
INSERT INTO departments VALUES (1, '営業部', '東京', 101);
INSERT INTO departments VALUES (2, '開発部', '大阪', 201);
INSERT INTO departments VALUES (3, '人事部', '名古屋', 301);
INSERT INTO departments VALUES (4, '経理部', '福岡', 401);
INSERT INTO departments VALUES (5, '総務部', '札幌', 501);

社員テーブル(employees)

CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE,
    phone_number VARCHAR(20),
    hire_date DATE NOT NULL,
    job_title VARCHAR(50) NOT NULL,
    salary DECIMAL(10, 2) NOT NULL,
    commission_pct DECIMAL(4, 2),
    manager_id INT,
    department_id INT,
    FOREIGN KEY (department_id) REFERENCES departments(department_id),
    FOREIGN KEY (manager_id) REFERENCES employees(employee_id)
);

-- サンプルデータ
INSERT INTO employees VALUES (101, '太郎', '山田', 'taro.yamada@example.com', '090-1111-2222', '2015-04-01', '営業部長', 800000, 0.20, NULL, 1);
INSERT INTO employees VALUES (102, '花子', '佐藤', 'hanako.sato@example.com', '090-2222-3333', '2016-07-01', '営業担当', 500000, 0.15, 101, 1);
INSERT INTO employees VALUES (103, '一郎', '鈴木', 'ichiro.suzuki@example.com', '090-3333-4444', '2017-10-01', '営業担当', 450000, 0.10, 101, 1);
INSERT INTO employees VALUES (201, '次郎', '田中', 'jiro.tanaka@example.com', '090-4444-5555', '2014-01-15', '開発部長', 900000, NULL, NULL, 2);
INSERT INTO employees VALUES (202, '三郎', '伊藤', 'saburo.ito@example.com', '090-5555-6666', '2015-11-01', 'シニア開発者', 750000, NULL, 201, 2);
INSERT INTO employees VALUES (203, '四郎', '渡辺', 'shiro.watanabe@example.com', '090-6666-7777', '2018-03-15', '開発者', 600000, NULL, 201, 2);
INSERT INTO employees VALUES (204, '五郎', '加藤', 'goro.kato@example.com', '090-7777-8888', '2019-06-01', 'ジュニア開発者', 400000, NULL, 202, 2);
INSERT INTO employees VALUES (301, '六郎', '高橋', 'rokuro.takahashi@example.com', '090-8888-9999', '2013-05-01', '人事部長', 850000, NULL, NULL, 3);
INSERT INTO employees VALUES (401, '七郎', '中村', 'nanaro.nakamura@example.com', '090-9999-0000', '2012-08-01', '経理部長', 880000, NULL, NULL, 4);
INSERT INTO employees VALUES (501, '八郎', '小林', 'hachiro.kobayashi@example.com', '080-1111-2222', '2011-12-01', '総務部長', 830000, NULL, NULL, 5);

基本的な SELECT 文

概要

ここに SELECT 文の基本的な説明を記述します。

構文

SELECT カラム1, カラム2, ...
FROM テーブル名;

使用例

-- 例1: 全カラムの取得
SELECT * FROM テーブル名;

-- 例2: 特定のカラムの取得
SELECT カラム1, カラム2 FROM テーブル名;

実践例

-- 実際のテーブルを使った例
SELECT * FROM employees;

-- 特定のカラムのみ取得
SELECT employee_id, first_name, last_name FROM employees;

WHERE 句による絞り込み

概要

ここに WHERE 句の説明を記述します。

構文

SELECT カラム1, カラム2, ...
FROM テーブル名
WHERE 条件式;

使用例

-- 例1: 等価条件
SELECT * FROM テーブル名 WHERE カラム名 = ;

-- 例2: 比較条件
SELECT * FROM テーブル名 WHERE カラム名 > ;

-- 例3: 複数条件(AND)
SELECT * FROM テーブル名 WHERE 条件1 AND 条件2;

-- 例4: 複数条件(OR)
SELECT * FROM テーブル名 WHERE 条件1 OR 条件2;

-- 例5: IN演算子
SELECT * FROM テーブル名 WHERE カラム名 IN (1, 2, ...);

-- 例6: BETWEEN演算子
SELECT * FROM テーブル名 WHERE カラム名 BETWEEN 1 AND 2;

-- 例7: LIKE演算子
SELECT * FROM テーブル名 WHERE カラム名 LIKE 'パターン';

-- 例8: IS NULL / IS NOT NULL
SELECT * FROM テーブル名 WHERE カラム名 IS NULL;
SELECT * FROM テーブル名 WHERE カラム名 IS NOT NULL;

実践例

-- 給与が600,000円以上の社員を検索
SELECT * FROM employees WHERE salary >= 600000;

-- 開発部(department_id = 2)の社員を検索
SELECT * FROM employees WHERE department_id = 2;

-- 給与が500,000円以上800,000円以下の社員を検索
SELECT * FROM employees WHERE salary BETWEEN 500000 AND 800000;

-- 名前が「太郎」または「次郎」の社員を検索
SELECT * FROM employees WHERE first_name IN ('太郎', '次郎');

-- メールアドレスがexample.comドメインの社員を検索
SELECT * FROM employees WHERE email LIKE '%example.com';

-- コミッションがNULLでない社員を検索
SELECT * FROM employees WHERE commission_pct IS NOT NULL;

ORDER BY 句によるソート

概要

検索結果を特定のカラムで昇順/降順に並び替える機能を提供します。デフォルトは昇順(ASC)で、降順は DESC を指定します。

構文

SELECT カラム1, カラム2, ...
FROM テーブル名
ORDER BY ソートキー1 [ASC|DESC], ソートキー2 [ASC|DESC];

使用例

-- 単一カラムのソート
SELECT * FROM テーブル名 ORDER BY カラム名 DESC;

-- 複数カラムのソート
SELECT * FROM テーブル名 ORDER BY カラム1 ASC, カラム2 DESC;

-- 数値位置指定でのソート
SELECT カラム1, カラム2 FROM テーブル名 ORDER BY 2 DESC;

実践例

-- 給与の高い順に社員を表示
SELECT employee_id, last_name, salary
FROM employees
ORDER BY salary DESC;

-- 部署別・給与降順で表示
SELECT department_id, last_name, salary
FROM employees
ORDER BY department_id ASC, salary DESC;

-- 採用日の新しい順に表示
SELECT first_name, last_name, hire_date
FROM employees
ORDER BY hire_date DESC;

GROUP BY 句と HAVING 句

概要

GROUP BY で指定したカラムごとにデータをグループ化し、HAVING 句でグループ化後の条件を指定します。集計関数(COUNT, SUM, AVG など)と組み合わせて使用します。

構文

SELECT カラム1, 集計関数(カラム2)
FROM テーブル名
GROUP BY カラム1
HAVING 条件式;

使用例

-- 部署ごとの平均給与
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id;

-- 人数が3人以上の部署を表示
SELECT department_id, COUNT(*)
FROM employees
GROUP BY department_id
HAVING COUNT(*) >= 3;

-- 給与合計が2,000,000円以上の部署
SELECT department_id, SUM(salary)
FROM employees
GROUP BY department_id
HAVING SUM(salary) >= 2000000;

実践例

-- 各部署の最高給与と最低給与
SELECT department_id, MAX(salary), MIN(salary)
FROM employees
GROUP BY department_id;

-- 平均給与が600,000円以上の部署
SELECT department_id, AVG(salary) avg_salary
FROM employees
GROUP BY department_id
HAVING AVG(salary) >= 600000;

-- 役職別社員数(5人以上の役職のみ表示)
SELECT job_title, COUNT(*) employee_count
FROM employees
GROUP BY job_title
HAVING COUNT(*) >= 3;

JOIN 操作

概要

複数のテーブルを結合して関連データを取得します。主な結合方法には INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN があります。

構文

SELECT カラムリスト
FROM テーブル1
[INNER|LEFT|RIGHT|FULL OUTER] JOIN テーブル2
ON 結合条件;

使用例

-- 内部結合(共通部分のみ)
SELECT *
FROM テーブルA
INNER JOIN テーブルB ON A.id = B.id;

-- 左外部結合(左側全件+一致する右側)
SELECT *
FROM テーブルA
LEFT JOIN テーブルB ON A.id = B.id;

-- 3テーブルの結合
SELECT *
FROM テーブルA
JOIN テーブルB ON A.id = B.a_id
JOIN テーブルC ON B.id = C.b_id;

実践例

-- 部署情報と社員情報の結合
SELECT e.last_name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id;

-- マネージャー情報を含む社員一覧
SELECT e.last_name AS employee, m.last_name AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.employee_id;

-- 全部署の情報(社員のいない部署も含む)
SELECT d.department_name, e.last_name
FROM departments d
LEFT JOIN employees e ON d.department_id = e.department_id;

サブクエリ

概要

SQL 文内にネストされたクエリで、主に WHERE 句や FROM 句、SELECT 句で使用されます。単一行サブクエリと複数行サブクエリに分類されます。

構文

SELECT カラム
FROM テーブル
WHERE カラム 演算子 (サブクエリ);

使用例

-- 単一行サブクエリ
SELECT *
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

-- 複数行サブクエリ(IN演算子)
SELECT *
FROM employees
WHERE department_id IN (SELECT department_id FROM departments WHERE location = '東京');

-- 相関サブクエリ
SELECT e.last_name, e.salary
FROM employees e
WHERE salary > (SELECT AVG(salary) FROM employees WHERE department_id = e.department_id);

実践例

-- 平均給与より高い給与の社員
SELECT last_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

-- 東京の部署に所属する社員
SELECT last_name, department_id
FROM employees
WHERE department_id IN (
  SELECT department_id
  FROM departments
  WHERE location = '東京'
);

-- 部署ごとの最高給与取得者
SELECT department_id, last_name, salary
FROM employees e1
WHERE salary = (
  SELECT MAX(salary)
  FROM employees e2
  WHERE e2.department_id = e1.department_id
);

INSERT 文

概要

INSERT 文は、テーブルに新しいデータを挿入するために使用します。データを挿入するカラムを指定する方法と、すべてのカラムにデータを挿入する方法があります。

構文

-- カラムを指定してデータを挿入
INSERT INTO テーブル名 (カラム1, カラム2, ...)
VALUES (1, 2, ...);

-- 全カラムにデータを挿入(カラム名省略)
INSERT INTO テーブル名
VALUES (1, 2, ...);

使用例

-- 部署テーブルに新しい部署を追加
INSERT INTO departments (department_id, department_name, location, manager_id)
VALUES (6, 'マーケティング部', '仙台', 601);

-- 社員テーブルに新しい社員を追加
INSERT INTO employees (employee_id, first_name, last_name, email, hire_date, job_title, salary, department_id)
VALUES (601, '九郎', '佐々木', 'kuro.sasaki@example.com', '2025-03-01', 'マーケティング担当', 550000, 6);

実践例

-- 新しい部署の追加
INSERT INTO departments (department_id, department_name, location)
VALUES (7, 'ITサポート部', '広島');

-- 新しい社員の追加(コミッションなし)
INSERT INTO employees (employee_id, first_name, last_name, email, phone_number, hire_date, job_title, salary, department_id)
VALUES (701, '十郎', '藤田', 'juro.fujita@example.com', '090-1234-5678', '2025-03-15', 'ITサポート担当', 480000, 7);

UPDATE 文

概要

UPDATE 文は、既存のデータを更新するために使用します。特定の条件を指定して、特定の行のみを更新することができます。

構文

UPDATE テーブル名
SET カラム1 = 1, カラム2 = 2, ...
WHERE 条件;

使用例

-- 社員の給与を更新
UPDATE employees
SET salary = 600000
WHERE employee_id = 103;

-- 部署名を変更
UPDATE departments
SET department_name = 'リサーチ部'
WHERE department_id = 3;

-- 条件なしで全件更新(注意)
UPDATE employees
SET commission_pct = NULL;

実践例

-- 特定の社員の役職と給与を更新
UPDATE employees
SET job_title = 'シニア営業担当', salary = 550000
WHERE employee_id = 102;

-- 部署の場所情報を更新
UPDATE departments
SET location = '京都'
WHERE department_id = 2;

-- 全社員の給与を10%増加(現在の給与に基づく計算)
UPDATE employees
SET salary = salary * 1.10;

DELETE 文

概要

DELETE 文は、テーブルから特定の行を削除するために使用します。削除対象は WHERE 句で指定します。WHERE を省略するとすべての行が削除されるため注意が必要です。

構文

DELETE FROM テーブル名 WHERE 条件;

使用例

-- 特定の社員を削除
DELETE FROM employees
WHERE employee_id = 204;

-- 特定の部署を削除(関連データがある場合はエラーになる可能性あり)
DELETE FROM departments
WHERE department_id = 6;

-- 条件なしで全件削除(注意)
DELETE FROM employees;

実践例

-- コミッションがNULLの社員を削除
DELETE FROM employees
WHERE commission_pct IS NULL;

-- 福岡にある部署を削除(部署IDが一致する場合のみ)
DELETE FROM departments
WHERE location = '福岡';

-- 給与が400000円未満の社員を削除(条件付き)
DELETE FROM employees
WHERE salary < 400000;

CREATE TABLE 文

概要

CREATE TABLE 文は、新しいテーブルを作成するために使用します。各カラムにはデータ型や制約(PRIMARY KEY、NOT NULL など)を指定できます。

構文

CREATE TABLE テーブル名 (
  カラム名 データ型 制約,
  カラム名 データ型 制約,
  ...
);

使用例

-- プロジェクトテーブルの作成
CREATE TABLE projects (
  project_id INT PRIMARY KEY,
  project_name VARCHAR(100) NOT NULL,
  start_date DATE,
  end_date DATE,
  budget DECIMAL(15, 2)
);

-- サンプルデータ挿入例
INSERT INTO projects VALUES (1, '新製品開発プロジェクト', '2025-01-01', NULL, 5000000);

実践例

-- 顧客テーブルの作成(外部キー制約なし)
CREATE TABLE customers (
  customer_id INT PRIMARY KEY,
  customer_name VARCHAR(100) NOT NULL,
  contact_email VARCHAR(100),
  phone_number VARCHAR(20),
  address VARCHAR(200)
);

-- サンプルデータ挿入例
INSERT INTO customers VALUES (1, '株式会社ABC', 'contact@abc.co.jp', '03-1234-5678', '東京都港区');
INSERT INTO customers VALUES (2, '有限会社XYZ', NULL, NULL, '大阪府大阪市');

ALTER TABLE 文

概要

ALTER TABLE 文は、既存のテーブル構造を変更するために使用します。カラムの追加、削除、変更や制約の追加などが可能です。

構文と使用例

カラムの追加:

ALTER TABLE テーブル名 ADD 新カラム名 データ型 制約;
ALTER TABLE employees ADD birth_date DATE;

カラムの削除:

ALTER TABLE テーブル名 DROP COLUMN 削除カラム名;
ALTER TABLE employees DROP COLUMN birth_date;

カラムの変更:

ALTER TABLE テーブル名 MODIFY カラム名 新データ型 制約;
ALTER TABLE テーブル名 CHANGE 古いカラム名 新しいカラム名 データ型 制約;
ALTER TABLE employees MODIFY salary DECIMAL(12, 2);
ALTER TABLE employees CHANGE phone_number contact_number VARCHAR(25);

制約の追加:

ALTER TABLE テーブル名 ADD CONSTRAINT 制約名 制約内容;
ALTER TABLE employees ADD CONSTRAINT fk_department FOREIGN KEY (department_id) REFERENCES departments(department_id);

制約の削除:

ALTER TABLE テーブル名 DROP CONSTRAINT 制約名;
ALTER TABLE employees DROP FOREIGN KEY fk_department;

インデックス

概要

インデックスは、テーブル内のデータへのアクセスを高速化するために使用されます。特定のカラムにインデックスを作成することで、検索やソートのパフォーマンスを向上させることができます。ただし、インデックスの作成にはストレージコストがかかり、頻繁な更新操作ではパフォーマンスに影響を与える場合があります。

構文

-- 単一カラムのインデックス作成
CREATE INDEX インデックス名 ON テーブル名 (カラム名);

-- 複数カラムのインデックス作成
CREATE INDEX インデックス名 ON テーブル名 (カラム1, カラム2);

-- ユニークインデックス
CREATE UNIQUE INDEX インデックス名 ON テーブル名 (カラム名);

-- インデックスの削除
DROP INDEX インデックス名 ON テーブル名;

使用例

-- 社員テーブルのメールアドレスにインデックスを作成
CREATE INDEX idx_email ON employees (email);

-- 部署テーブルの部署名と場所に複合インデックスを作成
CREATE INDEX idx_department_location ON departments (department_name, location);

-- 社員テーブルの電話番号にユニークインデックスを作成
CREATE UNIQUE INDEX idx_phone_number ON employees (phone_number);

-- インデックスの削除例
DROP INDEX idx_email ON employees;

実践例

-- 給与でソートするクエリを高速化するためにインデックスを作成
CREATE INDEX idx_salary ON employees (salary);

-- 部署テーブルのマネージャーIDにインデックスを作成(検索高速化)
CREATE INDEX idx_manager_id ON departments (manager_id);

-- メールアドレスが一意であることを保証するユニークインデックスを作成
CREATE UNIQUE INDEX idx_unique_email ON employees (email);

ビュー

概要

ビューは、複雑なクエリ結果を仮想的なテーブルとして定義する機能です。ビューは実際には物理的なデータを保持せず、基になるテーブルへの参照として機能します。ビューを使用すると、簡潔なクエリやセキュリティ向上が可能になります。

構文

-- ビューの作成
CREATE VIEW ビュー名 AS
SELECT カラム1, カラム2, ...
FROM テーブル名
WHERE 条件;

-- ビューの削除
DROP VIEW ビュー名;

使用例

-- 部署ごとの平均給与ビューを作成
CREATE VIEW avg_salary_per_department AS
SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id;

-- ビューからデータ取得
SELECT * FROM avg_salary_per_department;

-- ビューの削除例
DROP VIEW avg_salary_per_department;

実践例

-- 営業部社員一覧ビュー(営業部のみ表示)
CREATE VIEW sales_department_employees AS
SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE department_id = 1;

-- 営業部社員一覧ビューから取得
SELECT * FROM sales_department_employees;

-- 高給与社員ビュー(給与が800,000円以上)
CREATE VIEW high_salary_employees AS
SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE salary >= 800000;

-- 高給与社員ビューから取得
SELECT * FROM high_salary_employees;

トランザクション

概要

トランザクションは、複数の SQL 操作を1つのまとまった処理として実行する仕組みです。トランザクション内でエラーが発生した場合、すべての操作を元に戻す(ロールバック)ことができます。これにより、データベースの整合性が保たれます。

構文と使用例

トランザクション開始と終了:

BEGIN TRANSACTION; -- トランザクション開始

UPDATE テーブル名 SET カラム =  WHERE 条件; -- 操作1

INSERT INTO テーブル名 (カラム1, カラム2) VALUES (1, 2); -- 操作2

COMMIT; -- トランザクション確定(保存)

ROLLBACK; -- トランザクション中止(元に戻す)

自動コミット無効化:

SET AUTOCOMMIT = 0; -- 自動コミット無効化

UPDATE テーブル名 SET カラム =  WHERE 条件; -- 操作

COMMIT; -- 明示的なコミットで保存

SET AUTOCOMMIT = 1; -- 自動コミット有効化(元に戻す)

実践例

-- 部署と社員情報の一括更新(失敗時はロールバック)
BEGIN TRANSACTION;

UPDATE departments
SET location = '仙台'
WHERE department_id = 3;

UPDATE employees
SET salary = salary * 1.05
WHERE department_id = 3;

COMMIT;

-- エラー発生時はロールバックで元に戻す例:
BEGIN TRANSACTION;

UPDATE employees
SET salary = salary * 1.10
WHERE department_id = 2;

INSERT INTO departments VALUES (8, '新規部署', '京都', NULL); -- エラー発生時

ROLLBACK;

集計関数

概要

集計関数は、データの集計や統計を計算するために使用されます。主に SELECT 文と GROUP BY 句で使用され、データの合計、平均、最大値、最小値、件数などを取得できます。

主な集計関数一覧

関数 説明
COUNT() 行数をカウント
SUM() 合計値を計算
AVG() 平均値を計算
MAX() 最大値を取得
MIN() 最小値を取得

使用例

-- テーブル内の行数を取得
SELECT COUNT(*) FROM employees;

-- 部署ごとの社員数を取得
SELECT department_id, COUNT(*) AS employee_count
FROM employees
GROUP BY department_id;

-- 全社員の給与合計を取得
SELECT SUM(salary) AS total_salary
FROM employees;

-- 部署ごとの平均給与を取得
SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id;

-- 全社員の最高給与と最低給与を取得
SELECT MAX(salary) AS max_salary, MIN(salary) AS min_salary
FROM employees;

実践例

-- コミッションが設定されている社員の人数をカウント
SELECT COUNT(*) AS commission_count
FROM employees
WHERE commission_pct IS NOT NULL;

-- 各役職ごとの最高給与を取得
SELECT job_title, MAX(salary) AS max_salary
FROM employees
GROUP BY job_title;

-- 部署ごとの給与合計が1,500,000円以上の部署のみ表示
SELECT department_id, SUM(salary) AS total_salary
FROM employees
GROUP BY department_id
HAVING SUM(salary) >= 1500000;

文字列関数

概要

文字列関数は、文字列データを操作するために使用されます。データベース内の文字列データの加工や変換に便利です。

主な文字列関数一覧

関数 説明
CONCAT() 文字列を結合
SUBSTRING() 文字列の一部を抽出
LENGTH() 文字列の長さ(バイト数)を返す
CHAR_LENGTH() 文字列の長さ(文字数)を返す
UPPER() 文字列を大文字に変換
LOWER() 文字列を小文字に変換
TRIM() 前後の空白や指定した文字を削除
REPLACE() 文字列内の特定部分を別の文字列に置換
LEFT() / RIGHT() 左側または右側から指定した長さ分だけ抽出

使用例

-- 名前(姓と名)の結合
SELECT CONCAT(first_name, ' ', last_name) AS full_name
FROM employees;

-- メールアドレスのドメイン部分だけ抽出
SELECT SUBSTRING(email, LOCATE('@', email) + 1) AS domain
FROM employees;

-- 社員名をすべて大文字に変換
SELECT UPPER(first_name), UPPER(last_name)
FROM employees;

-- 電話番号からハイフンを削除
SELECT REPLACE(phone_number, '-', '') AS phone_number_no_hyphen
FROM employees;

-- 名前が5文字以上か確認(5文字未満は「短い」と表示)
SELECT first_name,
CASE WHEN CHAR_LENGTH(first_name) >= 5 THEN '長い' ELSE '短い' END AS name_length_category
FROM employees;

実践例

-- 社員名(姓・名)と役職名を結合してフル情報表示
SELECT CONCAT(last_name, ' ', first_name, ' - ', job_title) AS full_info
FROM employees;

-- メールアドレスが「example.com」ドメインか判定(結果: YES/NO)
SELECT email,
CASE WHEN SUBSTRING(email, LOCATE('@', email) + 1) = 'example.com' THEN 'YES' ELSE 'NO' END AS is_example_domain
FROM employees;

-- 社員名から最初の3文字だけ抽出(ニックネーム生成)
SELECT first_name, LEFT(first_name, 3) AS nickname
FROM employees;

日付関数

概要

日付関数は、日付や時刻データを操作するために使用されます。日付データの抽出、フォーマット変更、加算・減算などが可能です。

主な日付関数一覧

関数 説明
NOW() 現在の日付と時刻
CURDATE() 現在の日付
CURTIME() 現在の時刻
DATE_FORMAT() 日付フォーマット変更
DATEDIFF() 2つの日付間の日数差
DATE_ADD() 日付に指定した期間を加算
DATE_SUB() 日付から指定した期間を減算
YEAR(), MONTH(), DAY() 年、月、日だけ抽出

使用例

-- 現在の日付と時刻を取得
SELECT NOW();

-- 現在の日付のみ取得
SELECT CURDATE();

-- 採用日の年だけ抽出
SELECT first_name, last_name, YEAR(hire_date) AS hire_year
FROM employees;

-- 採用日から100日後の日付を計算
SELECT first_name, last_name, DATE_ADD(hire_date, INTERVAL 100 DAY) AS after_100_days
FROM employees;

-- 採用日から現在までの日数差分を計算
SELECT first_name, last_name, DATEDIFF(CURDATE(), hire_date) AS days_since_hire
FROM employees;

実践例

-- 採用月ごとの社員数集計(入社月でグループ化)
SELECT MONTH(hire_date) AS hire_month, COUNT(*) AS employee_count
FROM employees
GROUP BY MONTH(hire_date);

-- 採用年が2020年以降の社員リスト表示(条件付き)
SELECT first_name, last_name, hire_date
FROM employees
WHERE YEAR(hire_date) >= 2020;

-- 採用日から半年後の日付と曜日表示(日付フォーマット変更)
SELECT first_name,
DATE_FORMAT(DATE_ADD(hire_date, INTERVAL 6 MONTH), '%Y-%m-%d (%W)') AS six_months_later
FROM employees;

数値関数

概要

数値関数は、数値データを操作するために使用されます。四捨五入、切り捨て、絶対値の取得など、数学的な計算や変換を行うことができます。

主な数値関数一覧

関数 説明
ABS() 数値の絶対値を返す
CEIL() 数値を切り上げ
FLOOR() 数値を切り捨て
ROUND() 指定した小数点以下で四捨五入
MOD() 割り算の余りを返す
POWER() 指定した数値のべき乗を計算
SQRT() 数値の平方根を返す
RAND() 0以上1未満のランダムな数値を生成

使用例

-- 給与の絶対値(負の値がない場合でも使用可能)
SELECT salary, ABS(salary) AS absolute_salary
FROM employees;

-- 給与を1000円単位で四捨五入
SELECT salary, ROUND(salary, -3) AS rounded_salary
FROM employees;

-- 各社員の給与に対して平方根を計算
SELECT salary, SQRT(salary) AS sqrt_salary
FROM employees;

-- ランダムな数値を生成(例: ID順にランダムな値を割り当て)
SELECT employee_id, RAND() AS random_value
FROM employees;

-- 給与を10万円単位で切り上げ
SELECT salary, CEIL(salary / 100000) * 100000 AS rounded_up_salary
FROM employees;

実践例

-- 部署ごとの給与合計を100万円単位で四捨五入
SELECT department_id, ROUND(SUM(salary), -6) AS total_salary_rounded
FROM employees
GROUP BY department_id;

-- 社員IDで割り算した余り(MOD関数)を計算
SELECT employee_id, MOD(employee_id, 5) AS remainder
FROM employees;

-- 給与が500,000円以上の社員に対してべき乗計算(給与の2乗)
SELECT employee_id, salary, POWER(salary, 2) AS squared_salary
FROM employees
WHERE salary >= 500000;

CASE 式

概要

CASE 式は、条件に基づいて異なる結果を返すことができる制御構文です。複雑な条件分岐やデータ変換に便利です。

構文

CASE
  WHEN 条件1 THEN 1
  WHEN 条件2 THEN 2
  ...
  ELSE N
END AS 別名;

使用例

-- 給与カテゴリ分け(高給与、中給与、低給与)
SELECT employee_id,
       CASE 
           WHEN salary >= 800000 THEN '高給与'
           WHEN salary BETWEEN 500000 AND 799999 THEN '中給与'
           ELSE '低給与'
       END AS salary_category 
FROM employees;

-- 部署名が NULL の場合は「未所属」と表示する
SELECT employee_id,
       CASE 
           WHEN department_id IS NULL THEN '未所属'
           ELSE '所属済み'
       END AS department_status 
FROM employees;

-- コミッション率による報酬計算(NULLの場合は0として扱う)
SELECT employee_id,
       salary,
       CASE 
           WHEN commission_pct IS NOT NULL THEN salary * commission_pct
           ELSE 0
       END AS commission_amount 
FROM employees;

実践例

-- 部署ごとの場所カテゴリ分け(東京、大阪、それ以外)
SELECT department_name,
       CASE location
           WHEN '東京' THEN '首都圏'
           WHEN '大阪' THEN '関西圏'
           ELSE 'その他'
       END AS location_category 
FROM departments;

-- 採用年による世代分類(2020年以降: 新世代、それ以前: 従来世代)
SELECT first_name, hire_date,
       CASE 
           WHEN YEAR(hire_date) >= 2020 THEN '新世代'
           ELSE '従来世代'
       END AS generation_category 
FROM employees;

-- 給与に応じたボーナス率設定(高給与: 20%、中給与: 15%、低給与: 10%)
SELECT employee_id, salary,
       CASE 
           WHEN salary >= 800000 THEN salary * 0.20
           WHEN salary BETWEEN 500000 AND 799999 THEN salary * 0.15
           ELSE salary * 0.10
       END AS bonus_amount 
FROM employees;

INNER JOIN と LEFT JOIN

概要

テーブル結合は、複数のテーブルから関連するデータを取得するために使用されます。INNER JOIN は共通するデータのみを取得し、LEFT JOIN は左側のテーブルのすべての行を取得し、右側に一致するデータがない場合は NULL を返します。

構文

-- INNER JOIN構文
SELECT カラム1, カラム2, ...
FROM テーブルA
INNER JOIN テーブルB ON テーブルA.カラム = テーブルB.カラム;
-- LEFT JOIN構文
SELECT カラム1, カラム2, ...
FROM テーブルA
LEFT JOIN テーブルB ON テーブルA.カラム = テーブルB.カラム;

使用例

-- INNER JOIN例: 社員とその所属部署を取得
SELECT employees.first_name, employees.last_name, departments.department_name
FROM employees
INNER JOIN departments ON employees.department_id = departments.department_id;

-- LEFT JOIN例: 全社員とその所属部署(未所属の場合はNULL)
SELECT employees.first_name, employees.last_name, departments.department_name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.department_id;

LIKE と NOT LIKE

概要

LIKE は文字列のパターンマッチングを行うために使用されます。一方、NOT LIKE は指定したパターンに一致しないデータを取得します。

使用例

-- 名前が「山」で始まる社員を検索
SELECT * FROM employees WHERE first_name LIKE '山%';

-- メールアドレスが「example.com」を含む社員を検索
SELECT * FROM employees WHERE email LIKE '%example.com';

-- 名前が「山」で始まらない社員を検索
SELECT * FROM employees WHERE first_name NOT LIKE '山%';

-- メールアドレスが「example.com」を含まない社員を検索
SELECT * FROM employees WHERE email NOT LIKE '%example.com';

COALESCE 関数

概要

COALESCE 関数は、引数の中で最初に NULL でない値を返します。これにより、NULL 値を別の値に置き換えることができます。

構文

COALESCE(1, 2, ..., デフォルト値)

使用例

-- 例: コミッション率が NULL の場合は 0 に置き換え
SELECT employee_id, COALESCE(commission_pct, 0) AS adjusted_commission 
FROM employees;

-- 複数カラムの統合(name1 が NULL の場合は name2、それも NULL の場合は「名無し」)
SELECT employee_id, COALESCE(name1, name2, '名無し') AS full_name 
FROM customers;
0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?