SELECT_(SQL)
[Wikipedia|▼Menu]

SELECTステートメントは、1つもしくは複数のテーブルから、WHERE句などを併用し、データを抽出する、SQLにおけるデータ操作言語 (DML)ステートメントの1つである。

これは、データベースの1つもしくは複数のテーブルからデータを抽出するための命令で、データ操作言語 (DML)の中では最もよく使用される。プログラマはどのような結果を欲しいのかをSQL文で記述する必要はあるが、その結果を取得するためにどのような物理的な操作が実行されるのかを指示する必要はなく、データベースシステム(クエリオプティマイザ)がそのSQL文から最適なクエリプラン(実行計画)を作成する。

これらは、ANSI(米国規格協会)によってある程度は標準化されているが、それ以外に製品固有の命令文が多数存在するため、使用するには各種DBMSの仕様とバージョンを確認する必要がある。

なお、「テーブル」は「表」、「行」は「レコード」、「列」は「項目」と呼ぶこともある。
文法 SELECT [ALL 。DISTINCT] 列名 [,列名...] FROM テーブル名 [,テーブル名...] [WHERE 条件式] [GROUP BY 列名 [HAVING 条件式]] [ORDER BY 列名] GROUP BY 列名[,列名...] ORDER BY 列名[,列名...]
SELECT句

SELECT文において必須の構成句。指定列を記述することで、列を射影する。*で全列表示できる。また、算術演算子、グループ関数が使用可能。
入力規則
列名入力規則の主なものとしては



列名に使用できる文字は半角英数字および、$,#,_(アンダースコア)のみ。但し、一部のDBMSにおける日本語版に限り全角文字が使用可能。

列名の先頭は半角アルファベットのみ。

文字上限は半角30文字まで。

デフォルトは大文字で表示される。小文字などで表示したい場合は単一行関数を用いるか、" "で括るなどの処置が必要である。

各種DBMSにおける予約語は使用できない場合がある。


列別名
列名 [AS] 列別名 (ASは省略可)

で、列別名表示ができる。但し、WHERE句、GROUP BY句、HAVING句では列別名の記述はできない。また、列名の表示に際して、デフォルトは半角英大文字である。これを小文字などで表示させたい場合、単一行関数の文字関数を使用するか、" "で括るかするとよい。
ALL/DISTINCTの指定
ALL...テーブルに同じデータ行がある場合でもすべてのデータを返す。指定がない場合はALLが選択される。DISTINCT(UNIQUE)...テーブルに同じデータ行がある場合、重複を取り除いた1件のみを返す。グループ関数で使用可能(Accessは不可)。
単一行関数
単一の行を操作する関数で、一つの行に対し、一つの結果を返していく関数。SELECT句、WHERE句、ORDER BY句で使用可能で、以下の種類がある。また、ネスト(入れ子)に制限はない。

文字関数
文字を操作する関数。主なものに以下のものがあるが、対応しているDBMSは各種異なっているため、注意が必要である。



LOWER …殆どのDBMSで対応。指定した文字列を小文字に変換する。 例:LOWER('ABC') → abc

UPPER …指定した文字列を大文字に変換する。 例:UPPER('xyz') → XYZ

INITCAP …Oracle、postgreSQLで指定可能。指定した文字列の先頭のみを大文字に変換する。 例:INITCAP('WORLD')→ World

INSERT …MySQL、DB2で指定可能。指定した文字列に特定の文字列を置換、挿入する。(任意の文字列,挿入位置,置換を行う文字数《0の場合は、挿入》、挿入する文字) 例:INSERT('123',2,1,'to') → 1to3 INSERT('worldnews',6,0,'weather') →worldweathernews

CONCAT …Oracle、MySQL、DB2で指定可能。指定した文字列を結合する。例:CONCAT('blue','bird') → bluebird

LEFT/RIGHT …MySQL、SQLserverなどに対応。文字列の左/右部分を抽出する。

SUBSTR …Oracle、MYSQLなどに対応。指定した文字列を抽出する。(探索する文字列,探索開始の位置《-の場合、文字列末尾から》,抽出する文字数《省略した場合は全て》) 例:SUBSTR('architecture',6,3) → tec 。

INSTR …Oracle、MySQL、Accessで指定可能。指定した文字列の位置を参照する。(探索する文字列,参照する文字《複数存在すると最初に探索された位置が参照される》) 例:INSTR('emperor','r') → 5 

