Skip to main content

This documentation is for an older version of this product. See the latest version of this content.Opens in a new tab

SELECT (SQL)

データベース内のテーブルから行を検索します。

Synopsis

基本的な選択

SELECT * FROM table SELECT selectItem FROM table SELECT selectItem, selectItem2, ... FROM table SELECT ... FROM table, table2, ...
述語条件

SELECT ... FROM ... WHERE condition SELECT ... FROM ... [WHERE condition] GROUP BY column SELECT ... FROM ... [WHERE condition][GROUP BY column] HAVING condition SELECT ... FROM ... [WHERE condition][GROUP BY column][HAVING condition] ORDER BY itemOrder [ASC | DESC]
エイリアス

SELECT selectItem AS columnAlias FROM ... SELECT selectItem AS columnAlias, selectItem2 AS columnAlias2, ... FROM ...  SELECT ... FROM table AS tableAlias ... SELECT ... FROM table AS tableAlias, table2 AS tableAlias2, ... 
選択条件

SELECT DISTINCT ... FROM ... SELECT DISTINCT BY (distinctItem) ... FROM ... SELECT DISTINCT BY (distinctItem, distinctItem2, ...) ... FROM ...  SELECT TOP numRows ... FROM ... SELECT DISTINCT TOP ... FROM ... SELECT TOP ALL ... FROM ...  SELECT ALL ... FROM ...
埋め込み SQL のホスト変数

SELECT selectItem INTO :var FROM ... SELECT selectItem, selectItem2, ... INTO :var, :var2, ... FROM ... SELECT * INTO :var() FROM ...
キーワード・オプション

SELECT %keyword ... FROM ...
サブクエリとクエリ・キャッシュ

(SELECT ... FROM ...)
サンプルの選択

SELECT ... FROM table WHERE %ID %FIND %SQL.SAMPLE( tablename, percent, seed )

説明

SELECT 文は、InterSystems IRIS® データベースのデータを取得するクエリを実行します。最も単純な形式では、1 つのテーブルの 1 つまたは複数の列からデータを取得します。SELECT selectItem 節は、選択する列を指定します。FROM table 節は、選択元のテーブルを指定します。オプションの WHERE 節は、どの行の列の値を返すかを指定する condition 要素を 1 つまたは複数指定します。

より複雑なクエリでは、SELECT 文は、列データ、集約データ、計算された列データを取得したり、結合を使用して複数のテーブルからデータを取得したりできます。ビューを使用してデータを取得することもできます。

SELECT 文は、以下のコンテキストで使用できます。

  • 独立した InterSystems SQL クエリ。

  • 括弧で囲まれた SELECT 文に値を提供するサブクエリ。

  • UNION のサブセット。UNION 文で、1 つまたは複数の SELECT 文を単独のクエリに結合できます。

  • ビューで使用可能なデータを定義する CREATE VIEW の一部。

  • SELECT 文と組み合わせた INSERT 文の一部。INSERT 文は、SELECT を使用して、別のテーブルからデータを選択して、複数行のデータ値をテーブルに挿入できます。詳細は、"複数行の挿入" を参照してください。

  • ダイナミック SQL クエリ、埋め込み SQL クエリ、またはクラス・クエリとして準備された独立したクエリ。ダイナミック SQL を使用すると、クエリ内で指定した列の数、クエリ内で指定した列の名前 (またはエイリアス)、クエリ内で指定した列のデータ型など、SELECT クエリに関するメタデータを返すこともできます。

  • 埋め込み SQL と共に使用する DECLARE CURSOR の一部。

SELECT は、クエリの結果を結果セットで返します。また、SQLCODE ステータス変数も設定し、クエリの成功または失敗を示します。詳細は、"SELECT のステータスと返り値" を参照してください。

SELECT 節は、構文に示す順序で指定する必要があります。SELECT 節を不適切な順序で指定すると、SQLCODE -25 エラーが生成されます。SELECT 構文の順序は SELECT 節のセマンティック処理順序と同じではありません。詳細は、"SELECT 節の実行順序" を参照してください。

基本的な選択

  • SELECT * FROM table は、すべての項目を 1 つのテーブルから選択します。通常、これらの項目は、テーブル内の列です。

    以下のクエリは、Sample.Person テーブルからすべての列を選択します。

    SELECT * FROM Sample.Person

    この形式の詳細は、"すべての列の選択 (アスタリスク構文)" を参照してください。

  • SELECT selectItem FROM table は、1 つの項目を 1 つのテーブルから選択します。

    以下のクエリは、Sample.Person テーブルから Name 列を選択します。

    SELECT Name FROM Sample.Person
  • SELECT selectItem, selectItem2, ... FROM table は、selectItem の値のコンマ区切りリストを使用して、1 つのテーブルから複数の項目を選択します。

    以下のクエリは、Sample.Person テーブルから Name 列および Age 列を選択します。

    SELECT Name,Age FROM Sample.Person
  • SELECT ... FROM table, table2, ... は、table の名前のコンマ区切りリストを使用して、複数のテーブルから 1 つまたは複数の同じ項目を選択します。

    以下のクエリは、Sample.Person テーブルと Sample.Employee テーブルの両方から Name 列および Age 列を選択します。

    SELECT Name,Age FROM Sample.Person,Sample.Employee

    SELECT 文内のテーブルを関連付けるには、JOIN 式を使用します。

Note:

関数からデータを返す文など、テーブル・データを参照しない文の場合、FROM 節はオプションです。この節の詳細は、FROM 節のリファレンス・ページを参照してください。

述語条件

  • SELECT ... FROM ... WHERE condition は、condition (論理演算子で結合した一連の述語) が真となるテーブル行を返します。例えば、以下の文は、40 歳以上のマサチューセッツ州の居住者のみを選択します。

    SELECT Name,Age,Home_State FROM Sample.Person WHERE Age > 40 AND Home_State = 'MA'

    また、condition 引数は、集約関数に提供する値を該当する行からの値に制限します。WHERE 節の述語は、集約関数を直接受け入れません。これらの値は、他の節から WHERE 節に渡す必要があります。詳細は、WHERE 節のリファレンス・ページを参照してください。

    例 : 述語条件を使用したデータのサブセットの選択

  • SELECT ... FROM ... [WHERE condition] GROUP BY column は、クエリ結果セットをグループに編成し、指定したテーブル列から取得した個別値ごとに 1 行を返します。

    column 引数には、列名のコンマ区切りリスト、または列名に評価されるスカラ式を指定できます。GROUP BY 節は多くの場合、集約関数と組み合わせて使用されます。

    以下のクエリは、Home_State 列で見つかった個別の州ごとに 1 行を返すと共に、COUNT(Home_State) の選択結果を計算して各州の数を返します。

    SELECT Home_State, COUNT(Home_State)
    FROM Sample.Person
    GROUP BY Home_State

    この節の詳細は、GROUP BY 節のリファレンス・ページを参照してください。

    例 : 述語条件を使用したデータのサブセットの選択

  • SELECT ... FROM ... [WHERE condition][GROUP BY column] HAVING condition は、HAVING condition が真であるテーブル行を返します。WHERE 節と異なり、HAVING 節はグループを操作するもので、多くの場合 GROUP BY 節と組み合わせて使用されます。

    HAVING condition は、返される行を指定しますが、既定では、集約関数に提供される値をこれらの行の値に制限しません。この既定値を上書きするには、%AFTERHAVING キーワードを使用します。

    WHERE 節と異なり、HAVING 節には集約関数を指定できます。

    以下のクエリは、Age がデータベース内の全員の平均年齢を上回る行を返します。

    SELECT Name,AVG(Age %AFTERHAVING)
    FROM Sample.Person
    HAVING (Age > AVG(Age))

    この節の詳細は、HAVING 節のリファレンス・ページを参照してください。

    例 : 述語条件を使用したデータのサブセットの選択

  • SELECT ... FROM ... [WHERE condition][GROUP BY column][HAVING condition] ORDER BY itemOrder [ASC | DESC] は、返される行を表示する順序を指定します。itemOrder は、SELECT selectItem 節で指定した選択項目として指定するか、該当する項目のコンマ区切りリストとして指定します。

    各項目には、その項目の返り値の順序を指定する ASC (昇順) キーワードまたは DESC (降順) キーワードをオプションで指定できます。既定は昇順です。

    以下のクエリは、データベースのすべての行の選択された列を年齢の昇順で返します。

    SELECT Home_State, Name, Age 
    FROM Sample.Person
    ORDER BY Age

    SELECT コマンドは、ORDER BY 節をクエリの結果に適用します。この節は多くの場合、TOP 節と組み合わせて使用されます。ORDER BY 節をサブクエリまたは CREATE VIEW クエリで使用する場合、TOP 節は必須です。

    "ウィンドウ関数の概要" で説明しているように、ORDER BY 節にはウィンドウ関数を含めることができます。

    この節の詳細は、ORDER BY 節のリファレンス・ページを参照してください。

    例 : 述語条件を使用したデータのサブセットの選択

