MYSQL关联关系查询方式

 更新时间:2025年02月06日 10:11:01   作者:jay丿  
文章详细介绍了MySQL中如何使用内连接和左外连接进行表的关联查询,并展示了如何选择列和使用别名,文章还提供了一些关于查询优化的建议,并鼓励读者参考和支持脚本之家

MYSQL关联关系查询

关联关系查询

首先,让我们回顾一下你的原始查询:

SELECT u.*, d.id AS aid, d.name, d.pro, d.city, d.country, d.detail, d.tel AS atel, r.name AS roleName
FROM tb_user u
INNER JOIN tb_address d ON u.id = d.user_id
LEFT JOIN tb_role_user ur ON ur.user_id = u.id
LEFT JOIN tb_role r ON r.id = ur.role_id;

这个查询做了以下几件事

  1. 从 tb_user 表中选择所有列(u.*)。
  2. 使用内连接(INNER JOIN)将 tb_user 表与 tb_address 表关联起来,条件是 tb_user 表的 id 列等于 tb_address 表的 user_id 列。
  3. 从 tb_address 表中选择特定的列,并为某些列指定别名(如 d.id AS aid)。
  4. 使用左外连接(LEFT JOIN)将结果集与 tb_role_user 表关联起来,条件是 tb_role_user 表的 user_id 列等于 tb_user 表的 id 列。
  5. 再使用左外连接将上一步的结果集与 tb_role 表关联起来,条件是 tb_role 表的 id 列等于 tb_role_user 表的 role_id 列。
  6. 从 tb_role 表中选择 name 列,并为其指定别名 roleName。

现在,我将对这个查询进行扩写,包括一些额外的解释和可能的优化:

-- 选择用户及其关联的地址、角色信息
SELECT 
    -- 用户表的所有列
    u.id AS userId, u.username, u.email, u.password, u.created_at, u.updated_at,
    -- 地址表的特定列及别名
    d.id AS addressId, d.name AS addressName, d.province AS pro, d.city, d.country, d.detail AS addressDetail, d.tel AS addressTel,
    -- 角色名的别名
    r.name AS roleName
FROM 
    tb_user u
    -- 内连接:只选择有地址的用户
    INNER JOIN tb_address d ON u.id = d.user_id
    -- 左外连接:选择所有用户及其可能的角色关联
    LEFT JOIN tb_role_user ur ON u.id = ur.user_id
    -- 再左外连接:选择所有角色关联及其角色名
    LEFT JOIN tb_role r ON ur.role_id = r.id;

MySQL自关联查询

定义表areas,结构如下

  • id
  • atitle
  • pid

因为省没有所属的省份,所以可以填写为null

城市所属的省份pid,填写省所对应的编号id

这就是自关联,表中的某一列,关联了这个表中的另外一列,但是它们的业务逻辑含义是不一样的,城市信息的pid引用的是省信息的id

在这个表中,结构不变,可以添加区县、乡镇街道、村社区等信息

  • 创建areas表的语句如下:
create table areas(
id int primary key,
atitle varchar(20),
pid int,
foreign key(pid) references areas(id)
);

查询一共有多少个省

  • 查询省的名称为“山西省”的所有城市
select city.* from areas as city
inner join areas as province on city.pid=province.id
where province.atitle='山西省';
  • 查询市的名称为“广州市”的所有区县
select dis.*,dis2.* from areas as dis
inner join areas as city on city.id=dis.pid
left join areas as dis2 on dis.id=dis2.pid
where city.atitle='广州市';

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MySQL 5.7.18 免安装版配置教程

    MySQL 5.7.18 免安装版配置教程

    这篇文章主要为大家详细介绍了MySQL 5.7.18 免安装版配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • MySQL查询in操作 查询结果按in集合顺序显示

    MySQL查询in操作 查询结果按in集合顺序显示

    MySQL 查询in操作,查询结果按in集合顺序显示的实现代码,需要的朋友可以参考下。
    2010-12-12
  • 2026年新手版MySQL数据库备份与恢复的完整指南

    2026年新手版MySQL数据库备份与恢复的完整指南

    日常操作中,新手很容易误删数据库、误删表,或者服务器故障导致数据丢失,一旦丢失很难恢复,而MySQL备份操作简单,花5分钟做好备份,后续无论出现什么问题,都能快速恢复数据,避免损失,下面小编就和大家详细介绍下新手首先的mysqldump 备份方法吧
    2026-04-04
  • Mac MySQL重置Root密码的教程

    Mac MySQL重置Root密码的教程

    安装MySQL后时间太长了会忘记密码,在这里总结一下忘记密码时如何重置本地MySQL Root密码。感兴趣的朋友跟随脚本之家一起学习吧
    2018-03-03
  • centos7环境下创建mysql5.6多实例的方法详解

    centos7环境下创建mysql5.6多实例的方法详解

    这篇文章主要介绍了centos7环境下创建mysql5.6多实例的方法,详细分析了centos7创建mysql5.6多实例的具体步骤、实现方法与操作注意事项,需要的朋友可以参考下
    2020-02-02
  • mysql添加索引方法详解(Navicat可视化加索引与sql语句加索引)

    mysql添加索引方法详解(Navicat可视化加索引与sql语句加索引)

    索引用来快速地寻找那些具有特定值的记录,如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录,表里面的记录数量越多,代价就越高,下面这篇文章主要给大家介绍了关于mysql添加索引的相关资料,需要的朋友可以参考下
    2022-11-11
  • 大数据小内存排序问题如何巧妙解决

    大数据小内存排序问题如何巧妙解决

    文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限
    2025-01-01
  • 在sql中对两列数据进行运算作为新的列操作

    在sql中对两列数据进行运算作为新的列操作

    这篇文章主要介绍了在sql中对两列数据进行运算作为新的列操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • 清空mysql 查询缓存的可行方法

    清空mysql 查询缓存的可行方法

    mysql对同一条sql进行了缓存,在第二次运行时, 瞬间就完成了,若要清除缓存,可通过下面的方法来实现
    2014-07-07
  • MySQL5.5.27安装图文教程

    MySQL5.5.27安装图文教程

    本文通过图文并茂的形式给大家介绍了mysql 5.5.27的安装教程,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-09-09

最新评论