-- 查询常数 SELECT "songzx",employee_id,last_name FROM employees;
DESC 显示表结构
1 2
-- 显示表结构 DESC employees;
WHERE 查询
查询 employees 表中 last_name 等于 King 的数据
1
SELECT*FROM employees WHERE last_name ='King';
SQL 算数运算符
符号
作用
+
加
-
减
*
乘
/
除
%
取模
简单示例
1
SELECT110,100+50,100*2,100+12.3FROM DUAL;
SQL 中的 + 没有连接的作用,只有加法的作用,下面的结果是 112
1
SELECT100+'12'FROM DUAL;
如果加法不能正常计算,则按照0处理,如下结果是 100
1
SELECT100+'a'FROM DUAL;
SQL中的除法得出的结果默认保留四位小数
1
SELECT100/2,50/5FROM DUAL;
% 取模运算
1
SELECT12%5,100%10,13%-2,-12%5,-12%-5FROM DUAL;
练习:查询员工id为偶数的数据
1 2 3
SELECT employee_id,last_name,salary FROM employees WHERE employee_id %2=0;
SQL 比较运算符
符号
作用
=
等于
<=>
安全的等于,为 NULL 而生
<> 或者 !=
不等于
<
小于
<=
小于等于
>
大于
>=
大于等于
普通等于如果一边有NULL,则结果就是NULL
结果为: 1 1 NULL
1 2
SELECT1='1',0='a',2=NULL FROM DUAL;
安全等于如果一边有null结果不会返回null
结果为:0 1
1 2
SELECT1<=>NULL,NULL<=>NULL FROM DUAL;
其他比较符号如果有 NULL 参与返回的结果都是 NULL
结果为 1 0 0
1 2
SELECT1!=2,0!='a',1!=1 FROM DUAL;
大于等于判断
结果为 1 1 1 1
1 2
SELECT2>1,5>=5,1<2,1<=1 FROM DUAL;
IS NULL 和 ISNULL(expr) 的使用
查询为NULL的数据
1 2 3 4 5 6 7 8
-- 查询表中字段是 NULL 的数据 SELECT employee_id,last_name,commission_pct FROM employees WHERE commission_pct ISNULL; -- 或 SELECT employee_id,last_name,commission_pct FROM employees WHERE ISNULL(commission_pct);
IS NOT NULL 的使用
查询不是 NULL 的数据
1 2 3 4
-- 查询表中字段不是 NULL 的数据 SELECT employee_id,last_name,commission_pct FROM employees WHERE commission_pct ISNOTNULL;
LEAST 和 GREATEST
最小 LEAST 和最大 GREATEST
1 2 3
-- LEAST(value1,value2,...) 和 GREATEST(value1,value2,...) SELECT LEAST('d','h','a'),GREATEST('d','h','a') FROM DUAL;
BETWEEN … AND
查询包含在某个区间的数据
练习1:查询员工工资在6000到8000之间的数据,包含6000和8000
1 2 3 4 5 6 7
SELECT employee_id,last_name,salary FROM employees WHERE salary BETWEEN6000AND8000; -- 或 SELECT employee_id,last_name,salary FROM employees WHERE salary >=6000AND salary <=8000;
练习2:查询员工工资不在6000到8000的数据
1 2 3
SELECT employee_id,last_name,salary FROM employees WHERE salary NOTBETWEEN6000AND8000;
IN(val1,val2,…) 和 NOT IN(val1,val2,…)
查询在指定数据内的数据
练习1:查询员工部门在10 20 30的数据
1 2 3
SELECT employee_id,last_name,department_id FROM employees WHERE department_id IN(10,20,30);
练习2:查询员工部门不在10 20 30的数据
1 2 3
SELECT employee_id,last_name,department_id FROM employees WHERE department_id NOTIN(10,20,30);
LIKE 模糊查询
练习1:查询名字中只要包含a的数据
% 代表不确定个数的字符
1 2 3
SELECT employee_id,last_name FROM employees WHERE last_name LIKE'%a%';
练习2:查询名字以a开头的数据
1 2 3
SELECT employee_id,last_name FROM employees WHERE last_name LIKE'a%';
练习3:查询名字以a结尾的数据
1 2 3
SELECT employee_id,last_name FROM employees WHERE last_name LIKE'%a';
练习4:查询名字第二位是a的数据
_ 表示一个不确定的字符
1 2 3
SELECT employee_id,last_name FROM employees WHERE last_name LIKE'_a%';
练习5:查询名字中有a并且有e的数据
1 2 3 4 5 6 7
SELECT employee_id,last_name FROM employees WHERE last_name LIKE'%a%'AND last_name LIKE'%e%'; -- 或 SELECT employee_id,last_name FROM employees WHERE last_name LIKE'%a%e%'OR last_name LIKE'%e%a%';
练习6:查询名字第二位是_且第三位是a的员工数据
\ 表示一个转义符
1 2 3
SELECT employee_id,last_name FROM employees WHERE last_name LIKE'_\_a%';
REGEXP
使用正则表达式
1 2
SELECT'szxstart' REGEXP '^s','szxstart' REGEXP 't$' FROM DUAL;
-- 1.查询工资不在5000到12000的员工的姓名和工资 SELECT employee_id,last_name,salary FROM employees WHERE salary NOTBETWEEN5000AND12000;
-- 2.查询在20或50号部门的员工姓名和部门号 SELECT employee_id,last_name,department_id FROM employees WHERE department_id in (20,50);
-- 3.查询公司中没有管理者的员工姓名及jobid SELECT employee_id,last_name,job_id FROM employees WHERE manager_id ISNULL; -- 4.查询公司中有奖金的姓名,工资,奖金级别 SELECT employee_id,last_name,salary,commission_pct FROM employees WHERE commission_pct ISNOTNULL;
-- 5.查询员工姓名的第三个字母是a的数据 SELECT employee_id,last_name FROM employees WHERE last_name LIKE'__a%';
-- 6.查询姓名中有 a 和 k 的数据 SELECT employee_id,last_name FROM employees WHERE last_name LIKE'%a%k%'OR last_name LIKE'%k%a%';
-- 7.查询出employees表中first_name 以 e 结尾的数据 SELECT employee_id,first_name FROM employees WHERE first_name LIKE'%e'; -- 8.查询部门编号在 80-100 之间的姓名、工种 SELECT employee_id,last_name,department_id FROM employees WHERE department_id BETWEEN80AND100;
-- 9.查询出 manager_id 是 100,101,110的姓名,工资,管理者id SELECT employee_id,last_name,salary,manager_id FROM employees WHERE manager_id in (100,101,110);
ORDER BY 排序
排序规则
使用关键字 ORDER BY 进行排序。排序方式有两种
ASC 升序排序,默认采用这个方式
DESC 降序排序
单列排序
1.按照员工工资升序排列
1 2 3 4 5 6
SELECT * FROM employees ORDERBY salary;
2.找出员工工资在6000-9000并按照降序排列
1 2 3 4 5 6 7 8 9 10
SELECT employee_id, last_name, salary FROM employees WHERE salary BETWEEN6000AND9000 ORDERBY salary DESC;
多列排序
找出员工部门在60-80的按照降序排列,并且部门之间员工工资按照升序排列
1 2 3 4 5 6 7 8 9 10 11 12
SELECT employee_id, last_name, salary, department_id FROM employees WHERE department_id BETWEEN60AND80 ORDERBY department_id DESC, salary;
LIMIT 分页
使用 LIMIT 关键字进行排序
1.获取员工表第1页数据,每页显示20条
1 2 3
SELECT* FROM employees LIMIT 0,20;
2.获取员工表第2页数据,每页显示20条
1 2 3
SELECT* FROM employees LIMIT 20,20;
3.获取员工表第3页数据,每页显示20
总结公式:LIMIT (pageNum-1)*pageSize,pageNum
1 2 3
SELECT* FROM employees LIMIT 20,20;
4.WHERE,ORDER BY,LIMIT声明顺序
查询员工工资在6000到8000的数据按照工资降序排序显示前20条
1 2 3 4 5 6 7 8 9 10 11
SELECT employee_id, last_name, salary FROM employees WHERE salary BETWEEN6000AND8000 ORDERBY salary DESC LIMIT 20;
SELECT t1.employee_id, t1.last_name, t1.department_id FROM employees t1, departments t2 WHERE t1.department_id = t2.department_id;
多表查询
多表查询使用 AND 关联
1 2 3 4 5 6 7 8 9 10 11 12
SELECT t1.employee_id, t1.last_name, t2.department_id, t3.city FROM employees t1, departments t2, locations t3 WHERE t1.department_id = t2.department_id AND t2.location_id = t3.location_id
多表查询的分类
等值连接 vs 非等值连接
自连接 vs 非自连接
内连接 vs 外连接
等值连接 vs 非等值连接
等值连接,查询出员工的具体部门名称
1 2 3 4 5 6 7 8 9
SELECT t1.employee_id, t1.last_name, t2.department_name FROM employees t1, departments t2 WHERE t1.department_id = t2.department_id;
非等值连接,查询员工的工资等级
1 2 3 4 5 6 7 8 9 10 11 12
SELECT t1.employee_id, t1.last_name, t1.salary, t2.grade_level FROM employees t1, job_grades t2 WHERE t1.salary BETWEEN t2.lowest_sal AND t2.highest_sal; AND t2.highest_sal;
自连接 vs 非自连接
自连接。查询员工姓名已经管理者,让员工的领导id等于领导人的empid
1 2 3 4 5 6 7 8 9 10
SELECT t1.employee_id, t1.last_name, t2.manager_id, t2.last_name FROM employees t1, employees t2 WHERE t1.manager_id = t2.employee_id;
-- 方式一:左上图 UNION ALL 右中图 SELECT t1.employee_id, t1.last_name, t2.department_name FROM employees t1 LEFTJOIN departments t2 ON t1.department_id = t2.department_id UNIONALL SELECT t1.employee_id, t1.last_name, t2.department_name FROM employees t1 RIGHTJOIN departments t2 ON t1.department_id = t2.department_id WHERE t1.employee_id ISNULL; -- 方式二:右上图 UNION ALL 左中图 SELECT t1.employee_id, t1.last_name, t2.department_name FROM employees t1 RIGHTJOIN departments t2 ON t1.department_id = t2.department_id UNIONALL SELECT t1.employee_id, t1.last_name, t2.department_name FROM employees t1 LEFTJOIN departments t2 ON t1.department_id = t2.department_id WHERE t1.department_id ISNULL;
右下图
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
SELECT t1.employee_id, t1.last_name, t2.department_name FROM employees t1 LEFTJOIN departments t2 ON t1.department_id = t2.department_id WHERE t1.department_id ISNULLUNIONALL SELECT t1.employee_id, t1.last_name, t2.department_name FROM employees t1 RIGHTJOIN departments t2 ON t1.department_id = t2.department_id WHERE t1.employee_id ISNULL;
多表内外连接查询练习
现有如下两张表
人员表:t_emp
门派表:t_dept
1.所有有门派的人员信息
1 2 3 4 5 6
SELECT t1.`name`, t2.deptName FROM t_emp t1 JOIN t_dept t2 ON t1.deptId = t2.id;
2.列出所有用户,并显示其机构信息
1 2 3 4 5 6
SELECT t1.`name`, t2.deptName FROM t_emp t1 LEFTJOIN t_dept t2 ON t1.deptId = t2.id;
3.列出所有门派
1 2 3 4 5 6
SELECT t1.`name`, t2.deptName FROM t_emp t1 RIGHTJOIN t_dept t2 ON t1.deptId = t2.id;
4.所有不入门派的人员
1 2 3 4 5 6 7 8
SELECT t1.`name`, t2.deptName FROM t_emp t1 LEFTJOIN t_dept t2 ON t1.deptId = t2.id WHERE t1.deptId ISNULL;
5.所有没人入的门派
1 2 3 4 5 6 7 8
SELECT t1.`name`, t2.deptName FROM t_emp t1 RIGHTJOIN t_dept t2 ON t1.deptId = t2.id WHERE t1.deptId ISNULL;
6.列出所有人员和机构的对照关系
1 2 3 4 5 6 7 8 9 10 11 12 13 14
SELECT t1.`name`, t2.deptName FROM t_emp t1 LEFTJOIN t_dept t2 ON t1.deptId = t2.id UNIONALL SELECT t1.`name`, t2.deptName FROM t_emp t1 RIGHTJOIN t_dept t2 ON t1.deptId = t2.id WHERE t1.deptId ISNULL;
7.列出所有没入派的人员和没人入的门派
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
SELECT t1.`name`, t2.deptName FROM t_emp t1 LEFTJOIN t_dept t2 ON t1.deptId = t2.id WHERE t1.deptId ISNULLUNIONALL SELECT t1.`name`, t2.deptName FROM t_emp t1 RIGHTJOIN t_dept t2 ON t1.deptId = t2.id WHERE t1.deptId ISNULL;
扩展:USING 的使用
如果两张表中有形同的字段,可以使用 USING 字段声明让那个字段进行等值判断
JOIN ON 的写法
1 2 3 4 5 6
SELECT t1.last_name, t2.department_name FROM employees t1 JOIN departments t2 ON t1.department_id = t2.department_id;
USING 写法。查询结果与上面相同
1 2 3 4 5 6
SELECT t1.last_name, t2.department_name FROM employees t1 JOIN departments t2 USING ( department_id );
单行函数
操作数据对象
接收参数返回一个结果
只对一行进行变换
每行返回一个结果
可以嵌套
参数可以使一列或者一个值
数值函数
基本函数
三角函数
指数和对数
进制之间的转换
字符串函数
MySQL中,字符串的位置是从1开始的。
日期和时间函数
获取日期时间
日期和时间戳转换
获取月份、星期、星期数、天数等函数
日期的操作函数
时间和秒钟转换的函数
计算日期和时间的函数
日期格式化与解析
流程控制函数
IF(expr1,expr2,expr3)
如果expr1的值为true,则返回expr2的值,否则返回expr3
练习1:返回员工的姓名,工资,奖金,如果奖金为null则返回0
1 2 3 4 5 6 7 8
SELECT employee_id, last_name, salary, IF ( commission_pct, commission_pct, 0 ) FROM employees;
IFNULL(expr1,expr2)
如果expr1为true则返回expr1,否则返回expr
练习:返回员工的姓名,工资,奖金,如果奖金为null则返回0
1 2 3 4 5 6
SELECT last_name, salary, IFNULL( commission_pct, 0 ) FROM employees;
CASE WHEN 条件1 THEN 结果1 WHEN 条件2 THEN 结果2 ELSE 结果3 END
相当于java中的if else if else
练习:输出不同工资对应的等级
1 2 3 4 5 6 7 8 9 10 11 12 13 14
SELECT last_name, salary, CASE WHEN salary >=12000THEN '白骨精' WHEN salary >=10000THEN '高富帅' WHEN salary >=8000THEN '小白领'ELSE'加油' END'details' FROM employees;
CASE 条件 WHEN 常量1 THEN 结果1 WHEN 常量2 THEN 结果2 ELSE 结果n END
SELECT last_name, department_id, hire_date FROM employees WHERE EXTRACT( YEARFROM hire_date ) >=1997 AND department_id IN ( 80, 90, 110 ) AND commission_pct ISNOTNULL;
7.查询公司中入职超过10000天的员工姓名、入职时间
1 2 3 4 5 6 7 8 9 10
SELECT last_name, department_id, hire_date, DATEDIFF( NOW(), hire_date ) AS "job_days" FROM employees WHERE DATEDIFF( NOW(), hire_date ) >10000 ORDERBY job_days DESC;
SELECT salary FROM employees WHERE last_name ='Abel';
SELECT last_name,salary FROM employees WHERE salary >11000;
方式二:使用自关联。不通用
1 2 3 4 5 6 7 8
SELECT t1.last_name, t1.salary FROM employees t1 JOIN employees t2 ON t1.salary > t2.salary WHERE t2.last_name ='Abel';
方式三:使用子查询的方式在一条SQL语句中完成查询
1 2 3 4 5 6 7
SELECT last_name, salary FROM employees WHERE salary > ( SELECT salary FROM employees WHERE last_name ='Abel' );
使用一个 () 将另外一个查询语句包起来去比较,这种方式称为子查询。
单行子查询
适用于单行子查询的比较符
操作符
含义
=
等于
>
大于
>=
大于等于
<
小于
<=
小于等于
!=
不等于
查询员工工资大于149号员工工资的信息
1 2 3 4 5 6 7
SELECT last_name, salary FROM employees WHERE salary > ( SELECT salary FROM employees WHERE employee_id =149 );
返回job_id与141号员工相同,salary比143号员工多的员工姓名,job_id和工资
1 2 3 4 5 6 7 8 9
SELECT last_name, job_id, salary FROM employees WHERE job_id = ( SELECT job_id FROM employees WHERE employee_id =141 ) AND salary > ( SELECT salary FROM employees WHERE employee_id =143 );
返回公司工资最少的员工的last_name,job_id和salary
1 2 3 4 5 6 7 8
SELECT last_name, job_id, salary FROM employees WHERE salary = ( SELECTMIN( salary ) FROM employees );
SELECT employee_id, manager_id, department_id FROM employees WHERE manager_id = ( SELECT manager_id FROM employees WHERE employee_id =141 ) AND department_id = ( SELECT department_id FROM employees WHERE employee_id =141 ) AND employee_id !=141;
查询最低工资大于50号部门最低工资的部门id和其最低工资
1 2 3 4 5 6 7 8 9
SELECT department_id, MIN( salary ) FROM employees GROUPBY department_id HAVING MIN( salary ) > ( SELECTMIN( salary ) FROM employees WHERE department_id =50 );
SELECT employee_id, last_name, CASE WHEN department_id = ( SELECT department_id FROM departments WHERE location_id =1800 ) THEN 'Canada'ELSE'USA' ENDAS "location" FROM employees;
SELECT employee_id, last_name, job_id, salary FROM employees WHERE job_id !='IT_PROG' AND salary <ANY ( SELECT salary FROM employees WHERE job_id ='IT_PROG' );
SELECT employee_id, last_name, job_id, salary FROM employees WHERE job_id !='IT_PROG' AND salary <ALL ( SELECT salary FROM employees WHERE job_id ='IT_PROG' );
-- 方式一:使用相关子查询 SELECT e1.last_name, e1.salary, e1.department_id FROM employees e1 WHERE e1.salary > ( SELECTAVG( salary ) FROM employees e2 WHERE e1.department_id = e2.department_id GROUPBY department_id );
-- 方式二:在 FROM 中使用子查询 SELECT e1.last_name, e1.salary, e1.department_id FROM employees e1 JOIN ( SELECT department_id, AVG( salary ) avg_salary FROM employees GROUPBY department_id ) e2 ON e1.department_id = e2.department_id WHERE e1.salary > e2.avg_salary;
查询员工的id,salary,按照department_name 排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
-- 方式一:使用自连接 SELECT e.employee_id, e.salary, d.department_name FROM employees e JOIN departments d ON e.department_id = d.department_id ORDERBY d.department_name; -- 方式二:在 ORDER BY 中使用子查询 SELECT e.employee_id, e.salary FROM employees e ORDERBY ( SELECT department_name FROM departments d WHERE e.department_id = department_id );
-- 根据外查询获取到当前员工id,去job_history表中查找这个员工id的数量大于等于2的,然后把结果返回 SELECT employee_id, last_name, job_id FROM employees e WHERE 2<= ( SELECTCOUNT(*) FROM job_history j WHERE e.employee_id = j.employee_id );
-- 方式一: SELECT d.department_name, d.department_id FROM departments d WHERE NOTEXISTS ( SELECT*FROM employees e WHERE e.department_id = d.department_id );
-- 方式二: SELECT d.department_name, d.department_id FROM employees e RIGHTJOIN departments d ON e.department_id = d.department_id WHERE e.employee_id ISNULL;
#1.查询和Zlotkey相同部门的员工姓名和工资 SELECT last_name, salary FROM employees WHERE department_id IN ( SELECT department_id FROM employees WHERE last_name ='Zlotkey');
#2.查询工资比公司平均工资高的员工的员工号,姓名和工资。 SELECT employee_id, last_name, salary FROM employees WHERE salary > ( SELECTAVG( salary ) FROM employees );
#3.选择工资大于所有JOB_ID ='SA_MAN'的员工的工资的员工的last_name, job_id, salary SELECT last_name, job_id, salary FROM employees WHERE salary >ALL ( SELECT salary FROM employees WHERE job_id ='SA_MAN' );
#4.查询和姓名中包含字母u的员工在相同部门的员工的员工号和姓名 SELECT employee_id, last_name FROM employees WHERE department_id IN ( SELECT department_id FROM employees WHERE last_name LIKE'%u%' );
#5.查询在部门的location_id为1700的部门工作的员工的员工号 SELECT employee_id, last_name FROM employees WHERE department_id IN ( SELECT department_id FROM departments WHERE location_id =1700 );
#6.查询管理者是King的员工姓名和工资 SELECT last_name, salary FROM employees WHERE manager_id IN ( SELECT employee_id FROM employees WHERE last_name ='King');
#7.查询工资最低的员工信息: last_name, salary SELECT last_name, salary FROM employees WHERE salary = ( SELECTMIN(salary) FROM employees );
#8.查询平均工资最低的部门信息
-- 方式一: SELECT * FROM departments WHERE department_id = ( SELECT department_id FROM employees GROUPBY department_id HAVING AVG( salary ) = ( SELECTMIN( avg_salary ) FROM ( SELECT department_id, AVG( salary ) avg_salary FROM employees GROUPBY department_id ) t_avg_salary ) ); -- 方式二:使用 LIMIT 和 FROM 子查询来做 SELECT t1.* FROM departments t1 JOIN (SELECT department_id,AVG(salary) avg_sal FROM employees GROUPBY department_id ORDERBY avg_sal LIMIT 1) t2 ON t1.department_id = t2.department_id;
#9.查询平均工资最低的部门信息和该部门的平均工资(相关子查询) SELECT d.*, AVG( e.salary ) FROM employees e JOIN departments d ON e.department_id = d.department_id GROUPBY e.department_id HAVING AVG( e.salary ) = ( SELECTMIN( avg_salary ) FROM ( SELECT department_id, AVG( salary ) avg_salary FROM employees GROUPBY department_id ) t_avg_salary );
#10.查询平均工资最高的 job 信息 SELECT t1.* FROM jobs t1 JOIN ( SELECT job_id, AVG( salary ) avg_salary FROM employees GROUPBY job_id ORDERBY avg_salary DESC LIMIT 1 ) t2 ON t1.job_id = t2.job_id;
#11.查询平均工资高于公司平均工资的部门有哪些? SELECT department_id, AVG( salary ) FROM employees WHERE department_id ISNOTNULL GROUPBY department_id HAVINGAVG( salary ) > ( SELECTAVG( salary ) FROM employees );
#12.查询出公司中所有 manager 的详细信息 SELECT e1.employee_id, e1.last_name, e1.salary FROM employees e1 WHERE EXISTS ( SELECT*FROM employees e2 WHERE e1.employee_id = e2.manager_id );
-- 2.找出部门为90的管理者 SELECTDISTINCT t2.* FROM employees t1,employees t2,(SELECT department_id,AVG(salary) avg_salary FROM employees GROUPBY department_id ORDERBY avg_salary DESC LIMIT 1) t3 WHERE t1.manager_id = t2.employee_id AND t2.manager_id ISNULL AND t2.department_id = t3.department_id;
#15. 查询部门的部门号,其中不包括job_id是"ST_CLERK"的部门号 SELECTDISTINCT department_id FROM employees WHERE job_id ='ST_CLERK';
-- 方式一:先找出jobid等于ST_CLERK的部门有哪些,然后再找出部门id不在这几个部门的数据有哪些 SELECT department_id FROM departments WHERE department_id NOTIN (SELECTDISTINCT department_id FROM employees WHERE job_id ='ST_CLERK');
-- 方式二:使用 NOT EXISTS SELECT t1.department_id FROM departments t1 WHERENOTEXISTS (SELECTDISTINCT t2.department_id FROM employees t2 WHERE t2.job_id ='ST_CLERK' AND t1.department_id = t2.department_id);
#16. 选择所有没有管理者的员工的last_name SELECT t1.last_name FROM employees t1 LEFTJOIN employees t2 ON t1.manager_id = t2.employee_id WHERE t1.manager_id ISNULL;
#17.查询员工号、姓名、雇用时间、工资,其中员工的管理者为 'De Haan' SELECT employee_id, last_name, hire_date, salary FROM employees WHERE manager_id IN ( SELECT employee_id FROM employees WHERE last_name ='De Haan' );
#18.查询各部门中工资比本部门平均工资高的员工的员工号, 姓名和工资(相关子查询)
SELECT t1.employee_id,t1.last_name,t1.salary FROM employees t1 WHERE t1.salary > ( SELECTAVG(t2.salary) FROM employees t2 WHERE t1.department_id = t2.department_id GROUPBY t2.department_id );
SELECT e1.employee_id, e1.last_name, e1.department_id, e1.salary FROM employees e1 WHERE EXISTS ( SELECT e2.department_id, AVG( e2.salary ) FROM employees e2 WHERE e1.department_id = e2.department_id GROUPBY e2.department_id HAVING e1.salary >AVG( e2.salary ) );
#19.查询每个部门下的部门人数大于 5 的部门名称(相关子查询) SELECT d.department_name FROM departments d WHERE EXISTS ( SELECT department_id, COUNT(*) FROM employees e WHERE e.department_id = d.department_id GROUPBY department_id HAVINGCOUNT(*) >5 );
#20.查询每个国家下的部门个数大于 2 的国家编号(相关子查询) SELECT l.city, l.location_id, l.country_id FROM locations l WHERE EXISTS ( SELECT d.location_id, COUNT(*) FROM departments d WHERE d.location_id = l.location_id HAVING COUNT(*) >2 );