MySQL高级【多表查询】第九章(上)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL高级【多表查询】第九章

1,多表查询


多表查询顾名思义就是从多张表中一次性的查询出我们想要的数据。我们通过具体的sql给他们演示,先准备环境

DROP TABLE IF EXISTS emp;
DROP TABLE IF EXISTS dept;
# 创建部门表
  CREATE TABLE dept(
        did INT PRIMARY KEY AUTO_INCREMENT,
        dname VARCHAR(20)
    );
  # 创建员工表
  CREATE TABLE emp (
        id INT PRIMARY KEY AUTO_INCREMENT,
        NAME VARCHAR(10),
        gender CHAR(1), -- 性别
        salary DOUBLE, -- 工资
        join_date DATE, -- 入职日期
        dep_id INT,
        FOREIGN KEY (dep_id) REFERENCES dept(did) -- 外键,关联部门表(部门表的主键)
    );
  -- 添加部门数据
  INSERT INTO dept (dNAME) VALUES ('研发部'),('市场部'),('财务部'),('销售部');
  -- 添加员工数据
  INSERT INTO emp(NAME,gender,salary,join_date,dep_id) VALUES
  ('孙悟空','男',7200,'2013-02-24',1),
  ('猪八戒','男',3600,'2010-12-02',2),
  ('唐僧','男',9000,'2008-08-08',2),
  ('白骨精','女',5000,'2015-10-07',3),
  ('蜘蛛精','女',4500,'2011-03-14',1),
  ('小白龙','男',2500,'2011-02-14',null);

执行下面的多表查询语句  

select * from emp , dept;  -- 从emp和dept表中查询所有的字段数据

结果如下:  

从上面的结果我们看到有一些无效的数据,如 孙悟空 这个员工属于1号部门,但也同时关联的2、3、4号部门。所以我们要通过限制员工表中的 dep_id 字段的值和部门表 did 字段的值相等来消除这些无效的数据,

select * from emp , dept where emp.dep_id = dept.did;

执行后结果如下:



上面语句就是连接查询,那么多表查询都有哪些呢?

连接查询


  • 内连接查询 :相当于查询AB交集数据


  • 外连接查询


  • 左外连接查询 :相当于查询A表所有数据和交集部门数据


  • 右外连接查询 : 相当于查询B表所有数据和交集部分数据


  • 子查询  


1.1:内连接查询

  • 语法
-- 隐式内连接
SELECT 字段列表 FROM 表1,表2… WHERE 条件;
-- 显示内连接
SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 条件;
  • 内连接相当于查询 A B 交集数据



  • 案例


  • 隐式内连接
SELECT
  *
FROM
  emp,
  dept
WHERE
  emp.dep_id = dept.did;

执行上述语句结果如下:  

查询 emp的 name, gender,dept表的dname


SELECT
  emp. NAME,
  emp.gender,
  dept.dname
FROM
  emp,
  dept
WHERE
  emp.dep_id = dept.did;
  • 执行语句结果如下:



上面语句中使用表名指定字段所属有点麻烦,sql也支持给表指别名,上述语句可以改进为


SELECT
  t1. NAME,
  t1.gender,
  t2.dname
FROM
  emp t1,
  dept t2
WHERE
  t1.dep_id = t2.did;
  • 显式内连接


select * from emp inner join dept on emp.dep_id = dept.did;-- 上面语句中的inner可以省略,可以书写为如下语句select * from emp  join dept on emp.dep_id = dept.did;


1.2:外连接查询

语法


-- 左外连接
SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件;
-- 右外连接
SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件;

左外连接:相当于查询A表所有数据和交集部分数据


右外连接:相当于查询B表所有数据和交集部分数据



案例


  • 查询emp表所有数据和对应的部门信息(左外连接)


select * from emp left join dept on emp.dep_id = dept.did;

执行语句结果如下:



  • 结果显示查询到了左表(emp)中所有的数据及两张表能关联的数据。


  • 查询dept表所有数据和对应的员工信息(右外连接)


select * from emp right join dept on emp.dep_id = dept.did;

执行语句结果如下:



结果显示查询到了右表(dept)中所有的数据及两张表能关联的数据。


要查询出部门表中所有的数据,也可以通过左外连接实现,只需要将两个表的位置进行互换


select * from dept left join emp on emp.dep_id = dept.did;


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
关系型数据库 MySQL 调度
MySQL高级功能与优化策略深度探索
MySQL高级功能与优化策略深度探索
|
5月前
|
关系型数据库 MySQL 数据库
关系型数据库MySQL开发要点之多表查询2024详解
关系型数据库MySQL开发要点之多表查询2024详解
34 2
|
5月前
|
关系型数据库 MySQL 数据库
MySQL数据库开发之多表查询数据准备及案例实操
MySQL数据库开发之多表查询数据准备及案例实操
47 1
|
5月前
|
关系型数据库 MySQL 数据库
MySQL数据库基础第四篇(多表查询与事务)
MySQL数据库基础第四篇(多表查询与事务)
|
5月前
|
SQL 存储 关系型数据库
精通MySQL:从基础到高级应用与最佳实践
第一章:MySQL基础入门 1.1 MySQL概述 介绍MySQL的历史、发展、优势以及应用领域
|
5月前
|
SQL 关系型数据库 MySQL
MySQL数据库——基础篇总结(概述、SQL、函数、约束、多表查询、事务)一
MySQL数据库——基础篇总结(概述、SQL、函数、约束、多表查询、事务)一
45 5
|
5月前
|
关系型数据库 MySQL 数据库
MySQL数据库——多表查询(4)-实例练习、多表查询总结
MySQL数据库——多表查询(4)-实例练习、多表查询总结
137 1
|
5月前
|
SQL 关系型数据库 MySQL
深入探索MySQL SELECT查询:从基础到高级,解锁数据宝藏的密钥
深入探索MySQL SELECT查询:从基础到高级,解锁数据宝藏的密钥
|
5月前
|
SQL 安全 关系型数据库
深入理解MySQL:从基础到高级应用及安全管理
第一章:MySQL基础入门 1.1 MySQL简介 简要介绍MySQL的历史、发展以及它在当前数据库领域的应用
|
5月前
|
SQL 存储 关系型数据库
精通MySQL:从基础到高级应用
第一章:MySQL入门 1.1 MySQL简介 介绍MySQL的历史、特点以及它作为关系型数据库管理系统(RDBMS)的优势