Datawhale-MySQL-第5期-Day 5-MySQL表联结
任务四 MySQL 基础 (三)- 表联结
任务时间 请于3月2日22:00前完成,在本文章评论打卡。逾期尚未打卡的会被清退。
学习内容
MySQL别名
INNER JOIN
LEFT JOIN
CROSS JOIN
自连接
UNION
以上几种方式的区别和联系
===========================================================
正文:
1. MySQL别名
在MySQL中,可以为表或者字段起一个别名。
对于表的别名可以用语句:
select *
from Table as t
#注意as可以省略
对于字段的别名可以用语句:
select id as sid
from student
#注意as可以省略
2.
JOIN 按照功能大致分为如下三类:
- INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
- LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
- RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
如果用Venn图来表示的话:
注意:在选择约束条件时,以上三种连接都使用On 而不是Where来限制。
Cross Join即笛卡尔乘积,是把两张表的每一行两两组合的join,效率比较低,谨慎使用。
自连接是一种把一张表当做两张表来用的方法。在某些时候我们需要对同一张表执行不同的操作,这个时候就要利用到自连接的概念。
例如LeetCode-MySQL-181. 超过经理收入的员工这道题里,我们既要在表内查找出员工的收入,又要查找出经理的收入,这就需要两次利用同一张表。
可以用给表取别名的方法来区分:
from employee as e1, employee as e2
注意:Cross Join 和自连接 使用关键词Where来约束条件。
MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。相当于逻辑运算里的取并集。
SELECT 列名称
FROM 表名称
UNION
SELECT 列名称
FROM 表名称
ORDER BY 列名称;
#################################3
SELECT 列名称
FROM 表名称
UNION ALL
SELECT 列名称
FROM 表名称
ORDER BY 列名称;
多个 SELECT 语句会删除重复的数据。如果不需要去重,则应该使用UNION ALL操作符。
与UNION相对的取交集,则是INTERSECT操作符。
作业:
1.
建表代码如下:
create table Person(
PersonId int primary key,
FirstName varchar(255) not null,
LastName varchar(255) not null
);
Insert into Person values('1', 'Abigail', 'Lazer');
insert into person values('2', 'Blank', 'White');
insert into person values('3', 'Cathy', 'Smithman');
建表效果如下:
建表代码如下:
create table Address(
AddressId int primary key,
PersonId int not null,
City varchar(255) not null,
State varchar(255) not null
);
Insert into Address values('1', '3', 'LA', 'CA');
insert into Address values('2', '1', 'SD', 'CA');
insert into Address values('3', '2', 'Boston', 'MA');
建表效果如下:
解答如下:
select p.firstname, p.lastname, a.city, a.state
from person p left join address a
on p.personid = a.personid;
2.
建表代码如下:
create table email(
Id int primary key,
email varchar(255) not null
);
insert into email values('1', '[email protected]');
insert into email values('2', '[email protected]');
insert into email values('3', '[email protected]');
建表效果如下:
解答如下:
delete e1
from email e1, email e2
where e1.email = e2.email
and
e1.id > e2.id;