このセクションでは、OceanBaseデータベースのMySQLモードにおける基本的なSQL操作について説明します。
データベースの作成
CREATE DATABASE ステートメントを使用してデータベースを作成します。
例:データベース db1 を作成し、文字セットを utf8mb4 に指定して、読み書き属性を設定します。
obclient(root@mysqltenant)[(none)]> CREATE DATABASE db1 DEFAULT CHARACTER SET utf8mb4 READ WRITE;
CREATE DATABASE ステートメントの詳細な構文については、CREATE DATABASEを参照してください。
作成後、SHOW DATABASES コマンドを使用して、現在のデータベースサーバー上のすべてのデータベースを確認できます。
obclient(root@mysqltenant)[(none)]> SHOW DATABASES;
実行結果は次のとおりです:
+--------------------+
| Database |
+--------------------+
| db1 |
| information_schema |
| mysql |
| oceanbase |
| test |
| test_db |
+--------------------+
6 rows in set
テーブルの操作
OceanBaseデータベースにおいて、テーブルは最も基本的なデータ格納単位であり、ユーザーがアクセス可能なすべてのデータを含んでいます。各テーブルは複数のレコードで構成され、各レコードは複数の列で構成されます。このセクションでは、データベースにおけるテーブルの作成、表示、変更、削除の構文と使用例を説明します。
テーブルの作成
CREATE TABLE ステートメントを使用して、データベースに新しいテーブルを作成します。
例:データベース db1 にテーブル test を作成します。
データベース
db1に切り替えます。obclient(root@mysqltenant)[(none)]> USE db1;テーブル
testを作成します。obclient(root@mysqltenant)[db1]> CREATE TABLE test (c1 INT PRIMARY KEY, c2 VARCHAR(3));
CREATE TABLE ステートメントの詳細な構文については、CREATE TABLEを参照してください。
テーブルの確認
SHOW CREATE TABLE ステートメントを使用して、テーブル作成ステートメントを確認します。
例:テーブル test のテーブル作成ステートメントを確認します。
obclient(root@mysqltenant)[db1]> SHOW CREATE TABLE test\G
実行結果は次のとおりです:
*************************** 1. row ***************************
Table: test
Create Table: CREATE TABLE `test` (
`c1` int(11) NOT NULL,
`c2` varchar(3) DEFAULT NULL,
PRIMARY KEY (`c1`)
) ORGANIZATION INDEX DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE ENABLE_MACRO_BLOCK_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0
1 row in set
また、SHOW TABLES を使用して、指定したデータベース内のすべてのテーブルを確認することもできます。
例:db1 データベース内のすべてのテーブルを確認します。
obclient(root@mysqltenant)[db1]> SHOW TABLES FROM db1;
実行結果は次のとおりです:
+---------------+
| Tables_in_db1 |
+---------------+
| test |
+---------------+
1 row in set
SHOW ステートメントの詳細な構文については、SHOWを参照してください。
テーブルの変更
ALTER TABLE ステートメントを使用して、既存のテーブルの構造を変更します。これには、テーブルやテーブル属性の変更、列の追加、列や属性の変更、列の削除などが含まれます。
例:
テーブル
testの列c2の名前をc3に変更し、同時にその列の型も変更します。テーブル
testの列定義を確認します。obclient(root@mysqltenant)[db1]> DESCRIBE test;実行結果は次のとおりです:
+-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | c1 | int(11) | NO | PRI | NULL | | | c2 | varchar(3) | YES | | NULL | | +-------+------------+------+-----+---------+-------+ 2 rows in setテーブル
testの列c2の名前をc3に変更し、同時にその列の型をcharに変更します。obclient(root@mysqltenant)[db1]> ALTER TABLE test CHANGE COLUMN c2 c3 CHAR(10);再度テーブル
testの列定義を確認し、変更が成功したことを確認します。obclient(root@mysqltenant)[db1]> DESCRIBE test;実行結果は次のとおりです:
+-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | c1 | int(11) | NO | PRI | NULL | | | c3 | char(10) | YES | | NULL | | +-------+----------+------+-----+---------+-------+ 2 rows in set
テーブル
testに列を追加および削除します。現在のテーブル
testの列定義を確認します。obclient(root@mysqltenant)[db1]> DESCRIBE test;実行結果は次のとおりです:
+-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | c1 | int(11) | NO | PRI | NULL | | | c3 | char(10) | YES | | NULL | | +-------+----------+------+-----+---------+-------+ 2 rows in setテーブル
testに列c4を追加します。obclient(root@mysqltenant)[db1]> ALTER TABLE test ADD c4 int;再度テーブル
testの列定義を確認し、c4列が正常に追加されたことを確認します。obclient(root@mysqltenant)[db1]> DESCRIBE test;実行結果は次のとおりです:
+-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | c1 | int(11) | NO | PRI | NULL | | | c3 | char(10) | YES | | NULL | | | c4 | int(11) | YES | | NULL | | +-------+----------+------+-----+---------+-------+ 3 rows in setテーブル
testから列c3を削除します。obclient(root@mysqltenant)[db1]> ALTER TABLE test DROP c3;再度テーブル
testの列定義を確認し、c3列が正常に削除されたことを確認します。obclient(root@mysqltenant)[db1]> DESCRIBE test;実行結果は次のとおりです:
+-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | c1 | int(11) | NO | PRI | NULL | | | c4 | int(11) | YES | | NULL | | +-------+---------+------+-----+---------+-------+ 2 rows in set
ALTER TABLE ステートメントの詳細な構文については、ALTER TABLEを参照してください。
テーブルの削除
DROP TABLE ステートメントを使用してテーブルを削除します。
例:テーブル test を削除します。
obclient(root@mysqltenant)[db1]> DROP TABLE test;
DROP TABLE ステートメントの詳細な構文については、DROP TABLEを参照してください。
インデックスの操作
インデックスはテーブルに作成され、データベーステーブルの1列または複数列の値をソートするための構造です。主な役割はクエリの速度を向上させ、データベースシステムのパフォーマンスオーバヘッドを低減することです。このセクションでは、データベースにおけるインデックスの作成、表示、削除の構文と使用例について説明します。
インデックスの作成
CREATE INDEX ステートメントを使用して、テーブルのインデックスを作成します。
例:テーブル test にインデックスを作成します。
テーブル
testの列定義を確認します。obclient(root@mysqltenant)[db1]> DESCRIBE test;実行結果は次のとおりです:
+-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | c1 | int(11) | NO | PRI | NULL | | | c2 | char(3) | YES | | NULL | | +-------+----------+------+-----+---------+-------+ 2 rows in setテーブル
testのc1、c2列にtest_indexという名前の複合インデックスを作成します。obclient(root@mysqltenant)[db1]> CREATE INDEX test_index ON test (c1, c2);
CREATE INDEX ステートメントの詳細な構文については、CREATE INDEXを参照してください。
インデックスの表示
SHOW INDEX ステートメントを使用して、テーブルのインデックスを表示します。
例:テーブル test のインデックス情報を表示します。
obclient(root@mysqltenant)[db1]> SHOW INDEX FROM test\G
実行結果は次のとおりです:
*************************** 1. row ***************************
Table: test
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: c1
Collation: A
Cardinality: NULL
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment: available
Index_comment:
Visible: YES
Expression: NULL
*************************** 2. row ***************************
Table: test
Non_unique: 1
Key_name: test_index
Seq_in_index: 1
Column_name: c1
Collation: A
Cardinality: NULL
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment: available
Index_comment:
Visible: YES
Expression: NULL
*************************** 3. row ***************************
Table: test
Non_unique: 1
Key_name: test_index
Seq_in_index: 2
Column_name: c2
Collation: A
Cardinality: NULL
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
Comment: available
Index_comment:
Visible: YES
Expression: NULL
3 rows in set
その他の SHOW ステートメントに関する構文説明については、SHOWを参照してください。
インデックスの削除
DROP INDEX ステートメントを使用して、テーブルのインデックスを削除します。
例:テーブル test のインデックスを削除します。
obclient(root@mysqltenant)[db1]> DROP INDEX test_index ON test;
その他の DROP INDEX ステートメントに関する構文説明については、DROP INDEXを参照してください。
データの挿入
INSERT ステートメントを使用して、既存のテーブルにデータを挿入します。
例:
テーブル
t1を作成し、1行のデータを挿入します。テーブル
t1を作成します。obclient(root@mysqltenant)[db1]> CREATE TABLE t1(c1 INT PRIMARY KEY, c2 int) PARTITION BY KEY(c1) PARTITIONS 4;テーブル内のデータを確認します。
obclient(root@mysqltenant)[db1]> SELECT * FROM t1;クエリ結果は空です。テーブルにデータはありません。
テーブル
t1に1行のデータを挿入します。obclient(root@mysqltenant)[db1]> INSERT t1 VALUES(1,1);再度テーブル内のデータを確認し、1行のデータが正常に挿入されたことを確認します。
obclient(root@mysqltenant)[db1]> SELECT * FROM t1;実行結果は次のとおりです:
+----+------+ | c1 | c2 | +----+------+ | 1 | 1 | +----+------+ 1 row in set
テーブル
t1に複数行のデータを挿入します。現在のテーブル内のデータを確認します。
obclient(root@mysqltenant)[db1]> SELECT * FROM t1;実行結果は次のとおりです:
+----+------+ | c1 | c2 | +----+------+ | 1 | 1 | +----+------+ 1 row in setテーブル
t1に複数行のデータを一度に挿入します。obclient(root@mysqltenant)[db1]> INSERT t1 VALUES(2,2),(3,default),(2+2,3*4);再度テーブル内のデータを確認し、データが正常に挿入されたことを確認します。
obclient(root@mysqltenant)[db1]> SELECT * FROM t1;実行結果は次のとおりです:
+----+------+ | c1 | c2 | +----+------+ | 1 | 1 | | 2 | 2 | | 3 | NULL | | 4 | 12 | +----+------+ 4 rows in set
INSERT ステートメントの詳細な構文については、INSERT を参照してください。
データの削除
DELETE ステートメントを使用してデータを削除します。単一テーブルおよび複数テーブルのデータ削除をサポートしています。
例を説明しやすくするために、まずサンプルテーブル t2 と t3 を作成し、テーブルにデータを挿入します。
サンプルテーブル
t2を作成し、データを挿入します。非パーティションテーブル
t2を作成します。obclient(root@mysqltenant)[db1]> CREATE TABLE t2(c1 INT PRIMARY KEY, c2 INT);テーブル
t2に複数行のデータを挿入します。obclient(root@mysqltenant)[db1]> INSERT t2 VALUES(1,1),(2,2),(3,3),(5,5);テーブル内のデータを確認し、挿入が成功したことを確認します。
obclient(root@mysqltenant)[db1]> SELECT * FROM t2;実行結果は次のとおりです:
+----+------+ | c1 | c2 | +----+------+ | 1 | 1 | | 2 | 2 | | 3 | 3 | | 5 | 5 | +----+------+ 4 rows in set
サンプルテーブル
t3を作成し、データを挿入します。KEYパーティションのパーティションテーブルt3を作成します。パーティション名は、システムがパーティションコマンドのルールに基づいて自動生成します。つまり、パーティション名はp0、p1、p2、p3となります。obclient(root@mysqltenant)[db1]> CREATE TABLE t3(c1 INT PRIMARY KEY, c2 INT) PARTITION BY KEY(c1) PARTITIONS 4;テーブル
t3に複数行のデータを挿入します。obclient(root@mysqltenant)[db1]> INSERT INTO t3 VALUES(5,5),(1,1),(2,2),(3,3);テーブル内のデータを確認し、挿入が成功したことを確認します。
obclient(root@mysqltenant)[db1]> SELECT * FROM t3;実行結果は次のとおりです:
+----+------+ | c1 | c2 | +----+------+ | 5 | 5 | | 1 | 1 | | 2 | 2 | | 3 | 3 | +----+------+ 4 rows in set
例:
テーブルから指定された行を削除します。
削除前のテーブル
t2のデータを確認します。obclient(root@mysqltenant)[db1]> SELECT * FROM t2;実行結果は次のとおりです:
+----+------+ | c1 | c2 | +----+------+ | 1 | 1 | | 2 | 2 | | 3 | 3 | | 5 | 5 | +----+------+ 4 rows in setテーブル
t2からc1=2の行を削除します。ここで、c1列はテーブルt2のPRIMARY KEYです。obclient(root@mysqltenant)[db1]> DELETE FROM t2 WHERE c1 = 2;削除後のテーブル
t2のデータを確認し、削除が成功したことを確認します。obclient(root@mysqltenant)[db1]> SELECT * FROM t2;実行結果は次のとおりです:
+----+------+ | c1 | c2 | +----+------+ | 1 | 1 | | 3 | 3 | | 5 | 5 | +----+------+ 3 rows in set
条件に合致する行をテーブルから削除します。
削除前のテーブル
t2のデータを確認します。obclient(root@mysqltenant)[db1]> SELECT * FROM t2;実行結果は次のとおりです:
+----+------+ | c1 | c2 | +----+------+ | 1 | 1 | | 3 | 3 | | 5 | 5 | +----+------+ 3 rows in sett2列に従ってソートした後のテーブルt2の最初の行のデータを削除します。obclient(root@mysqltenant)[db1]> DELETE FROM t2 ORDER BY c2 LIMIT 1;削除後のテーブル
t2のデータを確認し、削除が成功したことを確認します。obclient(root@mysqltenant)[db1]> SELECT * FROM t2;実行結果は次のとおりです:
+----+------+ | c1 | c2 | +----+------+ | 3 | 3 | | 5 | 5 | +----+------+ 3 rows in set
テーブルから指定されたパーティションのデータを削除します。
削除前のテーブル
t3のp2パーティションのデータを確認します。obclient(root@mysqltenant)[db1]> SELECT * FROM t3 PARTITION(p2);実行結果は次のとおりです:
+----+------+ | c1 | c2 | +----+------+ | 1 | 1 | | 2 | 2 | | 3 | 3 | +----+------+ 3 rows in setテーブル
t3のp2パーティションのデータを削除します。obclient(root@mysqltenant)[db1]> DELETE FROM t3 PARTITION(p2);削除後のテーブル
t3のデータを確認し、削除が成功したことを確認します。obclient(root@mysqltenant)[db1]> SELECT * FROM t3;実行結果は次のとおりです:
+----+------+ | c1 | c2 | +----+------+ | 5 | 5 | +----+------+ 1 row in set
複数のテーブルから同時にデータを削除します。
削除前のテーブル
t2およびt3のデータを確認します。テーブル
t2のデータを確認します。obclient(root@mysqltenant)[db1]> SELECT * FROM t2;実行結果は次のとおりです:
+----+------+ | c1 | c2 | +----+------+ | 3 | 3 | | 5 | 5 | +----+------+ 2 rows in setテーブル
t3のデータを確認します。obclient(root@mysqltenant)[db1]> SELECT * FROM t3;実行結果は次のとおりです:
+----+------+ | c1 | c2 | +----+------+ | 5 | 5 | +----+------+ 1 row in sett2およびt3テーブルからt2.c1 = t3.c1のデータを削除します。obclient(root@mysqltenant)[db1]> DELETE t2, t3 FROM t2, t3 WHERE t2.c1 = t3.c1;このステートメントは以下のものと等価です。
obclient(root@mysqltenant)[db1]> DELETE FROM t2, t3 USING t2, t3 WHERE t2.c1 = t3.c1;削除後のテーブル
t2およびt3のデータを確認し、削除が成功したことを確認します。テーブル
t2のデータを確認します。obclient(root@mysqltenant)[db1]> SELECT * FROM t2;実行結果は次のとおりです:
+----+------+ | c1 | c2 | +----+------+ | 3 | 3 | +----+------+ 1 row in setテーブル
t3のデータを確認します。obclient(root@mysqltenant)[db1]> SELECT * FROM t3;実行結果は空です。テーブル
t3のデータは削除されました。
DELETE ステートメントの詳細な構文については、DELETEを参照してください。
データの更新
UPDATE ステートメントを使用して、テーブル内のフィールド値を変更します。
例を説明しやすくするために、まずサンプルテーブル t4 と t5 を作成し、データを挿入します。
サンプルテーブル
t4を作成し、データを挿入します。非パーティションテーブル
t2を作成します。obclient(root@mysqltenant)[db1]> CREATE TABLE t4(c1 INT PRIMARY KEY, c2 INT);テーブル
t4に複数行のデータを挿入します。obclient(root@mysqltenant)[db1]> INSERT t4 VALUES(10,10),(20,20),(30,30),(40,40);テーブル内のデータを確認し、挿入が成功したことを確認します。
obclient(root@mysqltenant)[db1]> SELECT * FROM t4;実行結果は次のとおりです:
+----+------+ | c1 | c2 | +----+------+ | 10 | 10 | | 20 | 20 | | 30 | 30 | | 40 | 40 | +----+------+ 4 rows in set
サンプルテーブル
t5を作成し、データを挿入します。KEYパーティションのパーティションテーブルt5を作成します。パーティション名は、システムがパーティションコマンドのルールに基づいて自動生成します。つまり、パーティション名はp0、p1、p2、p3となります。obclient(root@mysqltenant)[db1]> CREATE TABLE t5(c1 INT PRIMARY KEY, c2 INT) PARTITION BY KEY(c1) PARTITIONS 4;テーブル
t5に複数行のデータを挿入します。obclient(root@mysqltenant)[db1]> INSERT t5 VALUES(50,50),(10,10),(20,20),(30,30);テーブル内のデータを確認し、挿入が成功したことを確認します。
obclient(root@mysqltenant)[db1]> SELECT * FROM t5;実行結果は次のとおりです:
+----+------+ | c1 | c2 | +----+------+ | 20 | 20 | | 10 | 10 | | 50 | 50 | | 30 | 30 | +----+------+ 4 rows in set
例:
テーブル内の指定された行と列の値を更新します。
更新前のテーブル
t4のデータを確認します。obclient(root@mysqltenant)[db1]> SELECT * FROM t4;実行結果は次のとおりです:
+----+------+ | c1 | c2 | +----+------+ | 10 | 10 | | 20 | 20 | | 30 | 30 | | 40 | 40 | +----+------+ 4 rows in setテーブル
t4のt4.c1=10に対応する行のc2列の値を100に変更します。obclient(root@mysqltenant)[db1]> UPDATE t4 SET t4.c2 = 100 WHERE t4.c1 = 10;更新後のテーブル
t4のデータを確認し、更新が成功したことを確認します。obclient(root@mysqltenant)[db1]> SELECT * FROM t4;実行結果は次のとおりです:
+----+------+ | c1 | c2 | +----+------+ | 10 | 100 | | 20 | 20 | | 30 | 30 | | 40 | 40 | +----+------+ 4 rows in set
テーブル
t4のc2列でソートされた上位2行のc2列の値を100に変更します。更新前のテーブル
t4のデータを確認します。obclient(root@mysqltenant)[db1]> SELECT * FROM t4;実行結果は次のとおりです:
+----+------+ | c1 | c2 | +----+------+ | 10 | 100 | | 20 | 20 | | 30 | 30 | | 40 | 40 | +----+------+ 4 rows in setテーブル
t4のc2列でソートされた上位2行のc2列の値を100に変更します。obclient(root@mysqltenant)[db1]> UPDATE t4 set t4.c2 = 100 ORDER BY c2 LIMIT 2;更新後のテーブル
t4のデータを確認し、更新が成功したことを確認します。obclient(root@mysqltenant)[db1]> SELECT * FROM t4;実行結果は次のとおりです:
+----+------+ | c1 | c2 | +----+------+ | 10 | 100 | | 20 | 100 | | 30 | 100 | | 40 | 40 | +----+------+ 4 rows in set
テーブル内の指定されたパーティションの値を更新します。
更新前のテーブル
t5のp1パーティションの値を確認します。obclient(root@mysqltenant)[db1]> SELECT * FROM t5 PARTITION (p1);実行結果は次のとおりです:
+----+------+ | c1 | c2 | +----+------+ | 10 | 10 | | 50 | 50 | +----+------+ 2 rows in setテーブル
t5のp1パーティションのデータのうち、t5.c1 > 20に対応する行のc2列の値を100に変更します。obclient(root@mysqltenant)[db1]> UPDATE t5 PARTITION(p1) SET t5.c2 = 100 WHERE t5.c1 > 20;更新後のテーブル
t5のp1パーティションの値を確認し、更新が成功したことを確認します。obclient(root@mysqltenant)[db1]> SELECT * FROM t5 PARTITION (p1);実行結果は次のとおりです:
+----+------+ | c1 | c2 | +----+------+ | 10 | 10 | | 50 | 100 | +----+------+ 2 rows in set
テーブル
t4とテーブルt5のt4.c2 = t5.c2に対応する行のデータについて、テーブルt4のc2列の値を100に、テーブルt5のc2列の値を200に変更します。更新前のテーブル
t4とt5のデータを確認します。テーブル
t4のデータを確認します。obclient(root@mysqltenant)[db1]> SELECT * FROM t4;実行結果は次のとおりです:
+----+------+ | c1 | c2 | +----+------+ | 10 | 100 | | 20 | 100 | | 30 | 100 | | 40 | 40 | +----+------+ 4 rows in setテーブル
t5のデータを確認します。obclient(root@mysqltenant)[db1]> SELECT * FROM t5;実行結果は次のとおりです:
+----+------+ | c1 | c2 | +----+------+ | 20 | 20 | | 10 | 10 | | 50 | 100 | | 30 | 30 | +----+------+ 4 rows in setテーブル
t4とテーブルt5のt4.c2 = t5.c2に対応する行のデータについて、テーブルt4のc2列の値を100に、テーブルt5のc2列の値を200に変更します。obclient(root@mysqltenant)[db1]> UPDATE t4,t5 SET t4.c2 = 100, t5.c2 = 200 WHERE t4.c2 = t5.c2;更新後のテーブル
t4とt5のデータを確認し、更新が成功したことを確認します。テーブル
t4のデータを確認します。obclient(root@mysqltenant)[db1]> SELECT * FROM t4;実行結果は次のとおりです:
+----+------+ | c1 | c2 | +----+------+ | 10 | 100 | | 20 | 100 | | 30 | 100 | | 40 | 40 | +----+------+ 4 rows in setテーブル
t5のデータを確認します。obclient(root@mysqltenant)[db1]> SELECT * FROM t5;実行結果は次のとおりです:
+----+------+ | c1 | c2 | +----+------+ | 20 | 20 | | 10 | 10 | | 50 | 200 | | 30 | 30 | +----+------+ 4 rows in set
UPDATE ステートメントの詳細な構文については、UPDATEを参照してください。
データのクエリ
SELECT ステートメントを使用して、テーブルの内容をクエリします。
例:
CREATE TABLEを使用してテーブルt6を作成します。テーブルt6からnameのデータを読み取ります。テーブル
t6を作成します。obclient(root@mysqltenant)[db1]> CREATE TABLE t6 (id INT, name VARCHAR(50), num INT);テーブル
t6に複数行のデータを挿入します。obclient(root@mysqltenant)[db1]> INSERT INTO t6 VALUES(1,'a',100),(2,'b',200),(3,'a',50);テーブル
t6のデータを確認し、挿入が成功したことを確認します。obclient(root@mysqltenant)[db1]> SELECT * FROM t6;実行結果は次のとおりです:
+------+------+------+ | ID | NAME | NUM | +------+------+------+ | 1 | a | 100 | | 2 | b | 200 | | 3 | a | 50 | +------+------+------+ 3 rows in setテーブル
t6からnameのデータを読み取ります。obclient(root@mysqltenant)[db1]> SELECT name FROM t6;実行結果は次のとおりです:
+------+ | NAME | +------+ | a | | b | | a | +------+ 3 rows in set
クエリ結果で
nameの重複を除去します。obclient(root@mysqltenant)[db1]> SELECT DISTINCT name FROM t6;実行結果は次のとおりです:
+------+ | NAME | +------+ | a | | b | +------+ 2 rows in setテーブル
t6からフィルター条件name = 'a'に基づいて、対応するid、name、numを出力します。obclient(root@mysqltenant)[db1]> SELECT id, name, num FROM t6 WHERE name = 'a';実行結果は次のとおりです:
+------+------+------+ | ID | NAME | NUM | +------+------+------+ | 1 | a | 100 | | 3 | a | 50 | +------+------+------+ 2 rows in set
SELECT ステートメントの詳細な構文については、SELECT を参照してください。
トランザクションのコミット
COMMIT ステートメントを使用してトランザクションをコミットします。
トランザクションをコミットする前に:
- お客様の変更は現在のセッションでのみ可視化され、他のデータベースセッションからは見えません。
- お客様の変更は永続化されていません。ROLLBACKステートメントを使用して変更を取り消すことができます。
トランザクションをコミットした後:
- お客様の変更はすべてのデータベースセッションから可視化されます。
- お客様の変更は正常に永続化されています。ROLLBACKステートメントで変更をロールバックすることはできません。
例:CREATE TABLE を使用してテーブル t_insert を作成します。COMMIT ステートメントを使用してトランザクションをコミットします。
テーブル
t_insertを作成します。obclient(root@mysqltenant)[db1]> CREATE TABLE t_insert( id number NOT NULL PRIMARY KEY, name varchar(10) NOT NULL, value number, gmt_create DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP );トランザクションを開始します。
obclient(root@mysqltenant)[db1]> BEGIN;テーブル
t_insertに複数行のデータを挿入します。obclient(root@mysqltenant)[db1]> INSERT INTO t_insert(id, name, value, gmt_create) VALUES(1,'CN',10001, current_timestamp),(2,'US',10002, current_timestamp),(3,'EN',10003, current_timestamp);変更後のテーブル
t_insertのデータを確認します。データが正常に挿入されたことが確認できます。obclient(root@mysqltenant)[db1]> SELECT * FROM t_insert;実行結果は次のとおりです:
+------+------+-------+---------------------+ | id | name | value | gmt_create | +------+------+-------+---------------------+ | 1 | CN | 10001 | 2025-11-07 17:46:35 | | 2 | US | 10002 | 2025-11-07 17:46:35 | | 3 | EN | 10003 | 2025-11-07 17:46:35 | +------+------+-------+---------------------+ 3 rows in set再度、テーブル
t_insertに1行のデータを挿入します。obclient(root@mysqltenant)[db1]> INSERT INTO t_insert(id,name) VALUES(4,'JP');トランザクションをコミットします。
obclient(root@mysqltenant)[db1]> COMMIT;現在のログインを終了します。
obclient(root@mysqltenant)[db1]> exit;データベースに再ログインします。
obclient -h127.0.0.1 -ur**t@mysqltenant -P2881 -p****** -Ddb1再度、テーブル
t_insertのデータを確認します。テーブルt_insertのデータの変更が正常に永続化されたことが確認できます。obclient(root@mysqltenant)[db1]> SELECT * FROM t_insert;実行結果は次のとおりです:
+------+------+-------+---------------------+ | id | name | value | gmt_create | +------+------+-------+---------------------+ | 1 | CN | 10001 | 2025-11-07 17:46:35 | | 2 | US | 10002 | 2025-11-07 17:46:35 | | 3 | EN | 10003 | 2025-11-07 17:46:35 | | 4 | JP | NULL | 2025-11-07 17:46:53 | +------+------+-------+---------------------+ 4 rows in set
トランザクション制御ステートメントの詳細については、トランザクション管理の概要を参照してください。
トランザクションのロールバック
ROLLBACK ステートメントを使用してトランザクションをロールバックします。
トランザクションをロールバックとは、トランザクションによる変更をすべて取り消すことです。未コミットのトランザクション全体をロールバックすることも、トランザクション内の任意のセーブポイントまでロールバックすることもできます。特定のセーブポイントまでロールバックする場合は、ROLLBACK と TO SAVEPOINT のステートメントを組み合わせて使用する必要があります。 その中で:
トランザクション全体をロールバックする場合:
- トランザクションは終了します。
- すべての変更は破棄されます。
- すべてのセーブポイントはクリアされます。
- トランザクションが保持するすべてのロックが解除されます。
特定のセーブポイントまでロールバックする場合:
- トランザクションは終了しません。
- セーブポイント以前の変更は保持され、セーブポイント以降の変更は破棄されます。
- 指定したセーブポイント以降のセーブポイント(指定したセーブポイント自身は除く)はクリアされます。
- 指定したセーブポイント以降にトランザクションが保持するすべてのロックが解除されます。
例:トランザクションのすべての変更をロールバックします。
変更前のテーブル
t_insertのデータを確認します。obclient(root@mysqltenant)[db1]> SELECT * FROM t_insert;実行結果は次のとおりです:
+------+------+-------+---------------------+ | id | name | value | gmt_create | +------+------+-------+---------------------+ | 1 | CN | 10001 | 2025-11-07 17:46:35 | | 2 | US | 10002 | 2025-11-07 17:46:35 | | 3 | EN | 10003 | 2025-11-07 17:46:35 | +------+------+-------+---------------------+ 3 rows in setトランザクションを開始します。
obclient(root@mysqltenant)[db1]> BEGIN;テーブル
t_insertに複数行のデータを挿入します。obclient(root@mysqltenant)[db1]> INSERT INTO t_insert(id, name, value) VALUES(4,'JP',10004),(5,'FR',10005),(6,'RU',10006);変更後のテーブル
t_insertのデータを確認します。データが正常に挿入されたことが確認できます。obclient(root@mysqltenant)[db1]> SELECT * FROM t_insert;実行結果は次のとおりです:
+------+------+-------+---------------------+ | id | name | value | gmt_create | +------+------+-------+---------------------+ | 1 | CN | 10001 | 2025-11-07 17:46:35 | | 2 | US | 10002 | 2025-11-07 17:46:35 | | 3 | EN | 10003 | 2025-11-07 17:46:35 | | 4 | JP | 10004 | 2025-11-07 17:48:01 | | 5 | FR | 10005 | 2025-11-07 17:48:01 | | 6 | RU | 10006 | 2025-11-07 17:48:01 | +------+------+-------+---------------------+ 6 rows in setトランザクションをロールバックします。
obclient(root@mysqltenant)[db1]> ROLLBACK;ロールバック後、再度テーブル
t_insertのデータを確認すると、挿入したデータがロールバックされていることが確認できます。obclient(root@mysqltenant)[db1]> SELECT * FROM t_insert;実行結果は次のとおりです:
+------+------+-------+---------------------+ | id | name | value | gmt_create | +------+------+-------+---------------------+ | 1 | CN | 10001 | 2025-11-07 17:46:35 | | 2 | US | 10002 | 2025-11-07 17:46:35 | | 3 | EN | 10003 | 2025-11-07 17:46:35 | +------+------+-------+---------------------+ 3 rows in set
トランザクション制御ステートメントの詳細については、トランザクション管理の概要を参照してください。