一篇文章读懂MySQL的各种联合查询
联合查询是指将两个或两个以上的表的数据根据一定的条件合并在一起!
联合查询主要有以下几种方式:
- 全连接:将一张表的数据与另外一张表的数据彼此交叉联合查询出来
举例如下:
先建两张表:
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条数据
全连接测试:
可以看到,表的数据是79条,字段的个数是3+3个,不过这种查询没什么意义,让我们来看一下内连接;
-
内连接
内连接进行查询的过程是:将表A的数据一条一条拿出来跟表B的数据进行对比,满足条件的数据就保留下来
测试如下:
-
外连接:外连接有两种类型,左外连接和右外连接,外连接和内连接的区别是,无论表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的筛选语句,它其实是先筛选右表的数据,然后再用左表与剩余的右表数据进行连接查询
好了,今天的内容就到此为止了,后续会不断的更新,欢迎大家点赞关注!