网络宝典
第二套高阶模板 · 更大气的阅读体验

数据库联合查询怎么写?一张订单连带用户信息一次查出来

发布时间:2026-01-25 05:30:26 阅读:136 次

做网站、写后台,经常遇到这种需求:要查某张订单,顺带把下单用户的昵称、手机号也一起显示出来。如果只用单表查询,得先查订单表,再根据 user_id 去用户表里再查一遍——来回跑两次数据,慢还容易出错。

联合查询就是干这个的

联合查询(JOIN)本质就是把两个或多个表“按条件拼起来”,一次查出关联数据。最常用的是 INNER JOIN,只保留两边都匹配上的记录。

比如有两张表:

  • orders 表:id, user_id, product_name, amount
  • users 表:id, nickname, phone

想查出“订单名+用户昵称+手机号”,SQL 就长这样:

SELECT o.id, o.product_name, u.nickname, u.phone
FROM orders AS o
INNER JOIN users AS u ON o.user_id = u.id;

这里 AS oAS u 是给表起别名,写起来不啰嗦;ON o.user_id = u.id 就是“拿订单里的 user_id,去用户表里找 id 相等的那条”。

LEFT JOIN 更实用

有时候订单里存了个 user_id,但对应用户被删了,用 INNER JOIN 就查不到这条订单。这时换成 LEFT JOIN:

SELECT o.id, o.product_name, u.nickname, u.phone
FROM orders AS o
LEFT JOIN users AS u ON o.user_id = u.id;

结果里订单全在,没找到用户的字段显示为 NULL,不会丢数据。

新手常卡在 ON 和 WHERE 的区别上:ON 是“决定怎么连表”,WHERE 是“连完后再过滤”。比如加个条件“只查已完成订单”,得写在 WHERE 后面:

SELECT o.id, o.product_name, u.nickname
FROM orders AS o
LEFT JOIN users AS u ON o.user_id = u.id
WHERE o.status = 'finished';

要是写成 ON ... AND o.status = 'finished',LEFT JOIN 就可能漏掉未完成的订单——逻辑就歪了。

三张表也能一起连

订单还关联商品表 products(id, name, price)?没问题,继续 JOIN:

SELECT o.id, u.nickname, p.name AS product_name, o.amount
FROM orders AS o
LEFT JOIN users AS u ON o.user_id = u.id
LEFT JOIN products AS p ON o.product_id = p.id;

每多一个表,就加一行 JOIN + ON,顺序无所谓,但建议从主表(如 orders)开始,一层层往外连。

实际开发中,别盲目堆 JOIN。连 5 张表以上,又没加索引,页面可能卡三秒。先看执行计划(EXPLAIN),再优化——不过那是进阶的事了,入门先把两表连对就行。