当前位置:首页 >> 高中教育 >> 第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,此视图为未离职人员,视图所含字段有工号,姓名, 性别,入职日期,部门名称


更多相关文档:

2、SQL语言基础

课2 sql语言基础 55页 免费 第3章 SQL 语言基础2 109页 免费 2_SQL语言基础...2、 SQL 语言分四大类:数据查询语言 DQL、数据操纵语言 DML、数据定义语言 DDL...

实验三 SQL语言的DDL及DML初步

实验三 SQL语言的DDL及DML初步_计算机硬件及网络_IT...三、实验内容 3 7、基本表的建立: a) 建立一个...用 SQL 语句建立第二章习题 5 中的 4 个表,并...

SQL基础语句

SQL基础语句_互联网_IT/计算机_专业资料。SQL SQL:(Structured Query Language)结构化查询语言 SQL 可以分为两部分:数据操作语言(DML)和数据定义语言(DDL) 查询和...

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

大学计算基础第三章习题答案_工学_高等教育_教育专区。一、单选题 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 用于对关系...

sql语言基础

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

DML语言

2 DML 的构成(4) SQL 语言也包含用于更新、插入...插入数据 3 DML基础语句 3.1 SELECT 语句(2) ...(如果第二个参数为-1 的话,指的是从偏量值到...

数据库基础知识和sql语句

第一章 数据库基础知识 本章以概念为主,主要是了解数据库的基本概念,数据库...SQL 分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(...

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

第三章 关系数据库标准语言 SQL 主要内容: ? SQL基本概念 ? 数据定义 ?...3.1.2SQL 的特点 1.综合统一 SQL 集数据定义语言(DDL) ,数据操纵语言(DML)...

2.SQL语句基础

2.SQL语句基础_计算机软件及应用_IT/计算机_专业资料。oracle SQL语句基础 Sql 语句分类 1、数据操纵语句 DML 从一个或多个表或视图中查询数据(SELECT) 向表或...
更多相关标签:
网站地图

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