当前位置:首页 >> 高中教育 >> 第3章 SQL语句基础之DML

第3章 SQL语句基础之DML


第3章 SQL语句基础之DML

授课人:吴志霞 电话:15305553060 QQ:1035837738 http://blog.sina.com.cn/helenmist

课程目标
? 熟练掌握及运用SQL语句,进行数据的查询 及管理

课程内容
? 数据管理SQL语句 ? 数据查询SQL语



课时安排
? 理论:4学时 ? 实践:4学时

授课方法
? 案例演示

数据管理
? 数据的插入 ? 数据的修改 ? 数据的删除

数据的插入
? 两种插入数据方式
1. 插入元组

2. 插入子查询结果

插入元组
? 语句格式
INSERT INTO <表名> [(<属性列1>[,<属性列2 >…)] VALUES (<常量1> [,<常量2>] … )

? 功能
? 将新元组插入指定表中

? 示例
INSER INTO Student (Sno,Sname,Ssex,Sdept,Sage) VALUES ('200215128','陈冬','男','IS',18)

注意事项
? INTO子句 ? 属性列的顺序可与表定义中的顺序不一致 ? 没有指定属性列 ? 指定部分属性列
?

VALUES子句
?

提供的值必须与INTO子句匹配

? 值的个数 ? 值的类型

课堂练习
? [例1] 插入一条课程记录( ?1?,‘计算机英语 ')。 ? [例2] 插入一条选课记( '200215128','1 ')。

插入子查询结果
? 语句格式 INSERT INTO <表名> [(<属性列1> [,<属性列2>… 子查询 ? 功能 将子查询结果插入指定表中

)]

注意事项
? INTO子句(与插入元组类似)
? 子查询 ? SELECT子句目标列必须与INTO子句匹配

? 值的个数 ? 值的类型

示例
对每一个系,求学生的平均年龄,并把结果存入数据库。
第一步:建表
CREATE TABLE Dept_age (Sdept CHAR(20) Avg_age SMALLINT); /* 系名*/ /*学生平均年龄*/

第二步:插入数据
INSERT INTO Dept_age(Sdept,Avg_age) SELECT Sdept,AVG(Sage) FROM Student GROUP BY Sdept;

修改数据
? 语句格式
UPDATE <表名> SET <列名>=<表达式>[,<列名>=<表达式 >]… [WHERE <条件>]

? 功能
?

修改指定表中满足WHERE子句条件的元组

三种修改方式
1. 修改某一个元组的值
2. 修改多个元组的值

3. 带子查询的修改语句

示例
[例] 将学生200215126的年龄改为22岁
UPDATE Student SET Sage=22 WHERE Sno=‘ 200215126 ’

[例] 将所有学生的年龄增加1岁
UPDATE Student SET Sage= Sage+1 [例] 将计算机科学系全体学生的成绩置零。 UPDATE SC SET Grade=0 WHERE ‘IS'= (SELETE Sdept FROM Student WHERE Student.Sno = SC.Sno)

删除数据
? 语句格式
DELETE FROM ? 功能
?

<表名>

[WHERE <条件>]; 删除指定表中满足WHERE子句条件的元组

? WHERE子句
?
?

指定要删除的元组
缺省表示要删除表中的全部元组,表的定义仍在字典中

三种删除方式
1. 删除某一个元组的值
2. 删除多个元组的值

3. 带子查询的删除语句

示例
[例] 删除学号为200215128的学生记录。
DELETE FROM Student WHERE Sno= ?200215128?

[例] 删除所有的学生选课记录。
DELETE FROM SC; [例] 删除计算机科学系所有学生的选课记录。 DELETE FROM SC WHERE 'CS'= (SELETE Sdept FROM Student WHERE Student.Sno=SC.Sno);

数据查询
? 语句格式
SELECT [ALL|DISTINCT] <目标列表达式>

[,<目标列表达式>] …

FROM <表名或视图名>[, <表名或视图名> ] …
[ WHERE <条件表达式> ] [ GROUP BY <列名1> [ HAVING <条件表达式> ] ] [ ORDER BY <列名2> [ ASC|DESC ] ];

数据查询
? 单表查询
? 连接查询

? 嵌套查询
? 集合查询

? Select语句的一般形式

单表查询
? 查询仅涉及一个表:

? 一、选择表中的若干列 ? 二、选择表中的若干元组 ? 三、 ORDER BY子句 ? 四、 聚集函数

? 五、 GROUP BY子句

选择表中的若干列——查询指定列
[例1] 查询全体学生的学号与姓名。
SELECT Sno,Sname FROM Student;

选择表中的若干列——查询全部列
方法一:在SELECT关键字后面列出所有列名 方法二:<目标列表达式>指定为 * [例] 查询全体学生的详细记录。
SELECT Sno,Sname,Ssex,Sage,Sdept FROM Student; 〈==〉 SELECT * FROM Student;

选择表中的若干列——查询经过计算的值
? SELECT子句的<目标列表达式>可以为:
? ? 算术表达式 字符串常量

?
?

函数
列别名

[例] 查全体学生的姓名及其出生年份。 SELECT Sname,2009-Sage /*假定当年的年份为2009年 */ FROM Student;

选择表中的若干列——查询经过计算的值(示例)
[例] 查询全体学生的姓名、出生年份和所有系,要求用小写字母 表示所有系名

SELECT Sname,‘Year of Birth: ', LOWER(Sdept) FROM Student;

单表查询
? 查询仅涉及一个表:

? 一、选择表中的若干列 ? 二、选择表中的若干元组 ? 三、 ORDER BY子句 ? 四、 聚集函数

? 五、 GROUP BY子句

选择表中的若干元组——DISTINCT关键词
? 消除取值重复的行——运定DISTINCT关键词
[例] 查询选修了课程的学生学号。
SELECT Sno FROM SC; 〈=〉SELECT ALL Sno FROM SC FROM SC//运定DISTINCT关键词,去掉表中重复的

SELECT DISTINCT Sno 行

如果没有指定DISTINCT关键词,则缺省为ALL

选择表中的若干元组——查询满足条件的元组
查询条件 比 较 谓 词 =,>,<,>=,<=,!=,<>,!>,!<;NOT+上述比较运 算符 BETWEEN AND,NOT BETWEEN AND IN,NOT IN

确定范围 确定集合

字符匹配
空 值 多重条件(逻辑运算)

LIKE,NOT LIKE
IS NULL,IS NOT NULL AND,OR,NOT

选择表中的若干元组——查询满足条件的元组(示例)
[例]查询计算机科学系全体学生的名单。

SELECT Sname from student where sdept=?IS?

[例]查询所有年龄在20岁以下,性别为‘女’的学生姓名及其年龄。 Select Sname,Sage from student where sage<20 AND ssex=?女’ [例]查询年龄在20~23岁(包括20岁和23岁)之间的学生的 姓名、系别和年龄 Select sname,sdept,sage from Student where sage between 20 and 23 [例]查询既不是信息系(IS)、外语系(EN),也不是中文(CN)系的 学生的姓名和性别。 Select sname,ssex from Student where sdept NOT IN (?IS?,?EN?,?CN?)

选择表中的若干元组——查询满足条件的元组(Like关键字的
用法)
1) 匹配串为固定字符串

[例] 查询学号为200215121的学生的详细情况。
SELECT * WHERE ? SELECT * WHERE FROM Student Sno LIKE ?200215121?; FROM Student Sno =?200215121?;

2) 匹配串为含通配符的字符串(“%”与“_”) [例] 查询所有姓李学生的姓名、学号和性别。 Select Sname,Sage,Ssex from student where Sname like ?李%' [例] 查询姓"欧阳"且全名为三个汉字的学生的姓名。 Select Sname from student where Sname like '欧阳_? 3)使用换码字符将通配符转义为普通字符 [例] 查询所有以‘_?打头第三个字为‘阳’的学生的姓名、学号和性别。 Select Sname,Sno,Ssex from student where Sname like ?\__阳 %? ESCAPE ?\?

