当当当当~~~~欢迎大家阅读,今天我们学习数据查询语言中的子查询?
一、含义:
出现在其他语句中的select语句,称为子查询或内查询 外面的语句可以是insert、update、delete、select等,一般select作为外面语句较多 外面如果为select语句,则称此语句为主查询或外查询
二、分类:
按子查询出现的位置:
? ? select后面: ? ? ? ? ? ?仅仅支持标量子查询 ? ? ?from后面: ? ? ? ? ? ?支持表子查询 ? ? ?where 或having后面: ? ? ★ ? ? ? ? ? ? 标量子查询 (单行) ? √ ? ? ? ? ? ? 列子查询 ? (多行) ? √ ? ? ? ? ? ? 行子查询 ? ? ?exists后面(相关子查询): ? ? ? ? ? 标量子查询 ? ? ? ? ? ?列子查询 ? ? ? ? ? ?行子查询 ? ? ? ? ? ?表子查询 ? ? ? ? ? ??
按结果集的行列数不同:?
? ? ?标量子查询(结果集只有一行一列) ? ? ?列子查询(结果集只有一行多列) ? ? ?行子查询(结果集有一行多列) ? ? ?表子查询(结果集一般有多行多列)
?快来一起学习子查询吧~~~~
一、where或having后面
1、标量子查询(单行子查询) 2、列子查询(多行子查询) 3、行子查询(多列多行)
特点: ①子查询放在小括号内 ②子查询一般放在条件的右侧 ③标量子查询,一般搭配着单行操作符使用(> < >= <= = <>) ? 列子查询,一般搭配着多行操作符使用(in、any/some、all) ④子查询的执行优先于主查询执行,主查询的条件用到了子查询的结果
1、标量子查询
案例1:谁的工资比abel高? ①查询abel的工资 SELECT salary FROM employees WHERE last_name='Abel' ②查询员工的信息了,满足salary>①结果 SELECT * FROM employees WHERE salary>( ?? ?SELECT salary ?? ?FROM employees ?? ?WHERE last_name='Abel' );
案例2:查询最低工资大于50号部门最低工资的部门id和其最低工资 SELECT MIN(salary),department_id FROM employees GROUP BY department_id HAVING MIN(salary)>( ?? ?SELECT MIN(salary) ?? ?FROM employees ?? ?WHERE department_id=50 );
非法使用标量子查询:子查询的结果不是一行一列
2、列子查询(多行子查询)
返回多行比较操作符 操作符? ? ? ? ? ? ? ? 含义 in/not in? ? ? ? ?等于列表中的任意一个 any/some ? ? 和子查询返回的某一个值比较? all? ? ? ? ? ? ? ? ?和子查询返回的所有值比较 ??
in
案例1:查询location_id是1400或1700的部门编号 SELECT last_name FROM employees WHERE department_id IN( ?? ?SELECT DISTINCT department_id ?? ?FROM departments ?? ?WHERE location_id IN(1400,1700)?? ? );
any
案例2:返回其它部门中比job_id为'IT_PROG'部门任一工资低的员工的员工号、姓名、job_id以及salary ①查询job_id为'IT_PROG'部门任一工资 SELECT DISTINCT salary FROM employees WHERE job_id='IT_PROG' ②查询员工号、姓名、job_id以及salary 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<( ?? ?SELECT MAX(salary) ?? ?FROM employees ?? ?WHERE job_id='IT_PROG' )AND job_id<>'IT_PROG';
all
案例3:返回其它部门中比job_id为'IT_PROG'部门所有工资低的员工的员工号、姓名、job_id以及salary 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 MIN(salary) ?? ?FROM employees ?? ?WHERE job_id='IT_PROG' )AND job_id<>'IT_PROG';
3、行子查询(结果集一行多列或多行一列)
案例:查询员工编号最小并且工资最高的员工信息 SELECT* FROM employees WHERE (employee_id,salary)=( ? ? ? SELECT MIN(employee_id),MAX(salary) ? ? ? FROM employees ); SELECT* FROM employees WHERE employee_id=( ?? ?SELECT MIN(employee_id) ?? ?FROM employees )AND salary=( ?? ?SELECT MAX(salary) ?? ?FROM employees );
二、select后面(仅仅支持标量子查询,结果集一行一列)
案例:查询每个部门的员工个数 SELECT d.*,( ?? ?SELECT COUNT(*) ?? ?FROM employees e ?? ?WHERE e.department_id=d.department_id )个数 FROM departments d;
案例2:查询员工号=102的部门名 SELECT( ?? ?SELECT department_name ?? ?FROM departments d ?? ?INNER JOIN employees e ?? ?ON d.`department_id`=e.`department_id` ?? ?WHERE e.`employee_id`=102 )部门名;
三、from后面(将子查询结果充当一张表,要求必须起别名)
案例1:查询每个部门的平均工资的工资等级 ①查询每个部门的平均工资 SELECT AVG(salary),department_id FROM employees GROUP BY department_id ②连接①的结果集和job_grades表,筛选条件平均工资between lowest_sal and highest_sal 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 ag_dep.ag BETWEEN lowest_sal AND highest_sal;
四、exists 后面(相关子查询)
语法: exists(完整的查询语句) 例:SELECT EXISTS(SELECT employee_id FROM employees WHERE salary=300000);
结果: 1或0
案例1:查询有员工的部门名 使用in: SELECT department_name FROM departments d WHERE d.department_id IN( ?? ?SELECT department_id ?? ?FROM employees );
使用exists: SELECT department_name FROM departments d WHERE EXISTS( ?? ?SELECT * ?? ?FROM employees e ?? ?WHERE d.department_id=e.`department_id` );
案例2:查询没有女朋友的男神信息
使用in: SELECT bo.* FROM boys bo WHERE bo.id NOT IN( ?? ?SELECT boyfriend_id ?? ?FROM beauty );
使用exists: SELECT bo.* FROM boys bo WHERE NOT EXISTS( ?? ?SELECT boyfriend_id ?? ?FROM beauty b ?? ?WHERE bo.`id`=b.`boyfriend_id` );
以上就是数据查询语言中的子查询啦,希望我的文章对你有所帮助,如果有错误的地方还望大家批评指正,谢谢大家阅读!?
|