位置: 编程技术 - 正文

MySQL多表数据记录查询详解(mysql如何实现多表查询)

编辑:rootadmin

推荐整理分享MySQL多表数据记录查询详解(mysql如何实现多表查询),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:mysql如何多表查询,mysql如何多表查询,mysql 多张表查询,mysql如何实现多表查询,mysql多表查询方式,mysql数据库多表查询的语法,mysql 多表,mysql 多表,内容如对您有帮助,希望把文章链接给更多的朋友!

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

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

在具体应用中,如果需要实现多表数据记录查询,一般不使用连接查询,因为该操作效率比较低。于是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.外连接查询: 外连接查询会返回所操作表中至少一个表的所有数据。外连接分为三类:左外连接、右外连接、全外连接

语法为:

MySQL多表数据记录查询详解(mysql如何实现多表查询)

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如何实现多表查询

本文链接地址:https://www.jiuchutong.com/biancheng/348257.html 转载请保留说明!

上一篇:wampserver下mysql导入数据库的步骤(wamp怎么用mysql)

下一篇:Mysql删除重复的数据 Mysql数据去重复(mysql删除重复字段)

  • 哪些企业需要缴纳企业所得税?
  • 增值税专票如何作废
  • 两地发工资个税处理
  • 预付款类发票可抵扣吗
  • 企业所得税退抵税费申请(汇算清缴)怎么撤销
  • 银行承兑贴现的会计分录怎么做
  • 税务机关六位地区编码是什么
  • 跨月的增值税普通发票开错了怎么办
  • 行政事业单位国有资产处置管理办法
  • 固定资产年数总额法
  • 冲减本年利润
  • 当月发票入库核销怎么算
  • 不属于抵扣范围的是什么
  • 营改增开票规定
  • 自制发票和增值税发票的区别是什么?
  • 小规模纳税人没有成本票怎么做账
  • 合同资产和工程存货的区别
  • 高技术制造企业
  • linux系统安装浏览器
  • mac os 10.15安装教程
  • 企业的债权资产
  • 辞职的补偿金怎么做账
  • 企业能公户往个人转账吗
  • 其他暂收和应付账款区别
  • 增值税专用发票怎么开
  • 公司收到补偿款是利好还是利空
  • 大家掌握的都很好 英语
  • 外籍人员一次性奖金
  • 税前扣除的比例
  • 个人信息提供者
  • ros urdf
  • php获取文件内容的函数
  • 公司账户的钱怎么少了
  • 纺织企业成本核算方案
  • react生命周期分为两类
  • 固定资产出租收入属于
  • 线程池中的一个线程执行完一个任务后
  • ffmpeg png to mp4
  • 增值税专票开户行账号错了,可以抵扣吗
  • 收到货款发货了没开发票怎么入账
  • 专票必须公对公打款吗
  • 企业技术服务费比例
  • 当月发生业务下月开票如何做账
  • 逾期未认证的增值税发票处理办法
  • 成本结转的凭证后附件是怎样的
  • 多缴所得税返还会计分录
  • 付款后没有发票怎么办
  • 公司安装监控属于什么费用
  • 租房公司报销发票怎么开
  • 车辆租赁费发票怎么开
  • sql server存储过程写法
  • windows 10预览版
  • Vista 目前的窘境5大原因分析
  • centos的特点
  • 电脑win7怎么样
  • ubuntu20.10桌面
  • ubuntu 4.10
  • linux的free
  • linux怎么用u盘传输文件
  • windows8怎么设置
  • xp显示缩略图
  • win10周年版
  • 怎么在win7系统看蓝牙
  • 在linux操作系统中
  • win7系统aero主题变成黑色
  • vr moke
  • 相片管理必备知识
  • javascript基础笔记
  • node.js中的http.response.writeHead方法使用说明
  • js继承原型链
  • shell脚本-lt
  • koa和express的区别
  • jquery的实现原理
  • 医保可以异地交嘛
  • 公务员副处级工资待遇
  • 新疆油田在哪个地方
  • "贴现"是什么业务,都涉及哪些费用?
  • 珠宝消费税怎么申报
  • 南京江宁汽车过户手续及费用
  • 刚出生的宝宝身长多少正常
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设