SELECT文又は副問合せ(サブクエリ)を使用すると、1つ以上の表からデータを取り出すことができます。
SELECT構文について
SELECT [STRAIGHT_JOIN]
[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] [HIGH_PRIORITY]
[DISTINCT | DISTINCTROW | ALL]
select_expression,...
[INTO {OUTFILE | DUMPFILE} 'file_name' export_options]
[FROM table_references
[WHERE where_definition]
[GROUP BY {unsigned_integer | col_name | formula} [ASC | DESC], ...]
[HAVING where_definition]
[ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] ,...]
[LIMIT [offset,] rows | rows OFFSET offset]
[PROCEDURE procedure_name(argument_list)]
[FOR UPDATE | LOCK IN SHARE MODE]]
非常にわかりにくいですね。 最も利用頻度が高いだけにいろいろなことができます。
SELECT文の利用方法を紹介していきます。
単純なSELECT構文:
SELECT 列名,列名,... FROM テーブル名;
ひとつの表に入っている全てのデータを取得するには、上記SQL文を実行します。 列名は、1つでも複数でもかまいません。
もし、表の全ての列を表示したい場合は、以下のようにSQL文を記述します。
SELECT * FROM テーブル名;
テーブルを使用しないSELECT文も存在します。
SELECT 2 + 3; +-----+ | 2+3 | +-----+ | 5 | +-----+ 1 row in set (0.01 sec)
ある条件で表示する行を限定したい場合、WHERE句を使用します。
WHERE句を使ったSELECT構文:
SELECT 列名,列名,... FROM テーブル名 WHERE 条件式;
WHERE句に指定する条件式は、列名と演算子、関数を組み合わせて設定します。
また、ANDやORを使用して複数の条件を組み合わせて行を抽出することができます。
WHERE句で使える演算子:
| 演算子 | 例 | 意味 |
|---|---|---|
| = | WHERE 列名 = a | aと等しい |
| != | WHERE 列名 != a | aと等しくない |
| < | WHERE 列名 < a | aより小さい |
| > | WHERE 列名 > a | aより大きい |
| <= | WHERE 列名 <= a | aより小さいか等しい |
| >= | WHERE 列名 >= a | aより大きいか等しい |
| <> | WHERE 列名 <> a | aと等しくない |
| LIKE | WHERE 列名 LIKE 'a%' | aの値を含むパターンと等しい
「%」は、 ワイルドカードです。 'a%'や'%a%'や'%a'といった使い方をします。 |
| BETWEEN a AND b | WHERE 列名 BETWEEN a AND b | aとbの範囲内にある |
| IN | WHERE 列名 IN(a,b,...) | a,b,...のどれかの値に一致している |
| IS NULL | WHERE 列名 IS NULL | NULLである |
| IS NOT NULL | WHERE 列名 IS NOT NULL | NULLでない |
| NOT | WHERE 列名 NOT LIKE 'a%' | 結果を反転する |
使用例:
SELECT NAME FROM EMP WHERE NAME = 'bnote';
指定した列の値を元に行をグループ化したい場合、GROUP BY句を使用します。 GROUP BY句で指定した列は、必ずSELECT句に指定します。
ORDER BY句を使ったSELECT構文:
SELECT 列名[,列名,...],集計関数[,集計関数,...] FROM テーブル名 GROUP BY 列名[,列名,...];
GROUP BYで使用する集計関数:
| 関数 | 意味 | 意味 |
|---|---|---|
| COUNT | 選択された行数を返します。 | NULLは数えません。 |
| AVG | 平均値を返します。 | NULLは含みません。 |
| MIN | 最小値を返します。 | NULLは対象にしません。 |
| MAX | 最大値を返します。 | NULLは対象にしません。 |
| SUM | 合計を返します。 | NULLは含みません。 |
| VARIANCE | 標準偏差を返します。 | NULLは含みません。4.1以降 |
| GROUP_CONCAT | グループ内の値を連結した結果の文字列を返す。 |
使用例:
SELECT count(*) FROM EMP; 又は SELECT department,count(*) FROM EMP GROUP BY department;
グループ化(GROUP BY句)した結果に対して抽出を行いたい場合、HAVING句を使用します。
HAVING句を使ったSELECT構文:
SELECT 列名[,列名,...],集計関数[,集計関数,...] FROM テーブル名 [GROUP BY 列名[,列名,...]]
HAVING グループ処理の結果に対する条件;
HAVING句の条件は、GROUP BY句で指定した項目か集計関数を指定することができます。
WHERE句で対象行を絞った後に集計し、HAVING句で選択するといった使い方もできます。
HAVINGの例:
SELECT department,count(*) AS cnt FROM EMP GROUP BY department HAVING cnt > 10;
指定した列の値を元に行を並べ替えたい場合、ORDER BY句を使用します。
ORDER BY句を使ったSELECT構文:
SELECT 列名[,列名,...] FROM テーブル名 ORDER BY 列名[,列名,...];
ORDER BY句には、複数の項目を指定することができます。また、SELECT句で指定していない列も指定できます。
昇順や降順を指定するには、列名の後にASC(昇順)、DESC(降順)を付けることで並び順を指定できます。 デフォルトは、ASC(昇順)です。
SELECT * FROM テーブル名 ORDER BY 列名 DESC;