SQL语言基础(数据控制语言)

DML 可以在下列条件下执行:

Ø   向表中插入数据

Ø   修改现存数据

Ø   删除现存数据

事务是由完成若干项工作的DML 语句组成的。

1-1 insert语句

INSERT INTO  table [(column [, column...])]
VALUES  (value [, value...]);

    使用这种语法一次只能向表中插入一条数据。

1-1-1 插入数据

为每一列添加一个新值。

按列的默认顺序列出各个列的值。

INSERT 子句中随意列出列名和他们的值。

字符和日期型数据应包含在单引号中。

INSERT INTO departments(department_id, department_name,
                        manager_id, location_id)
VALUES      (70, 'Public Relations', 100, 1700);

指定插入的值

SYSDATE 记录当前系统的日期和时间

INSERT INTO employees (employee_id,
                 first_name, last_name,
                 email, phone_number,
                 hire_date, job_id, salary,
                 commission_pct, manager_id,
                 department_id)
VALUES     (113,
                 'Louis', 'Popp',
                 'LPOPP', '515.124.4567',
                 SYSDATE, 'AC_ACCOUNT', 6900,
                 NULL, 205, 100);

1-1-2 从其它表中拷贝数据

INSERT INTO sales_reps(id, name, salary, commission_pct)
  SELECT employee_id, last_name, salary, commission_pct
  FROM   employees
  WHERE  job_id LIKE '%REP%';
子查询中的值列表应于 INSERT 子句中的列名对应。

1-1-3  DML 语句中使用 WITH CHECK OPTION 关键字

INSERT INTO  (SELECT employee_id, last_name, email,
                 hire_date, job_id, salary
              FROM   employees
              WHERE  department_id = 50 WITH CHECK OPTION)
VALUES (99998, 'Smith', 'JSMITH',
        TO_DATE('07-JUN-99', 'DD-MON-RR'),
        'ST_CLERK', 5000);

1-1-4 合并语句

按照指定的条件执行插入或更新操作

如果满足条件的行存在,执行更新操作;否则执行插入操作:

避免多次重复执行插入和删除操作

提高效率而且使用方便

可以使用 merge 语句,根据指定的条件进行插入或更新操作

MERGE INTO table_name table_alias
  USING (table|view|sub_query) alias
  ON (join condition)
  WHEN MATCHED THEN
    UPDATE SET
    col1 = col_val1,
    col2 = col2_val
  WHEN NOT MATCHED THEN
    INSERT (column_list)
    VALUES (column_values);

在对表COPY_EMP 使用merge 语句,根据指定的条件从表EMPLOYEES 中插入或更新数据

MERGE INTO copy_emp  c
  USING employees e
  ON (c.employee_id = e.employee_id)
WHEN MATCHED THEN
  UPDATE SET
     c.first_name     = e.first_name,
     c.last_name      = e.last_name,
     ...
     c.department_id  = e.department_id
WHEN NOT MATCHED THEN
 INSERT VALUES(e.employee_id, e.first_name, e.last_name,
          e.email, e.phone_number, e.hire_date, e.job_id,
          e.salary, e.commission_pct, e.manager_id,
          e.department_id);

1-2  UPDATE 语句

使用 UPDATE 语句更新数据,可以一次更新多条数据

UPDATE  table
SET  column = value [, column = value, ...]
[WHERE   condition];

1-2-1 更新语句

使用 WHERE 子句指定需要更新的数据

UPDATE   copy_emp
SET      department_id = 110
where employee_id = 50

1-2-2  UPDATE 语句中使用子查询

更新 114 号员工的工作和工资使其与 205 号员工相同

UPDATE   employees
SET      job_id  = (SELECT  job_id
                    FROM    employees
                    WHERE   employee_id = 205),
         salary  = (SELECT  salary
                    FROM    employees
                    WHERE   employee_id = 205)
WHERE    employee_id    =  114;

1-3 delete语句

使用 DELETE 语句从表中删除数据

DELETE [FROM]	  table
[WHERE	  condition];

1-3-1 删除数据

使用WHERE 子句指定删除的记录

DELETE FROM departments
 WHERE  department_name = 'Finance';

如果省略 WHERE 子句,则表中的全部数据将被删除

1-3-2  DELETE 中使用子查询

DELETE 中使用子查询,使删除基于另一个表中的数据。

DELETE FROM employees
WHERE  department_id =
                       (SELECT department_id
                        FROM   departments
                        WHERE  department_name LIKE '%Public%');

1-4 数据库事务

数据库事务由以下的部分组成

Ø   一个或多个DML 语句

Ø   一个 DDL 语句

Ø   一个 DCL 语句

数据库事务起至标志

以第一个 DML 语句的执行作为开始

以下面的其中之一作为结束:

Ø   COMMIT ROLLBACK 语句

Ø   DDL DCL 语句(自动提交)

Ø   用户会话正常结束

Ø   系统异常终止

1-4-1  COMMIT ROLLBACK 语句

使用 COMMIT ROLLBACK 语句 , 我们可以 :

Ø   确保数据完整性。

Ø   数据改变被提交之前预览。

Ø   将逻辑上相关的操作分组。

使用 SAVEPOINT 语句在当前事务中创建保存点。
使用 ROLLBACK TO SAVEPOINT 语句回滚到创建的保存点。
UPDATE...
SAVEPOINT update_done;
Savepoint created.
INSERT...
ROLLBACK TO update_done;
Rollback complete.

1-4-2 事务进程

自动提交在以下情况中执行:

Ø   DDL 语句。

Ø   DCL 语句。

Ø   不使用 COMMIT ROLLBACK 语句提交或回滚,正常结束会话。

会话异常结束或系统异常会导致自动回滚。


提交或回滚前的数据状态

Ø   改变前的数据状态是可以恢复的

Ø   执行 DML 操作的用户可以通过 SELECT 语句查询之前的修正

Ø   其他用户不能看到当前用户所做的改变,直到当前用户结束事务。

Ø   DML 语句所涉及到的行被锁定, 其他用户不能操作


提交后的数据状态

Ø   数据的改变已经被保存到数据库中。

Ø   改变前的数据已经丢失。

Ø   所有用户可以看到结果。

Ø   锁被释放, 其他用户可以操作涉及到的数据。

Ø   所有保存点被释放。


使用 ROLLBACK 语句可使数据变化失效:

Ø   数据改变被取消。

Ø   修改前的数据状态可以被恢复。

Ø   锁被释放。

DELETE FROM copy_emp;
22 rows deleted.
ROLLBACK;
Rollback complete.






请使用浏览器的分享功能分享到微信等