SQLとは
データベースから必要なデータを取り出し、集計・更新するための問い合わせ言語。
SQLは、データ抽出や集計で候補になります。初学者にも重要で、宣言的・DBエンジンという特徴があります。
| 項目 | 内容 |
|---|---|
| 主な用途 | データ抽出、集計、分析、業務システム |
| 型 | 宣言的 |
| 実行方式 | DBエンジン |
| 学習難易度 | 初学者にも重要 |
| パッケージ管理 | DBごとに異なる |
| 公式サイト | https://www.iso.org/standard/76583.html |
| 公式ドキュメント | https://www.postgresql.org/docs/current/sql.html |
| 公式更新源 | https://www.postgresql.org/about/news/ |
最小コード例
Section titled “最小コード例”SELECT category, COUNT(*) AS countFROM eventsGROUP BY categoryORDER BY count DESC;向いていること
Section titled “向いていること”- データ抽出
- 集計
- 分析
- 業務システム
検索意図から見る要点
Section titled “検索意図から見る要点”このページへ検索から来た人は、まず「これは何の記法なのか」「今も実用されるのか」「どの資料を確認すればよいのか」を知りたいはずです。理解の入口になる情報を次のように整理します。
| 観点 | 内容 |
|---|---|
| 種別 | データベース問い合わせ言語 |
| 概要 | リレーショナルデータベースの問い合わせ、定義、更新、権限制御に使われる標準的な言語。 |
| 読み始める順番 | 公式サイト、仕様、実装例、既存資産の順に見ると判断しやすい |
読むときは、現在の実用言語なのか、過去の資産を読むための言語なのか、特定製品のためのDSLなのかを分けると判断しやすくなります。
追加調査で押さえる実務ポイント
SQLは、relational databaseへ「どのdataが必要か」「どの表を定義・更新するか」を宣言する標準化されたquery languageです。programming languageとして扱われますが、一般applicationを単独で構築するruntimeではなく、PostgreSQL、MySQL、SQL Server、Oracle Database、SQLiteなどのDBMSが実行します。標準SQLと各製品のdialect、transaction、type、NULL、index、権限を分けて学ぶことが重要です。
基本情報
| 項目 | 内容 |
|---|---|
| 名称 | Structured Query Language |
| 分類 | 宣言型query language |
| 標準 | ISO/IEC 9075 |
| runtime | 各DBMS |
| source | .sql慣例 |
| 主用途 | 定義・検索・更新・権限 |
| typing | DBMS/schema依存 |
| dialect | 製品ごとに差 |
最小例
SELECT customer_id, customer_name
FROM customers
WHERE active = TRUE
ORDER BY customer_name;
入力はSQL statement、出力はresult setです。tableとcolumnは事前に存在する必要があります。
SQLの分類
| 分類 | 例 |
|---|---|
| DDL | CREATE、ALTER、DROP |
| DML | INSERT、UPDATE、DELETE |
| Query | SELECT |
| DCL | GRANT、REVOKE |
| TCL | COMMIT、ROLLBACK |
Table作成
CREATE TABLE orders (
order_id BIGINT PRIMARY KEY,
customer_id BIGINT NOT NULL,
ordered_at TIMESTAMP NOT NULL,
total NUMERIC(12, 2) NOT NULL
);
type名、自動採番、timestamp、constraintはDBMS差があります。
Join
SELECT o.order_id, c.customer_name, o.total
FROM orders AS o
JOIN customers AS c
ON c.customer_id = o.customer_id;
join条件がないと意図しない直積になります。
Transaction
BEGIN;
UPDATE accounts
SET balance = balance - 1000
WHERE account_id = 1;
UPDATE accounts
SET balance = balance + 1000
WHERE account_id = 2;
COMMIT;
error時はROLLBACKします。isolation level、locking、retryを確認します。
NULL
NULLは空文字や0ではなく「値が不明・存在しない」を表します。比較は= NULLではなくIS NULLを使います。
SELECT *
FROM users
WHERE deleted_at IS NULL;
Standardとdialect
| 機能 | 差が出やすい |
|---|---|
| 自動採番 | IDENTITY、SERIAL等 |
| 日付計算 | INTERVAL、関数 |
| UPSERT | ON CONFLICT、MERGE |
| JSON | operator/function |
| LIMIT | LIMIT、FETCH |
| procedure | PL/pgSQL、T-SQL等 |
SQL injection
applicationから値を埋め込む際はparameterized queryを使います。
cursor.execute(
"SELECT * FROM users WHERE email = %s",
(email,)
)
table名やORDER BYなどparameter化できない部分はallowlistで制御します。
Performance
- expected rows。
- index。
- execution plan。
- statistics。
- join order。
- filter selectivity。
- pagination。
- lock。
- network transfer。
- cache。
EXPLAINのsyntaxと出力はDBMS依存です。
SQLとORM
ORMはSQLを不要にするものではありません。生成SQL、N+1、transaction、index、lockingを確認するためSQL理解が必要です。
向く用途
- relational data
- transaction
- aggregation
- reporting
- data cleanup
- access control
- schema migration
向かない用途
- arbitrary graph traversal
- raw object storageだけ
- binary media配信
- full application UI
- unbounded event stream単独処理
学習順
- SELECT。
- WHERE。
- ORDER BY。
- JOIN。
- GROUP BY。
- INSERT/UPDATE。
- constraint。
- transaction。
- index。
- execution plan。
次に読む
参考リンク
- www.iso.org - SQL標準
- www.postgresql.org - PostgreSQL SQL reference
- www.postgresql.org - SQL tutorial