説明
このステートメントは、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://] local_file_path'で、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 のみの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(コサイン距離) です。