This article brings you relevant knowledge about mysql, which mainly introduces the issues related to the syntax rules of database subquery. A subquery is a query nested in the query statement. This It's because when we extract data, there are many unknown data that have dependencies; let's take a look at them together, I hope it will be helpful to everyone.
Recommended learning: mysql video tutorial
A subquery is a query nested inside the query statement. This is because we When extracting data, there are many unknown data that have dependencies. At this time, we need to first query the result set of a set of data, and then use this result set as the object of the next query. In the "Table Connection Chapter", we once talked about the low efficiency of subqueries. In fact, not all subqueries are inefficient. The "WHERE" subquery needs to be executed repeatedly when matching records. This is not true. It is recommended; but if you use the query result set as a table and make a connection with other tables, this is a subquery of the "FROM" clause. This subquery method is still recommended.
In detail, subqueries are divided into "single-row subquery", "multi-row subquery", "WHERE" subquery, "FROM" subquery and "SELECT" subquery; these are all in this chapter What we need to learn.
A subquery is a query nested within a query statement
Ordinary query statements are divided into "SELECT" subquery and "FROM" Subquery, "WHERE" subquery; (It is strongly recommended to use "'FROM' subquery")
Examples of subqueries are as follows:
Query the information of employees whose base salary exceeds the company's average base salary. (We have used table joins to make this case before. Here we look at how to implement it through subqueries.)
SELECT empno, ename, sal FROM t_emp WHERE sal >= (SELECT AVG(sal) FROM t_emp); -- 正常情况下,将聚合函数作为 WHERE 子句的条件是不可以的,但是这里利用子查询与聚合函数先将平均底薪查询出来,这就变成具体的数据了 -- 这种情况下,作为 WHERE 子句的条件,就可以被使用了
The above is the WHERE clause. Subquery, but the subquery of the WHERE clause is not recommended. Table joins should be used.
When writing SQL statements, WHERE subquery is most in line with our thinking logic
Although this kind of subquery is the simplest , the easiest to understand, but it is a very inefficient subquery
Let's take the query just demonstrated to query the information of employees whose base salary exceeds the company's average base salary. When the "WHERE" clause compares each employee record with the "SELECT" subquery, the subquery needs to be re-executed. If the employee table has 10,000 records, then the subquery needs to be executed 10,000 times. Repeated execution so many times is extremely inefficient.
In the query statement, the subquery that is queried repeatedly is called a "correlated subquery". The "WHERE" subquery here belongs to the "correlated subquery". It should Avoid using this kind of subquery.
In the query statement, the "FROM" subquery will only be executed once, which is the opposite of the "WHERE" subquery, so the query efficiency Very high.
Similarly take the query of employee information whose base salary exceeds the company's average base salary as an example to see how the "FROM" subquery is implemented.
SELECT e.empno, e.ename, e.sal, t.avg FROM t_emp e JOIN (SELECT deptno, AVG(sal) AS avg FROM t_emp GROUP BY deptno) t ON e.deptno = t.deptno AND e.sal >= t.avg; -- 首先,按照每一个部门编号去分组,然后统计部门标号与该部门对应的平均月薪。将这个结果集作为一张临时的表与员工的表做连接。 -- 连接的条件为 "员工表" 的 "部门编号" = "结果集" 的 "部门编号",并且员工的月薪大于部门的平均月薪
So this question can be easily implemented using the "FROM" subquery, and it is not necessary to use the "WHERE" subquery. Because the "FROM" subquery is not a correlated subquery, this subquery type should be limited when solving some problems.
To be honest, I have never seen this kind of subquery in all the projects I have experienced so far.
The reason is that the "SELECT" subquery is also a correlated subquery. It will be executed repeatedly in the SQL statement, and the query efficiency is very low.
Here we will give an example: For example, if we want to query the department information of each employee,
SELECT e.empno, e.ename, (SELECT dname FROM t_dept WHERE deptno = e.deptno) AS 部门名称 FROM t_emp e; -- 先试用 "SELECT" 子查询查询出 "部门表" 中的部门名称,约束条件为 "部门表"中的 "部门编号" 与 "员工表"中的 "部门编号" 一致 -- 将 "SELECT" 子查询得到的 "部门名称" 作为SQL语句中的一个字段进行输出
Although the execution result is correct, However, the execution efficiency is too low, so this "SELECT" subquery method is not recommended. Just understand it. When we see other people using the "SELECT" subquery, it is best to be kind. remind.
Recommended learning: mysql video tutorial
The above is the detailed content of Summary of MySQL database subquery syntax rules. For more information, please follow other related articles on the PHP Chinese website!