SQLの基本 ― SELECT文の書き方
SQLは、
SQLとは、リレーショナルデータベースを操作するための言語
SQLとは、リレーショナルデータベース(RDB)を操作するための言語です。データを取り出すときも、書き換えるときも、DBMSへの指示はSQLで書きます。画面に並ぶ商品の一覧も、月ごとの売上の集計も、多くはSQLの問合せで取り出しています。
SQLは国際規格ISO/IEC 9075(国内ではJIS X 3005)で定められています。多くのRDBMS(RDBを管理するDBMS)で、この規格をもとにしたSQLを使えます。ただし、細かな書き方や使える機能はDBMSごとに違います。
データベース言語は、DDLとDMLなどに大きく分かれます。DDL(データ定義言語)は、テーブルなどの構造を作ったり変えたりする文です。DML(データ操作言語)は、テーブルの中のデータを読み書きする文です。
| 種類 | 役割 | 代表的な |
|---|---|---|
| DDL(データ定義言語) | テーブルなどの構造を作る・変える | CREATE TABLE、ALTER TABLE、DROP TABLE |
| DML(データ操作言語) | テーブルの中のデータを読み書きする | SELECT、INSERT、UPDATE、DELETE |
DMLの中でも、データを取り出すSELECT文は特によく使います。DDLでテーブルを作る文は、CREATE TABLEと制約の記事で説明しています。INSERT文・UPDATE文・DELETE文の概要は、後の節で説明します。SELECT文が返す複数の行をプログラムから1行ずつ読む方法は、カーソルの記事にあります。
SELECT文は、SELECT・FROM・WHERE・ORDER BYの4つで組み立てる
SELECT文は、どの列をどのテーブルから取り出すかを指定する文です。条件や並び順も合わせて指定できます。基本の形は、SELECT句・FROM句・WHERE句・ORDER BY句の4つを組み合わせたものです。
SELECT 列名
FROM テーブル名
WHERE 条件
ORDER BY 並べ替える列名;SELECT句には、取り出したい列名をカンマで並べます。すべての列を取り出すときは、「*」という記号を使います。FROM句には、データを取り出すテーブルの名前を書きます。
WHERE句は、条件に合う行だけを残します。書かなければ、テーブルの全ての行が対象になります。USBで始まる名前のように文字列の一部で選ぶ書き方は、LIKEの記事で説明しています。値の候補や大小の範囲で選ぶ書き方はINとBETWEENの記事に、条件の列にNULLがある行の扱いはSQLのNULLの記事にまとめました。
ORDER BY句は、結果の行を指定した列の値で並べ替えます。昇順はASC、降順はDESCというキーワードで指定します。どちらも省略すると、既定の昇順になります。複数のSELECT文の結果をUNIONでつないだときは、文の最後に1回だけ書きます。
SELECT文を書くときはSELECTが先頭ですが、処理される順番は違います。先にFROMで対象のテーブルを決め、次にWHEREで行を絞り込みます。列を選ぶSELECTは、その後に処理されます。ただし、これは結果がどう決まるかを説明するための順番です。実際のDBMSは、同じ結果になる範囲で、速く処理できる手順を選びます。
この順番を知っておくと、WHERE句にSELECT句で指定していない列の条件を書ける理由が分かります。WHERE句を処理する時点では、まだ列が絞られていないためです。行を絞るWHERE句と列を選ぶSELECT句の考え方は、関係演算の記事で選択と射影として比べています。
SELECT句には、列名のほかに式も書けます。条件によって表示する値を変えたいときは、CASE式を使います。
SELECT文のパターンを選んで結果を確かめる
次の図でSELECT文のパターンを選ぶと、SQL文と結果の表が変わります。どのパターンも同じ商品の表を使います。図は実際のデータベースには接続しておらず、結果はあらかじめ計算した固定の値です。ORDER BYを付けないときの行の順番は決まっておらず、DBMSによって変わることがあります。図では、ORDER BYが無いパターンは元の表の順に並べています。
元の表(商品)
| 商品名 | 分類 | 価格 | 在庫 |
|---|---|---|---|
| ノート | 文具 | 120 | 50 |
| 消しゴム | 文具 | 100 | 80 |
| ボールペン | 文具 | 150 | 200 |
| USBメモリ | 電子 | 1500 | 15 |
| ワイヤレスマウス | 電子 | 2500 | 10 |
SELECT *
FROM 商品;「*」は全列を選ぶ記号です。WHEREが無いので、5行すべてが結果になります。
| 商品名 | 分類 | 価格 | 在庫 |
|---|---|---|---|
| ノート | 文具 | 120 | 50 |
| 消しゴム | 文具 | 100 | 80 |
| ボールペン | 文具 | 150 | 200 |
| USBメモリ | 電子 | 1500 | 15 |
| ワイヤレスマウス | 電子 | 2500 | 10 |
SELECT 商品名, 価格
FROM 商品;SELECTの直後に列名をカンマで並べると、その列だけが結果に残ります。行数は変わりません。
| 商品名 | 価格 |
|---|---|
| ノート | 120 |
| 消しゴム | 100 |
| ボールペン | 150 |
| USBメモリ | 1500 |
| ワイヤレスマウス | 2500 |
SELECT *
FROM 商品
WHERE 分類 = '文具';WHEREの条件に合う行だけが残ります。分類が「文具」の3行に絞られました。
| 商品名 | 分類 | 価格 | 在庫 |
|---|---|---|---|
| ノート | 文具 | 120 | 50 |
| 消しゴム | 文具 | 100 | 80 |
| ボールペン | 文具 | 150 | 200 |
SELECT *
FROM 商品
WHERE 価格 >= 1000;数値の比較にも「>=」などの演算子を使えます。価格が1000円以上の2行だけが残ります。
| 商品名 | 分類 | 価格 | 在庫 |
|---|---|---|---|
| USBメモリ | 電子 | 1500 | 15 |
| ワイヤレスマウス | 電子 | 2500 | 10 |
SELECT *
FROM 商品
ORDER BY 価格;ORDER BYに列名だけを書くと、既定では昇順(小さい順)で並び替わります。行数は変わりません。
| 商品名 | 分類 | 価格 | 在庫 |
|---|---|---|---|
| 消しゴム | 文具 | 100 | 80 |
| ノート | 文具 | 120 | 50 |
| ボールペン | 文具 | 150 | 200 |
| USBメモリ | 電子 | 1500 | 15 |
| ワイヤレスマウス | 電子 | 2500 | 10 |
SELECT *
FROM 商品
ORDER BY 価格 DESC;DESCを付けると降順(大きい順)になります。昇順ならASCですが、ASCは既定なので省略できます。
| 商品名 | 分類 | 価格 | 在庫 |
|---|---|---|---|
| ワイヤレスマウス | 電子 | 2500 | 10 |
| USBメモリ | 電子 | 1500 | 15 |
| ボールペン | 文具 | 150 | 200 |
| ノート | 文具 | 120 | 50 |
| 消しゴム | 文具 | 100 | 80 |
SELECT 商品名, 価格
FROM 商品
WHERE 分類 = '電子'
ORDER BY 価格 DESC;列の指定・WHERE・ORDER BYは組み合わせて使えます。電子の2行だけを価格の高い順に、商品名と価格の列だけで出します。
| 商品名 | 価格 |
|---|---|
| ワイヤレスマウス | 2500 |
| USBメモリ | 1500 |
INSERT・UPDATE・DELETE文は、行を追加・書き換え・削除する
SELECT文はデータを読み取るだけで、テーブルの内容を変えません。テーブルの内容を変えるDML文には、INSERT文・UPDATE文・DELETE文があります。
INSERT文は、テーブルに新しい行を追加します。UPDATE文は、既存の行の値を書き換えます。DELETE文は、既存の行を削除します。UPDATE文とDELETE文では、WHERE句で対象の行を絞ります。WHERE句を書き忘れると、全ての行が対象になります。どの利用者にこれらの文を許すかはGRANT文・REVOKE文の記事に、各文の詳しい書き方はINSERT・UPDATE・DELETE文の記事にあります。
INSERT INTO 商品 (商品名, 価格) VALUES ('クリップ', 80);
UPDATE 商品 SET 価格 = 130 WHERE 商品名 = 'ノート';
DELETE FROM 商品 WHERE 商品名 = '消しゴム';SQL文の組み立て方に問題があると、利用者の入力を使ってデータベースを不正に操作されることがあります。仕組みと対策は、SQLインジェクションとXSSの違いの記事で説明しています。
参考にした資料
- PostgreSQL公式ドキュメント「SELECT」(SELECT・FROM・WHERE・ORDER BYの基本構文、WHERE句の適用順序、ORDER BYの既定の並び順)
練習問題(全5問)
正解:リレーショナル
SQLは、
正解:DML
SELECT文や
正解:WHERE句が
DBMSは、
正解:小さい
ORDER BYに
正解:UPDATE文
既存の
選んでから「採点する」を押すと、解説つきで答え合わせができます。
関連記事
おすすめの本 PR
セキュリティとデータベースは、基本情報技術者試験の対策本でまとめて学べます。

