- A+
相关子查询
不相关子查询
子查询中没有使用到外部查询中表的任何一个列。
--先执行子查询,然后执行外部查询
--何时考虑使用子查询?
--如果一个查询任务需要2步以上的计算过程才能得到结果,那么都可以使用子查询
--子查询必须放在小括号中
--查询赚的比亚伯多的雇员的信息
--子查询负责找到亚伯的薪水
SELECT last_name,job_id,salary
FROM employees
WHERE salary > (SELECT salary
FROM employees
WHERE last_name='Abel');
--子查询一般放在比较操作符的右边,增强代码可读性。
--单行子查询:
--子查询返回1行1列1个值。
--多行子查询:
--子查询返回多行1列多个值。
--在外部查询中,要对单行子查询的返回结果进行比较,应该使用单行比较操作符:
-- > = < >= <= <> :只能比较一个值
--查询和Chen做一样的工作,但是赚的比Chen多的雇员的信息。
select last_name,salary,job_id
FROM employees
WHERE job_id = (
select job_id
FROM employees
where last_name='Chen'
)
AND salary > (
select salary
FROM employees
where last_name='Chen'
);
--子查询可出现在select语句的大部分子句中
--子查询-------
--如果子查询返回空结果集,它会把null值带入到外部查询中,从而导致外部查询的结果集
--也为空
--查询和雇员Haas干同样工作的雇员(公司中没有Haas)
SELECT last_name,job_id
FROM employees
WHERE job_id = (SELECT job_id
FROM employees
WHERE last_name='Haas');
--多行子查询---
--如果要在外部查询中对多行子查询的返回结果进行比较,必须使用多行比较操作符:
--3个:in(和其中任何一个值相等)、any(任何一个值)、all(所有值)
--其中,any和all不能单独使用,其前面必须加上单行比较操作符。例如:
-- >any <any =any(等同于in) >all <all等
--查询工作不是IT程序员,并且工资少于任何一个程序员的雇员的信息
SELECT last_name,salary,job_id
FROM employees
WHERE salary <ANY(
SELECT salary
FROM employees
WHERE job_id='IT_PROG'
)
and job_id <> 'IT_PROG';
--查询工作不是IT程序员,并且工资少于所有程序员的雇员的信息
SELECT last_name,salary,job_id
FROM employees
WHERE salary <All(
SELECT salary
FROM employees
WHERE job_id='IT_PROG'
)
and job_id <> 'IT_PROG';
--注意:当在外部查询的where中使用not in 操作符,并且,子查询的结果集中包含一个null
--值时,直接导致外部查询的结果集也为空
--查询非经理雇员的姓名
SELECT last_name
FROM employees
WHERE employee_id NOT IN (
SELECT manager_id
from employees
);
--原因:not in操作实际上转化为and操作。在and操作中,只要有一个条件为null,整个
--and的结果也为null,从而导致外部查询的结果集为空。
--解决办法:去掉子查询结果集中的null值
SELECT last_name
FROM employees
WHERE employee_id NOT IN (
SELECT manager_id
FROM employees
where manager_id is not null
);
本文由 路远 首发于【路远网(http://www.luyuan.io)】未经允许不得以任何方式转载,违者必将追究法律责任。
- 我的微信
- 这是我的微信扫一扫
- 我的电报
- 这是我的电报扫一扫