闵行西安网站建设,怎么做外国网站,事件营销策略,自己做的网站实现扫码跳转Mysql之子查询知识点例题 什么是子查询案例分析案例分析子查询的分类单行子查询子查询中的空值问题题目练习题目一题目二题目三题目四题目五补充#xff1a;聚合函数与GROUP BY的使用关系 CASE表达式#xff08;子查询中的运用#xff09;简单CASE表达式搜索CASE表达… Mysql之子查询知识点例题 什么是子查询案例分析案例分析子查询的分类单行子查询子查询中的空值问题题目练习题目一题目二题目三题目四题目五补充聚合函数与GROUP BY的使用关系 CASE表达式子查询中的运用简单CASE表达式搜索CASE表达式题目六 多行子查询题目七题目八题目九相关子查询题目十 EXISTS 与 NOT EXISTS关键字题目十一 相关更新题目十二 相关删除题目十三 子查询与自连接的部分使用情况分析 什么是子查询 子查询指一个查询语句嵌套在另一个查询语句内部的查询 SQL 中子查询的使用大大增强了 SELECT 查询的能力因为很多时候查询需要从结果集中获取数据或者 需要从同一个表中先计算得出一个数据结果然后与这个数据结果可能是某个标量也可能是某个集 合进行比较。 案例分析 #方式一
SELECT salary
FROM employees
WHERE last_name Abel;
SELECT last_name,salary
FROM employees
WHERE salary 11000;#方式二自连接
SELECT e2.last_name,e2.salary
FROM employees e1,employees e2
WHERE e1.last_name Abel
AND e1.salary e2.salary
FROM employees
WHERE salary (
SELECT salary
FROM employees
WHERE last_name Abel
);案例分析 子查询的基本使用 注意事项 子查询要包含在括号内 1.将子查询放在比较条件的右侧 2.单行操作符对应单行子查询 3.多行操作符对应多行子查询 子查询的分类 我们按内查询的结果返回一条还是多条记录 将子查询分为 单行子查询 、 多行子查询 。 单行子查询 单行比较操作符 子查询中的空值问题 不返回任何空行 SELECT last_name, job_id
FROM employees
WHERE job_id
(SELECT job_id
FROM employees
WHERE last_name Haas);题目练习
题目一 题目1 查询工资大于149号员工工资的员工的信息(last_name) SELECT last_name
FROM employees
WHERE salary (SELECT salaryFROM employeesWHERE employee_id 149) 题目二 题目二 返回job_id与141号员工相同salary比143号员工多的员工姓名job_id和工资 SELECT last_name, job_id, salary
FROM employees
WHERE job_id (SELECT job_idFROM employeesWHERE employee_id 141)
AND salary (SELECT salaryFROM employeesWHERE employee_id 143);题目三 题目三 返回公司工资最少的员工的last_name,job_id和salary SELECT last_name, job_id, salary
FROM employees
WHERE salary (SELECT MIN(salary)FROM employees)题目四 题目四查询与141号或174号员工的manager_id和department_id相同的其他员工的employee_idmanager_iddepartment_id 实现方式一不成对比较 SELECT employee_id, manager_id, department_id
FROM employees
#WHERE 过滤出来有多个结果注意不要用 , 用IN
WHERE manager_id IN(SELECT manager_idFROM employeesWHERE employee_id IN (141, 174))AND department_id IN(SELECT department_idFROM employeesWHERE employee_id IN (141, 174))AND employee_id NOT IN (141, 174)实现方式二不成对比较 SELECT employee_id, manager_id, department_id
FROM employees
WHERE (department_id, manager_id) IN
(
SELECT department_id, manager_id
FROM employees
WHERE employee_d IN (141, 149)
)
AND employee_id NOT IN (141, 174)总结 WHERE 过滤出来有多个结果注意不要用 , 用IN 不在的话用NOT IN表示 题目五 题目五查询最低工资大于50号部门最低工资的部门id和其最低工资 SELECT department_id, MIN(salary)
FROM employees
GROUP BY department_idHAVING MIN(salary)
(
SELECT MIN(salary)
FROM employees
WHERE department_id 50
)这里注意当过滤条件使用了聚合函数就要用HAVING来代替WHERE 补充聚合函数与GROUP BY的使用关系 QL中只要用到聚合函数就一定要用到group by 吗? 这个是分情况的 1、当聚集函数和非聚集函数出现在一起时需要将非聚集函数进行group by 2、当只做聚集函数查询时候就不需要进行分组了。 CASE表达式子查询中的运用 使用CASE表达式的情况:当需要根据一些字段的值生成新的列或者逻辑判断较为复杂时可能会使用CASE WHEN CASE表达式是在区分情况时使用的这种情况的区分在编程中通常称为(条件)分支 在对SELECT语句的结果进行编辑时CASE表达式能够发挥较大作用、 CASE WHEN表达式可以通常情况分两类 简单CASE表达式和搜索CASE表达式 简单CASE表达式 可以跟C语言中的if else语句进行对比 CASE 表达式WHEN 值1 THEN 结果1WHEN 值2 THEN 结果2...ELSE 结果n
END #结束语通过类比编程语言中的IF条件分支语句结构 当 ‘表达式’ 的值为 ‘值1’ 时输出结果 ‘结果1’当 ‘表达式’ 的值为 ]值2’输出结果 ‘结果2’ 以此类推。 当不满足以上所有条件时输出默认的 ‘结果n’ 搜索CASE表达式
CASE WHEN 表达式 值1 THEN 结果1WHEN 表达式 值2 THEN 结果2...ELSE 结果n
END #结束语搜索CASE表达式会从最初的WHEN子句中的 表达式 值1’进行求值 如果结果为真(TRUE)那么就返回THEN子句中的 ‘结果1’ CASE表达式的执行到此为止;如果结果不为真(FALSE) 那么就跳转到下一条WHEN子句的求值之中. 如果直到最后的WHEN子句为止,返回结果都不为真那么就会返回ELSE中的结果n执行终止 题目六 题目六 显式员工的employee_id,last_name和location。其中若员工department_id与location_id为1800 的department_id相同则location为’Canada’其余则为’USA SELECT employee_id, last_name,
( CASE department_idWHEN (SELECT department_id FROM departments WHERE location_id 1800)THEN Canada ELSE USA END) locationFROM employees多行子查询 1.也称为集合比较子查询 2.内查询返回多行 3.使用多行比较操作符 题目七 题目七返回其它job_id中比job_id为‘IT_PROG’部门任一工资低的员工的员工号、姓名、job_id 以及salary SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary ANY (
SELECT salary
FROM employees
WHERE job_id IT_PROG)AND job_id IT_PROG 题目八 题目八 返回其它job_id中比job_id为‘IT_PROG’部门所有工资都低的员工的员工号、姓名、job_id以及salary SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary ALL (
SELECT salary
FROM employees
WHERE job_id IT_PROG)
AND job_id IT_PROG在MySQL92语法中不等于用 !表示 在新标准中 可以使用 表示 题目九 题目九查询平均工资最低的部门id 思路 AVG(salary) ALL(AVG(salary)_) SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) ALL (
SELECT AVG(salary) avg
FROM employees
GROUP BY department_id)相关子查询 如果子查询的执行依赖于外部查询通常情况下都是因为子查询中的表用到了外部的表并进行了条件关联 因此每执行一次外部查询子查询都要重新计算一次这样的子查询就称之为 关联子查询 。 相关子查询按照一行接一行的顺序执行主查询的每一行都执行一次子查询。 题目十 题目十题目查询员工中工资大于本部门平均工资的员工的last_name,salary和其department_id 当然这里也可以在FROM中用子查询做 EXISTS 与 NOT EXISTS关键字 关联子查询通常也会和 EXISTS操作符一起来使用用来检查在子查询中是否存在满足条件的行。 如果在子查询中不存在满足条件的行 条件返回 FALSE 继续在子查询中查找 如果在子查询中存在满足条件的行 不在子查询中继续查找 条件返回 TRUE NOT EXISTS关键字表示如果不存在某种条件则返回TRUE否则返回FALSE 题目十一 题目十一查询departments表中不存在于employees表中的部门的department_id和department_name SELECT department_id, department_name
FROM departments d
WHERE NOT EXISTS (SELECT X
FROM employees
WHERE department_id d.department_id);相关更新
UPDATE table1 alias1
SET column (SELECT expression
FROM table2 alias2
WHERE alias1.column alias2.column);题目十二 题目十二在employees中增加一个department_name字段数据为员工对应的部门名称 UPDATE employees e
SET department_name (SELECT department_name
FROM departments d
WHERE e.department_id d.department_id);相关删除
DELETE FROM table1 alias1
WHERE column operator (SELECT expression
FROM table2 alias2
WHERE alias1.column alias2.column);题目十三 题目十三删除表mployees中其与emp_history表皆有的数据 DELETE FROM employees e
WHERE employee_id in
(SELECT employee_id
FROM emp_history
WHERE employee_id e.employee_id);子查询与自连接的部分使用情况分析 使用相关子查询依据一个表中的数据删除另一个表的数据 子查询实际上是通过未知表进行查询后的条件判断 而自连接是通过已知的自身数据表 进行条件判断因此在大部分 DBMS 中都对自连接处理进行了优化