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 使用别名 ai,tk_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一起成长~

相关推荐
骑着蜗牛撵大象3271 天前
MySQL 8.0 迁移后 SQL 变慢:执行计划里 3 类被忽略的成本差异
android·数据库·sql·mysql·优化器·执行计划
zhengfei6111 天前
Go-fastdfs /reload 未授权访问: 有效PoC
数据库·sql
大维1 天前
DBX 实测:从 SQLite 查询到 MiniMax-M3 自然语言生成 SQL
数据库·sql·sqlite
景煜拾年1 天前
InnoAI SQL 助手
运维·数据库·笔记·sql
Decay__2 天前
22_MySQL 运维自动化平台 —— 部署编排 + 监控 + 巡检 + 告警 + 工单闭环一体化
运维·数据库·sql·mysql·架构
Decay__2 天前
21_MySQL 优化案例集 —— 慢 SQL 优化、索引重构与参数调整收益对比
运维·数据库·sql·mysql·架构
挖掘狂人2 天前
MySQL 深分页优化:limit 100000, 10 慢在哪,怎么救
后端·sql·mysql
codigger2 天前
MySQL 深分页优化:limit 100000, 10 慢在哪,怎么救
数据库·sql·mysql·程序员
Francek Chen2 天前
【大数据处理与分析】数据仓库Hive:09 Hive 编程实践
大数据·数据仓库·hive·hadoop·sql
麦壳饼2 天前
SonnetDB 5.0 正式发布:增强 SQL 与事务,开放九模型 MCP 读写
数据库·人工智能·sql·sonnetdb