SQL SELECT文は、1つ以上のテーブルから行の結果セットを返します。 [ 1 ] [ 2 ]
SELECT ステートメントは、1 つ以上のデータベース テーブルまたはデータベースビューから 0 行以上の行を取得します。ほとんどのアプリケーションでは、SELECT最も一般的に使用されるデータ操作言語(DML) コマンドです。SQL は宣言型プログラミング言語であるため、SELECTクエリは結果セットを指定しますが、計算方法は指定しません。データベースはクエリを「クエリ プラン」に変換しますが、これは実行、データベース バージョン、およびデータベース ソフトウェアによって異なる場合があります。この機能は、適用可能な制約内でクエリに最適な実行プランを見つける役割を担うため、
「クエリ オプティマイザー」と呼ばれます。
SELECT ステートメントには多くのオプション句があります。
SELECTlist は、クエリによって返される列または SQL 式のリストです。これは、リレーショナル代数の 射影演算とほぼ同じです。ASオプションで、リスト内の各列または式に別名を提供しますSELECT。これはリレーショナル代数の名前変更操作です。FROMどのテーブルからデータを取得するかを指定します。[3]WHERE取得する行を指定します。これは、リレーショナル代数の選択操作とほぼ同じです。GROUP BYプロパティを共有する行をグループ化し、各グループに集計関数を適用できるようにします。HAVINGGROUP BY 句で定義されたグループの中から選択します。ORDER BY返される行の順序を指定します。
概要
SELECTはSQLで最も一般的な操作で、「クエリ」と呼ばれます。1SELECTつ以上のテーブルまたは式からデータを取得します。標準のSELECTステートメントはデータベースに永続的な影響を与えません。一部の非標準実装では、一部のデータベースで提供されている構文SELECTのように永続的な影響を与える場合があります。 [4]SELECT INTO
クエリを使用すると、ユーザーは必要なデータを記述でき、データベース管理システム (DBMS) が計画、最適化、および選択した結果を生成するために必要な物理操作を実行できるよう になります。
クエリには、最終結果に含める列のリストが含まれ、通常はSELECTキーワードの直後に続きます。アスタリスク (" *") を使用すると、クエリがすべてのクエリ対象テーブルのすべての列を返すように指定できます。は、SELECTSQL で最も複雑なステートメントであり、オプションのキーワードと句には次のものがあります。
FROMデータを取得するテーブルを示す句。この句には、テーブルを結合するためのルールを指定するためのFROMオプションのサブ句を含めることができます。JOIN- この
WHERE句には、クエリによって返される行を制限する比較述語が含まれています。このWHERE句は、比較述語が True と評価されないすべての行を結果セットから除外します。 - 句
GROUP BYは、共通の値を持つ行をより小さな行セットに投影します。 句は、GROUP BYSQL 集計関数と組み合わせて使用されるか、結果セットから重複行を削除するために使用されます。WHERE句は、 句の前に適用されますGROUP BY。 - この
HAVING句には、句の結果の行をフィルター処理するために使用される述語が含まれていますGROUP BY。これは句の結果に基づいて動作するためGROUP BY、句の述語で集計関数を使用できますHAVING。 - この
ORDER BY句は、結果のデータを並べ替えるために使用する列と、並べ替える方向 (昇順または降順) を識別します。この句がない場合ORDER BY、SQL クエリによって返される行の順序は定義されません。 - キーワード[5]
DISTINCTは重複データを排除します。[6]
次のSELECTクエリの例では、高価な書籍のリストが返されます。クエリは、価格列に 100.00 より大きい値が含まれるBookテーブルのすべての行を取得します。結果は、タイトルの昇順で並べ替えられます。選択リストのアスタリスク (*) は、Bookテーブルのすべての列が結果セットに含まれること
を示します。
SELECT * FROM Book WHERE price > 100 . 00 ORDER BY title ;
以下の例では、書籍のリストと各書籍に関連付けられた著者の数を返すことで、複数のテーブル、グループ化、および集計のクエリを示しています。
Book.title AS Title 、count ( * ) AS Authors FROM Book JOIN Book_author ON Book.isbn = Book_author.isbn GROUP BY Book.title ;をSELECTします。
出力例は次のようになります。
タイトル 著者 ----------------------- ------- SQL の例とガイド 4 SQL の楽しさ 1 SQL 2 入門 SQL の落とし穴 1
isbn が2 つのテーブルの唯一の共通列名であり、 titleという名前の列がBookテーブルにのみ存在するという前提条件の下で、上記のクエリを次の形式で書き直すことができます。
SELECT title 、count ( * ) AS Authors FROM Book NATURAL JOIN Book_author GROUP BY title ;
ただし、多くの[ quantify ]ベンダーはこのアプローチをサポートしていないか、自然結合を効果的に機能させるために特定の列命名規則を必要とします。
SQL には、格納された値を計算する演算子と関数が含まれています。SQL では、次の例のように、選択リストで式を使用してデータを投影できます。この例では、価格が 100.00 を超える書籍のリストが返され、追加のsales_tax列に価格の 6% で計算された消費税の数字が含まれています。
SELECT isbn 、title 、price 、price * 0 . 06 AS sales_tax FROM Book WHERE price > 100 . 00 ORDER BY title ;
サブクエリ
クエリはネストできるため、あるクエリの結果をリレーショナル演算子または集計関数を介して別のクエリで使用できます。ネストされたクエリはサブクエリとも呼ばれます。結合やその他のテーブル操作は多くの場合 (すべて実装によって異なります) 計算的に優れた (つまり高速な) 代替手段を提供しますが、サブクエリを使用すると実行に階層が導入され、便利または必要になる場合があります。次の例では、集計関数はAVGサブクエリの結果を入力として受け取ります。
SELECT isbn 、title 、price FROM Book WHERE price < ( SELECT AVG ( price ) FROM Book ) ORDER BY title ;
サブクエリは外部クエリの値を使用できます。この場合、相関サブクエリと呼ばれます。
1999 年以降、SQL 標準では WITH 句、つまり共通テーブル式と呼ばれることが多い名前付きサブクエリが許可されています(IBM DB2 バージョン 2 実装にちなんで命名および設計されています。Oracle では、これらをサブクエリ ファクタリングと呼んでいます)。CTE は、自分自身を参照することで再帰的にすることもできます。その結果得られるメカニズムにより、ツリーまたはグラフのトラバーサル (リレーションとして表現される場合)、およびより一般的には固定小数点計算が可能になります。
派生テーブル
派生テーブルは、FROM 句内のサブクエリです。基本的に、派生テーブルは、選択または結合できるサブクエリです。派生テーブル機能により、ユーザーはサブクエリをテーブルとして参照できます。派生テーブルは、インラインビューまたはselect in from listとも呼ばれます。
次の例では、SQL ステートメントに、最初の Books テーブルから派生テーブル "Sales" への結合が含まれています。この派生テーブルは、Books テーブルに結合する ISBN を使用して、関連する書籍販売情報を取得します。その結果、派生テーブルは、追加の列 (販売されたアイテムの数と書籍を販売した会社) を含む結果セットを提供します。
SELECT b.isbn 、b.title 、b.price 、sales.items_sold 、sales.company_nm FROM Book b JOIN ( SELECT SUM ( Items_Sold ) Items_Sold 、Company_Nm 、ISBN FROM Book_Sales GROUP BY Company_Nm 、ISBN ) sales ON sales.isbn = b.isbn
例
テーブル T が指定されている場合、クエリの 結果、テーブルのすべての行のすべての要素が表示されます。
SELECT * FROM T
同じテーブルの場合、クエリの結果、テーブルのすべての行の列 C1 の要素が表示されます。これは、リレーショナル代数の射影に似ていますが、一般的には結果に重複行が含まれる場合があります。これは、一部のデータベース用語では垂直パーティションとも呼ばれ、クエリ出力を制限して、指定されたフィールドまたは列のみを表示します。
SELECT C1 FROM T
同じテーブルで、クエリを実行すると、列 C1 の値が '1' であるすべての行のすべての要素が表示されます。リレーショナル代数用語では、 WHERE 句によって選択が実行されます。これは水平パーティションとも呼ばれ、指定された条件に従ってクエリによって出力される行を制限します。
SELECT * FROM T WHERE C1 = 1
テーブルが複数ある場合、結果セットは行のすべての組み合わせになります。したがって、2 つのテーブルが T1 と T2 の場合、T1 行と T2 行のすべての組み合わせが結果として得られます。たとえば、T1 に 3 行、T2 に 5 行ある場合、15 行が結果として得られます。
SELECT * FROM T1, T2
標準ではありませんが、ほとんどの DBMS では、1 行の仮想テーブルが使用されていると仮定して、テーブルなしで SELECT 句を使用できます。これは主に、テーブルが不要な計算を実行するために使用されます。
SELECT 句は、プロパティ (列) のリストを名前で指定するか、ワイルドカード文字 (“*”) を使用して「すべてのプロパティ」を意味します。
結果行の制限
返される行の最大数を指定すると便利な場合がよくあります。これはテストに使用したり、クエリが予想よりも多くの情報を返す場合に過剰なリソースの消費を防ぐために使用できます。これを行う方法は、ベンダーごとに異なることがよくあります。
ISO SQL:2003では、結果セットは以下を使用して制限されることがあります。
- カーソル、または
- SELECT文にSQLウィンドウ関数を追加することで
ISO SQL:2008 でこのFETCH FIRST句が導入されました。
PostgreSQL v.9のドキュメントによると、SQLウィンドウ関数は、集計関数に似た方法で、「現在の行に何らかの形で関連するテーブル行のセット全体にわたって計算を実行します」。[7] この名前は、シグナル処理ウィンドウ関数を思い起こさせます。ウィンドウ関数の呼び出しには常にOVER句が含まれます。
ROW_NUMBER() ウィンドウ関数
ROW_NUMBER() OVER返される行の単純なテーブルに使用できます。たとえば、10 行以下を返す場合などです。
SELECT * FROM ( SELECT ROW_NUMBER () OVER ( ORDER BY sort_key ASC ) AS row_number 、 columns FROM tablename ) AS foo WHERE row_number <= 10
ROW_NUMBER は非決定的である可能性があります。sort_keyが一意でない場合、クエリを実行するたびに、sort_keyが同じ行に異なる行番号が割り当てられる可能性があります。sort_key が一意の場合、各行には常に一意の行番号が割り当てられます。
RANK() ウィンドウ関数
ウィンドウRANK() OVER関数は ROW_NUMBER のように動作しますが、同点条件の場合はn行より多くまたは少なく返すことがあります。たとえば、最も若い上位 10 人を返す場合などです。
SELECT * FROM ( SELECT RANK () OVER ( ORDER BY age ASC ) AS ranking 、 person_id 、person_name 、age FROM person ) AS foo WHERE ranking <= 10です。
上記のコードは 10 行以上を返す可能性があります。たとえば、同じ年齢の人が 2 人いる場合は、11 行を返す可能性があります。
FETCH FIRST 句
ISO SQL:2008以降では、句を使用して次の例のように結果の制限を指定できますFETCH FIRST。
SELECT * FROM T最初の10行のみ取得
この句は現在、CA DATACOM/DB 11、IBM DB2、SAP SQL Anywhere、PostgreSQL、EffiProz、H2、HSQLDB バージョン 2.0、Oracle 12c、およびMimer SQLでサポートされています。
Microsoft SQL Server 2008 以降では FETCH FIRST がサポートされていますが、これはORDER BY句の一部とみなされます。この使用法にはORDER BY、OFFSET、 、FETCH FIRST句がすべて必須です。
SELECT * FROM T ORDER BY acolumn DESC OFFSET 0 ROWS FETCH FIRST 10行のみ
非標準構文
一部の DBMS では、SQL 標準構文の代わりに、またはそれに加えて、非標準構文が提供されています。以下に、さまざまな DBMS の単純な制限クエリのバリエーションを示します。
行のページネーション
行ページネーション[9]は、データベース内のクエリの全データの一部のみを制限して表示するために使用されるアプローチです。一度に数百または数千の行を表示する代わりに、サーバーに1ページのみ(限られた行セット、たとえば10行のみ)を要求し、ユーザーは次のページ、さらにその次のページなどを要求することでナビゲートを開始します。これは、クライアントとサーバーの間に専用の接続がないWebシステムで特に役立ち、クライアントはサーバーのすべての行を読み取って表示するのを待つ必要がありません。
ページネーションアプローチにおけるデータ
{rows}= ページの行数{page_number}= 現在のページ番号{begin_base_0}= ページが始まる行番号 - 1 = (ページ番号-1) * 行数
最も簡単な方法(ただし非常に非効率的)
- データベースからすべての行を選択する
- すべての行を読み取りますが、読み取った行の row_number が ~ の場合のみ表示に送信します
{begin_base_0 + 1}。{begin_base_0 + rows}
{テーブル}から*を選択し、 { unique_key }で並べ替えます
その他の簡単な方法(すべての行を読み取るよりも少し効率的)
- 表の先頭から最後の行まですべての行を選択して表示します(
{begin_base_0 + rows}) - 行を読み取ります
{begin_base_0 + rows}が、読み取った行のrow_numberがより大きい場合にのみ表示に送信します。{begin_base_0}
位置決め方法
{rows}次の行から始まる行のみを選択して表示します({begin_base_0 + 1})- 読み取って送信すると、データベースから読み取ったすべての行が表示されます。
フィルターを使用した方法(より洗練されていますが、非常に大きなデータセットには必要です)
- フィルターを使用して行のみを選択します
{rows}:{rows}最初のページ:データベースの種類に応じて、最初の行のみを選択します。{rows}次のページ:データベースの種類に応じて、 が(現在のページの最後の行のの値){unique_key}より大きい最初の行のみを選択します。{last_val}{unique_key}- 前のページ: データを逆順に並べ替え、 が(現在のページの最初の行の の値)より小さい最初の
{rows}行のみを選択し、結果を正しい順序で並べ替えます。{unique_key}{first_val}{unique_key}
- 読み取って送信すると、データベースから読み取ったすべての行が表示されます。
階層クエリ
一部のデータベースでは、階層データ用の特殊な構文が提供されています。
SQL:2003のウィンドウ関数は、結果セットのパーティションに適用される 集計関数です。
例えば、
合計(人口) OVER (都市別区分)
現在の行と 同じ都市値を持つすべての行の人口の合計を計算します。
パーティションは、集計を変更する OVER句を使用して指定されます。構文:
< OVER_CLAUSE > :: =
OVER ( [ PARTITION BY < expr > , ... ]
[ ORDER BY <式> ] )
OVER 句は、結果セットをパーティション分割して順序付けることができます。順序付けは、row_number などの順序相対関数に使用されます。
クエリ評価 ANSI
ANSI SQLに従ったSELECT文の処理は次のようになる。[10]
select g . * from users u inner join groups g on g . Userid = u . Userid where u . LastName = 'Smith' and u . FirstName = 'John'
- FROM句が評価されると、FROM句の最初の2つのテーブルに対してクロス結合または直積が生成され、仮想テーブルVtable1が生成されます。
- ON句はvtable1に対して評価され、結合条件g.Userid = u.Useridを満たすレコードのみがVtable2に挿入されます。
- 外部結合が指定されている場合、vTable2 から削除されたレコードが VTable 3 に追加されます。たとえば、上記のクエリの場合:
どのグループにも属していないすべてのユーザーはVtable3に再度追加されます。
uが残したユーザーからu . *を選択し、グループgに参加します。g . Userid = u . Useridで、u . LastName = 'Smith' 、u . FirstName = 'John'です。
- WHERE句が評価され、この場合はユーザーJohn Smithのグループ情報のみがvTable4に追加されます。
- GROUP BY が評価されます。上記のクエリの場合:
vTable5はvTable4から返されたメンバーをグループ化して構成されます。この場合はGroupNameです。
g . GroupNameを選択し、count ( g . * ) as NumberOfMembers from users u inner join groups g on g . Userid = u . Userid group by GroupName
- HAVING 句は、HAVING 句が真であるグループに対して評価され、vTable6 に挿入されます。例:
g . GroupNameを選択し、count ( g . * ) as NumberOfMembersをusers uから内部結合グループgをg . Userid = u . Useridでグループ化し、count ( g . * ) > 5とする
- SELECTリストが評価され、Vtable 7として返されます。
- DISTINCT句が評価され、重複行が削除され、Vtable 8として返されます。
- ORDER BY 句が評価され、行が順序付けられ、VCursor9 が返されます。これはカーソルであり、テーブルではありません。ANSI ではカーソルは順序付けられた行のセット (リレーショナルではない) として定義されているためです。
RDBMSベンダーによるウィンドウ関数のサポート
リレーショナル データベースと SQL エンジンのベンダーによるウィンドウ関数機能の実装は大きく異なります。ほとんどのデータベースは、少なくとも何らかのウィンドウ関数をサポートしています。ただし、詳しく見てみると、ほとんどのベンダーが標準のサブセットのみを実装していることがわかります。強力な RANGE 句を例に挙げてみましょう。この機能を完全に実装しているのは、Oracle、DB2、Spark/Hive、Google Big Query だけです。最近では、ベンダーが標準に新しい拡張機能 (配列集計関数など) を追加しました。これらは、分散リレーショナル データベース (MPP) よりもデータの共存性の保証が弱い分散ファイル システム (Hadoop、Spark、Google BigQuery) に対して SQL を実行するコンテキストで特に役立ちます。分散ファイル システムに対してクエリを実行する SQL エンジンは、すべてのノードにデータを均等に分散するのではなく、データをネストすることでデータの共存性の保証を実現し、ネットワーク全体で大量のシャッフルを伴う潜在的にコストのかかる結合を回避できます。ウィンドウ関数で使用できるユーザー定義の集計関数は、もう 1 つの非常に強力な機能です。
T-SQLでデータを生成する
すべての結合に基づいてデータを生成する方法
1 a 、1 b を選択すべて結合1 、2 を選択すべて結合1 、3 を選択すべて結合2 、1を選択すべて結合5 、1を選択
SQL Server 2008は、 SQL:1999標準 で規定されている「行コンストラクタ」機能をサポートしています。
(値( 1,1 ) , ( 1,2 ) , ( 1,3 ) , ( 2,1 ) , ( 5,1 ) )からx ( a , b )として*を選択します
参考文献
- ^ Microsoft (2023 年 5 月 23 日). 「Transact-SQL 構文規則」.
- ^ MySQL. 「SQL SELECT 構文」。
- ^ FROM 句を省略することは標準ではありませんが、ほとんどの主要な DBMS で許可されています。
- ^ 「Transact-SQL リファレンス」。SQL Server 言語リファレンス。SQL Server 2005 オンライン ブック。Microsoft。2007 年 9 月 15 日。2007年 6 月 17 日に取得。
- ^ SAS 9.4 SQLプロシージャユーザーズガイド。SAS Institute(2013年発行)。2013年7月10日。248ページ。ISBN
9781612905686. 2015-10-21取得。UNIQUE
引数は DISTINCT と同じですが、ANSI 標準ではありません。
- ^ レオン、アレクシス、レオン、マシューズ (1999)。「重複の排除 - DISTINCT を使用した SELECT」。SQL: 完全リファレンス。ニューデリー: Tata McGraw-Hill Education (2008 年発行)。p. 143。ISBN
9780074637081. 2015-10-21取得。
[...] キーワード DISTINCT [...] は結果セットから重複を排除します。
- ^ PostgreSQL 9.1.24 ドキュメント - 第 3 章 高度な機能
- ^ OpenLink Software. 「9.19.10. TOP SELECT オプション」. docs.openlinksw.com . 2019 年10 月 1 日に閲覧。
- ^ オスカー・ボニーリャ教授、MBA
- ^ Microsoft SQL Server 2005 の内部: T-SQL クエリ (Itzik Ben-Gan、Lubor Kollar、Dejan Sarka 著)
出典
- 水平および垂直パーティション分割、Microsoft SQL Server 2000 オンライン ブック。
外部リンク
- SQL のウィンドウ テーブルとウィンドウ関数、Stefan Deßloch
- Oracle SELECT構文
- Firebird SELECT構文
- MySQL SELECT構文
- PostgreSQL SELECT構文
- SQLite SELECT構文
