SELECT

2011. 02. 28
SQLiteによるSQLの解釈

SELECT

select-stmt:

select-stmt

select-core:

select-core

result-column:

result-column

join-source:

join-source

single-source:

single-source

join-op:

join-op

join-constraint:

join-constraint

ordering-term:

ordering-term

compound-operator:

compound-operator

SELECTステートメントはデータベースのクエリに使用します。

SELECTの結果は、各行が持つ固定列数のゼロ個以上のデータの行です。

SELECTステートメントは、SQL言語の中で最も複雑なコマンドです。

以降の説明を簡単にするため、一連の手順として決められている、SELECTステートメントによるデータの返し方をいくつかの段落に分けて以下に示します。

これらは完全に明らかにして念頭に置いておくことが重要で、実際にはSQLiteでも他のSQLエンジンでも、これまたは他の特定の工程に従う必要があります。


単純な選択処理

単純なSELECTステートメントの構文は、select-core syntax diagramで表現されています。

単純なSELECTステートメントの生成結果は、以下に示す4つの工程で表されます。
  1. FROM clause処理:単純なSELECTの入力データを決定します。
    入力データは、(FROM句が無い場合は)暗黙的に0列の単一行か、以下のように明示的にFROM句を指定したjoin-sourceを分析することによって決定されます。

  2. WHERE clause処理:入力データは、WHERE句の式を使用してフィルタリングします。

  3. GROUP BY, HAVING and result-column expression処理:結果行の設定は、GROUP BY句に基づいたデータと、フィルタリングされた入力データセットの行の結果セットの式の計算を結合することによって計算されます。

  4. DISTINCT/ALL keyword処理:クエリが『SELECT DISTINCT』クエリの場合、重複する行は結果行のセットから削除されます。
単純なSELECTステートメントには、結合と非結合の2種類のクエリがあります。

単純なSELECTステートメントは、GROUP BY句か結果セットに1つ以上の結合関数を含む場合は、結合クエリです。

それ以外の結合関数またはGROUP BY句を含まない単純なSELECTは、非結合クエリです。


1. 入力データの決定(FROM句処理)

単純なSELECTクエリを使用した入力データは、各M列幅のN行のセットです。

FROM句が単純なSELECTステートメントから省略されている場合、入力データは暗黙的に単一行、ゼロ列幅(即ちN=1、M=0)になります。

FROM句が指定されている場合、以降のFROMキーワードで指定された、1つ以上のテーブルまたはサブクエリ(カッコ内のSELECTステートメント)で処理された、単純なSELECTクエリのデータになります。

単純なSELECTステートメント内のFROM句以降のjoin-source内で指定されたsub-selectは、sub-selectステートメントの実行によって返されたデータを含むテーブルのように処理されます。

sub-selectデータセットの各列は、collation sequencesub-selectステートメント内の式に対するaffinityを継承します。

FROM句以降のjoin-source内に単一のテーブルのみがある場合、SELECTステートメント似よって使用された入力データは名付けられたテーブルの内容になります。

FROMキーワード以降のjoin-sourceの一部として指定されたテーブルが複数ある場合、名付けられた各テーブルの内容は単純なSELECTステートメント上で動作する単一のデータセットに結合されています。

正確に言うとデータは、接続しているテーブルまたはサブクエリと共に使用されている、特定のjoin-opjoin-constraintとどのように接続されているかに依存します。

SQLite内の全ての結合は、左右のデータセットのデカルト積に基づいています。

デカルト積のデータセットの列は、右側のデータセットの全ての列の以降に、左側のデータセットの全ての列という順序になります。

デカルト積のデータセット内の行の形式は、左側と右側のデータセットからそれぞれ一意の組み合わせで結合されます。

言い換えると、Mlhs列のNlhs行から成る左側のデータセットと、Mrhs列のNrhs行の右側のデータセットの場合、デカルト積はNlhsのデータセットになります。

Nrhs行は、それぞれMlhs+Mrhs列に含まれます。

join-opが『CROSS JOIN』、『INNER JOIN』、『JOIN』、またはコンマ『,』で、ONまたはUSING句が無い場合、結合結果は単純に左右のデータセットのデカルト積になります。

結合演算子の『INNER JOIN』と『JOIN』、そして『,』間に違いはありません。

結合演算子『CROSS JOIN』は、『INNER JOIN』、『JOIN』、『,』演算子と同じデータを生成しますが、クエリ最適化によって少し処理が異なります

