基本的SQL语句 目标 列出SELECT语句的功能 执行基本的select语句 区分SQL语句和SQL*PLUS命令 select语句的功能 Projection 投影 Selection 选择 Table 1 Table 1 Join 联结 Table 1 Table 2 基本select语句 SELECT *|{[DISTINCT] column|expression [alias],...} FROM table; select确定处理哪些列 from 确定处理哪些表 DISTINCT 禁止重复 column|expression选定的列或者表达式 alias 别名 编写SQL语句 不区分大小写 可以是一行也可以是多行 关键字不能缩写或在中间另起一行 子句通常放在单独的行中 缩进是为了增强可读性 算数表达式 可以使用运算符创建数字或者日期的表达式 可以在除from子句之外的所有子句中使用 Operator + - * / Description Add 加 Subtract 减 Multiply 乘 Divide 除 使用算数运算符 SELECT EMPNO, SAL, SAL + 300 FROM EMP; 计算产生的SAL+300 并 不是 EMP表中的新列,它 只是用于显示而已,默认情 况下,输出显示的新列名来 自于生成该列的计算公式 运算符的优先顺序 乘和除的运算优先级高于加减 优先级相同的运算是从左到右运算 可以用括号来强制优先级 SELECT EMPNO, SAL, 12*SAL+100 FROM EMP; SELECT EMPNO, SAL, 12*(SAL+100) FROM EMP; 关于空值 如果行的某一列没有数据值,就认为该值为空。 空值是指不可用、未分配、未知或不适用的值。"空” 不同于零或空格。零是一个数,而空格是一个字符。 所有数据类型的列都可以包含空值。但是某些约束 (NOT NULL和PRIMARY KEY)不允许在列中使用空 值。 如果算术表达式中的任一列值为空,则结果也为空。例 如,如要以零作为除数执行除法运算,则会出现错误。 但是,如果以空值作为除数执行除法运算,则结果为空 值或未知。 定义列别名 重命名列标题 有助于计算 紧跟在列名的后面在列名和别名之间可以有 可选的关键字AS 如果它包含空格或特殊字符或者区分大小写, 则需要使用双引号 使用列别名 SELECT ENAME AS 姓名, JOB 职位 FROM EMP; 连接运算符 将列或字符串连接到其它列 由两条竖线(||)表示 创建一个合成列,它是字符表达式 字符文字值必须包含在单引号中。 在结果输出中,每个返回的行都会将每个字符串显示一次。 SELECT FROM ENAME||EMPNO AS "Employees" EMP; SELECT ENAME ||' is a '||EMPNO AS "Employee Details" FROM EMP; 重复行 查询默认显示所有的行,包括:重复行。 SELECT DEPTNO FROM emp; SELECT DISTINCT DEPTNO FROM emp; 显示表的结构 SQLPLUS 命令 DESCRIBE emp 数据类型 说明 NUMBER(p,s) 最大位数为p,小数点右边的位数为s的数字值 VARCHAR2(s) 最大尺寸为S的可变长度字符值 DATE 公元前4712年1月1 R到公元9999年12月31 R之间的F1期和 时间值 CHAR(s) 大小为s的固定长度字符值 限制和排序数据 对查询检索的行进行限制 对查询检索的行进行排序 限制选定的行 使用WHERE子句可以限制返回的行。 WHERE子句在FROM子句的后面。 SELECT *|{[DISTINCT] column|expression [alias],...} FROM table; 字符串和日期 字符串和日期值包含在单引号中。 字符值是区分大小写的,而日期值是区分格式的。 默认日期格式为DD-MON-RR。 SELECT EMPNO, ENAME, JOB, DEPTNO FROM emp WHERE DEPTNO = 90 ; SELECT EMPNO, ENAME, JOB, DEPTNO FROM emp WHERE ENAME = ‘KING’ ; 比较条件 Operator Meaning = Equal to > Greater than >= Greater than or equal to < Less than <= Less than or equal to <> Not equal to BETWEEN Between two values ...AND... (inclusive) IN(set) Match any of a list of values LIKE Match a character pattern IS NULL Is a null value 示例 select empno, ename, job, sal, deptno from emp where sal < 2000; select empno, ename, job, sal, deptno from emp where sal between 1000 and 2000; select empno, ename, job, sal, deptno from emp where deptno in (20,30); select empno, ename, job, sal, deptno from emp where ename like 'K%'; %代表零或许多字符。 _代表一个字符。 select empno, ename, job, comm, deptno from emp where comm is NULL; 逻辑条件 Operator Meaning AND OR NOT Returns TRUE if both component conditions are true Returns TRUE if either component condition is true Returns TRUE if the condition is false select empno, ename, job, sal, deptno from emp where sal < 3000 and ename like 'J%'; select empno, ename, job, sal, deptno from emp where sal < 3000 and ename not like 'J%'; 逻辑条件 select empno, ename, job, sal, deptno from emp where sal < 3000 or ename like ‘K%'; select empno, ename, job, sal, deptno from emp where sal < 3000 and ename not in ('WARD','KING'); 运算符优先级 1 2 3 4 5 6 7 8 算术运算符 连接运算符 比较条件 IS [NOT] NULL、 LIKE、 [NOT] IN [NOT] BETWEEN NOT逻辑条件 AND逻辑条件 OR逻辑条件 示例 select empno, ename, job, sal, deptno from emp where ename = 'KING' or deptno = 20 and sal < 2000; ORDER BY 子句 使用ORDER BY子句可以对行进行排序 ASC:升序,这是默认设置 DESC:降序 ORDER BY子句在SELECT语句的最后。 可以ORDER BY 别名 select empno, ename, sal from emp order by sal; select empno, ename, sal, deptno from emp where deptno=30 order by sal; select empno, ename, sal*12 year, deptno from emp order by year; 按照多个列进行排序 select empno, ename, sal, deptno from emp order by sal,deptno; select empno, ename, sal, deptno from emp order by deptno,sal; ORDER BY列表的顺序就是所排列的顺序。 即使列不在SELECT列表中,仍可以按该列进行排序。 练习 1. 2. 3. 4. 5. 创建一个查询,显示薪金超过3000的员工的名字和薪金。将SQL语句保 存到名为labl. sql的文本文件中并运行查询。 创建一个查洵,显示员工编号为7782的员工的名字和部门编号。 列出薪金在1000到3000之间并且在部门20或部门30中的员工的姓名和 薪金。分别将列标记为"Employee"和"Monthly Salary“ 显示在1981年聘用的每位员工的姓名和聘用日期。 显示员工姓名中有“A”和“E”的所有员工的姓名。 函数 描述可在SQL中使用的各类函数 在SELECT语句中使用字符、数字和日期函数 描述转换函数的用途 函数可使基本查询块的功能更强大,并可用于处理数据 值这里主要介绍字符、数字和日期函数,以及将数据从 一种类型转换为其它类型(例如将字符数据转换为数字 数据)的函数。 SQL函数 函数是SQL的一项强大功能,可以用于执行以下任务: • 进行数据计算 • 修改单个数据项 • 处理成组行的输出 • 指定日期和数字的显示格式 • 转换列数据类型 SQL函数有时会使用参数,并且总是返回一个值。 注:本课讲述的大多数函数都是Oracle SQL专用的。 函数种类 有两种不问类型的函数: 单行函数 多行函数 单行函数 这些函数只处理单个行,并且为每行返回一 个结果。单行函数有几种不同的类型。 • 常规函数 • 字符函数 • 数字函数 • 日期函数 • 转换函数 多行函数 这些函数可以处理成组的行,从而为每组行 返回一个结果。这些函数被称为分组函数。 它们会在后面的课程中介绍。 字符函数 LOWER (column / expression) 将字母字符值转换为小写 UPPER (column / expression) 将字母字符值转换为大写 INITCAP (column / expression) 将字母字符值转换为每个词的首 字母为大写,其它所有 字母为小写 CONCAT(column1 / expression1 , column2 / expression2) 将第 一个字符值与第二个字符值相连 SUBSTR(column / expression, m [,n]) 返回字符值中的指定字 符,这些字符从字符值的第m 个字符开始,长度为n个字符(如果m为负 数,则 将从字符值的末尾开始算起。如果省略n,则将返回一直到字符串 末尾的所有字符。 LENGTH(column / expression) 返回表达式屮的字符数 日期函数 所有日期的默认显示和输入格式为DD-MON-RR。 有效Oracle日期介于公元前4712年1月1日至公元9999年12月31日之间。 SYSDATE 函数 SYSDATE是一个日期函数,它会返回数据库服务器的当前日期和时间。 您可以和使用任何其它列名一样使用SYSDATE„例如,可以通过从表中选 择SYSDATE来显示当前日期。通常是从名为DUAL的空表中选SYSDATE。 select sysdate from dual; 与日期有关的运算 对日期进行加减运算,以获得新的日期值。 将两个日期相减,以得出它们之间的天数。 将小时数除以24,以将小时添加到日期中。 运算 结果 说明 日期+数字 日期 向日期巾添加天数 日期-数字 日期 从日期巾减去天数 日期-日期 天数 从一个日期中减去另一个日期 日期+数字/24 日期 向日期中添加小时数 日期函数 函数 说明 MONTHS_BETWEEN 两个日期之间的月数 ADD_MONTHS 将日历月份添加到日期中 NEXT_DAY 指定日期的下一天 LAST_DAY 月份的最后一天 ROUND 舍入日期 TRUNC 截断日期 日期函数 Function Result MONTHS_BETWEEN 19.6774194 ('01-SEP-95','11-JAN-94') ‘29-FEB-96' ADD_MONTHS (‘31-JAN-96',1) NEXT_DAY LAST_DAY ('01-SEP-95','FRIDAY') ('01-FEB-95') '08-SEP-95' '28-FEB-95' 日期函数 转换函数 TO_NUMBER NUMBER TO_DATE CHARACTER TO_CHAR TO_CHAR DATE 使用TO_CHAR TO_CHAR(date, 'format_model') 格式样式具有以下特性: • 必须包含在单引号中,并且是区分大小写的 • 可以包含任何有效日期格式元素 • 具有一个fm元素,可以删除填充的空白或取消前导零 • 与日期值之间通过逗号分隔 select ename, to_char(hiredate,'YYYY-MM-FMDD') from emp; 日期格式样式 YYYY 用数字表示的完整年份 YEAR 用字母拼写的年份 MM 代表月份的两位数值 MONTH 月份的全名 MON 代表月份的三个字母缩写 DY 代表星期几的三个字母缩写 DAY 星期几的全名 DD 用数字表示的月份中的某日 时间格式 元素 说明 AM 或 PM 正午指示符 A.M.或 P.M 带有句点的正午指示符 HH 或 HH12 或 HH24 天中的小时,或小时(1-12),或小时(0-23) MI 分钟(0-59) SS 秒(0-59) SSSSS 午夜之后的秒数(0-86399) 函数的嵌套 单行函数可以嵌套任意层。 嵌套的函数从最深层开始,直到最外层。 F3(F2(F1(col,arg1),arg2),arg3) Step 1 = Result 1 Step 2 = Result 2 Step 3 = Result 3 常规函数 这些函数可以使用任何数据类型,并且适合使用空值。 NVL (exprl, expr2) NVL2 (exprl, expr2, expr3) NULLIF (exprl, expr2) COALESCE (exprl, expr2, …, exprn) 函数 说明 NVL 将空值转换为实际的值 NVL2 如果expr1为非空值,NVL2将返回expr2。如果exprl为空值,NVL2将 返回expr3。参数expr1可以是任何数据类型。 NULLIF 将两个表达式进行比较,如果相等,则返回空值,如果不相等,则返回 第一个表达式 COALESCE 返回表达式列表巾的第一个非空表达式 显示多个表中的数据 编写SELECT语句,以便使用等值联结或非 等值联结来访问多个表中的数据 使用外联结查看通常不满足联结条件的数据 使用自联结将表联结到自身 笛卡尔积的形成 当出现以下情况时,将形成笛卡尔乘积: -联结条件被省略 -联结条件无效 -第一个表中的所有行与第二个表中的所有行相联结 为了避免出现笛卡尔乘积,请务必在WHERE 子句中使用有效的联结条件。 select empno, ename, dname from emp,dept; 将两个表联结起来 在WHERE子句中编写联结条件。 如果在多个表中出现了相同的列名,则在列名的前面加 上表名作为前缀。 SELECT table1.column, table2.column FROM table1, table2 WHERE table1.column1 = table2.column2; 什么是等值联结 若要确定员工的部门名称,您需要将EMP表 中DEPTNO的值与DEPT表中DEPTNO值进 行比较。EMP和DEPT表之间的关系就是等 值联结,即这两个表的DEPTNO列的值必须 相等。 注:等值联结也称为简单联结或内联结。 联结两个以上的表 若要将n个表联结在一起,您最少需要n-1 个联结条件。例如,要联结三个表,则最少 需要两个联结。 如 把 EMP,DEPT,LOCATIONS表连接 例如 使用AND运算符附加搜索条件 除了联结外,可能还需要对WHERE子句添 加一些条件,从而考虑对联结中一个或多个 表中的行加以限制。例如,要显示员工 KING的部门编号和部门名称,在WHERE 子句中还需要一个附加的条件。 select empno, ename, dname from emp,dept where emp.deptno=dept.deptno and emp.ename=‘KING’; 非等值连接 select ename,grade from emp,salgrade where emp.sal between losal and hisal; emp表的SAL总是在 SALGRADE的各个级别之间 三个表联结举例 列出所有员工的名字、部门名称、工资等级 自联结 有时,需要将表联结到自身。要想查找每位员工的 经理姓名,您需要将EMP表联结到自身,也就是执 行自联结。 例如,要查找SMITH的经理姓名,需要执行以下 操作: select worker.ename || ' works for ' || manager.ename from emp worker, emp manager where worker.MGR=manager.empno; 使用分组函数 确定可用的分组函数 描述分组函数的使用 使用GROUP BY子句对数据进行分组 使用HAVING子句包含或排除已分组的行 分组函数 AVG COUNT MAX MIN SUM 函数 说明 AVG([DISTINCT|ALL]n) n的平均值,忽略空值 COUNT({*|[DISTINCT|ALL] expr}) 行数,其中expr 用来判定非空值 (使用*计 算所有选定行,包 括重复行和带有空值的行) MAX([DISTINCT|ALL]expr) expr的最大值,忽略空值 MIN([DISTINCT|ALL]expr) expr的最小值,忽略空值 SUM( [DISTINCT|ALL]n) n的总计值,忽略空值 举例 Maximum salary in EMPLOYEES table … 分组函数语法 举例 EMP 4400 9500 3500 6400 10033 … Average salary in EMPLOYEES table for each department 使用分组函数的错误用法 排除组结果:HAVING子句 可以使用HAVING子句来限制组: 1.对行进行分组。 2.应用分组函数。 3.显示符合HAVING子句的组。 关于HAVING子句 使用HAVING子句指定要显示的组,然后根据汇总信息进一步 地对组进行限制。 在此语法中: group_condition 限制成组的行返回到那些符合指定条件的组 在使用HAVING子句时,Oracle服务器会执行以下步骤: 1.对行进行分组。 2.对组应用分组函数。 3.显示符合HAVING子句中的条件的组。 HAVING子句可以在GROUP BY子句之前,但建议将GROUP BY子句放在前面,因为这样更符合逻辑。首先形成分组并计算 分组函数,然后再将HAVING子句应川于SELECT列表中的组。 子查询 子查询(内部查询)在执行主查询之前执行一次。 然后主查询(外部查询)会使用该子查询的结果。 使用查询解决问题 具有子查询旳HAVING子句 Oracle服务器会首先执行子査询。 然后,Oracle服务器会将结果返回到主查询 的HAVING子句中。 SELECT ename, empno, sal 800 FROM emp WHERE sal = (SELECT MIN(sal) FROM emp); 此句中有什么错误 子查洵的常见错误是单行子查询返回了多个行。 SELECT empno, ename FROM emp WHERE sal = (SELECT MIN(sal) FROM emp GROUP BY deptno); 多行子查询 返回多个行 使用多行比较运算符 运算符 含义 IN 等于列表中的任意一个 ANY 将值与子查询返回的任意一个值进行比较 ALL 将值与子查询返回的每个值进行比较 返回多个行的子查询被称为多行子查询。在多行查询中使用的是多 行运算符,而不是单行运算符。多行运算符可以用于一个或多个值。 多行子查询例子 Select empno, ename, sal From emp Where sal > ANY (select MIN(sal) from emp group by deptno ) 查找薪金等于各个部门最低薪金的所有员工。 内部查询会首先执行,并产生一个查询结果。然后再处理主查询块,它使 用内部査询返回的值来完成它的搜索条件。事实上,主查询将以下面的形 式出现在Oracle服务器中: Select empno, ename, sal From emp Where sal in (950, 800, 1300) 处理数据的 DML(Data Manipulation Language ) 语句 向表中插入行 更新表中的行 从表中删除行 合并表中的行 控制事务处理 向表中添加新行的INSERT语句 table 是表的名称 column 是表中要填充的列的名称 value 是该列相应的值 插入新行 按照表中列的默认顺序列出值。 在表名之后列出列。(可选) 将字符和日期值包含在单引号中。 INSERT INTO EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) VALUES (7935, 'SCOTT', 'CLERK', 7782, '15-1月-82', 1400, 0, 10); 由于可以插入每列都包含值的新行,INSERT子句不需要列列表。 但是,如果不使用列列表,值必须按照表中列的默认顺序列出,并且必须为每一 列提供一个值。 建议 为清楚起见,请在INSERT子句中使用列列 表。将字符值和日期值包含在单引号中,建 议不要将数字值包含在单引号中。 数字值不应包含在单引号中,原因是如果使 用了单引号,分配给NUMBER数据类型列 的数字值可能会发生隐式转换。 插入带有空值的行 隐式方法:在列列表中省略该列。 显式方法:在VALUES子句中指定NULL关键字。 方法 说明 隐式 在列列表中省略该列。 显式 在VALUES列表中指定NULL关键字, 在VALUES列表中为字符串和日期指定空字符串(‘ ’)。 INSERT INTO EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, DEPTNO) VALUES (7936, 'SCOTTB', 'CLERK', 7782, '15-1月-82', 1500, 10); 插入特殊值 SYSDATE函数记录当前日期和时间。 INSERT INTO EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, DEPTNO) VALUES (7937, 'SCOTTB', 'CLERK', 7782, SYSDATE, 1520, 10); INSERT INTO EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, DEPTNO) VALUES (7938, 'SCOTTC', 'CLERK', 7782, TO_DATE('2011-11-2','YYYY-MM-DD'), 1520, 10); 从其他表中复制行 编写使用子査询的INSERT语句。 不要使用VALUES子句。 使INSERT子句中的列数与子查询中的列数匹配。 INSERT INTO BONUS SELECT ENAME, JOB, SAL, SAL FROM EMP WHERE ENAME='SCOTT'; 在INSERT语句中使用子查询 可以用子查询代替INSERT语句的INTO子句中的 表名。 此子查询的选择列表必须与VALUES子句的列列表 具有相同的列数。 INSERT INTO (SELECT EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO FROM EMP WHERE DEPTNO = 20) VALUES (7939, 'SCOTT6', 'CLERK', 7782, '15-1月-82', 1400, 0, 10) WITH CHECK OPTION 关键字 指定WITH CHECK OPTION就指明了如下情况:如果在 INSERT、UPDATE或DELETE语句中使用子查询代替表,则 不允许对该表进行更改以免产生子查询中不包含的行。在显示 的示例中,使用了 WITH CHECK OPTION关键字。子查询中 指定了査询部门20中的行, 但部门标识在SELECT中未指定的是10该部门标识不在子查询 中。 INSERT INTO (SELECT EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO FROM EMP WHERE DEPTNO = 20 WITH CHECK OPTION) VALUES (7940, 'SCOTT6', 'CLERK', 7782, '15-1月-82', 1400, 0, 10) 用UPDATE更改表中的数据 在此语法中: table 是表的名称 column 是表中要填充的列的名称 value 是该列相应的值或子查询 condition 指定要更新的行,它由列名表达式、常数、子查询和比较运算符组成 更改表中的行 如果指定了 WHERE 子句,则可以修改特定的某多个行。 如果省略了 WHERE 子句,则会修改表中的所有行。 UPDATE EMP SET ENAME = 'SNOWFLY' WHERE EMPNO = 7938; 用子查询更新两个列 更新员工7938的职务和薪金,使之与员工7782的职务和薪金相同。 UPDATE EMP SET JOB = (SELECT JOB FROM EMP WHERE EMPNO = 7782), SAL = (SELECT SAL FROM EMP WHERE EMPNO = 7782) WHERE EMPNO = 7938; 也可以根据另一个表来更新 从表中删除行 table 是表名 DELETE FROM EMP WHERE ENAME = 'SCOTTB'; condition 指定要删除的行,它由列名、表达式、常数、子查询和比较运算符组成 如果指定了 WHERE子句,则可以删除特定的行。 如果省略了 WHERE子句,则会删除表中的所有行。 根据另一个表删除行 在DELETE语句中使用子查询,以便根据另一个表中的 值来删除表中的行。 DELETE FROM EMP WHERE ENAME = (SELECT ENAME FROM BONUS) 数据库事务处理 构成一个逻辑工作单元的DML语句的集合称为一个 事务处理。 假设有一个银行数据库。当银行客户从储蓄帐户向 支票帐户中划转资金时,该事务处理可能由三个单 独的操作组成:减少储蓄帐户额、增加支票帐户额、 在事务处理日志中记录该事务处理。 Oracle服务器必须保证三个SQL语句都得以执行, 才能使两个帐户结算正确。如果因为某种原因而使 该事务处理中的某个语句没能执行,则其它语句也 必须撤消。 数据库事务处理 在执行第一个DML SQL语句时开始 在发生下列事件之一时结束: -发出COMMIT或ROLLBACK语句 -执行DDL或DCL语句(自动提交) -用户退出SQL*Plus -系统崩溃 COMMIT 和 ROLLBACK 语句的优点 使用COMMIT和ROLLBACK语句,可以: •确保数据的一致性 •在使更改永久化之前预览数据更改 •按逻辑关系对相关操作进行分组 SQL语言 数据查询语言DQL SELECT 数据操纵语言DML INSERT UPDATE DELETE 事务处理 COMMIT ROLLBACK SAVEPOINT 数据定义语言DDL CREATE ALTER DROP RENAME TRUNCATE 数据控制语言DCL GRANT REVOKE 控制事务处理 事务处理语句 语句 说明 COMMIT 将所有待定的数据更改永久化,从而结束当前的事务 处理 SAVEPOINT name 在当前事务处理中标记一个保存点 ROLLBACK ROLLBACK将放弃所有待定的数据更改,从而结束当前 的事务处理 ROLLBACK TO SAVEPOINT name ROLLBACK TO SAVEPOINT将当前的事务处理回退到 指定的 保存点,从而放弃从该保存点之后所作的所有 更改和/或创建的保存点。 如果省略了 TO SAVEPOINT子句,ROLLBACK 语句 将回退整个事务处理。由于保存点是逻辑的,因此无法 列出创建的保存点。 隐式事务处理 在下列情况下会自动提交: -发出DDL语句 -发出DCL语句 -正常退出SQL*Plus,而没有显式地发出 COMMIT或ROLLBACK 语句在SQL*PIUS 异常终止或出现系统故障的情况下会发生自 动回退。 COMMIT 或 ROLLBACK 操作之前数据的状态 可以将数据恢复到以前的状态。 当前用户可以用SELECT语句复查DML操作的 结果。 其他用户不能查看当前用户的DML语句的结果。 受影响的行会被锁定,其他用户无法更改这些 行中的数据。 COMMIT操作之后数据的状态 数据库中的数据更改被永久化。 以前的数据状态永久丢失。 所有用户都可以查看结果。 受影响行的锁定被释放;其他用户可以对这 些行进行处理。 所有保存点都被清除。 ROLLBACK操作之后数据的状态 数据更改被撤消 数据还原到以前的状态。 受影响行的锁定被释放。 读一致性 读一致性可以确保用户在任何时候看到的数 据都是一致的。 一个用户进行的更改不会与另一个用户进行 的更改冲突。 读一致性可以确保对于同一数据: -读取者不必等待写入者。 -写入者不必等待读取者。 读一致性 锁定 在Oracle数据库中,锁具有以下特性: • 防止并发事务处理之间的破坏性交互作用 • 不需要用户操作 • 自动使用最低级别的限制 • 在事务处理期间保持锁定 • 具有两种类型:显式锁定和隐式锁定 锁定 两种锁定模式: -排它模式:不允许其他用户访问 -共享模式:允许其他用户访问 高级别数据并发: -DML:表共享,行排它 -查询:不需要锁定 -DDL:保护对象定义 在提交或回退之前一直保持锁定 创建和管理表 表的命名规则 表名和列名: • 必须以字母开头 • 长度必须是1-30个字符 • 只能包含 A-Z、a-z、0-9、_、$ 和 # • 不能与同一用户拥有的其它对象重名 • 不能是Oracle服务器的保留字 CREATE TABLE 语句 CREATE TABLE [schema.]table (column datatype [DEFAULT expr] [, ...]) schema 是所有者的姓名 table 是表的名称 DEFAULT expr 指定一个默认值,当INSERT语句中没有指定值时,则使用该默认值 column 是列的名称 datatype 是列的数据类型和长度 DEFAULT 选项 指定插入时的列的默认值。 ... hiredate DATE DEFAULT SYSDATE, ... 文字值、表达式或SQL函数都是合法的值。 其它列的名称或伪列是不合法的值。 默认数据类型必须与列数据类型匹配。 Oracle数据库中的表 用户表: -是由用户创建和维护的表的集合 -包含用户信息 数据字典: -是由Oracle Server创建和维护的表的集合 -包含数据库信息 数据字典的表 前缀 说明 USER_ 这些视图包含关于用户拥有的对象的信息 ALL_ 这些视图包含关于用户可以访问的所有表(对象表和关系表) 的信息。 DBA_ 这些视图是受限视图,它们只能由被指定了 DBA角色的人员 访问。 v$ 这些视图是动态性能视图,反映数据库服务器性能、A存和锁 的动态性能。 使用子查询语法创建表 通过组合CREATE TABLE语句禾口 AS subquery选项可以创建表并插入行。 使指定列的数量与子査询列数匹配。 定义具有列名和默认值的列 CREATE TABLE COPY_EMP AS SELECT * FROM EMP; ALTER TABLE 语句 使用ALTER TABLE语句可以执行以下任务: • • • • 添加新列 修改现有列 为新列定义默认值 删除列 ALTER TABLE 语句 删除表DROP TABLE 该表的所有数据和结构都会被删除。 所有待定事务处理都会被提交。 所有索引都会被删除。 无法回退DROP TABLE语句。 只有表的创建者或具有DROP ANY TABLE权限的用 户才能删除表。 和所有DDL语句一样,DROP TABLE是自动提交的。 DROP TABLE COPY_EMP; 更改表名 rename copy_emp to copy2_emp; 删除表的内容 TRUNCATE TABLE 语句 -删除表的所有行 -释放该表使用的存储空间 如果使用TRUNCATE,您就无法回退行删除 操作。 也可以使用DELETE语句删除行。 小结 如何使用DDL语句来创建、更已改、删除和重命名表 语句 说明 CREATE TABLE 创建表 ALTER TABLE 修改表结构 DROP TABLE 删除行和表结构 RENAME 更改表的名称 TRUNCATE 删除表的所有行并释放存储空间 约束 约束会在表级别上强制执行规则。 约束可以防止在存在相关性时删除表。 防止将无效的数据录入到表中。 约束有如下几种: -NOT NULL -UNIQUE -PRIMARY KEY -FOREIGN KEY -CHECK 约束 约束 说明 NOT NULL 指定该列不能包含空值 UNIQUE 指明一个列或列组合巾的值对于该表巾的所有行来 说必须是唯一的 PRIMARY KEY 唯一标识表巾的每一行 FOREIGN KEY 在列和被引用表的列之间建立并实施一个外键关系 CHECK 指定条件必须为真 约束准则 可以给约束命名,也可以由Oracle服务器使 用SYS_Cn格式产生一个名称。 可以在以下的任一时刻创建约束: -在创建表的同时创建约束,或在表创建之后创建约束 -可以在列或表级别上定义约束。 -可以在数据字典中査看约束。 定义约束 定义约束 schema 是所有者的姓名 table 是表的名称 DEFAULT expr 指定一个默认值,当INSERT语句中没有指 定值时,则使用该默认值 column 是列的名称 datatype 是列的数据类型和长度 column_constraint 是作为列定义的一部分的完整性约束 table_constraint 是作为表定义的一部分的完整性约束 定义约束 constraint_name constraint_type 是约束的名称 是约束的类型 NOT NULL 约束 UNIQUE 约束 PRIMARY KEY 约束 PRIMARY KEY约束将为表创建一个主键。 每个表只能创建一个主键。 PRIMARY KEY约束是唯一标识表中每行的一个列或 列集合。此约束将强制实行列或列组合的唯一性,并且 确保作为主键的一部分的列不包含空值。 PRIMARY KEY 约束 FOREING KEY 约束