SQL JOIN 写法:把多表关联条件写清楚

多表查询时,笔者习惯把关联关系放在 JOIN ... ON ... 中,把筛选条件放在 WHERE 中。这样阅读 SQL 时,表与表如何关联、最终筛选什么数据会更直观。

01 | 基础查询字段

sql 复制代码
SELECT u.username,
 ai.ai_score,
 ai.ai_remark,
 TO_CHAR(ai.update_time, 'YYYY-MM-DD HH24:MI:SS') AS update_time

这里从用户表获取用户名,从 AI 内容表获取分数、备注和更新时间。TO_CHAR 将时间格式化为便于展示的字符串。

02 | 使用 JOIN 关联用户表

sql 复制代码
FROM t_ai_content ai
JOIN tk_users u
 ON u.user_id = ai.user_id

t_ai_content 使用别名 aitk_users 使用别名 u。两张表通过 user_id 关联,因此可以在结果中同时查询用户名和 AI 内容信息。

03 | 多字段关联历史表

sql 复制代码
JOIN t_history t
 ON t.user_id = ai.user_id
 AND t.type = ai.type
 AND t.week = ai.week
 AND t.day = ai.day
 AND t.learn_level = ai.learn_level

关联 t_history 时,不能只看用户 ID,还要同时匹配类型、周、天和学习等级。多个条件都写在 ON 后,明确表示这些字段共同决定两条记录是否对应。

04 | 用 WHERE 做时间筛选

sql 复制代码
WHERE update_time > sysdate - 1/24/4

该条件筛选最近一段时间更新的数据。完整 SQL 如下:

sql 复制代码
SELECT u.username,
 ai.ai_score,
 ai.ai_remark,
 TO_CHAR(ai.update_time, 'YYYY-MM-DD HH24:MI:SS') AS update_time
FROM t_ai_content ai
JOIN tk_users u
 ON u.user_id = ai.user_id
JOIN t_history t
 ON t.user_id = ai.user_id
 AND t.type = ai.type
 AND t.week = ai.week
 AND t.day = ai.day
 AND t.learn_level = ai.learn_level
where update_time > sysdate - 1/24/4

关注我,和AI一起成长~

相关推荐
姜太小白5 小时前
【Oracle】记排查sh脚本调用SQL执行卡顿的排查总结
数据库·sql·oracle
镜舟科技7 小时前
为什么 Text-to-SQL 总是停在 Demo?
数据库·sql·demo·text-to-sql·镜舟科技·mip·语义视图
大牧师8 小时前
TypeORM 学习教程
数据库·sql·学习·node.js·orm·nest.js·typeorm
数智启示录10 小时前
PostgreSQL 执行计划实战(第 9 篇):SQL 和索引没变,计划为什么突然慢一百倍
数据库·经验分享·sql·postgresql·面试
润乾软件11 小时前
SQLazy:从事件表中查出下一组的开始时刻
sql·sqlazy
养生技术人12 小时前
Oracle OCP认证考试题目详解082系列第17题
运维·数据库·sql·oracle·ocp
隔窗听雨眠13 小时前
活动中台系统慢SQL治理实践:从监控告警到性能优化的全链路方法论
sql·性能优化·github
数智启示录1 天前
PostgreSQL 计划缓存实战(第 10 篇):预编译 SQL 前五次都快,第六次为什么可能变慢
经验分享·sql·缓存·postgresql·面试
ClouGence1 天前
CloudDM 支持达梦、KingbaseES、GoldenDB,国产数据库也能统一管起来
数据库·sql·开源
CarIise1 天前
JDBC数据库操作与SQL注入防范
数据库·sql