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
设为主键,并将其设置为订单表的外键,完成订单表与用户表的关联,形成用户表与订单表一对多的关系
提示
之所以要设置主键,是为了确保数据唯一和建立表的索引。因为索引使用一种树结构,可以提高数据查询、新增和删除的效率。
内连接
这种连接查询方式,只会返回多个表中符合连接条件的数据,如果有一个表不符合连接条件,就都不返回。
比如上面的两张表数据,使用内连接查询,会查询出订单表中的两条数据及关联的user_id == 1001
的用户信息。
select * from order_info o inner join user u on u.id = o.user_id;
执行这条sql
语句返回的数据如下
总结
内连接查询,返回多个表的满足连接条件的数据,上面的语句中on u.id = o.user_id
就是两张表的查询条件
外连接
外连接又分为左外连接和右外连接,两者的区别在于左外连接的主表在左,右外连接的主表在右,即使多张表的联合查询不符合连接条件,也会返回主表全部的数据。还是以上面的用户表和订单表为例,还是和上面相同的表数据。
左外连接
select * from order_info o left join user u on u.id = o.user_id;
将inner
关键字修改为left
即为左外连接
因为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;
这次因为是以右表也就是user
表为主表,所以用户表的数据都返回,然后因为从表也就是订单表中符合连接条件的只有user_id == 1001
的数据,所以用户id
为1002
的订单数据不会被查出来,相关的列直接显示为NULL
。
总结
内连接只会返回多个表中符合连接条件的数据,如果只需要查询多张表中符合关联关系的数据就选择内连接
左外连接会返回左表中所有的数据和从表中符合连表条件的数据,所以如果需要左表中所有的数据时,选择使用左连接的查询方式
右外连接会返回右表中所有的数据和从表中符合连表条件的数据,所以如果需要右表中所有的数据时,选择使用右连接的查询方式