Mysql 子查询怎么写?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql 子查询怎么写?相关的知识,希望对你有一定的参考价值。
查询“生物”课程比“物理”课程成绩高的所有学生的学号。
-- ps:针对的是自己的生物成绩比物理成绩高,再把符合条件的学生的学号查出来??该怎么写?
子查询中常用的操作符有 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 子查询怎么写?的主要内容,如果未能解决你的问题,请参考以下文章