通过本题的练习,你将了解表之间连接的逻辑,另外对于业务中取数时审题的重要性以及取数时对代码优化的必要性
题目如下:
编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:
FirstName, LastName, City, State
表1: Person
+-------------+---------+
| 列名 | 类型 |
+-------------+---------+
| PersonId | int |
| FirstName | varchar |
| LastName | varchar |
+-------------+---------+
PersonId 是上表主键
-------------------------------------------------------------------
表2: Address
+-------------+---------+
| 列名 | 类型 |
+-------------+---------+
| AddressId | int |
| PersonId | int |
| City | varchar |
| State | varchar |
+-------------+---------+
AddressId 是上表主键
解答一(Mysql):
SELECTa.FirstName,a.LastName,b.City,b.State FROMPerson aLEFT JOIN Address b ON a.PersonId = b.PersonId
1)注意审题: 题目说:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息: FirstName, LastName, City, State 也就是说,地址信息(City, State)的查询结果是Null是OK的。但是,姓名(FirstName, LastName)必须有。
2) 为啥不用Where? 因为where的实质就是根据你给的条件(personID相等),选取两表的公共部分。但是,因为PERSON表不是所有人都有地址信息的,但是ADDRESS表只显示有地址信息的人,这样选取出来的就是有地址信息的人,漏掉了没有地址信息的人。所以大家注意,where的本质就是过滤。
3) 如何连接?应该用PERSON表左连接(left join)ADDRESS表,保留person表的所有信息
解答二(Mysql代码优化):
SELECTA.FirstName,A.LastName,B.City,B.State FROMPerson ALEFT JOIN ( SELECT DISTINCT PersonId, City, State FROM Address ) B ON A.PersonId = B.PersonId;
这样做的好处是,在数据量特别大而且重复量也特别大时,可以节省join次数,从而节省效率。
后记:
自身经历,在做数据分析的相关工作时,取数是分析的前提,但是公司的一些业务数据一般是分库分表的,怎样才能在多张表中取出我们想要的数据呢?
这就要运用到以上练习中运用到的SQL表连接相关知识点,实际工作中更是运用广泛。
以电商公司为例:
公司的产品销售数据一般分为:产品表,销售表,地区表,人员表等;单个表中的数据价值是有限的,根据业务及实际需求,多张表之间的多维数据更能挖掘出有价值的信息,并且熟练有效的运用SQL中的表连接对于数据相关人员进行数据分析的必要利器,因此大家需要熟练掌握。
这里提供相关练习网址:https://leetcode-cn.com/problemset/database/
供大家更好的提升,共勉!
也欢迎志同道合的朋友共同交流学习!