切换语言为:繁体

MySQL中的连表查询,内连接和外连接的使用及区别

  • 爱糖宝
  • 2024-08-27
  • 2056
  • 0
  • 0

sql查询是业务开发中的基础技术,在日常的开发中,单表的简单查询往往无法实现常规的业务需求,将所有的信息都放在一张表里存储也是不现实的,也不符合保证表中的每一列都和主键列直接相关,而不是间接相关的要求。

假设现在有一个用户表和一个订单表,订单表中可以存在关联用户表信息的字段,但是不能在订单表中创建有关用户的其他信息。如果想要查询订单和用户的信息,就可以使用连表查询来实现。

准备工作

创建一个用户表,包含用户名和密码字段

CREATE TABLE `user` (
  `id` int(11) NOT NULL,
  `username` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

创建一个订单表,包含订单的信息和用户的id

CREATE TABLE `order_info` (
  `id` int(11) NOT NULL COMMENT '唯一id',
  `order_no` varchar(255) DEFAULT NULL COMMENT '订单编号',
  `order_time` datetime DEFAULT NULL COMMENT '订单时间',
  `price` decimal(10,2) DEFAULT NULL COMMENT '订单金额',
  `user_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `用户id` (`user_id`),
  CONSTRAINT `用户id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

将用户表的id设为主键,并将其设置为订单表的外键,完成订单表与用户表的关联,形成用户表与订单表一对多的关系

提示
之所以要设置主键,是为了确保数据唯一和建立表的索引。因为索引使用一种树结构,可以提高数据查询、新增和删除的效率。

内连接

这种连接查询方式,只会返回多个表中符合连接条件的数据,如果有一个表不符合连接条件,就都不返回。

MySQL中的连表查询,内连接和外连接的使用及区别

MySQL中的连表查询,内连接和外连接的使用及区别

比如上面的两张表数据,使用内连接查询,会查询出订单表中的两条数据及关联的user_id == 1001的用户信息。

select * from order_info o inner join user u on u.id = o.user_id;

执行这条sql语句返回的数据如下

MySQL中的连表查询,内连接和外连接的使用及区别

总结
内连接查询,返回多个表的满足连接条件的数据,上面的语句中on u.id = o.user_id就是两张表的查询条件

外连接

外连接又分为左外连接和右外连接,两者的区别在于左外连接的主表在左,右外连接的主表在右,即使多张表的联合查询不符合连接条件,也会返回主表全部的数据。还是以上面的用户表和订单表为例,还是和上面相同的表数据。

左外连接

select * from order_info o left join user u on u.id = o.user_id;

inner关键字修改为left即为左外连接

MySQL中的连表查询,内连接和外连接的使用及区别

因为order_info表是左表(主表),所以所有的数据都可以查出来,又因为用户表中id == 1001的数据是符合连接条件的,所以用户id == 1001的数据也被成功返回。现在将left join修改为right join再看下查询结果

右外连接

select * from order_info o right join user u on u.id = o.user_id;

MySQL中的连表查询,内连接和外连接的使用及区别

这次因为是以右表也就是user表为主表,所以用户表的数据都返回,然后因为从表也就是订单表中符合连接条件的只有user_id == 1001的数据,所以用户id1002的订单数据不会被查出来,相关的列直接显示为NULL

总结

  • 内连接只会返回多个表中符合连接条件的数据,如果只需要查询多张表中符合关联关系的数据就选择内连接

  • 左外连接会返回左表中所有的数据和从表中符合连表条件的数据,所以如果需要左表中所有的数据时,选择使用左连接的查询方式

  • 右外连接会返回右表中所有的数据和从表中符合连表条件的数据,所以如果需要右表中所有的数据时,选择使用右连接的查询方式

0条评论

您的电子邮件等信息不会被公开,以下所有项均必填

OK! You can skip this field.