SQL
SQL (Structured Query Language)
概要(サマリー)
SQL(Structured Query Language)とは、データベースを操作するための専用言語のことである。「エスキューエル」または「シークエル」と読む。データの取得・追加・更新・削除といったCRUD操作を、決まった文法(クエリ)で記述してデータベース管理システムに指示を出す。MySQLやPostgreSQL・SQLiteなど、多くのデータベースシステムがSQLを採用しており、バックエンド開発において欠かせない知識のひとつだ。
詳細解説
テーブルとは
SQLが操作するデータベースの中では、データは「テーブル」と呼ばれる表形式で管理される。ExcelやGoogleスプレッドシートの表をイメージするとわかりやすい。
| id | name | age | |
|---|---|---|---|
| 1 | 田中 | tanaka@example.com | 25 |
| 2 | 鈴木 | suzuki@example.com | 30 |
行(レコード)が1件のデータ、列(カラム)がデータの属性に対応する。
基本的なSQL文(CRUD操作)
データの取得(SELECT)
SELECT name, email FROM users WHERE age >= 20;
users テーブルから、年齢が20以上のレコードの name と email を取得する。
データの追加(INSERT)
INSERT INTO users (name, email, age) VALUES ('田中', 'tanaka@example.com', 25);
データの更新(UPDATE)
UPDATE users SET email = 'new@example.com' WHERE name = '田中';
データの削除(DELETE)
DELETE FROM users WHERE name = '田中';
集計関数とGROUP BY
データを集計する場合は集計関数と GROUP BY を組み合わせる。
-- 年齢の平均値を求める
SELECT AVG(age) FROM users;
-- 都市ごとにユーザー数をカウントする
SELECT city, COUNT(*) AS user_count
FROM users
GROUP BY city;
代表的な集計関数:COUNT(件数)・SUM(合計)・AVG(平均)・MAX(最大)・MIN(最小)
JOINでテーブルを結合する
複数のテーブルのデータを組み合わせて取得する場合は JOIN を使う。
SELECT orders.id, users.name, orders.total
FROM orders
JOIN users ON orders.user_id = users.id;
orders(注文)テーブルと users(ユーザー)テーブルを結合して、注文IDとユーザー名と合計金額を一緒に取得するイメージだ。
SQLとセキュリティ(SQLインジェクション)
SQLを扱う上で必ず知っておくべきセキュリティリスクが「SQLインジェクション」だ。ユーザーの入力値をそのままSQLに組み込むと、悪意あるSQL文を実行させられる危険がある。
-- 危険な例(入力値を直接埋め込んでいる)
"SELECT * FROM users WHERE name = '" + userInput + "'"
-- userInputに「' OR '1'='1」と入力されると全件取得される
この問題を防ぐには「プリペアドステートメント(パラメータ化クエリ)」という手法を使い、SQLとデータを分離する。AIにSQLのコードを生成してもらうときは「SQLインジェクション対策を含めて」と明示しておくとよい。
AIコーディングとSQLの関係
AIはSQLのクエリ生成を非常に得意としている。「ユーザーテーブルから30代のメールアドレスを取得するSQL」と自然言語で頼むだけで正確なSQLを生成してもらえることが多い。ただし、DELETE や UPDATE 文はWHERE句の指定を誤ると大量データに影響が出る。AIが生成したSQL文は必ず意味を確認してから実行する習慣が大切だ。特に本番環境では、先に SELECT で対象件数を確認する手順を踏むことを強く推奨する。
よくある勘違い
SQLとデータベースは同じもの?
異なる。データベースはデータを保存する仕組み・システム全体を指す。SQLはそのデータベースを操作するための言語だ。包丁(SQL)と冷蔵庫(データベース)のような関係で、まったく別のものである。
SQLはどのデータベースでも同じ文法で動く?
基本的な構文(SELECT・INSERT・UPDATE・DELETE)はほぼ共通だが、関数や一部の構文はデータベースの種類(MySQL・PostgreSQL・SQLiteなど)によって異なる。AIに「MySQL用のSQL」と明示して生成してもらうと、より正確なコードになる。
WHEREを省略しても大丈夫?
非常に危険だ。DELETE FROM users; はWHEREなしだと「テーブル内の全データを削除」する。UPDATE も同様に全レコードが書き換えられる。本番環境で実行する前には必ず対象件数を SELECT で確認する習慣をつけてほしい。
SELECT * を使えば楽でいい?
開発中の確認用途なら問題ないが、本番環境での SELECT * は推奨されない。必要なカラムだけを指定することで、データ転送量を減らしパフォーマンスを改善できる。また、テーブル構造が変わったときに意図しないカラムを取得するリスクもある。
より詳しくAIに聞いてみよう
- SQLとは何か、データベース未経験者でもわかるように説明してください。
- SQLのSELECT文でよく使うWHERE・ORDER BY・LIMIT・GROUP BYの使い方を教えてください。
- SQLのJOINの種類(INNER・LEFT・RIGHT)と使い分けを具体例つきで教えてください。
- SQLインジェクションとは何か、どうすれば防げるか教えてください。
- 本番データベースでSQLを安全に実行するためのベストプラクティスを教えてください。