sql对多个表相同列名进行查询并使用别名
SELECT user_address.mobile AS "订单表中的电话号码", users.mobile AS "用户收货信息表的电话号码",user_address.address FROM user_address, users WHERE user_address.user_id = users.user_id;
SQL 多表查询 + 别名详解
一、代码整体功能
这条 SQL 语句的作用是:从 user_address(用户地址表)和 users(用户表)中查询数据,当两个表的 user_id 相等时,显示手机号码和地址信息。
二、逐部分讲解
sql
SELECT user_address.mobile AS "订单表中的电话号码", users.mobile AS "用户收货信息表的电话号码", user_address.addressFROM user_address, usersWHERE user_address.user_id = users.user_id;
三、为什么需要表名前缀?
问题场景
两个表都有 mobile 列,如果不加表名前缀,数据库不知道要取哪个:
sql
-- ❌ 错误写法:mobile 指哪个表?SELECT mobile FROM user_address, users-- ✅ 正确写法:明确指定来源SELECT user_address.mobile, users.mobile FROM user_address, users
表名.列名 的语法
sql
表名.列名
部分 | 含义 | 示例 |
表名 | 数据表的名称 | user_address |
. | 点号,表示"的" | user_address.mobile = "user_address 表的 mobile 列" |
列名 | 字段名称 | mobile |
四、AS 别名详解
1、AS 是什么?
| 单词 | 词源 | 含义 |
|---|---|---|
| AS | 古英语 eallswa(完全如此) | 作为、当作 |
在 SQL 中,AS 用于给查询结果中的列起一个临时名称。
2、为什么需要别名?
不加别名时,查询结果会显示原始列名:
sql
SELECT user_address.mobile, users.mobileFROM user_address, usersWHERE user_address.user_id = users.user_id;
查询结果:
text
mobile | mobile --------------|-------------- 13812345678 | 13812345678
问题:两个列都叫 mobile,无法区分哪个是哪个!
3、使用别名后
sql
SELECT user_address.mobile AS "订单表中的电话号码", users.mobile AS "用户收货信息表的电话号码"FROM user_address, usersWHERE user_address.user_id = users.user_id;
查询结果:
text
订单表中的电话号码 | 用户收货信息表的电话号码 ------------------|------------------------ 13812345678 | 13812345678
五、两个表的关系
表结构示意
user_address 表(用户地址表)
| user_id | mobile | address |
|---|---|---|
| 1 | 13812345678 | 北京市朝阳区... |
| 2 | 13912345678 | 上海市浦东区... |
users 表(用户表)
| user_id | username | mobile |
|---|---|---|
| 1 | 张三 | 13812345678 |
| 2 | 李四 | 13912345678 |
连接条件
sql
WHERE user_address.user_id = users.user_id
意思是:只查询两个表中
user_id相等的记录这叫做等值连接(Equi Join)
六、可视化执行过程

七、AS 的词源与使用
| 单词 | 词源 | 含义 |
|---|---|---|
| AS | 古英语 eallswa | 如同、作为 |
SQL 中的使用方式
| 写法 | 说明 | 示例 |
|---|---|---|
列名 AS "别名" | 标准写法,别名可带空格 | mobile AS "电话号码" |
列名 AS 别名 | 别名无空格时可省略引号 | mobile AS phone |
列名 别名 | 可省略 AS 关键字 | mobile phone |
表名 AS 别名 | 给表起别名 | user_address AS ua |
省略 AS 的写法
sql
-- 以下三种写法等价SELECT user_address.mobile AS "电话号码" FROM user_address;SELECT user_address.mobile AS 电话号码 FROM user_address;SELECT user_address.mobile 电话号码 FROM user_address;
八、完整示例(带表别名)
sql
SELECT ua.mobile AS "订单表中的电话号码", u.mobile AS "用户收货信息表的电话号码", ua.addressFROM user_address AS ua, users AS uWHERE ua.user_id = u.user_id;
优点:使用表别名 ua 和 u,代码更简洁。
九、总结
| 概念 | 说明 | 示例 |
|---|---|---|
| 表名前缀 | 区分不同表的同名列 | user_address.mobile |
| AS 别名 | 给查询结果列起临时名称 | AS "订单表中的电话号码" |
| 连接条件 | 关联两个表的条件 | WHERE user_address.user_id = users.user_id |
| 问题场景 | 两个表都有 mobile 列,不加别名会混淆 | - |
| 解决方式 | 用 表名.列名 区分来源,用 AS 重命名输出 | - |
一句话总结:当多个表有相同列名时,需要用 表名.列名 告诉数据库从哪个表取数据;同时用 AS 给查询结果中的列起别名,避免输出结果中出现同名的列,让数据更清晰可读