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', 'a@b.com');
insert into email values('2', 'c@b.com');
insert into email values('3', 'a@b.com');

建表效果如下:

解答如下:

delete e1
from email e1, email e2
where e1.email = e2.email
      and
      e1.id > e2.id;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值