SQLのselect文についてまとめています。
select分は、指定した条件に合致したレコードをデータベースから抽出するSQLです。
目次
SQLのselectの構文

以下は、employees(社員)テーブルから、hire_date(雇用日)が1990年1月1日以降のデータをselectで10件抽出する例です。MySQLで実行しています。
mysql> SELECT * FROM `employees` where hire_date > '1990/01/01' limit 10; +--------+------------+------------+-------------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-------------+--------+------------+ | 10008 | 1958-02-19 | Saniya | Kalloufi | M | 1994-09-15 | | 10011 | 1953-11-07 | Mary | Sluis | F | 1990-01-22 | | 10012 | 1960-10-04 | Patricio | Bridgland | M | 1992-12-18 | | 10016 | 1961-05-02 | Kazuhito | Cappelletti | M | 1995-01-27 | | 10017 | 1958-07-06 | Cristinel | Bouloucos | F | 1993-08-03 | | 10019 | 1953-01-23 | Lillian | Haddadi | M | 1999-04-30 | | 10020 | 1952-12-24 | Mayuko | Warwick | M | 1991-01-26 | | 10022 | 1952-07-08 | Shahaf | Famili | M | 1995-08-22 | | 10024 | 1958-09-05 | Suzette | Pettey | F | 1997-05-19 | | 10026 | 1953-04-03 | Yongqiao | Berztiss | M | 1995-03-20 | +--------+------------+------------+-------------+--------+------------+ 10 rows in set (0.07 sec)
【関連記事】
▶SQL select文のサンプル集 結合、ソート、別テーブル生成の記述方法は?
ANSIで定められた文法は各DBMSで共通して使えるものの、各種指定はデータベースごとに実装が異なるケースがあります。例えば、limitは特定のデータベースでは使用できません。
Oracleのselectの構文
SELECT [ hint ] [ { { DISTINCT | UNIQUE } | ALL } ] select_list
FROM { table_reference | join_clause | ( join_clause ) }
[ , { table_reference | join_clause | (join_clause) } ] ...
[ where_clause ]
[ hierarchical_query_clause ]
[ group_by_clause ]
[ model_clause ]
Oracleは主要データベースのなかでは、独自拡張が多いです。ANSIで定められた機能では足りない文を独自拡張で補ってきたデータベースでもあるんですね。例えば、外部結合には「+」を使って見やすく記述することができます。その反面、テーブル指定の省略が不可で擬似テーブルのDUALを指定しなければいけない点、抽出件数を絞り込むlimitが使えない点など不便な点もあります。
SQL Serverのselectの構文
-- Syntax for SQL Server and Azure SQL Database
<SELECT statement> ::=
[ WITH { [ XMLNAMESPACES ,] [ <common_table_expression> [,...n] ] } ]
<query_expression>
[ ORDER BY <order_by_expression> ]
[ <FOR Clause>]
[ OPTION ( <query_hint> [ ,...n ] ) ]
<query_expression> ::=
{ <query_specification> | ( <query_expression> ) }
[ { UNION [ ALL ] | EXCEPT | INTERSECT }
<query_specification> | ( <query_expression> ) [...n ] ]
<query_specification> ::=
SELECT [ ALL | DISTINCT ]
[TOP ( expression ) [PERCENT] [ WITH TIES ] ]
< select_list >
[ INTO new_table ]
[ FROM { <table_source> } [ ,...n ] ]
[ WHERE <search_condition> ]
[ <GROUP BY> ]
[ HAVING < search_condition > ]
参考)SELECT (Transact-SQL) – SQL Server | Microsoft Docs
SQL ServerのSQL(Transact-SQL)は、手続き型の処理も記述できるSQLです。SQL Serverのselectでは、TOP,EXCEPT、INTERSECTなど独自の指定ができる反面、limitが使えないなど不便な点もあります。
MySQLのselectの構文
SELECT
[ALL | DISTINCT | DISTINCTROW ]
[HIGH_PRIORITY]
[STRAIGHT_JOIN]
[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
select_expr [, select_expr ...]
[FROM table_references
[PARTITION partition_list]
[WHERE where_condition]
[GROUP BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]
[HAVING where_condition]
[ORDER BY {col_name | expr | position}
[ASC | DESC], ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[PROCEDURE procedure_name(argument_list)]
[INTO OUTFILE 'file_name'
[CHARACTER SET charset_name]
export_options
| INTO DUMPFILE 'file_name'
| INTO var_name [, var_name]]
[FOR UPDATE | LOCK IN SHARE MODE]]
関連)MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.9 SELECT 構文
MySQLのselectではは、limitもoffsetも使えます。バージョン8になり、主要DBMSでできることが網羅された印象があります。
PostgreSQLのselectの構文
[ WITH [ RECURSIVE ] with_query [, ...] ]
SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]
* | expression [ [ AS ] output_name ] [, ...]
[ FROM from_item [, ...] ]
[ WHERE condition ]
[ GROUP BY expression [, ...] ]
[ HAVING condition [, ...] ]
[ WINDOW window_name AS ( window_definition ) [, ...] ]
[ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] select ]
[ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ]
[ LIMIT { count | ALL } ]
[ OFFSET start [ ROW | ROWS ] ]
[ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]
[ FOR { UPDATE | NO KEY UPDATE | SHARE | KEY SHARE } [ OF table_name [, ...] ] [ NOWAIT ] [...] ]
PostgreSQLのselect文では、window、limit、offset、FETCHなど独自の機能が使用可能です。
まとめ


- selectは、データベースから条件に合ったレコードを抽出するSQL
- ANSI SQLで定義されている以外に、各DBMSで独自拡張あり
- DBMSによっては、limitやoffsetの機能が使えないものもある