SQL表联结 175.组合两个表

题目

表1: Person

±------------±--------+
| 列名 | 类型 |
±------------±--------+
| PersonId | int |
| FirstName | varchar |
| LastName | varchar |
±------------±--------+
PersonId 是上表主键
表2: Address

±------------±--------+
| 列名 | 类型 |
±------------±--------+
| AddressId | int |
| PersonId | int |
| City | varchar |
| State | varchar |
±------------±--------+
AddressId 是上表主键

编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:

FirstName, LastName, City, State

题解

mysql:
select FirstName, LastName, City, State
from person left join address on person.personid = address.personid
oracle:
select FirstName, LastName, City, State
from Person p,Address a where p.personid = a.personid(+)

本题要点

了解 mysql 的执行顺序
了解 join 和 left join的区别
了解 left join 的运行过程

1.了解mysql执行顺序
from1			选定表1

join2			选定表2,表1和表2构成笛卡尔积

on   条件       		利用on的条件,对笛卡尔积进行数据筛选

where 条件      		根据where条件再次筛选

group by 字段名 		按照选定的字段名对上述结果再进行分组

聚合函数(字段名)		利用聚合函数,对分组后的数据进行处理

having  聚合结果    		根据某个条件,对分组结果进行筛选

select  字段名      		选取需要的字段

distinct            		对被选取的字段进行去重

order by 字段名      		按照某个字段进行排序  

limit 5             		选取5行记录
2. join 和 left join 说明

left join 左表为主,根据条件查询右表数据,如果查询右表数据不存在,则使用null值填充。

join = inner join 内联结或等值联结,获取两个表中字段匹配关系的记录。

oracle中, 左链接是:from a,b where a.id=b.id(+), 右联结是:from a,b where a.id(+)=b.id

3. left join 过程(不严谨)
#- 创建address空表,并插入数据
create table Address (
	addressid int UNSIGNED PRIMARY KEY,
	personid int UNSIGNED,
	city VARCHAR(30),
	state VARCHAR(30)
);
insert into Address values 
(1,2,'new york city','new york'),
(2,3,'hangzhou','zhejiang');

#- 创建person空表,并插入数据
create table Person (
	personid int PRIMARY key,
	firstname VARCHAR(30),
	lastname varchar(30)
);
insert into person values
(1,'Allen','Wang'),
(2,'Kile','Ting'),
(3,'Make','Juy');

1)查看Person表:

select * from person;
PersonId    FirstName   LastName
1           Allen       Wang    
2           Kile        Ting
3           Make        Juy

2)查看Address表:

select * from address;
AddressId  PersonId    City              State 
1          2           New York City     New York
2          3           HangZhou          ZheJing

3)组成笛卡尔积:

select * from person join address;
PersonId    FirstName   LastName    AddressId  PersonId    City              State 
1           Allen       Wang        1          2           New York City     New York
1           Allen       Wang        2          3           HangZhou          ZheJiang
2           Kile        Ting        1          2           New York City     New York
2           Kile        Ting        2          3           HangZhou          ZheJiang
3           Make        Juy         1          2           New York City     New York
3           Make        Juy         1          2           New York City     New York

4)以左边为主根据某个条件查找右表数据

select * 
from person 
left join address on person.personid = address.personid 
order by person.personid;
PersonId    FirstName   LastName    AddressId  PersonId    City             State 
1           Allen           Wang    null       null        null             null		
2           Kile           Ting     1          2           new york city    new york
3           Make           Juy      2          3           hangzhou         zhejiang
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值