06_MySQL多表查询(一)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 06_MySQL多表查询(一)

1. 多表连接的问题


1e825074fae44fb3be81eb951a88e933_b4cc7199ad9241bea86e88b266bad9f1.png


SELECT employee_id,department_name
FROM employees,departments;#查询出2889条


c8416aeee7bce945a2991153df8f4c00_f48864fe673344c5b5dad5f1586d0375.png


SELECT COUNT(employee_id) FROM employees;
#输出107行
SELECT COUNT(department_id)FROM departments;
#输出27行
SELECT 107*27 FROM dual;//2889


由此可见,查询到结果每一个employee_id都没有选择的重复了departments表中所有的department_name


我们把上述多表查询中出现的问题称为:笛卡尔积的错误。


笛卡尔积(或交叉连接)的理解


笛卡尔乘积是一个数学运算。假设我有两个集合X 和Y,那么X和Y的笛卡尔积就是X和Y的所有可能


组合,也就是第一个对象来自于X,第二个对象来自于Y的所有可能。组合的个数即为两个集合中元素


个数的乘积数。


SQL92中,笛卡尔积也称为 交叉连接 ,英文是 CROSS JOIN 。在 SQL99 中也是使用 CROSS JOIN表示交叉连接。它的作用就是可以把任意表进行连接,即使这两张表不相关。在MySQL中如下情况会出现笛卡尔积。


#查询员工姓名和所在部门名称
SELECT last_name,department_name FROM employees,departments;
SELECT last_name,department_name FROM employees CROSS JOIN departments;;
SELECT last_name,department_name FROM employees INNER JOIN departments;
SELECT last_name,department_name FROM employees JOIN departments;


案例分析与问题解决


笛卡尔积的错误会在下面条件下产生:


省略多个表的连接条件(或关联条件)


连接条件(或关联条件)无效


所有表中的所有行互相连接


为了避免笛卡尔积, 可以在 WHERE 加入有效的连接条件。


加入连接条件后,查询语法:


SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1 = table2.column2; #连接条件


在 WHERE子句中写入连接条件。


正确写法:


#案例:查询员工的姓名及其部门名称
SELECT last_name, department_name
FROM employees, departments
WHERE employees.department_id = departments.department_id;


219b35d15b7fecc0622bc3ece5dd7e23_890e4617b34a4bcaae0cb5046bd5d810.png


执行代码后,一共查询到106条数据,且没有产生笛卡尔积(交叉连接)的错误。


在表中有相同列时,在列名之前加上表名前缀。


补充:表的别名


1)可以给表起别名,在SELECT和WHERE中使用表的别名


SELECT emp.`employee_id`,dept.`department_id`,emp.`department_id`
FROM employees emp,departments dept
WHERE emp.`department_id` = dept.`department_id`


2)如果给表起了别名,一旦在SELECT和WHERE中使用表的别名,则必须使用表的别名,而不能再用 表的原名


3)连接 n个表,至少需要n-1个连接条件。


2. 多表查询分类讲解


2.1等值连接 vs 非等值连接


等值连接


a4d534cdc3f2263a003866bda6b40433_e6599e7dfba44e9fab1e0d0d52968da4.png


SELECT employees.last_name, departments.department_name,employees.department_id
FROM employees, departments
WHERE employees.department_id = departments.department_id;


非等值连接


ab6e772d381e149dca0a7940185364e5_a43ac727a0504b9e878f3f5cd97fde0a.png


SELECT e.last_name, e.salary, j.grade_level
FROM employees e, job_grades j
WHERE e.salary BETWEEN j.lowest_sal AND j.highest_sal;


2.2自连接 vs 非自连接


77d26c0ac6bb494bc2c96759a55d5f30_50c0beeb61244377a676a0d5a6c24e61.png


当table1和table2本质上是同一张表,只是用取别名的方式虚拟成两张表以代表不同的意义。然后两个表再进行内连接,外连接等查询。


