基本的なSQL構文の概要とその分類に関する詳細な解説
SQLは、データベースを扱うための汎用的な言語です。一度習得すれば、あらゆるリレーショナルデータベースを扱うための鍵を手に入れることになります。
このレッスンでは、SQLの分類と基本的な構文について体系的に解説し、今後の学習に向けた強固な基礎を築きます。
1. 学習内容
- SQLの5つの主要なカテゴリとその用途
- SELECT の基本クエリ構文
- SQLコメントの記述方法2つ
- キーワードと予約語の違い
- 識別子の命名規則
2. あるアナリストの実話
(1) 課題:別のデータベースに切り替えれば、このような事態は起こらないはずだ
以前の会社でOracleを使っていたデータアナリストが、新しい会社ではMySQLを使っている:
「3年間OracleのSQLを書いてきましたが、MySQLに切り替えたところ、構文の一部が異なっていることに気づきました。ROWNUMがLIMITになり、SYSDATEがNOW()になっています。一からやり直さなければならないのでしょうか?」
実のところ、その必要はありません。SQLの基本的な構文は共通しており、違いはわずか5%に過ぎないからです。
(2) SQL標準に基づく解決策
SQLは、すべてのリレーショナルデータベースが準拠する国際標準(ISO/IEC 9075)です:
-- This SQL runs on MySQL, PostgreSQL, Oracle, and SQL Server
SELECT 1 + 1 AS result;
メリット: 標準的なSQL構文を習得できます。別のデータベースに切り替える際、習得すべき違いはわずか5%で済みます。
| データベース | 同じ構文 | 異なる構文 |
|---|---|---|
| MySQL | 95% | LIMIT, AUTO_INCREMENT |
| PostgreSQL | 95% | SERIAL, ILIKE |
| Oracle | 95% | ROWNUM, SYSDATE |
| SQL Server | 95% | TOP, GETDATE() |
3. SQLの5つの主要なカテゴリ
graph TB
A[SQL Language] --> B[DDL Data Definition]
A --> C[DML Data Manipulation]
A --> D[DQL Data Query]
A --> E[DCL Data Control]
A --> F[TCL Transaction Control]
B --> B1[CREATE]
B --> B2[ALTER]
B --> B3[DROP]
C --> C1[INSERT]
C --> C2[UPDATE]
C --> C3[DELETE]
D --> D1[SELECT]
E --> E1[GRANT]
E --> E2[REVOKE]
F --> F1[COMMIT]
F --> F2[ROLLBACK]
| カテゴリ | 正式名称 | キーワード | 目的 | 危険度 |
|---|---|---|---|---|
| DDL | データ定義言語 | CREATE/ALTER/DROP/TRUNCATE | データベース構造を定義する | ⚠️ 中級 |
| DML | データ操作言語 | INSERT/UPDATE/DELETE | データの挿入、更新、削除 | ⚠️ 中級 |
| DQL | データクエリ言語 | SELECT | データのクエリ | ✅ セキュア |
| DCL | データ制御言語 | GRANT/REVOKE | 権限管理 | 🔴 高 |
| TCL | トランザクション制御言語 | COMMIT/ROLLBACK/SAVEPOINT | トランザクション制御 | ⚠️ 中級 |
(1) DDL — データ定義言語
データベースの構造(データベース、テーブル、インデックス)を定義します。
-- Create a Database
CREATE DATABASE mydb;
-- Create a Table
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50)
);
-- Modify the table structure
ALTER TABLE users ADD COLUMN email VARCHAR(100);
-- Delete Table
DROP TABLE users;
-- Clear Table Data (Keep Structure)
TRUNCATE TABLE users;
(2) DML — データ操作言語
表内のデータ(挿入、削除、更新)。
-- Insert data
INSERT INTO users (id, name) VALUES (1, 'Alice');
-- Update Data
UPDATE users SET name = 'Bob' WHERE id = 1;
-- Delete Data
DELETE FROM users WHERE id = 1;
(3) DQL — データクエリ言語
テーブルからクエリを実行してデータを取得します。
-- Query All Fields
SELECT * FROM users;
-- Conditional Query
SELECT name, email FROM users WHERE id > 10;
-- Sorted Queries
SELECT * FROM users ORDER BY created_at DESC;
-- Limit Results
SELECT * FROM users LIMIT 10;
(4) DCL — データ制御言語
ユーザーの権限を管理します。
-- Grant Permissions
GRANT SELECT, INSERT ON mydb.* TO 'user'@'localhost';
-- Revoke Permissions
REVOKE INSERT ON mydb.* FROM 'user'@'localhost';
(5) TCL — トランザクション制御言語
トランザクションのコミットとロールバックを管理します。
-- Start Transaction
START TRANSACTION;
-- Perform an action
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
-- Commit Transaction
COMMIT;
-- Or roll back the transaction
ROLLBACK;
4. SELECT文の基本構文
(1) SELECT文の完全な構文
SELECT [DISTINCT] column1, column2, ...
FROM table_name
[WHERE condition]
[ORDER BY column [ASC|DESC]]
[LIMIT offset, count];
▶ 例:基本的なクエリ
-- Query All Fields
SELECT * FROM employees;
-- Query a Specific Field
SELECT first_name, last_name, salary FROM employees;
-- Using Aliases
SELECT first_name AS first_name, last_name AS last_name, salary AS salary FROM employees;
-- (Omit) AS (same result)
SELECT first_name first_name, last_name last_name FROM employees;
SELECT DISTINCT department FROM employees;
出力:
+------+--------+---------+
| first_name | last_name | salary |
+------+--------+---------+
| John | Smith | 5000.00 |
| Jane | Doe | 6000.00 |
+------+--------+---------+
▶ 例:条件付きクエリ
-- Equal Value Query
SELECT * FROM employees WHERE department = 'Engineering';
-- Range Query
SELECT * FROM employees WHERE salary BETWEEN 4000 AND 8000;
-- List Query
SELECT * FROM employees WHERE department IN ('Sales', 'Marketing');
-- Fuzzy Search
SELECT * FROM employees WHERE first_name LIKE 'J%';
-- Null Value Query
SELECT * FROM employees WHERE manager_id IS NULL;
出力:
+-------------+-----------+--------+-------------+
| first_name | last_name | salary | department |
+-------------+-----------+--------+-------------+
| John | Smith | 5000.00| Engineering |
| Jane | Doe | 6000.00| Engineering |
+-------------+-----------+--------+-------------+
5. SQLのコメント
(1) 1行コメント
-- This is a single-line comment (Standard Format)
SELECT * FROM users; -- Query All Users
# This is also a single-line comment (MySQL-specific)
SELECT * FROM users;
(2) 複数行のコメント
/*
This is a multi-line comment
Can span multiple lines
Commonly used to illustrate complex queries
*/
SELECT * FROM users
WHERE status = 'active';
▶ 例:コメントの実用的な活用法
/*
Features: Query statistics on active users
Author: Alice
Date: 2026-07-03
Revision History:
- 2026-07-02 Add email_verified condition
- 2026-07-03 Add a filter for registration date
*/
SELECT
COUNT(*) AS total_users, -- Total Number of Users
AVG(age) AS avg_age, -- Average Age
MIN(created_at) AS earliest_reg -- Earliest registration date
FROM users
WHERE status = 'active' -- Count only active users
AND email_verified = TRUE -- Email verified
AND created_at >= '2025-01-01'; -- Registered after 2025
6. キーワードと予約語
(1) キーワードとは何か?
キーワードとは、SELECT、FROM、WHERE など、SQL において特別な意味を持つ単語のことです。
| 種類 | 説明 | 例 |
|---|---|---|
| キーワード | 特別な意味を持つが、識別子として使用可能(バッククォートで囲む必要がある) | order, group |
| 予約語 | 識別子として使用できません(バッククォートで囲んだ場合でも使用は推奨されません) | SELECT, TABLE |
▶ 例:キーワードの競合への対応
-- Error: order is a keyword
CREATE TABLE order (id INT);
-- Correct: Enclose in backticks
CREATE TABLE `order` (id INT);
-- Better: Avoid using keywords as table names
CREATE TABLE orders (id INT);
7. 識別子の命名規則
(1) 命名規則
| ルール | 説明 | 例 |
|---|---|---|
| 文字範囲 | 英字、数字、アンダースコア | user_name ✅ |
| 最初の文字 | アルファベットまたはアンダースコアでなければならない | 1user ❌ |
| 文字数制限 | 最大64文字 | — |
| 大文字と小文字の区別 | Windowsは大文字と小文字を区別しないが、Linuxは大文字と小文字を区別する | Users ≠ users (Linux) |
| 予約語 | 使用を避ける | order ❌ → orders ✅ |
(2) 推奨される命名規則
| スタイル | 例 | 推奨事項 |
|---|---|---|
| snake_case | user_name, order_id |
⭐⭐⭐ |
| camelCase | userName, orderId |
⭐⭐ |
| パスカルケース | UserName, OrderId |
⭐ |
snake_case の使用を推奨しています。
▶ 例:適切な命名規則
-- Good Naming Practices
CREATE TABLE user_orders (
id INT PRIMARY KEY,
user_id INT,
order_number VARCHAR(20),
total_amount DECIMAL(10,2),
created_at TIMESTAMP
);
-- Poor Naming
CREATE TABLE t1 (
c1 INT,
c2 VARCHAR(20),
c3 DECIMAL(10,2)
);
8. SQL文の記述に関するガイドライン
(1) 書式に関するガイドライン
-- Recommended Format: Capitalize keywords, one field per line
SELECT
first_name,
last_name,
salary
FROM employees
WHERE department = 'Engineering'
ORDER BY salary DESC
LIMIT 10;
(2) セミコロンの重要性
-- A semicolon is a statement terminator.
SELECT * FROM users; -- Statement 1
SELECT * FROM orders; -- Statement 2
-- Multiple statements must be separated by semicolons when executed.
❓ よくある質問
*と特定のフィールド、どちらが良いですか?*を使用しても構いません。用户名 ではなく、英語の user_name を使用してください。📖 まとめ
- SQL は、リレーショナルデータベースを操作するための標準言語であり、DDL、DML、DQL、DCL、TCL の 5 つのカテゴリに分類されます。
- DDL は構造を定義し(CREATE/ALTER/DROP)、DML はデータを操作します(INSERT/UPDATE/DELETE)
- DQL はデータのクエリ(SELECT)を行い、DCL は権限の管理(GRANT/REVOKE)を行い、TCL はトランザクションの制御(COMMIT/ROLLBACK)を行います。
- SQLのコメントには、
--1行コメントと/* */複数行コメントの2種類があります。 - 識別子としては
snake_caseを使用することをお勧めします。キーワードの使用は避けてください。 - SQL文はセミコロンで終わります
;
📝 練習問題
-
基本問題(難易度 ⭐):id(主キー)、name(NULL不可)、age、grade の各フィールドを含む
studentsテーブルを作成するための DDL 文を記述してください。 -
応用問題(難易度 ⭐⭐):
employeesテーブルから、給与が 5,000 より大きく、部署が「Sales」である従業員を、給与の降順で並べ替え、最初の 5 行のみを表示する SELECT 文を作成してください。 -
課題(難易度:⭐⭐⭐):アカウントAからアカウントBへ100元を振り込む完全なトランザクションを作成してください。これには、トランザクションの開始、2つのUPDATE文、およびコミットまたはロールバックを含める必要があります。



