MySQL--子查询

1.含义

出现在其他语句中的SELECT语句,成为子查询或内查询

外部的查询语句,称为主查询或外查询

2.分类

1.按子查询出现的位置:

1.SELECT后面:

仅仅支持标量子查询

SELECT d.*,(SELECT COUNT(*) FROM employees e WHERE e.department_id = d.department_id) 个数 FROM departments d;

SELECT (SELECT department_name FROM departments d INNER JOIN employees e ON d.department_id=e.department_id WHERE e.employee_id=102);

2.FROM后面:

支持表子查询

将子查询结果充当一张表,要求必须起别名

SELECT ag_dep.*,g.grade_level FROM (SELECT AVG(salary) ag,department_id FROM employees GROUP BY department_id) ag_dep INNER JOIN job_grades g on age_dep.ag BETWEEN lowest_sal AND highest_sal;

3.WHERE或HAVING后面:★

标量子查询(单行)√

SELECT * FROM employees WHERE salary>(SELECT salary FROM employees WHERE last_name = 'abel');

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);

SELECT last_name,job_id,salary FROM employees WHERE salary = (SELECT MIN(salary) FROM employees);

SELECT MIN(salary),department_id FROM employees GROUP BY department_id HAVING MIN(salary)>(SELECT MIN(salary) FROM employees WHERE department_id = 50);

SELECT MIN(salary),department_id FROM employees GROUP BY department_id HAVING MIN(salary)>(SELECT salary FROM employees WHERE department_id = 50)(这个是报错的,业务子查询表示一行一列的)

SELECT MIN(salary),department_id FROM employees GROUP BY department_id HAVING MIN(salary)>(SELECT salary FROM employees WHERE department_id = 250)(这个是部门是不存在的)

列子查询(多行)√

①返回多行

②使用多行比较操作符

SELECT last_name FROM employees WHERE department_id IN(SELECT DISTINCT department_id FROM departments WHERE location_id IN(1400,1700));(DISTINCT去重)

SELECT last_name,employee_id,job_id,salary FROM employees WHERE salary<ANY(SELECT DISTINCT salary FROM employees WHERE job_id = 'IT_PROG') AND job_id <> 'IT_PROG';或

SELECT last_name,employee_id,job_id,salary FROM employees WHERE salary < ANY(SELECT DISTINCT MAN(salary) FROM employees WHERE job_id = 'IT_PROG') AND job_id <> 'IT_PROG';

SELECT last_name,employee_id,job_id,salary FROM employees WHERE salary < ALL(SELECT DISTINCT salary FROM employees WHERE job_id = 'IT_PROG') AND job_id<>'IT_PROG';或

SELECT last_name,employee_id,job_id,salary FROM employees WHERE salary < (SELECT DISTINCT MIN(salary) FROM employees WHERE job_id = 'IT_PROG') AND job_id<>'IT_PROG';

行子查询(结果集一行多列或多行多列)

SELECT * FROM employees WHERE (employee_id,salary)=(SELECT MIN(employee_id),MAX(salary) FROM employees);

5.特点

①子查询放在小括号内

②子查询一般放在条件的右侧

③标量子查询,一般搭配着单行操作符使用

> < >= <= = <>

④列子查询,一般搭配着多行操作符使用

IN、ANY/SOME、ALL

⑤子查询的执行优先于主查询执行,主查询的条件用到了子查询的结果

4.EXISTS后面(相关子查询)

表子查询

语法:EXISTS(完整的查询语句)

结果:1或0

SELECT department_name FROM departments d WHERE EXISTS(SELECT * FROM employees e WHERE d.department_id = e.department_id));或者

SELECT department_name FROM departments d WHERE d.department_id IN (SELECT departmen_id FROM employees);

SELECT bo.* FROM boys bo WHERE bo.id NOT IN(SELECT boyfriend_id FROM beauty);或者

SELECT bo.* FROM boys bo WHERE NOT EXISTS(SELECT boyfriend_id FROM beauty b WHERE bo.id = b.boyfriend_id);

2.按结果集的行列数不同

1.标量子查询(结果集只有一行一列)

2.列子查询(结果集只有一列多行)

3.行子查询(结果集只有一行多列)

4.表子查询(结果集一般为多行多列)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值