目录

一、概述

二、连接查询的分类

三、七种常用连接查询详解

1、笛卡尔积:

2、内连接

2.1隐式与显式连接

?2.2等值连接

?2.3非等值连接

?2.4自连接

3外连接

3.1左外连接:

?3.2右外连接:

3.3全外连接


一、概述

在实际开发中,大部分的情况下都不是从单表中查询数据,一般都是多张表联合查询取出最终的结果。一个业务都会对应多张表,比如:学生和班级,起码两张表。(避免产生数据的冗余)。

内连接和外连接的区别

1、内连接:

假设A和B表进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录查询出来,这就是内连接。AB两张表没有主副之分,两张表是平等的。

2、外连接:

假设A和B表进行连接,使用外连接的话, AB两张表中有一张表是主表,一张表是副表,主要查询主表中的数据,捎带着查询副表。当副表中的数据没有和主表中的数据匹配上,副表自动模拟出NULL与之匹配。

二、连接查询的分类

1、根据语法出现的年代来划分:

  • sql97–仅仅支持内连接(一些老的DBA可能还在使用这种语法。)
  • sql99–推荐使用,支持左外+右外(左外+右外)+交叉

2、根据功能划分分类:

  • 交叉连接:笛卡尔积。
  • 内连接:等值连接、非等值连接、自连接。(还可分为隐式【无join】和显式【有join】)
  • 外连接:左外连接(左连接)、右外连接(右连接)、全连接。

3、 生成测试数据

执行下面的sql语句生成student表和teacher表,两表通过teacher_id关联。

create table student(id int(3) not null primary key,name char(6) not null,age int(2) not null,teacher_id int(3) not null
);
create table teacher(id int(3) not null primary key,name char(6) not null,age int(2) not null,class_id int(3) not null
);插入值 id 姓名 年龄 教师idinsert into student values(1, '刘峰', 20, 1);
insert into student values(2, '李福', 22, 2);
insert into student values(3, '王紫', 21, 3);
insert into student values(4, '赵兰', 24, 4);
insert into student values(5, '夏日', 23, 5);
insert into student values(6, '詹启', 22, 6);
insert into student values(7, '刘娜', 24, 4);
insert into student values(8, '王恒', 23, 5);
insert into student values(9, '晓飞', 22, 6);插入值 id 姓名 年龄 班级idinsert into teacher values(1, '夏晴', 36, 1);
insert into teacher values(2, '李淳', 32, 2);
insert into teacher values(3, '张叶', 34, 3);
insert into teacher values(4, '鹿雪', 37, 3);
insert into teacher values(5, '刘花', 36, 2);
insert into teacher values(6, '贾义', 34, 1);执行下面查询语句,student表和teacher表如下:select * from student;
select * from teacher;

student表 teacher表

三、七种常用连接查询详解

1、笛卡尔积:

笛卡尔积也称交叉连接,交叉连接是内连接的一种。

假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}。如果A表示某学校学生的集合,B表示该学校所有教师的集合,则A与B的笛卡尔积表示学生选择老师所有可能的情况。

笛卡尔积特点:它不使用任何匹配或者选取条件,而是直接将一个数据源中的每个行与另一个数据源的每个行 一 一 匹配。

重点记:

笛卡尔积:用的比较少,因为存在重复数据
笛卡尔积:一个表的每条数据都和另一个表的所有数据匹配一次
结 果:一表 9 条 乘以 另一表 6 条 = 54 条

1.1 案例如下:

查询学生对应的老师

select * from student ,teacher;

学生表 中数据每 1 个学生都和 教师表 中的 所有教师 都匹配一次。


问题:
当两张表进行连接查询的时候,没有任何条件进行限制,最终的查询结果条数是两张表记录条数的乘积。这就是笛卡尔积现象。查询出来的结果是两张表的记录的乘积9*6=54,许多数据是无效数据。如何避免笛卡尔积现象?

解决方案:增加加条件进行过滤,但只会显示有效记录。此时也是隐式(无join)内连接。

根据教师id查询学生对应的选课老师
select st.*,th.* from student st ,teacher th where st.teacher_id = th.id;

**注意:**使用as可以对表和字段起别名,关于表的别名的优点:执行效率高;可读性好。
其中st是student的表的别名,原是from student as st,其中as可以省略。
其中th是teacher的表的别名,原是from teacher as th,其中as可以省略。

2、内连接

内连接,取的就是两张表的交集。

内连接又分为等值连接、非等值连接、自连接。(还可分为隐式【无join】和显式【有join】)

2.1隐式与显式连接

隐式(无join)连接语法:select 字段 from 表A, 表B where 消除笛卡尔积的连接条件

案例:根据教师id查询学生对应的选课老师
select st.*,th.* from student st ,teacher th where st.teacher_id = th.id;

显式(有join)连接语法:select 字段* from 表A 别名 INNER(可以省略) JOIN 表B 别名 ON 消除笛卡尔积的连接条件

案例:根据教师id查询学生对应的选课老师

select st.*,th.* from student st inner join teacher th on st.teacher_id = th.id;

select st.*,th.* from student st join teacher th on st.teacher_id = th.id;(inner 可以省略)

2.2等值连接

等值连接的最大的特点就是:条件是等量关系,SQL99(最常用)。

等值连接语法
select 字段* from 表1 INNER(可以省略) JOIN 表2 ON 消除笛卡尔积的连接条件A=B

案例:根据教师id查询学生对应的选课老师

select st.*,th.* from student st join teacher th on st.teacher_id = th.id;

2.3非等值连接

非等值连接的最大的特点就是:条件不是是等量关系,SQL99(最常用)。

非等值连接语法
select 字段* from 表1 INNER(可以省略) JOIN 表2 ON 消除笛卡尔积的连接条件

案例:查询教师id在4-6之间所教的学生和老师信息
select st.*,th.* from student st jointeacher th on st.teacher_id = th.id and th.id between 4 and 6;

2.4自连接

自连接的最大的特点:就是一张表看做两张表,自己连接自己

实质就是等值连接,只不过是连接表本身。

案例:查询学生id和教师id相同的学生
select s.*,st.teacher_id from student s,student st where s.id = st.teacher_id;

3外连接

外连接又分为左外连接、右外连接、全连接

左外连接(LEFT OUTER JOIN),简称左连接(LEFT JOIN)

右外连接(RIGHT OUTER JOIN),简称右连接(RIGHT JOIN)

全外连接(FULL OUTER JOIN),简称全连接(FULL JOIN)

student 表中插入两条语句,teacher_id的 13和 15在teacher中是不存在的。
INSERT INTO `cqyddx`.`student`(`id`, `name`, `age`, `teacher_id`) VALUES (10, ‘夏雨’, 21,13);
INSERT INTO `cqyddx`.`student`(`id`, `name`, `age`, `teacher_id`) VALUES (11, ‘冬雪’, 22,15);

插入 teacher 表三条语句,id分别为
INSERT INTO `cqyddx`.`teacher`(`id`, `name`, `age`, `class_id`) VALUES (7, ‘付霞’, 34, 4);
INSERT INTO `cqyddx`.`teacher`(`id`, `name`, `age`, `class_id`) VALUES (8, ‘郝仁’, 33, 5);
INSERT INTO `cqyddx`.`teacher`(`id`, `name`, `age`, `class_id`) VALUES (9, ‘赵刚’, 35, 7);

3.1左外连接:

左外连接:left join 或 leftoutrer join (outer可以省略)

左外连接:左边的是主表,左表数据全部显示,右表显示符合ON后的条件的数据,不符合的用NULL代替。

select * from student st left join teacher th on st.teacher_id = th.id;(outer可以省略)

通过查询结果发现,左外连接查询的是 左表独有的数据 加上 两表共有的数据

左外特殊情况:返回没有匹配的记录

案例:查询没有教师的学生信息

select * from student st left join teacher th on st.teacher_id = th.id where th.id is null;

通过查询发现,左连接查询的为左表独有的数据。

3.2右外连接:

右外连接:right join 或 right outrer join (outer可以省略)

右外连接:右边边的是主表,右边表数据全部显示,左边表显示符合ON后的条件的数据,不符合的用NULL代替。

select * from student st right join teacher th on st.teacher_id = th.id;(outer可以省略)

通过结果发现,右外连接查询的是 右表独有的数据 加上 两表共有的数据

右外特殊情况:返回没有匹配的记录

案例:查询没有学生的教师信息

select * from student st right join teacher th on st.teacher_id = th.id where st.teacher_id is null;

通过查询发现,右连接查询的为右表独有的数据。

3.3全外连接

全外连接:full join或 full outer join(outer可以省略),但Mysql不支持,可以使用union组合并去重实现。
简单理解

全外接查询:就是 左表独有的数据 加上 右表独有的数据

select * from student stleft join teacher thon st.teacher_id = th.id where th.id is null
union
select * from student stright join teacher thon st.teacher_id = th.id where st.teacher_id is null

3.4全连接

全连接:full join或 full outer join(outer可以省略),但Mysql不支持,可以使用union组合并去重实现。

简单理解

全连接查询的是 左表所有的数据加上 右表所有的数据并去重。


select * from student st left join teacher th on st.teacher_id = th.id
union
select * from student st right join teacher th on st.teacher_id = th.id

**总结:**mysql存在七种连接,分别是内连接、左外连接、左外连接特殊情况、右外连接、右外连接特殊情况、全连接、全外连接。总结在一起就是内连接、左外连接、右外连接、全外连接。

最后

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

小编已加密:aHR0cHM6Ly9kb2NzLnFxLmNvbS9kb2MvRFVrVm9aSGxQZUVsTlkwUnc==出于安全原因,我们把网站通过base64编码了,大家可以通过base64解码把网址获取下来。

Mysql中的七种常用查询连接详解相关推荐

  1. java中的json_JAVA中的四种JSON解析方式详解

    JAVA中的四种JSON解析方式详解 我们在日常开发中少不了和JSON数据打交道,那么我们来看看JAVA中常用的JSON解析方式. 1.JSON官方 脱离框架使用 2.GSON 3.FastJSON ...

  2. Vmware与主机间共享文件的七种方法(附图+详解)

    [原创]Vmware与主机间共享文件的七种方法(附图+详解)                       -By:adbrave 相信很多玩电脑的人都用过Vmware吧?(Vmware是虾米东西?倒!

  3. 你不知道的 ,MySQL中的七种SQL JOINS的实现,满外连接

    七种SQL JOINS的实现,满外连接 每博一文案 英国作家摩姆说过,我们每个人在世界上都是孤独的,因此 我们只能孤独地行走,尽管身体相互依傍,却并不在一起. 既不了解别的人,也不能为别人所了解. 当 ...

  4. MySQL中修改密码及访问限制设置详解

    MySQL是一个真正的多用户.多线程SQL数据库服务器.MySQL是以一个客户机/服务器结构的实现,它由一个服务器守护程序mysqld和很多不同的客户程序和库组成.由于其源码的开放性及稳定性,且与网站 ...

  5. mysql中修改密码及反问限制设置详解

    http://www.yesky.com/404/1935404.shtml MySQL是一个真正的多用户.多线程SQL数据库服务器.MySQL是以一个客户机/服务器结构的实现,它由一个服务器守护程序 ...

  6. mysql中索引的作用是什么_详解mysql中索引的作用

    1. 索引是什么,首先我们可以举个例子,字典大家应该都使用过,我们可以使用目录快速定位到所要查找的内容,那么索引跟目录的作用类似,在数据库表记录中,利用索引,可以快速过滤查找到数据记录. 2. 索引类 ...

  7. android 请求方式有哪些,Android中的几种网络请求方式详解

    Android应用经常会和服务器端交互,这就需要手机客户端发送网络请求,下面整理四种常用网络请求方式. java.net包中的HttpURLConnection类 Get方式: // Get方式请求 ...

  8. Burp Suite爆破模块中的四种模式的区别详解和演示(暴力破解)

    BrupSuite爆破的四种模式详解 最近看了好多关于暴力破解的博客,其中用的最多的工具就是bp了,但是好多都是一上来给了执行步骤,却没有对爆破的这几个模式选择进行解释,所以今天萌新写个纪录,来阐明这 ...

  9. MySQL 中的 SET 与 ENUM 类型使用详解

    一.SET类型 在创建表时,就指定SET类型的取值范围. [sql] view plaincopy 属性名 SET('值1','值2','值3'...,'值n') 其中,"属性名" ...

最新文章

  1. ubuntu mysql emma_Ubuntu 11.10 MySQL客户端 Emma 6.0 中文乱码解决办法
  2. php5.5.33 源码安装,Linux PHP5.3升级PHP5.5.33
  3. 解决J2EE系统应用性能问题常用方法
  4. linux函数没有返回值导致溢出,Shell中函数返回值超出问题
  5. 视觉slam学习--坐标系变换 | 欧式变换+仿射变换+射影变换
  6. 【Python基础】Python正则表达式入门到入魔
  7. 【mysql学习】疑问点记录
  8. oracle+去括号,关于001 TK的几个问题,请大家一起讨论一下
  9. Android自定义xml解析
  10. .net core 应用程序“default web site”中的服务器错误_Net程序员讲JAVA系列——Spring Boot“科普篇”...
  11. 2017-2018-2 20165314 实验三《 敏捷开发与XP实践》实验报告
  12. 发票验真API开发文档
  13. java生成图表_java实现将数据生成图表至excel导出
  14. hdmi 计算机 接口类型,四大常用视频接口对比,你的电脑是哪种接口?
  15. 【论文笔记】FlowNet:有监督的光流估计(optical flow estimation)网络
  16. C# 使用NPIO 导出导出EXECL
  17. uva 10099 The Tourist Guide nyoj 1019 亲戚来了【单个路线最大流【最短路算法】】
  18. 弗吉尼亚大学计算机专业如何,弗吉尼亚大学计算机工程专业研究生怎么样?
  19. 电脑重装系统后播放视频卡顿怎么办
  20. ubuntu uninstall

热门文章

  1. Linux下riscv-openocd调试环境搭建
  2. word中去除页眉中的横线
  3. poj 1125 Stockbroker(多源最短路径)
  4. 每天学命令all_inputs
  5. win10 管理员权限运行
  6. 关于Windows10上OneNote粘贴保留代码格式问题(困惑我许久的问题终于解决)
  7. win10内网穿透实现远程桌面连接
  8. Pandas 元素选取
  9. video网页能播放.mp4视频,微信不能播放的问题
  10. python猫眼电影分析_Python数据分析之猫眼电影TOP100