Oracle - 基本操作
1. 接続
OS認証で接続
> sqlplus / as sydba
SQL*Plus: Release 19.0.0.0.0 - Production on 水 4月 16 23:12:06 2025
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
に接続されました。
SQL> show user
ユーザーは"SYS"です。
SYSユーザー(as sysdbaが必要)
> sqlplus sys/{password} as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on 水 4月 16 23:12:06 2025
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
に接続されました。
SQL> show user
ユーザーは"SYS"です。
SYSTEMユーザー
>sqlplus system/{password}
SQL*Plus: Release 19.0.0.0.0 - Production on 水 4月 16 23:18:59 2025
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
最終正常ログイン時間: 水 4月 16 2025 23:06:58 +09:00
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
に接続されました。
SQL> show user
ユーザーは"SYSTEM"です。
作成したユーザーから接続
>sqlplus {username}/{password}@{host}:{port}/{service_name}
2. ユーザーを作成
Cratee User
SQL> CREATE USER {username} -- ユーザー名を指定
IDENTIFIED BY {password} -- パスワードを指定
DEFAULT TABLESPACE users -- デフォルトの表領域
TEMPORARY TABLESPACE temp; -- 一時表領域
ユーザーが作成されました。
Drop User
-- ユーザーを削除する。CASCADEオプションは、ユーザーが所有するオブジェクトも削除することを意味します。
SQL> DROP USER {username} CASCADE;
ユーザーが削除されました。
アカウントをロック
SQL> ALTER USER {username} ACCOUNT LOCK; -- アカウントをロックする
SQL> ALTER USER {username} ACCOUNT UNLOCK; -- アカウントをロックを解除
パスワードを変更
SQL> ALTER USER {username} IDENTIFIED BY {new_password};
ユーザーが変更されました。
他のユーザーのオブジェクトへアクセス
-- dbuserから接続
-- 他のユーザー(dbuser2)のオブジェクトにアクセスするには、権限が必要です。
-- 例えば、SELECT権限が必要です。
SQL> select * from dbuser2.books;
接続先のコンテナ名
-- コンテナ名を表示する
SQL> show con_name
3.テーブルとデータ操作
テーブルを作成
SQL> CREATE TABLE {table_name} (
{column_name1} {data_type1} [{constraint1}],
{column_name2} {data_type2} [{constraint2}],
...
);
文字列を日付に変換
SQL> SELECT TO_DATE('2024-9-2 13:34:45', 'YYYY-MM-DD HH24:MI:SS') FROM DUAL;
TO_DATE(
--------
24-09-02
テーブル定義を確認
SQL> desc member
名前 NULL? 型
----------------------------------------- -------- ----------------------------
ID CHAR(4)
NAME VARCHAR2(16)
SALARY NUMBER(10)
データを追加
SQL> INSERT INTO {table_name} ({column1}, {column2}, ...)
VALUES ({value1}, {value2}, ...);
-- 例)
SQL>INSERT INTO MEMBER (ID, NAME, SALARY) VALUES ('A001', 'TRON', 100);
1行が作成されました。
SQL> COMMIT;
コミットが完了しました。
データを選択
-- 全てのデータを選択
SQL> SELECT * FROM {table_name};
-- 特定のカラムを選択
SQL> SELECT {column1}, {column2} FROM {table_name};
-- 条件を指定して選択
SQL> SELECT * FROM {table_name} WHERE {condition};
データを更新
SQL> UPDATE {table_name}
SET {column1} = {value1}, {column2} = {value2}, ...
WHERE {condition};
-- 例)
SQL> UPDATE MEMBER SET SALARY = 200 WHERE ID = 'A001';
1行が更新されました。
SQL> COMMIT;
コミットが完了しました。
データを削除
-- 条件を指定して削除
SQL> DELETE FROM {table_name} WHERE {condition};
-- 例)
SQL DELETE FROM MEMBER WHERE ID = 'A001';
1行が削除されました。
SQL> COMMIT;
コミットが完了しました。
テーブルを削除
-- テーブルを削除する。CASCADEオプションは、テーブルに関連する制約も削除することを意味します。
SQL> DROP TABLE {table_name} CASCADE CONSTRAINTS;
テーブルのデータを削除
-- テーブルのデータを削除する。テーブル自体は削除しない。
SQL> TRUNCATE TABLE {table_name};
-- 例)
SQL > TRUNCATE TABLE MEMBER;
カラムを追加
SQL> ALTER TABLE {table_name} ADD ({column_name} {data_type} [{constraint}]);
-- 例)
SQL> ALTER TABLE MEMBER ADD (AGE NUMBER(3), DEFAULT 0);
カラム定義を変更
SQL> ALTER TABLE {table_name} MODIFY ({column_name} {data_type} [{constraint}]);
-- 例)
SQL> ALTER TABLE MEMBER MODIFY (AGE NUMBER(5));
カラムを削除
SQL> ALTER TABLE {table_name} DROP COLUMN {column_name};
-- 例)
SQL> ALTER TABLE MEMBER DROP COLUMN AGE;
4.複雑な条件検索
列の表示を変える
-- 列の表示を変える
SQL> COLUMN {column_name} FORMAT {format};
結果をソートする
-- 結果をソートする, ASCは昇順、DESCは降順を意味します。
SQL> SELECT * FROM {table_name} ORDER BY {column1} ASC|DESC, {column2} ASC|DESC;
特定のカラムを条件にして選択
SQL> SELECT {column1}, {column2} FROM {table_name} WHERE {column1} = {value1};
範囲を指定して選択
SQL> SELECT * FROM {table_name} WHERE {column1} BETWEEN {value1} AND {value2};
値のリストを指定して選択
SQL> SELECT * FROM {table_name} WHERE {column1} IN ({value1}, {value2}, ...);
LIKEを使用して部分一致検索
SQL> SELECT * FROM {table_name} WHERE {column1} LIKE '%{value}%';
NULLを含むデータを選択
SQL> SELECT * FROM {table_name} WHERE {column1} IS NULL;
NULLを含まないデータを選択
SQL> SELECT * FROM {table_name} WHERE {column1} IS NOT NULL;
AND条件を指定して選択
SQL> SELECT * FROM {table_name} WHERE {column1} = {value1} AND {column2} = {value2};
OR条件を指定して選択
SQL> SELECT * FROM {table_name} WHERE {column1} = {value1} OR {column2} = {value2};
NOT条件を指定して選択
SQL> SELECT * FROM {table_name} WHERE NOT {column1} = {value1};
5.データを加工、集計
データを加工して選択
SQL> SELECT {function}({column1}) FROM {table_name};
-- 例)
SQL> SELECT LOWER(DNAME) FROM DEPT;
集計関数を使用して選択
-- 行数をカウント(*はNULLを含む、カラム指定はNULLを除外する)
SQL> SELECT COUNT(*) FROM {table_name};
-- 合計を計算(集計関数はNULLを除外する)
SQL> SELECT SUM({column1}) FROM {table_name};
グループ化して集計
-- グループ化して集計する。GROUP BY句を使用します。
SQL> SELECT {column1}, COUNT(*) FROM {table_name} GROUP BY {column1};
-- HAVING句を使用して、グループ化した結果に条件を指定することもできます。
SQL> SELECT {column1}, COUNT(*) FROM {table_name} GROUP BY {column1} HAVING COUNT(*) > {value};
グループ化して集計(複数のカラム)
SQL> SELECT {column1}, {column2}, COUNT(*) FROM {table_name} GROUP BY {column1}, {column2};
グループ化して集計(複数のカラム、条件付き)
SQL> SELECT {column1}, {column2}, COUNT(*) FROM {table_name} WHERE {condition} GROUP BY {column1}, {column2};
グループ化して集計(複数のカラム、条件付き、HAVING句)
SQL> SELECT {column1}, {column2}, COUNT(*) FROM {table_name} WHERE {condition} GROUP BY {column1}, {column2} HAVING COUNT(*) > {value};
グループ化して集計(複数のカラム、条件付き、HAVING句、ORDER BY句)
SQL> SELECT {column1}, {column2}, COUNT(*) FROM {table_name} WHERE {condition} GROUP BY {column1}, {column2} HAVING COUNT(*) > {value} ORDER BY {column1}, {column2};
グループ化して集計(複数のカラム、条件付き、HAVING句、ORDER BY句、LIMIT句)
SQL> SELECT {column1}, {column2}, COUNT(*) FROM {table_name} WHERE {condition} GROUP BY {column1}, {column2} HAVING COUNT(*) > {value} ORDER BY {column1}, {column2} LIMIT {value};
グループ化して集計(複数のカラム、条件付き、HAVING句、ORDER BY句、LIMIT句、OFFSET句)
SQL> SELECT {column1}, {column2}, COUNT(*) FROM {table_name} WHERE {condition} GROUP BY {column1}, {column2} HAVING COUNT(*) > {value} ORDER BY {column1}, {column2} LIMIT {value} OFFSET {value};
グループ化して集計(複数のカラム、条件付き、HAVING句、ORDER BY句、LIMIT句、OFFSET句、DISTINCT句)
SQL> SELECT DISTINCT {column1}, {column2}, COUNT(*) FROM {table_name} WHERE {condition} GROUP BY {column1}, {column2} HAVING COUNT(*) > {value} ORDER BY {column1}, {column2} LIMIT {value} OFFSET {value};
グループ化して集計(複数のカラム、条件付き、HAVING句、ORDER BY句、LIMIT句、OFFSET句、DISTINCT句、UNION句)
SQL> SELECT DISTINCT {column1}, {column2}, COUNT(*) FROM {table_name} WHERE {condition} GROUP BY {column1}, {column2} HAVING COUNT(*) > {value} ORDER BY {column1}, {column2} LIMIT {value} OFFSET {value} UNION SELECT DISTINCT {column1}, {column2}, COUNT(*) FROM {table_name} WHERE {condition} GROUP BY {column1}, {column2} HAVING COUNT(*) > {value} ORDER BY {column1}, {column2} LIMIT {value} OFFSET {value};
グループ化して集計(複数のカラム、条件付き、HAVING句、ORDER BY句、LIMIT句、OFFSET句、DISTINCT句、UNION ALL句)
SQL> SELECT DISTINCT {column1}, {column2}, COUNT(*) FROM {table_name} WHERE {condition} GROUP BY {column1}, {column2} HAVING COUNT(*) > {value} ORDER BY {column1}, {column2} LIMIT {value} OFFSET {value} UNION ALL SELECT DISTINCT {column1}, {column2}, COUNT(*) FROM {table_name} WHERE {condition} GROUP BY {column1}, {column2} HAVING COUNT(*) > {value} ORDER BY {column1}, {column2} LIMIT {value} OFFSET {value};
外部結合:INNER JOINは、両方のテーブルの一致する行を取得します。
SQL> SELECT {column1}, {column2} FROM {table_name1} INNER JOIN {table_name2} ON {table_name1}.{column1} = {table_name2}.{column1};
外部結合:LEFT JOINは、左側のテーブルの全ての行を取得し、右側のテーブルの一致する行を取得します。
SQL> SELECT {column1}, {column2} FROM {table_name1} LEFT JOIN {table_name2} ON {table_name1}.{column1} = {table_name2}.{column1};
外部結合: CROSS JOINは、両方のテーブルの全ての行を取得します。
SQL> SELECT {column1}, {column2} FROM {table_name1} CROSS JOIN {table_name2};
存在チェック
SQL>select case
when exists (select 1 from emp where JOB = 'CLERK')
then 'true'
else 'false'
end as Result
from dual;
6.トランザクション制御
コミット
-- トランザクションをコミットする。データベースに変更を保存します。
SQL> COMMIT;
ロールバック
-- トランザクションをロールバックする。データベースの変更を元に戻します。
SQL> ROLLBACK;
7.インデックス
インデックスを作成
SQL> CREATE INDEX {index_name} ON {table_name} ({column1}, {column2}, ...);
インデックスを削除
SQL> DROP INDEX {index_name};
インデックスを表示
SQL> SELECT INDEX_NAME, TABLE_OWNER,TABLE_NAME,STATUS FROM USER_INDEXES WHERE TABLE_NAME = 'EMP';
インデックスを有効化
SQL> ALTER INDEX {index_name} ENABLE;
インデックスを無効化
SQL> ALTER INDEX {index_name} DISABLE;
インデックスを再構築
SQL> ALTER INDEX {index_name} REBUILD;
8.ビュー
ビューを作成
SQL> CREATE VIEW {view_name} AS SELECT {column1}, {column2} FROM {table_name} WHERE {condition};
9.制約
テーブル作成時に制約を指定
SQL> CREATE TABLE EMP (
ID NUMBER(4) PRIMARY KEY, -- 主キー制約
NAME VARCHAR2(20) NOT NULL, -- NOT NULL制約
SALARY NUMBER(10, 2) CHECK (SALARY > 0), -- CHECK制約
DEPT_ID NUMBER(4) REFERENCES DEPT(ID) -- 外部キー制約
);
主キー制約
SQL> ALTER TABLE {table_name} ADD CONSTRAINT {constraint_name} PRIMARY KEY ({column1}, {column2}, ...);
-- 例)
SQL> ALTER TABLE MEMBER ADD CONSTRAINT PK_MEMBER PRIMARY KEY (ID);
NOT NULL制約
-- NULLを許可しない
SQL> ALTER TABLE {table_name} ADD CONSTRAINT {constraint_name} NOT NULL ({column1}, {column2}, ...);
-- 例)
SQL> ALTER TABLE MEMBER ADD CONSTRAINT NN_MEMBER NOT NULL (ID, NAME);
-- NULLを許可しない(変更)
SQL> ALTER TABLE {table_name} MODIFY {column_name} NOT NULL;
-- NULLを許可する(変更)
SQL> ALTER TABLE {table_name} MODIFY {column_name} NULL;
一意制約
SQL> ALTER TABLE {table_name} ADD CONSTRAINT {constraint_name} UNIQUE ({column1}, {column2}, ...);
-- 例)
SQL> ALTER TABLE MEMBER ADD CONSTRAINT UQ_MEMBER UNIQUE (ID);
外部キー制約
SQL> ALTER TABLE {table_name} ADD CONSTRAINT {constraint_name} FOREIGN KEY ({column1}, {column2}, ...) REFERENCES {referenced_table} ({referenced_column1}, {referenced_column2}, ...);
-- 例)
SQL> ALTER TABLE MEMBER ADD CONSTRAINT FK_MEMBER FOREIGN KEY (ID) REFERENCES EMP (ID);
CHECK制約
SQL> ALTER TABLE {table_name} ADD CONSTRAINT {constraint_name} CHECK ({condition});
-- 例)
SQL> ALTER TABLE MEMBER ADD CONSTRAINT CK_MEMBER CHECK (SALARY > 0);
制約を削除
SQL> ALTER TABLE {table_name} DROP CONSTRAINT {constraint_name};
-- 例)
SQL> ALTER TABLE MEMBER DROP CONSTRAINT PK_MEMBER;
10.シーケンスの使用
シーケンスを作成
SQL> CREATE SEQUENCE {sequence_name}
START WITH {start_value} -- 開始値
INCREMENT BY {increment_value} -- 増分値
MINVALUE {min_value} -- 最小値
MAXVALUE {max_value} -- 最大値
CYCLE; -- 循環するかどうか
-- 例)
SQL> CREATE SEQUENCE EMP_SEQ
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9999
CYCLE;
シーケンスを使用してデータを挿入
SQL> INSERT INTO EMP (ID, NAME, SALARY, DEPT_ID) VALUES (EMP_SEQ.NEXTVAL, 'TRON', 1000, 1);
シーケンスの値を取得
SQL> SELECT EMP_SEQ.NEXTVAL FROM DUAL;
シーケンスの値を取得(前回の値を取得)
SQL> SELECT EMP_SEQ.CURRVAL FROM DUAL;
シーケンスを削除
SQL> DROP SEQUENCE {sequence_name};
-- 例)
SQL> DROP SEQUENCE EMP_SEQ;
シーケンスの情報を表示(特定のスキーマのシーケンス)
SQL> SELECT SEQUENCE_NAME, MIN_VALUE, MAX_VALUE, INCREMENT_BY, CYCLE_FLAG FROM ALL_SEQUENCES WHERE SEQUENCE_OWNER = '{schema_name}';
-- 例)
SQL> SELECT SEQUENCE_NAME, MIN_VALUE, MAX_VALUE, INCREMENT_BY, CYCLE_FLAG FROM ALL_SEQUENCES WHERE SEQUENCE_OWNER = 'HR';
権限
システム権限の付与
SQL> GRANT {privilege} TO {username};
-- 例)
SQL> GRANT CREATE TABLE TO HR;
システム権限の剥奪
SQL> REVOKE {privilege} FROM {username};
-- 例)
SQL> REVOKE CREATE TABLE FROM HR;
オブジェクト権限の付与
SLQ> GRANT {privilege} ON {object} TO {username};
-- 例)
SQL> GRANT SELECT ON SCOT.EMP TO HR;
オブジェクト権限の剥奪
SQL> REVOKE {privilege} ON {object} FROM {username};
-- 例)
SQL> REVOKE SELECT ON SCOT.EMP FROM HR;
ロールへのシステム権限の付与
SQL> GRANT {privilege} TO {role};
-- 例)
SQL> GRANT CREATE TABLE TO HR_ROLE;
ロールへのオブジェクト権限の付与
SQL> GRANT {role} TO {username};
-- 例)
SQL> GRANT DBA TO HR;
ロールからオブジェクト権限の剥奪
SQL> REVOKE {role} FROM {username};
-- 例)
SQL> REVOKE DBA FROM HR;