mysql多表查询(上)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: mysql多表查询

一、表的关联关系

1.举例一对一关联

查询员工"abel"在那个城市工作

要用的三张表

我们在解决上面这个多表查询的问题之前需要了解一些基本原理

2.笛卡尔积sql语句存在的问题 :

笛卡尔积类似于矩阵乘法运算,所以如果不做处理会产生大量冗余 运算

select employee_id,department_name from employees , departments;

为了解决笛卡尔积产生大量冗余的计算,我们需要设计出一个更好的多表连接运算的方法,也就是需要更多的额运算符加入

因此我们有了下面的语句

select last_name , employee_id , department_name , city from  employees , departments , locations where employees.LAST_NAME="abel" and employees.DEPARTMENT_ID=departments.DEPARTMENT_ID and locations.LOCATION_ID = departments.LOCATION_ID;

起别名增加可读性

select last_name , employee_id , department_name , city 
from  employees as e , departments  as d , locations as l 
where e.last_name ="abel" and e.department_id = d.department_id and l.location_id = d.location_id;


二、多表查询的分类

我们拿等值和非等值举例

1.等值连接的例子

非等值

job_grades

我们根据salary来判断员工的薪水等级

select last_name , salary ,grade_level 
from employee e , job_grades j 
where e.salary between j.lowest_sal and j.lowest_sal and j.highest_sal;

这个就是非等值连接

2.自连接的例子

查询员工id,员工姓名及其管理员的id和姓名

select emp.employee_id , emp.last_name , mgr.employee_id , mgr.last_name 
from employees emp , employees mgr 
where emp.manager_id = mgr.employee_id;

3.内连接和外连接的例子

我们前面写的都是内连接

同理外连接的定义

我们主要讲外连接

分类:

左外连接、右外连接和满连接

外连接实例

左外连接

查询所有的员工的last_name,department_name信息

外连接语法分92和99年不同版本的,99可读性比92要好很多

我们用92年版本的语法写

select employee_id,department_name
from employees e , departments d 
where e.department_id = d.department_id(+);

这里为什么会报错呢?

是因为mysql不支持92版本的写入

我们可以用Oracle执行


三、sql99语法

上面其实都算是sql92语法的内容,所以下面就都讲99语法的内容

使用…ON的方式实现多表的查询,这种方式也能解决外连接的问题,且mysql是支持的。

1.sql99语法实现内连接

select last_name , department_name
from employees e join departments d
on e.`department_id` = d.`department_id` ;

这数据少了一个人,那个部门为null,还没分配部门

我们看内连接没有这个人

SELECT last_name , department_name
FROM employees e JOIN departments d
ON e.department_id = d.department_id WHERE last_name = "Grant";

可以看到并没有

2.99语法实现左外连接

因为左表的数据更多,所以我们需要左连接去显示出那个部门为null的人

SELECT last_name , department_name
FROM employees e LEFT OUTER JOIN departments d
ON e.department_id = d.department_id;

sql92语法是这样的

3.99语法实现右外连接

同理我们查一下所有的部门,员工id

SELECT last_name , department_name
FROM employees e RIGHT OUTER JOIN departments d
ON e.department_id = d.department_id;

4.99语法实现满外连接

SELECT last_name , department_name
FROM employees e FULL OUTER JOIN departments d
ON e.department_id = d.department_id;

注意虽然full outer join是对的,但是mysql不支持full

Oracle是支持的

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