このセクションでは、OceanBaseデータベースのOracleモードにおける基本的なSQL操作について説明します。
機能の適用範囲
この内容はOceanBaseデータベースEnterprise Editionにのみ適用されます。OceanBaseデータベースCommunity EditionはMySQLモードのみを提供します。
テーブルの操作
このセクションでは、データベースにおけるテーブルの作成、表示、変更、削除の構文と使用例を説明します。
テーブルの作成
CREATE TABLE ステートメントを使用して、データベースに新しいテーブルを作成します。
例:テーブル TEST を作成します。
obclient(SYS@oracletenant)[SYS]> CREATE TABLE TEST (C1 INT PRIMARY KEY, C2 VARCHAR(3));
CREATE TABLE ステートメントの詳細な構文説明については、CREATE TABLEを参照してください。
テーブルの変更
ALTER TABLE ステートメントを使用して、既存のテーブルの構造を変更します。これには、テーブルやテーブル属性の変更、列の追加、列や属性の変更、列の削除などが含まれます。
例:
テーブル
TESTの列C2のデータ型を変更します。テーブル
TESTの列定義を確認します。obclient(SYS@oracletenant)[SYS]> DESCRIBE TEST;実行結果は次のとおりです:
+-------+-------------+------+-----+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+-------------+------+-----+---------+-------+ | C1 | NUMBER(38) | NO | PRI | NULL | NULL | | C2 | VARCHAR2(3) | YES | NULL| NULL | NULL | +-------+-------------+------+-----+---------+-------+ 2 rows in setテーブル
TEST内の列C2のデータ型をCHARに変更します。obclient(SYS@oracletenant)[SYS]> ALTER TABLE TEST MODIFY C2 CHAR(10);再度テーブル
TESTの列定義を確認し、変更が成功したことを確認します。obclient(SYS@oracletenant)[SYS]> DESCRIBE TEST;実行結果は次のとおりです:
+-------+------------+------+-----+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+------------+------+-----+---------+-------+ | C1 | NUMBER(38) | NO | PRI | NULL | NULL | | C2 | CHAR(10) | YES | NULL| NULL | NULL | +-------+------------+------+-----+---------+-------+ 2 rows in set
テーブル
TESTに列を追加および削除します。現在のテーブル
TESTの列定義を確認します。obclient(SYS@oracletenant)[SYS]> DESCRIBE TEST;実行結果は次のとおりです:
+-------+------------+------+-----+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+------------+------+-----+---------+-------+ | C1 | NUMBER(38) | NO | PRI | NULL | NULL | | C2 | CHAR(10) | YES | NULL| NULL | NULL | +-------+------------+------+-----+---------+-------+ 2 rows in setテーブル
TESTに列C3を追加します。obclient(SYS@oracletenant)[SYS]> ALTER TABLE TEST ADD C3 int;再度テーブル
TESTの列定義を確認し、列C3が正常に追加されたことを確認します。obclient(SYS@oracletenant)[SYS]> DESCRIBE TEST;実行結果は次のとおりです:
+-------+------------+------+-----+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+------------+------+-----+---------+-------+ | C1 | NUMBER(38) | NO | PRI | NULL | NULL | | C2 | CHAR(10) | YES | NULL | NULL | NULL | | C3 | NUMBER(38) | YES | NULL | NULL | NULL | +-------+------------+------+-----+---------+-------+ 3 rows in setテーブル
TESTから列C3を削除します。obclient(SYS@oracletenant)[SYS]> ALTER TABLE TEST DROP COLUMN C3;再度テーブル
TESTの列定義を確認し、列C3が正常に削除されたことを確認します。obclient(SYS@oracletenant)[SYS]> DESCRIBE TEST;実行結果は次のとおりです:
+-------+------------+------+-----+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+------------+------+-----+---------+-------+ | C1 | NUMBER(38) | NO | PRI | NULL | NULL | | C2 | CHAR(10) | YES | NULL | NULL | NULL | +-------+------------+------+-----+---------+-------+ 2 rows in set
ALTER TABLE ステートメントの詳細な構文説明については、ALTER TABLEを参照してください。
テーブルの削除
DROP TABLE ステートメントを使用してテーブルを削除します。
例:テーブル TEST を削除します。
obclient(SYS@oracletenant)[SYS]> DROP TABLE TEST;
DROP TABLE ステートメントの詳細な構文については、DROP TABLEを参照してください。
インデックス操作
インデックスはテーブルに作成され、データベーステーブルの1列または複数列の値をソートするための構造です。主な役割はクエリの速度を向上させ、データベースシステムのパフォーマンスオーバヘッドを低減することです。
インデックスの作成
CREATE INDEX ステートメントを使用して、テーブルのインデックスを作成します。
例:テーブル TEST のインデックスを作成します。
テーブル
TESTの列定義を確認します。obclient(SYS@oracletenant)[SYS]> DESCRIBE TEST;実行結果は次のとおりです:
+-------+------------+------+-----+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+------------+------+-----+---------+-------+ | C1 | NUMBER(38) | NO | PRI | NULL | NULL | | C2 | CHAR(10) | YES | NULL| NULL | NULL | +-------+------------+------+-----+---------+-------+ 2 rows in setテーブル
TESTのC1列とC2列に、TEST_INDEXという名前の複合インデックスを作成します。obclient(SYS@oracletenant)[SYS]> CREATE INDEX TEST_INDEX ON TEST (C1, C2);
CREATE INDEX ステートメントの詳細な構文説明については、CREATE INDEXを参照してください。
インデックスの確認
ビュー
ALL_INDEXESを使用して、テーブルのすべてのインデックスを確認します。obclient(SYS@oracletenant)[SYS]> SELECT OWNER,INDEX_NAME,INDEX_TYPE,TABLE_OWNER,TABLE_NAME FROM ALL_INDEXES WHERE table_name='TEST';実行結果は次のとおりです:
+-------+----------------------------+------------+-------------+------------+ | OWNER | INDEX_NAME | INDEX_TYPE | TABLE_OWNER | TABLE_NAME | +-------+----------------------------+------------+-------------+------------+ | SYS | TEST_OBPK_1762742804587195 | NORMAL | SYS | TEST | | SYS | TEST_INDEX | NORMAL | SYS | TEST | +-------+----------------------------+------------+-------------+------------+ 2 rows in setUSER_IND_COLUMNSを使用して、テーブルインデックスの詳細情報を確認します。obclient(SYS@oracletenant)[SYS]> SELECT * FROM USER_IND_COLUMNS WHERE table_name='TEST'\G実行結果は次のとおりです:
*************************** 1. row *************************** INDEX_NAME: TEST_OBPK_1762742804587195 TABLE_NAME: TEST COLUMN_NAME: C1 COLUMN_POSITION: 1 COLUMN_LENGTH: 22 CHAR_LENGTH: 0 DESCEND: ASC COLLATED_COLUMN_ID: NULL *************************** 2. row *************************** INDEX_NAME: TEST_INDEX TABLE_NAME: TEST COLUMN_NAME: C1 COLUMN_POSITION: 1 COLUMN_LENGTH: 22 CHAR_LENGTH: 0 DESCEND: ASC COLLATED_COLUMN_ID: NULL *************************** 3. row *************************** INDEX_NAME: TEST_INDEX TABLE_NAME: TEST COLUMN_NAME: C2 COLUMN_POSITION: 2 COLUMN_LENGTH: 3 CHAR_LENGTH: 3 DESCEND: ASC COLLATED_COLUMN_ID: NULL 3 rows in set
インデックスの削除
DROP INDEX ステートメントを使用して、テーブルのインデックスを削除します。
例:インデックス TEST_INDEX を削除します。
obclient(SYS@oracletenant)[SYS]> DROP INDEX TEST_INDEX;
DROP INDEX ステートメントの詳細な構文については、DROP INDEXを参照してください。
データの挿入
INSERT ステートメントを使用して、テーブルに1つまたは複数のレコードを追加します。
例:
CREATE TABLEを使用してテーブルT1を作成し、テーブルT1に1行のデータを挿入します。テーブル
t1を作成します。obclient(SYS@oracletenant)[SYS]> CREATE TABLE T1(C1 INT PRIMARY KEY, C2 INT);テーブル内のデータを確認します。
obclient(SYS@oracletenant)[SYS]> SELECT * FROM T1;クエリ結果は空で、テーブルにはデータがありません。
テーブル
T1に1行のデータを挿入します。obclient(SYS@oracletenant)[SYS]> INSERT INTO T1 VALUES(1,1);再度テーブル内のデータを確認し、1行のデータが正常に挿入されたことを確認します。
obclient(SYS@oracletenant)[SYS]> SELECT * FROM T1;実行結果は次のとおりです:
+----+------+ | C1 | C2 | +----+------+ | 1 | 1 | +----+------+ 1 row in set
サブクエリに直接データを挿入します。
obclient(SYS@oracletenant)[SYS]> INSERT INTO (SELECT * FROM T1) VALUES(2,2);実行が成功した後、テーブル内のデータを確認し、挿入が成功したことを確認します。
obclient(SYS@oracletenant)[SYS]> SELECT * FROM T1;実行結果は次のとおりです:
+----+------+ | C1 | C2 | +----+------+ | 1 | 1 | | 2 | 2 | +----+------+ 2 rows in setRETURNING句を含むデータの挿入。テーブル
T1に1行のデータを挿入し、挿入行のC1列のデータを返します。obclient(SYS@oracletenant)[SYS]> INSERT INTO T1 VALUES(3,3) RETURNING C1;実行結果は次のとおりです:
+----+ | C1 | +----+ | 3 | +----+ 1 row in set再度テーブル内のデータを確認し、挿入が成功したことを確認します。
obclient(SYS@oracletenant)[SYS]> SELECT * FROM T1;実行結果は次のとおりです:
+----+------+ | C1 | C2 | +----+------+ | 1 | 1 | | 2 | 2 | | 3 | 3 | +----+------+ 3 rows in set
INSERT ステートメントの詳細な構文については、INSERTを参照してください。
データの削除
DELETE ステートメントを使用してデータを削除します。
例:テーブル T1 から C1=2 の行を削除します。
データを削除する前に、テーブル
T1のデータを確認します。obclient(SYS@oracletenant)[SYS]> SELECT * FROM T1;実行結果は次のとおりです:
+----+------+ | C1 | C2 | +----+------+ | 1 | 1 | | 2 | 2 | | 3 | 3 | +----+------+ 3 rows in setテーブル
T1からC1=2の行を削除します。obclient(SYS@oracletenant)[SYS]> DELETE FROM T1 WHERE C1 = 2;データを削除した後、テーブル
T1のデータを確認します。obclient(SYS@oracletenant)[SYS]> SELECT * FROM T1;実行結果は次のとおりです:
+----+------+ | C1 | C2 | +----+------+ | 1 | 1 | | 3 | 3 | +----+------+ 2 rows in set
DELETE ステートメントの詳細な構文については、DELETEを参照してください。
データの更新
UPDATE ステートメントを使用して、テーブル内のフィールド値を変更します。
例:
テーブル
T1のT1.C1=1に対応する行のC2列の値を100に変更します。データ更新前のテーブル
T1のデータを確認します。obclient(SYS@oracletenant)[SYS]> SELECT * FROM T1;実行結果は次のとおりです:
+----+------+ | C1 | C2 | +----+------+ | 1 | 1 | | 3 | 3 | +----+------+ 2 rows in setテーブル
T1のT1.C1=1に対応する行のC2列の値を100に変更します。obclient(SYS@oracletenant)[SYS]> UPDATE T1 SET T1.C2 = 100 WHERE T1.C1 = 1;データ更新後のテーブル
T1のデータを確認します。obclient(SYS@oracletenant)[SYS]> SELECT * FROM T1;実行結果は次のとおりです:
+----+------+ | C1 | C2 | +----+------+ | 1 | 100 | | 3 | 3 | +----+------+ 2 rows in set
サブクエリを直接操作し、サブクエリ内の
V.C1=3に対応する行のC2列の値を300に変更します。obclient(SYS@oracletenant)[SYS]> UPDATE (SELECT * FROM T1) V SET V.C2 = 300 WHERE V.C1 = 3;ステートメントの実行が成功した後、データ更新後のテーブル
T1のデータを確認します。obclient(SYS@oracletenant)[SYS]> SELECT * FROM T1;実行結果は次のとおりです:
+----+------+ | C1 | C2 | +----+------+ | 1 | 100 | | 3 | 300 | +----+------+ 2 rows in set
UPDATE ステートメントの詳細な構文については、UPDATEを参照してください。
データのクエリ
SELECT ステートメントを使用して、テーブルの内容をクエリします。
例:
CREATE TABLEを使用してテーブルT2を作成します。テーブルT2からNAMEのデータを読み取ります。テーブル
t2を作成します。obclient(SYS@oracletenant)[SYS]> CREATE TABLE T2 (ID INT, NAME VARCHAR(50), NUM INT);テーブル
T2に複数行のデータを挿入します。obclient(SYS@oracletenant)[SYS]> INSERT INTO T2 VALUES(1,'a',100),(2,'b',200),(3,'a',50);テーブル
T2のデータを確認し、挿入が成功したことを確認します。obclient(SYS@oracletenant)[SYS]> SELECT * FROM T2;実行結果は次のとおりです:
+------+------+------+ | ID | NAME | NUM | +------+------+------+ | 1 | a | 100 | | 2 | b | 200 | | 3 | a | 50 | +------+------+------+ 3 rows in setテーブル
T2からフィールドNAMEのデータを読み取ります。obclient(SYS@oracletenant)[SYS]> SELECT NAME FROM T2;実行結果は次のとおりです:
+------+ | NAME | +------+ | a | | b | | a | +------+ 3 rows in set
クエリ結果で
NAMEの重複を除去します。obclient(SYS@oracletenant)[SYS]> SELECT DISTINCT NAME FROM T2;実行結果は次のとおりです:
+------+ | NAME | +------+ | a | | b | +------+ 2 rows in setテーブル
T2からフィルター条件NAME = 'a'に基づいて、対応するID、NAME、NUMを出力します。obclient(SYS@oracletenant)[SYS]> SELECT ID, NAME, NUM FROM T2 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(SYS@oracletenant)[SYS]> CREATE TABLE T_INSERT( ID NUMBER NOT NULL PRIMARY KEY, NAME VARCHAR(10) NOT NULL, VALUE NUMBER NOT NULL, GMT_CREATE DATE NOT NULL DEFAULT sysdate );テーブル
T_INSERTに複数行のデータを挿入します。obclient(SYS@oracletenant)[SYS]> INSERT INTO T_INSERT(ID, NAME, VALUE, GMT_CREATE) VALUES(1,'CN',10001, sysdate),(2,'US',10002, sysdate),(3,'EN',10003, sysdate);変更後のテーブル
T_INSERTのデータを確認し、データが正常に挿入されたことを確認します。obclient(SYS@oracletenant)[SYS]> SELECT * FROM T_INSERT;実行結果は次のとおりです:
+------+------+-------+------------+ | ID | NAME | VALUE | GMT_CREATE | +------+------+-------+------------+ | 1 | CN | 10001 | 10-NOV-25 | | 2 | US | 10002 | 10-NOV-25 | | 3 | EN | 10003 | 10-NOV-25 | +------+------+-------+------------+ 3 rows in set再度、テーブル
T_INSERTに1行のデータを挿入します。obclient(SYS@oracletenant)[SYS]> INSERT INTO T_INSERT(ID, NAME, VALUE) VALUES(4,'JP',10004);トランザクションをコミットします。
obclient(SYS@oracletenant)[SYS]> COMMIT;ログアウトします。
obclient(SYS@oracletenant)[SYS]> exit;データベースに再ログインします。
obclient -h127.0.0.1 -us**@oracletenant -P2881 -p******テーブル
T_INSERTのデータを確認し、テーブルT_INSERTのデータ変更が正常に永続化されたことを確認します。obclient(SYS@oracletenant)[SYS]> SELECT * FROM T_INSERT;実行結果は次のとおりです:
+------+------+-------+------------+ | ID | NAME | VALUE | GMT_CREATE | +------+------+-------+------------+ | 1 | CN | 10001 | 10-NOV-25 | | 2 | US | 10002 | 10-NOV-25 | | 3 | EN | 10003 | 10-NOV-25 | | 4 | JP | 10004 | 10-NOV-25 | +------+------+-------+------------+ 4 rows in set
トランザクション制御ステートメントの詳細については、トランザクション管理の概要を参照してください。
トランザクションのロールバック
ROLLBACK ステートメントを使用して、トランザクションをロールバックできます。
トランザクションのロールバックとは、トランザクションによる変更をすべて取り消すことです。未コミットのトランザクション全体をロールバックすることも、トランザクション内の任意のセーブポイントまでロールバックすることもできます。特定のセーブポイントまでロールバックする場合は、ROLLBACK と TO SAVEPOINT のステートメントを組み合わせて使用する必要があります。
具体的には:
トランザクション全体をロールバックする場合:
- トランザクションは終了します。
- すべての変更は破棄されます。
- すべてのセーブポイントはクリアされます。
- トランザクションが保持するすべてのロックが解放されます。
特定のセーブポイントまでロールバックする場合:
- トランザクションは終了しません。
- セーブポイント以前の変更は保持され、セーブポイント以降の変更は破棄されます。
- 指定したセーブポイント以降のセーブポイント(指定したセーブポイント自身は除く)はクリアされます。
- 指定したセーブポイント以降にトランザクションが保持するすべてのロックが解放されます。
例:トランザクションのすべての変更をロールバックします。
変更前のテーブル
T_INSERTのデータを確認します。obclient(SYS@oracletenant)[SYS]> SELECT * FROM T_INSERT;実行結果は次のとおりです:
+------+------+-------+------------+ | ID | NAME | VALUE | GMT_CREATE | +------+------+-------+------------+ | 1 | CN | 10001 | 10-NOV-25 | | 2 | US | 10002 | 10-NOV-25 | | 3 | EN | 10003 | 10-NOV-25 | | 4 | JP | 10004 | 10-NOV-25 | +------+------+-------+------------+ 4 rows in setテーブル
T_INSERTに2行のデータを挿入します。obclient(SYS@oracletenant)[SYS]> INSERT INTO T_INSERT(ID, NAME, VALUE) VALUES(5,'FR',10005),(6,'RU',10006);変更後のテーブル
T_INSERTのデータを確認し、データが正常に挿入されたことを確認します。obclient(SYS@oracletenant)[SYS]> SELECT * FROM T_INSERT;実行結果は次のとおりです:
+------+------+-------+------------+ | ID | NAME | VALUE | GMT_CREATE | +------+------+-------+------------+ | 1 | CN | 10001 | 10-NOV-25 | | 2 | US | 10002 | 10-NOV-25 | | 3 | EN | 10003 | 10-NOV-25 | | 4 | JP | 10004 | 10-NOV-25 | | 5 | FR | 10005 | 10-NOV-25 | | 6 | RU | 10006 | 10-NOV-25 | +------+------+-------+------------+ 6 rows in setトランザクションをロールバックします。
obclient(SYS@oracletenant)[SYS]> ROLLBACK;ロールバック後、再度テーブル
T_INSERTのデータを確認すると、挿入したデータがロールバックされていることが確認できます。obclient(SYS@oracletenant)[SYS]> SELECT * FROM T_INSERT;実行結果は次のとおりです:
+------+------+-------+------------+ | ID | NAME | VALUE | GMT_CREATE | +------+------+-------+------------+ | 1 | CN | 10001 | 10-NOV-25 | | 2 | US | 10002 | 10-NOV-25 | | 3 | EN | 10003 | 10-NOV-25 | | 4 | JP | 10004 | 10-NOV-25 | +------+------+-------+------------+ 4 rows in set
トランザクション制御ステートメントの詳細については、トランザクション管理の概要を参照してください。