エイリアス

  • SELECT selectItem AS columnAlias FROM ... は、列または他の selectItem の値の名前にエイリアスを設定します。columnAlias の値は、結果セットの列見出しとして表示されます。エイリアスを使用すると、返されるデータを理解しやすくなります。エイリアスを指定しない場合、結果セットでは、選択項目で指定されている列名が使用されます。

    以下のクエリは、Home_State の結果を US_State_Abbrev という名前の列に返します。

    Select Home_State AS US_State_Abbrev FROM Sample.Person

    例 : 結果セットの列の大文字/小文字の変更

  • SELECT selectItem AS columnAlias, selectItem2 AS columnAlias2, ... FROM ... は、複数の選択項目のエイリアスを設定します。

    以下のクエリは、Name および Home_State の結果をそれぞれ PersonName 列および State 列に返します。

    Select Name AS PersonName,Home_State AS State FROM Sample.Person

    例 : マルチテーブル・クエリにおける列名の区別

  • SELECT ... FROM table AS tableAlias ... は、テーブル名のエイリアスを設定します。テーブル・エイリアスは、selectItem 値のテーブルの接頭語として使用できます。

  • SELECT ... FROM table AS tableAlias, table2 AS tableAlias2, ... は、複数のテーブルのエイリアスを設定します。テーブル・エイリアスを使用して、選択した列が属するテーブルを示すことができます。以下に例を示します。

    SELECT P.Name, E.Name FROM Sample.Person AS P, Sample.Employee AS E

    例 : マルチテーブル・クエリにおける列名の区別

選択条件

DISTINCT 節

  • SELECT DISTINCT ... FROM ... は、selectItem 値の一意の組み合わせごとに 1 行のみを返します。この節を使用して、重複する列値を結果セットから除外できます。1 つまたは複数の選択項目を指定できます。

    以下のクエリは、Home_State 値と Age 値の一意の組み合わせごとに 1 行を返します。

    SELECT DISTINCT Home_State,Age FROM Sample.Person
  • SELECT DISTINCT BY (distinctItem) ... FROM ... は、distinctItem の一意の値ごとに 1 行を返します。distinctItem は、selectItem の項目である必要があります。distinctItem は括弧で囲みます。DISTINCT BY を使用すると、selectItem で指定した項目以外の項目に基づいて個別値を返すことができます。クエリ SELECT DISTINCT BY (item) item FROM Sample.Person は、SELECT DISTINCT item FROM Sample.Person と同じです。

    以下のクエリは、一意の Age 値ごとに Name 値と Age 値が含まれる 1 行を返します。

    SELECT DISTINCT BY (Age) Name,Age FROM Sample.Person
  • SELECT DISTINCT BY (distinctItem, distinctItem2, ...) ... FROM ... は、コンマ区切りリストを使用して、distinctItem 値の一意の組み合わせごとに 1 行を返します。

    以下のクエリは、Home_State 値と Age 値の一意の組み合わせごとに、Name 値と Age 値が含まれる 1 行を返します。

    SELECT DISTINCT BY (Home_State,Age) Name,Age FROM Sample.Person

TOP 節

  • SELECT TOP numRows ... FROM ... は、返された table の "上位" から、numRows で指定した行数分を返します。既定の "上位" の行は、予測不能な場合があります。返される上位の行をさらに制御するには、DISTINCT 節を含めて一意の値のみを返したり、ORDER BY 節を含めて特定の行に基づいて値を並べることができます。SELECT コマンドは、TOP 行を選択する前にこれらの節を適用します。

    以下のクエリは、上位 10 個の Name 値をアルファベット順で返します。

    SELECT TOP 10 Name FROM Sample.Person ORDER BY Name ASC

    詳細は、TOP 節のリファレンス・ページを参照してください。

  • SELECT DISTINCT TOP ... FROM ... は、"上位" の一意の行を指定された数だけ返します。

  • SELECT TOP ALL ... FROM ... は、すべての行を選択します。この構文は、サブクエリまたは CREATE VIEW 文で使用した場合にのみ意味を持ちます。この構文は、そのような状況で ORDER BY 節の使用をサポートするために使用します。サブクエリ、または CREATE VIEW 文で使用するクエリでは、ORDER BY 節を TOP 節と組み合わせる必要がありますが、この構文により、その要件を満たすことができます。TOP ALL 操作は、返される行数を制限するものではありません。

ALL 節

  • SELECT ALL ... FROM ... は、SELECT 条件を満たすすべての行を返します。これは、InterSystems SQL の既定です。ALL キーワードは何の操作も実行しません。これは、SQL の互換性のためだけに用意されたものです。

埋め込み SQL のホスト変数

  • SELECT selectItem INTO :var FROM ... は、1 つのテーブルから 1 つの列を選択してホスト変数 var に保存します。ホスト変数は、埋め込み SQL のクエリでのみ指定できます。

  • SELECT selectItem, selectItem2, ... INTO :var, :var2, ... FROM ... は、複数の列を選択して、対応するホスト変数に保存します。列数は、ホスト変数の数と一致しなければなりません。ホスト変数は述語節でも使用できます。

    このクラス・スニペットは、2 つのフィールドを選択し、後でフェッチできるようにそれらをホスト変数に格納するカーソルを宣言します。カーソルは、クラスの入力引数を個別のホスト変数として格納することによって、フェッチ結果をソートし、フィルタ処理します。

    ClassMethod AgeThreshold(ageThreshold As %Integer, orderBy As %String = "") As %Status
    {
      write "People who are age " _ageThreshold_ " and up:"
    
      &sql(declare CC cursor for 
      SELECT Name,Age
      INTO :name,:age
      FROM Demo.Person
      WHERE (Age >= :ageThreshold)
      ORDER BY :orderBy)
    
      // ...
    }

    例 : 埋め込み SQL およびダイナミック SQL を使用した ObjectScript プログラム内からのデータの選択

  • SELECT * INTO :var() FROM ... は 1 つのテーブルからすべての列を選択して添え字付き変数 var に保存します。クラス定義でプライベートとして指定された列は含まれません。ホスト変数にアクセスするには、構文 var(colIndex) を使用します。ここで colIndex は、この列の SqlColumnNumber によって特定される列の順序インデックスです。詳細は、"列番号を添え字とするホスト変数" を参照してください。

キーワード・オプション

  • SELECT %keyword ... FROM ... は、1 つまたは複数の %keyword オプションを空白で区切って設定します。有効なオプションは、%NOFPLAN%NOLOCK%NORUNTIME%PROFILE、および %PROFILE_ALL です。%keyword 引数を使用するには、現在のネームスペースに対応する管理特権が必要となります。詳細は、"GRANT" を参照してください。

サブクエリとクエリ・キャッシュ

  • (SELECT ... FROM ...) は、追加された括弧のペアごとに個別のクエリ・キャッシュを生成します。サブクエリを指定する際にも、クエリを括弧で囲む必要があります。

    SELECT 文では、selectItem リスト、FROM 節、または EXISTS 述語か IN 述語が含まれる WHERE 節にサブクエリを指定できます。また、UPDATE 文または DELETE 文にもサブクエリを指定できます。サブクエリは括弧で囲む必要があります。

    独立した SELECT クエリ、UNION サブセットの SELECT クエリ、CREATE VIEW SELECT クエリ、および DECLARE CURSOR SELECT クエリの場合、1 つまたは複数の括弧の組はオプションです。SELECT クエリを括弧で囲むと、サブクエリの構文ルールに従うことになります。特に、ORDER BY 節は TOP 節と組み合わせる必要があります。

    括弧は INSERT ... SELECT 文では許可されません。

サンプルの選択

  • SELECT ... FROM table WHERE %ID %FIND %SQL.SAMPLE( tablename, percent, seed ) は、テーブルからランダムなサンプルを選択します。percent 引数は、各データ・ブロックのサンプリングする割合を指定します。データ・ブロックに格納されている行数は可変であるため、テーブルの 10% をサンプリングしても、テーブル内のすべての行の 10% が返されるとは限りません。tabletablename は、サンプリング元のテーブルの修飾名である必要がありますが、table識別子tablename は文字列である必要があります。

    また、table はビューを参照できず、ビットマップ・エクステント・インデックスが必要で、ブロックサンプリングが有効である必要があります。RowID フィールドは、既定の動作と同様に、宣言されるか、暗黙的に正の整数である必要があります。

    seed 引数はオプションです。これが指定されていない場合は、既定で空の文字列となります。

