在实际应用中,经常需要实现在一个查询语句中显示多张表的数据,这就是所谓的多表数据记录连接查询,简称来年将诶查询。

在具体实现连接查询操作时,首先将两个或两个以上的表按照某个条件连接起来,然后再查询到所要求的数据记录。连接查询分为内连接查询和外连接查询。

在具体应用中,如果需要实现多表数据记录查询,一般不使用连接查询,因为该操作效率比较低。于是MySQL又提供 了连接查询的替代操作,子查询操作。

1.关系数据操作:在连接查询中,首先需要对两张或两张以上的表进行连接操作。连接操作是关系数据操作中专门用于数据操作的关系运算。

1.1 并(UNION):

在SQL语言中存在一种关系数据操作,叫做并操作。“并”就是把具有相同字段数目和字段类型的表合并到一起。通过并操作将两张表的数据记录合并到一起,合并后的字段数为 表1的字段数或者表2的字段数;合并后的总记录数为:表1的记录数 + 表2的记录数 - 表1和表2 重复的记录数。

1.2 笛卡尔积(CARTESIAN PRODUCT):

在SQL语言中存在一种关系数据操作,叫做笛卡尔积操作。笛卡尔就是没有连接条件,表中的数据任意的组合。笛卡尔积的字段数为 表1的字段数 + 表2的字段数。笛卡尔积的记录数为:表1的记录数 * 表2的记录数。

1.3 内连接(INNER JOIN):

为了便于操作,专门提供了一种针对数据库操作的运算—连接(JOIN)。所谓连接就是在表关系的笛卡尔积数据记录中,按照相应字段值的比较条件进行选择生成一个新的关系。连接又分为内连接(INNER JOIN)、外连接(OUTER JOIN)、交叉连接(CROSS JOIN)。

所谓内连接,就是在表关系的笛卡尔积数据中,保留表关系中所有匹配的数据记录,舍弃不匹配的数据记录。按照匹配的条件可以分成自然连接、等值连接和不等连接。

1.3.1 自然连接(NATURAL JOIN):

自然连接就是在表关系的笛卡尔积中,首先根据表关系中相同名称的字段自动进行记录匹配,然后去掉重复的字段。

通过自然连接后,新关系的字段数为:表1字段数 + 表2字段数 - 表1和表2中的重复字段数。自然连接后新关系的记录数为:表1的记录数 * 表2的记录数 - 表1和表2相同字段的值不相等记录数。

自然连接又如下特点:

1. 在具体执行自然连接时,会自动判断相同名称的字段,然后进行数据值的匹配。

2. 在执行完自然连接的新关系中,虽然可以指定包含哪些字段,但是不能指定执行过程中的匹配条件,即哪些字段的值进行匹配。

3. 在执行自然连接的新关系中,执行过程中所匹配的字段名只有一个,即会去掉重复字段。

1.3.2 等值连接:

所谓等值连接操作就是表关系的笛卡尔积中,选择所匹配字段值相等的数据记录。

通过等值连接后,新关系的字段数为:表1字段数 + 表2字段数。等值连接后新关系的记录数为:表1的记录数 * 表2的记录数 - 表1和表2相同字段的值不相等记录数。

与自然连接相比,等值连接操作需要在执行过程中用“=”指定匹配条件,在新关系中不会去掉重复字段。

1.3.3 不等连接:

所谓不等连接操作就是表关系的笛卡尔积中,选择所匹配字段值不相等的数据记录。

通过不等连接后,新关系的字段数为:表1字段数 + 表2字段数。等值连接后新关系的记录数为:表1的记录数 * 表2的记录数 - 表1和表2相同字段的值相等的记录数。

与自然连接相比,等值连接操作需要在执行过程中用“!=”指定匹配条件,在新关系中不会去掉重复字段。

1.4 外连接(OUTER JOIN):

所谓外连接(OUTER JOIN),就是在表关系的笛卡尔积数据记录中,不仅保留表关系中所有匹配的数据记录,而且还会保留部分不匹配的数据记录。按照保留不不匹配条件数据记录来源可以分为:左外连接、右外连接、全外连接。

1.4.1 左外连接:

