MySQL 多表查询、链接查询(内链接、外链接)

学习自 廖雪峰的官方网站web

1. 多表查询

SELECT * FROM <1> <2>
SELECT * FROM students, classes;

查询的结果是一个二维表,它是students表和classes表的“乘积”,即students表的每一行与classes表的每一行都两两拼在一块儿返回sql

结果集的列数是两表的列数之和,行数是两表行数之积(要当心,乘积有可能很大)。网络

  • 对同样的列名,起别名区分(下面的name、id)
SELECT
    students.id sid,
    students.name,
    students.gender,
    students.score,
    classes.id cid,
    classes.name cname
FROM students, classes;
  • 表也能够起别名,方便简写
SELECT
    s.id sid,
    s.name,
    s.gender,
    s.score,
    c.id cid,
    c.name cname
FROM students s, classes c;
  • 多表查询也可使用WHERE条件
SELECT
    s.id sid,
    s.name,
    s.gender,
    s.score,
    c.id cid,
    c.name cname
FROM students s, classes c
WHERE s.gender = 'M' AND c.id = 1;
1班的男生

2. 链接查询

链接查询是另外一种类型的多表查询。svg

链接查询对多个表进行JOIN运算:学习

  • 先肯定一个主表做为结果集
  • 而后,把其余表的行有选择性“链接”在主表结果集上
选出全部学生的信息
SELECT s.id, s.name, s.class_id, s.gender, s.score FROM students s;
咱们还须要班级的 名称
  • 最经常使用的一种内链接——INNER JOIN来实现
SELECT s.id, s.name, s.class_id, c.name class_name, s.gender, s.score
FROM students s  主表
INNER JOIN classes c  须要链接的表
ON s.class_id = c.id;  ON 条件
可选:加上WHERE子句、ORDER BY等子句
  • 外链接 LEFT OUTER JOIN、RIGHT OUTER JOIN、FULL OUTER JOIN’网站

  • 区别:哪边的表的数据彻底保留,另外一个表的数据不存在的填NULLspa

SELECT ... FROM tableA ??? JOIN tableB ON tableA.column1 = tableB.column2;

在这里插入图片描述

练习 LeetCode 175. 组合两个表

题目:code

Create table Person (PersonId int, FirstName varchar(255), LastName varchar(255))
Create table Address (AddressId int, PersonId int, City varchar(255), State varchar(255))
Truncate table Person
insert into Person (PersonId, LastName, FirstName) values ('1', 'Wang', 'Allen')
Truncate table Address
insert into Address (AddressId, PersonId, City, State) values ('1', '2', 'New York City', 'New York')
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

来源:力扣(LeetCode) 连接:https://leetcode-cn.com/problems/combine-two-tables
著做权归领扣网络全部。商业转载请联系官方受权,非商业转载请注明出处。xml

解题:blog

# Write your MySQL query statement below
SELECT
    P.FirstName, P.LastName, A.City, A.State
FROM Person P
LEFT OUTER JOIN Address A
ON P.PersonId = A.PersonId

369 ms

练习 LeetCode 181. 超过经理收入的员工

题目:

Employee 表包含全部员工,他们的经理也属于员工。每一个员工都有一个 Id,此外还有一列对应员工的经理的 Id。

+----+-------+--------+-----------+
| Id | Name  | Salary | ManagerId |
+----+-------+--------+-----------+
| 1  | Joe   | 70000  | 3         |
| 2  | Henry | 80000  | 4         |
| 3  | Sam   | 60000  | NULL      |
| 4  | Max   | 90000  | NULL      |
+----+-------+--------+-----------+

给定 Employee 表,编写一个 SQL 查询,该查询能够获取收入超过他们经理的员工的姓名。在上面的表格中,Joe 是惟一一个收入超过他的经理的员工。

+----------+
| Employee |
+----------+
| Joe      |
+----------+

来源:力扣(LeetCode)
连接:https://leetcode-cn.com/problems/employees-earning-more-than-their-managers
著做权归领扣网络全部。商业转载请联系官方受权,非商业转载请注明出处。

解题:
把同一份表再次JOIN该表,条件是A.ManagerId = B.Id

# Write your MySQL query statement below
SELECT A.Name Employee
FROM Employee A
LEFT OUTER JOIN Employee B
ON A.ManagerId = B.Id
WHERE A.Salary > B.Salary

或者

# Write your MySQL query statement below
SELECT A.Name Employee
FROM Employee A
INNER JOIN Employee B
ON A.ManagerId = B.Id
WHERE A.Salary > B.Salary

309 ms