この記事では、OceanBaseデータベースのMySQLモードにおける基本的なSQL操作について説明します。
データベースの作成
CREATE DATABASE文を使用してデータベースを作成します。
例:文字セットをutf8mb4とし、読み書き属性を付与したデータベースdb1を作成します。
obclient> CREATE DATABASE db1 DEFAULT CHARACTER SET utf8mb4 READ WRITE;
Query OK, 1 row affected
CREATE DATABASE文に関する構文の詳細については、CREATE DATABASEの章を参照してください。
作成後は、SHOW DATABASESコマンドを使用して、現在のデータベースサーバー上のすべてのデータベースを確認できます。
obclient> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| oceanbase |
| db1 |
| test |
+--------------------+
3 rows in set
テーブルの操作
OceanBaseデータベースにおいて、テーブルは最も基本的なデータ格納単位であり、ユーザーがアクセスできる全てのデータを含んでいます。各テーブルは複数の行(レコード)で構成され、各レコードは複数の列(カラム)で構成されます。このセクションでは、データベースにおけるテーブルの作成、表示、変更、削除の構文と使用例を解説します。
テーブルの作成
CREATE TABLE文を使用して、データベースに新しいテーブルを作成します。
例:データベースdb1にテーブルtestを作成します。
obclient> USE db1;
Database changed
obclient> CREATE TABLE test (c1 INT PRIMARY KEY, c2 VARCHAR(3));
Query OK, 0 rows affected
CREATE TABLE文に関する構文の詳細については、CREATE TABLEを参照してください。
テーブルの確認
SHOW CREATE TABLE文を使用して、テーブル作成文を確認します。
例:
テーブル
testの作成文を確認します。obclient> 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`) ) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 1 row in setSHOW TABLES文を使用して、db1データベース内のすべてのテーブルを確認します。obclient> SHOW TABLES FROM db1; +---------------+ | Tables_in_db1 | +---------------+ | test | +---------------+ 1 row in set
テーブルの変更
ALTER TABLE文を使用して、既存のテーブルの構造を変更します。これには、テーブルおよびテーブル属性の変更、列の追加、列および属性の変更、列の削除などが含まれます。
例:
テーブル
testの列c2をc3に改名し、同時に関連するデータ型も変更します。obclient> DESCRIBE test; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | c1 | int(11) | NO | PRI | NULL | | | c2 | varchar(3) | YES | | NULL | | +-------+------------+------+-----+---------+-------+ 2 rows in set obclient> ALTER TABLE test CHANGE COLUMN c2 c3 CHAR(10); Query OK, 0 rows affected obclient> DESCRIBE test; +-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | c1 | int(11) | NO | PRI | NULL | | | c3 | char(10) | YES | | NULL | | +-------+----------+------+-----+---------+-------+ 2 rows in setテーブル
testに列を追加、および削除します。obclient> DESCRIBE test; +-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | c1 | int(11) | NO | PRI | NULL | | | c3 | char(10) | YES | | NULL | | +-------+----------+------+-----+---------+-------+ 2 rows in set obclient> ALTER TABLE test ADD c4 int; Query OK, 0 rows affected obclient> 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 obclient> ALTER TABLE test DROP c3; Query OK, 0 rows affected obclient> 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> DROP TABLE test;
Query OK, 0 rows affected
DROP TABLE文に関する構文の詳細については、DROP TABLE の章を参照してください。
インデックスの操作
インデックスは、テーブル上に作成されて、データベーステーブルの一列または複数列の値を並べ替えたものです。その主な役割は、クエリの速度を向上させ、データベースシステムのパフォーマンス負荷を低減することにあります。このセクションでは、主にデータベースにおける索引の作成、参照、削除の構文と使用例を紹介します。
インデックスの作成
CREATE INDEX文を使用して、テーブルのインデックスを作成します。
例:テーブルtestにインデックスを作成します。
obclient> DESCRIBE test;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| c1 | int(11) | NO | PRI | NULL | |
| c2 | char(3) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
2 rows in set
obclient> CREATE INDEX test_index ON test (c1, c2);
Query OK, 0 rows affected
CREATE INDEX文に関する構文の詳細については、CREATE INDEXを参照してください。
インデックスの確認
SHOW INDEX文を使用して、テーブルのインデックスを確認します。
例:テーブルtestのインデックス情報を確認します。
obclient> 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
*************************** 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
*************************** 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
3 rows in set
インデックスの削除
DROP INDEX文を使用して、テーブルのインデックスを削除します。
例:テーブルtestのインデックスを削除します。
obclient> DROP INDEX test_index ON test;
Query OK, 0 rows affected
DROP INDEX文に関する構文の詳細については、DROP INDEXを参照してください。
データの挿入
INSERT文を使用して、既存のテーブルにデータを挿入します。
例:
テーブル
t1を作成し、1行のデータを挿入します。obclient> CREATE TABLE t1(c1 INT PRIMARY KEY, c2 int) PARTITION BY KEY(c1) PARTITIONS 4; Query OK, 0 rows affected obclient> SELECT * FROM t1; Empty set obclient> INSERT t1 VALUES(1,1); Query OK, 1 row affected obclient> SELECT * FROM t1; +----+------+ | c1 | c2 | +----+------+ | 1 | 1 | +----+------+ 1 row in setテーブル
t1に複数行のデータを挿入します。obclient> INSERT t1 VALUES(2,2),(3,default),(2+2,3*4); Query OK, 3 rows affected Records: 3 Duplicates: 0 Warnings: 0 obclient> SELECT * FROM t1; +----+------+ | c1 | c2 | +----+------+ | 1 | 1 | | 2 | 2 | | 3 | NULL | | 4 | 12 | +----+------+ 4 rows in set
INSERT文に関する構文の詳細については、INSERTを参照してください。
データの削除
DELETE文を使用して、データを削除します。単一テーブルおよび複数テーブルからのデータ削除をサポートしています。
例:
CREATE TABLEを使用して、テーブルt2とt3を作成します。テーブルt2のPRIMARY KEYであるc1列において、値が2の行を削除します。/*テーブルt3はKEYパーティションテーブルであり、パーティション名はシステムの命名規則に基づいて自動的に生成され、p0、p1、p2、p3となります*/ obclient> CREATE TABLE t2(c1 INT PRIMARY KEY, c2 INT); Query OK, 0 rows affected obclient> INSERT t2 VALUES(1,1),(2,2),(3,3),(5,5); Query OK, 4 rows affected Records: 4 Duplicates: 0 Warnings: 0 obclient> SELECT * FROM t2; +----+------+ | c1 | c2 | +----+------+ | 1 | 1 | | 2 | 2 | | 3 | 3 | | 5 | 5 | +----+------+ 4 rows in set obclient> CREATE TABLE t3(c1 INT PRIMARY KEY, c2 INT) PARTITION BY KEY(c1) PARTITIONS 4; Query OK, 0 rows affected obclient> INSERT INTO t3 VALUES(5,5),(1,1),(2,2),(3,3); Query OK, 4 rows affected Records: 4 Duplicates: 0 Warnings: 0 obclient> SELECT * FROM t3; +----+------+ | c1 | c2 | +----+------+ | 5 | 5 | | 1 | 1 | | 2 | 2 | | 3 | 3 | +----+------+ 4 rows in set obclient> DELETE FROM t2 WHERE c1 = 2; Query OK, 1 row affected obclient> SELECT * FROM t2; +----+------+ | c1 | c2 | +----+------+ | 1 | 1 | | 3 | 3 | | 5 | 5 | +----+------+ 3 rows in setテーブル
t2をc2列で並べ替え、先頭の行のデータを削除します。obclient> DELETE FROM t2 ORDER BY c2 LIMIT 1; Query OK, 1 row affected obclient> SELECT * FROM t2; +----+------+ | c1 | c2 | +----+------+ | 3 | 3 | | 5 | 5 | +----+------+ 2 rows in setテーブル
t3から、パーティションp2のデータを削除します。obclient> SELECT * FROM t3 PARTITION(p2); +----+------+ | c1 | c2 | +----+------+ | 1 | 1 | | 2 | 2 | | 3 | 3 | +----+------+ 3 rows in set obclient> DELETE FROM t3 PARTITION(p2); Query OK, 3 rows affected obclient> SELECT * FROM t3; +----+------+ | c1 | c2 | +----+------+ | 5 | 5 | +----+------+ 1 row in sett2、t3テーブルから、t2.c1 = t3.c1であるデータを削除します。obclient> SELECT * FROM t2; +----+------+ | c1 | c2 | +----+------+ | 3 | 3 | | 5 | 5 | +----+------+ 2 rows in set obclient> SELECT * FROM t3; +----+------+ | c1 | c2 | +----+------+ | 5 | 5 | +----+------+ obclient> DELETE t2, t3 FROM t2, t3 WHERE t2.c1 = t3.c1; Query OK, 3 rows affected /*下記と等価です obclient> DELETE FROM t2, t3 USING t2, t3 WHERE t2.c1 = t3.c1; */ obclient> SELECT * FROM t2; +----+------+ | c1 | c2 | +----+------+ | 3 | 3 | +----+------+ 1 row in set obclient> SELECT * FROM t3; Empty set
DELETE文に関する構文の詳細については、DELETEを参照してください。
データの更新
UPDATE文を使用して、テーブル内のフィールド値を変更します。
例:
CREATE TABLEを使用してテーブルt4およびt5を作成し、テーブルt4のうちt4.c1 = 10にあたる行のc2列の値を100に変更します。obclient> CREATE TABLE t4(c1 INT PRIMARY KEY, c2 INT); Query OK, 0 rows affected obclient> INSERT t4 VALUES(10,10),(20,20),(30,30),(40,40); Query OK, 4 rows affected Records: 4 Duplicates: 0 Warnings: 0 obclient> SELECT * FROM t4; +----+------+ | c1 | c2 | +----+------+ | 10 | 10 | | 20 | 20 | | 30 | 30 | | 40 | 40 | +----+------+ 4 rows in set obclient> CREATE TABLE t5(c1 INT PRIMARY KEY, c2 INT) PARTITION BY KEY(c1) PARTITIONS 4; Query OK, 0 rows affected obclient> INSERT t5 VALUES(50,50),(10,10),(20,20),(30,30); Query OK, 4 rows affected Records: 4 Duplicates: 0 Warnings: 0 obclient> SELECT * FROM t5; +----+------+ | c1 | c2 | +----+------+ | 20 | 20 | | 10 | 10 | | 50 | 50 | | 30 | 30 | +----+------+ 4 rows in set obclient> UPDATE t4 SET t4.c2 = 100 WHERE t4.c1 = 10; Query OK, 1 row affected Rows matched: 1 Changed: 1 Warnings: 0 obclient> SELECT * FROM t4; +----+------+ | c1 | c2 | +----+------+ | 10 | 100 | | 20 | 20 | | 30 | 30 | | 40 | 40 | +----+------+ 4 rows in setテーブル
t4のc2列で並べ替えた先頭2行について、c2列の値を100に変更します。obclient> UPDATE t4 set t4.c2 = 100 ORDER BY c2 LIMIT 2; Query OK, 2 rows affected Rows matched: 2 Changed: 2 Warnings: 0 obclient> SELECT * FROM t4; +----+------+ | c1 | c2 | +----+------+ | 10 | 100 | | 20 | 100 | | 30 | 100 | | 40 | 40 | +----+------+ 4 rows in setテーブル
t5のp1パーティションにあるデータのうち、t5.c1 > 20を満たす行のc2列の値を100に変更します。obclient> SELECT * FROM t5 PARTITION (p1); +----+------+ | c1 | c2 | +----+------+ | 10 | 10 | | 50 | 50 | +----+------+ 2 rows in set obclient> UPDATE t5 PARTITION(p1) SET t5.c2 = 100 WHERE t5.c1 > 20; Query OK, 1 row affected Rows matched: 1 Changed: 1 Warnings: 0 obclient> 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に変更します。obclient> UPDATE t4,t5 SET t4.c2 = 100, t5.c2 = 200 WHERE t4.c2 = t5.c2; Query OK, 1 row affected Rows matched: 4 Changed: 1 Warnings: 0 obclient> SELECT * FROM t4; +----+------+ | c1 | c2 | +----+------+ | 10 | 100 | | 20 | 100 | | 30 | 100 | | 40 | 40 | +----+------+ 4 rows in set obclient> 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のデータを読み取ります。obclient> CREATE TABLE t6 (id INT, name VARCHAR(50), num INT); Query OK, 0 rows affected obclient> INSERT INTO t6 VALUES(1,'a',100),(2,'b',200),(3,'a',50); Query OK, 3 rows affected Records: 3 Duplicates: 0 Warnings: 0 obclient> SELECT * FROM t6; +------+------+------+ | ID | NAME | NUM | +------+------+------+ | 1 | a | 100 | | 2 | b | 200 | | 3 | a | 50 | +------+------+------+ 3 rows in set obclient> SELECT name FROM t6; +------+ | NAME | +------+ | a | | b | | a | +------+ 3 rows in setクエリ結果から、
nameの重複を除外します。obclient> SELECT DISTINCT name FROM t6; +------+ | NAME | +------+ | a | | b | +------+ 2 rows in setテーブル
t6から、name = 'a'の条件に一致するid、name、numを取得します。obclient> 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文を使用して、トランザクションをコミットします。
トランザクションのコミット(COMMIT)前:
- 行った変更は、現在のセッションでのみ表示可能であり、他のデータベースセッションからは見えません。
- 変更内容は永続化されていませんので、ROLLBACK文を使用してロールバックすることができます。
トランザクションコミット(COMMIT)後:
- 行った変更は、すべてのデータベースセッションから参照可能になります。
- 変更は永続化に成功し、ROLLBACK 文を使用して元に戻すことはできません。
例:CREATE TABLE文を使用して、テーブルt_insertを作成します。COMMIT文を使用して、トランザクションをコミットします。
obclient> 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
);
Query OK, 0 rows affected
obclient> BEGIN;
Query OK, 0 rows affected
obclient> 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);
Query OK, 3 rows affected
Records: 3 Duplicates: 0 Warnings: 0
obclient> SELECT * FROM t_insert;
+----+------+-------+---------------------+
| id | name | value | gmt_create |
+----+------+-------+---------------------+
| 1 | CN | 10001 | 2022-08-22 16:19:26 |
| 2 | US | 10002 | 2022-08-22 16:19:26 |
| 3 | EN | 10003 | 2022-08-22 16:19:26 |
+----+------+-------+---------------------+
3 rows in set
obclient> INSERT INTO t_insert(id,name) VALUES(4,'JP');
Query OK, 1 row affected
obclient> COMMIT;
Query OK, 0 rows affected
obclient> exit;
Bye
obclient> obclient -h127.0.0.1 -ur**t@mysql -P2881 -p****** -Ddb1
obclient> SELECT * FROM t_insert;
+----+------+-------+---------------------+
| id | name | value | gmt_create |
+----+------+-------+---------------------+
| 1 | CN | 10001 | 2022-08-22 16:19:26 |
| 2 | US | 10002 | 2022-08-22 16:19:26 |
| 3 | EN | 10003 | 2022-08-22 16:19:26 |
| 4 | JP | NULL | 2022-08-22 16:21:39 |
+----+------+-------+---------------------+
4 rows in set
トランザクション制御文に関する詳細は、トランザクション管理の概要を参照してください。
トランザクションのロールバック
ROLLBACK文を使用して、トランザクションをロールバックします。
トランザクションのロールバックとは、トランザクションのすべての変更内容を取り消すことを意味します。コミットされていない現在のトランザクション全体をロールバックすることも、トランザクション内の任意のセーブポイントまで戻すことも可能です。特定のセーブポイントまでロールバックする場合は、ROLLBACK文とTO SAVEPOINT文を組み合わせて使用する必要があります。 ここで、
トランザクション全体をロールバックすると、以下のようになります:
- トランザクションが終了します
- すべての変更が破棄されます
- すべてのセーブポイントがクリアされます
- トランザクションが保持しているすべてのロックが解放されます
特定のセーブポイントまでロールバックすると、以下のようになります:
- トランザクションは終了しません
- セーブポイント以前に行った変更は保持され、セーブポイント以降に行った変更は破棄されます
- セーブポイント以降のセーブポイントが削除されます (そのセーブポイント自体は削除されません)
- セーブポイント設定後にトランザクションが確保したすべてのロックが解放されます。
例:トランザクションのすべての変更をロールバックします。
obclient> SELECT * FROM t_insert;
+----+------+-------+---------------------+
| id | name | value | gmt_create |
+----+------+-------+---------------------+
| 1 | CN | 10001 | 2022-08-22 16:19:26 |
| 2 | US | 10002 | 2022-08-22 16:19:26 |
| 3 | EN | 10003 | 2022-08-22 16:19:26 |
+----+------+-------+---------------------+
3 rows in set
obclient> BEGIN;
Query OK, 0 rows affected
obclient> INSERT INTO t_insert(id, name, value) VALUES(4,'JP',10004),(5,'FR',10005),(6,'RU',10006);
Query OK, 3 rows affected
Records: 3 Duplicates: 0 Warnings: 0
obclient> SELECT * FROM t_insert;
+----+------+-------+---------------------+
| id | name | value | gmt_create |
+----+------+-------+---------------------+
| 1 | CN | 10001 | 2022-08-22 16:19:26 |
| 2 | US | 10002 | 2022-08-22 16:19:26 |
| 3 | EN | 10003 | 2022-08-22 16:19:26 |
| 4 | JP | 10004 | 2022-08-22 16:26:23 |
| 5 | FR | 10005 | 2022-08-22 16:26:23 |
| 6 | RU | 10006 | 2022-08-22 16:26:23 |
+----+------+-------+---------------------+
6 rows in set
obclient> ROLLBACK;
Query OK, 0 rows affected
obclient> SELECT * FROM t_insert;
+----+------+-------+---------------------+
| id | name | value | gmt_create |
+----+------+-------+---------------------+
| 1 | CN | 10001 | 2022-08-22 16:19:26 |
| 2 | US | 10002 | 2022-08-22 16:19:26 |
| 3 | EN | 10003 | 2022-08-22 16:19:26 |
+----+------+-------+---------------------+
3 rows in set
トランザクション制御文に関する詳細は、トランザクション管理の概要を参照してください。