MySQL 基础 (三)- 表联结--day04

1.MySQL别名

1.1 列别名 

 将查询或者筛选出来列用关键字AS 命名

SELECT 字段名 [AS] 别名 [,字段名 [AS] 别名,……] FROM 表名;

1.2 表别名

给表起一个别名,为了在查询数据时,使用起来方便,也使用关键字AS

SELECT * FROM 表名 [AS] 别名;

2.表联结 

 2.1 INNER JOIN(内联结)

如果表中有至少一个匹配,则返回行,获取两个表中字段匹配关系的记录。

 

 

语法:
SELECT column_name
FROM table_name1
INNER JOIN table_name2 
ON table_name1.column_name=table_name2.column_name


等价于:
SELECT column_name
FROM table_name1
WHERE table_name1.column_name=table_name2.column_name

2.2 LEFT JOIN(左连接

即使右表中没有匹配,也从左表返回所有的行;会返回左表(table1)中所有的行

SELECT column_name
FROM table_name1
LEFT JOIN table_name2 
ON table_name1.column_name=table_name2.column_name

注:除此之外还有RIGHT JOIN和FULL JOIN(其中right join 和left join用法相似,即右表中的所有行,而full join 返回两个表中的所有行)

 2.3 自连接

 有时,一些特殊的查询需要对同一个关系进行连接查询,成为表的自身连接: 即一张表看成是两张表。

SELECT c1.cust_id, c1.cust_name, c1.cust_contact
FROM Customers AS c1, Customers AS c2
WHERE c1.cust_name = c2.cust_name
AND c2.cust_contact = ‘Jim Jones’;

2.4 CROSS JOIN

  • 如果不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积;
  • 假设使用CROSS JOIN连接两个表。 结果集将包括两个表中的所有行,其中结果集中的每一行都是第一个表中的行与第二个表中的行的组合。 当连接的表之间没有关系时,会使用这种情况。即,如果每个表有1000行,那么结果集中就有1000 x 1000 = 1,000,000行,那么数据量是非常巨大的。
  • 如果添加了WHERE子句,如果T1和T2有关系,则CROSS JOIN的工作方式与INNER JOIN子句类似

 

2.5 union

MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据。 

语法:
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];


expression1, expression2, … expression_n: 要检索的列。
tables: 要检索的数据表。
WHERE conditions: 可选, 检索条件。
DISTINCT: 可选,删除结果集中重复的数据。默认情况下 UNION 操作符已经删除了重复数据,所以 DISTINCT 修饰符对结果没啥影响。
ALL: 可选,返回所有结果集,包含重复数据。

注:UNION语句用于将不同表中相同列中查询的数据展示出来(不包括重复数据),UNION ALL语句包括重复数据。

 2.6 区别

INNER JOIN产生的结果是两张表的交集,

LEFT JOIN产生左表的完全集,右表中若没有匹配则以null值取代。

CROSS JOIN将两张表数据进行一个N*M组合,即笛卡尔积。

自连接是对于自身的操作,将自己当成两张表操作来提取需要的信息。

UNION操作符是用于连接两个以上的SELECT语句,它和INNER JOIN的区别是一个是连接两张表,另一个是连接两个SELECT语句。


参考:

https://blog.csdn.net/TNTZS666/article/details/88074247

https://www.cnblogs.com/sunchaothu/p/10460582.html 

http://www.runoob.com/mysql/mysql-join.html

作业:

 项目五:组合两张表 (难度:简单)

step1:在数据库中创建表1和表2

 MySQL 基础 (三)- 表联结--day04_第1张图片

 

step2:插入数据

INSERT INTO Person VALUES(1,'jielun','zhou'),
                         (2,'yifeng','li'),
                         (3,'mi','yang');
INSERT INTO Address VALUES(4,1,'taibei','China'),
                          (5,2,'sichuan','China'),
                          (6,3,'beijing','China');

 MySQL 基础 (三)- 表联结--day04_第2张图片MySQL 基础 (三)- 表联结--day04_第3张图片

 step3:编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:FirstName, LastName, City, State

SELECT FirstName, LastName, City, State
FROM Person LEFT JOIN Address
ON Person.PersonId = Address.PersonId;

MySQL 基础 (三)- 表联结--day04_第4张图片

项目六:删除重复的邮箱(难度:简单)

编写一个 SQL 查询,来删除 email 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。

 

-- 创建表并插入数据
CREATE TABLE email(
Id INT NOT NULL,
Email VARCHAR(255) NOT NULL,
PRIMARY KEY (Id)
);

-- 插入数据

INSERT INTO email VALUES(1,'a@b.com'),
                        (2,'c@d.com'),
                        (3,'a@b.com');

MySQL 基础 (三)- 表联结--day04_第5张图片

编写查询语句:

DELETE e1
FROM email e1,email e2
WHERE e1.Email = e2.Email AND e1.Id>e2.Id;

MySQL 基础 (三)- 表联结--day04_第6张图片

你可能感兴趣的