データ操作言語(DML)文(Data Manipulation Language (DML) Statements)について

データ操作言語(DML)文は、既存の表にあるデータにアクセスして操作できます。

SQL*Plus環境では、SQL>プロンプトの後にDML文を入力できます。

SQL Developer環境では、ワークシートにDML文を入力できます。または、SQL Developerの「接続」フレームとツールを使用して、データにアクセスして操作することもできます。

SQL DeveloperでDML文の結果を確認するには、「接続」フレームで変更されたオブジェクトのスキーマ・オブジェクト・タイプを選択して、「リフレッシュ」アイコンをクリックします。

DML文の結果は、この文を含むトランザクションをコミットするまで永続的なものではありません。トランザクションとはOracle Databaseが単一の単位として扱う一連のSQL文である(1つのDML文と見なされます)。コミットしなければトランザクションはロール・バック(取消し)できます。トランザクションの詳細は、『トランザクション制御文について』を参照してください。

関連項目: DML文の詳細は『Oracle Database SQL言語リファレンス』を参照してください。

INSERT文について

INSERT文は、既存の表に行を挿入します。

INSERT文の最も単純な推奨形式は次の構文になります。

INSERT INTO table_name (list_of_columns)
VALUES (list_of_values);

list_of_columnsのすべての列には、list_of_valuesの対応する場所に有効な値が必要です。このため、表に行を挿入する前に、表にある列とその値を確認する必要があります。SQL Developerを使用してこの情報を取得するには、チュートリアル: SQL Developerを使用したEMPLOYEES表のプロパティとデータの表示を参照してください。SQL*Plusを使用してこうした情報を取得するには、DESCRIBE文を使用します。たとえば:

DESCRIBE EMPLOYEES;

結果:

Name                                      Null?    Type
----------------------------------------- -------- ------------

EMPLOYEE_ID                               NOT NULL NUMBER(6)
FIRST_NAME                                         VARCHAR2(20)
LAST_NAME                                 NOT NULL VARCHAR2(25)
EMAIL                                     NOT NULL VARCHAR2(25)
PHONE_NUMBER                                       VARCHAR2(20)
HIRE_DATE                                 NOT NULL DATE
JOB_ID                                    NOT NULL VARCHAR2(10)
SALARY                                             NUMBER(8,2)
COMMISSION_PCT                                     NUMBER(2,2)
MANAGER_ID                                         NUMBER(6)
DEPARTMENT_ID                                      NUMBER(4)

例3-1のINSERT文では、すべての列の値がわかっている従業員として、EMPLOYEES表に行を挿入します。

表に行を挿入するためにすべての列の値を認識する必要はありませんが、NOT NULL列の値はすべて認識する必要があります。NULLにできる列の値がわからない場合は、list_of_columnsからその列を除外できます。デフォルト値はNULLです。

例3-2のINSERT文では、SALARYを除くすべての列の値がわかっている従業員として、EMPLOYEES表に行挿入します。現在、SALARYの値はNULLになっています。給与がわかった際、UPDATE文で変更できます(例3-4を参照)。

例3-3のINSERT文では、LAST_NAMEが不明な従業員として、EMPLOYEES表に行を挿入しようとしています。

例3-1 すべての情報が使用できる場合でのINSERT文の使用

INSERT INTO EMPLOYEES (
  EMPLOYEE_ID,
  FIRST_NAME,
  LAST_NAME,
  EMAIL,
  PHONE_NUMBER,
  HIRE_DATE,
  JOB_ID,
  SALARY,
  COMMISSION_PCT,
  MANAGER_ID,
  DEPARTMENT_ID
)
VALUES (
  10,              -- EMPLOYEE_ID
  'George',        -- FIRST_NAME
  'Gordon',        -- LAST_NAME
  'GGORDON',       -- EMAIL
  '650.506.2222',  -- PHONE_NUMBER
  '01-JAN-07',     -- HIRE_DATE
  'SA_REP',        -- JOB_ID
  9000,            -- SALARY
  .1,              -- COMMISSION_PCT
  148,             -- MANAGER_ID
  80               -- DEPARTMENT_ID
);

