説明
このステートメントは、1つまたは複数のテーブルからデータをクエリするために使用されます。
このセクションでは、一般的な SELECT 構文について説明します。その他の SELECT 関連の構文については、以下を参照してください:
権限要件
SELECT ステートメントを実行するには、現在のユーザーが SELECT 権限を持っている必要があります。OceanBaseデータベースの権限の詳細については、MySQLモードの権限分類を参照してください。
構文
select_stmt:
SELECT [hint_options]
[{DISTINCT | UNIQUE} | ALL]
[SQL_CALC_FOUND_ROWS]
[STRAIGHT_JOIN]
select_expr_list
[FROM from_list]
[WHERE where_condition]
[GROUP BY group_by_condition_list [WITH ROLLUP]
| GROUP BY [group_by_condition_list] group_by_summary_option (expression_list)]
[HAVING having_condition]
[window_clause]
[ORDER BY order_by_condition_list]
[LIMIT limit_clause]
[lock_option];
select_expr_list:
select_expr [, select_expr ...]
select_expr:
*
| table_name.{* | column_name}
| table_alias_name.{* | column_name}
| expr [[AS] column_alias_name]
from_list:
DUAL
| table_references
| { location_url | table_function }
location_url:
'file_path'
(
{FORMAT = (
TYPE = 'CSV',
LINE_DELIMITER = '<string>' | <expr>,
FIELD_DELIMITER = '<string>' | <expr>,
ESCAPE = '<character>' | <expr>,
FIELD_OPTIONALLY_ENCLOSED_BY = '<character>' | <expr>,
ENCODING = 'charset',
NULL_IF = ('<string>' | <expr>, '<string>' | <expr> ...),
SKIP_HEADER = <int>,
SKIP_BLANK_LINES = { TRUE | FALSE },
PARSE_HEADER = { TRUE | FALSE },
TRIM_SPACE = { TRUE | FALSE },
EMPTY_FIELD_AS_NULL = { TRUE | FALSE }
)
| FORMAT = ( TYPE = 'PARQUET' | 'ORC' )
}
[PATTERN = '<regex_pattern>']
)
table_function:
{
FILES (
LOCATION = {'file_path' | @location_name['/path']},
{
FORMAT = (
TYPE = 'CSV',
LINE_DELIMITER = '<string>' | <expr>,
FIELD_DELIMITER = '<string>' | <expr>,
ESCAPE = '<character>' | <expr>,
FIELD_OPTIONALLY_ENCLOSED_BY = '<character>' | <expr>,
ENCODING = 'charset',
NULL_IF = ('<string>' | <expr>, '<string>' | <expr> ...),
SKIP_HEADER = <int>,
SKIP_BLANK_LINES = { TRUE | FALSE },
PARSE_HEADER = { TRUE | FALSE },
TRIM_SPACE = { TRUE | FALSE },
EMPTY_FIELD_AS_NULL = { TRUE | FALSE }
)
| FORMAT = ( TYPE = 'PARQUET' | 'ORC' )
},
[PATTERN = '<regex_pattern>']
)
| SOURCE (
TYPE = 'ODPS',
ACCESSID = '<string>',
ACCESSKEY = '<string>',
ENDPOINT = '<string>',
TUNNEL_ENDPOINT = '<string>',
PROJECT_NAME = '<string>',
SCHEMA_NAME = '<string>',
TABLE_NAME = '<string>',
QUOTA_NAME = '<string>',
COMPRESSION_CODE = '<string>'
)
}
where_condition:
expression
group_by_condition_list:
group_by_condition [, group_by_condition ...]
group_by_condition:
expression [ASC | DESC]
group_by_summary_option:
GROUPING SETS
| ROLLUP
| CUBE
expression_list:
expression [, expression ...]
having_condition:
expression
order_by_condition_list:
order_by_condition [, order_by_condition ...]
order_by_condition:
expression [ASC | DESC]
| vector_distance_function(vector_column, query_vector) [ASC | DESC] APPROXIMATE
limit_clause:
[offset,] row_count
| row_count OFFSET offset
lock_option:
FOR UPDATE [opt_for_update_wait]
| LOCK IN SHARE MODE
opt_for_update_wait:
WAIT {decimal | intnum}
| NOWAIT
| NO_WAIT
| SKIP LOCKED
パラメータの説明
パラメータ |
説明 |
|---|---|
| select_stmt | データベースから取得するデータを指定するSQLステートメント部分です。 |
| hint_options | オプションです。hintオプションを指定するために使用します。Hintの詳細については、Optimizer Hintを参照してください。 |
| {DISTINCT | UNIQUE} | ALL | オプションです。返される結果セットに重複行を含めるかどうかを制御します。
|
| SQL_CACHE | SQL_NO_CACHE | オプションです。クエリ結果をキャッシュするかどうかを制御します。
|
| SQL_CALC_FOUND_ROWS | オプションです。LIMIT句を持つクエリで、返される全行数を記録し、後で実行されるFOUND_ROWS()関数でその全行数を取得できるようにします。 |
| STRAIGHT_JOIN | オプションです。オプティマイザーがFROM句でリストされた順序でテーブルを結合するよう強制します。チューニングコマンドであり、実行結果には影響しません。
注意OceanBaseデータベースは、MySQLの |
| select_expr_list | クエリ結果に表示する列または式のリストを指定します。列や式の詳細については、後述のselect_exprを参照してください。 |
| column_name | 列名。 |
| FROM from_list | オプションです。クエリのデータソースを指定します。テーブル、ビュー、またはサブクエリが可能です。データソースの詳細については、後述のfrom_listを参照してください。 |
| { table_function | location_url } | オプションです。現在のURL外部テーブルは2つの構文形式をサポートしています。詳細については、後述を参照してください:
|
| WHERE where_condition | オプションです。クエリのフィルター条件を指定します。詳細については、後述のwhere_conditionを参照してください。 |
| GROUP BY group_by_condition_list | オプションです。指定された列に基づいて結果をグループ化します。集約関数と併用するのが一般的です。詳細については、後述のgroup_by_conditionを参照してください。 |
| WITH ROLLUP | オプションです。各グループを集計して、より高度な集約(スーパー集約とも呼ばれる)を表現し、追加の行を生成します。 |
| GROUP BY [group_by_condition_list] group_by_summary_option (expression_list) | オプションです。高度なグループ集計操作に使用します。
|
| HAVING having_condition | オプションです。グループ化後の結果に対して条件フィルタリングを行います。HAVING句はWHERE句と似ていますが、HAVING句では集約関数(SUM、AVGなど)を使用できます。詳細については、後述のhaving_conditionを参照してください。 |
| window_clause | オプションです。分析関数(一部のデータベースではウィンドウ関数とも呼ばれる)のウィンドウ定義を指定するために使用します。window_clauseの詳細な構文情報については、WINDOW句を参照してください。 |
| ORDER BY order_by_condition_list | オプションです。結果セットをソートするために使用します。1つ以上の列を指定してソートできます。詳細については、後述のorder_by_conditionを参照してください。 |
| LIMIT limit_clause | オプションです。返される結果の数(行数)を制限するために使用します。詳細については、後述のlimit_clauseを参照してください。 |
| lock_option | オプションです。クエリ結果にロックをかけるために使用します。詳細については、後述のlock_optionを参照してください。 |
| vector_distance_function | ベクトル距離関数。l2_distance(L2距離)とcosine_distance(コサイン距離)をサポートします。 |
| vector_column | ベクトル列名。VECTOR型の列である必要があります。 |
| query_vector | クエリベクトル。'[value1, value2, ...]'形式で、次元はベクトル列と一致している必要があります。 |
| APPROXIMATE | 必須キーワードです。ベクトルインデックスの近似検索を有効にし、クエリパフォーマンスを向上させるために使用します。 |
| inner_product | 内積関数。2つのベクトル間の積を表します。 |
select_expr
select_expr:クエリ結果に含まれる列または式を表します。複数の式や列名は半角カンマ(,)で区切ります。取り得る値は以下のとおりです:
*:すべての列を選択することを表します。例:
テーブル
tbl1とtbl2を作成します。CREATE TABLE tbl1(col1 INT PRIMARY KEY, col2 VARCHAR(20), col3 INT) PARTITION BY HASH(col1) PARTITIONS 5;CREATE TABLE tbl2(col1 INT PRIMARY KEY, col2 VARCHAR(20), col3 INT);テーブル
tbl1にテストデータを挿入します。INSERT INTO tbl1 VALUES(1, 'A1', 1),(2, 'A2', 2),(3, 'A3', 3);INSERT INTO tbl2 VALUES(1, 'A1', 1),(2, 'A2', 22),(3, 'A3', 33);テーブル
tbl1のデータを確認します。SELECT * FROM tbl1;実行結果は次のとおりです:
+------+------+------+ | col1 | col2 | col3 | +------+------+------+ | 1 | A1 | 1 | | 2 | A2 | 2 | | 3 | A3 | 3 | +------+------+------+ 3 rows in set
table_name.{* | column_name}:指定したテーブルのすべての列または指定した列を選択することを表します。table_name.*:指定したテーブルのすべての列を選択することを表します。table_name.column_name:指定したテーブルの特定の列を選択することを表します。例:
テーブル
tbl1からcol1のデータを読み取ります。SELECT tbl1.col1 FROM tbl1;実行結果は次のとおりです:
+------+ | col1 | +------+ | 1 | | 2 | | 3 | +------+ 3 rows in set
table_alias_name.{* | column_name}: 上記の形式と同様ですが、列を選択する際にテーブルのエイリアスを使用しています。expr [[AS] column_alias_name]:式を選択し、その選択された式に列名としてエイリアスを付けることができます。expr:列名、関数、計算式などを表します。expr AS column_alias_name/expr column_alias_name:この式を選択し、column_alias_nameという名前を付けることを意味します。
例:
チャートテーブル
tbl1から列col1のデータを読み取り、新しい列col1_addを計算します。その値はcol1+1です。また、col3*2を計算して新しい列col3_mulを作成します。SELECT col1, col1+1 AS col1_add, col3*2 col3_mul FROM tbl1;結果は次のとおりです:
+------+----------+----------+ | col1 | col1_add | col3_mul | +------+----------+----------+ | 1 | 2 | 2 | | 2 | 3 | 4 | | 3 | 4 | 6 | +------+----------+----------+ 3 rows in set
from_list
DUAL:仮想テーブル名を表します。実際のテーブルがない場合に、計算や関数を実行するために通常使用されます。例:
SELECT 1+1, SYSDATE() FROM DUAL;結果は次のとおりです:
+------+---------------------+ | 1+1 | SYSDATE() | +------+---------------------+ | 2 | 2024-08-28 15:20:59 | +------+---------------------+ 1 row in settable_references:テーブル参照リストで、複数のテーブル参照を含むことができます。複数のテーブル参照は半角カンマ(,)で区切ります。つまり、クエリのデータソースとなるテーブルのリストを指定します。これは1つまたは複数のテーブルの組み合わせである可能性があります。table_referencesの詳細な構文情報については、JOIN句を参照してください。
where_condition
expression:更新対象の行をフィルタリングするために使用できる条件式を表します。
例:
tbl1 テーブルから、条件 col1 > 1 かつ col2 = 'A3' を満たすすべての行データを選択します。
SELECT * FROM tbl1
WHERE col1 > 1
AND col2 = 'A3';
結果は次のとおりです:
+------+------+------+
| col1 | col2 | col3 |
+------+------+------+
| 3 | A3 | 3 |
+------+------+------+
1 row in set
table_function
LOCATION句は、外部テーブルファイルの保存先パスを指定するために使用されます。通常、外部テーブルのデータファイルは単独のディレクトリに保存され、そのフォルダ内にはサブディレクトリを含むことができます。テーブル作成時、外部テーブルはそのディレクトリ内のすべてのファイルを自動的に収集します。取り得る値は以下のとおりです:
file_path:具体的な外部テーブルファイルのパス情報を表します。詳細は以下のとおりです:ローカル
LOCATIONの形式は次のとおりです:LOCATION = '[file:// | sfile://] local_file_path'file://:このプロトコルヘッダーは、複数のOBServerノードで同じ論理パスのファイルに遭遇した場合、それらが異なるファイルとして扱われ、個別に処理されることを示します。各ノードはローカルパス下のファイルを独立して読み取ります。sfile://:このプロトコルヘッダーは、複数のOBServerノードで同じ論理パスのファイルに遭遇した場合、システムが論理パスに基づいて重複処理を行い、データを一度だけ読み取ることを保証します(マルチサーバー負荷分散をサポート)。注意
sfile://を使用する場合、システムはファイルサイズの一貫性検証を行います。同一の論理パス下のファイルが異なるOBServerノードでサイズが一致しない場合、システムはOB_INVALID_EXTERNAL_FILEエラーを返し、データの不整合による結果の誤りを防ぎます。- V4.4.2バージョンでは、V4.4.2 BP2バージョンから
SELECT ... FILES(LOCATION = ...);構文のローカルLocation形式にsfile://プロトコルヘッダーのサポートが追加されました。
local_file_path:相対パスまたは絶対パスを指定できます。相対パスを指定する場合、現在のディレクトリはOceanBaseデータベースのインストールディレクトリである必要があります。secure_file_privは、OBServerノードがアクセス権限を持つファイルパスを設定するために使用されます。local_file_pathはsecure_file_privパスのサブパスである必要があります。リモート
LOCATIONの形式は次のとおりです:LOCATION = '{oss\|s3}://$ACCESS_ID:$ACCESS_KEY@$HOST:s3_region/remote_file_path'、ここで$ACCESS_ID、$ACCESS_KEY、$HOSTは、Alibaba Cloud OSS、AWS S3、およびS3プロトコル互換のオブジェクトストレージにアクセスするために必要なアクセス情報です。s3_regionはS3使用時に選択するリージョン情報で、これらの機密アクセス情報は暗号化されてデータベースのシステムテーブルに保存されます。LOCATION = hdfs://localhost:port/PATH、ここでlocalhostはHDFSのアドレスを指し、portはHDFSのポート番号を指し、PATHはHDFS内のディレクトリパスを指します。Kerberos認証を使用する場合:
LOCATION = 'hdfs://localhost:port/user?principal=xxx&keytab=xxx&krb5conf=xxx&configs=xxx'。ここで:principal: ログイン認証ユーザーを指します。keytab: ユーザー認証のキータブファイルパスを指定します。krb5conf: ユーザーが使用するKerberos環境の設定ファイルパスを指定します。configs: 追加のHDFSパラメータを指定します。デフォルトは空ですが、Kerberos環境の場合、通常このパラメータには値があり、設定が必要です。例えば、dfs.data.transfer.protection=authentication,privacyは、データ転送の保護レベルをauthenticationとprivacyに指定します。
@location_name['/path']:Locationオブジェクトを参照して外部テーブルを作成することを示します。['/path']はオプションで、サブディレクトリを表します。Locationオブジェクトの作成に関する詳細は、CREATE LOCATIONを参照してください。説明
OceanBaseデータベースV4.4.xバージョンでは、V4.4.1バージョンから
@location_name['/path']パラメータがサポートされています。
FORMAT句は、読み取りファイル形式に関連する属性を指定するために使用され、CSV/PARQUET/ORCの3種類のファイル形式をサポートしています。
- TYPE = 'CSV' の場合、以下のフィールドが含まれます:
LINE_DELIMITER:CSVファイルの行区切り文字を指定します。デフォルトはLINE_DELIMITER='\n'です。FIELD_DELIMITER:オプションです。CSVファイルの列区切り文字を指定します。デフォルトはFIELD_DELIMITER='\t'です。ESCAPE:CSVファイルのエスケープ文字を指定します。1バイトのみ指定可能です。デフォルトはESCAPE ='\'です。FIELD_OPTIONALLY_ENCLOSED_BY:オプションです。CSVファイルでフィールド値を囲む記号を指定します。デフォルトは空です。このオプションを使用すると、一部の型(CHAR、VARCHAR、TEXT、JSONなど)のフィールドにのみ囲み文字が付加されます。ENCODING:ファイルの文字セットエンコーディング形式を指定します。指定しない場合、デフォルト値はUTF8MB4です。NULL_IF:NULLとして処理する文字列を指定します。デフォルト値は空です。SKIP_HEADER:ファイルヘッダーをスキップし、スキップする行数を指定します。SKIP_BLANK_LINES:空白行をスキップするかどうかを指定します。デフォルト値はFALSEで、空白行はスキップされません。TRIM_SPACE:ファイル内のフィールドの先頭と末尾のスペースを削除するかどうかを指定します。デフォルト値はFALSEで、ファイル内のフィールドの先頭と末尾のスペースは削除されません。EMPTY_FIELD_AS_NULL:空文字列をNULLとして処理するかどうかを指定します。デフォルト値はFALSEで、空文字列はNULLとして処理されません。PARSE_HEADER:この構成を指定すると、CSVファイルの最初の行の情報を直接取得し、それを各列の列名として使用します。注意
PARSE_HEADERとSKIP_HEADERは同時に使用できません。意味的に矛盾します。
- TYPE = 'PARQUET/ORC' の場合、他の追加フィールドはありません。
- TYPE = 'CSV' の場合、以下のフィールドが含まれます:
PATTERN句は、LOCATIONディレクトリ配下のファイルをフィルタリングするための正規表現パターン文字列を指定します。各LOCATIONディレクトリ配下のファイルパスがこのパターン文字列に一致する場合、外部テーブルはそのファイルにアクセスします。一致しない場合は、そのファイルをスキップします。このパラメータを指定しない場合、デフォルトではLOCATIONディレクトリ配下のすべてのファイルにアクセスできます。
ODPS形式の場合、データの取得方法がファイルを通じて行われず、意味のあるURLパスも存在しないため、source という1種類のtable_function形式のみをサポートしています。
- TYPE = 'ODPS' には以下のフィールドが含まれます:
ACCESSID:ODPSユーザーのIDを指定します。ACCESSKEY:ODPSユーザーのパスワードを指定します。ENDPOINT:ODPSサービスの接続アドレスを指定します。TUNNEL_ENDPOINT:Tunnelデータ伝送サービスの接続アドレスを指定します。PROJECT_NAME:クエリ対象のテーブルが存在するProjectを指定します。SCHEMA_NAME:オプションです。クエリ対象のテーブルのSCHEMAを指定します。TABLE_NAME:クエリ対象のテーブル名を指定します。QUOTA_NAME:オプションです。指定されたQuotaを使用するかどうかを選択します。COMPRESSION_CODE:オプションです。データソースの圧縮形式を指定します。ZLIB、ZSTD、LZ4、ODPS_LZ4の4種類の圧縮形式をサポートしています。設定しない場合、圧縮は有効になりません。
例:
odps形式のデータを読み取ります。
SELECT * FROM
source (
type = 'ODPS',
accessid = '$ODPS_ACCESSID',
accesskey = '$ODPS_ACCESSKEY',
endpoint= '$ODPS_ENDPOINT',
project_name = 'example_project',
schema_name = '',
table_name = 'example_table',
quota_name = '',
compression_code = ''
);
location_url
- FORMAT句は、読み取りファイル形式に関連するプロパティを指定するために使用され、CSV/PARQUET/ORCの3種類のファイル形式をサポートしています:
- CSV形式:parse_header=true/falseを設定します。これは、ファイルの最初の行を列見出しとして解析するかどうかを指定します(デフォルトはfalse)。また、TYPE=CSVを使用してファイル形式を宣言する必要があります(エクスポート時に指定する必要があります)。
- PARQUET/ORC形式:ファイル構造を自動的に認識するため、見出し行の追加設定は不要です。
例:
SELECT * FROM
FILES( location = '/data/',
format (TYPE = 'csv', field_delimiter = ',', parse_header = true),
pattern = 'datafiles$';
group_by_condition
expression [ASC | DESC]:グループ化の条件式を表します。昇順(ASC)または降順(DESC)を追加することで、グループ化後の結果セット内の各グループの順序を昇順または降順に制御できます。
例:
テーブル tbl1 から col1 と col2 を取得し、col2 でグループ化して col3 の合計を求め、結果を出力します。
SELECT col1, col2, SUM(col3)
FROM tbl1
GROUP BY col2 DESC;
実行結果は次のとおりです:
+------+------+-----------+
| col1 | col2 | SUM(col3) |
+------+------+-----------+
| 3 | A3 | 3 |
| 2 | A2 | 2 |
| 1 | A1 | 1 |
+------+------+-----------+
3 rows in set
group_by_summary_option
GROUPING SETS:カスタムグループ化方法を表し、複数のグループの組み合わせを指定できます。以下の特徴があります:- ユーザーは必要なグループの組み合わせを柔軟に定義できます。
- 生成される結果セットには、ユーザーが指定したグループの組み合わせのみが含まれます。
説明
GROUP BY GROUPING SETS ((col1), (col2), (col3))はGROUP BY GROUPING SETS (col1, col2, col3)と等価です。例:
SELECT col1, col2, col3, COUNT(*) FROM tbl1 GROUP BY GROUPING SETS ((col1), (col2), (col3));実行結果は次のとおりです:
+------+------+------+----------+ | col1 | col2 | col3 | COUNT(*) | +------+------+------+----------+ | 1 | NULL | NULL | 1 | | 2 | NULL | NULL | 1 | | 3 | NULL | NULL | 1 | | NULL | A1 | NULL | 1 | | NULL | A2 | NULL | 1 | | NULL | A3 | NULL | 1 | | NULL | NULL | 1 | 1 | | NULL | NULL | 2 | 1 | | NULL | NULL | 3 | 1 | +------+------+------+----------+ 9 rows in setROLLUP:階層集計方法を表します。グループ列の順序に従って段階的にグループ列の数を減らし、多層の集計結果を生成します。以下の特徴があります:expression_listの列の順序に従って、グループ列を順次削除し、最終的には合計行のみを残します。生成される結果セットには以下が含まれます:
- 各グループの詳細データ。
- 各グループのサブ集計データ。
- 合計行。
ROLLUPは特殊なGROUPING SETSと見なすことができます。例えば:GROUP BY ROLLUP(col1, col2, col3) は次のものと等価です: GROUP BY GROUPING SETS ((col1, col2, col3), (col1, col2), (col1), ())ROLLUPはGROUPING SETSと組み合わせて使用することもできます。例えば:GROUP BY GROUPING SETS((col2), (col3), ROLLUP(col1, col2, col3)) は次のものと等価です: GROUP BY GROUPING SETS((col2), (col3), (col1, col2, col3), (col1, col2), (col1), ())例:
SELECT col1, col2, col3, COUNT(*) FROM tbl1 GROUP BY ROLLUP (col1, col2, col3);実行結果は次のとおりです:
+------+------+------+----------+ | col1 | col2 | col3 | COUNT(*) | +------+------+------+----------+ | 1 | A1 | 1 | 1 | | 1 | A1 | NULL | 1 | | 1 | NULL | NULL | 1 | | 2 | A2 | 2 | 1 | | 2 | A2 | NULL | 1 | | 2 | NULL | NULL | 1 | | 3 | A3 | 3 | 1 | | 3 | A3 | NULL | 1 | | 3 | NULL | NULL | 1 | | NULL | NULL | NULL | 3 | +------+------+------+----------+ 10 rows in setCUBE:多次元集計方式を表し、すべての可能なグループ化の組み合わせを生成します。以下の特徴があります:- 各グループの詳細データ。
- すべての可能なグループ化の組み合わせに対する集計データ。
- 合計行。
CUBEは特殊なGROUPING SETSと見なすことができます。例えば:GROUP BY CUBE(col1, col2, col3) は次のものと等価です: GROUP BY GROUPING SETS ((col1, col2, col3), (col1, col2), (col1, col3), (col2, col3), (col1), (col2), (col3), ())CUBEはGROUPING SETSと組み合わせて使用することもできます。例えば:GROUP BY col1, CUBE(col2, col3), GROUPING SETS((col4), (col5)) は次のものと等価です: GROUP BY GROUPING SETS( (col1, col2, col3, col4), (col1, col2, col3, col5), (col1, col2, col4), (col1, col2, col5), (col1, col3, col4), (col1, col3, col5), (col1, col4), (col1, col5))例:
SELECT col1, col2, col3, COUNT(*) FROM tbl1 GROUP BY CUBE (col1, col2, col3);実行結果は次のとおりです:
+------+------+------+----------+ | col1 | col2 | col3 | COUNT(*) | +------+------+------+----------+ | NULL | NULL | NULL | 3 | | NULL | NULL | 1 | 1 | | NULL | NULL | 2 | 1 | | NULL | NULL | 3 | 1 | | NULL | A1 | NULL | 1 | | NULL | A2 | NULL | 1 | | NULL | A3 | NULL | 1 | | NULL | A1 | 1 | 1 | | NULL | A2 | 2 | 1 | | NULL | A3 | 3 | 1 | | 1 | NULL | NULL | 1 | | 2 | NULL | NULL | 1 | | 3 | NULL | NULL | 1 | | 1 | NULL | 1 | 1 | | 2 | NULL | 2 | 1 | | 3 | NULL | 3 | 1 | | 1 | A1 | NULL | 1 | | 2 | A2 | NULL | 1 | | 3 | A3 | NULL | 1 | | 1 | A1 | 1 | 1 | | 2 | A2 | 2 | 1 | | 3 | A3 | 3 | 1 | +------+------+------+----------+ 22 rows in set
having_condition
expression:グループ化後の結果に対して条件フィルタリングを行う条件式を表します。
例:
テーブル tbl1 から col1、col2 を取得し、col2 でグループ化して col3 の合計を求めます。col3 の合計が 3 より小さい行を検索して出力します。
SELECT col1, col2, SUM(col3)
FROM tbl1
GROUP BY col2
HAVING SUM(col3) < 3;
結果は次のとおりです:
+------+------+-----------+
| col1 | col2 | SUM(col3) |
+------+------+-----------+
| 1 | A1 | 1 |
| 2 | A2 | 2 |
+------+------+-----------+
2 rows in set
order_by_condition
expression [ASC | DESC]:結果セットをソートする条件式を表します。
ASC | DESC:オプションパラメータで、ソートの順序を指定します。ASC は昇順(デフォルト)、DESC は降順を表します。
例:
テーブル tbl1 のデータを照会し、col3 に基づいて降順(DESC)で結果を出力します。
SELECT * FROM tbl1
ORDER BY col3 DESC;
結果は次のとおりです:
+------+------+------+
| col1 | col2 | col3 |
+------+------+------+
| 3 | A3 | 3 |
| 2 | A2 | 2 |
| 1 | A1 | 1 |
+------+------+------+
3 rows in set
limit_clause
[offset,] row_count:パラメータの値は整数定数でなければなりません。解釈は以下のとおりです:offset:オプションで、結果セットの開始位置からスキップする行数(オフセット量)を表します。デフォルトの初期レコード行のオフセットは0です。row_count:返す行数を表します。row_countパラメータのみを使用する場合、結果セットの最初のrow_count行を返します。
row_count OFFSET offset:結果セットの開始位置からoffset行をスキップし、その後のrow_count行を返します。
例:
テーブル tbl1 のデータを照会し、LIMIT を使用して2行目から強制的に開始し、テーブル tbl1 の2行の結果を返します。
SELECT * FROM tbl1
LIMIT 1, 2;
結果は次のとおりです:
+------+------+------+
| col1 | col2 | col3 |
+------+------+------+
| 2 | A2 | 2 |
| 3 | A3 | 3 |
+------+------+------+
2 rows in set
lock_option
FOR UPDATE [opt_for_update_wait]:クエリ結果のすべての行に排他的ロックをかけることを表します。これにより、他のトランザクションによる同時変更を防ぎ、また、特定のトランザクション分離レベルでは並行読み取りを防ぎます。排他的ロックの使用に関する詳細は、SELECT FOR UPDATEによるクエリ結果のロックを参照してください。opt_for_update_wait:オプションで、ロックの取得動作を指定するために使用されます。具体的には以下のとおりです:WAIT {decimal | intnum}:他のトランザクションがリソースを解放するまで待機する時間を表します。この時間を超えた場合、リソースを取得できないことを返します。単位は秒です。NOWAIT/NO_WAIT:他のトランザクションがリソースを解放するのを待たず、直接リソースを取得できないことを返します。SKIP LOCKED:行ロックを取得するのを待たず、クエリは即座に実行され、結果セットからロックされた行が削除されます。
例:
SELECT ... FOR UPDATEを使用してテーブルに行レベルロックをかけることができます。LIMIT 1句を使用した場合、クエリの最適化により、演算子がテーブルスキャンのステップまで押し下げられ、LIMITで返される行に対してのみロックがかけられます。SELECT * FROM tbl1 LIMIT 1 FOR UPDATE;クエリ結果をソートするために
ORDER BY句を使用した場合、結果をソートしてからLIMIT 1を実行するため、この場合は選択されたすべての行にロックがかけられます。SELECT * FROM tbl1 ORDER BY col1 LIMIT 1 FOR UPDATE;
LOCK IN SHARE MODE:データをクエリする際に共有ロックを取得し、他のトランザクションによるデータへの書き込み操作を防ぎますが、他のトランザクションによるデータの読み取り操作は許可します。共有ロックの使用方法については、LOCK IN SHARE MODEでクエリ結果をロックするを参照してください。
例
シンプルなテーブルクエリの例
テーブル
test_tbl1を作成します。CREATE TABLE test_tbl1(col1 INT PRIMARY KEY, col2 VARCHAR(20), col3 INT);テーブル
test_tbl1にテストデータを挿入します。INSERT INTO test_tbl1 VALUES (1, 'A1', 10),(2, 'A2', 15),(3, 'A1', 8);テーブル
test_tbl1の列col2のデータを確認し、重複を除去します。SELECT DISTINCT col2 FROM test_tbl1;実行結果は次のとおりです:
+------+ | col2 | +------+ | A1 | | A2 | +------+ 2 rows in set
dblinkを使用したデータクエリの例
リモートの
testライブラリ内のnumber_tテーブルを読み取るSELECT * FROM number_t@ob_dblink;実行結果は次のとおりです:
+--------+-------------+---------+---------------------+--------------------------------+ | c_int | c_bigint | c_float | c_double | c_decimal | +--------+-------------+---------+---------------------+--------------------------------+ | 214748 | 92233720368 | 3.40282 | 1.7976931348623157 | 123456789123456789.1234567890 | +--------+-------------+---------+---------------------+--------------------------------+ 1 row in setリモートの
testライブラリ内のnumber_tテーブルを読み取り、ローカルのnumber_tテーブルとJOIN操作を実行する。SELECT a.c_decimal, b.c_double FROM number_t a, number_t@ob_dblink b WHERE a.c_int = b.c_int;実行結果は次のとおりです:
+--------------------------------+---------------------+ | c_decimal | c_double | +---------------------+--------------------------------+ | 123456789123456789.1234567890 | 1.7976931348623157 | +---------------------+--------------------------------+ 1 row in setリモートの
mysqlライブラリ内のdatetime_tテーブルを読み取る。SELECT * FROM mysql.datetime_t@ob_dblink;実行結果は次のとおりです:
+-------------+------------+---------+----------------------+----------------------+ | c_date | c_time | c_year | c_datetime | c_timestamp | +-------------+------------+---------+-----------------------+---------------------+ | 2023-04-13 | 12:12:12 | 2078 | 2100-11-01 12:12:13 | 2100-12-01 21:14:15 | +-------------+------------+---------+----------------------+----------------------+ 1 row in set
ベクトル距離クエリの例
テーブルを作成します。
CREATE TABLE vector_table ( id INT PRIMARY KEY, name VARCHAR(50), vector_col VECTOR(3) );テーブルにベクトルデータを挿入します。
INSERT INTO vector_table VALUES (1, 'A', '[1, 2, 3]'); INSERT INTO vector_table VALUES (2, 'B', '[2, 3, 4]'); INSERT INTO vector_table VALUES (3, 'C', '[3, 4, 5]'); INSERT INTO vector_table VALUES (4, 'D', '[10, 20, 30]'); INSERT INTO vector_table VALUES (5, 'E', '[100, 200, 300]');ベクトルインデックスを作成します。
CREATE VECTOR INDEX idx_vector ON vector_table(vector_col) WITH (distance=l2, type=hnsw);L2距離を使用してベクトル類似度クエリを実行します。
SELECT id, name, vector_col FROM vector_table ORDER BY l2_distance(vector_col, '[2, 3, 4]') APPROXIMATE LIMIT 3;実行結果は次のとおりです:
+----+------+-------------+ | id | name | vector_col | +----+------+-------------+ | 2 | B | [2,3,4] | | 3 | C | [3,4,5] | | 1 | A | [1,2,3] | +----+------+-------------+ 3 rows in setコサイン距離を使用してベクトル類似度クエリを実行します。
SELECT id, name, vector_col FROM vector_table ORDER BY cosine_distance(vector_col, '[2, 3, 4]') APPROXIMATE LIMIT 3;実行結果は次のとおりです:
+----+------+-------------+ | id | name | vector_col | +----+------+-------------+ | 2 | B | [2,3,4] | | 3 | C | [3,4,5] | | 1 | A | [1,2,3] | +----+------+-------------+ 3 rows in setWHERE句を組み合わせてベクトルクエリを実行します。
SELECT id, name, vector_col FROM vector_table WHERE id > 2 ORDER BY l2_distance(vector_col, '[2, 3, 4]') APPROXIMATE LIMIT 2;実行結果は次のとおりです:
+----+------+-------------+ | id | name | vector_col | +----+------+-------------+ | 3 | C | [3,4,5] | | 4 | D | [10,20,30] | +----+------+-------------+ 2 rows in set
注意
ベクトル距離クエリでは、以下の条件を満たす必要があります:
APPROXIMATEキーワードを使用して、ベクトルインデックスの近似検索を有効にする必要があります。- クエリベクトル
query_vectorの次元は、ベクトル列の次元と一致している必要があります。 - ベクトル列に対応するベクトルインデックスを作成することで、クエリのパフォーマンスを向上させることを推奨します。
- サポートされているベクトル距離関数は、
l2_distance(L2距離)、negative_inner_product(負の内積)、およびcosine_distance(コサイン距離)です。