MySQL基础-多表查询

这篇具有很好参考价值的文章主要介绍了MySQL基础-多表查询。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文介绍MySQL的多表查询

多表关系

  • 一对多(多对一)
  • 多对多
  • 一对一

一对多

案例:部门与员工
关系:一个部门对应多个员工,一个员工对应一个部门
实现:在多的一方建立外键,指向一的一方的主键

多对多

案例:学生与课程
关系:一个学生可以选多门课程,一门课程也可以供多个学生选修
实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

一对一

案例:用户与用户详情
关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率
实现:在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)

查询

概述:从多张表中查询数据
笛卡尔积:笛卡尔乘积是指在数学中,两个集合A和B的所有组合情况。(在多表查询时,需要消除无效的笛卡尔积)

内连接

内连接查询的是两张表交集的部分

隐式内连接:
SELECT 字段列表 FROM 表1, 表2 WHERE 条件 ...;

显式内连接:
SELECT 字段列表 FROM 表1 [ INNER ] JOIN 表2 ON 连接条件 ...;

显式性能比隐式高

语法:

#隐式内连接
SELECT 字段列表 FROM 表列表 WHERE 条件...;

#显式内连接
SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 连接条件;

实例:

#查询每一个员工的姓名,以及关联的部门名称(隐式)
SELECT emp.name,dept.name FROM emp,dept WHERE emp.dept_id = dept.id;

#查询每一个员工的姓名,以及关联的部门名称(显示)
SELECT e.name,d.name FROM emp e INNER JOIN dept d ON e.dept_id = d.id;

外连接

左外连接:
查询左表所有数据,以及两张表交集部分数据
SELECT 字段列表 FROM 表1 LEFT [ OUTER ] JOIN 表2 ON 条件 ...;
相当于查询表1的所有数据,包含表1和表2交集部分数据

右外连接:
查询右表所有数据,以及两张表交集部分数据
SELECT 字段列表 FROM 表1 RIGHT [ OUTER ] JOIN 表2 ON 条件 ...;

实例:

#查询emp表的所有数据,和对应的部门信息(左外连接)
SELECT * FROM emp e LEFT OUTER JOIN dept d ON e.dept_id = d.id;

#查询dept表的所有数据,和对应的员工信息(右外连接)
SELECT d.*,e.* FROM emp e RIGHT OUTER JOIN dept d ON e.dept_id = d.id;

自连接

当前表与自身的连接查询,自连接必须使用表别名

语法:
SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件 ...;

自连接查询,可以是内连接查询,也可以是外连接查询

实例:

#查询员工及其直属领导的名字
SELECT e1.name 员工,e2.name 领导 FROM emp e1 JOIN emp e2 ON e1.managerid = e2.id;

#查询所有员工emp及其领导的名字emp,如果没有领导也要查询出来
SELECT e1.*,e2.name 领导 FROM emp e1 LEFT JOIN emp e2 ON e1.managerid = e2.id;

联合查询

把多次查询的结果合并,形成一个新的查询集
语法:

SELECT 字段列表 FROM 表A ...
UNION [ALL]
SELECT 字段列表 FROM 表B ...

注意事项:

  • UNION ALL 会有重复结果,UNION 不会
  • 联合查询比使用or效率高,不会使索引失效

实例:

#将薪资低于5000的员工,和年龄大于50岁的员工都查询出来。
SELECT * FROM emp WHERE salary < 5000 UNION SELECT * FROM emp WHERE age > 50 ORDER BY id ASC;
  • 对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致
  • UNION ALL会直接将两个结果集合并,而UNION会进行去重

子查询

SQL语句中嵌套SELECT语句,称谓嵌套查询,又称子查询
SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2);
子查询外部的语句可以是 INSERT / UPDATE / DELETE / SELECT 的任何一个

根据子查询结果可以分为:

  • 标量子查询(子查询结果为单个值)
  • 列子查询(子查询结果为一列)
  • 行子查询(子查询结果为一行)
  • 表子查询(子查询结果为多行多列)

根据子查询位置可分为:

  • WHERE 之后
  • FROM 之后
  • SELECT 之后

标量子查询

子查询返回的结果是单个值(数字、字符串、日期等)。
常用操作符:- < > > >= < <=

实例:

#查询销售部的所有员工信息
SELECT * FROM emp  WHERE dept_id = (SELECT id FROM dept WHERE name = '销售部');

