1. 任务背景
Datawhale组队学习中MySQL一周学习任务,通过一周组队自主学习,快速熟悉MySQL相关基础知识,并能掌握基本的数据查询操作方式
1.1 任务内容
- MySQL别名
- 几种方式的用法、区别和联系
- INNER JOIN
- LEFT JOIN
- CROSS JOIN
- 自连接
- UNION
2. MySQL别名
SQL除了可以对列名和计算字段使用别名,还允许给表名起别名,这样做有两个主要理由:
- 缩短 SQL语句;
- 允许在一条SELECT语句中多次使用相同的表。
别名直接用AS关键字即可,既可使用于表名,也可以使用于列名
3. 几种表联结的方式
SQL最强大的功能之一就是能在数据查询的执行中联结(join)表。联结是利用 SQL的 SELECT能执行的最重要的操作,很好地理解联结及其语法是学习 SQL的极为重要的部分。
联结是一种机制,用来在一条 SELECT语句中关联表,因此称为联结。使用特殊的语法,可以联结多个表返回一组输出,联结在运行时关联表中正确的行。
JOIN 语法
1 | table_references: |
3.1 关键字 on
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。
在使用 left jion 时,on 和 where 条件的区别如下:
- on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录。
- where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
3.2 INNER JOIN
目前为止使用的联结称为等值联结( equijoin),它基于两个表之间的相等测试。这种联结也称为内联结(inner join)
INNER JOIN 关键字在表中存在至少一个匹配时返回行,
1 | SELECT column_name(s) |
INNER JOIN 与 JOIN 是相同的
3.3 LEFT JOIN
LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。
例如有表格
"Persons" 表:
Id_P | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Adams | John | Oxford Street | London |
2 | Bush | George | Fifth Avenue | New York |
3 | Carter | Thomas | Changan Street | Beijing |
"Orders" 表:
Id_O | OrderNo | Id_P |
---|---|---|
1 | 77895 | 3 |
2 | 44678 | 3 |
3 | 22456 | 1 |
4 | 24562 | 1 |
5 | 34764 | 65 |
1 | SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo |
结果集:
LastName | FirstName | OrderNo |
---|---|---|
Adams | John | 22456 |
Adams | John | 24562 |
Carter | Thomas | 77895 |
Carter | Thomas | 44678 |
Bush | George |
3.4 RIGHT JOIN
RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行。
1 | SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo |
结果集:
LastName | FirstName | OrderNo |
---|---|---|
Adams | John | 22456 |
Adams | John | 24562 |
Carter | Thomas | 77895 |
Carter | Thomas | 44678 |
34764 |
3.5 CROSS JOIN
3.5.1 笛卡儿积(cartesian product)
由没有联结条件的表关系返回的结果为笛卡儿积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。
3.6 自连接
3.7 UNION
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
SQL UNION 语法
1 | SELECT column_name(s) FROM table_name1 |
注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
SQL UNION ALL 语法
1 | SELECT column_name(s) FROM table_name1 |
另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。
3.8 比较
4. 作业
4.1 作业1 组合两张表 (难度:简单)
4.1.1 作业内容
1 | 在数据库中创建表1和表2,并各插入三行数据(自己造) |
4.1 作业2 删除重复的邮箱(难度:简单)
4.1.1 作业内容
1 | 编写一个 SQL 查询,来删除 email 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。 |