引数

selectItem

selectItem はすべての SELECT 文に必須の引数です。この引数で、テーブルから選択する 1 つの項目、または複数の項目のコンマ区切りリストを指定します。各 selectItem は以下のいずれかとして指定できます。

  • FROM 節で指定したテーブルの列名。"テーブル列の選択" を参照してください。

  • テーブル列またはテーブル全体を参照するサブクエリ。"サブクエリの選択" を参照してください。

  • FROM 節で指定していないテーブルの列名。暗黙結合 (矢印構文とも呼ばれる) を使用して指定します。"暗黙結合による選択" を参照してください。

  • テーブル内のすべての列。アスタリスク (*) 構文を使用して指定します。"すべての列の選択" を参照してください。

  • 埋め込みシリアル・オブジェクト内のプロパティ。アンダースコア (_) 構文を使用して指定します。"埋め込みシリアル・オブジェクトの選択" を参照してください。

テーブル列から選択したデータを変更する関数、または選択内容から新しいデータを計算する関数として、selectItem を指定することもできます。以下の項目を指定できます。

  • 選択した列データを集約し、1 つの値を返す SQL 関数。"集約関数による選択" を参照してください。

  • 各行の集約、ランキングなどの関数を、その行に固有の "ウィンドウ・フレーム" に基づいて計算するウィンドウ関数。"ウィンドウ関数による選択" を参照してください。

  • 選択したテーブル・データを操作する SQL 関数、ObjectScript クラス・メソッド呼び出し、または ObjectScript 関数呼び出し。"関数およびメソッド呼び出しによる選択" を参照してください。

最後に、selectItem を使用して、返されたすべての行に対して同じ値が含まれる列を生成できます。選択した列の各行に同じテキストなどのデータを挿入することもできます。これらの選択はテーブル・データを操作するものではありません。"非テーブル・データの選択" を参照してください。

テーブル列の選択

一般に、selectItem は、FROM 節で指定された table 内の列を参照します。複数の列を指定するには、コンマ区切りのリストを使用します。以下に例を示します。

SELECT Name,Age FROM Sample.Person

列名では、大文字と小文字は区別されません。ただし、結果セットの列に関連付けられているラベルでは、selectItem に指定された大文字/小文字は使用されません。代わりに、テーブル定義で指定された、対応する SqlFieldName ObjectScript プロパティの大文字/小文字が使用されます。大文字/小文字の解決の詳細は、"結果セットの列の大文字/小文字の変更" の例を参照してください。

指定したテーブルに定義されている列名をすべてリストするには、"列の名前と番号" を参照してください。

RowID (レコード ID) を表示するには、%ID 疑似フィールド変数エイリアスを使用できます。これは割り当てられている名前に関係なく、RowID を表示します。既定では、RowID の名前は ID ですが、テーブルに既に ID という名前の列が含まれている場合、名前が変更されることがあります。既定では、RowID は非表示の列です。

ストリーム列に対して SELECT クエリを実行すると、開いているストリーム・オブジェクトの OREF (オブジェクト参照) が返されます。以下に例を示します。

SELECT Name,Picture FROM Sample.Employee WHERE Picture IS NOT NULL

FROM 節に複数のテーブルまたはビューを指定する場合、テーブル名や列名をピリオドで区切って、selectItem の一部としてテーブル名を含める必要があります。以下に例を示します。

SELECT Sample.Person.Name,Sample.Employee.Company
      FROM Sample.Person, Sample.Employee

テーブル・エイリアスを指定した場合は、代わりにそのエイリアスを selectItem で指定します。以下に例を示します。

SELECT p.Name, e.Company
      FROM Sample.Person AS p, Sample.Employee AS e

テーブル名に既にエイリアスが割り当てられている場合、selectItem の一部として完全なテーブル名を指定すると、SQLCODE -23 エラーが発生します。

サブクエリによる選択

selectItem をサブクエリとして指定すると、指定したテーブルから 1 つの列が返されます。この列には、1 つのテーブル列の値、または 1 つの列として返された複数のテーブル列の値を含めることができます。連結 (SELECT Home_City||Home_State) を使用するか、コンテナ列 (SELECT Home) を指定することによって、1 つの列で複数の列を返すことができます。サブクエリでは、暗黙結合 (矢印構文) を使用できます。サブクエリでは、サブクエリ内で引用されたテーブルに 1 つのデータ列しかない場合でも、アスタリスク構文は使用できません。

サブクエリを使用して、GROUP BY 節の影響を受けない集約関数を指定できます。以下の例では、GROUP BY 節によって、年齢を 10 年ごとにグループ化します (例えば、25 歳から 34 歳)。AVG(Age) selectItem は、GROUP BY 節で定義される各グループの平均年齢となります。全グループ内のすべてのレコードの平均年齢を取得するために、サブクエリを使用します。

SELECT Age AS Decade,
       COUNT(Age) AS PeopleInDecade,
       AVG(Age) AS AvgAgeForDecade,
       (SELECT AVG(Age) FROM Sample.Person) AS AvgAgeAllDecades
FROM Sample.Person
GROUP BY ROUND(Age,-1)
ORDER BY Age

暗黙結合による選択 (矢印構文)

FROM 節のテーブル以外のテーブルから列にアクセスするには、矢印構文 (->) を使用して、selectItem暗黙結合として指定します。以下の例では、Sample.Employee テーブルに Company 列が含まれていて、この列に、Sample.Company テーブル内の対応する会社名の RowID が含まれています。矢印構文では、そのテーブルから会社名を取得します。

SELECT Name,Company->Name AS CompanyName
      FROM Sample.Employee

この場合、参照されるテーブルに対する SELECT 特権 (参照される列と、参照されるテーブルの RowID 列の両方に対する、テーブルレベルの SELECT 特権または列レベルの SELECT 特権) が必要です。矢印構文の詳細は、"暗黙結合 (矢印構文)" を参照してください。

すべての列の選択 (アスタリスク構文)

テーブル内のすべての列を選択するには、アスタリスク (*) 構文を使用します。以下に例を示します。

SELECT TOP 5 * FROM Sample.Person

項目は、列番号順に返されます。アスタリスク構文による選択には、シリアル・オブジェクト内に入れ子になったシリアル・オブジェクトのプロパティなど、埋め込みシリアル・オブジェクトのプロパティが含まれます。シリアル・オブジェクトを参照する列は選択されません。例えば、埋め込みシリアル・オブジェクトの Home_City プロパティは選択されますが、(City プロパティを含む) Sample.Address 埋め込みシリアル・クラスにアクセスするために使用される Home 参照列は選択されません。

アスタリスク構文では、非表示の列は選択されません。既定では、RowID は非表示です (SELECT * では表示されません)。ただし、%PUBLICROWID を指定してテーブルが定義されている場合は、SELECT * は RowID 列および非表示ではないすべての列を返します。既定では、この列の名前は ID ですが、ID という名前のユーザ定義列が既に存在する場合、名前が変更されることがあります。

アスタリスクと複数の table が指定されているクエリは、結合されたすべてのテーブルのすべての列を選択します。例えば、以下のクエリは、Sample.CompanySample.Employee の両方の上位 5 行の列をすべて選択します。

SELECT TOP 5 * FROM Sample.Company,Sample.Employee

アスタリスク構文は、修飾、未修飾のどちらでもかまいません。selectItem が、テーブル名 (またはテーブル名エイリアス) およびピリオド (.) を接頭語としてアスタリスクの前に付けて使用することによって修飾される場合、selectItem は、指定されたテーブル内のすべての列を選択します。修飾されたアスタリスク構文を、他のテーブルを対象とした他の選択項目と組み合わせることができます。以下の例では、selectItem は、テーブルからすべての列を選択する未修飾のアスタリスク構文で構成されます。重複する列名 (この例では Name) および列でない selectItem 要素 (この例では {fn NOW}) も指定できます。

SELECT TOP 5 {fn NOW} AS QueryDate,
             Name AS Client,
             *
FROM Sample.Person

以下の例では、selectItem は、1 つのテーブルからすべての列を選択する修飾されたアスタリスク構文と、別のテーブルの列名のリストで構成されます。

SELECT TOP 5 E.Name AS EmpName, 
             C.*, 
             E.Home_State AS EmpState
FROM Sample.Employee AS E, Sample.Company AS C
Note:

SELECT * は、アプリケーションの開発およびデバッグ中に非常に便利な InterSystems SQL を完全にサポートしている部分です。ただし、プロダクション・アプリケーションでは、選択された列を明示的にリストするプログラミング方法をお勧めします。列を明示的にリストすることで、アプリケーションを明確かつ簡単に理解でき、維持管理が容易になるほか、列を名前で簡単に検索できるようになります。

埋め込みシリアル・オブジェクトの選択 (アンダースコア構文)

埋め込みシリアル・オブジェクト・プロパティ (埋め込みシリアル・クラス・データ) を選択するには、アンダースコア構文を使用して selectItem を指定します。アンダースコア構文は、オブジェクト・プロパティの名前、アンダースコア、および埋め込みオブジェクト内のプロパティで構成されます。例えば、Home_CityHome_State です (例えばインデックス・テーブルなど他のコンテキストでは、これらはドット構文 Home.City を使用して記述されます)。

以下の例を考えてみます。

SELECT Home_City,Home_Phone_AreaCode FROM Sample.Person

Home_City という列名の場合、Sample.Person テーブルに参照列 Home が含まれます。この列は、プロパティ City を定義する埋め込みシリアル・オブジェクトを参照します。Home_Phone_AreaCode, という列名の場合、プロパティ AreaCode を定義する入れ子になった埋め込みシリアル・オブジェクトを参照する埋め込みシリアル・オブジェクト・プロパティ Phone を参照する参照列 Home がテーブルに含まれています。HomeHome_Phone のような参照列を選択した場合、シリアル・オブジェクト内のプロパティすべての値を %List データ型形式で受け取ります。

アンダースコア構文を使用するのではなく、SELECT を使用して、参照列 (Home など) を直接クエリできます。返されるデータはリスト形式のため、$LISTTOSTRING 関数または $LISTGET 関数を使用してデータを表示できます。以下に例を示します。

SELECT $LISTTOSTRING(Home,'^') AS HomeAddress FROM Sample.Person

集約関数による選択

selectItem には、1 つまたは複数の SQL 集約関数を含めることができます。集約関数は、常に単独の値を返します。以下の表は、指定可能な集約関数のタイプを示しています。

集約関数のタイプ

単独の列名。クエリによって選択された行の NULL でないすべての値に対して、集約を計算します。

SELECT AVG(Age) FROM Sample.Person

集約を計算するスカラ式。

SELECT SUM(Age) / COUNT(*) FROM Sample.Person

アスタリスク構文 (*)。テーブルの行数を計算するために、COUNT 関数と共に使用されます。

SELECT COUNT(*) FROM Sample.Person

SELECT ... DISTINCT 関数。余剰値を消去することで、集約を計算します。

SELECT COUNT(DISTINCT Home_State) FROM Sample.Person

1 つの SELECT 文における列名と集約関数の組み合わせ (InterSystems SQL では使用できますが、ANSI SQL では使用できません)。

SELECT Name, COUNT(DISTINCT Home_State) FROM Sample.Person

%FOREACH を使用する集約関数。単独または複数の列の個別値ごとに集約を計算します。

SELECT DISTINCT Home_State, AVG(Age %FOREACH(Home_State)) FROM Sample.Person

%AFTERHAVING を使用する集約関数。これによって、HAVING 節で指定されるサブ母集団に対して集約が計算されます。

この例では、クエリは、Age がデータベース内の全員の平均年齢を上回っているレコードを返します。

SELECT Name,AVG(Age %AFTERHAVING) FROM Sample.Person HAVING (Age > AVG(Age))

ウィンドウ関数による選択

selectItemウィンドウ関数として指定すると、行ごとに集約、ランキングなどの関数を、その行に固有の "ウィンドウ・フレーム" に基づいて計算できます。以下の構文がサポートされます。

windowFunction() OVER (
     PARTITION BY partColumn
     ORDER BY orderColumn)
  • windowFunction : 以下のウィンドウ関数がサポートされます。AVG()ROW_NUMBER()RANK()PERCENT_RANK()FIRST_VALUE(column)LAST_VALUE(column)NTH_VALUE(column, n)LAG(column, offset)LEAD(column, offset)MAX(column)MIN(column)、および SUM(column)

  • OVEROVER キーワードとそれに続く括弧は必須です。この括弧内の節はオプションです。

  • PARTITION BY partColumn : 指定した partColumn により行を分割するオプションの節。partColumn 引数には、単一の列、またはコンマ区切りの列のリストを指定できます。指定する場合、ORDER BY の前に PARTITION BY を指定する必要があります。

  • ORDER BY orderColumn : 指定した orderColumn で行を並べ替えるオプションの節。orderColumn には、単一の列、またはコンマ区切りの列のリストを指定できます。

ウィンドウ関数で指定した列は、テーブル・エイリアス接頭語を取ることができます。

ウィンドウ関数には列エイリアスを指定できます。既定では、列に Window_n というラベルが付けられます。

詳細は、"ウィンドウ関数の概要" を参照してください。

関数およびメソッド呼び出しによる選択

selectItem では、関数やメソッドによる演算を使用することで、選択した列の値に追加の処理を適用できます。以下の演算タイプを指定できます。

  • 算術演算。例えば、以下の選択では、Age 列から平均年齢を減算して新しい列を生成します。

    SELECT Name, Age,Age-AVG(Age) FROM Sample.Person

    selectItem 算術演算に除算が含まれており、除数が 0 または NULL になる列値がある場合、ゼロでの除算を避けるためにテストの順序に頼ることはできません。その代わり、CASE 文を使用してリスクを抑制します。

  • SQL 関数。例えば、以下のクエリでは、Name 列の各値の長さを示す列が生成されます。

    SELECT Name,$LENGTH(Name) FROM Sample.Person

    以下のクエリは、Name 列の大文字/小文字を大文字に変換して新しい列で返します。

    SELECT Name,UCASE(Name) FROM Sample.Person
  • XMLELEMENTXMLFOREST、または XMLCONCAT 関数。これらは、指定された列名から取得したデータ値を XML タグまたは HTML タグで囲みます。詳細は、"XMLELEMENT" を参照してください。

  • 照合関数selectItem 列のソートや表示を指定できます。照合関数は括弧なし (SELECT %SQLUPPER Name) でも括弧付き (SELECT %SQLUPPER(Name)) でも指定できます。照合関数で切り捨てを指定する場合には括弧が必要です (SELECT %SQLUPPER(Name,10))。

  • プロシージャとして格納されているユーザ定義のクラス・メソッド。クラス・メソッドは、未修飾メソッド名 (RandLetter() など) または修飾メソッド名 (Sample.RandLetter() など) のいずれかにすることができます。以下のクラスでは、Cube() クラス・メソッドが入力整数のキューブを返します。

    Class Sample.Person Extends %Persistent [DdlAllowed]
    {
    /// Find the Cube of a number
    ClassMethod Cube(val As %Integer) As %Integer [SqlProc]
      {
        RETURN val * val * val
      }
    }

    以下のクエリは、Age 列に対して Cube クラス・メソッドを呼び出し、3 乗した年齢を返します。

    SELECT Age, Person_Cube(Age) FROM Sample.Person

    InterSystems IRIS は、メソッドの返り値を論理形式から表示/ODBC 形式に変換します。既定では、メソッドへの入力は表示/ODBC 形式から論理形式に変換されません。ただし、$SYSTEM.SQL.Util.SetOption("SQLFunctionArgConversion")Opens in a new tab メソッドを使用して、システム全体で表示形式から論理形式への入力の変換を構成できます。このオプションの現在の構成を確認するには、$SYSTEM.SQL.Util.GetOption("SQLFunctionArgConversion")Opens in a new tab を使用します。

    指定されたメソッドが現在のネームスペース内に存在していない場合、SQLCODE -359 エラーが生成されます。指定したメソッドがあいまいな (複数のメソッドを参照する可能性がある) 場合、SQLCODE -358 エラーが生成されます。クラス・メソッドの作成の詳細は、"CREATE METHOD" を参照してください。

  • データベースの列を操作するユーザ指定の ObjectScript 関数呼び出し (外部関数)。以下に例を示します。

    SELECT $$REFORMAT(Name)FROM MyTable

    SQL 文でそのような関数を呼び出すには、[SQL文で外部関数の使用を許可] オプションをシステム全体で構成する必要があります。詳細は、"関数 : 内部および外部" を参照してください。既定では、外部関数は無効になっており、ユーザ指定の関数を呼び出そうとすると、SQLCODE -372 エラーが生成されます。

    ユーザ指定の関数を使用して % ルーチンを呼び出そうとすると、SQLCODE -373 エラーが生成されます。

