MySQL数据库多表查询

前言

在之前的文章MySQL数据库之SQL入门中,我们讲到了四类SQL中的DQL(数据库查询语言,用于查询表中数据),但是我仅仅用DQL去查询一张表中数据,而在实际的应用中,经常是对多张数据库表进行查找。本文介绍MySQL数据库的多表查询,介绍内连接查询、外连接查询以及子查询三种多表查询方式及其区别。

零、创建用于查询的示例数据库表

  1. 创建一张部门表
CREATE TABLE dept(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20)
);
  1. 为dept表添加数据
INSERT INTO dept (NAME) VALUES ('开发部'),('市场部'),('财务部');
  1. 创建一张员工表
CREATE TABLE emp (id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(10),gender CHAR(1), -- 性别salary DOUBLE, -- 工资join_date DATE, -- 入职日期dept_id INT,FOREIGN KEY (dept_id) REFERENCES dept(id) -- 外键,关联部门表(部门表的主键)
);
  1. 为emp表添加数据
NSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('孙悟空','男',7200,'2013-02-24',1);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('猪八戒','男',3600,'2010-12-02',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('唐僧','男',9000,'2008-08-08',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('白骨精','女',5000,'2015-10-07',3);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('蜘蛛精','女',4500,'2011-03-14',1);
  1. 部门表dept和员工表emp之间的关系

一、笛卡尔积

  • 如果我们使用如下sql查询员工表和部门表,查询得到的是笛卡尔积结果。
SELECT * FROM emp,dept;
  • 笛卡尔积:A笛卡尔积B=A与B组合得到的所有情况。
  • 笛卡尔积的结果包含所有可能的组合数据,但是有很多数据是不合理,不正确的(如孙悟空的部门开发部,而查询结果中有两行数据显示他不是开发部,这两行数据很明是不正确的数据,是我们所不需要的数据),因此,我们需要从笛卡尔积的结果中筛选出我们需要的正确数据。
  • 如对于上表笛卡尔积的结果中,我们需要添加员工表中的dept_id要与部门表中的id相同这一条件。而添加这一条件有三种方式,分别对应内连接查询,外连接查询和子查询三种查询方式。

二、内连接查询

1. 隐式内连接:使用where条件消除无用数据

SELECT * FROM emp t1,dept t2 WHERE t1.`dept_id`=t2.`id`;

2. 显式内连接

  • 语法: select 字段列表 from 表名1 [inner] join 表名2 on 条件
SELECT * FROM emp t1 INNER JOIN dept t2 ON t1.`dept_id`=t2.`id`;

三、外连接查询

1. 左外连接

  • 语法:select 字段列表 from 表1 left [outer] join 表2 on 条件;
  • 查询的是左表所有数据以及其交集部分。 即用左边表的记录去匹配右边表的记录,如果符合条件的则显示;否则,显示NULL
  • 可以理解为:在内连接的基础上保证左表的数据全部显示
  • 示例:
-- 在部门表中增加一个销售部
INSERT INTO dept(dept.`NAME`) VALUES('销售部');
-- 使用内连接查询两张表
SELECT * FROM emp t1 INNER JOIN dept t2 ON t1.`dept_id`=t2.`id`;
-- 使用左外连接查询两张表
SELECT * FROM dept t1 LEFT OUTER JOIN emp t2 ON t1.`id`=t2.`dept_id`;

使用内连接查询两张表结果如下图(仅仅展示了双方都有的数据,因为员工没有属于销售部的,所以没有查询出销售部的信息)

使用左外连接查询两张表结果如下图(查询左表即部门表的所有数据,如果右有匹配的数据则展示,否则赋值为null)

2. 右外连接

  • 右连接查询和左连接查询正好相反,一般掌握一个即可,只要将左右表交换,即可实现左右连接的效果。
  • 语法:select 字段列表 from 表1 right [outer] join 表2 on 条件;
  • 查询的是右表所有数据以及其交集部分。 即用右边表的记录去匹配左边表的记录,如果符合条件的则显示;否则,显示NULL
  • 可以理解为:在内连接的基础上保证右表的数据全部显示
  • 示例:
-- 在员工表中增加一个员工
INSERT INTO emp VALUES (NULL, '沙僧','男',6666,'2013-12-05',NULL);
-- 使用内连接查询
SELECT * FROM dept INNER JOIN emp ON dept.`id` = emp.`dept_id`;
-- 使用右外连接查询
SELECT * FROM dept RIGHT JOIN emp ON dept.`id` = emp.`dept_id`;
  • 使用内连接查询结果如下图
  • 使用右外连接查询结果如下图

四、子查询

  • 概念:查询中嵌套查询,称嵌套查询为子查询。
  • 示例:查询工资最高的员工信息
SELECT
*
FROM
emp
WHERE
emp.`salary` =
(
SELECT
MAX(salary)
FROM
emp);
  • 子查询不同情况
    1.子查询的结果是单行单列的:子查询可以作为条件,使用运算符去判断。 运算符: > >= < <= =
-- 查询员工工资小于平均工资的人
SELECT * FROM emp WHERE emp.salary < (SELECT AVG(salary) FROM emp);

2.子查询的结果是多行单列的:子查询可以作为条件,使用运算符in来判断

-- 查询'财务部'和'市场部'所有的员工信息
SELECT * FROM emp WHERE dept_id IN (SELECT id FROM dept WHERE NAME = '财务部' OR NAME = '市场部');

3.子查询的结果是多行多列的:子查询可以作为一张虚拟表参与查询

-- 查询员工入职日期是2011-11-11日之后的员工信息和部门信息
SELECT * FROM dept t1 ,(SELECT * FROM emp WHERE emp.`join_date` > '2011-11-11') t2WHERE t1.id = t2.dept_id;

MySQL数据库多表查询相关推荐

  1. mysql数据库多表查询(内连接,外连接,自连接,子查询及案例分析)

    mysql数据库多表查询 之前接触的项目或者自己涉及的部分对于多表查询的使用都比较的少,常常是自己更具案例进行学习,最近见到的比较的多,所以今天就好好的总结一下,为下一步学习做准备! 1.多表查询关系 ...

  2. MySQL 数据库单表查询——高级查询

    当遇到一些复杂的需求时,例如对查询结果进行排序,分组和分页等,MySQL 数据库有着更高级的查询方法以处理更加复杂的需求. 一,排序查询 在查询完成后,结果集中的数据是按默认顺序排序的.为了方便用户自 ...

  3. mysql数据库多表查询教程

    SQL会创建多表及多表的关系 需求: 分类表和商品表之间是不是有关系?如果有关系,在数据库中如何表示这种关系 ... 表结构请参考上一章 mysql单表查询. 技术分析: 多表之间的关系如何来维护 外 ...

  4. MySQL数据库多表查询,子查询

    写博客的第四天,今天来点数据库的操作,温故而知新,在前进的路上,多看看自己曾经走过的路,不要忘了自己是怎么一步一步走过来的,对于前方未知的道路,不要轻言放弃. 今天的内容全部是MySQL里面的语句,基 ...

  5. MySQL数据库—多表查询

    文章目录 绪论 交叉连接 内连接 左外连接 右外连接 联合查询 绪论 多表查询顾名思义就是数据同时从多张表中获取,查询语句同时涉及到多张表,多表查询有多种语法,即:交叉连接,内连接,左外连接,右外连接 ...

  6. mysql数据库连表查询的几种方法

    1.首先介绍表连接分类(内连接,外连接,交叉连接)和连接方法(如下): A)内连接:join,inner join B)外连接:left join,left outer join,right join ...

  7. MySQL数据库----多表查询,表连接

    一.查询概述: 查询:指的是针对表中已经存在的数据,可以按照特定组合,条件,或者次序等等来进行一系列的检索查看操作------>select语句. 二.查询的基本操作: 1.查询语句的基本结构: ...

  8. MySQL数据库多表查询练习题

    原题目数据库请查看作者资源免费下载 (https://download.csdn.net/download/MeiJin_/86403712) 多表查询的思路 类似于生活日常中解决问题方式 第一步干什 ...

  9. MySQL数据库——多表查询介绍

    目录 数据准备 笛卡尔积 内连接 显示内连接 隐式内连接 外连接 左外连接 右外连接 子查询 基本运用举例 子查询的不同情况 子查询的结果是单行单列的 子查询的结果是多行单列的 子查询的结果是单行多列 ...

最新文章

  1. [APUE]文件和目录(中)
  2. 正式环境docker部署hyperf_Hyperf使用docker-compose集群部署
  3. AcWing算法基础课 Level-2 第二讲 数据结构
  4. git获取管理员权限 windows_win10不兼容git2.7.3+版本
  5. JMeter的PUT请求,响应结果中文出现乱码的解决方法
  6. 系统相机裁剪比例_拍不出好照片,你缺的不是好手机而是相机设置的秘笈
  7. 以5个数据库为例,用Python实现数据的提取、转换和加载(ETL)
  8. zookeeper3.5.x版本启动报错java.io.IOException: No snapshot found, but there are log entries.解决
  9. 看完这篇 HTTP,跟面试官扯皮就没问题了
  10. 函数参数中的中括号代表什么
  11. 【HDU5536】Chip Factory(01字典树+01字典树上删除某个数)
  12. KL散度、JS散度和交叉熵
  13. 各地级市系列环境指标数据(2003-2017年)
  14. h265硬解码和软解码
  15. 运用awk提取日志文件中的IP地址
  16. 西门子PLC1200 TCP通讯
  17. 卡内基·梅隆大学计算机科学系主任周以真的父母是中国人吗,计算思维(Computational Thinking)...
  18. android转ios 王者荣耀,王者荣耀怎么转移号
  19. python爬取微博用户信息(六)—— 完整代码
  20. 【毕业设计】大数据疫情可视化分析系统 - python

热门文章

  1. URL重写及Session
  2. 酒店商场地铁站刷脸应用场景无处不在
  3. VB.NET 操作excel出现的{000208D5-0000-0000-C000-000000000046}错误
  4. 2005免费书记下载- NEW
  5. android app 启动第一个页面
  6. Envoy 自定义授权和限流示例
  7. 念:心念城南好风景,花开时节愿逢君
  8. 双十一电信宽带会有优惠
  9. 享元模式(Flyweight Pattern)详解
  10. 新手入门Docker之Windows下如何使用Docker