MySQL数据库子查询语法规则是什么

网友投稿 513 2023-07-07

MySQL数据库子查询语法规则是什么

MySQL数据库子查询语法规则是什么

由于我们在提取数据时面临许多具有依赖关系的未知数据,因此需要在查询语句中嵌套一个子查询。我们需要先检索一组数据并将其结果用作下一个查询的对象。在 “表连接的章节”,我们曾说过子查询的效率低下的问题,其实并不是所有的子查询效率都是低下的,“WHERE” 子查询在匹配记录的时候要反复执行,这是不推荐使用的;但是如果将查询结果集当做一张表来使用,与其他的表做一个连接,这就是 “FROM” 子句的子查询了,这种子查询的方式,还是比较推荐使用的。

子查询简介

子查询是一种查询语句中再嵌套一个查询的语句

普通查询语句分为 “SELECT” 子查询、“FROM” 子查询、“WHERE"子查询;(重点推荐使用 " ‘FROM’ 子查询”)

子查询示例如下:

查询底薪超过公司平均底薪的员工信息。这个案例我们之前是通过表连接的方式实现的,现在我们来看一下如何利用子查询实现。)

SELECT empno, ename, salFROM t_empWHERE sal >= (SELECT AVG(sal) FROM t_emp); -- 正常情况下,将聚合函数作为 WHERE 子句的条件是不可以的,但是这里利用子查询与聚合函数先将平均底薪查询出来,这就变成具体的数据了-- 这种情况下,作为 WHERE 子句的条件,就可以被使用了登录后复制

WHERE 子查询

在书写 SQL 语句的时候, WHERE 子查询最符合我们人的思考逻辑

虽然这种 子查询 最简单、最容易理解,但是却是效率很低的子查询

以刚刚演示的 查询底薪超过公司平均底薪的员工信息 来说吧。“WHERE” 子句拿每一条员工的记录与 “SELECT” 子查询做比较的时候,子查询都需要重新执行一次。如果员工表有 10000 条记录,那么 子查询 就需要执行 10000次,反复执行这么多次,效率上是极其低下的。

在查询语句中,反复被查询的子查询被称为 “相关子查询”,这里的 “WHERE” 子查询就属于 “相关子查询” 应该避免使用这种子查询。

FROM 子查询

在查询语句中, “FROM” 子查询只会执行一次,这与 “WHERE” 子查询是相反的,所以查询效率很高。

同样以 查询底薪超过公司平均底薪的员工信息 为例,来看一看 “FROM” 子查询是如何实现的。

SELECT e.empno, e.ename, e.sal, t.avgFROM t_emp e JOIN (SELECT deptno, AVG(sal) AS avg FROM t_emp GROUP BY deptno) tON e.deptno = t.deptno AND e.sal >= t.avg;-- 首先,按照每一个部门编号去分组,然后统计部门标号与该部门对应的平均月薪。将这个结果集作为一张临时的表与员工的表做连接。-- 连接的条件为 "员工表" 的 "部门编号" = "结果集" 的 "部门编号",并且员工的月薪大于部门的平均月薪登录后复制

所以这个题目利用 "FROM" 子查询也可以轻松的实现,未必要使用 "WHERE" 子查询。因为 "FROM" 子查询并不是 相关子查询,所以再解决一些问题的时候应该有限选择这种子查询类型。

SELECT 子查询

说一句实在的,这种子查询在我目前经历的所有项目中,一次也没见到过。

究其原因呢,是因为 “SELECT” 子查询也是相关子查询,它在SQL语句中也会反复的执行,查询效率很低。

这里我们就举个例子:比如说现在要查询每个员工的部门信息,

SELECT e.empno, e.ename, (SELECT dname FROM t_dept WHERE deptno = e.deptno) AS 部门名称FROM t_emp e;-- 先试用 "SELECT" 子查询查询出 "部门表" 中的部门名称,约束条件为 "部门表"中的 "部门编号" 与 "员工表"中的 "部门编号" 一致-- 将 "SELECT" 子查询得到的 "部门名称" 作为SQL语句中的一个字段进行输出登录后复制

虽然执行出来的结果是对的,但是执行的效率实在是太低了,所以这种 "SELECT" 子查询的方式也是不推荐使用的,了解即可,当我们看到有其他人使用 "SELECT" 子查询的时候,最好善意的提醒一下。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:MySQL数据库完全备份与增量备份怎么实现
下一篇:mysql日期函数TO_DAYS()函数怎么使用
相关文章