Mysql 子查询怎么写?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql 子查询怎么写?相关的知识,希望对你有一定的参考价值。

查询“生物”课程比“物理”课程成绩高的所有学生的学号。
-- ps:针对的是自己的生物成绩比物理成绩高,再把符合条件的学生的学号查出来??该怎么写?

参考技术A 子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从 mysql 4.1 开始引入,在 SELECT 子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一个表或者多个表。
子查询中常用的操作符有 ANY(SOME)、ALL、IN 和 EXISTS。
子查询可以添加到 SELECT、UPDATE 和 DELETE 语句中,而且可以进行多层嵌套。子查询也可以使用比较运算符,如“<”、“<=”、“>”、“>=”、“!=”等。

子查询vs加入mysql [重复]

【中文标题】子查询vs加入mysql [重复]【英文标题】:Subqueries vs join in mysql [duplicate] 【发布时间】:2015-12-21 14:15:09 【问题描述】:

为什么要使用连接,因为您可以从不同的表中获取数据,例如使用下面的子查询?

【问题讨论】:

在大多数情况下,JOIN 比子查询要快,而且很少有子查询更快。 请不要将图像用于文本数据。 ***.com/questions/2577174/join-vs-sub-query?rq=1 今天写了这篇文章,展示了 explain 结果、类似的派生表 HERE 【参考方案1】:

如果您将使用 EXPLAIN,那么您将看到它在使用子查询和使用 JOINS 时的区别。在大多数情况下,JOINS 相对较快。

这是JOINs vs Subqueries上的一篇好文章

在 JOIN 中,RDBMS 可以创建一个更适合您的执行计划 查询并可以预测应该加载哪些数据以进行处理和 节省时间,不像子查询,它将运行所有查询和 加载所有数据以进行处理。

查看文章中进行的测试:

我添加了 100,000 个商家和 150,000 条消息(随机类型 随机业务)。

方法一:JOIN 很长时间以来,我一直认为 JOIN 比子查询快,所以我首先尝试了这种方法。 (注:我必须 设置 SET SQL_BIG_SELECTS=1;只是为了让查询运行……不好 签名!)。

SELECT SQL_NO_CACHE b.id, b.name
FROM `businesses` b
LEFT JOIN `business_messages` bm ON
    b.id = bm.business_id
    AND bm.type = 'action'
WHERE
    bm.type IS NULL
LIMIT 10;

方法二:子查询 in WHERE 这个方法是我表弟发给我的。更容易阅读和理解查询是什么 尝试做:

SELECT SQL_NO_CACHE id, name 
FROM businesses b 
WHERE NOT EXISTS (
    SELECT 1 
    FROM business_messages 
    WHERE business_id = b.id 
        AND type = 'action'
) 
LIMIT 10;

方法3:JOIN中的子查询这是我看到子查询实际操作后的想法:

SELECT SQL_NO_CACHE id, name 
FROM businesses b 
LEFT JOIN (
    SELECT business_id, type 
    FROM business_messages 
    WHERE type = 'action' 
    GROUP BY business_id
) bm 
    ON bm.business_id = b.id 
WHERE bm.type IS NULL 
LIMIT 10;

结果

  Method 1    Method 2    Method 3
1 5.51s   3.91s   0.41s
2 6.60s   4.74s   0.36
3 7.68s   2.40s   0.64s
4 4.23s   2.63s   0.36s
5 6.71s   2.06s   0.30s
6 5.23s   2.01s   0.53s
7 4.03s   2.80s   0.43s
8 4.56s   2.44s   0.55s
9 7.13s   1.95s   0.80s
10    7.04s   1.38s   0.43s
Average   5.872s  2.632s  0.481s

【讨论】:

所以我应该避免子查询?我是 mysql 新手,我的老师在加入之前教过子查询,所以我现在有点困惑。 @AliceXu:- 我不会对avoid 说它,但是是的,只要您发现可以使用 JOINS 编写相同的查询,您就可以更喜欢使用 JOINS。 文章直接与你的结论相矛盾。 请注意,在选项 3 中,GROUP BY 在加入之前限制子查询的结果。它将子查询的行数减少到每个业务 1 行,而不是每个消息 1 行。【参考方案2】:

如果您要使用执行计划,您会看到不同之处。在优化方面,最好使用JOIN,而不是使用子查询,因为子查询可能会花费太多的执行时间,尤其是在处理大量数据时。

【讨论】:

以上是关于Mysql 子查询怎么写?的主要内容,如果未能解决你的问题,请参考以下文章

sql小于系统时间怎么写

mysql 根据子表数量查询主表

mysql啥时候使用子查询,啥时候使用表连接查询,关系多张表的时候该怎么查询

mysql中主查询和子查询关系是啥?

mysql 多表联合查询语句怎么写

MYSQL数据库基础--MySQL子查询怎么操作?