2.2内连接 vs 外连接


除了查询满足条件的记录以外,外连接还可以查询某一方不满足条件的记录。


1c44993b6b8da68f1a54267f47380d19_0ecbee98464a4e21ad8e6336142b2c77.png


内连接: 合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行


外连接: 两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的


行 ,这种连接称为左(或右) 外连接。没有匹配的行时, 结果表中相应的列为空(NULL)。


如果是左外连接,则连接条件中左边的表也称为 主表 ,右边的表称为 从表 。


如果是右外连接,则连接条件中右边的表也称为 主表 ,左边的表称为 从表 。


SQL92:使用(+)创建连接


在 SQL92 中采用(+)代表从表所在的位置。即左或右外连接中,(+) 表示哪个是从表。Oracle 对 SQL92 支持较好,而 MySQL 则不支持 SQL92 的外连接。


#左外连接
SELECT last_name,department_name
FROM employees ,departments
WHERE employees.department_id = departments.department_id(+);
#右外连接
SELECT last_name,department_name
FROM employees ,departments
WHERE employees.department_id(+) = departments.department_id;


SQL99:中使用JOIN .. ON


在 SQL92 中采用JOIN .. ON的方式实现多表的查询。这种方式也能解决外连接的问题。MySQL是支持此种方式的。例如:


# 左外连接:
SELECT last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`;
#右外连接:
SELECT last_name,department_name
FROM employees e RIGHT OUTER JOIN departments d
ON e.`department_id` = d.`department_id`;


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4月前
|
SQL 存储 关系型数据库
轻松入门MySQL:数据库关联与多表查询,构建高效的业务决策引擎(6)
轻松入门MySQL:数据库关联与多表查询,构建高效的业务决策引擎(6)
|
4月前
|
关系型数据库 MySQL
3. Mysql 如何实现多表查询
MySQL多表查询主要包括内连接和外连接。内连接有隐式和显式:隐式是通过`From 表A, 表B where 连接条件`,显式是`From 表A inner join 表B on 连接条件`。外连接包括左外连接(`left join`)、右外连接(`right join`)和全外连接(较少使用)。此外,还有交叉连接(`cross join`),但也较少使用。
40 0
|
3月前
|
关系型数据库 MySQL 数据库
关系型数据库MySQL开发要点之多表查询2024详解
关系型数据库MySQL开发要点之多表查询2024详解
29 2
|
3月前
|
关系型数据库 MySQL 数据库
MySQL数据库开发之多表查询数据准备及案例实操
MySQL数据库开发之多表查询数据准备及案例实操
37 1
|
3月前
|
关系型数据库 MySQL 数据库
MySQL数据库基础第四篇(多表查询与事务)
MySQL数据库基础第四篇(多表查询与事务)
|
3月前
|
SQL 关系型数据库 MySQL
MySQL数据库——基础篇总结(概述、SQL、函数、约束、多表查询、事务)一
MySQL数据库——基础篇总结(概述、SQL、函数、约束、多表查询、事务)一
40 5
|
3月前
|
关系型数据库 MySQL 数据库
MySQL数据库——多表查询(4)-实例练习、多表查询总结
MySQL数据库——多表查询(4)-实例练习、多表查询总结
44 1
|
3月前
|
SQL 关系型数据库 MySQL
MySQL数据库——多表查询(3)-自连接、联合查询、子查询
MySQL数据库——多表查询(3)-自连接、联合查询、子查询
51 1
|
3月前
|
关系型数据库 MySQL 数据库
MySQL数据库——多表查询(2)-内连接、外连接
MySQL数据库——多表查询(2)-内连接、外连接
34 1
|
4月前
|
SQL 关系型数据库 MySQL
【MySQL进阶之路 | 基础篇】MySQL之多表查询
【MySQL进阶之路 | 基础篇】MySQL之多表查询

热门文章

最新文章