#查询方东白之后入职的员工信息
SELECT * FROM emp WHERE entrydate > (SELECT entrydate FROM emp WHERE name = '方东白');

#查询xxx入职之后的员工信息
select * from employee where entrydate > (select entrydate from employee where name = 'xxx');

列子查询

子查询返回的结果是一列(可以是多行),这种子查询称为列子查询

常用操作符:IN、NOT IN、ANT、SOME、ALL
MySQL基础-多表查询
实例:

-- 查询销售部和市场部的所有员工信息
select * from employee where dept in (select id from dept where name = '销售部' or name = '市场部');

-- 查询比财务部所有人工资都高的员工信息
select * from employee where salary > all(select salary from employee where dept = (select id from dept where name = '财务部'));

-- 查询比研发部任意一人工资高的员工信息
select * from employee where salary > any (select salary from employee where dept = (select id from dept where name = '研发部'));

行子查询

返回的结果是一行(可以是多列)。
常用操作符:=, <, >, IN, NOT IN

例子:文章来源地址https://www.toymoban.com/news/detail-444847.html

#查询与张无忌的薪资及直属领导都相同的员工
SELECT * FROM emp WHERE salary = (SELECT salary FROM emp WHERE name = '张无忌') AND managerid = (SELECT managerid FROM emp WHERE name = '张无忌');

#或
SELECT * FROM emp WHERE (salary,managerid) = (SELECT salary,managerid FROM emp WHERE name = '张无忌');

表子查询

返回的结果是多行多列
常用操作符:IN

例子:

#查询与鹿杖客、宋远桥的职位和薪资相同的员工信息

SELECT * FROM emp WHERE job IN (SELECT job FROM emp WHERE name = '鹿杖客' OR name = '宋远桥') AND salary IN (SELECT salary FROM emp WHERE name = '鹿杖客' OR name = '宋远桥');

#查询入职日期是2006-01-01之后的员工信息,及部门信息
SELECT e.*,d.name FROM emp e LEFT JOIN dept d ON e.dept_id = d.id WHERE e.entrydate > '2006-01-01';

多表查询案例

#查询员工的姓名、年龄、职位、部门信息
SELECT e.name,e.age,e.job,d.name FROM emp e LEFT JOIN dept d ON e.dept_id = d.id;

#查询年龄小于30岁的员工姓名、年龄、职位、部门信息
SELECT e.name,e.age,e.job,d.name FROM emp e LEFT JOIN dept d ON e.dept_id = d.id WHERE age < 30;

#查询拥有员工的部门ID、部门名称
SELECT d.* FROM dept d WHERE d.id IN (SELECT e.dept_id FROM emp e);

#查询所有年龄大于40的员工,及其归属的部门名称;如果员工没有分配部门,也需要展示出来
SELECT e.name,d.name FROM emp e LEFT JOIN dept d ON e.dept_id = d.id WHERE e.age > 40;

#查询所有员工的工资等级
SELECT e.name,s.grade FROM emp e,salgrade s WHERE e.salary >s.losal AND e.salary <s.hisal;

#查询研发部所有员工的信息及工资等级
SELECT e.name,s.grade FROM emp e,salgrade s WHERE e.salary >s.losal AND e.salary <s.hisal AND e.dept_id = 1;

#查询研发部员工的平均工资
SELECT AVG(salary) FROM emp WHERE dept_id = 1;

#查询工资比灭绝高的员工信息
SELECT * FROM emp WHERE salary > (SELECT salary FROM emp WHERE name = '灭绝');

#查询比平均工资高的员工信息
SELECT * FROM emp WHERE salary > (SELECT AVG(salary) FROM emp);

#查询比本部门平均工资低的员工信息
SELECT * FROM emp e2 WHERE e2.salary < (SELECT AVG(e1.salary) FROM emp e1 WHERE e1.dept_id = e2.dept_id);

#查询所有的部门信息,并统计部门的员工人数
SELECT d.id,d.name,(SELECT COUNT(*) FROM emp e WHERE e.dept_id = d.id) 人数 FROM dept d;

