题目
表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执行顺序
from 表1 选定表1
join 表2 选定表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