MySQL学习day04

MySQL别名

在下面的情况下,使用别名很有用:

  • 在查询中设计超过一个表
  • 在查询中使用了函数
  • 列名称很长或者可读性差
  • 需要把两个列或者多个列结合在一起

语法:

  • 列的别名语法:select 列名 as 别名 from 表名。
  • 表的别名语法:select 列名 from 表名 as 别名。

最后返回结果为更改后的别名。

INNER JOIN

  • INNER JOIN关键字在表中存在至少一个匹配时返回行

  • 语法:select 列名 from 表1 inner join 表2 on 表1.列名=表2.列名

LEFT JOIN

  • LEFT JOIN关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为NULL

  • 语法: select 列名 from 表1 left join 表2 on 表1.列名 = 表2.列名

CROSS JOIN

  • 把表1和表2的数据进行一个N*M的组合,即笛卡尔积。
  • 语法:select * from 表1,表2 ,这种情况下等价于 select * from 表1 cross join 表2.
    MySQL学习day04

自连接

自连接查询等同于链接查询,需要两张表,只不过他的坐标(父表)和右表(子表)都是自己,做自连接查询的时候,是自己和自己链接,分别给父表和子表取两个不同的名字,然后附上链接条件。
自连接查询

UNION

  • UNION操作符用于合并两个及以上select语句的结果集。
    注意:UNION内部的每个select语句必须拥有相同数量的列,列也必须拥有相似的数据类型。同时,每个select语句中的列的顺序

  • 语法:select 列1 from 表1 union 列2


作业

项目五:组合两张表 (难度:简单)
在数据库中创建表1和表2,并各插入三行数据(自己造)
表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

问题分析:
因为要求是无论person是否有地址信息,都要返回四条相关信息,所以不能使用inner join,应该使用left join语句进行查询,即使person表单中地址为空,也会显示null。

MySQL学习day04

项目六:删除重复的邮箱(难度:简单)
编写一个 SQL 查询,来删除 email 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。
±—±--------+
| Id | Email |
±—±--------+
| 1 | [email protected] |
| 2 | [email protected] |
| 3 | [email protected] |
±—±--------+
Id 是这个表的主键。
例如,在运行你的查询语句之后,上面的 Email表应返回以下几行:
±—±-----------------+
| Id | Email |
±—±-----------------+
| 1 | [email protected] |
| 2 | [email protected] |
±—±-----------------+

MySQL学习day04