それ以外の場合は、以下の箇条書き項目の詳細に応じてデカルト積は変わります。
  • ON句が指定されている場合、ON式はboolean expressionとしてデカルト積の各行毎に評価されます。
    全ての行の式の評価が偽の場合、データセットから除外されます。

  • join-constraintの一部としてUSING句が指定されている場合、join-opの左右両方のデータセット内にそれぞれ列名が指定されている必要があります。
    同名な列の各ペアのため、式『lhs.X = rhs.X』はboolean expressionとしてデカルト積のそれぞれの行毎に評価されます。
    式の評価で1つ以上偽がある場合、全ての行が結果セットから除外されます。
    USING句の結果として値を比較する時、処理の親和性のため通常の規則は、照合シーケンスとNULL値の比較で適用されます。
    結合演算子の左側のデータセットからの列は、照合シーケンスと親和性を優先する目的のため、比較演算子(=)の左側にあると見なされます。
    USING句による列のペア毎の比較は、結合されたデータセットから右側データセットからの列を省略しています。
    これはUSING句と同等のON制約との唯一の違いです。

  • join-opのいずれかにNATURALキーワードが追加されている場合、暗黙的にUSING句はjoin-constraintへ追加されます。
    暗黙的なUSING句には、各左右の入力データセット両方を表す列名が含まれています。
    左右の入力データセットに共通の列名が無い場合、NATURALキーワードは結合の結果に影響を与えません。
    USINGまたはON句は、NATURALキーワードを指定することによって結合に追加することはできません。

  • join-opが『LEFT JOIN』または『LEFT OUTER JOIN』の場合、ONまたはUSINGフィルタリング句が適用された後、余った行は(もしあれば)複合データセット内にある全ての行に対応する元の左側の入力データセット内の各行の出力に追加されます。
    追加された行には、通常右側の入力データセットからコピーされた値が含まれている可能性があり、その列にはNULL値が含まれています。
2つ以上のテーブルがFROM句の一部として一緒に結合されている時、結合操作は左から右へ順番に処理されます。

言い換えると、FROM句(A join-op-1 B join-op-2 C)は((A join-op-1 B) join-op-2 C)として計算されます。


2. WHERE句のフィルタリング

Where句が指定されている場合、WHERE式はboolean expressionとして入力データ内の各行毎に評価されます。

WHERE句の全ての行の式の評価が偽の場合、続行する前にデータセットから除外されます。


3. 結果行のセットの生成

もしWHERE句の式によってフィルタリングされたFROM句からの入力データがあれば、単純なSELECTのために結果行のセットが計算されます。

正確には、どのように実行されるかは単純なSELECTが結合か非結合クエリか、GROUP BY句が指定されているか否かに依存します。

SELECTとFROMキーワード間の式のリストは、結果式リストとして知られています。

結果式が特別な式『*』の場合、入力データの全ての列はその1つの式に代入されます。

式がテーブルのエイリアスまたは『.*』に続くFROM句内のサブクエリの場合、名付けられたテーブルからの全ての列またはサブクエリは、単一の式に代入されます。

結果式リスト以外の他のコンテキスト内で『*』または『alias.*』式を使用するとエラーになります。

また、FROM句を持っていない単純なSELECTクエリ内で『*』または『alias.*』式を使用するとエラーになります。

単純なSELECTステートメントによって返された行内の列数は、『*』や『alias.*』式の代入後の結果式リスト内の式の数と同じです。