?
Select Sname,Sno,Ssex from student where Sname like '*__阳%' ESCAPE '*'

课堂练习
[例] 查询名字中第2个字为"阳"字的学生的姓名和学号。 [例] 查询所有不姓刘的学生姓名。

SELECT Sname,Sno FROM Student WHERE Sname LIKE ?__阳%?; SELECT Sname,Sno,Ssex FROM Student WHERE Sname NOT LIKE '刘%';

选择表中的若干元组——查询满足条件的元组( IS NULL 或
IS NOT NULL的用法)

? “IS” 不能用 “=” 代替
[例] 某些学生选修课程后没有参加考试,所以有选课记录,但没 有考试成绩。查询缺少成绩的学生的学号和相应的课程号。

SELECT Sno,Cno FROM SC WHERE Grade IS NULL [例] 查所有有成绩的学生学号和课程号。

SELECT Sno,Cno FROM SC WHERE Grade IS NOT NULL;

选择表中的若干元组——查询满足条件的元组(多重条件查询)
? 逻辑运算符:AND和 OR来联结多个查询条件
? AND的优先级高于OR ? 可以用括号改变优先级

? 可用来实现多种其他谓词
? [NOT] IN ? [NOT] BETWEEN … AND …

示例
[例] 查询信息系(IS)、外语系(EN)和中文系 (CN)学生的姓名和性别。
SELECT Sname,Ssex FROM Student WHERE Sdept IN ( 'IS',‘EN','CN' )

可改写为:
SELECT Sname,Ssex FROM Student WHERE Sdept= ' IS ' OR Sdept= ' EN' OR Sdept= ' CN '

单表查询
? 查询仅涉及一个表:

? 一、选择表中的若干列 ? 二、选择表中的若干元组 ? 三、 ORDER BY子句 ? 四、 聚集函数

? 五、 GROUP BY子句

ORDER BY子句
? ORDER BY子句

? 可以按一个或多个属性列排序
? 升序:ASC;降序:DESC;缺省值为升序
? 当排序列含空值时

? ASC:排序列为空值的元组最后显示
? DESC:排序列为空值的元组最先显示
? 示例 [例] 查询计算机系学生的学号及其姓名,查询结果按年龄降序排列。 [例]查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的 学生按年龄降序排列。 SELECT * FROM Student ORDER BY Sdept,Sage DESC

单表查询
? 查询仅涉及一个表:

? 一、选择表中的若干列 ? 二、选择表中的若干元组 ? 三、 ORDER BY子句 ? 四、 聚集函数

? 五、 GROUP BY子句

聚集函数
? 聚集函数: ? 计数
COUNT([DISTINCT|ALL] *) COUNT([DISTINCT|ALL] <列名>)

? ? ?

计算总和
SUM([DISTINCT|ALL] <列名>)

计算平均值
AVG([DISTINCT|ALL] <列名>)

最大最小值

MAX([DISTINCT|ALL] <列名>)
MIN([DISTINCT|ALL] <列名>)

示例:
[例] 查询学生总人数。
SELECT COUNT(*) FROM Student;

[例] 计算1号课程的学生平均成绩。 SELECT AVG(Grade) FROM SC

WHERE Cno= ' 1 ‘
[例] 查询选修1号课程的学生最高分数。
SELECT MAX(Grade) FROM SC WHER Cno= ‘ 1 ’

[例]查询学生07001选修课程的总分数。

select sum(score) as sum from sc where sno='07001'

单表查询
? 查询仅涉及一个表:

? 一、选择表中的若干列 ? 二、选择表中的若干元组 ? 三、 ORDER BY子句 ? 四、 聚集函数

? 五、 GROUP BY子句

GROUP BY子句
? GROUP BY子句分组:
细化聚集函数的作用对象

?

未对查询结果分组,聚集函数将作用于整个查询结果

?

对查询结果分组后,聚集函数将分别作用于每个组

? 作用对象是查询的中间结果表 ? 按指定的一列或多列值分组,值相等的为一组

示例:
[例] 求各个课程号及相应的选课人数。
SELECT Cno,COUNT(Sno) FROM SC GROUP BY Cno
SELECT sno,count(cno) FROM SC GROUP BY sno HAVING COUNT(*) >3

[例] 查询选修了3门以上课程的学生学号。

?

HAVING短语与WHERE子句的区别: ? 作用对象不同

?
?

WHERE子句作用于基表或视图,从中选择满足条件的元组
HAVING短语作用于组,从中选择满足条件的组。

数据查询
? 单表查询
? 连接查询

? 嵌套查询
? 集合查询

? Select语句的一般形式

自身连接
? ? ? 自身连接:一个表与其自己进行连接 需要给表起别名以示区别 由于所有属性名都是同名属性,因此必须使用别名前缀
级雇员姓名。

[例]查询SQLSERVER2000,NorthWind数据库中所有雇员姓名及该雇员汇报工作的直接上

Select low.firstName,low.lastName,high.firstName,high.lastName from employees low,employees high where low.reportsTO=high.employeeid
Select low.firstName,low.lastName,high.firstName,high.lastName from employees low left outer join employees high on low.reportsTO=high.employeeid Select low.firstName,low.lastName,high.firstName,high.lastName from employees low right outer join employees high on low.reportsTO=high.employeeid

内连接
? 也称为普通连接,又称为自然连接。用来

输出满足连接条件的元组
[例]列显学生选修课程的学号,姓名,以及所选课 程的编号。
Select sc.sno,sname,cno from student,sc where student.sno=sc.sno

外连接
? 外连接与普通连接的区别
? ? 普通连接操作只输出满足连接条件的元组 外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出

SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade FROM Student LEFT JOIN SC ON (Student.Sno=SC.Sno); ? SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade FROM Student ,SC WHERE Student.Sno*=SC.Sno; //左连接

SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade FROM Student RIGHT JOIN SC ON (Student.Sno=SC.Sno); ? SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade FROM Student ,SC WHERE Student.Sno=*SC.Sno; //右连接

外连接(续)
? 左外连接
? 列出左边关系中所有的元组 ? 右外连接 ? 列出右边关系中所有的元组

复合条件连接
? 复合条件连接:使用多个连接条件
[例]查询选修2号课程且成绩在90分以上的所有学生
SELECT Student.Sno, Sname FROM Student, SC WHERE Student.Sno = SC.Sno AND SC.Cno= ‘2’ AND SC.Grade > 90;

[例]查询每个学生的学号、姓名、选修的课程名及成绩 SELECT Student.Sno,Sname,Cname,Grade

FROM

Student,SC,Course

/*多表连接*/

WHERE Student.Sno = SC.Sno and SC.Cno = Course.Cno;

数据查询
? 单表查询
? 连接查询

? 嵌套查询
? 集合查询

? Select语句的一般形式

嵌套查询
? 嵌套查询概述
? 也叫子查询

? 一个SELECT-FROM-WHERE语句称为一个查询块
? 将一个查询块嵌套在另一个查询块的WHERE子句或

HAVING短语的条件中的查询称为嵌套查询

嵌套查询—示例
SELECT Sname
FROM Student WHERE Sno IN

/*外层查询/父查询*/

(SELECT Sno
FROM SC

/*内层查询/子查询*/

WHERE Cno= ' 2 ')

嵌套查询(续)
? 子查询的限制
? 不能使用ORDER BY子句

? 层层嵌套方式反映了 SQL语言的结构化
? 有些嵌套查询可以用连接运算替代

嵌套查询(续)
一、带有IN谓词的子查询
二、 带有比较运算符的子查询 三、 带有ANY或ALL谓词的子查询 四、 带有EXISTS谓词的子查询

嵌套查询--带有IN谓词的子查询
子查询执行后以一个列的形式返回查询结果
[例] 查询与“刘晨”在同一个系学习的学生。 此查询要求可以分步来完成 ① 确定“刘晨”所在系名
SELECT Sdept

FROM

Student

WHERE Sname= ' 刘晨 ' 结果为:IS ② 查找所有在IS系学习的学生。 SELECT Sno,Sname,Sdept FROM Student WHERE Sdept= ' IS '

将第一步查询嵌入到第二步查询的条件中 SELECT Sno,Sname,Sdept FROM Student WHERE Sdept IN (SELECT Sdept FROM Student WHERE Sname= ? 刘晨 ’);

嵌套查询--带有IN谓词的子查询
[例]查询选修了课程名为“信息系统”的学生学号和姓名
SELECT Sno,Sname FROM Student WHERE Sno IN (SELECT Sno FROM SC WHERE Cno IN (SELECT Cno
出 号 ③ 最后在Student关系中 取出Sno和Sname ② 然后在SC关系中找出选 修了3号课程的学生学号 ① 首先在Course关系中找 “信息系统”的课程号,为3

FROM Course ) WHERE Cname= ?信息系统’

);

嵌套查询(续)
一、带有IN谓词的子查询
二、 带有比较运算符的子查询 三、 带有ANY或ALL谓词的子查询 四、 带有EXISTS谓词的子查询

嵌套查询--带有比较运算符的子查询
? 当能确切知道内层查询返回单值时,可用
比较运算符(>,<,=,>=,<=,!=或

< >)。
? 与ANY或ALL谓词配合使用

嵌套查询--带有比较运算符的子查询
[例]查询与“刘晨”在同一个系学习的学生。
分析:假设一个学生只可能在一个系学习,并且必须属于一个系,则可以用 = 代替IN

SELECT Sno,Sname, Sdept FROM Student WHERE Sdept = (SELECT Sdept FROM Student WHERE Sname= ?刘 晨’)

子查询一定要跟在比较符之后 错误的例子: SELECT Sno,Sname,Sdept FROM Student WHERE ( SELECT Sdept FROM Student WHERE Sname= ? 刘晨 ’ ) = Sdept;

思考题
[例]找出每个学生超过他选修课程平均成绩的课程号。
SELECT Sno, Cno FROM SC x WHERE Grade >=(SELECT AVG(Grade) FROM SC y WHERE y.Sno=x.Sno);

分析步骤
? 可能的执行过程: 1. 从外层查询中取出SC的一个元组x,将元组x的Sno值 (200215123)传送给内层查询。 SELECT AVG(Grade) FROM SC y WHERE y.Sno='200215123' 2. 执行内层查询,得到值88(近似值),用该值代替内层查询, 得到外层查询: SELECT Sno, Cno FROM SC x WHERE Grade >=88 and y.Sno='200215123'

分析步骤(续)
3. 执行这个查询,得到
(200215123,1) (200215123,3)

4.外层查询取出下一个元组重复做上述1至3步骤,直到外层的SC 元组全部处理完毕。结果为:
(200215123,1) (200215123,3) (200215123,2)

嵌套查询(续)
一、带有IN谓词的子查询
二、 带有比较运算符的子查询 三、 带有ANY或ALL谓词的子查询 四、 带有EXISTS谓词的子查询

嵌套查询--带有ANY或ALL谓词的子查询
谓词语义 ? ? ANY:任意一个值 ALL:所有值

需要配合使用比较运算符 > ANY 大于子查询结果中的某个值 > ALL 大于子查询结果中的所有值 < ANY 小于子查询结果中的某个值 < ALL 小于子查询结果中的所有值 >= ANY 大于等于子查询结果中的某个值 >= ALL 大于等于子查询结果中的所有值 <= ANY 小于等于子查询结果中的某个值 <= ALL 小于等于子查询结果中的所有值 = ANY 等于子查询结果中的某个值 =ALL 等于子查询结果中的所有值(通常没有实际意义) !=(或<>)ANY 不等于子查询结果中的某个值 !=(或<>)ALL 不等于子查询结果中的任何一个值

嵌套查询—示例

[例] 查询其他系中比计算机科学系所有学生年龄都小 的学生姓名及年龄。
方法一:用ALL谓词 方法二:用聚集函数 SELECT Sname,Sage SELECT Sname,Sage FROM Student FROM Student WHERE Sage < WHERE Sage < ALL (SELECT MIN(Sage) (SELECT Sage FROM Student FROM Student WHERE Sdept= ' IS WHERE Sdept= ' IS ') AND Sdept <>' IS ?; AND Sdept <> ' IS ?;

嵌套查询
一、带有IN谓词的子查询
二、 带有比较运算符的子查询 三、 带有ANY或ALL谓词的子查询 四、 带有EXISTS谓词的子查询

嵌套查询--带有EXISTS谓词的子查询
? 1. EXISTS谓词 ? 存在量词? ? 带有EXISTS谓词的子查询不返回任何数据,只产生逻辑 真值“true”或逻辑假值“false”。
? 若内层查询结果非空,则外层的WHERE子句返回真值 ? 若内层查询结果为空,则外层的WHERE子句返回假值

由EXISTS引出的子查询,其目标列表达式通常都用* , 因为带EXISTS的子查询只返回真值或假值,给出列名无 实际意义 ? 2. NOT EXISTS谓词
?

? 若内层查询结果非空,则外层的WHERE子句返回假值 ? 若内层查询结果为空,则外层的WHERE子句返回真值

嵌套查询—示例
[例]查询所有选修了1号课程的学生姓名。
思路分析: 1.本查询涉及Student和SC关系 2.在Student中依次取每个元组的Sno值,用此值去检查SC关系 3.若SC中存在这样的元组,其Sno值等于此Student.Sno值,并且其Cno= ?1?, 则取此Student.Sname送入结果关系

SELECT Sname

FROM Student
WHERE EXISTS (SELECT * FROM SC WHERE Sno=Student.Sno AND Cno= ' 1 ')

思考题
[例] 查询没有选修1号课程的学生姓名。

SELECT Sname FROM Student

WHERE NOT EXISTS
(SELECT * FROM SC WHERE Sno = Student.Sno AND Cno='1')

数据查询
? 单表查询
? 连接查询

? 嵌套查询
? 集合查询

? Select语句的一般形式

集合查询
? 集合操作的种类
? 并操作UNION ? 交操作INTERSECT //SQL2000没有提供交操作

? 差操作EXCEPT

//SQL2000没有提供差操作

? 参加集合操作的各查询结果的列数必须相同;对应 项的数据类型也必须相同

集合查询—示例
[例] 查询计算机科学系的学生及年龄不大于19岁的学生。 方法一: SELECT * FROM Student WHERE Sdept= ?IS' UNION SELECT * FROM Student WHERE Sage<=19 ? UNION:将多个查询结果合并起来时,系统自动去掉重复元组。 ? UNION ALL:将多个查询结果合并起来时,保留重复元组 方法二:
SELECT DISTINCT * FROM Student WHERE Sdept= 'CS' OR Sage<=19

集合查询—示例
[例] 查询计算机科学系的学生与年龄不大于19岁的学生的交集
分析:实际上就是查询计算机科学系中年龄不大于19岁的学生
SELECT * FROM Student WHERE Sdept='IS' AND Sage<=19

SELECT * FROM Student WHERE Sdept=' CS' INTERS

集合查询—示例
[例]查询计算机科学系的学生与年龄不大于19岁的学生的差集。
分析:实际上是查询计算机科学系中年龄大于19岁的学生 SELECT * FROM Student WHERE Sdept= 'CS' AND Sage>19 SELECT * FROM Student WHERE Sdept='CS' EXCEPT SELECT * FROM Student WHERE Sage <=19;

视图的创建
? 语句格式
CREATE VIEW <视图名> [(<列名> [,<列名>]…)] AS <子查询>

[WITH CHECK OPTION];

? 组成视图的属性列名:全部省略或全部指定 ? 子查询不允许含有ORDER BY子句和DISTINCT短语

基于单个基表的视图
[例] 建立信息系学生的视图。
CREATE VIEW IS_Student AS SELECT Sno,Sname,Sage FROM Student WHERE Sdept= ‘IS’
补充:在对视图查询时,按视图的定义从基本表中将数据查出。

基于单个基表的视图(续)
[例]建立信息系学生的视图,并要求进行修改和插入操

作时仍需保证该视图只有“信息系”的学生 。
CREATE VIEW IS_Student

AS
SELECT Sno,Sname,Sage FROM Student

WHERE Sdept= 'IS'
WITH CHECK OPTION

基于单个基表的视图(续)
对IS_Student视图的更新操作:
? 修改操作:自动加上Sdept= 'IS'的条件 ? 删除操作:自动加上Sdept= 'IS'的条件

? 插入操作:自动检查Sdept属性值是否为'IS'

? 如果不是,则拒绝该插入操作 ? 如果没有提供Sdept属性值,则自动定义Sdept为'IS'

基于多个基表的视图
[例] 建立信息系选修了1号课程的学生视图。
CREATE VIEW IS_S1(Sno,Sname,Grade) AS SELECT Student.Sno,Sname,Grade FROM Student,SC WHERE Sdept= 'IS' AND Student.Sno=SC.Sno AND

SC.Cno= '1';

基于视图的视图
[例] 建立信息系选修了1号课程且成绩在90分以上的学生的视
图。 CREATE VIEW IS_S2

AS
SELECT Sno,Sname,Grade FROM IS_S1

WHERE Grade>=90;

带表达式的视图
[例] 定义一个反映学生出生年份的视图。
CREATE VIEW BT_S(Sno,Sname,Sbirth) AS

SELECT Sno,Sname,2000-Sage
FROM Student;

分组视图
[例] 将学生的学号及他的平均成绩定义为一个视图
假设SC表中“成绩”列Grade为数字型
CREAT VIEW S_G(Sno,Gavg) AS SELECT Sno,AVG(Grade)

FROM SC
GROUP BY Sno;

不指定属性列
[例]将Student表中所有女生记录定义为一个视图 CREATE VIEW F_Student(F_Sno,name,sex,age,dept) AS SELECT *

FROM Student
WHERE Ssex=?女’; 缺点:

修改基表Student的结构后,Student表与F_Student视图的映象关系被破坏,
导致该视图不能正确工作

视图的特点
? 虚表,是从一个或几个基本表(或视图)导出的表。
? 只存放视图的定义,不存放视图对应的数据。

? 基表中的数据发生变化,从视图中查询出的数据也随之改
变。

查询视图
? 查询视图与查询基本表相同
[例] 在信息系学生的视图中找出年龄小于20岁的学生。 SELECT Sno,Sage

FROM WHERE

IS_Student Sage<20;

更新视图
[例] 将信息系学生视图IS_Student中学号200215122的学生姓名改为 “刘辰”。
UPDATE IS_Student SET Sname= '刘辰' WHERE Sno= ' 200215122 ';

转换后的语句:
UPDATE Student

SET Sname= '刘辰'
WHERE Sno= ' 200215122 ' AND Sdept= 'IS';

视图的删除
? 语句的格式: DROP VIEW <视图名>;
? 该语句从数据字典中删除指定的视图定义

? 如果该视图上还导出了其他视图,使用CASCADE级联
删除语句,把该视图和由它导出的所有视图一起删除 ? 删除基表时,由该基表导出的所有视图定义都必须显式

地使用DROP VIEW语句删除

示例
[例] 删除视图BT_S: DROP VIEW BT_S;
删除视图IS_S1:DROP VIEW IS_S1;
? 拒绝执行 ? 级联删除:

DROP VIEW IS_S1 CASCADE;

小结
? 数据管理sql语句 ? 数据查询sql语句

Employee表(职员表)
工号 eno 姓 名 ename 性 别 sex 年 龄 age 工资 salary 入职日期 inday 是否离职 is_left

所 在 部门 dept 001 002 003 001 002 001

2002006 2002002 2002004 2002005 2002003 2002001

李勇 刘晨 王敏 张立 王青 李志

男 女 女 男 女 女

16 29 38 29 21 18

2100 1800 3200 5400 2000 2000

2011-01-01 2012-02-07 2010-03-09 2009-03-01 2010-01-02 2009-03-04

Y N N N Y Y

dept表(部门表)
部门号 dpno 001 002 003 部门名 dpname IT INV SALES

要求
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? step1:创建company_db数据库 step2:创建部门表与职员表,职员表中的dept必须存在于部门表,职员表的姓名不能为 空,性别为男或女,是否离职默认为N。 step3:为部门表与职员表插入记录,职员表中的入职日期为当前系统日期(至少添加) step4:运用update语句,将年龄25岁以下的职员,年龄加1 step5:运用update语句,将2010年01月以前入职的职员,工资加500 step6:运用delete语句,将年龄18岁以下并已离职的职员信息进行删除 step7:运用select语句,查询已离职人员的信息 step8:运用select语句, 查询2011年以后入职,并尚未离职的人员信息 step9:运用order by语句,按部门及工资排序,将职员信息按工资从高到低排序输出显 示 step9:运用聚合函数, 统计输出已离职人员数 step10:运用聚合函数,统计输出未离职人员,公司最长及最幼年龄。 step11:统计输出未离职人员的男职员与女职员人数 step12:统计输出各部门在职人数 step13:统计输出各部门在职人员最高工资数额 step14:运用内连接语句,输出未离职人员的工号,姓名,性别,入职日期,部门名称 step15:创建视图in_employee,此视图为未离职人员,视图所含字段有工号,姓名, 性别,入职日期,部门名称


更多相关文档:

第三章 SQL语言练习题和答案

第一章数据库基础练习和... 第二章关系数据库练习...第三章 SQL 语言 一、选择题 1. SQL 语言是(B...SQL 语言集数据定义语言 DDL、数据操纵语言 DML、...

大学计算基础第三章习题答案

大学计算基础第三章习题答案_工学_高等教育_教育专区。一、单选题 1. 数据库...A.DDL B.DML C.DCL D.SQL 23. SQL 语言具有( )的功能。 A.关系规范化...

第3章_SQL语言

第3章_T-SQL语言基础 26页 1财富值 第3章 SQL 语言简介 16页 免费 第3章...(3) 数据操纵语言(Data Manipulation Language, 简称 DML), DML 用于对关系...

第三章关系数据库标准语言 习题解答

第三章 习题解答 1.试述 SQL 语言的特点。 答: (1)综合统一。SQL 语言集数据定义语言 DDL、数据操纵语言 DML、数据控制语言 DCL 的 功能于一体。 (2)高度...

sql语言基础

Sql语言基础 10页 2财富值 SQL 语言基础 7页 免费 第3章 sql 语言基础 67...删除表中所有行 revoke 从用户或数据库角色回收权限 1.1.2 DML 表 7-2 ...

第3章 关系数据库标准语言SQL

共同的数据存取语言和标准接口,使不同数据库系统之间的 互操作有了共同的基础。...3.1.2SQL 的特点 1.综合统一 SQL 集数据定义语言(DDL) ,数据操纵语言(DML)...

SQL 语言基础

第3章 sql 语言基础 67页 2财富值 第14章SQL语言基础 82页 2财富值 T-SQL...DML 组可以细分为以下的几个语句: SELECT:用于检索数据; INSERT:用于增加数据到...

经典sql基本语句大全

(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(...简要介绍基础语句: 1、说明:创建数据库 CREATE ...3、说明:备份 sql server --- 创建 备份数据的 ...

SQL 语言基本知识

标准SQL 语言第一章 SQL 语言概述一、简介数据库系统存储数据的目的是为了应用...DML(数据库操纵语言) :insert\delete\select\update(增、删、查、改); 3、 ...

第3章 关系数据库标准语言SQL

在 SQL2 基础上,增加了许多新特征,产生了 SQL3 标准,表示第三SQL 语言,...(Data Definition Language) 数据操纵语言 DML 、(Data Manipulation Language) ...
更多相关标签:
sql dml 语句 | sql的dml语句 | sql基础语句 | sql语句基础教程 | oracle基础sql语句 | sql server语句基础 | sql基础查询语句 | 基础的sql语句 |
网站地图

文档资料共享网 nexoncn.com copyright ©right 2010-2020。
文档资料共享网内容来自网络,如有侵犯请联系客服。email:zhit325@126.com