文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

MySQL多表查询内连接外连接详解,join、left join、right join、full join的使用

2023-09-02 21:31

关注

目录

1、多表查询概览

1.1、分类

1.2、外连接的分类

1.3、常用的SQL语法标准

2、内外联接案例

2.1、初始化表

2.2、内连接

2.3、外连接案例

2.4、全连接案例

2.5、union和union all

2.6、实现MySQL全连接

2.7、内外连接面试基础

2.8、SQL99多表查询新特性


1、多表查询概览

1.1、分类

可以根据3个角度进行分类:

角度1:是否使用"="符号

角度2:连接表的数量是否大于1

角度3:多表关联时,是否查询有关联的数据

1.2、外连接的分类

1.3、常用的SQL语法标准

  1. ANSI:美国国家标准学会
  2. ISO:国际标准化组织

2、内外联接案例

2.1、初始化表

<1>学生表:student

create table if not exists taobao.student(id int auto_increment primary key,name varchar(50) null,classid int null,age int null)comment '学生表';INSERT INTO student (id, name, classid, age) VALUES (1, '张三', 1, 18);INSERT INTO student (id, name, classid, age) VALUES (2, '李四', 1, 18);INSERT INTO student (id, name, classid, age) VALUES (3, '王五', 2, 17);INSERT INTO student (id, name, classid, age) VALUES (4, '老六', 2, 18);INSERT INTO student (id, name, classid, age) VALUES (5, '七七', null, 17);INSERT INTO student (id, name, classid, age) VALUES (6, '二流子', null, 19);INSERT INTO student (id, name, classid, age) VALUES (7, '巴哥', null, 18);

 <2>班级表:classinfo

create table if not exists taobao.classinfo(classid int auto_increment primary key,name varchar(100) null)comment '班级表';INSERT INTO classinfo (name) VALUES ('高一1班');INSERT INTO classinfo (name) VALUES ('高一2班');INSERT INTO classinfo (name) VALUES ('高一3班');

2.2、内连接

需求:查询已分配的学生信息,如:学生基本信息,所在班级名称

<1>SQL92内连接写法:

select    t1.id       -- 学生ID    ,t1.name    -- 学生姓名    ,t1.age     -- 学生年龄    ,t2.name    -- 班级名称from student t1,classinfo t2where t1.classid=t2.classid

<2>SQL99内连接写法:

select    t1.id       -- 学生ID    ,t1.name    -- 学生姓名    ,t1.age     -- 学生年龄    ,t2.name    -- 班级名称from student t1join classinfo t2on t1.classid=t2.classid

结果:

2.3、外连接案例

需求:查询所有的学生信息,并查出学生所对应的班级名称

【注意:多表查询时,当查询一个表所有数据,该查询语句一定是外连接】

 <1>SQL92外连接写法:

注意:

select    t1.id       -- 学生ID     ,t1.name    -- 学生姓名     ,t1.age     -- 学生年龄     ,t2.name    -- 班级名称from student t1,classinfo t2where t1.classid=t2.classid(+)

<2>SQL99外连接写法:

左连接写法:

select    t1.id       -- 学生ID     ,t1.name    -- 学生姓名     ,t1.age     -- 学生年龄     ,t2.name    -- 班级名称from student t1left join classinfo t2    --注意:left join是缩写,也可以写为:left outer joinon t1.classid=t2.classid

右连接写法:

select    t2.id       -- 学生ID    ,t2.name    -- 学生姓名    ,t2.age     -- 学生年龄    ,t1.name    -- 班级名称from classinfo t1right join student t2on t1.classid=t2.classid

 结果:

2.4、全连接案例

需求:查询学生表中的所有信息,并关联班级表信息及显示未关联的班级表信息

SQL99全连接写法(Oracle):

关键字:full join ... on ... 或者 full outer join ... on ...

注意:MySQL不支持全连接,但是Oracle支持

select    t1.id       -- 学生ID     ,t1.name    -- 学生姓名     ,t1.age     -- 学生年龄     ,t2.name    -- 班级名称from student t1full join classinfo t2on t1.classid=t2.classid

MySQL实现全连接,需要使用关键字"union"或者"union all"

2.5、union和union all

union:联合、合并的意思

例如:我们把学生表查询两次,并使用union或union all进行合并

<1>union 语句

select * from studentunion   -- 会进行去重操作select * from student

结果:

 <2>union  all 语句

select * from studentunion all  -- 不去重select * from student

结果:

注意:

2.6、实现MySQL全连接

需求:查询学生表中的所有信息,并关联班级表信息及显示未关联的班级表信息

实现方式有多种,这里我使用:

  1. 首先查询出学生表所有信息并显示对应的班级表信息
  2. 其次查询班级表中,classid不在学生表中的数据
  3. 把上述结果使用union all合并

代码如下:

select    t1.id       -- 学生ID     ,t1.name    -- 学生姓名     ,t1.age     -- 学生年龄     ,t2.name    -- 班级名称from student t1left join classinfo t2    -- 注意:left join是缩写,也可以写为:left outer joinon t1.classid=t2.classidunion allselect    null        -- null:这里设置为null,只是为了与上一个select的结果行字段(数量)进行匹配,以下2个null作用一样    ,null    ,null    ,t1.namefrom classinfo t1where t1.classid not in (    select        distinct classid    -- distinct表示去重    from student t2 where t2.classid is not null    )

结果:

2.7、内外连接面试基础

 上述图对应7种多表查询,是面试及实际开发中,必会的操作,这里就不多言了

注意:当关联表的数量超过3个时,禁止使用join,因为一个join相当于一个for性能会很差


2.8、SQL99多表查询新特性

<1>natural  join

如:上面的内连接SQL为:

select    t1.id       -- 学生ID    ,t1.name    -- 学生姓名    ,t1.age     -- 学生年龄    ,t2.name    -- 班级名称from student t1join classinfo t2on t1.classid=t2.classid

使用natural  join进行改造,如下:

select    t1.id       -- 学生ID     ,t1.name    -- 学生姓名     ,t1.age     -- 学生年龄     ,t2.name    -- 班级名称from student t1natural join classinfo t2    --自然连接

结果:

查询到了0条数据,这是因为:

也就是上述的自然连接,转义为内连接的SQL为:

select    t1.id       -- 学生ID     ,t1.name    -- 学生姓名     ,t1.age     -- 学生年龄     ,t2.name    -- 班级名称from student t1join classinfo t2on t1.classid=t2.classidand t1.name = t2.name    -- 这个条件也被自然连接附带上了

因此,使用natural join的前提条件就是:

  1. 多表关联时,关联字段名称必须相同
  2. 不进行关联的字段名称必须不相同

综上:在实际开发中,我们应当避免使用natural  join,造成表与表之间的耦合较高

<2>using

语法:

  • using(多表关联的字段名称)

前提:

  • 多表关联时,关联字段的名称必须相同
  • 注意:这种写法公司一般不给使用,当某个字段改名时,很难定位错误

如:上面的内连接SQL为:

select    t1.id       -- 学生ID    ,t1.name    -- 学生姓名    ,t1.age     -- 学生年龄    ,t2.name    -- 班级名称from student t1join classinfo t2on t1.classid=t2.classid

使用using:

select    t1.id       -- 学生ID     ,t1.name    -- 学生姓名     ,t1.age     -- 学生年龄     ,t2.name    -- 班级名称from student t1join classinfo t2using(classid)

结果:

来源地址:https://blog.csdn.net/weixin_42675423/article/details/130067465

阅读原文内容投诉

免责声明:

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

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

软考中级精品资料免费领

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

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

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

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

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

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

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