LENGTH/LEN …指定した文字列の長さを参照する(間の空白も含む)。例:LENGTH('Sri Jayawardenepura Kotte') →24

TRIM … ほとんどのDBMSに対応。指定した文字を削除する。対応できるのは先頭と末尾のみである。 例:TRIM('S' FROM 'sword' ) →word

REPLACE …指定の文字を置き換える(該当文字は全て置き換わる)。 例:REPLACE('encyclopedia','e','u') →uncyclopudia

REPEAT/REPLICATE …MySQL、PostgreSQLなどに対応。指定の文字を任意の数だけ繰り返す。 例:REPEAT('S',5) → SSSSS

REVERSE …MySQL、SQLserverに対応。文字列を反転させる。 例REVERSE('Lee') → eeL

SPACE …MySQL、SQLserver、DB2などに対応。スペース文字列を作成する。

などがある。

数値関数
数値を操作する関数。汎用されているものとしてROUND(四捨五入)、TRUNC(切り捨て)、MOD(剰余)などがある。ROUNDとTRUNCには引数に共通のルールがあり、(数値,n)において、n>=0の場合は小数点第(n+1)位を処理する。n<0の場合は10の(-n-1)乗の値を四捨五入する。



ROUND …指定された値の四捨五入を行う。例:ROUND(123.456,0) →123 ROUND(123.456,1) →123.5 ROUND(123.456,-1) →120

TRUNC …指定された値を切り捨てる。 例:TRUNC(123.456,-2) → 100

MOD …除算における剰余を返す。(被除数,除数) 例:MOD(1000,30) → 10 


日付関数
日付を操作する関数。各種DBMSによって大きく操作方法が異なるため、注意が必要。

データ型変換関数
特定のデータ型を特定のデータ型に変換できる。同様に、各種DBMSによって使用可能な関数が異なる。
グループ関数
グループ化を行った行に対して一つの結果を返す関数。SELECT句(但し、GROUP BY句で指定した列のみ)、HAVING句、ORDER BY句で使用可能。ネストは2段まで可能である。種類としてはAVG(平均値),MAX(最大値)、MIN(最小値)、SUM(合計)、COUNT(返される行数)、STDDEV(標準偏差)などがある。

COUNT
行数を返すものであって、合計値を返すものではない。合計値を返す場合はSUMを用いる。たとえば、
正規化を行っていない販売実績(商品番号,商品名,販売日,販売個数)という表から、各商品における合計販売個数を求めようとした場合にSELECT 商品名,COUNT(販売個数) FROM 販売実績 GROUP BY 商品名とすると、各商品名の登場頻度、すなわち販売された回数(個数は不問)が返されてしまうことになる。また、前述のALL、DISTINCTが使用可能である。例文でCOUNT(DISTINCT 販売日)とした場合、日毎に販売された商品数が返されることになる(同じ日に売れた商品の重複が避けられるため。対して、省略、あるいはALLを使うと延べ数となる)。※COUNT(*)とすると、NULL値を含めた全ての行数を返すが、COUNT(列名)とした場合、NULL値は返さない。
集合演算
複数表から問合わせ結果を参照する複合問合わせを行うための演算子を用いた構文のこと。UNION(和集合)、UNION ALL(全集合)、INTERSECT(積集合)、EXCEPTまたはMINUS(差分集合)があるが、DBMS環境によって使用できないものや演算子の名称が異なるものもある。各演算子における優先順位はなく、左から右に、順番に処理される。

主な条件として

問い合わせる行を一致させる必要がある。

各SELECT句に対応する行のデータ型の種類を一致させる必要がある(一部データ型において互換性は持つ)。

データサイズは一致していなくても良い。

ある条件を満たせば、列名は異なっていても構わない。

UNION ALL以外はソートされて返される。デフォルトは前文の第1列が基準となる。

FROM句

SELECT文において必須の構成句。FROM句では列参照に用いる表を指定する。複数の表から指定する場合、結合が行われ、JOINを用いるほか、WHERE句によって共通列の結合関係を指定することも可能(但し、この場合は外部結合ができない。但し、OracleDBMSの場合、(+)という特殊な記号を使用して、外部結合を行える)。なお、表を必要としないクエリを行う場合も、DUAL表のようなダミーの表を指定することとなるが、このような場合にFROMを省略できる拡張の行われた処理系も多く存在する。


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:24 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef