我正在mysql中尝试使用子查询,并遇到了下面的语句,我们可以在不同的地方使用子查询。
select Salary from Employee where (select max(Salary) from Employee) < 400;
select Salary from Employee where Salary < (select max(Salary) from Employee);
select Salary from (select * from Employee) as seq1 where Salary < 400;
现在我很困惑我们可以使用子查询的地方在哪里,因为使用它有多种可能性
当我检查WHERE子句的文档时,它只提到了将条件作为输入,但没有提到我们可以使用子查询来使语法正确的在哪里
您可以在允许使用表的任何地方使用子查询,并且您只是在读取表,例如FROM
或JOIN
子句。这被称为派生表。这是你的第三个例子。由于它必须仅用于读取,因此不能将其用作UPDATE
或DELETE
的目标(但可以在UPDATE
或DELETE
查询中加入子查询(。
您可以在任何允许表达式的地方使用子查询。子查询必须选择一个值,并且最多必须返回一行(如果现在返回行,则计算结果为NULL
(。一个限制是,不能在针对同一表的UPDATE
或DELETE
查询的WHERE
子句中使用子查询;在这种情况下,您必须使用子查询联接(请参阅您不能在FROM子句中指定更新的目标表(。
这意味着子查询可以在SELECT
列表、WHERE
子句和HAVING
子句中使用。即使在ON
子句中,尽管我很少看到这样的例子。
您可以使用子查询来代替IN
表达式中的值列表,例如
SELECT Salary
FROM Employee
WHERE id in (SELECT Emp_id FROM Employee_Department WHERE Dept_id = 100)
然而,根据我的经验,MySQL经常对这些进行糟糕的优化,它们最好写成联接:
SELECT e.Salary
FROM Employee AS e
JOIN Employee_Department AS d ON e.id = d.emp_id
WHERE d.dept_id = 100;
SELECT
查询也可以用作INSERT
查询中的数据源:
INSERT INTO low_salary_employees
SELECT employee_id
FROM Employee
WHERE Salary < (SELECT MAX(Salary)/10 FROM Employee)
前两个示例查询使用标量子查询,即返回单行和列的子查询。您可以在任何需要标量值的地方使用这样的查询,因此这打开了广泛的用例,如select
子句、where
谓词等
第三个例子不同:在这里,子查询返回一组记录(可能是多行多列(。这被称为派生的表。您可以使用与使用常规表几乎相同的方式,因此主要在查询的from
子句中使用。