Oracle

来源:互联网 发布:java程序员单词要求 编辑:程序博客网 时间:2024/06/09 22:41


使用WHERE 子句,将不满足条件的行过滤掉:

SQL语句分为以下三种类型:


DML: Data Manipulation Language 数据操纵语言
DDL:  Data Definition Language 数据定义语言
DCL:  Data Control Language 数据控制语言

DML用于查询与修改数据记录,包括如下SQL语句:


INSERT:添加数据到数据库中
UPDATE:修改数据库中的数据
DELETE:删除数据库中的数据
SELECT:选择(查询)数据
SELECT是SQL语言的基础,最为重要

DDL用于定义数据库的结构,比如创建、修改或删除数据库对象,包括如下SQL语句:

CREATE TABLE:创建数据库表
ALTER  TABLE:更改表结构、添加、删除、修改列长度
DROP TABLE:删除表
CREATE INDEX:在表上建立索引
DROP INDEX:删除索引

DCL用来控制数据库的访问,包括如下SQL语句:

GRANT:授予访问权限
REVOKE:撤销访问权限
COMMIT:提交事务处理
ROLLBACK:事务处理回退
SAVEPOINT:设置保存点
LOCK:对数据库的特定部分进行锁定

基本 SELECT 语句

SELECT   标识 选择哪些列。
FROM     标识从哪个表中选择
SELECT *
FROM   departments;


选择特定的列
SELECT department_id, location_id
FROM   departments;


SQL 语言大小写不敏感。 
SQL 可以写在一行或者多行
关键字不能被缩写也不能分行
各子句一般要分行写。
使用缩进提高语句的可读性

数字和日期使用的算术运算符。

SELECT last_name, salary, salary + 300
FROM   employees;

乘除的优先级高于加减。
同一优先级运算符从左向右执行。
括号内的运算先执行。

SELECT last_name, salary, 12*salary+100
FROM   employees;

SELECT last_name, salary, 12*(salary+100)
FROM   employees;

空值是无效的,未指定的,未知的或不可预知的值
空值不是空格或者0。

SELECT last_name, job_id, salary, commission_pct

包含空值的数学表达式的值都为空值
SELECT last_name, 12*salary*commission_pct
FROM   employees;

列的别名
列的别名:
重命名一个列。

便于计算。

紧跟列名,也可以在列名和别名之间加入关键字‘AS’,别名使用双引号,以便在别名中包含空格或特殊的字符并区分大小写。

SELECT last_name AS name, commission_pct comm
FROM   employees;
SELECT last_name "Name", salary*12 "Annual Salary"
FROM   employees;

连接符:
把列与列,列与字符连接在一起。
用 ‘||’表示。
可以用来‘合成’列。
SELECT last_name||job_id AS "Employees"
FROM employees;

字符串可以是 SELECT 列表中的一个字符,数字,日期。
日期和字符只能在单引号中出现。
每当返回一行时,字符串被输出一次。
SELECT last_name ||' is a '||job_id 
       AS "Employee Details"
FROM   employees;
默认情况下,查询会返回全部行,包括重复行
SELECT department_id
FROM   employees;
在 SELECT 子句中使用关键字 ‘DISTINCT’ 删除重复行。
SELECT DISTINCT department_id
FROM   employees;
使用 DESCRIBE 命令,表示表结构
DESCRIBE employees
FROM   employees;

WHERE 子句紧随 FROM 子句

SELECT employee_id, last_name, job_id, department_id
FROM   employees
WHERE  department_id = 90 ;

字符和日期要包含在单引号中。
字符大小写敏感,日期格式敏感。
默认的日期格式是 DD-MON月-RR。
SELECT last_name, job_id, department_id
FROM   employees
WHERE  last_name = 'Whalen';

SELECT last_name, hire_date, department_id
FROM   employees
WHERE  hire_date = '7-6月-1994'


比较运算
SELECT last_name, salary
FROM   employees
WHERE  salary <= 3000;

BETWEEN
使用 BETWEEN 运算来显示在一个区间内的值
SELECT last_name, salary
FROM   employees
WHERE  salary BETWEEN 2500 AND 3500;

使用 IN运算显示列表中的值。
SELECT employee_id, last_name, salary, manager_id
FROM   employees
WHERE  manager_id IN (100, 101, 201);

使用 LIKE 运算选择类似的值
选择条件可以包含字符或数字:
% 代表零个或多个字符(任意个字符)。
_ 代表一个字符。
SELECT first_name
FROM employees
WHERE first_name LIKE 'S%';
SELECT last_name
FROM   employees
WHERE  last_name LIKE '_o%';

可以使用 ESCAPE 标识符 选择‘%’和 ‘_’ 符号。
回避特殊符号的:使用转义符。例如:将[%]转为[\%]、[_]转为[\_],然后再加上[ESCAPE ‘\’] 即可。
SELECT job_id
FROM   jobs
WHERE  job_id LIKE ‘IT\_%‘ escape ‘\‘;

使用 IS (NOT) NULL 判断空值
SELECT last_name, manager_id
FROM   employees
WHERE  manager_id IS NULL;

AND 要求并的关系为真。
SELECT employee_id, last_name, job_id, salary
FROM   employees
WHERE  salary >=10000
AND    job_id LIKE '%MAN%';

OR 要求或关系为真。
SELECT employee_id, last_name, job_id, salary
FROM   employees
WHERE  salary >= 10000
OR     job_id LIKE '%MAN%';

NOT
SELECT last_name, job_id
FROM   employees
WHERE  job_id 
       NOT IN ('IT_PROG', 'ST_CLERK', 'SA_REP');

ORDER BY子句
使用 ORDER BY 子句排序
ASC(ascend): 升序
DESC(descend): 降序
ORDER BY 子句在SELECT语句的结尾。

SELECT   last_name, job_id, department_id, hire_date
FROM     employees
ORDER BY hire_date ;


降序排序
SELECT   last_name, job_id, department_id, hire_date
FROM     employees
ORDER BY hire_date DESC ;
按别名排序
SELECT employee_id, last_name, salary*12 annsal
FROM   employees
ORDER BY annsal;
多个列排序
SELECT last_name, department_id, salary
FROM   employees
ORDER BY department_id, salary DESC;
可以使用不在SELECT 列表中的列排序
大小写控制函数
SELECT employee_id, last_name, department_id
FROM   employees
WHERE  last_name = 'higgins';
no rows selected
SELECT employee_id, last_name, department_id
FROM   employees
WHERE  LOWER(last_name) = 'higgins';
字符控制函数
SELECT employee_id, CONCAT(first_name, last_name) NAME, 
       job_id, LENGTH (last_name), 
       INSTR(last_name, 'a') "Contains 'a'?"
FROM   employees
WHERE  SUBSTR(job_id, 4) = 'REP';


CONCAT('Hello', 'World')
SUBSTR('HelloWorld',1,5)
LENGTH('HelloWorld')
INSTR('HelloWorld', 'W')
LPAD(salary,10,'*')
RPAD(salary, 10, '*')
TRIM('H' FROM 'HelloWorld')
REPLACE(‘abcd’,’b’,’m’)

HelloWorld
Hello
10
6
*****24000
24000*****
elloWorld
amcd

数字函数
ROUND: 四舍五入
ROUND(45.926, 2) 45.93
TRUNC: 截断
TRUNC(45.926, 2) 45.92
MOD: 求余
MOD(1600, 300)                 100
ROUND 函数
SELECT ROUND(45.923,2), ROUND(45.923,0),
       ROUND(45.923,-1)
FROM   DUAL;
DUAL 是一个‘伪表’,可以用来测试函数和表达式
TRUNC 函数
SELECT  TRUNC(45.923,2), TRUNC(45.923),
        TRUNC(45.923,-2)
FROM   DUAL;
Oracle 中的日期型数据实际含有两个值: 日期和时间。
SELECT last_name, hire_date
FROM   employees
WHERE  last_name like 'G%';
在日期上加上或减去一个数字结果仍为日期。

两个日期相减返回日期之间相差的天数。
日期不允许做加法运算,无意义
SELECT last_name, (SYSDATE-hire_date)/7 AS WEEKS
FROM   employees
WHERE  department_id = 90;
笛卡尔集:
笛卡尔集会在下面条件下产生:
省略连接条件
连接条件无效
所有表中的所有行互相连接
为了避免笛卡尔集, 可以在 WHERE 加入有效的连接条件。

Oracle 连接:
使用连接在多个表中查询数据。
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1 = table2.column2;
在 WHERE 子句中写入连接条件。
在表中有相同列时,在列名之前加上表名前缀


等值连接:
SELECT employees.employee_id, employees.last_name, 
       employees.department_id, departments.department_id,
       departments.location_id
FROM   employees, departments
WHERE  employees.department_id = departments.department_id;


区分重复的列名:
使用表名前缀在多个表中区分相同的列。
在不同表中具有相同列名的列可以用表的别名加以区分。


表的别名:
使用别名可以简化查询。
使用表名前缀可以提高执行效率。
SELECT e.employee_id, e.last_name, e.department_id,
       d.department_id, d.location_id
FROM   employees e , departments d
WHERE  e.department_id = d.department_id;


连接多个表:
连接 n个表,至少需要 n-1个连接条件。 例如:连接三个表,至少需要两个连接条件。


非等值连接:
SELECT e.last_name, e.salary, j.grade_level
FROM   employees e, job_grades j
WHERE  e.salary 
       BETWEEN j.lowest_sal AND j.highest_sal;


内连接和外连接:
内连接: 合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行
外连接: 两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行 ,
这种连接称为左(或右) 外连接。没有匹配的行时, 结果表中相应的列为空(NULL). 
外连接的 WHERE 子句条件类似于内部连接, 但连接条件中没有匹配行的表的列后面要加
外连接运算符, 即用圆括号括起来的加号(+).


外连接语法:
使用外连接可以查询不满足连接条件的数据。
外连接的符号是 (+)。
右外连接:
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column(+) = table2.column;


左外连接:
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column = table2.column(+);




SELECT e.last_name, e.department_id, d.department_name
FROM   employees e, departments d
WHERE  e.department_id(+) = d.department_id ; 




自连接:
SELECT worker.last_name || ' works for ' 
       || manager.last_name
FROM   employees worker, employees manager
WHERE  worker.manager_id = manager.employee_id ;




使用ON 子句创建连接:
自然连接中是以具有相同名字的列为连接条件的。
可以使用 ON 子句指定额外的连接条件。
这个连接条件是与其它条件分开的。
ON 子句使语句具有更高的易读性。
SELECT e.employee_id, e.last_name, e.department_id, 
       d.department_id, d.location_id
FROM   employees e JOIN departments d
ON     (e.department_id = d.department_id);


使用 ON 子句创建多表连接:
SELECT employee_id, city, department_name
FROM   employees e 
JOIN   departments d
ON     d.department_id = e.department_id 
JOIN   locations l
ON     d.location_id = l.location_id;


左外连接:
SELECT e.last_name, e.department_id, d.department_name
FROM   employees e
LEFT OUTER JOIN departments d
ON   (e.department_id = d.department_id) ;


右外连接:
SELECT e.last_name, e.department_id, d.department_name
FROM   employees e
RIGHT OUTER JOIN departments d
ON    (e.department_id = d.department_id) ;


满外连接:
SELECT e.last_name, e.department_id, d.department_name
FROM   employees e
FULL OUTER JOIN departments d
ON   (e.department_id = d.department_id) ;


















分组函数作用于一组数据,并对一组数据返回一个值。


AVG(平均值)和 SUM (合计)函数
可以对数值型数据使用AVG 和 SUM 函数。
SELECT AVG(salary), MAX(salary),
              MIN(salary), SUM(salary)
FROM   employees
WHERE  job_id LIKE '%REP%';


可以对任意数据类型的数据使用 MIN 和 MAX 函数。
SELECT MIN(hire_date), MAX(hire_date)
FROM  employees;


COUNT(*) 返回表中记录总数,适用于任意数据类型。
SELECT COUNT(*)
FROM  employees
WHERE  department_id = 50;


COUNT(expr) 返回expr不为空的记录总数.
SELECT COUNT(commission_pct)
FROM   employees
WHERE  department_id = 50;


组函数忽略空值。
SELECT AVG(commission_pct)
FROM   employees;


COUNT(DISTINCT expr)返回expr非空且不重复的记录总数
SELECT COUNT(DISTINCT department_id)
FROM   employees;


可以使用GROUP BY子句将表中的数据分成若干组
SELECT column, group_function(column)
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[ORDER BY column];


在SELECT 列表中所有未包含在组函数中的列都应该包含
在 GROUP BY 子句中。
SELECT   department_id, AVG(salary)
FROM     employees
GROUP BY department_id ;


包含在 GROUP BY 子句中的列不必包含在SELECT 列表中
SELECT   AVG(salary)
FROM     employees
GROUP BY department_id ;


在GROUP BY子句中包含多个列
SELECT   department_id dept_id, job_id, SUM(salary)
FROM     employees
GROUP BY department_id, job_id ;


所有包含于SELECT 列表中,而未包含于组函数中的列都
必须包含于 GROUP BY 子句中。
SELECT department_id, COUNT(last_name)
FROM   employees;




不能在 WHERE 子句中使用组函数。
可以在 HAVING 子句中使用组函数。
SELECT   department_id, AVG(salary)
FROM     employees
WHERE    AVG(salary) > 8000
GROUP BY department_id;




使用 HAVING 过滤分组:
1. 行已经被分组。
2. 使用了组函数。
3. 满足HAVING 子句中条件的分组将被显示。
SELECT column, group_function
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING group_condition]
[ORDER BY column];


SELECT   department_id, MAX(salary)
FROM     employees
GROUP BY department_id
HAVING   MAX(salary)>10000 ;


显示各部门平均工资的最大值
SELECT   MAX(AVG(salary))
FROM     employees
GROUP BY department_id;














子查询语法:
SELECT select_list
FROM table
WHERE expr operator
(SELECTselect_list
       FROM table);
子查询 (内查询) 在主查询之前一次执行完成。
子查询的结果被主查询(外查询)使用 。




SELECT last_name
FROM   employees
WHERE  salary >
               (SELECT salary
                FROM   employees
                WHERE  last_name = 'Abel');




子查询要包含在括号内。


将子查询放在比较条件的右侧。


单行操作符对应单行子查询,多行操作符对应多行子查询。




只返回一行。
使用单行比较操作符。
题目:返回job_id与141号员工相同,salary比143号员工多的员工
            姓名,job_id 和工资
SELECT last_name, job_id, salary
FROM   employees
WHERE  job_id =  
                (SELECT job_id
                 FROM   employees
                 WHERE  employee_id = 141)
AND    salary >
                (SELECT salary
                 FROM   employees
                 WHERE  employee_id = 143);


题目:返回公司工资最少的员工的last_name,job_id和salary
SELECT last_name, job_id, salary
FROM   employees
WHERE  salary = 
                (SELECT MIN(salary)
                 FROM   employees);




题目:查询最低工资大于50号部门最低工资的部门id和其最低工资
SELECT   department_id, MIN(salary)
FROM     employees
GROUP BY department_id
HAVING   MIN(salary) >
                       (SELECT MIN(salary)
                        FROM   employees
                        WHERE  department_id = 50);




非法使用子查询:
SELECT employee_id, last_name
FROM   employees
WHERE  salary =
                (SELECT   MIN(salary)
                 FROM     employees
                 GROUP BY department_id);


子查询中的空值问题:
SELECT last_name, job_id
FROM   employees
WHERE  job_id =
                (SELECT job_id
                 FROM   employees
                 WHERE  last_name = 'Haas');






题目:返回其它部门中比job_id为‘IT_PROG’部门任一工资低的员工的员
              工号、姓名、job_id 以及salary
SELECT employee_id, last_name, job_id, salary
FROM   employees
WHERE  salary < ANY
                    (SELECT salary
                     FROM   employees
                     WHERE  job_id = 'IT_PROG')
AND    job_id <> 'IT_PROG';




题目:返回其它部门中比job_id为‘IT_PROG’部门所有工资都低的员工
            的员工号、姓名、job_id 以及salary
SELECT employee_id, last_name, job_id, salary
FROM   employees
WHERE  salary < ALL
                    (SELECT salary
                     FROM   employees
                     WHERE  job_id = 'IT_PROG')
AND    job_id <> 'IT_PROG';
常见的数据库对象


对象 描述


表      基本的数据存储集合,由行和列组成。


视图 从表中抽出的逻辑上相关的数据集合。


序列 提供有规律的数值。
索引 提高查询的效率
同义词 给对象起别名




Oracle 数据库中的表


用户定义的表:
用户自己创建并维护的一组表
包含了用户所需的信息
如:SELECT * FROM user_tables;查看用户创建的表


数据字典:
由 Oracle Server 自动创建的一组表
包含数据库信息


查询数据字典
查看用户定义的表.
SELECT table_name 
FROM  user_tables ;


查看用户定义的各种数据库对象
SELECT DISTINCT object_type 
FROM  user_objects ;


查看用户定义的表, 视图, 同义词和序列
SELECT
FROM  user_catalog ;




命名规则
表名和列名:
必须以字母开头
必须在 1–30 个字符之间
必须只能包含 A–Z, a–z, 0–9, _, $, 和 #
必须不能和用户定义的其他对象重名
必须不能是Oracle 的保留字




CREATE TABLE 语句
必须具备:
CREATE TABLE权限
存储空间


CREATE TABLE [schema.]table
   (column datatype [DEFAULT expr][, ...]);


必须指定:
表名
列名, 数据类型, 尺寸


创建表
CREATE TABLE dept (deptno NUMBER(2),
dname VARCHAR2(14),
loc VARCHAR2(13));


DESCRIBE dept




数据类型:
数据类型 描述
VARCHAR2(size) 可变长字符数据
CHAR(size)   定长字符数据
NUMBER(p,s)   可变长数值数据
DATE 日期型数据
LONG 可变长字符数据,最大可达到2G


CLOB 字符数据,最大可达到4G


RAW (LONG RAW) 原始的二进制数据
BLOB 二进制数据,最大可达到4G
BFILE 存储外部文件的二进制数据,最大可达到4G


ROWID 行地址


使用子查询创建表:
使用 AS subquery 选项,将创建表和插入数据结合起来
CREATE TABLE table
   [(column, column...)]
AS subquery;


指定的列和子查询中的列要一一对应
通过列名和默认值定义列


复制现有的表:


create table emp1 as select * from employees;
create table emp2 as select * from employees where 1=2;
--创建的emp2是空表。


使用子查询创建表举例:
CREATE TABLE dept80
  AS     SELECT  employee_id, last_name, 
            salary*12 ANNSAL, 
            hire_date    FROM    employees    WHERE   department_id = 80;


ALTER TABLE 语句:
使用 ALTER TABLE 语句可以:
追加新的列
修改现有的列
为新追加的列定义默认值
删除一个列
重命名表的一个列名


使用 ALTER TABLE 语句追加, 修改, 或删除列的语法:
ALTER TABLE table
ADD   (column datatype [DEFAULT expr]
  [, column datatype]...);


ALTER TABLE table
MODIFY   (column datatype [DEFAULT expr]
  [, column datatype]...);


ALTER TABLE table
DROP COLUMN  column_name;


ALTER TABLE table_name RENAME COLUMM old_column_name 
TO new_column_name


使用 ADD 子句追加一个新列:
ALTER TABLE dept80
ADD   (job_id VARCHAR2(9));


可以修改列的数据类型, 尺寸和默认值:
ALTER TABLE dept80
MODIFY (last_name VARCHAR2(30));


ALTER TABLE dept80
MODIFY (salary number(9,2) default 1000);
对默认值的修改只影响今后对表的修改;


使用 DROP COLUMN 子句删除不再需要的列:
ALTER TABLE  dept80
DROP COLUMN  job_id; 


使用 RENAME COLUMN [table_name] TO子句重命名列:
ALTER TABLE  dept80
RENAME COLUMN  job_id TO id; 


数据和结构都被删除
所有正在运行的相关事务被提交
所有相关索引被删除
DROP TABLE 语句不能回滚


DROP TABLE dept80;


清空表:
TRUNCATE TABLE 语句:
删除表中所有的数据
释放表的存储空间
TRUNCATE TABLE detail_dept;


TRUNCATE语句不能回滚
可以使用 DELETE 语句删除数据,可以回滚
对比:
  delete from emp2;
  select * from emp2;
  rollback;
  select * from emp2;


改变对象的名称:
执行RENAME语句改变表, 视图, 序列, 或同义词的名称
RENAME dept TO detail_dept;
必须是对象的拥有者




语句 描述
CREATE TABLE 创建表
ALTER TABLE 修改表结构 
DROP TABLE 删除表


RENAME  TO   重命名表


TRUNCATE TABLE 删除表中的所有数据,并释放存储空间


以上这些DDL的命令,操作外,皆不可回滚










通过本章学习,您将可以:
使用 DML 语句
向表中插入数据
更新表中数据
从表中删除数据
控制事务




DML(Data Manipulation Language – 数据操纵语言) 可以在下列条件下执行:
向表中插入数据
修改现存数据
删除现存数据
事务是由完成若干项工作的DML语句组成的


使用 INSERT 语句向表中插入数据,使用这种语法一次只能向表中插入一条数据:
为每一列添加一个新值。
按列的默认顺序列出各个列的值。 
在 INSERT 子句中随意列出列名和他们的值。
字符和日期型数据应包含在单引号中。


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




INSERT INTO employees(employee_id,last_name,email,hire_date,job_id)
VALUES  (300,’Tom’,’tom@126.com’,to_date(‘2012-3-21’,’yyyy-mm-dd’),’SA_RAP’);


向表中插入空值
隐式方式: 在列名表中省略该列的值。
INSERT INTO departments (department_id, 
                          department_name    )
VALUES (30, 'Purchasing');
显示方式: 在VALUES 子句中指定空值:
INSERT INTO departments
VALUES (100, 'Finance', NULL, NULL);


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);


加入新员工:
INSERT INTO employees
VALUES      (114, 
             'Den', 'Raphealy', 
             'DRAPHEAL', '515.127.4561',
             TO_DATE('FEB 3, 1999', 'MON DD, YYYY'),
             'AC_ACCOUNT', 11000, NULL, 100, 30);


从其它表中拷贝数据:
INSERT INTO emp2 
SELECT * 
FROM employees
WHERE department_id = 90;




INSERT INTO sales_reps(id, name, salary, commission_pct)
SELECT employee_id, last_name, salary, commission_pct
FROM   employees
WHERE  job_id LIKE '%REP%';


不必书写 VALUES 子句。 
子查询中的值列表应与 INSERT 子句中的列名对应


使用 UPDATE 语句更新数据,可以一次更新多条数据:
UPDATE employees
SET    department_id = 70
WHERE  employee_id = 113;


如果省略 WHERE 子句,则表中的所有数据都将被更新:
UPDATE copy_emp
SET     department_id = 110;


在 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;


在 UPDATE 中使用子查询,使更新基于另一个表中的
数据:
题目:调整与employee_id 为200的员工job_id相同的
员工的department_id为employee_id为100的员工的department_id。
UPDATE  copy_emp
SET     department_id  =  (SELECT department_id
                           FROM employees
                           WHERE employee_id = 100)
WHERE   job_id         =  (SELECT job_id
                           FROM employees
                           WHERE employee_id = 200);


更新中的数据完整性错误:
UPDATE employees
SET    department_id = 55
WHERE  department_id = 110;不存在 55 号部门


使用 WHERE 子句删除指定的记录。
 DELETE FROM departments
 WHERE  department_name = 'Finance';


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


在 DELETE 中使用子查询,使删除基于另一个表中的数据。 
题目:从emp1表中删除dept1部门名称中含Public字符的部门id
DELETE FROM emp1
WHERE  department_id =
                       (SELECT department_id
                        FROM   dept1
                        WHERE  department_name LIKE '%Public%');


删除中的数据完整性错误:
DELETE FROM departments
WHERE       department_id = 60;




数据库事务:
事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态。
数据库事务由以下的部分组成:
一个或多个DML 语句
一个 DDL(Data Definition Language – 数据定义语言) 语句
一个 DCL(Data Control Language – 数据控制语言) 语句


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


以下面的其中之一作为结束:
COMMIT 或 ROLLBACK 语句
DDL 语句(自动提交)
用户会话正常结束
系统异常终止




使用COMMIT 和 ROLLBACK语句,我们可以: 
确保数据完整性。
数据改变被提交之前预览。
将逻辑上相关的操作分组。


使用 SAVEPOINT 语句在当前事务中创建保存点。
使用 ROLLBACK TO SAVEPOINT 语句回滚到创建的保存点


自动提交在以下情况中执行:
DDL 语句。
DCL 语句。
不使用 COMMIT 或 ROLLBACK 语句提交或回滚,正常结束会话。
会话异常结束或系统异常会导致自动回滚




改变前的数据状态是可以恢复的
执行 DML 操作的用户可以通过 SELECT 语句查询之前的修正
其他用户不能看到当前用户所做的改变,直到当前用户结束事务。
DML语句所涉及到的行被锁定, 其他用户不能操作。




数据的改变已经被保存到数据库中。
改变前的数据已经丢失。
所有用户可以看到结果。
锁被释放,其他用户可以操作涉及到的数据。
所有保存点被释放


改变数据
DELETE FROM employees
WHERE  employee_id = 99999;
INSERT INTO departments 
VALUES (290, 'Corporate Tax', NULL, 1700);


提交改变
COMMIT;

使用 ROLLBACK 语句可使数据变化失效:
数据改变被取消。
修改前的数据状态被恢复。
锁被释放。


DELETE FROM copy_emp;


ROLLBACK;




语句 功能
INSERT 插入
UPDATE 修正
DELETE 删除
COMMIT 提交
SAVEPOINT 保存点
ROLLBACK 回滚

0 0
原创粉丝点击