文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

MySQL数据库如何连接查询join

2023-07-02 00:27

关注

今天小编给大家分享一下MySQL数据库如何连接查询join的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

1、连接查询的分类

2、交叉连接

将两张表的数据与另外一张表彼此交叉

2.1、原理

笛卡尔积:

2.2、基本语法

表1 cross join 表2;
mysql> select * from tb_teacher;+--------+------+| name   | age  |+--------+------+| Jack   |   24 || Tom    |   26 || Steve  | NULL || 张三   |   23 || 张三   |   23 |+--------+------+5 rows in set (0.00 sec)mysql> select * from my_student;+----+--------+----------+------+--------+| id | name   | class_id | age  | gender |+----+--------+----------+------+--------+|  1 | 刘备   |        1 |   18 |      2 ||  2 | 李四   |        1 |   19 |      1 ||  3 | 王五   |        2 |   20 |      2 ||  7 | 张飞   |        2 |   21 |      1 ||  8 | 关羽   |        1 |   22 |      2 ||  9 | 曹操   |        1 |   20 |   NULL |+----+--------+----------+------+--------+6 rows in set (0.01 sec)mysql> select * from my_student cross join tb_teacher;+----+--------+----------+------+--------+--------+------+| id | name   | class_id | age  | gender | name   | age  |+----+--------+----------+------+--------+--------+------+|  1 | 刘备   |        1 |   18 |      2 | Jack   |   24 ||  1 | 刘备   |        1 |   18 |      2 | Tom    |   26 ||  1 | 刘备   |        1 |   18 |      2 | Steve  | NULL ||  1 | 刘备   |        1 |   18 |      2 | 张三   |   23 ||  1 | 刘备   |        1 |   18 |      2 | 张三   |   23 ||  2 | 李四   |        1 |   19 |      1 | Jack   |   24 ||  2 | 李四   |        1 |   19 |      1 | Tom    |   26 ||  2 | 李四   |        1 |   19 |      1 | Steve  | NULL ||  2 | 李四   |        1 |   19 |      1 | 张三   |   23 ||  2 | 李四   |        1 |   19 |      1 | 张三   |   23 ||  3 | 王五   |        2 |   20 |      2 | Jack   |   24 ||  3 | 王五   |        2 |   20 |      2 | Tom    |   26 ||  3 | 王五   |        2 |   20 |      2 | Steve  | NULL ||  3 | 王五   |        2 |   20 |      2 | 张三   |   23 ||  3 | 王五   |        2 |   20 |      2 | 张三   |   23 ||  7 | 张飞   |        2 |   21 |      1 | Jack   |   24 ||  7 | 张飞   |        2 |   21 |      1 | Tom    |   26 ||  7 | 张飞   |        2 |   21 |      1 | Steve  | NULL ||  7 | 张飞   |        2 |   21 |      1 | 张三   |   23 ||  7 | 张飞   |        2 |   21 |      1 | 张三   |   23 ||  8 | 关羽   |        1 |   22 |      2 | Jack   |   24 ||  8 | 关羽   |        1 |   22 |      2 | Tom    |   26 ||  8 | 关羽   |        1 |   22 |      2 | Steve  | NULL ||  8 | 关羽   |        1 |   22 |      2 | 张三   |   23 ||  8 | 关羽   |        1 |   22 |      2 | 张三   |   23 ||  9 | 曹操   |        1 |   20 |   NULL | Jack   |   24 ||  9 | 曹操   |        1 |   20 |   NULL | Tom    |   26 ||  9 | 曹操   |        1 |   20 |   NULL | Steve  | NULL ||  9 | 曹操   |        1 |   20 |   NULL | 张三   |   23 ||  9 | 曹操   |        1 |   20 |   NULL | 张三   |   23 |+----+--------+----------+------+--------+--------+------+30 rows in set (0.00 sec)

2.3、应用

基本没有实际意义

等价于

select * from my_student, tb_teacher;

3、内连接

从一张表中取出所有的记录,去另外一张表中匹配,利用匹配条件进行匹配,成功则保留,失败则放弃

3.1、原理

3.2、基本语法

表1 inner join 表2 on 匹配条件
create table my_class(    id int primary key auto_increment,    name varchar(10) not null);insert into my_class (name) values ('一班'), ('二班');mysql> select * from my_class;+----+--------+| id | name   |+----+--------+|  1 | 一班   ||  2 | 二班   |+----+--------+mysql> select * from my_student;+----+--------+----------+------+--------+| id | name   | class_id | age  | gender |+----+--------+----------+------+--------+|  1 | 刘备   |        1 |   18 |      2 ||  2 | 李四   |        1 |   19 |      1 ||  3 | 王五   |        2 |   20 |      2 ||  4 | 张飞   |        2 |   21 |      1 ||  5 | 关羽   |        1 |   22 |      2 ||  6 | 曹操   |        1 |   20 |   NULL |+----+--------+----------+------+--------+-- 如果内连接没有条件,其实就是交叉连接(笛卡尔积)mysql> select * from my_student inner join my_class;+----+--------+----------+------+--------+----+--------+| id | name   | class_id | age  | gender | id | name   |+----+--------+----------+------+--------+----+--------+|  1 | 刘备   |        1 |   18 |      2 |  1 | 一班   ||  1 | 刘备   |        1 |   18 |      2 |  2 | 二班   ||  2 | 李四   |        1 |   19 |      1 |  1 | 一班   ||  2 | 李四   |        1 |   19 |      1 |  2 | 二班   ||  3 | 王五   |        2 |   20 |      2 |  1 | 一班   ||  3 | 王五   |        2 |   20 |      2 |  2 | 二班   ||  4 | 张飞   |        2 |   21 |      1 |  1 | 一班   ||  4 | 张飞   |        2 |   21 |      1 |  2 | 二班   ||  5 | 关羽   |        1 |   22 |      2 |  1 | 一班   ||  5 | 关羽   |        1 |   22 |      2 |  2 | 二班   ||  6 | 曹操   |        1 |   20 |   NULL |  1 | 一班   ||  6 | 曹操   |        1 |   20 |   NULL |  2 | 二班   |+----+--------+----------+------+--------+----+--------+12 rows in set (0.00 sec)-- 表的设计,通常会有同名字段,通常使用`表名.字段`来保证唯一性mysql> select * from my_student inner join my_class on my_student.class_id = my_class.id;+----+--------+----------+------+--------+----+--------+| id | name   | class_id | age  | gender | id | name   |+----+--------+----------+------+--------+----+--------+|  1 | 刘备   |        1 |   18 |      2 |  1 | 一班   ||  2 | 李四   |        1 |   19 |      1 |  1 | 一班   ||  3 | 王五   |        2 |   20 |      2 |  2 | 二班   ||  4 | 张飞   |        2 |   21 |      1 |  2 | 二班   ||  5 | 关羽   |        1 |   22 |      2 |  1 | 一班   ||  6 | 曹操   |        1 |   20 |   NULL |  1 | 一班   |+----+--------+----------+------+--------+----+--------+-- 如果表名比较长,可以使用别名简化mysql> select * from my_student as a inner join my_class b on a.class_id = b.id;+----+--------+----------+------+--------+----+--------+| id | name   | class_id | age  | gender | id | name   |+----+--------+----------+------+--------+----+--------+|  1 | 刘备   |        1 |   18 |      2 |  1 | 一班   ||  2 | 李四   |        1 |   19 |      1 |  1 | 一班   ||  3 | 王五   |        2 |   20 |      2 |  2 | 二班   ||  4 | 张飞   |        2 |   21 |      1 |  2 | 二班   ||  5 | 关羽   |        1 |   22 |      2 |  1 | 一班   ||  6 | 曹操   |        1 |   20 |   NULL |  1 | 一班   |+----+--------+----------+------+--------+----+--------+-- 可以交换两张表的先后顺序mysql> select * from my_class b inner join my_student as a on a.class_id = b.id;+----+--------+----+--------+----------+------+--------+| id | name   | id | name   | class_id | age  | gender |+----+--------+----+--------+----------+------+--------+|  1 | 一班   |  1 | 刘备   |        1 |   18 |      2 ||  1 | 一班   |  2 | 李四   |        1 |   19 |      1 ||  2 | 二班   |  3 | 王五   |        2 |   20 |      2 ||  2 | 二班   |  4 | 张飞   |        2 |   21 |      1 ||  1 | 一班   |  5 | 关羽   |        1 |   22 |      2 ||  1 | 一班   |  6 | 曹操   |        1 |   20 |   NULL |+----+--------+----+--------+----------+------+--------+-- on 可以使用 where 替换,推荐使用 onmysql> select * from my_class b inner join my_student as a where a.class_id = b.id;+----+--------+----+--------+----------+------+--------+| id | name   | id | name   | class_id | age  | gender |+----+--------+----+--------+----------+------+--------+|  1 | 一班   |  1 | 刘备   |        1 |   18 |      2 ||  1 | 一班   |  2 | 李四   |        1 |   19 |      1 ||  2 | 二班   |  3 | 王五   |        2 |   20 |      2 ||  2 | 二班   |  4 | 张飞   |        2 |   21 |      1 ||  1 | 一班   |  5 | 关羽   |        1 |   22 |      2 ||  1 | 一班   |  6 | 曹操   |        1 |   20 |   NULL |+----+--------+----+--------+----------+------+--------+

3.3、应用

内连接通常是在对数据有精确要求的地方使用,必须保证两张表中都能进行数据匹配,内连接匹配到才会保存

4、外连接

按照某一张表作为主表(表中所有记录在最后都会保留)根据条件取连接另外一张表,从而得到目标数据

外连接分为两种:

4.1、原理

4.2、基本语法

-- 左连接主表 left join 从表 on 连接条件;-- 右连接从表 right join 主表 on 连接条件;

左表的数据在前,右表的数据在后

mysql> select * from my_student;+----+--------+----------+------+--------+| id | name   | class_id | age  | gender |+----+--------+----------+------+--------+|  1 | 刘备   |        1 |   18 |      2 ||  2 | 李四   |        1 |   19 |      1 ||  3 | 王五   |        2 |   20 |      2 ||  4 | 张飞   |        2 |   21 |      1 ||  5 | 关羽   |        1 |   22 |      2 ||  6 | 曹操   |        1 |   20 |   NULL |+----+--------+----------+------+--------+mysql> select * from my_class;+----+--------+| id | name   |+----+--------+|  1 | 一班   ||  3 | 三班   ||  2 | 二班   |+----+--------+mysql> select * from my_student as s left join my_class c on s.class_id = c.id;+----+--------+----------+------+--------+------+--------+| id | name   | class_id | age  | gender | id   | name   |+----+--------+----------+------+--------+------+--------+|  1 | 刘备   |        1 |   18 |      2 |    1 | 一班   ||  2 | 李四   |        1 |   19 |      1 |    1 | 一班   ||  3 | 王五   |        2 |   20 |      2 |    2 | 二班   ||  4 | 张飞   |        2 |   21 |      1 |    2 | 二班   ||  5 | 关羽   |        1 |   22 |      2 |    1 | 一班   ||  6 | 曹操   |        1 |   20 |   NULL |    1 | 一班   |+----+--------+----------+------+--------+------+--------+select * from my_student as s right join my_class c on s.class_id = c.id;mysql> select * from my_student as s right join my_class c on s.class_id = c.id;+------+--------+----------+------+--------+----+--------+| id   | name   | class_id | age  | gender | id | name   |+------+--------+----------+------+--------+----+--------+|    1 | 刘备   |        1 |   18 |      2 |  1 | 一班   ||    2 | 李四   |        1 |   19 |      1 |  1 | 一班   ||    3 | 王五   |        2 |   20 |      2 |  2 | 二班   ||    4 | 张飞   |        2 |   21 |      1 |  2 | 二班   ||    5 | 关羽   |        1 |   22 |      2 |  1 | 一班   ||    6 | 曹操   |        1 |   20 |   NULL |  1 | 一班   || NULL | NULL   |     NULL | NULL |   NULL |  3 | 三班   |+------+--------+----------+------+--------+----+--------+

4.3、特点

外连接中主表的数据一定会保存,连接之后不会出现记录数少于主表(内连接可能少数据)

左连接和右连接可以相互转换,但是数据对应的位置(字段顺序)会改变

4.4、应用

获取对应主表以及其他数据(关联)

通常使用左连接

5、using关键字

在连接查询中用来代替对应on关键字进行条件匹配

5.1、原理

5.2、基本语法

表1 [inner, left, right] join 表2 using (同名字段列表);
select * from my_student left join my_class using(class_id);-- 等价于select * from my_student left join my_class on my_student.class_id = my_class.class_id;

这个方法通常不使用

以上就是“MySQL数据库如何连接查询join”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

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

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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