各結果行は、入力データの単一行に対して、または行のグループに対する結合クエリのため、結果式リスト内の式を評価することによって計算されます
  • SELECTステートメントがa non-aggregate queryの場合、結果式リスト内の各式はWHERE句によってフィルタリングされたデータセット内の各行に対して評価されます。

  • SELECTステートメントがan aggregate query without a GROUP BY句の場合、結果セット内の各結合式はデータセット全体に対して一度だけ評価されます。
    結果セット内の各非結合式はデータセットの任意に選択された行に対して一度評価されます。
    同じ任意選択された行は、各非結合式に使用されます。
    または、データセットがゼロ行を含む場合、各非結合式は完全にNULL値で構成される行に対して評価されます。

    結果セットのデータの単一行は、GROUP BY句を除いた結合クエリの結果で作られた、結果セット内の結合と非結合式の評価によって生成されます。
    GROUP BY句を除いた結合クエリは、入力データの行がゼロであっても、常にデータの1つの行を正確に返します。

  • SELECTステートメントがan aggregate query with a GROUP BY句の場合、GROUP BY句の一部として指定された式毎に、データセットの各行を評価します。
    各行はその結果に基づいて『group』に割り当てられます。
    (GROUP BY式を評価した結果の行は、同じグループに割り当てられている同義です)
    グループ行の目的のため、NULL値は同じとみなされます。
    GROUP BY句内の式を評価する時に、どのテキスト値を適用するかを比較する、selecting a collation sequenceのための通常の規則です。
    GROUP BY句内の式は、結果内に表示される式を持ちません。
    GROUP BY句内の式は、式を結合しない場合があります。

    HAVING句が指定されている場合、boolean expressionとして行の各グループは一度評価されます。
    HAVING句の評価結果が偽の場合、グループは破棄されます。
    HAVING句が結合式の場合、グループ内の全ての行に対して評価されます。
    HAVING句が非結合式の場合、グループから任意に選択された行に対して評価されます。
    その結果に含まれていない結合関数でも、HAVING式は値を参照することがあります。

    結果セット内の各式は、行の各グループ毎に一度評価されます。
    式が結合式の場合、グループ内の全ての行に対して評価されます。
    それ以外の場合、グループ内から単一の任意に選択された行に対して評価されます。
    結果セット内に非結合式1つ以上ある場合、全ての式は同じ行に対して評価されます。

    入力データセットの行の各グループは、結果の行のセットに単一の行を提供します。
    DISTINCTキーワードに結合したフィルタリングでは、GROUP BY句を伴う結合クエリによって返される行数は、GROUP BYとHAVING句をフィルタリングされた入力データセットに適用することによって生成された行のグループ数と同じです。

4. 重複する行の除去(DISTINCT処理)

ALLまたはDISTINCTキーワードの1つは、単純なSELECTステートメント内のSELECTキーワードに続きます。

単純なSELECTがSELECT ALLの場合、結果行のセット全体がSELECTによって返されます。

ALLまたはDISTINCTのどちらかが存在する場合、動作はALLが指定されている場合と同じです。

単純なSELECTがSELECT DISTINCTの場合、重複している行は返される前に結果行のセットから削除されます。

重複している行を検出する目的のため、2つのNULL値は同じと見なされます。

照合順序を選択するための通常の規則を適用すると、テキスト値を比較することができます。


複合選択ステートメント

2つ以上の単純なSELECTステートメントは、UNION、UNION ALL、INTERSECTまたはEXCEPT演算子を使用して、接続して合わせた複合SELECTを形成することができます。

複合SELECTでは、全てのSELECTの構成要素は結果の列と同じ数を返す必要があります。

複合SELECTの構成要素は、単純なSELECTステートメントである必要があり、ORDER BYまたはLIMIT句が含まれない可能性があります。

ORDER BYとLIMIT句は、複合SELECT全体の最後に現れる可能性があります。

UNION ALL演算子を使用して生成された複合SELECTは、UNION ALL演算子の左側にSELECTからの全ての行と、その右側にSELECTからの全ての行を返します。

UNION演算子は、重複する行が最終的な結果セットから削除されることを除いて、UNION ALL と同じように動作します。

INTERSECT演算子は、SELECTの左右の結果の積集合を返します。

EXCEPT演算子は、SELECTの右側によって返されず、SELECTの左側によって返される行のサブセットを返します。

重複する行は、結果セットを返す前に、INTERSECTとEXCEPT演算子の結果から削除されます。

複合SELECT演算子の結果から重複する行を決定する目的のため、NULL値は他のNULL値と異なる全ての非NULL値とと同じと見なされます。

2つのテキスト値の比較に使用される照合シーケンスは、優先順位で後に付加したCOLLATE演算子で指定した照合シーケンスに割り当てられないことを除けば、SELECTステートメントの左右の列がイコール演算子『=』の左右のオペランドのように決定されます。

複合SELECTの一部として行を比較する時、親和性変換は任意の値へ適用されません。

3つ以上の単純なSELECTが複合SELECTに接続されている時、左から右にまとめられます。

言い換えると、『A』、『B』と『C』が全て単純なSELECTステートメントの場合、(A op B op C)は((A op B) op C)として処理されます。


ORDER BYとLIMIT/OFFSET句

ORDER BY句を持たない複数の行を返すSELECTステートメントの場合、行が返される順序は未定義です。

また、SELECTステートメントがORDER BY句を持っている場合、行がユーザに返される順序は、ORDER BYに接続されている式のリストで決定されます。

