1 子查询语法
SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list
FROM table);
2 单行子查询
子查询是以一个子sql嵌套在主sql的形式体现的。子sql可以在select子句中体现,也可以在where,having,from子句中体现。
子sql和主sql的操作符能常是单行操作符(>,=,>=,<,<>,<=)和多行操作符(in,any,all,exists)。
如:
SELECT last_name, salary
FROM employees
WHERE salary >
(SELECT salary
FROM employees
WHERE last_name = ‘Abel’);
统计工资比Abel工资高的员工信息。
2.1 子查询规则
子sql需要用括号括起来;
子查询一般是放在比较符的右边作为比较条件,然而子查询可以出现在比较符的任意一边;
单行子查询使用单行操作符,多行子查询使用多行操作符
2.2 单行子查询要素
只能返回一行。使用单行比较操作符。
单行比较操作符:=,>,>=,<,<=,<>
如:
SELECT last_name, job_id, salary
FROM employees
WHERE job_id =
(SELECT job_id
FROM employees
WHERE last_name = ‘Taylor’)
AND salary >
(SELECT salary
FROM employees
WHERE last_name = ‘Taylor’);
统计和Taylor同一个工作岗位且工资和他一样的员工信息。
子查询中可以使用group分组函数
如:
SELECT last_name, job_id, salary
FROM employees
WHERE salary =
(SELECT MIN(salary)
FROM employees);
统计公司中工资最低的员工信息。
having子句中使用子查询
如:
SELECT department_id, MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary) >
(SELECT MIN(salary)
FROM employees
WHERE department_id = 50);
以上查询哪个部门的最低工资大于50部门的最低工资。
SELECT job_id, AVG(salary)
FROM employees
GROUP BY job_id
HAVING AVG(salary) = (SELECT MIN(AVG(salary))
FROM employees
GROUP BY job_id);
以上统计平均工资最低的工种信息。
2.3 错误用法
SELECT employee_id, last_name
FROM employees
WHERE salary =
(SELECT MIN(salary)
FROM employees
GROUP BY department_id);
子sql中返回多行数据,此时不能用=匹配,可以用In来匹配。
3 练习题
判断:
使用子查询相当于执行两个连续查询,并使用第一个查询的结果作为第二个查询中的搜索值。
A True
B False
【答题小贴士】:
1、以墨天轮文章的形式解析题目并给出答案
2、将墨天轮文章链接发送到此文的评论区




