虽然开发中经常用到MySQL,但是感觉很多关于MySQL的相关知识仍然不太理解,比如MySQL的内连接和外连接,我理解的连接,就是在进行多表查询使用相关联的条件将多表联系起来,并根据条件查询各表中的和条件有关的全部内容或部分内容。
准备工作
根据如下sql语句执行,准备两张表beauty和boys:
CREATE DATABASE /*!32312 IF NOT EXISTS*/`girls` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `girls`;
DROP TABLE IF EXISTS `beauty`;
CREATE TABLE `beauty` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`sex` char(1) DEFAULT '女',
`borndate` datetime DEFAULT '1987-01-01 00:00:00',
`phone` varchar(11) NOT NULL,
`photo` blob,
`boyfriend_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;
/*Data for the table `beauty` */
insert into `beauty`(`id`,`name`,`sex`,`borndate`,`phone`,`photo`,`boyfriend_id`) values (1,'柳岩','女','1988-02-03 00:00:00','18209876577',NULL,8),(2,'苍老师','女','1987-12-30 00:00:00','18219876577',NULL,9),(3,'Angelababy','女','1989-02-03 00:00:00','18209876567',NULL,3),(4,'热巴','女','1993-02-03 00:00:00','18209876579',NULL,2),(5,'周冬雨','女','1992-02-03 00:00:00','18209179577',NULL,9),(6,'周芷若','女','1988-02-03 00:00:00','18209876577',NULL,1),(7,'岳灵珊','女','1987-12-30 00:00:00','18219876577',NULL,9),(8,'小昭','女','1989-02-03 00:00:00','18209876567',NULL,1),(9,'双儿','女','1993-02-03 00:00:00','18209876579',NULL,9),(10,'王语嫣','女','1992-02-03 00:00:00','18209179577',NULL,4),(11,'夏雪','女','1993-02-03 00:00:00','18209876579',NULL,9),(12,'赵敏','女','1992-02-03 00:00:00','18209179577',NULL,1);
/*Table structure for table `boys` */
DROP TABLE IF EXISTS `boys`;
CREATE TABLE `boys` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`boyName` varchar(20) DEFAULT NULL,
`userCP` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
/*Data for the table `boys` */
insert into `boys`(`id`,`boyName`,`userCP`) values (1,'张无忌',100),(2,'鹿晗',800),(3,'黄晓明',50),(4,'段誉',300);
内连接
如果是在查询两个表的情况下,内连接相当于查询两个表的交集。
如下图所示,内连接只查询两个表中相关的部分,其他不相关的部分不查询。
SELECT * from beauty be, boys bo WHERE be.boyfriend_id = bo.id
按照上面的查询,会查询出如下结果:
外连接
外连接分为左外连接和右外连接,是一个表作为主表的查询,查询时会将主表的所有数据都查询出来,再根据连接条件,查询出另一张表的一部分。
左外连接
左边是主表,表1 left join 表2 on 连接条件
左外连接:左表是主表,查询所有左表的记录,右表只查询符合连接条件的部分,右表中不符合连接条件的部分显示为空;
如下图:
左外连接会查询出所有的女生,包括没有男朋友的女生,没有男朋友的男朋友信息为null
SELECT * from beauty be LEFT JOIN boys bo ON be.boyfriend_id = bo.id
按照上面的查询,会查询出如下结果:
右外连接
右边是主表,表1 right join 表2 on 连接条件
右外连接:右表是主表,查询所有右表的记录,左表只查询符合连接条件的部分,其他为空,左表中不符合连接条件的 部分显示为空;
如下图:
SELECT * from beauty be right JOIN boys bo ON be.boyfriend_id = bo.id
按照上方的sql语句查询,会查询出所有的男生信息,不会查询出没有男朋友的女生信息,因此查询出来的只是部分女生的信息。
下面是查询的结果:
总结
根据这些查询和一些思考,我大致理解了MySQL的内连接和外连接,希望在以后的学习中,可以更好的理解和运用到这些知识。