前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL 多表查询、连接查询(内连接、外连接)

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

作者头像
Michael阿明
发布2020-07-13 15:17:55
3.7K0
发布2020-07-13 15:17:55
举报

1. 多表查询

代码语言:javascript
复制
SELECT * FROM <表1> <表2>
SELECT * FROM students, classes;

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

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

  • 对一样的列名,起别名区分(下面的name、id)
代码语言:javascript
复制
SELECT
    students.id sid,
    students.name,
    students.gender,
    students.score,
    classes.id cid,
    classes.name cname
FROM students, classes;
  • 表也可以起别名,方便简写
代码语言:javascript
复制
SELECT
    s.id sid,
    s.name,
    s.gender,
    s.score,
    c.id cid,
    c.name cname
FROM students s, classes c;
  • 多表查询也可以使用WHERE条件
代码语言:javascript
复制
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. 连接查询

连接查询是另一种类型的多表查询。

连接查询对多个表进行JOIN运算:

  • 先确定一个主表作为结果集
  • 然后,把其他表的行有选择性“连接”在主表结果集上
代码语言:javascript
复制
选出所有学生的信息
SELECT s.id, s.name, s.class_id, s.gender, s.score FROM students s;
我们还需要班级的 名称
  • 最常用的一种内连接——INNER JOIN来实现
代码语言:javascript
复制
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’
  • 区别:哪边的表的数据完全保留,另一个表的数据不存在的填NULL
代码语言:javascript
复制
SELECT ... FROM tableA ??? JOIN tableB ON tableA.column1 = tableB.column2;
在这里插入图片描述
在这里插入图片描述

练习 LeetCode 175. 组合两个表

题目:

代码语言:javascript
复制
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')
代码语言:javascript
复制
表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 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题:

代码语言:javascript
复制
# 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。

代码语言:javascript
复制
+----+-------+--------+-----------+
| Id | Name  | Salary | ManagerId |
+----+-------+--------+-----------+
| 1  | Joe   | 70000  | 3         |
| 2  | Henry | 80000  | 4         |
| 3  | Sam   | 60000  | NULL      |
| 4  | Max   | 90000  | NULL      |
+----+-------+--------+-----------+

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

代码语言:javascript
复制
+----------+
| Employee |
+----------+
| Joe      |
+----------+

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

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

代码语言:javascript
复制
# 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

或者

代码语言:javascript
复制
# 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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-06-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 多表查询
  • 2. 连接查询
  • 练习 LeetCode 175. 组合两个表
  • 练习 LeetCode 181. 超过经理收入的员工
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档