我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL 自连接讲解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL 自连接讲解

目录

什么是自连接?

自连接语法

案例

案例演示1

案例演示2

扩展需求


什么是自连接?

        自连接可以理解为自己连接自己,在一张表上面所进行的操作;将一张表分成两张结构和数据完全一样的表(简单理解:相当于克隆了一张跟自己长得一模一样的表);

 但是问题来了,既然是两张一模一样的表,数据库怎么区分出那张表是哪张表呢?这时候最重要的一个知识点就来了,那就是给两张表分别取个别名。

自连接语法

自连接我所知道有以下几种语法,有遗漏的话也欢迎大家在评论区给我补充出来。

🐱1、内连接

1.1隐式内连接

select 字段列表 from 表 [as] 表别名1,表  [as]  表别名2 where 条件...;

1.2.显式内连接

select 字段列表 from 表  [as]  表别名1 [inner] join 表  [as]  表别名2 on 条件...;

🐷2、外连接

2.1.左外连接

select 字段列表 from 表  [as]  表别名1 left [outer] join 表  [as]  表别名2 on 条件...;

2.2.右外连接

select 字段列表 from 表  [as]  表别名1 right [outer] join 表  [as]  表别名2 on 条件...;

注:

1.语法和内外连接的语法一样,只不过换成了只在一张表上面操作。

2.[ ] 里面的单词 as 代表取别名,可写可不写;不写也可以取别名,用哪种都可以啦~☂♔

案例

可以自己插入表和数据跟着做一下。

案例演示1

商品表(tb_goods):

create table tb_goods(    id int primary key auto_increment comment '主键ID',    goods varchar(50) not null comment '商品',    price decimal(7,2) default 0.00 comment '商品价格') comment '商品表';

给商品表插入数据:

insert into tb_goods(goods,price) values('儿童牙刷',20),            ('电动牙刷',10000),            ('拼多多牙刷',9.9);insert into tb_goods(goods) values('妈妈给买的牙刷');

数据展示: 

需求:

查询比 “拼多多牙刷” 的价格贵的牙刷有哪些?

思路解析(用的是隐式内连接),语法:

select 字段列表 from 表 [as] 表别名1,表  [as]  表别名2 where 条件...;

第一步:把 tb_goods(商品表)分成两张一模一样的表,分别取 g1 和 g2 两个别名,把它们连接起来;

select * from tb_goods as g1,tb_goods as g2;

查询结果如下:它会列出每条数据的组合情况,如下,每一种牙刷都能组成四种组合。

第二步:找出 g1 表里面的 “拼多多牙刷”;
select * from tb_goods as g1,tb_goods as g2 where g1.goods = '拼多多牙刷';

查询结果如下:

根据上面的语句查询出来的结果可以看到, g2 表里面的 g2.price 也已经把每个牙刷的价格查询出来了;

第三步:此时,只需要查询出 g2 所有牙刷的价格(g2.price)大于 g1 “拼多多牙刷”的价格(g1.price)的数据就可以了

select * from tb_goods as g1,tb_goods as g2 where g1.goods = '拼多多牙刷' and g2.price > g1.price;

查询结果如下:在 g2 表里面,已经查出了大于 g1 “拼多多牙刷”的价格数据。

第四步:然后就可以把需要的数据进行查询;

select g2.goods,g2.price from tb_goods as g1,tb_goods as g2 where g1.goods = '拼多多牙刷' and g2.price > g1.price;

查询结果如下:得到了最终结果,比 “拼多多牙刷” 的价格贵的牙刷,完成了需求。

最后,如果要查询的数据更清晰的话,可以给查询的字段取别名;

select g2.goods as '商品',g2.price as '商品价格' from tb_goods as g1,tb_goods as g2 where g1.goods = '拼多多牙刷' and g2.price > g1.price;

查询结果如下:

温馨提醒您:取别名不加 as 也可以,只不过是我自己的个人习惯,嘿嘿~

同样的,用显示内连接也可以完成该需求:

select g2.* from tb_goods as g1 inner join tb_goods as g2 on g1.goods = '拼多多牙刷' where g2.price > g1.price;

查询结果如下:

用左外连接也可以完成该需求:

select g2.* from tb_goods as g1 left outer join tb_goods as g2 on g1.goods = '拼多多牙刷' where g2.price > g1.price;

查询结果如下:


案例演示2

学生表(tb_student):

create table tb_student(    id int primary key auto_increment comment '主键ID',    student_id char(2) not null unique comment '学号',    name varchar(50) not null comment '姓名',    age tinyint unsigned not null comment '年龄',    parent_id char(2) comment '监护人ID')comment '学生表';

给学生表插入数据:

insert into tb_student(student_id, name, age,parent_id) VALUES('01','大头儿子',6,'03'),                                                              ('03','小头爸爸',31,null),                                                              ('02','小灰灰',5,'04'),                                                              ('04','灰太狼',36,null);

数据展示:  

需求:

查询学生姓名及学生监护人姓名。

思路解析(用的是隐式内连接),语法:

select 字段列表 from 表 [as] 表别名1,表  [as]  表别名2 where 条件...;

第一步:把 tb_student(学生表)分成两张一模一样的表,分别取 s1 和 s2 两个别名,把它们连接起来;

select * from tb_student as s1,tb_student as s2;

第二步:看到这个需求,你可能会觉得奇怪,为什么都没有 学生监护人姓名 这个字段,而只有 学生监护人ID ;

 那是因为我们可以通过 学生监护人ID(parent_id) 关联 学生学号(student_id),找到该学生的学生监护人(student_id)。

比如:大头儿子的 学生监护人ID(parent_id)是 03,此时 03 学生学号(student_id)的家长为小头爸爸;

SQL 语句编写:

第一步:把 tb_student(学生表)分成两张一模一样的表,分别取 s1 和 s2 两个别名,把它们连接起来;

select * from tb_student as s1,tb_student as s2;

第二步:找到 s1 表的 学生监护人ID(parent_id)和 s2 表的 学生学号(student_id),把它们用 = 关联起来,意思就是:通过 学生监护人ID(parent_id)找到 学生学号(student_id);

select * from tb_student as s1,tb_student as s2 where s1.parent_id = s2.student_id;

查询结果如下:从查询出来的结果,就可以看到对应的 学生姓名(s1.name) 及 学生监护人姓名(s2.name) 都已经被找到了。

第三步:这时候就可以对学生姓名(s1.name)及学生监护人(s2.name)这两个数据进行查询;

select s1.name,s2.name from tb_student as s1,tb_student as s2 where s1.parent_id = s2.student_id;

查询结果如下:已经实现该需求。

最后,如果要查询的数据更清晰的话,可以给查询的字段取别名;

select s1.name as '学生姓名',s2.name as '学生监护人姓名' from tb_student as s1,tb_student as s2 where s1.parent_id = s2.student_id;

查询结果如下:

同样的,用显示内连接也可以完成该需求:

select s1.name '学生姓名',s2.name as '学生监护人姓名' from tb_student as s1 inner join tb_student s2 on s1.parent_id = s2.student_id;

查询结果如下:

扩展需求

在这个学生表(tb_student)里面,家长是没有归属人的,也就是 parent_id 为 的情况,比如小头爸爸和灰太狼; 

此时,我又有一个需求:我希望查询 学生姓名 及 学生的监护人 姓名,如果学生没有学生的监护人, 也要查询出来。

此时就不能使用内连接了,内连接只能查出它们相互交集的数据;要改成左外连接;

select s1.name '学生姓名',s2.name '学生监护人姓名' from tb_student as s1 left join tb_student as s2 on s1.parent_id = s2.student_id;

查询结果如下:

完。。。

来源地址:https://blog.csdn.net/weixin_62332711/article/details/128602423

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL 自连接讲解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL数据库自连接实例讲解

目录什么是自连接?自连接语法1、内连接1.1隐式内连接1.2.显式内连接2、外连接2.1.左外连接2.2.右外连接案例案例演示1案例演示2扩展需求总结什么是自连接? 自连接可以理解为自己连接自己,在一张表上面所进行的操作;将
2023-06-11
2024-04-02

Mysql连接数的基本知识讲解

目录基本知识常用命令一、查看连接总数二、查看活跃连接数三、查看最大并发连接数总结基本知识连接总数(Total Connections)自My编程网SQL服务器启动以来,所有客户端建立的连接总次数,包括成功javascript和失败的连接
Mysql连接数的基本知识讲解
2024-09-04

MYSQL自连接查询

MYSQL自连接查询 1.概念:左表和右表是同一个表,根据连接查询条件查询两个表中的数据. 说明: ​ (1)自连接查询必须对表起别名; ​ 2) 自连接的使用方法和内连接,左连接,右连接完全相同,只不过连接的左表和右表是同一张表. 2.案
2023-08-20

讲解springboot连接Redis的教程

这篇文章主要介绍“讲解springboot连接Redis的教程”,在日常操作中,相信很多人在讲解springboot连接Redis的教程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”讲解springboot连
2023-06-06

开发自定义Mysql连接池

使用第三方包    https://pypi.python.org/pypi/DBUtils      tar -zxvf *.tar.gz * python3 setup.py build && python3 setup.py inst
2023-01-31

详解MySQL的内连接和外连接

mysql 中的内连接、左外连接和右外连接是用于连接两个或多个表的不同方式,它们之间的区别如下:内连接(Inner Join):内连接也称为等值连接,只返回两个表中键值匹配的行,即只有在两个表中都有匹配的数据时才会返回。内连接的语法如下
2023-05-06

JDBC连接MySQL详解

JDBC(Java Database Connectivity)是Java语言访问数据库的标准方法,通过JDBC可以连接各种类型的数据库,包括MySQL。连接MySQL数据库需要以下步骤:加载数据库驱动:使用Class.forName(“
JDBC连接MySQL详解
2024-04-09

MySQL中的连接操作:内连接、外连接和交叉连接详解

MySQL中的连接操作:内连接、外连接和交叉连接详解在MySQL数据库中,连接操作是一种常用的操作技术,用于将两个或多个表中的数据按照一定的条件进行合并。连接操作可以帮助我们处理复杂的数据查询和分析需求。在MySQL中,我们通常使用内连接、
2023-10-22

mysql中的自连接与join关联

目录mysql自连接分步查询自连接方式子查询JOININNER JOINLEFT JOINRIGHT JOIN总结mysql自连接mysql有时在信息查询时需要进行对自身连接(自连接),所以我们需要为表定义别名。我们举例说明,下面是商品
mysql中的自连接与join关联
2024-09-05

MySQL自连接与子查询方式

目录1. 自连接2. 子查询(嵌套查询)2.1 子查询分类2.2 单行子查询示例1:查询不想毕业同学的同班同学2.3 多行子查询示例2:查询语文或英语课程的信息成绩3. 合并查询3.1 示例1:查询id=3或者名字为英文的课程总结1. 自连
MySQL自连接与子查询方式
2024-09-05

编程热搜

目录