[HAVING group_condition] [ORDER BY column];
3、规则
having对行进行分组。
having子句限制的是组,而不是行。where子句限制的是行。
演示 - 使用HAVING
1. 查看表EMPLOYESS,显示最高薪金高于$10000的部门编号和最高薪金。
练习 - 使用HAVING
1. 查看表EMPLOYEES,:显示经理编号以及该经理所管员工的最低薪金。不包括其
经理不知是谁的任何员工。不包括最低薪金未超过$6000的组。按薪金降序排列输出。
演示 - 使用HAVING
1. 显示工资总额超过$13000的每个职务的职务标识和月薪总额。该示例排除了销售代
表,并按照月薪总额对列表进行排序。
6-8嵌套分组函数
1、分组函数可以嵌套两层。
演示 - 嵌套分组函数
1. 显示最高平均薪金。
6-9分组函数进阶练习
1、掌握SQL分组函数的使用。
练习 - 分组函数使用
1. 查看EMPLOYEES,DEPARTMENT。
2. 编写一个查询,使其显示每个部门的名称、地点、员工数以及该部门所有员工的平
均薪金。分别将这些列标记为Name、Location、Number of People和Salary。将平均薪金舍入到小数点后第二位。
练习 - 分组函数使用
1. 查看表EMPLOYEES。
2. 创建一个查询,使其显示员工总数以及其中在1995年、1996年、1997年和1998
年聘用的员工数。创建合适的列标题。
练习 - 使用分组函数
1. 查看表EMPLYEES。
2. 创建一个矩阵查询,使其显示一个职务、按照部门编号的该职务的薪金、以及该职
务的总薪金,对并部门20、50、80和90的每个列给出合适的标题。
7-1子查询
1、使用子查询解决问题
如谁的薪金比Tom的薪金高等。
通过组合两个查询,即将一个查询放置到另一个查询中,可以解决此问题。
2、语法
SELECT select_list FROM table
WHERE expr operator (SELECT select_list FROM table);
3、子查询在执行主查询之前执行,然后主查询会使用该子查询的结果。 4、子查询可以放置在以下子句中:
WHERE HAVING FROM
4、使用规则
子查询可以嵌套多层。 子查询需要圆括号()括起来。
子查询放在比较条件的右侧。
单行运算符用于单行子查询,而多行运算符用于多行子查询。
演示 - 使用子查询
1. 查看比Abel薪金高的员工。
7-2单行子查询
1、仅返回一行数据。 2、使用单行比较运算符。
= > >= <
<= <>
3、在子查询里可以使用分组函数。
演示 - 使用单行子查询
1. 显示职务和员工ID 141相同的员工。
演示 - 使用单行子查询
1. 显示职务和员工141相同,并且薪金高于员工143的员工。
练习 - 子查询
1. 查看表EMPLOYEES.
2. 编写一个查询,使其显示与Zlotkey在同一部门的所有员工的姓氏和聘用日期。但
不包括 Zlotkey。
练习 - 子查询
1. 查看表EMPLOYEES。
2. 创建一个查询,显示薪金超过平均薪金的所有员工的员工编号和姓氏。按薪金升序
排列结果。
演示 - 子查询里使用分组函数
1. 显示薪金等于最低薪金的所有员工和姓氏、职务和薪金。 2. 显示最低薪金高于部门50的最低薪金的所有部门。
7-3多行子查询
1、返回多个行。
2、使用多行比较运算符。
IN :等于列表中的任意一个
ANY:将值与子查询返回的任意一个值 进行比较。如用ANY运算符,ANY表示高于最低值。=ANY相当于IN。
ALL:将值 与查询返回的每个值进行比较。如果用ALL运算符。>ALL表示高于最高值。
演示 - 多行子查询
1. 查找薪金等于各个部门最低薪金的所有员工。
演示 - 多行子查询
1. 显示职务不是IT_PROG并且薪金低于任何一个IT_PROG的员工。
演示 - 多行子查询
1. 显示薪金低于所有职务为IT_PROG的员工且职务不是IT_PROG的员工。
演示 - 子查询的结果返回空值
1. 如果子查询的结果中出现空值,不要使用NOT IN运算符,应使用IN运算符。 2. 显示具有下属的员工。
练习 - 多行子查询
1. 查看表EMPLOYEES。
2. 编写一个查询,使其显示所有员工的员工编号和姓氏,条件是:他们所工作的部门
里有员工和姓氏中包含一个“u”
练习 - 多行子查询
1. 查看表EMPLOYEES,DEPARTMENTS。
2. 显示部门地点标识为1700的所有员工的姓氏、部门编号和职务标识。
练习 - 多行子查询
1. 查看表EMPLOYEES、DEPARTMENTS。
2. 显示行政部(Executive)中每位员工的部门编号、姓氏和职务标记。
练习 - 多行子查询
1. 查看表EMPLOYEES。
2. 显示所有员工的员工编号、姓氏和薪金,条件是:他们的薪金超过平均薪金并且他
们所工作的部门里员工的姓氏中包含一个“u”。
8-1集合概念
1、所有的SELECT语句都返回一组数据集。集合运算可以将两个或多个SELECT语句的结果作为输入,并根据集合运算的不同,而生成相应的结果集。
2、集合运算中各个集合必须有相同的列数,且类型一致,集合运算的结果将采用第一个集合的表头作为最终的表头,order by必须放在每个集合后。
8-2 UNION(并集)
1、使用 UNION 运算符返回两个查询剔除了重复行的结果。 SELECT * from EMPLOYEES WHERE DEPARTMENT_ID=10
UNION
SELECT * from EMPLOYEES WHERE DEPARTMENT_ID=20;
2、使用 UNION ALL 运算符返回两个查询的全部结果包括重复的记录。 SELECT * from EMPLOYEES WHERE DEPARTMENT_ID=10 UNION ALL
SELECT * from EMPLOYEES WHERE DEPARTMENT_ID=20; 3、规则
? 各个集合必须有相同的列数且类型一致。
? 生成的结果集将采用第一个集合的表头作为最终的表头,order by必须放在
整个集合后。
演示 - 使用UNION
1. 查询表EMPLOYEES表中10部门和20部门的员工信息。
演示 - 使用UNION
1. 统计表EMPLOYEES中各个部门的总工资,和各部门各职位的工资。
练习 - 使用UNION
1. 查看表EMPLOYEES。
2. 显示部门10、50和20生成一个岗位列表。显示岗位编号和部门编号,用集合操作
建立此查询。
8-3 INTERSECT(交集)
1、使用 INTERSECT 运算符返回两个查询相同的记录。 2、规则
? 在查询中被 SELECT 语句选择的列数和数据类型必须与在查询中所使用的所
有的 SELTCT 语句中的一样,但列的名字不必一样。 ? 相交的表的倒序排序不改变结果。 ? 相交不忽略空值。
演示 - 使用INTERSECT
1. 查询表EMPLOYEES和DEPARTMENTS都存在的部门号。
练习 - 使用INTERSECT
1. 查看表EMPLOYEES。