非テーブル・データの選択

selectItem 引数は、FROM 節内にあるテーブルを参照することなく、すべてのレコードに対して同じ値を返すことができます。テーブル・データを参照する selectItem 要素がない場合、FROM 節はオプションです。FROM 節を含める場合には、指定したテーブルが存在している必要があります。詳細は、FROM 節のリファレンス・ページを参照してください。

この形式の選択の一般的な使用法は以下のとおりです。

  • 算術演算。

    SELECT Name, Age, 9 - 6 FROM Sample.Person
  • 文字列リテラル、または文字列リテラルを操作する関数。

    SELECT UCASE('fred') FROM Sample.Person
  • 結果を読みやすくするために追加する文字列リテラル。

    SELECT TOP 10 Name,'was born on',%EXTERNAL(DOB)
    FROM Sample.Person

    数値リテラルの指定方法によってデータ型が決まります。例えば、文字列 '123' のデータ型は VARCHAR になり、数値 123 のデータ型は INTEGER または NUMERIC になります。

  • %TABLENAME または %CLASSNAME 疑似フィールド変数キーワード。%TABLENAME は、現在のテーブル名を返します。%CLASSNAME は、現在のテーブルに対応するクラスの名前を返します。クエリが複数のテーブルを参照する場合には、キーワードの接頭語としてテーブルのエイリアスを指定できます。例えば、SUB_ACCESSIBLE_FILE のように指定します。

  • 以下のいずれかの ObjectScript 特殊変数 (またはそれらの省略形) : $HOROLOG$JOB$NAMESPACE$TLEVEL$USERNAME$ZHOROLOG$ZJOB$ZNSPACE$ZPI$ZTIMESTAMP$ZTIMEZONE$ZVERSION

table

データの取得元の 1 つ以上のテーブルビュー、テーブル値関数、またはサブクエリ。これらの table タイプの任意の組み合わせを、コンマ区切りのリストとして、または JOIN 構文を使用して指定できます。

  • 単一の table 名を指定する場合、指定されたデータはそのテーブルまたはビューから取得されます。

  • 複数の table 名を指定する場合、InterSystems SQL はテーブルに対して結合操作を実行し、そのデータを指定されたデータの取得元の結果テーブルにマージします。

FROM 節には有効なテーブル参照が必要です。これは、SELECT でそのテーブルが参照されていない場合でも当てはまります。

table は、修飾 (schema.tablename) でも未修飾 (tablename) でもかまいません。未修飾の table には、既定のスキーマ名またはスキーマ検索パスのスキーマ名が指定されます。

オプションで、エイリアス tableAlias をそれぞれの table に割り当てることができます。

オプションで、クエリ実行を最適化するために、1 つ以上の optimize-option キーワードを指定できます。使用可能なオプションは以下のとおりです。%ALLINDEX%FIRSTTABLE%FULL%INORDER%IGNOREINDEX%NOFLATTEN%NOMERGE%NOREDUCE%NOSVSO%NOTOPOPT%NOUNIONOROPT%PARALLEL、および %STARTTABLE。これらのオプションの詳細は、FROM 節のリファレンス・ページを参照してください。

condition

取得するデータの行を指定するために WHERE 節および HAVING 節で使用する論理テスト (述語)。SELECT 文では、WHERE condition および HAVING condition は、condition が真に評価される行を返します。

論理述語条件を組み合わせるには、AND および OR の論理演算子を使用します。条件を反転させるには、NOT 単項論理演算子を使用します。

以下の表は、述語条件の例を示しています。

述語 説明

等値比較

=、<、> などの比較演算子を使用して行を返します。 SELECT Name,Age FROM Sample.Person WHERE Age < 21

BETWEEN

特定の値の範囲にある行を返します。 SELECT Name,Age FROM Sample.Person WHERE Age BETWEEN 18 AND 21

IN および %INLIST