行は最初にORDER BYリストの最も左側にある式を評価した結果に基づいて並べ替えられ、その関係は左側にある2番目以降の式の評価によって分割されます。

同じ値に評価される全てのORDER BY式の2つの行の順序は未定義です。

各ORDER BY式は、キーワードASC(小さい値が最初に返される)またはDESC(大きい値が最初に返される)のどちらかがオプションで続きます。

ASCまたはDESCのどちらかが指定されていない場合、行はデフォルトで昇順(小さい値が最初に)並べ替えられます。

各ORDER BY式は次のように処理されます。
  1. ORDER BY式が定数の整数Kの場合、式は結果セットのK番目の列のエイリアスと見なされます(列は左から右に1から始まる番号が付けられる)。

  2. ORDER BY式が出力列のいずれかのエイリアスに対応すると識別された場合、式は列のエイリアスと見なされます。

  3. それ以外のORDER BY式がその他の式の場合は、その評価と出力行の順序付けに使用された値を返します。
    SELECTステートメントが単純なSELECTの場合、ORDER BYは任意の式を含むことができます。
    ただしSELECTが複合SELECTの場合、ORDER BY式は出力列のエイリアスではなく、出力列として使用された式と正確に同じである必要があります。
並べ替える行の目的のため、値は比較式と同じ方法で比較されます。

2つのテキスト値の比較に使用される照合シーケンスは、次のように決定されます。
  1. ORDER BY式が、接尾辞COLLATE operatorを使用して照合シーケンスを割り当てた場合、指定された照合シーケンスが使用されます。

  2. それ以外のORDER BY式が接尾辞COLLATE operatorを使用して照合シーケンスを割り当てた式のエイリアスの場合、エイリアスの式に割り当てられた照合シーケンスが使用されます。

  3. それ以外のORDER BY式が列または列の式のエイリアスの場合、列のデフォルトの照合シーケンスが使用されます。

  4. それ以外の場合、BINARY照合シーケンスが使用されます。
複合SELECTステートメントでは、全てのORDER BY式は複合SELECTの結果列の1つのエイリアスとして処理されます。

ORDER BY式が整数エイリアスでない場合、SQLiteは上記の2または3のルールのどちらかに一致する結果列の複合内にある、SELECTの最も左側を検索します。

一致するものが見つかった場合、検索を停止し、式は照合されている結果列のエイリアスとして処理されます。

それ以外の場合、次の右にあるSELECTを試します。

構成しているSELECTの結果列内に一致する式が見つからなかった場合、エラーとなります。

ORDER BY句の各用語は個々に処理され、複合内の異なるSELECTステートメントからの結果列と照合することができます。

LIMIT句はSELECTステートメントによって返された行数の上限に配置するために使用されます。

任意のスカラー式は、整数または整数に可逆変換可能な値を評価するのに、LIMIT句内で使用することができます。

式がNULL値または整数に可逆変換できない他の値を評価する場合はエラーが返されます。

LIMIT式の評価が負の値の場合、返される行数に上限はありません。

それ以外の場合、LIMIT式が評価した値をNとすると、SELECTはその結果セットの最初のN行だけを返します。

また、SELECTステートメントがLIMIT句を除いたN未満の行を返す場合、結果セット全体が返されます。

式にはLIMIT句に続けてオプションでOFFSET句を接続することができ、整数または整数に可逆変換できる値に評価する必要があります。

式がOFFSET句を持つ場合、OFFSETとLIMIT句を評価した値をそれぞれMとNとすると、最初のM行はSELECTステートメントによって返された結果セットから省略され、次のN行が返されます。

またSELECTがLIMIT句を持っていない場合にM+N行未満を返す場合、最初のM行はスキップされ、(もしあれば)残った行が返されます。

OFFSET句の評価が負の値の場合、結果は評価がゼロの場合と同じになります。

OFFSET句の代わりに、LIMIT句はコンマによって区切られた2つのスカラー式を分割することができます。

この場合、最初の式はOFFSET式として使用され、2番目はLIMIT式となります。

これはOFFSET句に使用する時に、2つの式の最初がLIMIT、2番目がOFFSETとなり、直感的に反します。

これは意図的なもので、他のSQLデータベースシステムとの互換性を最大化します。



参考文献

SQL As Understood By SQLite : SELECT

0 CommentsPosted in SQLite





Bose QuietComfort 20
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
08 | 2017/09 | 10
Sun Mon Tue Wed Thu Fri Sat
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

Bose QuietComfort 20
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR