当前位置:首页 > 信息技术 > 数据库系统 > Oracle > 数据库笔记

数据库笔记

第一课: 基本SQL SELECT语句
1. 算数运算符, 数学运算符, 操作运算符优先级

2. 定义空值(空值是无效的, 未知的, 未指定的, 不可预知的; 空值不是空格也不是0)
包含空值的数学表达式的值都为空值

3. 列的别名: 注意双引号的作用

4. 连接符”||”, 用于把列与列连接在一起, 用于合成列
SELECT empName || empId AS Employee FROM emp;

5. 字符串可以使SELECT语句中的一个字符, 数字, 日期;
日期和字符只能在单引号中出现;
每当返回一行时, 字符串被输出一次
SELECT empName || ‘ is a ‘ || empJob AS empInfo FROM emp;

6. 删除重复行: DISTINCT
SELECT DISTINCT empJob FROM emp;

7. SQL & SQL*Plus
显示表结构: DESCCRIBE tableName

第二课: 过滤和排序数据
1. WHERE子句

2. 字符和日期要包含在单引号之内
字符大小写敏感, 日期格式敏感, 默认的日期格式为: DD_MM_YY

3. 比较运算符: =, < , <=, >, >=, <>

4. 其他比较运算符:
BETWEEN … AND…
IN(SET1, SET2, SET3,…)
LIKE
IS (NOT) NULL

5. “%”表示匹配一个或者多个字符
“_”表示匹配单个字符
两者可以同时使用, 例如: LIKE ‘_o%’;
可以使用ESCAPE标示符选择”%”和”_”符号

6. NULL用于判断空值

7. 逻辑运算: AND, OR, NOT
SELECT * FROM emp WHERE ege NOT IN(20, 21, 22);

8. 运算符优先级(Page_48)

9. ORDER BY子句排序: ASC金字塔从小到大升序, 则DESC为反序

10. 按照别名排序(同时列举多列排序的例子):
SELECT employee_id emp_ID, last_name, salary*12 annsal FROM emp ORDER BY emp_ID, annsal;

11. 可以使用不在SELECT列表中的列排序???

第三课: 单行函数
1. 单行函数:
->操作数据对象
->接受函数返回一个结果
->只对一行进行变换
->每行返回一个结果
->可以转换数据类型
->可以嵌套
->参数可以使一列或者是一个值

2. 字符函数(大小写控制函数, 字符控制函数)

3. 大小写控制函数LOWER, UPPER, INITCAP(‘单词首字母转换为大写’)

4. 字符控制函数
CONCAT(‘Hello’, ‘World’)—-HelloWorld
SUBSTR(‘HelloWOrld, 1, 5)—-Hello
LENGTH(‘HelloWorld’)—-10
INSTR(‘HelloWorld’, ‘w’)—-6
LPAD(salary, 10, ‘*’)—-*****12000
RPAD(salary, 10, ‘*’)—-12000*****
TRIM(‘H’ FROM ‘HelloWorld’)—-elloWorld
举例:
SELECT employee_id, CONCAT(first_Name, last_name) NAME, job_id, LENGTH(last_name), INSTR(last_name, ‘a’) “Contains ‘a’?” FROM emp WHERE SUBSTR(job_id, 4)=’REP’;

5. 数字函数
ROUND四舍五入: ROUND(45.326, 2)—-45.33
TRUNC截断: TRUNC(45.326, 2)—-45.32
MOD求余: MOD(1600, 300)—-100

6. 日期: 默认格式为: DD_MON_RR
可以只指定年的后两位在20世纪存放21世纪的日期, 同样可以存放20世纪的日期
SELECT sysdate FROM DUAL;

7. 日期的数字运算:
加上一个数字仍为日期, 日期之间相减为两日期相差的天数, 可以用数字除24可以向日期中加上或者减去小时
SELECT (sysdate-birthday)/7 AS Weeks FROM DUAL;

8. 日期函数
MONTHS_BETWEEN(’01-SEP-95′, ’11-JAN-94′)—-两个日期相差的天数(19.6774194)
ADD_MONTHS(’11-JAN-94′, 6)—-向指定的日期中加上若干月数(11-JUL-94)
NEXT_DAY(’01-SEP-95′, ‘FRIDAY’)—-指定日期的下一个日期(08-SEP-95)
LAST_DAY(’01-FEB-95′)—-本月的最后一天(28-FEB-95)
ROUND—-日期的四舍五入
TRUNC—-日期的截断
举例如下:
SELECT SYSDATE,
ROUND(SYSDATE,’MONTH’) RM,
ROUND(SYSDATE,’YEAR’) RY,
TRUNC(SYSDATE,’MONTH’) TM,
TRUNC(SYSDATE,’YEAR’) TY
FROM DUAL;
SYSDATE RM RY TM TY
———– ———– ———– ———– ———–
2013/11/28 2013/12/1 2014/1/1 2013/11/1 2013/1/1

9. TO_CHAR函数对日期的转换
TO_CHAR(SYSDATE, ‘Format_Model’);
必须包含在单引号中, 并且大小写敏感; 可以包含任何有效的日期格式; 可以使用fm去掉多余的前导0或者空格; 与日期值用逗号隔开
YYYY—-2004
YEAR—-TWO THOUSAND AND FOUR
MM—-02
MONTH—-JULY
MON—-JUL
DY—-MON
DAY—-MONDAY
DD—-02
SELECT TO_CHAR(SYSDATE, ‘fmDD Month YYYY’) AS HIREDATE FROM DUAL;
SELECT TO_CHAR(SYSDATE,’HH24:MI:SS AM’) AS DURR_TIME FROM DUAL;—-17:00:18 下午
SELECT TO_CHAR(SYSDATE,’HH12″点”MI”分”SS”秒” AM’) AS DURR_TIME FROM DUAL;—-05点02分34秒 下午

10. TO_CHAR函数对数字的转换
TO_CHAR(number, ‘Format_Model’);
9—-数字
0—-零
$—-美元符号
L—-本地货币符号
.—-小数点
,—-千分号
SELECT TO_CHAR(2560,’$99,999.000′) AS “Salary” FROM DUAL;—-$2,560.000

11. TO_NUMBER 和 TO_DATE函数
TO_NUMBER(char) 或者 TO_NUMBER(char, ‘Format_Model’)
TO_DATE(char) 或者 TO_DATE(char, ‘Format_Model’)

12. RR日期格式
当前年 设置日期 RR格式 YY格式
1995 27-OCT-95 1995 1995
1995 27-OCT-17 2017 1917
2001 27-OCT-17 2017 2017
2001 27-OCT-95 1995 2095
规律: 当前日期所属的世纪与YY格式的世纪是一致的, 前半个世纪设置后半个世纪的时间RR日期减去一个世纪, 后半个世纪设置前半个世纪日期加上一个世纪, 否则为同一个世纪.
RR格式的日期总是处于本世纪后半世纪与下个世纪的前半世纪之间的或者是说处于上个世纪后半个世纪与本世纪的前半个世纪之间的.

13. 嵌套函数
单行函数可以嵌套, 嵌套函数的执行顺序是从里到外

14. NVL函数作用, 将空值转换为一个已知的值
NVL(commission_pct, 0)
NVL(hiredate, ’01-JAN-97′)
NVL(job_id, ‘No Job Yet’)

15. NVL2函数
NVL2(commission_pct, ‘如果非空’, ‘如果为空’)

16. NULLIF(expr1, expr2)
如果expr1与expr2的值相等, 则结果为空值(空白值, 无输出)????

17. IF-THEN-ELSE条件表达式逻辑的实现(两种实现方式):
CASE表达式, DECODE函数

18. CASE expr WHEN comparison_expr1 THEN return_expr1
WHEN comparison_expr2 THEN return_expr2
WHEN comparison_exprn THEN return_exprn
ELSE else_return
END
例如:
SELECT empName, salary,
CASE job_id
WHEN ‘IT_PROG’ THEN salary*1.10
WHEN ‘ST_CLEAK’ THEN salary*1.15
WHEN ‘SA_REP’ THEN salary*1.20
ELSE salary*1.0
END AS “revisedSalary”
FROM emp;

19. DECODE函数
DECODE(col | commission, search1, result1, search2, result2, … , default)
举例:
SELECT empName, salary,
DECODE(job_id, ‘IT_PROG’, salary*1.10,
‘ST_CLEAK’, salary*1.15,
‘SA_REP’, salary*1.20,
salary*1.0) AS “revisedSalary”
FROM emp;

20. 通过对本课的学习, 应该学会:
使用函数对数据进行计算;
使用函数修改数据;
使用函数控制一组数据的输出格式;
使用函数改变日期的输出格式;
使用函数改变数据类型;
会使用NVL, NVL2函数
会使用IF-THEN-ELSE逻辑

第四课: 多表查询
1. 等值连接, 不等值连接, 自连接;
使用外连接查询不满足连接条件的数据

2. 笛卡尔集会在下面的条件下产生:
省略必要的连接条件; 连接条件无效; 所有表中的所有行互相连接
为了避免笛卡尔集的产生, 可以再WHERE子句中加入有效的连接条件

3. 区分重复的列名:
使用表明前缀可以再多个表中区分相同的列;
使用表明可以提高效率;
在不同表中具有相同列名的列可以使用别名加以区分

4. 谷歌检索: 等值连接和非等值连接的区别是什么???
SELECT empName, job, department FROM emp e, dept d WHERE e.deptno=d.deptno;—-等值连接
SELECT e.ename, e.salary, j.gradeLevel FROM emp e, job_grades j WHERE e.salary BETWEEN j.LowLevel AND j.HighLevel;—-非等值连接

5. 连接N个表, 至少要使用N-1个有效的连接条件

6. 外连接
使用外连接可以查询不满足连接条件的数据;
外连接的符号是”+”;
SELECT t1.colmun, t2.colmun FROM table1 t1,table t2 WHERE t1.colcumn(+)=t2.column;
SELECT t1.colmun, t2.colmun FROM table1 t1,table t2 WHERE t1.colcumn=t2.column(+);
谷歌检索: 外连接相关的信息

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

8. 使用SQL: 1999 语法连接
使用连接从多个表中查询数据:
SELECT table1.column, table2.column
FROM table1
[CROSS JOIN table2] |
[NATURAL JOIN table2] |
[JOIN table2 USING (column_name)] |
[JOIN table2
ON(table1.column_name=table2.column_name)] |
[LEFT|RIGHT|FULL OUTER JOIN table2
ON (table1.column_name=table2.column_name)];

9. 叉集
使用Cross子句是连接的表产生差集;
差集和笛卡尔集是相同的
SELECT * FROM emp, dept;
SELECT * FROM emp CROSS JOIN dept;—-叉集
SELECT * FROM emp CROSS JOIN dept WHERE emp.deptno=dept.deptno;

10. 自然连接
NATURAL JOIN子句, 会以两个表中具有相同名字的列为条件创建等值连接;
在表中查询满足等值条件的数据;
如果只是列名相同而数据类型不同, 则会产生错误
举例:
SELECT * FROM emp, dept WHERE emp.deptno=dept.deptno;
SELECT * FROM emp NATURAL JOIN dept;—-自然连接

11. 使用USING子句创建连接
在NATURAL JOIN子句创建等值连接时, 可以使用USING子句指定等值连接中需要用到的列;
使用USING子句可以再多个列满足条件时进行选择;
不要给选中的列加上表名前缀或者是别名;
NAUTRAL JOIN子句和USING子句经常同时使用???真的是这样吗???请谷歌检索
SELECT * FROM emp JOIN dept USING(deptno);

12. 使用ON子句创建连接
自然连接中是以具有相同名字的列为连接条件的;
可以使用ON子句指定额外的连接条件;
这个连接条件是与其他连接条件分开的;
ON子句使得语句具有更高的可读性;
SELECT * FROM emp JOIN dept ON emp.deptno=dept.deptno;

13. 使用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;
谷歌检索ON子句多表连接的详细用法

14. 内连接与外连接
在SQL:1999中, 内连接只返回满足连接条件的数据;
两个表的连接过程中除了返回满足连接条件的行以外, 还返回左(或右)表中不满足条件的行, 这种连接被称为左(或右)外连接;
两个表的连接过程中除了返回满足连接条件的行意外, 还返回两个表中不满足条件的行, 这种连接被称为满外连接
SELECT e.ename, d.deptno FROM emp e LEFT OUTER JOIN deptartment d ON e.deptno=d.deptno;—-左外连接
SELECT e.ename, d.deptno FROM emp e Right OUTER JOIN deptartment d ON e.deptno=d.deptno;—-右外连接
SELECT e.ename, d.deptno FROM emp e FULL OUTER JOIN deptartment d ON e.deptno=d.deptno;—-满外连接

15. 增加连接条件
SELECT e.ename, d.deptno FROM emp e JOIN deptartment d ON e.deptno=d.deptno AND e.mgr=1001;

第5课: 分组函数
1. 分组函数作用于一组数据, 并对一组数据返回一个值.

2. 组函数类型及其语法:
AVG, COUNT, MAX, MIN, STDDEV, SUM
SELECT colmun, Group_Function_Colmun FROM table WHERE Condition GROUP BY colmun ORDER BY colmun;

3. 可以对数值类型使用AVG( ), SUM( ), MAX( ), MIN( )函数;
可以对任意类型使用MAX( ), MIN( )函数;
COUNT(*)返回表中的记录总数;
COUNT(expr)返回expr非空的记录总数;
COUNT(DISTINCT expr)返回expr非空且不重复的记录总数;
SELECT AVG(salary), SUM(salary), MAX(salary), MIN(salary) FROM emp WHERE job_id LIKE ‘%REP%’;

4. 组函数与空值: 组函数忽略空值
SELRCT AVG(commission_pct) FROM emp;

5. 在组函数中使用NVL函数, 使得分组函数无法忽略空值
SELRCT AVG(NVL(commission_pct, 0)) FROM emp;

6. GROUP BY子句的语法
SELECT column, group_function(column)
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[ORDER BY column];

7. 在SELECT列表中所有未包含在组函数中的列都应该包含在GROUP BY子句中:
SELECT deptno, AVG(salary) FROM emp GROUP BY deptno;

8. 包含在GROUP BY子句中的列不一定要包含在SELECT列表中:
SELECT AVG(salary) FROM emp GROUP BY deptno;

9. 在GROUP BY子句中包含多个列进行分组:
SELECT department_id, dept_id, job_id, SUM(salary) FROM emp GROUP BY department_id, job_id;

10. 非法使用组函数:
所有包含于SELECT子句中, 而未包含于组函数中的列都应包含在GROUP BY子句中:
SELECT deptno, AVG(salary) FROM emp;—-ERROR, not a single-group group function
不能在WHERE子句中使用组函数, 也不能在HAVING子句中使用组函数
SELECT deptno, AVG(salary) FROM emp WHERE AVG(salary) > 8000 GROUP BY deptno;—-group function is not allowed

11. 过滤分组: HAVING子句. 使用HAVING子句过滤分组:
行已经被分组;
使用了组函数;
满足HAVING子句中条件的子句将被显示
SELECT column, group_function
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING group_condition]
[ORDER BY column];
例如:
SELECT deptno, MAX(salary) FROM emp GROUP BY deptno HAVING MAX(salary)>10000;
SELECT job_id, SUM(salary) FROM emp WHERE job_id NOT LIKE ‘%REP%’ GROUP BY job_id HAVING SUM(salary)>13000 ORDER BY SUM(salary);

12. 嵌套组函数
SELECT MAX(AVG(salary)) FROM emp GROUP BY deptno;

第6课: 子查询
1. 使用子查询解决问题: 谁的工资比Abel高?(Abel的工资是多少?)
SELECT select_list FROM table WHERE expr operator (Sub_Select_List FROM table…);
SELECT eName FROM emp WHERE salary>(SELECT salary FROM emp WHERE eName=’Abel’);

2. 注意事项:
子查询要包含在括号内;
将子查询放置在比较条件的右侧;
除非要进行Top-N分析, 否则不要在子查询中使用ORDER BY子句;
单行操作符对应单行子查询, 多行操作符对应多行子查询

3. 单行子查询:
只返回一行结果;
使用单行比较操作符: =, >, >=, < , <=, <>
SELECT eName, job FROM emp WHERE job_id=(SELECT job_id FROM emp WHERE empno=1001) AND salary>(SELECT salary FROM emp WHERE empno=143);

4. 在子查询中使用组函数
SELECT * from emp WHERE salary=(SELECT MIN(salary) FROM emp);

5. 子查询中使用HAVING子句
首先执行子查询;
向主查询中的HAVING子句返回结果
SELECT * FROM emp
GROUP BY deptno
HAVING MIN(salary)>(SELECT MIN(salary) FROM emp WHERE deptno=50);

6. 非法使用子查询
SELECT * FROM emp WHERE salary=(SELECT MIN(salary) FROM emp GROUP BY deptno);—-single-row subquery return more than one row(多行子查询使用单行比较符)

7. 子查询中的空值问题
SELECT * FROM emp WHERE job_id=(SELECT job_id FROM emp WHERE eName=’noThisName’);—-no rows selected(子查询不返回任何行)

8. 多行子查询:
返回多行;
使用多行比较操作符IN, ANY, ALL等

9. 在多行子查询中使用ANY操作符:
SELECT * FROM emp WHERE salary ‘IT_PROG’;

10. 在多行子查询中使用ALL操作符:
SELECT * FROM emp WHERE salary ‘IT_PROG’;

11. 子查询中的空值问题:
SELECT eName FROM emp e WHERE e.empno NOT IN(SELECT m.mgr_id FROM emp m);—-no rows selected

12. 通过对本课的学习, 应该学会:
在什么时候遇到问题应该使用子查询;
在子查询基于未知的值的时候应该使用子查询;

第7课: iSQL*Plus
1. 使用iSQL*Plus变量:
临时存储值: 单个(&), 两个(&&), 定义命令;
在SQL语句中改变变量的值;
动态修改开头和结尾;

2. 单个(&)变量:
在变量名前加前缀(&)使用户输入值:
SELECT * FROM emp WHERE empno=&empNumber;

3. 字符和日期型变量:
在字符和日期两端加单引号:
SELECT * FROM emp WHERE job=’&jobName’;

4. 指定列名, 表达式和文本:
使用变量可以提供下面的内容:
WHERE条件
ORDER BY子句
列表达式
表名
整个SELECT语句
例如:
SELECT empno, ename, job, &column_name FROM emp WHERE &condition ORDER BY &order_column;

5. 定义变量:
可以使用DEFINE命令提前定义iSQL*Plus变量;
DEFINE variable=value创建一个字符类型用户变量
使用DEFINE命令定义的变量名字中包含有空格时, 变量名应该包含在单引号中;
定义个命令在会话级有效

6. DEFINE和UNDEFINE命令
DEFINE命令定义的命令在以下条件下失效:
使用了UNDEFINE variable命令;
退出了iSQL*Plus

7. 可以重复使用DEFINE命令定义了相同的变量
(以下的语句为什么会有如此的结果???)
DEFINE job_title=IT_PROG
DEFINE job_title
DEFINE JOB_TITLE=”IT_PROG” (CHAR)———–???
UNDEFINE job_title
DEFINE job_title
SP2-0135: symbol job_title is UNDEFINED———–???

8. DEFINE命令与&变量
DEFINE emp_num=200;
SELECT * FROM emp WHERE empno=&emp_num;

9. 两个(&&)变量:
使用(&&)可以避免为同一个变量重复赋值
SELECT empno, ename, job_id, &&column_name FROM emp ORDER BY &column_name;—-前面是两个&&, 后面是单个&

10. VERIFY命令
使用VERIFY命令在iSQL*Plus中显示变量被替代前和替代后的SQL语句
SET VERIFY ON
SELECT * FROM emp WHERE empno=&empnum;—-执行SQL语句并输入200后:
old 1: WHERE empno=&empnum
new 1: WHERE empno=200

11. iSQL*Plus环境:
使用SET命令控制当前会话
SET system_variable value
使用SHOW命令显示当前设置
SHOW system_variable—-system_variable value

12. SET命令:
• ARRAYSIZE {20 | n}
• FEEDBACK {6 | n |OFF | ON}
• HEADING {OFF | ON}
• LONG {80 | n}| ON | text}

13. iSQL*Plus命令格式:
• COLUMN [column option]
• TTITLE [text | OFF | ON]
• BTITLE [text | OFF | ON]
• BREAK [ON report_element]

14. COLUMN命令: 控制列的输出
COL[UMN] [{column|alias}[option]] [{column|alias}[option]]
• CLE[AR]: 清除列格式
• HEA[DING] text: 设置列头
• FOR[MAT] format: 改变列的输出格式
• NOPRINT | PRINT
• NULL

• 创建列头:
COLUMN last_name HEADING ‘Employee|Name’
COLUMN salary JUSTIFY LEFT FORMAT $99,990.00
COLUMN manager FORMAT 999999999 NULL ‘No manager’
COLUMN last_name HEADING ‘Employee|Name’
COLUMN salary JUSTIFY LEFT FORMAT $99,990.00
COLUMN manager FORMAT 999999999 NULL ‘No manager’
COLUMN last_name COLUMN last_name
COLUMN last_name CLEAR COLUMN last_name CLEAR
• 显示 LAST_NAME 列的当前格式。
• 清除 LAST_NAME 列的当前格式设置

9 999999 1234
0 099999 001234
$ $9999 $1234
L L9999 L1234
. 9999.99 1234.00
, 9,999 1,234

15, BREAK命令:
使用BREAK命令去重
BREAK ON job_id

16. TTITLE和BTITLE命令
• 显示报告头和报告尾
TTI[TLE] [text|OFF|ON]
• 设置报告头。
TTITLE ‘Salary|Report’
• 设置报告尾。
BTITLE ‘Confidential’

17. 使用脚本创建报告练习
书写并测试 SQL SELECT 语句。
保存 SELECT 语句到脚本文件。
在编辑器中执行脚本。
在 SELECT 语句前添加格式命令。
在 SELECT 语句后添加终止符。
在 SELECT 后清除格式设置。
保存脚本。
在 iSQL*Plus 的文本框中加载脚本, 点击执行按钮
运行脚本。

18. 通过本课的学习, 你应该学会:
使用 iSQL*Plus 变量临时存储值。
使用 SET 命令控制当前 iSQL*Plus 环境。
使用 COLUMN 命令控制列的输出。
使用 BREAK 命令去重并将结果积分组。
使用 TTITLE 和 BTITLE 显示报告头和报告尾。

第8课: 处理数据
1. 通过本课的学习, 你将可以
使用DML语句;
向表中插入数据;
更新表中的数据;
从表中删除数据;
将表中数据合并;
控制事务;

2. 数据库操纵语言DML
DML可以在下列条件下执行
—-向表中插入数据
—-修改表中现存的数据
—-删除表中现存的数据
事务是由完成若干项工作的DML语句组成的

3. 向表中插入数据
INSERT INTO table(column) VALUES(value);
这种语法一次只能向表中插入一条数据
为每一列添加一个新值。
按列的默认顺序列出各个列的值。
在 INSERT 子句中随意列出列名和他们的值。
字符和日期型数据应包含在单引号中。

4. 向表中插入空值
隐士方式: INSERT INTO departments (department_id, department_name _ _) VALUES (30, ‘Purchasing’);
显示方式: 在VALUES子句中指定空值: INSERT INTO departments VALUES (100, ‘Finance’, NULL, NULL);

5. 插入指定的值:
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);

6. 在SQL语句中使用&变量指定列值
&变量放在VALUES子句中
INSERT INTO dept(deptno, deptname, location_id) VALUES(&deptno, ‘&deptname’, &location_num);

7. 在INSERT语句中加入子查询:
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中的列名对应

8. 更新数据
UPDATE table
SET column=value [, column=value, …]
[WHERE condition];
可以一次更新多条数据;
使用WHERE子句指定需要更新的数据;
如果省略了WHERE子句, 则表中的所有数据都会被更新;

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

10. 在UPDATE子句中使用子查询, 使更新基于另一个表中的数据
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);

11. 更新中的数据完整性错误
UPDATE employees
SET department_id = 55
WHERE department_id = 110;—-integrity constraint (HR.EMP_DEPT_FK) violated – parent key not found(不存在 55 号部门)

12. 删除数据: DELETE语句
DELETE FROM table WHERE condition;—-如果省略WHERE限定条件, 则表中的所有数据都将被删除

13. 在DELETE语句中使用子查询
DELETE FROM emp WHERE deptno=(SELECT deptno FROM emp WHERE dname LIKE ‘_o%’);

14. 删除中的数据完整性错误
DELETE FROM emp WHERE deptno=60;—-integrity constraint (HR.EMP_DEPT_FK) violated – child record found
—-You cannot delete a row that contains a primary key that is used as a foreign key in another table.

15. 在INSERT语句中使用子查询
INSERT INTO(SELECT empno, dname, hiredate, job, salary, deptno FROM emp WHERE deptno=50) VALUES(9999, ‘Green’, TODATE(’08-JUN-98′, ‘DD-MON-RR’), ‘IT_PROG’, 5000, 50);

16. 在DML语句中使用WITH CHECK OPTION关键字
使用子查询表示DML语句中使用的表;
WITH CHECK OPTION关键字用于避免修改子查询范围外的数据
IN97

 

数据库笔记:等您坐沙发呢!

发表评论

表情
还能输入210个字