题目描述:
1.已知Person表(如图1)每行代表一个人的信息,列包括:个人Id(PersonId),姓名(Name)。
2.已知Address表(如图2)每行代表一个人的居住城市信息,列包括:地址Id(AddressId),个人Id(PersonId),城市名称(City)。
3.请编写SQL语句,实现查询所有人的居住城市信息(如图3)。查询要求:组合查询上述两表。
3.1.只显示两张表中都符合查询条件的信息(内连接):例如Address表中没有王五的居住信息,则不显示王五的查询结果。
3.2.左表的信息显示全(左外连接):例如Address表中没有王五居住信息,则依然显示王五,但王五的居住信息显示为NULL。
欢迎大家转发,一起传播知识和正能量,帮助到更多人。辛苦大家转发时注明出处(也是咱们公益编程交流群的入口网址),刘经纬老师共享知识相关文件下载地址为:http://liujingwei.cn
解题思路:
1.内连接组合查询:Address表中的PersonId是Person表的外关键字,所以我们可以连接这两个表来获取某人的地址信息。
2.左外连接组合查询:如果采用内连接(如图4),会过滤掉没有不在Address表中的人。应该把Person表当作左表,采用左外连接(如图5)的方式进行查询,可以保留所有人的信息。
SQL语句:
1.组合查询(内连接):
select Name,City from Person p inner join Address a on p.PersonId=a.PersonId;
2.组合查询(左外连接):
select Name,City from Person p left join Address a on p.PersonId=a.PersonId;
补充知识(详情见图6-9):
1.内连接(inner join/join)
两个表a和b中分别各有一列a.c1和b.c2,这两列都是学号。将两个表中满足a.c1==b.c2的行组成一个新行,例如:学生表和成绩表,将学号相同的行组成一个新行,则新行中包括:学号(两个表都有)、姓名(来自学生表)、成绩(来自成绩表)。
2.外连接
2.1左外连接(left join)
左外连接将返回左表(a表)中的所有行。如果a.c1中包含b.c2中没有的值X,则在结果集中,a.c1=X所在行中,与b表相关的列将显示为NULL。
2.2右外连接(right join)
右外连接将返回右表(b表)中的所有行。如果b.c2中包含a.c1中没有的值Y,则在结果集中,b.c2=Y所在行中,与a表相关的列将显示为NULL。
2.3全外连接(full join)
全外连接返回左表(a表)和右表(b表)中的所有行,当a.c1和b.c2中包含对方不存在的值时,则在结果集中,对方表中的列将显示为NULL。
3.交叉连接(cross join)
又称笛卡尔积,返回左表中的每一行与右表中的每一行的所有组合结果。
期待大家提出宝贵建议,互相交流,收获更大