SQL の基礎
SQL の基礎とは
SQL(Structured Query Language)は、リレーショナルデータベース(RDB)を操作するための言語である。1970 年代に IBM で開発され、ISO / JIS で標準規格化されている。RDB 製品(Oracle、PostgreSQL、MySQL 等)はそれぞれ独自の拡張を持つが、基本的な構文はどの製品でも共通である。
SQL は大きく以下の 3 種類に分類される。
| 分類 | 正式名称 | 主な操作 |
|---|---|---|
| DML | Data Manipulation Language | SELECT, INSERT, UPDATE, DELETE |
| DDL | Data Definition Language | CREATE TABLE, ALTER TABLE, DROP TABLE |
| DCL | Data Control Language | GRANT, REVOKE, COMMIT, ROLLBACK |
本記事では、開発者が最も頻繁に使う DML を中心に解説する。
なぜ SIer で重要か
SIer の開発現場において、SQL は 最も使用頻度の高いスキルの一つ である。業務システムの開発では日常的に以下の場面で SQL が必要になる。
- アプリケーションからのデータアクセス処理の実装(MyBatis の XML に SQL を記述)
- テストデータの準備や確認
- 障害調査時のデータ確認
- バッチ処理の SQL 設計
- テーブル設計のレビュー
「プログラミング言語はプロジェクトごとに変わるが、SQL はどのプロジェクトでも使う」と言われるほど、SQL はSIer の開発者にとって不可欠なスキルである。
基本概念
SELECT(データの取得)
最も基本かつ頻繁に使う SQL。テーブルからデータを取得する。
-- 全カラムを取得
SELECT * FROM users;
-- 特定のカラムを取得
SELECT name, email FROM users;
-- 条件を指定して取得(WHERE)
SELECT * FROM users WHERE dept_id = 10;
-- 並び替え(ORDER BY)
SELECT * FROM users ORDER BY name ASC;
-- 件数を制限
SELECT * FROM users LIMIT 10;
INSERT(データの挿入)
テーブルに新しい行を追加する。
-- 1 行挿入
INSERT INTO users (name, email, dept_id)
VALUES ('田中太郎', 'tanaka@example.com', 10);
UPDATE(データの更新)
既存の行のデータを更新する。
-- 条件に一致する行を更新
UPDATE users SET email = 'new@example.com' WHERE id = 1;
注意: WHERE 句を付け忘れるとテーブルの全行が更新されてしまう。本番環境での UPDATE は特に慎重に行う必要がある。
DELETE(データの削除)
テーブルから行を削除する。
-- 条件に一致する行を削除
DELETE FROM users WHERE id = 1;
注意: UPDATE と同様、WHERE 句の付け忘れは全行削除につながる。
WHERE(条件指定)
データの絞り込みに使う条件句。さまざまな演算子が使用できる。
-- 等値比較
WHERE dept_id = 10
-- 範囲指定
WHERE age BETWEEN 20 AND 30
-- 部分一致(LIKE)
WHERE name LIKE '%田中%'
-- 複数条件の組み合わせ
WHERE dept_id = 10 AND status = 'active'
-- NULL の判定
WHERE deleted_at IS NULL
JOIN(テーブルの結合)
複数のテーブルを関連づけてデータを取得する。SIer の業務システムでは、ほぼすべてのクエリで JOIN が使われる。
-- 内部結合(INNER JOIN): 両方のテーブルに一致するデータのみ取得
SELECT u.name, d.name AS dept_name
FROM users u
INNER JOIN departments d ON u.dept_id = d.id;
-- 左外部結合(LEFT JOIN): 左テーブルの全行 + 右テーブルの一致する行
SELECT u.name, d.name AS dept_name
FROM users u
LEFT JOIN departments d ON u.dept_id = d.id;
| JOIN の種類 | 説明 |
|---|---|
| INNER JOIN | 両テーブルで一致する行のみ |
| LEFT JOIN | 左テーブルの全行 + 右テーブルの一致する行 |
| RIGHT JOIN | 右テーブルの全行 + 左テーブルの一致する行 |
| FULL OUTER JOIN | 両テーブルの全行 |
GROUP BY(集計)
データをグループ化して集計する。
-- 部署ごとのユーザー数を集計
SELECT dept_id, COUNT(*) AS user_count
FROM users
GROUP BY dept_id;
-- 集計結果に条件を付ける(HAVING)
SELECT dept_id, COUNT(*) AS user_count
FROM users
GROUP BY dept_id
HAVING COUNT(*) >= 5;
主な集計関数は以下の通り。
| 関数 | 説明 |
|---|---|
| COUNT | 行数を数える |
| SUM | 合計値 |
| AVG | 平均値 |
| MAX | 最大値 |
| MIN | 最小値 |
SIer での使われ方
MyBatis の XML での SQL 記述
SIer の Java 開発では、MyBatis の XML ファイルに SQL を記述することが多い。動的 SQL(条件によって WHERE 句を変える等)の記述も頻繁に行う。
障害調査での SQL
本番環境で障害が発生した際、原因調査のためにデータベースの内容を SQL で直接確認することがある。このとき、SELECT 文を素早く書いてデータの状態を把握するスキルが求められる。
SQL のレビュー
SIer のプロジェクトでは、パフォーマンスに影響する SQL のレビューが行われることが多い。インデックスの利用状況や、不要な全テーブルスキャンが発生していないかなどが確認される。
よく使うテクニック
- サブクエリ --- SELECT の中に SELECT を入れ子にする
- EXISTS --- サブクエリの結果が存在するかどうかで条件を判定
- CASE 式 --- SQL 内で条件分岐を行う
- UNION --- 複数の SELECT 結果を結合する
まとめ
- SQL は RDB を操作するための言語であり、SIer の開発者にとって最も重要なスキルの一つである
- SELECT / INSERT / UPDATE / DELETE の 4 つの基本操作が DML の中核
- WHERE 句による条件指定と JOIN によるテーブル結合は日常的に使用する
- GROUP BY による集計処理も業務システムでは頻繁に登場する
- 障害調査・テストデータ確認・パフォーマンスレビューなど、開発のあらゆる場面で SQL が必要になる