概要
このステートメントは、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:
'<string>'
(
{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 = '<string>',
{
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]
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) | オプションです。高度なグループ化集計操作に使用されます。
説明OceanBaseデータベースV4.3.5では、V4.3.5 BP1以降のバージョンから高度なグループ化集計操作がサポートされています。 |
| 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を参照してください。 |
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句は、外部テーブルファイルの保存パスを指定するために使用されます。通常、外部テーブルのデータファイルは単一のディレクトリに保存され、そのフォルダ内にはサブディレクトリが含まれることがあります。テーブル作成時に、外部テーブルはこのディレクトリ内のすべてのファイルを自動的に収集します。
- ローカルの
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は、アリババクラウド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と指定します。
- Kerberos認証付きの場合:
- ローカルの
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
説明
OceanBaseデータベースV4.3.5では、V4.3.5 BP1からより高度なグループ化集計操作がサポートされています。
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