连接查询

关系型数据库管理系统中,通常将每个实体的所有信息存放在一张表中,当查询数据时,通过连接操作查询多个表中的实体信息,当两个或多个表中存在相同意义的字段时,便可以通过这些字段对不同的表进行连接查询,连接查询包括交叉连接查询、内连接查询、外连接查询,本节将针对这些连接查询进行详细的讲解。

1、交叉连接查询

交叉连接返回的结果是被连接的两个表中所有数据行的笛卡尔积。

简化说明为:两列数据各从各列中取一个组成不同的组合,一共有多少种方式。

那为了我们能够进行数据查询,我们首先要往我们的数据库中插入部分数据。insert into class (classname) values ('软件161'),('移应161'),('移应171');

注意:我们这里要先插入class表格的数据,再插入student表格的数据,这是由我们外键约束决定的:必须要先有班级才能将学生归为该班内。insert into student(name , classid) values ('赵','1'),('钱','2'),('孙','3'),('李','2');

之后再插入学生数据,这个学生分班情况,要和学校实际有的班级相对应,既符合逻辑又符合外键。

然后咱们再来做咱们的交叉连接,首先是交叉连接的基本格式:SELECT * FROM table1 CROSS JOIN table2;

那我们实际项目中的交叉连接应该怎么写?

最后我们通过查询交叉连接查询出来的内容应该是有3X4,这么多条的。

不过,实际开发中这种业务需求是很少见的,一般不会使用交叉连接,而是使用具体的条件对数据进行有目的的查询。

2、内连接

内连接(Inner Join)又称简单连接或自然连接,是一种常见的连接查询。

内连接使用比较运算符对两个表中的数据进行比较,并列出与连接条件匹配的数据行,组合成新的纪录。

也就是说只有满足内连接条件的记录才能出现在查询结果中。SELECT row_name FROM table1 [INNER可以省略] JOIN table2 ON table1.row_name = table2.row_name;

row_name指的是字段,那我们来看一下具体查询SELECT * FROM class JOIN student ON class.id = student.classid;

查询的结果是我们对应班级的同学被归类到对应的班级上了。

当然了,我们实现需求的方法不止一个,对吧:

SELECT class.classname , student.name FROM class,student WHERE class.id = student.classid;

从查询结果看,使用WHERE子句查询结果与使用INNER JOIN 的查询结果是一致的。

需要注意的是,这两个语句的查询结果虽然相同,但是INNER JOIN是内连接语句,WHERE是条件判断语句,在WHERE语句后可以直接添加其他条件,而INNER JOIN语句不可以。

2.1、自连接

如果在一个连接查询中,涉及的两个表是同一个表,这种查询称为自连接查询。

自连接是一种特殊的内连接,它是指相互连接的表在物理上为同一个表,但逻辑上分为两个表,例如要查询‘李’这个同学班级里面还有哪些同学。SELECT p2.* FROM student p1 JOIN student p2 ON p1.classid = p2.classid where p1.name='李';

但是在教学过程中,学生出现了这样的一个问题,命令行如下:SELECT p2.* FROM student p1 JOIN student p2 ON p1.classid = p2.classid where p2.name='李';

查询结果如下:

原因分析:

原因分析方法:数据库学习时分析原因的方法类似于断点调试法,将命令行分段修改,查找原因。

SELECT * FROM student p1 JOIN student p2 ;

SELECT p2.* FROM student p1 JOIN student p2 where p2.name='李';

SELECT p2.* FROM student p1 JOIN student p2 ON p1.classid = p2.classid ;

3、外连接

内连接查询中,返回的结果只包含符合查询条件和连接条件的数据,然而有时还需要包含没有关联的数据,即返回查询结果中不仅包含符合条件的数据,而且还包括左表(左连接或左外连接)、右表(右连接或右外连接)或两个表(全外连接)中的所有数据,此时就需要使用外连接查询,外连接分为左连接和右连接。

首先我们先看一下外连接的语法格式

SELECT row_name FROM table1 LEFT||RIGHT [OUTER可以省略] JOIN table2 ON table1.row_name = table2.row_name WHERE condition.

那同样的两张表格怎样区分左表和右表呢?这个内容就简单粗暴了:以JOIN关键字做区分,关键字左边的被称为左表,关键字右边的被称为右表。

废话不多说,咱们直接上案例代码

为了显示效果的不同,我们先向class表中插入一条数据

insert into class (classname) values ('软件171');

3.1左连接

我们利用一下左连接,查出如下效果。

左连接的结果包括LEFT JOIN子句中指定的左表的所有记录,以及满足连接条件的记录。如果左表的某条记录在右表中不存在,则在右表中显示为空。

从实际的结果来看,显示了五条记录,并且软件171班没有记录在册的学生。

咱们同学开动一下脑筋,右连接应该有什么样的一个效果?

复合条件连接查询

符合条件查询就是在连接查询的过程中,通过添加过滤条件来限制查询结果,是查询结果更加精确。

本文多出自于传智播客教学内容。

mysql 三个表内连接查询_MySQL5.5多表之连接查询相关推荐

  1. mysql 5.5 查询_mysql5.5数据库优化--定位慢查询

    什么是慢查询 mysql记录下查询超过指定时间的语句,被称为"慢查询": 启动慢查询日志 1.查询是否把索引的SQL记录到慢查询日志中 SHOW VARIABLES LIKE 'l ...

  2. mysql 5.6 json查询_mysql5.6及以下版本如何查询数据库里的json

    MySQL里面保存数据有时候会把一些杂乱且不常用的时候丢进一个json字段里面 下面说说mysql存储json注意那些格式吧: 1:注意保存是中文不要变成转码的,转码之后导致查询非常麻烦,压缩时候后面 ...

  3. 银行术语之“表内”“表外”

    原帖发于我的blog:http://eyejava.javaeye.com/blog/38333 今天胡里胡涂又做了几张报表,忽然想起一年前也是在做类似的报表,但是似乎还是对每张报表的含义把握不到,不 ...

  4. 关于银行的表内与表外业务

    关于银行的表内与表外业务 一.什么是表内业务? 表内业务就是指在资产负债表上反映的业务.比如银行存款.贷款等. 二.什么是表外业务? 1.表外业务 表外(中间)业务是指不构成商业银行表内资产.表内负债 ...

  5. 商业银行的表内业务与表外业务

    表内业务和表外业务是从财务角度看的,表-指的是资产负债表.资产负债表是反映企业在某一特定日期全部资产.负债和所有者权益情况的会计报表.这里的特定日期是指月末.季末,或者年末等时点,不是一个时间段. 资 ...

  6. mysql 三个表内连接查询_MySQL多表查询详解

    多表查询 1. 表与表之间的关系 <1> 一对一 用户表和身份信息表,用户表是主表 男人表.女人表 create table man( mid int primary key auto_i ...

  7. Mysql连接查询主要分为三种:内连接、外连接、交叉连接

    Mysql 连接查询主要分为三种:内连接.外连接.交叉连接 内连接 使用比较运算符(包括=.>.<.<>.>=.<=.!>和!<)进行表间的比较操作,查 ...

  8. mysql 三个表的外连接方式,MySQL表连接使用详解,内连接,外连接,交叉连接

    本章节向大家介绍如何使用 MySQL 的 JOIN 在两个或多个表中查询数据. 前提如下供后面学习所用: 查看学生表的全部记录SELECT * FROM STUDENT; 查看地址表的全部记录:SEL ...

  9. MySQL 表的增删改查(进阶篇②)· 联合查询 内连接 外连接 · 自连接 · 子查询 exists · 合并查询 union

    接进阶篇①,我们继续学习. 一.联合查询 1.1 内连接 1.2 外连接 1.3 内连接和左右外连接的区别 二.自连接 三.子查询 3.1 单行子查询 3.2 多行子查询 使用 in 范围匹配多行 另 ...

最新文章

  1. js知识点 掘金_关于webpack4的14个知识点,童叟无欺
  2. pythontcp服务器框架_tcp服务器简单框架-python客户端
  3. 经验|博士毕业,也写一些发文章的心得
  4. 假笨说-从一起GC血案谈到反射原理
  5. vue-cli 3.0安装和使用
  6. url编码函数encodeURI和encodeURIComponent
  7. linux如何加载镜像,linux可以加载iso镜像文件到启动项吗
  8. 推流中转服务器,视频推流服务器EasyRTMPLive拉转推过程当中遇到复杂目的地址解决方法?...
  9. python getattr_深入浅出Python模块
  10. redis映射的概念_Redis存储总是心里没底?你大概漏了这些数据结构原理
  11. 基于php+Mysql新闻管理系统 开题报告
  12. 虚拟机建Mac系统步骤
  13. 反冲物料_父母有更多的时间休息,然后反冲开始了
  14. OSChina 初十乱弹 ——你明白好多道理 还是过不好这一生
  15. rrpp+ospf环网组建
  16. Linux内存管理(一):综述
  17. Jmeter(二十三) - 从入门到精通 - JMeter函数 - 上篇(详解教程)
  18. COB-ID的简单理解分析
  19. android+自定义键盘之汉字,android自定义键盘(解决弹出提示的字体颜色问题)
  20. c 程序设计语言标准库,C++程序设计语言(第4部分:标准库)(原书第4版) 中文pdf扫描版[86MB]...

热门文章

  1. java中assertEquals_Junit 测试: assertEquals的使用
  2. Linux Ubuntu 安装SSH远程登录工具
  3. PHPmailer发送邮件(以sina邮箱为例)
  4. 2021青海高考文综成绩查询,2021青海高考一分一段表汇总(文理科):青海高考位次查询2021...
  5. freeCodeCamp-响应式网页设计-制作一个致敬页
  6. 低版本Docker升级高版本Docker【详细教程、成功避坑】
  7. 行业领先公司和软件系统
  8. 解决SpringBoot8080端口被占用问题
  9. AI解读清明上河图--Caption Anything 细粒度可控的图像描述
  10. 如何在Ubuntu下使用QQ