Mysql多表查询 思路 ——示例——sql顺序
2023-12-13 17:38:55
参考练习题:https://blog.csdn.net/weixin_49627122/article/details/126380916
SQL顺序?
在 SQL 查询中,SELECT
语句的执行顺序不是按照查询语句的书写顺序执行的,而是按照逻辑执行阶段来进行。一般来说,SQL 查询的执行顺序可以分为以下几个步骤:
-
FROM: 指定要查询的表,执行这一步时会生成一个虚拟的结果集,包含了所有所需的列和行。
-
JOIN: 如果查询涉及到多个表,会执行连接操作(JOIN)来合并不同表中的数据。
-
WHERE: 对每一行应用
WHERE
子句中的条件,筛选出满足条件的行。 -
GROUP BY: 根据
GROUP BY
子句中的列进行分组。 -
HAVING: 对每个分组应用
HAVING
子句中的条件,筛选出满足条件的分组。 -
SELECT: 选择要在结果集中显示的列,应用聚合函数(如果有的话)。
-
ORDER BY: 对结果集进行排序。
-
LIMIT/OFFSET: 如果使用了
LIMIT
或OFFSET
,最后会应用这些限制。
虽然这是一个一般性的执行顺序,但实际的数据库系统可能会根据查询的具体情况进行一些优化,以提高性能。在复杂的查询中,数据库系统可能会重新安排执行计划,例如使用索引来加速搜索,以获得更高的执行效率。
需要注意的是,虽然 SQL 查询的逻辑执行顺序如上所述,但在实际执行中,数据库引擎可能会根据优化器的决策进行重新排列操作,以提高性能。
思路
多表最重要的还是要理清楚逻辑,根据slq运行顺序,将需求一步步的分为多个sql,根据规则拼凑而成。
字段可以作为,表查询结果的字段,? 表也可以作为,查询结果的表
代码示例
查询结果为字段情况
# 查询结果为字段情况
SELECT st.id,
st.name,
(
SELECT sc.s_id
FROM scores sc
INNER JOIN course co ON sc.c_id = co.id
WHERE co.id = 1
AND sc.score > 60
AND st.id = sc.s_id
LIMIT 1 -- 限制只返回一个值
) AS scco
FROM student st
WHERE (
SELECT sc.s_id
FROM scores sc
INNER JOIN course co ON sc.c_id = co.id
WHERE co.id = 1
AND sc.score > 60
AND st.id = sc.s_id
LIMIT 1 -- 限制只返回一个值
) IS NOT NULL;
查询结果为表的情况
# 查询结果为表的情况
select st.id, st.name, scco.score
from student st
inner join (select sc.score, sc.s_id
from scores sc
inner join course co on sc.c_id = co.id
where co.id = 1
and sc.score > 60) as scco on scco.s_id = st.id;
查询结果为子查询情况
#查询结果为 子查询条件的情况
select st.id, st.name
from student st
where st.id in (select sc.s_id
from scores sc
left join course co on sc.c_id = co.id
where co.id = 1
and sc.score > 60);
文章来源:https://blog.csdn.net/weixin_67573348/article/details/134839651
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!