404 Not Found

404 Not Found


nginx

基本的なSQL構文の概要とその分類に関する詳細な解説

SQLは、データベースを扱うための汎用的な言語です。一度習得すれば、あらゆるリレーショナルデータベースを扱うための鍵を手に入れることになります。

このレッスンでは、SQLの分類と基本的な構文について体系的に解説し、今後の学習に向けた強固な基礎を築きます。

1. 学習内容


2. あるアナリストの実話

(1) 課題:別のデータベースに切り替えれば、このような事態は起こらないはずだ

以前の会社でOracleを使っていたデータアナリストが、新しい会社ではMySQLを使っている:

「3年間OracleのSQLを書いてきましたが、MySQLに切り替えたところ、構文の一部が異なっていることに気づきました。ROWNUMがLIMITになり、SYSDATEがNOW()になっています。一からやり直さなければならないのでしょうか?」

実のところ、その必要はありません。SQLの基本的な構文は共通しており、違いはわずか5%に過ぎないからです。

(2) SQL標準に基づく解決策

SQLは、すべてのリレーショナルデータベースが準拠する国際標準(ISO/IEC 9075)です:

SQL
-- 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つの主要なカテゴリ

100%
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 — データ定義言語

データベースの構造(データベース、テーブル、インデックス)を定義します。

SQL
-- 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 — データ操作言語

表内のデータ(挿入、削除、更新)。

SQL
-- 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 — データクエリ言語

テーブルからクエリを実行してデータを取得します。

SQL
-- 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 — データ制御言語

ユーザーの権限を管理します。

SQL
-- Grant Permissions
GRANT SELECT, INSERT ON mydb.* TO 'user'@'localhost';

-- Revoke Permissions
REVOKE INSERT ON mydb.* FROM 'user'@'localhost';

(5) TCL — トランザクション制御言語

トランザクションのコミットとロールバックを管理します。

SQL
-- 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文の完全な構文

SQL
SELECT [DISTINCT] column1, column2, ...
FROM table_name
[WHERE condition]
[ORDER BY column [ASC|DESC]]
[LIMIT offset, count];

▶ 例:基本的なクエリ

SQL
-- 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;
▶ 試してみよう

出力:

TEXT
+------+--------+---------+
| first_name | last_name | salary  |
+------+--------+---------+
| John | Smith  | 5000.00 |
| Jane | Doe    | 6000.00 |
+------+--------+---------+

▶ 例:条件付きクエリ

SQL
-- 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;
▶ 試してみよう

出力:

TEXT
+-------------+-----------+--------+-------------+
| first_name  | last_name | salary | department  |
+-------------+-----------+--------+-------------+
| John        | Smith     | 5000.00| Engineering |
| Jane        | Doe       | 6000.00| Engineering |
+-------------+-----------+--------+-------------+

5. SQLのコメント

(1) 1行コメント

SQL
-- 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) 複数行のコメント

SQL
/*
This is a multi-line comment
Can span multiple lines
Commonly used to illustrate complex queries
*/
SELECT * FROM users
WHERE status = 'active';

▶ 例:コメントの実用的な活用法

SQL
/*
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) キーワードとは何か?

キーワードとは、SELECTFROMWHERE など、SQL において特別な意味を持つ単語のことです。

種類 説明
キーワード 特別な意味を持つが、識別子として使用可能(バッククォートで囲む必要がある) order, group
予約語 識別子として使用できません(バッククォートで囲んだ場合でも使用は推奨されません) SELECT, TABLE

▶ 例:キーワードの競合への対応

SQL
-- 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は大文字と小文字を区別する Usersusers (Linux)
予約語 使用を避ける order ❌ → orders

(2) 推奨される命名規則

スタイル 推奨事項
snake_case user_name, order_id ⭐⭐⭐
camelCase userName, orderId ⭐⭐
パスカルケース UserName, OrderId
💡 ヒント: MySQLコミュニティでは、公式ドキュメントの表記スタイルに準拠した snake_case の使用を推奨しています。

▶ 例:適切な命名規則

SQL
-- 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) 書式に関するガイドライン

SQL
-- 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) セミコロンの重要性

SQL
-- 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.

❓ よくある質問

Q SQL文は大文字で記述する必要がありますか?
A いいえ、必ずしもそうする必要はありませんが、可読性を高めるためにキーワード(SELECT、FROM、WHEREなど)は大文字で記述することをお勧めします。MySQLは大文字と小文字を区別しません。
Q *と特定のフィールド、どちらが良いですか?
A 本番環境では特定のフィールドの使用をお勧めします(パフォーマンスが向上し、意味も明確になります)。学習段階では*を使用しても構いません。
Q SQLのコメントはパフォーマンスに影響しますか?
A いいえ。MySQLのパーサーはコメントを無視し、コメントは実行されません。
Q テーブル名やフィールド名に漢字を使用できますか?
A 技術的には可能です(バッククォートが必要です)が、強く推奨されません。用户名 ではなく、英語の user_name を使用してください。
Q DDLとDML、どちらがより危険ですか?
A DDL(DROP/ALTER)の方が危険です。テーブルを削除するとそのデータがすべて消去され、テーブル構造を変更するとアプリケーションに影響が出る可能性があります。これらの操作を実行する前に、必ずデータをバックアップしてください。

📖 まとめ


📝 練習問題

  1. 基本問題(難易度 ⭐):id(主キー)、name(NULL不可)、age、grade の各フィールドを含む students テーブルを作成するための DDL 文を記述してください。

  2. 応用問題(難易度 ⭐⭐)employees テーブルから、給与が 5,000 より大きく、部署が「Sales」である従業員を、給与の降順で並べ替え、最初の 5 行のみを表示する SELECT 文を作成してください。

  3. 課題(難易度:⭐⭐⭐):アカウントAからアカウントBへ100元を振り込む完全なトランザクションを作成してください。これには、トランザクションの開始、2つのUPDATE文、およびコミットまたはロールバックを含める必要があります。

Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%