我应该使用子查询还是组合的WHERE?

时间:2019-06-05 20:16:55

标签: mysql sql select subquery

这种特殊情况可能看起来有些愚蠢,但是我只想知道我应该如何解决:有一张桌子(学校),在这张桌子中,您可以找到所有带有其学校ID的学生。该顺序是完全随机的,但是可以使用SELECT语句对其进行排序。

CREATE TABLE schools (school_id int, name varchar(32), age ...);

现在,我想按他的名字(用LIKE'%name%')搜索学生,但前提是他在某所学校中。 我已经尝试过了:

SELECT * FROM `schools` WHERE `school_id` = 33 and `name` LIKE '%max%';

但是后来我意识到,我还可以使用诸如以下的子查询:

SELECT * FROM (SELECT * FROM `schools` WHERE `school_id` = 33) AS a
      WHERE a.name LIKE '%max%';

哪种方法效率更高/性能更高?

3 个答案:

答案 0 :(得分:2)

您可以使用EXPLAIN关键字来确切了解每个查询的执行方式。

我想说这两个将完全相同地执行几乎是肯定的。

答案 1 :(得分:1)

查询优化器可能会为两个查询选择相同的计划。如果您想肯定地知道,请在执行每个查询时查看执行计划。

答案 2 :(得分:1)

在MySQL中,没有子查询的查询可能更有效:

SELECT *
FROM `schools`
WHERE `school_id` = 33 and `name` LIKE '%max%';

MySQL具有实现子查询的这种讨厌的趋势-也就是说,实际运行子查询并将其保存为临时表(尽管情况有所改善)。大多数其他数据库不这样做。因此,在其他数据库中,两者应等效。

即使有其他比较,MySQL也足够聪明,可以为school_id使用索引(如果有)。如果没有可用的索引,它将进行全表扫描,这很可能会影响性能。