到了这里,关于MySQL基础-多表查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL数据库基础(三):多表查询,子查询,开窗函数

    表与表之间的关系 在SQL语句中,数据表与数据表之间,如果存在关系,一般一共有3种情况: ① 一对一关系(高级) 比如有A、B两张表,A表中的每一条数据,在B表中有一条唯一的数据与之对应。 用户表user user_id(用户编号) 账号username 密码password 001 admin admin888 002 itheima

    2024年02月12日
    浏览(45)
  • Mysql基础(下)之函数,约束,多表查询,事务

    👂 回到夏天(我多想回到那个夏天) - 傲七爷/小田音乐社 - 单曲 - 网易云音乐 截图自 劈里啪啦 -- 黑马Mysql,仅学习使用 👇原地址 47. 基础-多表查询-表子查询_哔哩哔哩_bilibili 目录 🦂函数 🌳字符串函数 🌳数值函数 🌳日期函数 🌳流程函数 🌳小结 🦂约束  🍈概述 🍈

    2024年02月16日
    浏览(42)
  • MySQL基础篇补充 | 多表查询中使用SQL99实现7种JOIN操作、SQL99语法新特性

    目录 一:多表查询中使用SQL99实现7种JOIN操作  二:SQL99语法新特性 1. 自然连接Natural 2. USING连接 在多表查询中,除了遇到最多的内连接、左外连接和右外连接,还有其它的连接方式;接下来就聊聊其它的连接方式,如下图:  ​​​​​​ 并且在正式讲解之前,需要先了解

    2024年02月03日
    浏览(46)
  • [MySQL] MySQL复合查询(多表查询、子查询)

      前面我们学习了MySQL简单的单表查询。但是我们发现,在很多情况下单表查询并不能很好的满足我们的查询需求。 本篇文章会重点讲解MySQL中的 多表查询 、 子查询 和 一些复杂查询 。希望本篇文章会对你有所帮助。 文章目录 一、基本查询回顾 二、多表查询 2、1 笛卡尔积

    2024年02月04日
    浏览(37)
  • 连接查询(多表查询)——MySQL

    又称多表查询,当 查询的字段涉及多个表 的时候,就要用到连接查询 分类: 为表起别名: 提高语句的简洁度 区分多个重名字段 注意 :如果为表起了别名,则查询的字段就 不能使用原来的别名去限定 查询A、B 交集部分数据 语法: 隐式内连接 select 字段列表 from 表1,表

    2024年02月04日
    浏览(49)
  • MySQL---多表联合查询(上)(多表关系、外键约束、学生成绩多表关系、交叉连接查询)

    1. 多表关系 MySQL 多表之间的关系可以概括为: 一对一:        比如:一个学生只有一张身份证;一张身份证只能对应一学生。        实现原则:在任一表中添加唯一外键,指向另一方主键,确保一对一关系。         一般一对一关系很少见,遇到一对一关系的表最好是

    2024年02月05日
    浏览(56)
  • MySQL表单查询以及多表查询

    1.单表查询 CREATE TABLE `emp`  (   `empno` int(4) NOT NULL,   `ename` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,   `job` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,   `mgr` int(4) NULL DEFAULT NULL,   `hiredate` date NOT NULL,   `sai` int(255) NOT NULL,   `comm` int(255) NULL DEFAULT

    2024年02月13日
    浏览(43)
  • MySQL案例——多表查询以及嵌套查询

    MySQL笔记——表的修改查询相关的命令操作 MySQL笔记——MySQL数据库介绍以及在Linux里面安装MySQL数据库,对MySQL数据库的简单操作,MySQL的外接应用程序使用说明 文章目录 系列文章目录 前言 一 创建数据库 1.1 创建一个部门表 1.2 建一个职务表 1.3 创建一个员工表 1.4 创建一个工

    2024年02月15日
    浏览(42)
  • SQL语句 - 多表查询使用详细介绍

    例如我们有一张员工表和部门表, 员工表有6条数据, 部门表表有4条数据 : 使用多表查询, 查询员工表和部门表两张表 : 此时查询到的结果会有24条数据, 为什么会这样呢 ? 笛卡尔积:有A, B两个集合, 取A, B集合所有组合情况(4*6=24); 我们多表查询, 更多的是消除这些无效的数据 例

    2024年01月16日
    浏览(50)
  • mysql多表查询练习

    两个表如图所示 1、查询每个部门的所属员工 根据表中展现的情况,员工表里面是没有人事部的,如果我们使用内连接就看不出具体的情况,人事部会被直接屏蔽掉 这个时候应该使用左连接,将人事部的情况体现出来 2、查询研发部门的所属员工 3、查询研发部和销售部的所

    2024年02月13日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包