1、1l4.1 SQL语言概述语言概述l4.2 数据定义功能与约束数据定义功能与约束l4.3 数据操纵功能数据操纵功能l4.4 数据查询功能与视图数据查询功能与视图2lSELECT FROM WHERE GROUP BY HAVING ORDER BY 3l5.4.1 单表查询单表查询l5.4.2 查询条件的设置查询条件的设置l5.4.3 聚合函数聚合函数l5.4.4 分组分组l5.4.5 查询结果的排序查询结果的排序l5.4.6 多表连接查询多表连接查询l5.4.7 子查询子查询l5.4.8 视图视图4l数据源只涉及一张表的查询数据源只涉及一张表的查询l选择列选择列5lSELECT FROM 6
2、CREATE TABLE 演员演员(姓名姓名 char(20),工号工号 char(10),性别性别 char(2),PRIMARY KEY(工号工号)CREATE TABLE 电影电影(片名片名 char(60),导演导演 char(20),年代年代 datetime,PRIMARY KEY(片名,年代片名,年代)CREATE TABLE 出演出演(工号工号 char(10),片名片名 char(60),年代年代 datetime,片酬片酬 money,PRIMARY KEY(工号工号,片名片名,年代年代)7姓名姓名工号工号性别性别王菲王菲A010女女宁静宁静A120女女梁朝伟梁朝伟A231
3、男男葛优葛优A751男男片名片名导演导演年代年代重庆森林重庆森林王家卫王家卫1994红河谷红河谷冯小宁冯小宁2019不见不散不见不散冯小刚冯小刚2019花样年华花样年华王家卫王家卫2000工号工号片名片名年代年代片酬片酬A120红河谷红河谷201950kA231花样年华花样年华2000100kA751不见不散不见不散2019120k演员演员电影电影出演出演8l查询演员的姓名与性别查询演员的姓名与性别lSELECT 姓名,性别姓名,性别 FROM 演员演员l查询结果查询结果姓名姓名性别性别王菲王菲女女宁静宁静女女梁朝伟梁朝伟男男葛优葛优男男9l查询全体演员的记录查询全体演员的记录lSELECT*
4、FROM 演员演员l查询结果查询结果姓名姓名工号工号性别性别王菲王菲A010女女宁静宁静A120女女梁朝伟梁朝伟A231男男葛优葛优A751男男10lgetdate()取当前的系统日期取当前的系统日期lyear(date)取日期时间型参数取日期时间型参数date的年份的年份lmonth(date)lday(date)l11l查询电影的片名以及拍摄距今时间查询电影的片名以及拍摄距今时间lSELECT 片名片名,拍摄距今拍摄距今,l year(getdate()-year(年代年代),年年 FROM 电影电影l查询结果查询结果片名片名重庆森林重庆森林拍摄距今拍摄距今11年年红河谷红河谷拍摄距今拍摄
5、距今7年年不见不散不见不散拍摄距今拍摄距今7年年花样年华花样年华拍摄距今拍摄距今5年年12l计算列、函数列和常量列的显示结果都计算列、函数列和常量列的显示结果都没有列标题,通过指定列的别名可以改没有列标题,通过指定列的别名可以改变查询结果的列标题变查询结果的列标题l改变列标题的语法:改变列标题的语法:列名列名|表达式表达式 AS 列标题列标题 或:列标题或:列标题 列名列名|表达式表达式13l查询电影的片名以及拍摄距今时间查询电影的片名以及拍摄距今时间lSELECT 片名片名,year(getdate()-year(年代年代)l AS 拍摄距今年限拍摄距今年限 FROM 电影电影l查询结果查询
6、结果片名片名拍摄距今年限拍摄距今年限重庆森林重庆森林11红河谷红河谷7不见不散不见不散7花样年华花样年华514姓名姓名工号工号性别性别王菲王菲A010女女宁静宁静A120女女梁朝伟梁朝伟A231男男葛优葛优A751男男片名片名导演导演年代年代重庆森林重庆森林王家卫王家卫1994红河谷红河谷冯小宁冯小宁2019不见不散不见不散冯小刚冯小刚2019花样年华花样年华王家卫王家卫2000工号工号片名片名年代年代片酬片酬A120红河谷红河谷201950kA231花样年华花样年华2000100kA751不见不散不见不散2019120k演员演员电影电影出演出演15l查询数据库中的电影拍摄年代查询数据库中的电
7、影拍摄年代lSELECT year(年代年代)AS 拍摄年代拍摄年代 FROM 电影电影l查询结果查询结果拍摄年代拍摄年代19942019200016l5.4.1 单表查询单表查询l5.4.2 查询条件的设置查询条件的设置l5.4.3 聚合函数聚合函数l5.4.4 分组分组l5.4.5 查询结果的排序查询结果的排序l5.4.6 多表连接查询多表连接查询l5.4.7 子查询子查询l5.4.8 视图视图17lSELECT FROM WHERE 18 WHERE子句常用查询条件子句常用查询条件 谓谓 词词 比较(比较运算符)比较(比较运算符)=,=,=,=,=,=,(或(或!=!=),),NOT+N
8、OT+上述比较运算符上述比较运算符 确定范围确定范围 BETWEEN AND,NOT BETWEEN AND BETWEEN AND,NOT BETWEEN AND 确定集合确定集合 IN,NOT IN IN,NOT IN 字符匹配字符匹配 LIKE,NOT LIKE LIKE,NOT LIKE 空值空值 IS NULL,IS NOT NULL IS NULL,IS NOT NULL 多重条件(逻辑谓词)多重条件(逻辑谓词)AND,OR AND,OR 19l查询女演员的姓名查询女演员的姓名lSELECT 姓名姓名 FROM 演员演员 WHERE 性别性别女女姓名姓名王菲王菲宁静宁静20l查询拍
9、摄距今超过查询拍摄距今超过10年电影的片名年电影的片名lSELECT 片名片名 FROM 电影电影 WHERE year(getdate()-year(年代年代)10l查询结果查询结果片名片名重庆森林重庆森林21l用于查找指定列中符合匹配模式的元组用于查找指定列中符合匹配模式的元组l列名列名 NOT LIKE l匹配串中可包含如下四种匹配串中可包含如下四种通配符通配符 _ 匹配任意一个字符;匹配任意一个字符;%匹配匹配0个或多个字符;个或多个字符;匹配匹配 中的任意一个字符;中的任意一个字符;不匹配不匹配 中的任意一个字符中的任意一个字符22l查询查询“张张”“”“王王”“”“李李”姓演员的情
10、况姓演员的情况lSELECT 姓名姓名 FROM 演员演员 WHERE 姓名姓名 LIKE 张王李张王李%l查询结果查询结果姓名姓名王菲王菲23l查询姓名第查询姓名第2个字不是个字不是“菲菲”或者或者“优优”的的演员的情况演员的情况lSELECT 姓名姓名 FROM 演员演员 WHERE 姓名姓名 LIKE _菲优菲优%l查询结果查询结果姓名姓名宁静宁静梁朝伟梁朝伟24l查询姓名由查询姓名由2个字组成的演员的情况个字组成的演员的情况lSELECT 姓名姓名 FROM 演员演员 WHERE 姓名姓名 LIKE _ _l查询结果查询结果姓名姓名王菲王菲宁静宁静葛优葛优25l空值(空值(NULL)表
11、示)表示不确定的值不确定的值l判断取值为空的语句格式:判断取值为空的语句格式:列名列名 IS NULLl判断取值不为空的语句格式:判断取值不为空的语句格式:列名列名 IS NOT NULL26l查询有片酬记录的出演情况查询有片酬记录的出演情况lSELECT *FROM 出演出演 WHERE 片酬片酬 IS NOT NULLl查询结果查询结果27l在在WHERE子句中可以使用逻辑运算符子句中可以使用逻辑运算符AND和和OR来组成多重条件查询来组成多重条件查询l用用AND连接的条件表示必须全部满足所连接的条件表示必须全部满足所有的条件的元组才被选中有的条件的元组才被选中l用用OR连接的条件表示只要
12、满足其中一个连接的条件表示只要满足其中一个条件的元组即被选中条件的元组即被选中28l查询王姓女演员的情况查询王姓女演员的情况lSELECT *FROM 演员演员 WHERE 姓名姓名 LIKE 王王%AND 性别性别女女 l查询结果查询结果29l查询王姓演员和全体男演员的情况查询王姓演员和全体男演员的情况lSELECT *FROM 演员演员 WHERE 姓名姓名 LIKE 王王%OR 性别性别男男 l查询结果查询结果30l BETWEENAND和和 NOT BETWEENANDl格式格式 列名列名|表达式表达式 NOT BETWEEN 下限值下限值 AND 上限值上限值31l查询拍摄距今查询拍
13、摄距今5至至10年的电影年的电影lSELECT 片名片名 FROM 电影电影 WHERE year(getdate()year(年代年代)BETWEEN 5 AND 10不见不散不见不散红河谷红河谷花样年华花样年华片名片名l查询结果查询结果32l查询拍摄距今查询拍摄距今5至至10年的电影年的电影lSELECT 片名片名 FROM 电影电影 WHERE year(getdate()year(年代年代)=5 AND year(getdate()year(年代年代)=10 33l查询拍摄距今不到查询拍摄距今不到5年或者年或者10年以上的电影年以上的电影lSELECT 片名片名 FROM 电影电影 W
14、HERE year(getdate()year(年代年代)NOT BETWEEN 5 AND 10l查询结果查询结果片名片名重庆森林重庆森林34l查询拍摄距今不到查询拍摄距今不到5年或者年或者10年以上的电影年以上的电影lSELECT 片名片名 FROM 电影电影 WHERE year(getdate()year(年代年代)10 35l IN和和NOT INl格式格式 列名列名 NOT IN(集合)(集合)36l查询拍摄距今为查询拍摄距今为5,10或者或者15年的电影年的电影lSELECT 片名片名 FROM 电影电影 WHERE year(getdate()-year(年代年代)IN(5,1
15、0,15)l查询结果查询结果片名片名花样年华花样年华37l查询拍摄距今为查询拍摄距今为5,10或者或者15年的电影年的电影lSELECT 片名片名 FROM 电影电影 WHERE year(getdate()year(年代年代)=5 OR year(getdate()year(年代年代)=10 OR year(getdate()year(年代年代)=15 38l查询拍摄距今年限不是查询拍摄距今年限不是5,10或者或者15的电影的电影lSELECT 片名片名 FROM 电影电影 WHERE year(getdate()-year(年代年代)NOT IN(5,10,15)l查询结果查询结果片名片名
16、重庆森林重庆森林红河谷红河谷不见不散不见不散39l查询拍摄距今年限不是查询拍摄距今年限不是5,10或者或者15的电影的电影lSELECT 片名片名 FROM 电影电影 WHERE year(getdate()year(年代年代)!=5 AND year(getdate()year(年代年代)!=10 AND year(getdate()year(年代年代)!=15 40l5.4.1 单表查询单表查询l5.4.2 查询条件的设置查询条件的设置l5.4.3 聚合函数聚合函数l5.4.4 分组分组l5.4.5 查询结果的排序查询结果的排序l5.4.6 多表连接查询多表连接查询l5.4.7 子查询子查
17、询l5.4.8 视图视图41l计算函数计算函数=l集合函数集合函数=l聚合函数聚合函数=l聚集函数聚集函数l对一组值进行计算并返回一个单值对一组值进行计算并返回一个单值42lCOUNT(*):统计表中元组个数统计表中元组个数lCOUNT():统计本列列值个数统计本列列值个数lMAX():求列值最大值):求列值最大值lMIN():求列值最小值):求列值最小值lSUM():计算列值总和计算列值总和lAVG():计算列值平均值计算列值平均值43l在在SELECT,HAVING子句中使用子句中使用l计算函数不能直接出现在计算函数不能直接出现在WHERE子句中子句中l如果使用了计算函数或者分组,那么如果
18、使用了计算函数或者分组,那么 SELECT子句中的列必须是计算函数或者是分组依据列子句中的列必须是计算函数或者是分组依据列lSUM 与与AVG只能用于数值类型的列,参数可以只能用于数值类型的列,参数可以是计算列是计算列l要求只有一个参数要求只有一个参数l除除COUNT(*)外,其他函数在计算过程中均忽)外,其他函数在计算过程中均忽略略NULL值值44 45l查询演员出演的总人次数查询演员出演的总人次数l查询演员出演记录的总条数查询演员出演记录的总条数lSELECT COUNT(*)FROM 出演出演lSELECT COUNT(演员姓名演员姓名)FROM 出演出演lSELECT COUNT(片名
19、片名)FROM 出演出演lSELECT COUNT(年代年代)FROM 出演出演 lSELECT COUNT(片酬片酬)FROM 出演出演l查询结果查询结果46l查询有片酬记录的总条数查询有片酬记录的总条数lSELECT COUNT(片酬片酬)AS 片酬记录条数片酬记录条数lFROM 出演出演l查询结果查询结果47l查询出演表中不同演员的人数查询出演表中不同演员的人数lSELECT COUNT(DISTINCT 演员姓名演员姓名)AS 演员总数演员总数lFROM 出演出演l查询结果查询结果48l查询出演表中支付的片酬总数查询出演表中支付的片酬总数lSELECT SUM(片酬片酬)AS 总片酬总
20、片酬lFROM 出演出演l查询结果查询结果49l查询梁朝伟的片酬总数查询梁朝伟的片酬总数lSELECT 演员姓名,演员姓名,SUM(片酬片酬)AS 总片酬总片酬lFROM 出演出演lWHERE 演员姓名演员姓名 梁朝伟梁朝伟l查询结果查询结果 列列 出演出演.演员姓名演员姓名 在选择列表中无效,因为在选择列表中无效,因为该列未包含在聚合函数中,并且没有该列未包含在聚合函数中,并且没有 GROUP BY 子句。子句。50l查询梁朝伟的片酬总数查询梁朝伟的片酬总数lSELECT SUM(片酬片酬)AS 梁朝伟的总片酬梁朝伟的总片酬lFROM 出演出演lWHERE 演员姓名演员姓名 梁朝伟梁朝伟l查
21、询结果查询结果51l查询每人次出演支付的片酬平均数查询每人次出演支付的片酬平均数lSELECT AVG(片酬片酬)AS 平均片酬平均片酬lFROM 出演出演l查询结果查询结果52lSELECT AVG(片酬片酬),l SUM(片酬片酬)/COUNT(片酬片酬),l SUM(片酬片酬)/COUNT(*)lFROM 出演出演l查询结果查询结果53l查询梁朝伟的平均片酬查询梁朝伟的平均片酬lSELECT 演员姓名,演员姓名,AVG(片酬片酬)AS 平均片酬平均片酬lFROM 出演出演lWHERE 演员姓名演员姓名 梁朝伟梁朝伟l查询结果查询结果 列列 出演出演.演员姓名演员姓名 在选择列表中无效,因
22、为在选择列表中无效,因为该列未包含在聚合函数中,并且没有该列未包含在聚合函数中,并且没有 GROUP BY 子句。子句。54l查询梁朝伟的平均片酬查询梁朝伟的平均片酬lSELECT AVG(片酬片酬)AS 梁朝伟的平均片酬梁朝伟的平均片酬lFROM 出演出演lWHERE 演员姓名演员姓名 梁朝伟梁朝伟l查询结果查询结果55l查询出演表中支付的最高片酬查询出演表中支付的最高片酬lSELECT MAX(片酬片酬)AS 最高片酬最高片酬lFROM 出演出演l查询结果查询结果56l查询最低片酬以及获得最低片酬的演员姓名查询最低片酬以及获得最低片酬的演员姓名lSELECT 演员姓名,演员姓名,MIN(片
23、酬片酬)AS 最低片酬最低片酬lFROM 出演出演l查询结果查询结果 列列 出演出演.演员姓名演员姓名 在选择列表中无效,因为在选择列表中无效,因为该列未包含在聚合函数中,并且没有该列未包含在聚合函数中,并且没有 GROUP BY 子句。子句。57l查询最低片酬以及有关演员的姓名查询最低片酬以及有关演员的姓名lSELECT 演员姓名演员姓名lFROM 出演出演lWHERE 片酬片酬 MIN(片酬片酬)l查询结果查询结果 聚合不应出现在聚合不应出现在 WHERE 子句中,除非该聚子句中,除非该聚合位于合位于 HAVING 子句或选择列表所包含的子子句或选择列表所包含的子查询中,并且要对其进行聚合
24、的列是外部引用。查询中,并且要对其进行聚合的列是外部引用。58l5.4.1 单表查询单表查询l5.4.2 查询条件的设置查询条件的设置l5.4.3 聚合函数聚合函数l5.4.4 分组分组l5.4.5 查询结果的排序查询结果的排序l5.4.6 多表连接查询多表连接查询l5.4.7 子查询子查询l5.4.8 视图视图59lSELECT FROM WHERE GROUP BY HAVING 60l分组把一个表划分为子集,可以细化计分组把一个表划分为子集,可以细化计算函数的作用对象算函数的作用对象lHAVING子句指定满足条件的组子句指定满足条件的组l在一个查询语句中,可以使用任意多个在一个查询语句中
25、,可以使用任意多个列进行分组列进行分组l分组依据列不能是分组依据列不能是text,ntext,image和和bit类型类型61l查询每位演员拍片数目以及个人平均片酬,查询每位演员拍片数目以及个人平均片酬,个人最低个人最低/最高片酬最高片酬lSELECT 演员姓名演员姓名,COUNT(片名片名)拍片数拍片数目,目,AVG(片酬片酬)个人平均片酬,个人平均片酬,MIN(片酬片酬)个人最低片酬,个人最低片酬,MAX(片酬片酬)个人最高片酬个人最高片酬lFROM 出演出演lGROUP BY 演员姓名演员姓名626364 65lHAVING子句用于对分组后的结果再进子句用于对分组后的结果再进行过滤行过滤
26、lHAVING子句的作用对象是组而不是行子句的作用对象是组而不是行l在在HAVING子句中可以使用计算函数子句中可以使用计算函数lHAVING与与GROUP BY子句一起使用子句一起使用66l查询出演不少于查询出演不少于2部电影的演员姓名部电影的演员姓名676869lSELECT 演员姓名,演员姓名,COUNT(片名片名)拍片数目拍片数目lFROM 出演出演lGROUP BY 演员姓名演员姓名lHAVING COUNT(*)=270l先用先用GROUP BY按按演员姓名演员姓名分组分组l再用再用COUNT(*)统计每组包含的记录条统计每组包含的记录条数数l最后挑选记录条数最后挑选记录条数=2的
27、组,返回对应的的组,返回对应的演员姓名演员姓名和该组记录的条数和该组记录的条数l查询结果查询结果71l查询梁朝伟的个人片酬总数与个人平均片酬查询梁朝伟的个人片酬总数与个人平均片酬lSELECT 演员姓名,演员姓名,SUM(片酬片酬)个人总片酬,个人总片酬,AVG(片酬片酬)个人平均片酬个人平均片酬lFROM 出演出演lGROUP BY 演员姓名演员姓名lHAVING 演员姓名演员姓名 梁朝伟梁朝伟72查询结果查询结果73lSELECT 演员姓名演员姓名,AVG(片酬片酬)个人平均片酬个人平均片酬lFROM 出演出演lWHERE year(年代年代)100000l查询查询2000年以前个人最低片
28、酬大于年以前个人最低片酬大于100k的演员的的演员的个人平均片酬个人平均片酬7475 76lSELECT 演员姓名演员姓名,AVG(片酬片酬)个人平均片酬个人平均片酬lFROM 出演出演lGROUP BY 演员姓名演员姓名lHAVING MIN(片酬片酬)100000 and year(年代年代)2000l查询结果查询结果列列 出演出演.年代年代 在在 HAVING 子句中无效,因为该列子句中无效,因为该列既不包含在聚合函数中,也不包含在既不包含在聚合函数中,也不包含在 GROUP BY 子子句中。句中。l查询查询2000年以前个人最低片酬大于年以前个人最低片酬大于100k的演员的个人的演员的
29、个人平均片酬平均片酬77l查询查询2000年以前演员的个人平均片酬年以前演员的个人平均片酬lSELECT 演员姓名演员姓名,AVG(片酬片酬)个人平均片酬个人平均片酬lFROM 出演出演lGROUP BY 演员姓名演员姓名lWHERE year(年代年代)100000 and year(年代年代)2000lGROUP BY 演员姓名演员姓名l查询结果查询结果聚合不应出现在聚合不应出现在 WHERE 子句中,除非该聚合位于子句中,除非该聚合位于 HAVING 子句或选择列表所包含的子查询中,并且子句或选择列表所包含的子查询中,并且要对其进行聚合的列是外部引用。要对其进行聚合的列是外部引用。l查询
30、查询2000年以前个人最低片酬大于年以前个人最低片酬大于100k的演员的个人的演员的个人平均片酬平均片酬79l5.4.1 单表查询单表查询l5.4.2 查询条件的设置查询条件的设置l5.4.3 聚合函数聚合函数l5.4.4 分组分组l5.4.5 查询结果的排序查询结果的排序l5.4.6 多表连接查询多表连接查询l5.4.7 子查询子查询l5.4.8 视图视图80lSELECT FROM WHERE GROUP BY HAVING ORDER BY 81l排序子句的格式为:排序子句的格式为:ORDER BY ASC|DESC ,n l为排序的依据列,可以是列名或列为排序的依据列,可以是列名或列的
31、别名的别名lASC表示对列进行升序排序,表示对列进行升序排序,DESC表示对表示对列进行降序排序列进行降序排序l默认的排序方式为升序排序默认的排序方式为升序排序82l指定多个排序列时,首先按最前面的列进指定多个排序列时,首先按最前面的列进行排序行排序l如果排序后存在多个列值相同的记录,则如果排序后存在多个列值相同的记录,则对这些记录依据后续排序列进行排序对这些记录依据后续排序列进行排序83l查询全体演员的情况,按姓名排序查询全体演员的情况,按姓名排序lSELECT *l FROM 演员演员 ORDER BY 姓名姓名l查询结果查询结果84l查询全体演员的情况,先女后男再按姓名排查询全体演员的情
32、况,先女后男再按姓名排序序lSELECT *l FROM 演员演员 ORDER BY 性别性别 DESC,姓名姓名l查询结果查询结果85lSELECT 演员姓名演员姓名,AVG(片酬片酬)个人平均片酬个人平均片酬lFROM 出演出演lWHERE year(年代年代)100000 lORDER BY 演员姓名演员姓名 DESCl查询结果查询结果l查询查询2000年以前个人最低片酬大于年以前个人最低片酬大于100k的演员的个人的演员的个人平均片酬平均片酬86lSELECT 演员姓名演员姓名,AVG(片酬片酬)个人平均片酬个人平均片酬lFROM 出演出演lWHERE year(年代年代)100000
33、l查询结果查询结果在关键字在关键字 GROUP 附近有语法错误。附近有语法错误。l查询查询2000年以前个人最低片酬大于年以前个人最低片酬大于100k的演员的个人的演员的个人平均片酬平均片酬87l5.4.1 单表查询单表查询l5.4.2 查询条件的设置查询条件的设置l5.4.3 聚合函数聚合函数l5.4.4 分组分组l5.4.5 查询结果的排序查询结果的排序l5.4.6 多表连接查询多表连接查询l5.4.7 子查询子查询l5.4.8 视图视图88l查询结果来源于多张表查询结果来源于多张表l匹配不同表的公共列,实现多表连接匹配不同表的公共列,实现多表连接l连接的类型连接的类型内连接内连接外连接外
34、连接89l.l.BETWEEN.AND.l连接字段:连接谓词中的列名称连接字段:连接谓词中的列名称l连接条件中的各连接字段类型必须是可比的,但连接条件中的各连接字段类型必须是可比的,但名字不必是相同的名字不必是相同的90l最常用的比较运算符是最常用的比较运算符是lFROM 表表1,表,表2 WHERE .l连接列必须是可比较的连接列必须是可比较的语义相同语义相同91姓名姓名工号工号性别性别王菲王菲A010女女宁静宁静A120女女梁朝伟梁朝伟A231男男葛优葛优A751男男片名片名导演导演年代年代重庆森林重庆森林王家卫王家卫1994红河谷红河谷冯小宁冯小宁2019不见不散不见不散冯小刚冯小刚20
35、19花样年华花样年华王家卫王家卫2000黑骏马黑骏马管虎管虎2000工号工号片名片名年代年代片酬片酬A120红河谷红河谷2019NULLA231花样年华花样年华2000100kA751不见不散不见不散2019120k演员演员电影电影出演出演92l查询演员出演电影的情况查询演员出演电影的情况lSELECT 演员演员.姓名,出演姓名,出演.片名,出演片名,出演.年代年代lFROM 演员,出演演员,出演lWHERE 演员演员.工号工号 出演出演.工号工号93姓名姓名性别性别工号工号王菲王菲女女A010宁静宁静女女A120梁朝伟梁朝伟男男A231葛优葛优男男A751工号工号片名片名年代年代片酬片酬A1
36、20红河谷红河谷2019NULLA231花样年华花样年华2000100kA751不见不散不见不散2019120k演员演员出演出演查询结果查询结果94l查询演员与导演的合作情况查询演员与导演的合作情况lSELECT 姓名姓名,导演导演,电影电影.片名片名,l year(电影电影.年代年代)年代年代 lFROM 演员,电影,出演演员,电影,出演lWHERE 演员演员.工号工号=出演出演.工号工号 AND l 出演出演.片名片名=电影电影.片名片名 AND l 出演出演.年代年代=电影电影.年代年代 95片名片名年代年代导演导演重庆森林重庆森林1994王家卫王家卫红河谷红河谷2019冯小宁冯小宁不见
37、不散不见不散2019冯小刚冯小刚花样年华花样年华2000王家卫王家卫黑骏马黑骏马2000管虎管虎工号工号片名片名年代年代片酬片酬A120红河谷红河谷2019NULLA231花样年华花样年华2000100kA751不见不散不见不散2019120k演员演员电影电影出演出演姓名姓名性别性别工号工号王菲王菲女女A010宁静宁静女女A120梁朝伟梁朝伟男男A231葛优葛优男男A75196 97l查询与王家卫影片同年拍摄的其他导演的影查询与王家卫影片同年拍摄的其他导演的影片片lSELECT 电影电影1.片名,片名,电影电影1.导演,导演,year(电影(电影1.年代)年代)年代年代lFROM 电影电影 电
38、影电影1,电影,电影 电影电影2lWHERE 电影电影2.导演导演=王家卫王家卫 ANDl 电影电影2.年代年代=电影电影1.年代年代 ANDl 电影电影1.导演导演!=王家卫王家卫98片名片名导演导演年代年代重庆森林重庆森林王家卫王家卫1994红河谷红河谷冯小宁冯小宁2019不见不散不见不散冯小刚冯小刚2019花样年华花样年华王家卫王家卫2000黑骏马黑骏马管虎管虎2000电影电影 1年代年代导演导演片名片名1994王家卫王家卫重庆森林重庆森林2019冯小宁冯小宁红河谷红河谷2019冯小刚冯小刚不见不散不见不散2000王家卫王家卫花样年华花样年华2000管虎管虎黑骏马黑骏马电影电影 2查询结
39、果查询结果99l连接时,输出一方的全部元组和对方的匹配元组连接时,输出一方的全部元组和对方的匹配元组lFROM l 表表1 LEFT|RIGHT OUTER JOIN 表表2 l ON 100lFROM l 表表1 LEFT OUTER JOIN 表表2 l ON l输出:表输出:表1全部,表全部,表2满足连接条件元组满足连接条件元组101lFROM l 表表1 RIGHT OUTER JOIN 表表2 l ON l输出输出:表表1满足连接条件元组,表满足连接条件元组,表2全部全部102l查询所有演员出演影片的情况,包括没有出查询所有演员出演影片的情况,包括没有出演记录的演员演记录的演员lSE
40、LECT 姓名姓名,片名片名lFROM 演员演员 LEFT OUTER JOIN 出演出演 l ON 演员演员.工号工号=出演出演.工号工号103姓名姓名性别性别工号工号王菲王菲女女A010宁静宁静女女A120梁朝伟梁朝伟男男A231葛优葛优男男A751工号工号片名片名年代年代片酬片酬A120红河谷红河谷2019NULLA231花样年华花样年华2000100kA751不见不散不见不散2019120k演员演员出演出演查询结果查询结果104l查询所有演员出演影片的情况,包括没有出查询所有演员出演影片的情况,包括没有出演记录的演员演记录的演员lSELECT 姓名姓名,片名片名lFROM 出演出演 R
41、IGHT OUTER JOIN 演员演员 l ON 演员演员.工号工号=出演出演.工号工号105工号工号姓名姓名性别性别A010王菲王菲女女A120宁静宁静女女A231梁朝伟梁朝伟男男A751葛优葛优男男片名片名年代年代片酬片酬工号工号红河谷红河谷2019NULLA120花样年华花样年华2000100kA231不见不散不见不散2019120kA751演员演员出演出演查询结果查询结果106l5.4.1 单表查询单表查询l5.4.2 查询条件的设置查询条件的设置l5.4.3 聚合函数聚合函数l5.4.4 分组分组l5.4.5 查询结果的排序查询结果的排序l5.4.6 多表连接查询多表连接查询l5.
42、4.7 子查询子查询l5.4.8 视图视图107lSQL的的查询块查询块:一个:一个SELECTFROMWHERE的组合体的组合体l子查询子查询内层查询内层查询:嵌套在:嵌套在SELECT、UPDATE或或DELETE等语句中的查询块等语句中的查询块l主查询主查询外层查询外层查询:包含子查询的语句:包含子查询的语句108l子查询要写在圆括号中子查询要写在圆括号中l查询块中不能使用查询块中不能使用ORDER BY子句子句l引入子查询的保留字为引入子查询的保留字为INl子查询通常用在外层查询的子查询通常用在外层查询的WHERE子子句或句或HAVING子句中子句中109l带有带有IN谓词的子查询谓词
43、的子查询 l带有比较运算符的子查询带有比较运算符的子查询l带有带有ANY(SOME)或)或ALL谓词的子查询谓词的子查询l带有带有EXISTS谓词的子查询谓词的子查询110姓名姓名工号工号性别性别王菲王菲A010女女宁静宁静A120女女梁朝伟梁朝伟A231男男葛优葛优A751男男片名片名导演导演年代年代重庆森林重庆森林王家卫王家卫1994红河谷红河谷冯小宁冯小宁2019不见不散不见不散冯小刚冯小刚2019花样年华花样年华王家卫王家卫2000黑骏马黑骏马管虎管虎2000工号工号片名片名年代年代片酬片酬A120红河谷红河谷2019NULLA231花样年华花样年华2000100kA751不见不散不见
44、不散2019120k演员演员电影电影出演出演111l查询片酬最低的演员姓名查询片酬最低的演员姓名lSELECT 演员演员.姓名姓名lFROM 演员演员,出演出演lWHERE 演员演员.工号工号=出演出演.工号工号 ANDl 片酬片酬 IN(SELECT MIN(片酬片酬)l FROM 出演出演)112姓名姓名工号工号性别性别王菲王菲A010女女宁静宁静A120女女梁朝伟梁朝伟A231男男葛优葛优A751男男片名片名导演导演年代年代重庆森林重庆森林王家卫王家卫1994红河谷红河谷冯小宁冯小宁2019不见不散不见不散冯小刚冯小刚2019花样年华花样年华王家卫王家卫2000黑骏马黑骏马管虎管虎200
45、0工号工号片名片名年代年代片酬片酬A120红河谷红河谷2019NULLA231花样年华花样年华2000100kA751不见不散不见不散2019120k演员演员电影电影出演出演113查询结果查询结果114 WHERE Sage ANY()AND Sdept IS ORDER BY Sage DESC 例(例(带带ANY或或ALL谓词的子查询)找出比谓词的子查询)找出比IS系至系至少一名学生年龄小的其他系学生名单。少一名学生年龄小的其他系学生名单。SELECT Sname,Sage,Sdept FROM StudentSELECT distinct Sage FROM Student WHERE
46、Sdept=IS115WHERE (Sage ALL()AND(Sdept IS)ORDER BY Sage DESC 例例 查询比查询比IS系系所有所有学生年龄学生年龄都小都小的其他各系学生的其他各系学生姓名姓名,年龄,系名。年龄,系名。SELECT Sage FROM Student WHERE Sdept=IS SELECT Sname,Sage,Sdept FROM Student116l由由EXISTS引出的子查询,其目标列表达式通常引出的子查询,其目标列表达式通常都用都用*,因为带,因为带EXISTS的子查询只返回真值或的子查询只返回真值或假值,给出列名无实际意义假值,给出列名无实
47、际意义lEXISTSl若内层查询结果非空,则外层的若内层查询结果非空,则外层的WHERE子句子句返回真值返回真值l若内层查询结果为空,则外层的若内层查询结果为空,则外层的WHERE子句子句返回假值返回假值117l查询所有选修了查询所有选修了1号课程的学生姓名号课程的学生姓名l用嵌套查询用嵌套查询l SELECT Snamel FROM Studentl WHERE EXISTSl (SELECT*l FROM SCl WHERE Sno=Student.Sno AND Cno=1)118l查询所有选修了查询所有选修了1号课程的学生姓名号课程的学生姓名l用连接查询用连接查询l SELECT Sn
48、amelFROM Student,SClWHERE Student.Sno=SC.Sno AND l SC.Cno=1119l查询选修了全部课程的学生姓名查询选修了全部课程的学生姓名lSELECT Snamel FROM Studentl WHERE NOT EXISTSl (SELECT*FROM Coursel WHERE NOT EXISTSl (SELECT*FROM SCl WHERE Sno=Student.Snol AND Cno=ourse.Cnol )120121 例例1 查找选修了课程查找选修了课程1或课程或课程2的学生学号和姓名。的学生学号和姓名。SELECT SC.Sn
49、o,Sname FROM SC,Student WHERE (Cno=2)AND(SC.Sno=Student.Sno)SELECT SC.Sno,Sname FROM SC,Student WHERE (Cno=1)AND(SC.Sno=Student.Sno)UNION集合查询就是对集合查询就是对几个查询块的结果集几个查询块的结果集进行并、进行并、交、差运算。交、差运算。122 例例1 查找选修了课程查找选修了课程1或课程或课程2的学生学号和姓名。的学生学号和姓名。SELECT SC.Sno,Sname FROM SC,Student WHERE(Cno=1)OR(Cno=2)AND (S
50、C.Sno=Student.Sno)集合查询就是对集合查询就是对几个查询块的结果集几个查询块的结果集进行并、进行并、交、差运算。交、差运算。123 AND Sno IN(SELECT Sno FROM SC WHERE Cno =2)例例2 查找既选修课程查找既选修课程1,又选修课程,又选修课程2的学生集合的学生集合 这实际上是查找选修了课程这实际上是查找选修了课程1学生,与选修了学生,与选修了课程课程2 的学生的的学生的交集交集。SELECT SnoFROM SCWHERE Cno=1124 INTERSECT (SELECT Sno FROM SC WHERE Cno=2)例例2 查找既选