リストの項目に一致する行を返します。 SELECT Name, Home_State FROM Sample.Person WHERE Home_State IN ('ME','NH,'VT')

部分文字列比較

部分文字列に一致する行を返します。 SELECT Name FROM Sample.Person WHERE Name %STARTSWITH 'S'

NULL

未定義の値の検出に基づいて行を返します。 SELECT Name,Age FROM Sample.Person WHERE Age IS NOT NULL

EXISTS

テーブル内の 1 つ以上の行の存在に基づいて行を返します。多くの場合、サブクエリと共に使用されます。 SELECT Name FROM Sample.Person WHERE EXISTS (SELECT * FROM Employee WHERE Employee.Number = Person.Number)

FOR SOME

特定の列値の条件テストに基づいて行を返します。多くの場合、あるテーブル内の特定の値が別のテーブルにもあるかどうかをテストする場合に使用されます。 SELECT Name,COUNT(Name) FROM Sample.Person WHERE FOR SOME (Sample.Employee)(Sample.Employee.Name=Sample.Person.Name)

FOR SOME %ELEMENT

特定のリスト要素の値に一致する行を返します。 SELECT Name,FavoriteColors FROM Sample.Person WHERE FOR SOME %ELEMENT(FavoriteColors) (%VALUE='Red')

LIKE%MATCHES、および %PATTERN

特定のパターンに当てはまる行を照合します。 SELECT Name FROM Sample.Person WHERE Name LIKE '%Mac%'

これらの論理述語の詳細は、WHERE 節のリファレンス・ページを参照してください。

condition に集約関数を含めることはできません。集約関数によって返される値を使用して選択条件を指定するには、HAVING 節を使用します。

WHERE 節では、condition は、= (内部結合) シンボル結合演算子を使用して、2 つのテーブルの間の明示的な結合を指定できます。詳細は、JOIN 節のリファレンス・ページを参照してください。

WHERE 節は、矢印構文 (–>) 演算子を使用して、ベース・テーブルと別のテーブルの列との間の明示的な結合を指定できます。詳細は、"暗黙結合" を参照してください。

column

取得したデータの編成方法を指定する列のコンマ区切りリスト。有効な column 値は、以下のとおりです。

  • 列名 (GROUP BY City)

  • %ID (すべての行を返します)

  • 列名を指定するスカラ関数 (GROUP BY ROUND(Age,-1))

  • 列名を指定する照合関数 (GROUP BY %EXACT(City))

詳細は、GROUP BY 節のリファレンス・ページを参照してください。

itemOrder

selectItem、または行が表示される順序を指定する項目のコンマ区切りリスト。各項目に、オプションで ASC (昇順) または DESC (降順) のキーワードを指定できます。既定は昇順です。ORDER BY 節は、クエリの結果を操作します。ORDER BY 節をサブクエリで使用する場合 (UNION 文で使用する場合など) は、TOP 節と組み合わせる必要があります。ORDER BY 節が指定されていない場合、返されるレコードの順序は予測できません。ORDER BY 節にウィンドウ関数を含めることができます。詳細は、ORDER BY 節のリファレンス・ページを参照してください。

columnAlias

SELECT クエリでは、selectItem 内の各列にエイリアスを指定できます。列のエイリアスは、結果セット内の列見出しとして表示されます。列のエイリアスを指定しない場合、選択項目の名前が結果セットの列名として使用されます。AS キーワードは、selectItemcolumnAlias から分離します。このキーワードはオプションですが、読みやすくするために推奨されています。したがって、以下の構文は同等で有効です。

SELECT Name AS PersonName, DOB AS BirthDate FROM Sample.Person
SELECT Name PersonName, DOB BirthDate FROM Sample.Person

InterSystems SQL では、列エイリアスは指定された大文字/小文字で表示されますが、エイリアスを ORDER BY 節内で参照する場合、大文字/小文字は区別されません。columnAlias 名は、区切り識別子を含め、有効な識別子である必要があります。区切り識別子を使用すると、列エイリアスに空白やその他の句読点文字を含めたり、列エイリアスを SQL 予約名にしたりできます (例えば、SELECT Name AS "Customer Name"SELECT Home_State AS "From")。

SQL は、列エイリアスのための一意性チェックは実行しません。列と列エイリアスの名前を同じにすることや、2 つの列エイリアスを同じにすることができます (ただし、推奨されていません)。このように、列エイリアスが一意でないと、ORDER BY 節によって参照されたときに SQLCODE -24 "ソートカラムがあいまいです" エラーが発生する場合があります。列エイリアスは、すべての SQL 識別子と同様に、大文字と小文字を区別しません。

他の SELECT 節での列エイリアスの使用は、クエリのセマンティック処理順序によって制御されます。列を参照するには、ORDER BY 節でその列エイリアスを使用します。

以下の場所で列エイリアスを参照することはできません。

  • 選択リスト内の別の selectItem

  • DISTINCT BY

  • WHERE

  • GROUP BY

  • HAVING

  • JOIN 操作の ON 節または USING

ただし、"データベースの問い合わせ" で説明されているように、サブクエリを使用すると、こういった他の SELECT 節で列エイリアスを使用できるようになります。

列エイリアスの設定以外に、集約関数、式、または他の計算列にもエイリアスを設定できます。計算列には、自動的に列名が割り当てられます。エイリアスを指定しない場合、InterSystems SQL では、Expression_1Aggregate_3 などの一意の列名が指定されます。整数の接尾語は、SELECT 文で指定されている selectItem の位置 (つまり、selectItem 列番号) を参照します。これらの値は、そのタイプの列の数ではありません

以下に、自動的に割り当てられる列名を示します (n は整数です)。これらの名前は、包括性が低いものから高い順にリストされています。例えば、プラスまたはマイナス記号を数値に加えると、数値は HostVar から Expression に昇格します。HostVarLiteral を連結すると、値は Expression に昇格します。サブクエリで LiteralHostVarAggregate、または Expression を指定すると、値は SubQuery に昇格します。

  • Literal_n : %TABLENAME や NULL 指定子のような疑似フィールド変数。%ID は Literal_n ではないことに注意してください。これには実際の RowID 列の列名が付けられます。

  • HostVar_n : ホスト変数。これは、リテラル ('text'、123、空の文字列 ('') など)、入力変数 (:myvar)、またはリテラルで置き換えられる ? 入力パラメータになります。数字への記号の追加、文字列の連結、算術演算など、リテラルに対する式評価によって Expression_n になります。? パラメータに指定されたリテラル値は、式評価なしで、変更されないまま返されます。例えば、5+7 を指定すると、文字列 '5+7'HostVar_n として返されます。

  • Aggregate_n集約関数。例えば、AVG(Age)COUNT(*) です。1 番外側の操作が集約関数の場合は、その集約に式が含まれている場合であっても、列の名前は Aggregate_n になります。例えば、COUNT(Name)+COUNT(Spouse)Expression_n ですが、MAX(COUNT(Name)+COUNT(Spouse))Aggregate_n-AVG(Age)Expression_n ですが、AVG(-Age)Aggregate_n です。以下の例では、AVG 関数によって作成された集約列に、列エイリアス AvgAge が付けられます。既定の名前は Aggregate_3 です (SELECT リストで位置 3 にある集約列)。

    SELECT Name, Age, AVG(Age) AS AvgAge FROM Sample.Person
  • Expression_n : リテラルまたは列に対する selectItem リストまたは Aggregate_nHostVar_nLiteral_n、または Subquery_n selectItem で何らかの操作を行うと、列名が Expression_n に変更されます。これには、数値に対する単項演算 (-Age)、算術演算 (Age+5)、連結 ('USA:'||Home_State)、データ型 CAST 操作、SQL 照合関数 (%SQLUPPER(Name) または %SQLUPPER Name)、SQL スカラ関数 ($LENGTH(Name))、ユーザ定義のクラス・メソッド、CASE 式、および特殊変数 (CURRENT_DATE$ZPI など) が含まれます。

  • Window_nウィンドウ関数の結果。OVER キーワードの閉じ括弧の後に列エイリアスを指定します。

  • Subquery_n : 1 つの selectItem を指定するサブクエリの結果。selectItem は、列、集約関数、式、またはリテラルにできます。サブクエリ内ではなく、サブクエリの後に列エイリアスを指定します。以下に例を示します。

    SELECT Name AS PersonName,
           (SELECT Name FROM Sample.Employee) AS EmpName,
           Age AS YearsOld
    FROM Sample.Person

tableAlias

SELECT 文では、テーブル名またはビュー名 (table) に、有効な識別子としてオプションのエイリアスを指定できます。これには区切り識別子も含まれます。AS キーワードは、tabletableAlias から分離します。このキーワードはオプションですが、読みやすくするために推奨されています。したがって、以下の構文は同等で有効です。

SELECT P.Name FROM Sample.Person AS P
SELECT P.Name FROM Sample.Person P

tableAlias は、クエリ内のテーブル・エイリアス間で一意である必要があります。すべての識別子などの tableAlias では、大文字/小文字は区別されません。大文字/小文字だけが異なる 2 つの tableAlias 名を指定すると、SQLCODE -20 "名前の重複" エラーが発生します。

テーブル・エイリアスは、列が属するテーブルを示すために、列名の接頭語 (ピリオド付き) として使用されます。以下に例を示します。

SELECT P.Name, E.Name
FROM Sample.Person AS P, Sample.Employee AS E

クエリで同じ列名が存在する複数のテーブルを指定する場合は、テーブル参照の接頭語を使用する必要があります。テーブル参照の接頭語としては、tableAlias (1 つ前の例を参照) を使用することや、以下の同義の例で示すように完全修飾テーブル名を使用することができます。

SELECT Sample.Person.Name, Sample.Employee.Name
FROM Sample.Person, Sample.Employee

テーブル名に tableAlias を割り当ててから、selectItem の一部として完全なテーブル名を指定すると、SQLCODE -23 エラーが発生します。テーブル・エイリアスは、クエリのシナリオによって必須の場合とオプションの場合があります。

シナリオ テーブル・エイリアス

クエリが 1 つのテーブルのみを参照する。

オプション

クエリが複数のテーブルを参照し、参照される列名が各テーブルに固有である。

オプション (ただし、指定することを推奨)

クエリが複数のテーブルを参照し、参照される列名はテーブルが異なっていても同じである。

必須

t-alias (または完全修飾テーブル名) 接頭語の指定に失敗すると、SQLCODE -27 “該当テーブル内でフィールド '%1' があいまいです” エラーが発生します。

サブクエリを指定する際に、オプションで tableAlias を使用することもできます。以下に例を示します。

SELECT Name,(SELECT Name FROM Sample.Vendor)
FROM Sample.Person

tableAlias は、クエリ実行のためだけに列を一意に識別します。クエリ結果セットの表示のために列を一意に識別するには、列エイリアス (columnAlias) を使用する必要もあります。以下のクエリでは、テーブル・エイリアス (Per および Emp) と列エイリアス (PName および Ename) を組み合わせて使用しています。

SELECT Per.Name AS PName, Emp.Name AS EName
FROM Sample.Person AS Per, Sample.Employee AS Emp
WHERE Per.Name %STARTSWITH 'G'

名前が競合することなく、列、列エイリアス、およびテーブル・エイリアスのいずれかまたはすべてに同じ名前を使用できます。

tableAlias 接頭語は、参照先のテーブルを区別するために使用します。以下に例を示します。

SELECT P.%ID As PersonID,
       AVG(P.Age) AS AvgAge,
       Z.%TABLENAME||'=' AS Tablename,
       Z.*
FROM Sample.Person AS P, Sample.USZipCode AS Z
WHERE P.Home_City = Z.City
GROUP BY P.Home_City
ORDER BY Z.City 

distinctItem

結果セットで除外したい重複行が含まれる selectItem 列のコンマ区切りリスト。distinctItem 引数は、任意の有効な selectItem 値を受け入れます。すべての項目を選択するアスタリスク (*) キーワードは受け入れません。列名のエイリアスも受け入れません。

どちらのタイプの DISTINCT 節でも、一意性をテストする項目を複数指定できます。複数の項目をリストすると、すべての項目の組み合わせに個別な行がすべて取得されます。DISTINCT では、NULL を一意の値とは見なしません。詳細は、DISTINCT 節のリファレンス・ページを参照してください。

numRows

TOP 節 (例えば、TOP numRows) と組み合わせて使用した場合、返される行数。クエリに ORDER BY 節が含まれていない場合、返される "上位" 行は予測できません。クエリに ORDER BY 節が含まれている場合、上位行は指定された順序に基づきます。クエリで TOP の前に DISTINCT キーワードが含まれている場合、クエリは numRows で指定した数だけ一意の値を返します。numRows は、正の整数、または疑問符 (?) を使用したダイナミック SQL 入力パラメータ (正の整数に解決される) として指定します。TOP キーワードが指定されていない場合、既定で SELECT 条件を満たすすべての行が表示されます。

var

selectItem の値を配置する 1 つまたは複数のホスト変数。複数のホスト変数は、コンマ区切りリストまたは単一のホスト変数配列として指定します。詳細は、INTO 節のリファレンス・ページを参照してください。

ODBC、JDBC、またはダイナミック SQL を介して処理される SELECT クエリで INTO 節を指定すると、SQLCODE -422 エラーが発生します。

%keyword

空白で区切られた、1 つまたは複数の %keyword 引数。これらのキーワードは、以下のように処理に影響を与えます。

  • %NOFPLAN — この操作の凍結されたプラン (ある場合) を無視して、新しいクエリ・プランを生成します。凍結プランは保持されますが、使用されません。詳細は、"凍結プラン" を参照してください。

  • %NOLOCK — InterSystems IRIS はテーブルのいずれに対してもロックを実行しません。このキーワードを指定すると、クエリは現在のトランザクションの分離モードに関係なく READ UNCOMMITTED モードでデータを取得します。詳細は、"トランザクション処理" を参照してください。

  • %NORUNTIME — 実行時プラン選択 (RTPC) による最適化を使用しません。

  • %PROFILE または %PROFILE_ALL — SQLStats 収集コードを生成します。これは、PTools を ON にして生成されるものと同じコードです。違いは、SQLStats 収集コードはこの特定の文に対してのみ生成されるという点です。コンパイルされるルーチンまたはクラス内のその他すべての SQL 文は、PTools が OFF であるかのようにコードを生成します。これにより、調査対象ではない SQL 文の無関係な統計を収集することなく、アプリケーション内で問題のある特定の SQL 文をプロファイリングおよび調査できます。詳細は、"SQL 実行時統計" を参照してください。

    %PROFILE はメイン・クエリ・モジュールの SQLStats を収集します。%PROFILE_ALL はメイン・クエリ・モジュールとそのすべてのサブクエリ・モジュールの SQLStats を収集します。

述語条件を使用したデータのサブセットの選択

述語条件のさまざまな組み合わせを使用して、テーブルからデータのサブセットを選択します。以下の例で示している節は、正しい順序で指定する必要があります。4 つの例すべてで、Sample.Person テーブルから 3 つの列 (NameHome_State、および Age) を選択して、他の 2 つの列 (AvgAge および AvgMiddleAge) を計算します。

HAVING および ORDER BY

以下のクエリは、Sample.Person 内のすべてのレコードに対して AvgAge 列を計算します。HAVING 節は、Sample.Person 内のすべてのレコードから 40 歳以上の人の平均年齢を計算して、AvgMiddleAge 計算列を設定します。したがって、各行の AvgAge および AvgMiddleAge の値が同じになります。ORDER BY 節は、Home_State 列の値によって、行の表示をアルファベット順に並べます。

SELECT Name,Home_State,Age,AVG(Age) AS AvgAge,
 AVG(Age %AFTERHAVING) AS AvgMiddleAge
 FROM Sample.Person
 HAVING Age > 40
 ORDER BY Home_State

WHERE、HAVING、および ORDER BY

以下のクエリでは、WHERE 節は、指定された北東の 7 つの州に選択を限定します。このクエリは、これらの州のレコードに対して AvgAge 列を計算します。HAVING 節は、指定された Home_State 列内のレコードで 40 歳以上の人の平均年齢を計算して、AvgMiddleAge 計算列を設定します。したがって、各行の AvgAge および AvgMiddleAge の値が同じになります。ORDER BY 節は、Home_State 列の値によって、行の表示をアルファベット順に並べます。

SELECT Name,Home_State,Age,AVG(Age) AS AvgAge,
 AVG(Age %AFTERHAVING) AS AvgMiddleAge
 FROM Sample.Person
 WHERE Home_State IN ('ME','NH','VT','MA','RI','CT','NY')
 HAVING Age > 40
 ORDER BY Home_State

GROUP BY、HAVING、および ORDER BY

以下の例では、GROUP BY 節により、クエリは Home_State グループごとに AvgAge 列を計算します。また、GROUP BY 節は、各 Home_State で最初に見つかったレコードに、出力表示を制限します。HAVING 節は、各 Home_State グループで 40 歳以上の人の平均年齢を計算して、AvgMiddleAge 計算列を設定します。ORDER BY 節は、Home_State 列の値によって、行の表示をアルファベット順に並べます。

SELECT Name,Home_State,Age,AVG(Age) AS AvgAge,
 AVG(Age %AFTERHAVING) AS AvgMiddleAge
 FROM Sample.Person
 GROUP BY Home_State
 HAVING Age > 40
 ORDER BY Home_State

WHERE、GROUP BY、HAVING、および ORDER BY

以下のクエリでは、WHERE 節は、指定された北東の 7 つの州に選択を限定します。GROUP BY 節により、クエリはこれら 7 つの Home_State グループごとに AvgAge 列を個別に計算します。また、GROUP BY 節は、指定した各 Home_State で最初に見つかったレコードに、出力表示を制限します。HAVING 節は、7 つの各 Home_State グループで 40 歳以上の人の平均年齢を計算して、AvgMiddleAge 計算列を設定します。ORDER BY 節は、Home_State 列の値によって、行の表示をアルファベット順に並べます。

SELECT Name,Home_State,Age,AVG(Age) AS AvgAge,
 AVG(Age %AFTERHAVING) AS AvgMiddleAge
 FROM Sample.Person
 WHERE Home_State IN ('ME','NH','VT','MA','RI','CT','NY')
 GROUP BY Home_State
 HAVING Age > 40
 ORDER BY Home_State

埋め込み SQL およびダイナミック SQL を使用した ObjectScript プログラム内からのデータの選択

埋め込み SQL およびダイナミック SQL を使用して、ObjectScript プログラム内から SELECT クエリを発行できます。

以下の埋め込み SQL プログラムは、あるレコードからデータの値を取得して、それを INTO 節で指定される出力ホスト変数に代入します。

   NEW SQLCODE,%ROWCOUNT
   &sql(SELECT Home_State,Name,Age
        INTO :a, :b, :c
        FROM Sample.Person)
   IF SQLCODE=0 {
     WRITE !,"  Name=",b
     WRITE !,"  Age=",c
     WRITE !,"  Home Home_State=",a
     WRITE !,"Row count is: ",%ROWCOUNT }
   ELSE {
     WRITE !,"SELECT failed, SQLCODE=",SQLCODE  }

このプログラムで取得される行は多くても 1 行であるため、%ROWCOUNT 変数は、0 または 1 に設定されます。複数の行を取得するには、カーソルを宣言し、FETCH コマンドを使用する必要があります。詳細は、"埋め込み SQL の使用法" を参照してください。

以下のダイナミック SQL の例では、まず必要なテーブルが存在するかどうかをテストし、そのテーブルに対する現在のユーザの SELECT 特権をチェックします。次にクエリを実行して結果セットを返します。続いて WHILE ループを使用して、結果セットの最初の 10 レコードに対して %Next メソッドを繰り返し呼び出します。これは、SELECT 文で指定されたように列位置を指定する %GetData メソッドを使用して 3 つの列値を表示します。

  SET tname="Sample.Person"
  IF $SYSTEM.SQL.Schema.TableExists(tname)
     & $SYSTEM.SQL.Security.CheckPrivilege($USERNAME,"1,"_tname,"s")
     {GOTO SpecifyQuery}
  ELSE {WRITE "Table unavailable"  QUIT}
SpecifyQuery
  SET myquery = 3
  SET myquery(1) = "SELECT Home_State,Name,SSN,Age"
  SET myquery(2) = "FROM "_tname
  SET myquery(3) = "ORDER BY Name"
  SET tStatement = ##class(%SQL.Statement).%New()
  SET qStatus = tStatement.%Prepare(.myquery)
    IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
  SET rset = tStatement.%Execute()
  IF rset.%SQLCODE=0 {
    SET x=0
    WHILE x < 10 {
     SET x=x+1
     SET status=rset.%Next()
     WRITE rset.%GetData(2)," "   /* Name column */
     WRITE rset.%GetData(1)," "   /* Home_State column */
     WRITE rset.%GetData(4),!     /* Age column */
    }
    WRITE !,"End of Data"
    WRITE !,"SQLCODE=",rset.%SQLCODE," Row Count=",rset.%ROWCOUNT
  }
  ELSE {
    WRITE !,"SELECT failed, SQLCODE=",rset.%SQLCODE }

詳細は、"ダイナミック SQL の使用法" を参照してください。

結果セットの列の大文字/小文字の変更

selectItem に指定する列名では、大文字と小文字は区別されません。ただし、列エイリアスを指定する場合以外は、結果セットの列名は、列プロパティに関連付けられた SqlFieldName の大文字/小文字に従います。SqlFieldName の大文字/小文字は、selectItem リストの指定ではなく、テーブル定義で指定された列名と一致します。そのため、SELECT name FROM Sample.Person では、列ラベルが Name として返されます。列エイリアスを使用すると、表示する大文字/小文字を指定できます。例えば、以下のクエリは、結果セットの Name 列を NAME (すべて大文字) として表示します。

SELECT name AS NAME
FROM Sample.Person

大文字/小文字の解決には時間がかかります。SELECT のパフォーマンスを最大化するには、テーブル定義の指定に従って、列名と同じ大文字/小文字を指定します。ただし多くの場合、テーブル定義で列の大文字/小文字を指定するのは、不便で誤りが発生しやすいという問題があります。その代わりに、列エイリアスを使用して大文字/小文字の問題を回避することができます。列エイリアスへのすべての参照の大文字/小文字を一致させる必要があることに注意してください。

以下のダイナミック SQL の例では、大文字/小文字の解決が必要です (SqlFieldNames は “Latitude” と “Longitude”)。

  set query = "SELECT latitude,longitude FROM Sample.USZipCode"
  set statement = ##class(%SQL.Statement).%New()

  set status = statement.%Prepare(query)
  if $$$ISERR(status) {write "%Prepare failed:" do $SYSTEM.Status.DisplayError(status) quit}

  set rset = statement.%Execute()
  if (rset.%SQLCODE '= 0) {write "%Execute failed:", !, "SQLCODE ", rset.%SQLCODE, ": ", rset.%Message quit}

  while rset.%Next()
  {
    write rset.latitude," ",rset.longitude,!
  }
  if (rset.%SQLCODE < 0) {write "%Next failed:", !, "SQLCODE ", rset.%SQLCODE, ": ", rset.%Message quit}

以下のダイナミック SQL の例は大文字/小文字の解決が不要なため、より高速に実行されます。

  set query = "SELECT latitude AS northsouth,longitude AS eastwest FROM Sample.USZipCode"
  set statement = ##class(%SQL.Statement).%New()

  set status = statement.%Prepare(query)
  if $$$ISERR(status) {write "%Prepare failed:" do $SYSTEM.Status.DisplayError(status) quit}

  set rset = statement.%Execute()
  if (rset.%SQLCODE '= 0) {write "%Execute failed:", !, "SQLCODE ", rset.%SQLCODE, ": ", rset.%Message quit}

  while rset.%Next()
  {
    write rset.northsouth," ",rset.eastwest,!
  }
  if (rset.%SQLCODE < 0) {write "%Next failed:", !, "SQLCODE ", rset.%SQLCODE, ": ", rset.%Message quit}

マルチテーブル・クエリにおける列名の区別

SELECT クエリから返される結果セットには、テーブル・エイリアスの接頭語 tableAlias は含まれません。したがって、このクエリは Name という名前の列を 2 つ返します。

SELECT p.Name,e.Name
FROM Sample.Person AS p LEFT JOIN Sample.Employee AS e ON p.Name=e.Name

このようなクエリで列を区別するには、列エイリアスを指定します。例えば、以下のように変更したクエリでは、これら 2 つの列を PersonName および EmployeeName として返します。

SELECT p.Name AS PersonName,e.Name AS EmployeeName
FROM Sample.Person AS p LEFT JOIN Sample.Employee AS e ON p.Name=e.Name

セキュリティおよび特権

1 つ以上のテーブルで SELECT クエリを実行するには、以下のうち、1 つ以上を持っている必要があります。

  • 指定したすべての selectItem 列に対する列レベルの SELECT 特権

  • 指定した table テーブルまたはビューに対するテーブルレベルの SELECT 特権

  • そのテーブルのスキーマに対する SELECT 特権

テーブルのエイリアス (t.Name"MyAlias".Name など) を使用して指定された selectItem 列には、列レベルの SELECT 特権のみが必要で、テーブルレベルの SELECT 特権は不要です。

SELECT * を使用する場合、列レベルの特権は、GRANT 文内で指定されたすべてのテーブル列に適用されます。テーブルレベルの特権は、特権の割り当て後に追加された列を含め、すべてのテーブル列に適用されます。

必要な特権を持っていないと SQLCODE -99 エラー (特権違反) になります。現在のユーザが SELECT 特権を持っているかどうかを確認するには、%CHECKPRIV コマンドを呼び出します。$SYSTEM.SQL.Security.CheckPrivilege()Opens in a new tab メソッドを呼び出すことにより、指定のユーザがテーブルレベルの SELECT 特権を持っているかどうかを確認できます。特権の割り当ての詳細は、"GRANT" を参照してください。

Note:

テーブルに対してテーブルレベルの SELECT 特権を保有していても、そのテーブルが実際に存在することが十分に証明されるわけではありません。指定されたユーザが %All ロールを保有している場合、指定されたテーブルまたはビューが存在していなくても CheckPrivilege() は 1 を返します。

FROM 節のない SELECT クエリでは、SELECT 特権は一切必要ありません。FROM 節のある SELECT クエリでは、そのクエリによってアクセスされる列データがない場合でも、SELECT 特権が必要です。

詳細

SELECT のステータスと返り値

SELECT 操作を実行すると、InterSystems IRIS により、その操作の成功または失敗を示す SQLCODE ステータス変数が設定されます。また、SELECT 操作を行うと、%ROWCOUNT ローカル変数に選択された行数が設定されます。通常、SELECT 操作が成功すると、SQLCODE=0 が設定され、%ROWCOUNT には選択された行数が設定されます。埋め込み SQL コードに単純な SELECT 文が含まれる場合、選択されるデータは (多くても) 1 行であるため、SQLCODE=0 が設定され、%ROWCOUNT は 0 または 1 に設定されます。埋め込み SQL SELECT 文でカーソルが宣言されていて、データが複数の行からフェッチされる場合、操作はカーソルがデータの最後に達したときに完了します (SQLCODE=100)。その時点で、%ROWCOUNT は、選択された行の合計数に設定されます。詳細は、"FETCH" を参照してください。

SELECT クエリから返される値を結果セットと呼びます。ダイナミック SQL では、SELECT は取得した値を %SQL.StatementOpens in a new tab クラスに格納します。詳細は、"ダイナミック SQL の使用法" および %SQL.StatementOpens in a new tab のクラス・リファレンス・ページを参照してください。

SELECT は、SQL 関数、ホスト変数、またはリテラルから値を返す場合にも使用できます。SELECT クエリは、これらのデータベース以外の値を返すことと、テーブルまたはビューでデータを検索することを組み合わせることができます。データベース以外の値を返すことのみに SELECT クエリを使用する場合、FROM 節はオプションです。詳細は、FROM 節のリファレンス・ページを参照してください。

シャーディング

シャーディングは SQL クエリに対して透過的で、特殊なクエリ構文は必要ありません。FROM 節で指定されているテーブルがシャード化されているか、シャード化されていないかをクエリが認識している必要はありません。同じクエリが、シャード・テーブルとシャード化されていないテーブルにアクセスできます。シャード・テーブルとシャード化されていないテーブルの間の結合をクエリに含めることもできます。

シャード・テーブルは、CREATE TABLE コマンドを使用して定義します。シャード・マスタ・データ・サーバ上のマスタ・ネームスペース内に定義する必要があります。このマスタ・ネームスペースには、シャード化されていないテーブルを格納することもできます。

トランザクション処理

クエリを実行するトランザクションは、READ COMMITTED または READ UNCOMMITTED のいずれかに定義されます。既定は READ UNCOMMITTED です。トランザクション内にないクエリは READ UNCOMMITTED として定義されます。

  • READ UNCOMMITTED モードでは、SELECT 文はデータの現在の状態を返します。それには、コミットされていない進行中のトランザクションによってデータに加えられた変更も含まれます。このような変更は、後でロールバックされる場合もあります。

  • READ COMMITTED モードの場合、SELECT 文の内容によって動作は異なります。通常、READ COMMITTED モードの SELECT 文は、コミットされたデータに対する挿入と更新による変更のみを返します。削除がコミットされておらず、ロールバックされる可能性がある場合でも、進行中のトランザクションによって削除されたデータ行は返されません。

    ただし、SELECT 文に %NOLOCK キーワード、DISTINCT 節、または GROUP BY 節が含まれる場合、SELECT クエリは、コミットされていない現在のトランザクションの間にデータに加えられた変更を含め、現在のデータ状態を返します。SELECT 文内の集約関数でも、指定された列のデータの現在の状態は、コミットされていない変更分を含めて返されます。

詳細は、"SET TRANSACTION" および "START TRANSACTION" を参照してください。

関連項目

FeedbackOpens in a new tab