結果:

1 row created.

例3-2 情報をすべては使用できない場合でのINSERT文の使用

INSERT INTO EMPLOYEES (
  EMPLOYEE_ID,
  FIRST_NAME,
  LAST_NAME,
  EMAIL,
  PHONE_NUMBER,
  HIRE_DATE,
  JOB_ID,          -- Omit SALARY; its value defaults to NULL.
  COMMISSION_PCT,
  MANAGER_ID,
  DEPARTMENT_ID
)
VALUES (
  20,              -- EMPLOYEE_ID
  'John',          -- FIRST_NAME
  'Keats',         -- LAST_NAME
  'JKEATS',        -- EMAIL
  '650.506.3333',  -- PHONE_NUMBER
  '01-JAN-07',     -- HIRE_DATE
  'SA_REP',        -- JOB_ID
  .1,              -- COMMISSION_PCT
  148,             -- MANAGER_ID
  80               -- DEPARTMENT_ID
);

結果:

1 row created.

例3-3 INSERT文の誤った使用

INSERT INTO EMPLOYEES (
  EMPLOYEE_ID,
  FIRST_NAME,      -- Omit LAST_NAME (error)
  EMAIL,
  PHONE_NUMBER,
  HIRE_DATE,
  JOB_ID,
  COMMISSION_PCT,
  MANAGER_ID,
  DEPARTMENT_ID
)
VALUES (
  20,              -- EMPLOYEE_ID
  'John',          -- FIRST_NAME
  'JOHN',          -- EMAIL
  '650.506.3333',  -- PHONE_NUMBER
  '01-JAN-07',     -- HIRE_DATE
  'SA_REP',        -- JOB_ID
  .1,              -- COMMISSION_PCT
  148,             -- MANAGER_ID
  80               -- DEPARTMENT_ID
);

結果:

ORA-01400: cannot insert NULL into ("HR"."EMPLOYEES"."LAST_NAME")

関連情報:

UPDATE文について

UPDATE文は、既存の表の行のセット(の値の変更)を更新します。

UPDATE文の単純な形式は次の構文になります。

UPDATE table_name
SET column_name = value [, column_name = value]...
[ WHERE condition ];

各値は、そのcolumn_nameに対して有効である必要があります。WHERE句を含めると、条件を満たす行でのみ列値が更新されます。

例3-4のUPDATE文では、例3-2のEMPLOYEES表に挿入された行のSALARY列の値が、従業員の給与がわかるようになる前に更新されます。

例3-5のUPDATE文では、部門80の全従業員の歩合率を更新します。

例3-4 データを追加するUPDATE文の使用

UPDATE EMPLOYEES
SET SALARY = 8500
WHERE LAST_NAME = 'Keats';

結果:

1 row updated.

例3-5 複数の行を更新するUPDATE文の使用

UPDATE EMPLOYEES
SET COMMISSION_PCT = COMMISSION_PCT + 0.05
WHERE DEPARTMENT_ID = 80;

結果:

34 rows updated.

関連情報:

DELETE文について

DELETE文は、表から行を削除します。

DELETE文の単純な形式は次の構文になります。

DELETE FROM table_name [ WHERE condition ];

WHERE句を含めると、条件を満たす行のみが削除されます。WHERE句を省略すると、文は表からすべての行を削除しますが、空の表は引き続き存在します。表を削除するには、DROP TABLE文を使用します。

例3-6のDELETE文は、例3-1および例3-2で挿入された行を削除します。

例3-6 DELETE文の使用

DELETE FROM EMPLOYEES
WHERE HIRE_DATE = TO_DATE('01-JAN-07', 'dd-mon-yy');

結果:

2 rows deleted.

関連情報: