一篇文章读懂MySQL的各种联合查询

一篇文章读懂MySQL的各种联合查询

联合查询是指将两个或两个以上的表的数据根据一定的条件合并在一起!

联合查询主要有以下几种方式:

  1. 全连接:将一张表的数据与另外一张表的数据彼此交叉联合查询出来
    举例如下:
    先建两张表:
CREATE TABLE `t_dept` (`id` int(11) NOT NULL AUTO_INCREMENT,`deptName` varchar(30) DEFAULT NULL,`address` varchar(40) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8`
CREATE TABLE `t_emp` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(20) DEFAULT NULL,`age` int(3) DEFAULT NULL,`sex` varchar(255) DEFAULT NULL COMMENT '性别',`deptId` int(11) DEFAULT NULL,PRIMARY KEY (`id`),KEY `fk_dept_id` (`deptId`)
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8

插入数据:

INSERT INTO `t_emp` (`id`, `name`, `age`, `sex`, `deptId`) VALUES ('3', '令狐冲', '24', NULL, '1');
INSERT INTO `t_emp` (`id`, `name`, `age`, `sex`, `deptId`) VALUES ('4', '洪七公', '70', NULL, '2');
INSERT INTO `t_emp` (`id`, `name`, `age`, `sex`, `deptId`) VALUES ('5', '乔峰', '35', NULL, '2');
INSERT INTO `t_emp` (`id`, `name`, `age`, `sex`, `deptId`) VALUES ('6', '灭绝师太', '70', NULL, '3');
INSERT INTO `t_emp` (`id`, `name`, `age`, `sex`, `deptId`) VALUES ('7', '周芷若', '20', NULL, '3');
INSERT INTO `t_emp` (`id`, `name`, `age`, `sex`, `deptId`) VALUES ('8', '张三丰', '100', NULL, '4');
INSERT INTO `t_emp` (`id`, `name`, `age`, `sex`, `deptId`) VALUES ('9', '张无忌', '25', NULL, '5');
INSERT INTO `t_emp` (`id`, `name`, `age`, `sex`, `deptId`) VALUES ('10', '韦小宝', '18', NULL, NULL);
INSERT INTO `t_emp` (`id`, `name`, `age`, `sex`, `deptId`) VALUES ('26', 'lin', '12', NULL, '12');
INSERT INTO `t_dept` (`id`, `deptName`, `address`) VALUES ('1', '华山', '华山');
INSERT INTO `t_dept` (`id`, `deptName`, `address`) VALUES ('2', '丐帮', '洛阳');
INSERT INTO `t_dept` (`id`, `deptName`, `address`) VALUES ('3', '峨眉', '峨眉山');
INSERT INTO `t_dept` (`id`, `deptName`, `address`) VALUES ('4', '武当', '武当山');
INSERT INTO `t_dept` (`id`, `deptName`, `address`) VALUES ('5', '明教', '光明顶');
INSERT INTO `t_dept` (`id`, `deptName`, `address`) VALUES ('6', '少林', '少林寺');
INSERT INTO `t_dept` (`id`, `deptName`, `address`) VALUES ('7', '华山', '北京');

全连接是将表1的数据一条一条的与表2的数据进行拼接,产生table1table2条数据
全连接测试:

可以看到,表的数据是7
9条,字段的个数是3+3个,不过这种查询没什么意义,让我们来看一下内连接;

  1. 内连接
    内连接进行查询的过程是:将表A的数据一条一条拿出来跟表B的数据进行对比,满足条件的数据就保留下来
    测试如下:
    在这里插入图片描述

  2. 外连接:外连接有两种类型,左外连接和右外连接,外连接和内连接的区别是,无论表A与表B是否有符合条件的数据,主表都会保留,这里的主表是指左连接时左边的表,右连接时右边的表;
    1). 左连接:关键字是left join,直接看数据,更好理解
    在这里插入图片描述
    可以看到,左表(主表)的数据都保留下来了

2). 右连接
在这里插入图片描述
可以看到,右表(主表)的数据都保留下来了

介绍一下using关键字:

连接过程:
1、在进行连接查询中,使用on的地方就可以用using来代替,不过前提是,进行联合的条件的字段是同名的
2、如果使用using关键字来进行联合,最终相同的字段只会显示一个!
在这里插入图片描述

left join后面的筛选语句用where和on的区别:
其实主要就是sql语句执行的顺序不同,导致执行的结果也不一样,大家记得留意这个问题,很容易踩坑,where语句执行比on偏后,所以使用where来筛选其实就是联合查询之后再进行筛选的。下面举个例子:(还是使用上面的数据)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
第一个是不带where和and 的左连接,上面已经介绍,这里不再赘述
第二个是带where语句,可以看到,其实就是再第一个的基础上进行筛选
第三个和第四个是带on语句,我们可以看到带on语句之后,left join左边的表是没变化的,都是全表,而left join右边的表却得到筛选了,为什么会这样?这是因为on的执行顺序在join执行顺序之前,见下图:
左边的数字代表执行顺序
所以就算添加了on的筛选语句,它其实是先筛选右表的数据,然后再用左表与剩余的右表数据进行连接查询

好了,今天的内容就到此为止了,后续会不断的更新,欢迎大家点赞关注!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558813.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一篇文章看懂@Scheduled定时器/@Async/CompletableFuture

一篇文章看懂Scheduled定时器/Async/CompletableFuture Scheduled注解解析: 1.cron:最重要的一个参数 cron表达式[秒] [分] [小时] [日] [月] [周] [年]([年]可省略) 简单了解一下,网上有现成的工具 示例&#xff…

一篇搞懂HTTP协议

本文转自 :flyhero 码上实战《一个HTTP打趴80%面试者》 HTTP协议简介 HTTP(超文本传输协议)是应用层上的一种客户端/服务端模型的通信协议,它由请求和响应构成,且是无状态的。(暂不介绍HTTP2) 协议&…

Jackson高级操作————节点树

引言 继《Jackson快速入门》基础篇之后的树模型相关操作。 节点树模型 ObjectMapper构建JsonNode节点树,类似于DOM解析器的XML。 Testpublic void testJsonTree() throws JsonProcessingException, IOException {String jsonString "{\"name\":\…

Jackson高级操作————流式API与JsonGenerator、JsonParser

引言 继《Jackson快速入门》之后的高级相关操作。 Jackson提供了一种对于性能要求应用程序操作json更加高效的方式——流式API,这种方式开销小,性能高,因此,如果应用程序或者程序逻辑对于性能有一定要求,可以使用这种…

Mysql高级教程思维导图

Mysql高级教程思维导图 1、思维导图总览: 2、MySQL架构介绍: 2.1、MySQL简介 2.2、MySQL Linux版安装 2.3、MySQL配置文件 2.4、MySQL逻辑架构介绍 2.5、MySQL存储引擎 2.6、MySQL的用户和权限管理 2.7、MySQL一些杂项配置 ’ 3、索引优化分析 3.1、性…

Eclipse(STS 4)闪退导致EGit插件异常

引言 到目前为止,STS已经闪退过三次了。 问题很棘手,我需要冷静。 首先出现了一个问题就是,EGit无法commit。 第二个问题是切换分支报错。 闪退重启后EGit无法提交代码 观察闪退出现的时机,一般出现在我 commit 代码的时候&…

spring源码分析第二天------spring系统概述以及IOC实现原理

1、Spring5 概述 Spring 是一个开源的轻量级 Java SE(Java 标准版本)/Java EE(Java 企业版本)开发应用框架, 其目的是用于简化企业级应用程序开发。 Spring 框架除了帮我们管理对象及其依赖关系,还提供像通…

Linux进阶之路————Linux概述

引言 Linux是一个开源、免费的操作系统。学习Linux知识分为以下几个阶段: 第一阶段:Linux环境下的基本操作命令,包括文件操作命令(rm、mkdir、chmod、chown)编辑工具使用(vi、vim)Linux用户管…

spring源码分析第三天------spring核心IOC容器和依赖注入原理

基于XML的依赖注入 1、依赖注入发生的时间 当 Spring IOC 容器完成了 Bean 定义资源的定位、载入和解析注册以后,IOC 容器中已经管理类 Bean 定义的相关数据,但是此时 IOC 容器还没有对所管理的 Bean 进行依赖注入,依赖注入在以下两种情况 …

JavaWeb中监听器Listener+过滤器filter+拦截器interceptor区别

JavaWeb中监听器Listener过滤器filter拦截器interceptor区别 如果从整个项目中看,一个servlet请求的执行过程就变成了这样context-param–>listener–>filter–>servlet–>interceptor(指的是拦截器) 1.概念 context-param:就是一些需要初…

Linux进阶之路————开机、重启和用户登录注销

关机、重启命令 shutdown 命令: 1)shutdown -h now 立即关机 2)shutdown -h 1 1分钟之后关机 3)shutdown -r now 立即重启 reboot 命令,直接使用,表示立即重启 halt 命令&am…

spring源码分析第四天------springmvc核心原理及源码分析

spring源码分析第四天------springmvc核心原理及源码分析 1、基础知识普及 2、 SpringMVC请求流程 3、SpringMVC代码流程 4、springMVC源码分析 4.1 4.2 4.3 5、Spring MVC 的优化 补充: SpringMVC经典设计是handlerMapping,大家可以看一…

Linux进阶之路————用户管理

引言 前面几篇关于Linux的已经大概领略了Linux的风采,本篇用户管理,将着重总结日常工作中,非常重要的用户管理功能。 主要包括:新增用户、删除用户、查询用户信息、指定/修改密码、切换用户、用户组,以及与用户管理相…

spring源码分析第五天------springAOP核心原理及源码分析

spring源码分析第五天------springAOP核心原理及源码分析 1、 面向切面编程。可以通过预 编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术 切面(Aspect) 连接点(Joinpoint) 通知&#x…

Linux进阶之路————Linux运行级别(重置密码)

引言 前面的《Linux进阶之路————开机、重启和用户登录注销》已经简单介绍过Linux系统运行级别的概念,今天来详细介绍和总结一下Linux的运行级别。 inittab配置文件 在配置文件目录下有一个inittab文件/etc/inittab,用于专门存储系统的运行级别&am…

Linux问题处理————命令提示符显示 bash-4.1# 解决方案

引言 本文系Linux学习过程中的一个小插曲。 在使用root用户创建了一个普通的tom 用户之后,系统莫名其妙卡死,重启后,发现命令提示符不再是 “用户名 目录”这种组合,而变成了 bash-4.1# 开头: 解决办法 将/etc/ske…

spring源码分析第六天------spring经典面试问题

spring源码分析第六天------spring经典面试问题 1、Spring5 新特性及应用举例 2、Spring 经典的面试问题 a、什么是 Spring 框架?Spring 框架有哪些主要模块? Spring 框架是一个为 Java 应用程序的开发提供了综合、广泛的基础性支持的 Java 平台。Spr…

Linux进阶之路————scp指令介绍与演示

引言 目前市场上很多终端软件都自带文件传输功能,且多为图形化界面,操作简单无脑。但是本着“指令最高端,拖拽贼JBLow”的原则,今天学习一下文件传输的命令:scp 操作演示 准备两台linux服务器 (我的是弄…

Mybatis源码分析第一天------Mybatis实用篇

Mybatis源码分析第一天------Mybatis实用篇 一切最基本的操作就是参考官方文档:https://mybatis.org/mybatis-3/zh/configuration.html 1、是什么 什么是 MyBatis? a、MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级…

深入理解Tomcat和Jetty源码之第一篇前奏知识

深入理解Tomcat和Jetty源码之第一篇前奏知识 这周开始对Tomcat和Jetty的源码和框架产生了浓厚的兴趣,接下来想记录一下学习Tomcat和Jetty源码的心得和体会,有兴趣的朋友可以关注一下,我主要以思维导图的方式来展现整体的学习思路~ 今天的整体…