コンテンツにスキップ
PR

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/
SELECT category, COUNT(*) AS count
FROM events
GROUP BY category
ORDER BY count DESC;
  • データ抽出
  • 集計
  • 分析
  • 業務システム

このページへ検索から来た人は、まず「これは何の記法なのか」「今も実用されるのか」「どの資料を確認すればよいのか」を知りたいはずです。理解の入口になる情報を次のように整理します。

観点内容
種別データベース問い合わせ言語
概要リレーショナルデータベースの問い合わせ、定義、更新、権限制御に使われる標準的な言語。
読み始める順番公式サイト、仕様、実装例、既存資産の順に見ると判断しやすい

読むときは、現在の実用言語なのか、過去の資産を読むための言語なのか、特定製品のための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慣例
主用途定義・検索・更新・権限
typingDBMS/schema依存
dialect製品ごとに差

最小例

SELECT customer_id, customer_name
FROM customers
WHERE active = TRUE
ORDER BY customer_name;

入力はSQL statement、出力はresult setです。tableとcolumnは事前に存在する必要があります。

SQLの分類

分類
DDLCREATE、ALTER、DROP
DMLINSERT、UPDATE、DELETE
QuerySELECT
DCLGRANT、REVOKE
TCLCOMMIT、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、関数
UPSERTON CONFLICT、MERGE
JSONoperator/function
LIMITLIMIT、FETCH
procedurePL/pgSQL、T-SQL等

SQL injection

applicationから値を埋め込む際はparameterized queryを使います。

cursor.execute(
    "SELECT * FROM users WHERE email = %s",
    (email,)
)

table名やORDER BYなどparameter化できない部分はallowlistで制御します。

Performance

  1. expected rows。
  2. index。
  3. execution plan。
  4. statistics。
  5. join order。
  6. filter selectivity。
  7. pagination。
  8. lock。
  9. network transfer。
  10. 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単独処理

学習順

  1. SELECT。
  2. WHERE。
  3. ORDER BY。
  4. JOIN。
  5. GROUP BY。
  6. INSERT/UPDATE。
  7. constraint。
  8. transaction。
  9. index。
  10. execution plan。

次に読む

参考リンク