所谓左外连接操作就是表关系的笛卡尔积中,除了选择相匹配的数据记录,还包含关联左边表中不匹配的数据记录。

通过左外连接后,新关系的字段数为:左表字段数 + 右表字段数。左外连接后新关系的记录数为:左表的记录数 * 右表的记录数 - 左表和右表相同字段的值不相等的记录数 + 左表中未匹配的记录数。

1.4.2 右外连接:

所谓右外连接操作就是表关系的笛卡尔积中,除了选择相匹配的数据记录,还包含关联右边表中不匹配的数据记录。

通过右外连接后,新关系的字段数为:左表字段数 + 右表字段数。右外连接后新关系的记录数为:左表的记录数 * 右表的记录数 - 左表和右表相同字段的值不相等的记录数 + 右表中未匹配的记录数。

1.4.3 全外连接:

所谓右外连接操作就是表关系的笛卡尔积中,除了选择相匹配的数据记录,还包含关联左右两边表中不匹配的数据记录。

通过全外连接后,新关系的字段数为:左表字段数 + 右表字段数。全外连接后新关系的记录数为:左表的记录数 * 右表的记录数 - 左表和右表相同字段的值不相等的记录数 + 左表未匹配的记录数 + 右表中未匹配的记录数。

2.内连接查询:

在MySQL中实现连接查询有两种语法:

1. 在from子句中利用逗号区分多个表,在where子句中通过逻辑表达式来实现匹配条件,从而实现表的连接。

2. ANSI连接语法形式,在from子句中使用“join on”关键字,而连接条件写在关键字on子句中。推荐使用第二种方式。

按照匹配条件,内连接查询可以分为两类:等值连接;不等连接。

内连接查询语法为:

//参数filedn 表示所要查询的字段名称,来源于所连接的表join_tablename1 和 join_tablename2,关键字inner join表进行内连接,join_condition表示进行匹配的条件。

2.1 自连接:

内连接查询中存在一种特殊的等值连接—自连接。所谓自连接就是指表与其自身进行连接。

示例(查询每个雇员的姓名、职位、领导姓名):

2.2等值连接:

内连接查询中的等值连接,就是在关键字on后的匹配条件中通过等于关系运算符“=”来实现等值条件。

示例:

2.3不等连接:

内连接查询中的不等连接,就是在关键字on后的匹配条件中通过除了等于关系运算符来实现不等条件外,可以使用的关系运算符包含> >= < <= !=

示例:

3.外连接查询:

外连接查询会返回所操作表中至少一个表的所有数据。外连接分为三类:左外连接、右外连接、全外连接

语法为:

3.1左外连接:

外连接查询中的左外连接,就是指新关系中执行匹配条件时,以关键字left join 左边的表为参考。

示例:

3.2右外连接:

外连接查询中的右外连接,就是指新关系中执行匹配条件时,以关键字right join 右边的表为参考。

4.合并查询数据记录:

在MySQL中通过关键字UNION来实现并操作,即可以通过其将多个select语句的查询结果合并在一起组成新的关系。

1. 关键字union的合并操作

关键字union会把查询结果集直接合并在一起,同时将会去掉重复数据记录。

2. 关键字union all的合并操作

关键字union all会把查询结果集直接合并在一起。

语法为:

5.子查询:

在MySQL中虽然可以通过连接查询实现多表查询数据记录,但却不建议使用。这是因为连接查询的性能很差。因此出现了连接查询的替代者子查询。推荐使用子查询来实现多表查询数据记录。

5.1 为什么使用子查询:

在日常开发中,经常接触到查询多表数据记录操作,例如查询部门表t_dept和雇员表t_employee表的数据记录。对于新手,直接使用select * from t_dept t,t_employee e where t.deptno=e.deptno;这条sql语句在执行时,首先会对两个表进行笛卡尔积操作,然后在选取符合匹配条件的数据记录。如果两张表的数据量较大,则在进行笛卡尔积操作时会造成死机。有经验的开发者通常会首先用统计函数查看操作表笛卡尔积后的数据记录数,然后再进行多表查询。因此多表查询一般会经过如下步骤:

1. 通过统计函数count(1)查询所关联表笛卡尔积后的数据的记录数。然后再进行多表查询。

2. 如果查询到的数据记录数mysql可以接受,然后再进行多表查询,否则就应该考虑通过其他方式来实现。

如果笛卡尔积后的数据远远大于mysql软件可以接受的范围,为了解决多表查询,mysql提供了子查询来实现多表查询。

所谓子查询,就是指在一个查询中嵌套了其他若干查询,即在一个select 查询语句的where或from子句中包含另一个select查询语句。在查询语句中,外层select查询语句称为主查询,where子句中select查询语句被称为子查询,也被称为嵌套查询。

通过子查询可以实现多表查询,该查询语句中可能包含in,any,all,exists等关键字。除此之外还可能包含比较运算符。理论上子查询可以出现在查询语句的任何位置,但在实际开发中,子查询经常出现在where或from子句中。

where子句中的子查询,该位置处的子查询一般返回单行单列、多行多列、单行多列数据记录。

from子句中的子查询,该位置处的子查询一般返回多行多列数据记录,可以当作一张临时表。

5.2 返回结果为单行单列和单行多列子查询:

当子查询的返回结果为单行蛋类数据记录时,该子查询语句一般在主查询语句的where子句中,通常会包含比较运算符(> < = != 等)

5.2.1 单行单列子查询:

示例(工资比Smith高的全部雇员信息):

5.2.2 单行多列子查询:

where子句中的子查询除了是返回单行单列的数据记录外,还可以是返回多行多列的数据记录,不过这种子查询很少出现。

示例(工资和职位和Smith一样的全部雇员):

5.3 返回结果为多行单列子查询:

当子查询的返回结果为多行单列数据记录时,该子查询语句一般会在主查询语句的where子句中出现,通常会包含IN ANY ALL EXISTS等关键字。

5.3.1 带有关键字in的子查询:

当主查询的条件在子查询的查询结果中时,可以通过关键字in来进行判断。相反,如果想实现主查询的条件不在子查询的查询结果中时,可以通过关键字not in来进行判断。

示例:

5.3.2 带有关键字any的子查询:

关键字any:主查询的条件为满足子查询的查询结果中任意一条数据记录,该关键字有三种匹配方式;

1. =any:其功能与关键字in一样

2. > any(>=any):只要大于(大于等于)子查询中最小的一个即可。

3. < any(<=any):只要小于(小于等于)子查询中最大的一个即可。

示例(查询雇员工资不低于职位为manager的工资):

5.3.3 带有关键字all的子查询:

关键字all用来表示主查询的条件为满足子查询返回查询结果中所有数据记录,有两种匹配方式:

1. > all(>=all):比子查询结果中最大的还要大(大于等于)的数据记录;

2. < all(<= all):比子查询结果中最小的还要小(小于等于)的数据记录。

示例:

5.3.4 带有关键字exists的子查询:

关键字exists是一个boolean类型,当能返回结果集时为true,不能返回结果集时为false。查询时exists对外表采用遍历方式逐条查询,每次查询都会比较exists的条件语句,当exists里的条件语句返回记录行时则条件为真,此时返回当前遍历到的记录;反之,如果exists里条件语句不能返回记录行,则丢弃当前遍历到的记录。

5.4 返回结果为多行多列子查询:

当子查询的返回结果为多行多列数据记录时,该子查询语句一般会在主查询语句的from子句里,被当作一张临时表的方式来处理。

示例(查询雇员表中各部门的部门号、部门名称、部门地址、雇员人数、和平均工资):

通过内连接来实现:

通过子查询来实现:

mysql 查询多个记录查询_MySQL多表数据记录查询详解相关推荐

  1. mysql数据库实验查询_MySQL数据库表数据的查询操作实验

    实验3.MySQL数据库表数据的查询操作实验(1) 一.实验目的 掌握SELECT 语句的基本语法格式. 掌握SELECT 语句的执行方法. 掌握SELECT 语句的 GROUP BY 和 ORDER ...

  2. java 修改mysql数据库表结构_MYSQL数据库表结构优化方法详解

    摘要:这篇MySQL栏目下的"MYSQL数据库表结构优化方法详解",介绍的技术点是"mysql数据库表结构.MySQL数据库.数据库表结构.MySQL.据库表结构.数据库 ...

  3. mysql 一对多 右表多条记录合并_MYSQL 单表一对多查询,将多条记录合并成一条记录...

    一.描述: 在MySQL 5.6环境下,应工作需求:将一个表中多条某个相同字段的其他字段合并(不太会表达,有点绕,直接上图) 想要达到的效果: 实现SQL语句: SELECT a.books, GRO ...

  4. mysql多表成绩查询_MySQL多表数据记录查询(一)

    1.交叉连接SQL语句的语法结构如下: select * from表1 cross join 表2; 或 Select * from表1,表2; 2.内连接SQL语句有两种表示形式: 使用inner ...

  5. mysql in从数据库取数_MySQL数据库中 where in 用法详解

    本文主要向大家介绍了MySQL数据库中 where in 用法详解,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 这里分两种情况来介绍 WHERE column IN (valu ...

  6. mysql中数据库字段类型长度_Mysql数据库字段数据类型、长度详解

    一.数值类型 列类型 需要的存储量 TINYINT 1 字节 SMALLINT 2 个字节 MEDIUMINT 3 个字节 INT 4 个字节 INTEGER 4 个字节 BIGINT 8 个字节 F ...

  7. mysql 删除的三种方法_mysql 删除表数据的三种方法

    先说那三个:drop.truncate.delete 1.drop 删除所有表结构和数据 drop table tableName: 2.truncate 删除表所有数据,不删除表结构,不能添加whe ...

  8. mysql外键检查的作用_MySQL外键使用及说明详解

    一.外键约束 MySQL通过外键约束来保证表与表之间的数据的完整性和准确性. 外键的使用条件: 1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持 ...

  9. mysql批量删除数据sql语句_mysql批量删除数据sql语句详解

    1.like与 in批量删除指定记录 like语法 like主要是用来模糊查询了 sql = "delete from A where field like '%ABC%'" 这个 ...

最新文章

  1. 面向JavaScript开发人员的Adobe AIR与Dreamweaver
  2. 独家 | 从全方位为你比较3种数据科学工具的比较:Python、R和SAS(附链接)
  3. ESP32 One-Wire驱动功能
  4. GitHub高赞:给文字打马赛克=形同虚设,AI看透你一切小心思,已开源
  5. Python 统计列表中元素出现的次数
  6. 请求服务器 显示非法访问,访问负载均衡出现访问host非法
  7. Echarts开源可视化库学习(三)主题的使用
  8. python桌面开发吐血_Python3环境(Windows10)单独配置Spyder——记录我的吐血之路...
  9. Flask项目--预防csrf攻击原理
  10. 直播强势来袭:Oracle nologgiing;数据库上云;国产数据库比对
  11. 1006.复制打开他人的clion工程错误
  12. 比 TensorFlow Lite 快 15.6 倍!业界首个移动 GPU BNN 加速引擎 PhoneBit 开源
  13. UTL_FILE学习
  14. Spring Cloud Eureka详解
  15. 物料编码是计算机识别和检索物料的( ),物料编码是计算机识别和检索物料的
  16. maxscale mysql_Maxscale实现Mysql读写分离
  17. 写引流和游戏脚本用什么语言和工具好?网上都有哪些脚本语言?
  18. 如何求复数的模用计算机,Excel怎么计算复数? Excel对复数进行加减乘除指数对数模的教程...
  19. iOS Presenting view controllers on detached view controllers is discouraged
  20. Java基于springboot +vue网上超市购物网站 多商家

热门文章

  1. 涅槃重生,BitKeep如何闯出千万用户新起点
  2. javaScript开发扫雷游戏
  3. response.setHeader()几个主要头的作用
  4. 苹果付费分享《十三煞》
  5. 多媒体个人计算机硬件,多媒体个人年终工作总结
  6. c程序设计语言的opds书源,推荐几个opds中文书源,谢谢!?
  7. LiveGBS GB28181流媒体服务
  8. 154 spidev:SPI“万能”驱动
  9. 菜鸟教程-C语言经典100示例(前50)
  10. 谈好的每个月工资21k,入职后却成4000元,工作7天后被辞退