【MySQL 数据库】3、多表查询

news2024/11/26 9:36:46

目录

  • 一、多表关系
  • 二、多表查询
  • 三、内连接
  • 四、外连接
  • 五、自连接
  • 六、联合查询
  • 七、什么是子查询
  • 八、标量子查询
  • 九、列子查询
  • 十、行子查询
  • 十一、表子查询
  • 十二、多表查询练习题

一、多表关系

项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

二、多表查询

在这里插入图片描述

CREATE TABLE dept ( id INT auto_increment COMMENT 'ID' PRIMARY KEY, NAME VARCHAR ( 50 ) NOT NULL COMMENT '部门名称' ) COMMENT '部门表';

INSERT INTO dept ( id, NAME )
VALUES
	( 1, '研发部' ),
	( 2, '市场部' ),
	( 3, '财务部' ),
	( 4, '销售部' ),
	( 5, '总经办' ),
	( 6, '人事部' );
CREATE TABLE emp (
id INT auto_increment COMMENT 'ID' PRIMARY KEY,
NAME VARCHAR ( 50 ) NOT NULL COMMENT '姓名',
age INT COMMENT '年龄',
job VARCHAR ( 20 ) COMMENT '职位',
salary INT COMMENT '薪资',
entrydate date COMMENT '入职时间',
managerid INT COMMENT '直属领导ID',
dept_id INT COMMENT '部门ID' 
) COMMENT '员工表';

ALTER TABLE emp ADD CONSTRAINT fk_emp_dept_id FOREIGN KEY ( dept_id ) REFERENCES dept ( id );

INSERT INTO emp ( id, NAME, age, job, salary, entrydate, managerid, dept_id )
VALUES
	( 1, '金庸', 66, '总裁', 20000, '2000-01-01', NULL, 5 ),
	( 2, '张无忌', 20, '项目经理', 12500, '2005-12-05', 1, 1 ),
	( 3, '杨逍', 33, '开发', 8400, '2000-11-03', 2, 1 ),
	( 4, '韦一笑', 48, '开发', 11000, '2002-02-05', 2, 1 ),
	( 5, '常遇春', 43, '开发', 10500, '2004-09-07', 3, 1 ),
	( 6, '小昭', 19, '程序员鼓励师', 6600, '2004-10-12', 2, 1 ),
	( 7, '灭绝', 60, '财务总监', 8500, '2002-09-12', 1, 3 ),
	( 8, '周芷若', 19, '会计', 48000, '2006-06-02', 7, 3 ),
	( 9, '丁敏君', 23, '出纳', 5250, '2009-05-13', 7, 3 ),
	( 10, '赵敏', 20, '市场部总监', 12500, '2004-10-12', 1, 2 ),
	( 11, '鹿杖客', 56, '职员', 3750, '2006-10-03', 10, 2 ),
	( 12, '鹤笔翁', 19, '职员', 3750, '2007-05-09', 10, 2 ),
	( 13, '方东白', 19, '职员', 5500, '2009-02-12', 10, 2 ),
	( 14, '张三丰', 88, '销售总监', 14000, '2004-10-12', 1, 4 ),
	( 15, '俞莲舟', 38, '销售', 4600, '2004-10-12', 14, 4 ),
	( 16, '宋远桥', 40, '销售', 4600, '2004-10-12', 14, 4 ),
	( 17, '陈友谅', 42, NULL, 2000, '2011-10-12', 1, NULL );

在这里插入图片描述

# 会产生笛卡尔乘积
select * from emp, dept;
# 消除笛卡尔乘积
select * from emp, dept where emp.dept_id = dept.id;

多表查询分类:

在这里插入图片描述

三、内连接

在这里插入图片描述

在这里插入图片描述

1、查询每一个员工的姓名 , 及关联的部门的名称 (隐式内连接实现)

# 隐式内连接
SELECT
	emp.NAME '员工名',
	dept.NAME '部门名' 
FROM
	emp,
	dept 
WHERE
	emp.dept_id = dept.id;

2、查询每一个员工的姓名 , 及关联的部门的名称 (显式内连接实现)

SELECT
	e.NAME '员工名',
	d.NAME '部门名' 
FROM
	emp e
	INNER JOIN dept d ON e.dept_id = d.id;

四、外连接

在这里插入图片描述

1、查询emp表的所有数据, 和对应的部门信息
在这里插入图片描述

SELECT
	e.*,
	d.name '部门名'
FROM
	emp e
	LEFT JOIN dept d ON e.dept_id = d.id;

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

# 右外连接
SELECT
	d.*,
	e.*  
FROM
	emp e
	right JOIN dept d ON e.dept_id = d.id;
# 左外连接
SELECT
	d.*,
	e.* 
FROM
	dept d
	LEFT JOIN emp e ON d.id = e.dept_id;

五、自连接

在这里插入图片描述

1、查询员工 及其 所属领导的名字

在这里插入图片描述

SELECT
	e.*,
	m.NAME '领导名' 
FROM
	emp e
	JOIN emp m ON e.managerid = m.id;
SELECT
	* 
FROM
	emp;
SELECT
	e.*,
	m.NAME '领导名' 
FROM
	emp e,
	emp m 
WHERE
	e.managerid = m.id;

2、查询所有员工 emp 及其领导的名字 emp , 如果员工没有领导, 也需要查询出来

SELECT
	e.NAME '员工名',
	e.managerid '领导id',
	m.NAME '领导名' 
FROM
	emp e
	LEFT JOIN emp m ON e.managerid = m.id;

六、联合查询

在这里插入图片描述
需求:将薪资低于 5000 的员工 , 和 年龄大于 50 岁的员工全部查询出来

# 没有去除重复项
SELECT
	emp.NAME,
	emp.age,
	emp.salary 
FROM
	emp 
WHERE
	emp.salary < 5000 UNION ALL SELECT emp.NAME, emp.age, emp.salary FROM emp WHERE emp.age > 50;
# 去重
SELECT
	emp.NAME,
	emp.age,
	emp.salary 
FROM
	emp 
WHERE
	emp.salary < 5000 UNION SELECT emp.NAME, emp.age, emp.salary FROM emp WHERE emp.age > 50;

在这里插入图片描述

在这里插入图片描述

七、什么是子查询

在这里插入图片描述

在这里插入图片描述

八、标量子查询

在这里插入图片描述

1.查询 "销售部" 的所有员工信息

SELECT
	* 
FROM
	emp 
WHERE
	dept_id = ( SELECT id FROM dept WHERE NAME = '销售部' );

2.查询在 "方东白" 入职之后的员工信息

SELECT
	* 
FROM
	emp 
WHERE
	entrydate > ( SELECT entrydate FROM emp WHERE NAME = '方东白' );

九、列子查询

在这里插入图片描述

1.查询 "销售部" 和 "市场部" 的所有员工信息

SELECT
	* 
FROM
	emp 
WHERE
	dept_id IN ( SELECT id FROM dept WHERE NAME = '销售部' OR NAME = '市场部' );

2.查询比 财务部 所有人工资都高的员工信息

SELECT
	* 
FROM
	emp 
WHERE
	salary > ALL ( SELECT salary FROM emp WHERE dept_id = ( SELECT id FROM dept WHERE NAME = '财务部' ) );

【比 财务部 所有人工资都高的员工信息】换句话说就是:比 财务部 工资最高的人的工资还高的员工信息

# 标量子查询
SELECT
	* 
FROM
	emp 
WHERE
	salary > ( SELECT max( salary ) FROM emp WHERE dept_id = ( SELECT id FROM dept WHERE NAME = '财务部' ) );

3.查询比研发部其中任意一人工资高的员工信息

SELECT
	* 
FROM
	emp 
WHERE
	salary > SOME ( SELECT salary FROM emp WHERE dept_id = ( SELECT id FROM dept WHERE NAME = '研发部' ) );

十、行子查询

在这里插入图片描述

查询与 "张无忌" 的薪资及直属领导相同的员工信息

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

十一、表子查询

在这里插入图片描述
1.查询与 "鹿杖客" , "宋远桥" 的职位和薪资相同的员工信息

在这里插入图片描述

SELECT
	* 
FROM
	emp 
WHERE
	( job, salary ) IN ( SELECT job, salary FROM emp WHERE NAME IN ( '宋远桥', '鹿杖客' ) );

2.查询入职日期是 "2006-01-01" 之后的员工信息 , 及其部门信息

把查询出来的结果集做为临时表来用

# 子查询的结果作为临时表
SELECT
	t.*,
	d.*
FROM
	( SELECT * FROM emp WHERE entrydate > '2006-01-01' ) t
	LEFT JOIN dept d ON t.dept_id = d.id;

十二、多表查询练习题

# losal: 最低薪资
# hisal: 最高薪资
# grade: 等级
CREATE TABLE salgrade ( grade INT, losal INT, hisal INT ) COMMENT '薪资等级表';

INSERT INTO salgrade
VALUES
	( 1, 0, 3000 );
INSERT INTO salgrade
VALUES
	( 2, 3001, 5000 );
INSERT INTO salgrade
VALUES
	( 3, 5001, 8000 );
INSERT INTO salgrade
VALUES
	( 4, 8001, 10000 );
INSERT INTO salgrade
VALUES
	( 5, 10001, 15000 );
INSERT INTO salgrade
VALUES
	( 6, 15001, 20000 );
INSERT INTO salgrade
VALUES
	( 7, 20001, 25000 );
INSERT INTO salgrade
VALUES
	( 8, 25001, 30000 );

1.查询员工的姓名、年龄、职位、部门信息 (隐式内连接)

# 隐式内连接
SELECT
	e.NAME,
	e.age,
	e.job,
	d.id '部门id',
	d.NAME '部门名' 
FROM
	emp e,
	dept d 
WHERE
	e.dept_id = d.id;

2.查询年龄小于30岁的员工的姓名、年龄、职位、部门信息(显式内连接)

# 显示内连接
SELECT
	e.NAME,
	e.age,
	e.job,
	d.id '部门id',
	d.NAME '部门名' 
FROM
	emp e
	INNER JOIN dept d ON e.dept_id = d.id 
WHERE
	e.age < 30;

3.查询拥有员工的部门ID、部门名称

# 显式内连接
SELECT DISTINCT
	d.id,
	d.NAME 
FROM
	dept d
	INNER JOIN emp e ON d.id = e.dept_id;
	
# 隐式内连接
SELECT DISTINCT
	d.id,
	d.NAME 
FROM
	emp e,
	dept d 
WHERE
	d.id = e.dept_id;

4.查询所有年龄大于40岁的员工, 及其归属的部门名称; 如果员工没有分配部门, 也需要展示出 来(外连接)

SELECT
	e.*,
	d.NAME '部门名' 
FROM
	emp e
	LEFT JOIN dept d ON e.dept_id = d.id 
WHERE
	e.age > 40;

5.查询所有员工的工资等级 ☆☆☆
表连接的条件是:工资范围(不一定只有外键可以作为表连接的条件)

SELECT
	e.id,
	e.NAME,
	e.salary,
	g.losal,
	g.hisal,
	g.grade '工资等级' 
FROM
	emp e
	JOIN salgrade g ON e.salary BETWEEN g.losal 
	AND g.hisal;

6.查询 "研发部" 所有员工的信息及 工资等级

SELECT
	e.*,
	s.* 
FROM
	emp e
	JOIN salgrade s ON e.salary BETWEEN s.losal 
	AND s.hisal 
WHERE
	e.dept_id = ( SELECT id FROM dept WHERE NAME = '研发部' );

7.查询 "研发部" 员工的平均工资

SELECT
	avg( e.salary ) '平均工资' 
FROM
	emp e 
WHERE
	e.dept_id = ( SELECT id FROM dept WHERE NAME = '研发部' );
SELECT
	avg( e.salary ) '平均工资' 
FROM
	emp e,
	dept d 
WHERE
	e.dept_id = d.id 
	AND d.NAME = '研发部';

8.查询工资比 "灭绝" 高的员工信息

# 标量子查询
SELECT
	e.* 
FROM
	emp e 
WHERE
	e.salary > ( SELECT salary FROM emp WHERE NAME = '灭绝' )

9.查询比平均薪资高的员工信息

SELECT
	e.* 
FROM
	emp e 
WHERE
	e.salary > ( SELECT avg( salary ) FROM emp );

10.查询低于本部门平均工资的员工信息

SELECT
	* 
FROM
	emp e1 
WHERE
	e1.salary < ( SELECT avg( e2.salary ) FROM emp e2 WHERE e2.dept_id = e1.dept_id );

11.查询所有的部门信息, 并统计部门的员工人数

SELECT
	d.id,
	d.NAME,
	( SELECT count( * ) FROM emp e WHERE e.dept_id = d.id ) '人数' 
FROM
	dept d;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/566035.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

移动端H5页面PDF操作及预览

环境&#xff1a;nodejs 适配&#xff1a;移动端主流浏览器支持企业微信低版本 插件&#xff1a;pdfjs-dist 2.6.347 方案一 本地构建 拉取项目&#xff1a; git clone https://github.com/mozilla/pdfjs-dist.git 全局安装gulp npm install -g gulp-cli 安装项目依赖 np…

chatgpt赋能python:Python中的s.len()方法介绍

Python中的s.len()方法介绍 Python中有各种字符串处理方法&#xff0c;其中s.len()方法是一个重要的方法之一。s.len()返回一个字符串s的长度。这是一个非常基本的方法&#xff0c;但是在很多情况下都会被使用。本文将介绍Python中s.len()方法的一些用法和注意事项。 s.len()…

Redis持久化及集群

Redis可以通过将数据保存在磁盘里实现持久化功能, 以防止宕机导致的数据大量丢失.但是持久化只能保证在磁盘不损坏的情况下, 长时间保存数据, 如果一旦磁盘损坏, 数据仍然会丢失. 为了解决这个问题, 主从复制应允而生. 主从复制是Redis集群中的一总, 其中一个Redis做主, 其他R…

C++数据结构:线性顺序表(数组)

文章目录 前言一、vector简介二、泛型编程自定义数组结构1、定义类2、删除、读取元素和首尾指针3、修改元素、获取元素数量、和插入 总结 前言 将一个线性表存储到计算机中&#xff0c;把线性表的结点按逻辑顺序依次存放到一组地址连续的存储单元里&#xff0c;用这种方法存储…

nodejs+vue+elementui个人心情日志博客网站系统5ht83

语言 node.js 框架&#xff1a;Express 前端:Vue.js 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;VScode 前端vueelementui,博客管理系统模块 该模块是博客管理系统中的重要模块&#xff0c;它也是博客管理系统的主模块&#xff0c;该模块的…

从 WebKit 看浏览器内核架构

浏览器常见的浏览器内核有&#xff1a;Blink、WebKit、Gecko、Trident 等&#xff0c;目前 WebKit 内核占据了非常大的的市场&#xff0c;包括 Chrome、Safari、安卓浏览器等市面上的主流浏览器&#xff0c;都使用了 WebKit 内核。 从 WebKit 看浏览器内核架构 既然 WebKit 这么…

lwip的arp协议的意义和更新时机

ARP协议存在的目的 ARP&#xff08;Address Resolution Protocol&#xff09;协议是 TCP/IP 协议族中的一个协议&#xff0c;它的主要目的是将 IP 地址解析为 MAC&#xff08;Media Access Control&#xff09;地址&#xff0c;以便在局域网中进行通信。 具体而言&#xff0c…

## 如何顺序处理设备上报的数据

1. 引言 随着智能技术的发展&#xff0c;市场上出现了很多的智能设备&#xff0c;其具有连接网络的能力。用户可以实现远程控制&#xff0c;并且设备也可上报自己的状态&#xff0c;实现云端对设备的运行情况分析。在某些情况下需要保证设备上报状态的有序性&#xff0c;例如传…

Unity之ShaderGraph 节点介绍 Input输入节点

目录 Input&#xff08;输入&#xff09;  1、Basic&#xff08;基本&#xff09;   1) Boolean&#xff08;布尔&#xff09;   2) Color&#xff08;颜色&#xff09;   3) Constant&#xff08;常量&#xff09;   4) Integer&#xff08;整型&#xff09;   5)…

weblogic CVE-2023-21839 复现

影响版本 Weblogic 12.2.1.3.0 Weblogic 12.2.1.4.0 Weblogic 14.1.1.0.0 这里是用的docker下载的vulhub的CVE-2023-21839 靶机和攻击机都是192.168.85.131 docker 启动环境 ocker-compose up -d 然后看一下说明书 vim README.zh-cn.md 让你访问ip:7001/console 好&a…

chatgpt赋能python:PythonWoody:网站优化工具的首选

Python Woody: 网站优化工具的首选 在当今数字化时代&#xff0c;网站被认为是企业的门面。 然而&#xff0c;这只是建立网络存在的起点。 在许多情况下&#xff0c;优化网站并提高其排名对于企业的成功至关重要。 在这里&#xff0c;Python Woody成为了网站优化工具的首选。 …

LVGL-最新版本及其版本定义标准

lvgl的最新版本是9.0.0&#xff0c;处于开发分支中。 稳定版本是8.3.0. 建议一般开发使用稳定版8.3.0. .\lvgl.h定义了当前版本 /*************************** CURRENT VERSION OF LVGL ***************************/ #define LVGL_VERSION_MAJOR 8 #define LVGL_VERSION_MINO…

《JavaEE》HTTPS

文章目录 HTTPS起源HTTPS对称加密非对称加密两者的区别 HTTPS的安全问题使用对称加密正常交互黑客入侵解决方案 非对称加密引入非对称加密后的流程 中间人攻击黑客的入侵方案加入后的流程解决方案黑客再次加注解决方案 ​&#x1f451;作者主页&#xff1a;Java冰激凌 &#x1…

ChatGPT突然上线APP!iPhone可用、速度更快,GPT-4用量限制疑似取消

新建了一个网站 ChatGPT人工智能中文站 - ChatGPT人工智能中文站http://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT免费镜像站 OpenAIChatGPT正式推出iOS应用程序的官方公告突然发布。 立即在苹果商店的免费列表中排名第二&#xff0c;在效率列表中排名第一。 &am…

VScode+LaTeX 配置时遇到的一些问题

文章目录 VScodeLaTeX 配置时遇到的一些问题1. json 配置文件总览2. 使用 SumatraPDF 作为 pdf 阅读器时的双向跳转3. 选择使用 VScode 内置的 tab 打开 pdf 或者使用外部 SumatraPDF 打开4. 关于 LaTeX Workshop 插件的安装 VScodeLaTeX 配置时遇到的一些问题 1. json 配置文…

『MySQL 实战 45 讲』17 - 如何正确地显示随机消息?(随机抽取 3 个词)

如何正确地显示随机消息&#xff1f;&#xff08;随机抽取 3 个词&#xff09; 需求&#xff1a;从用户的英语单词表中&#xff0c;随机选择三个单词&#xff0c;创表和插入数据如下&#xff1a; # 建表 CREATE TABLE words (id INT(11) NOT NULL AUTO_INCREMENT,word VARCHA…

Chatgpt版本的opencv安装教程

文章目录 前言一、安装opencv方法一二、安装opencv方法二 前言 最近刚买了台RTX 3070的电脑&#xff0c;顺手刷了个ubuntu系统专门玩Carla&#xff0c;为了方便查资料&#xff0c;也顺手搭了浏览chatgpt的环境&#xff0c;用的clash&#xff0c;还挺好用的。然后刚好在看Carla…

(转载)MATLAB智能算法30个案例分析(4)——基于遗传算法的TSP算法

1 理论基础 TSP(traveling salesman problem,旅行商问题)是典型的NP完全问题&#xff0c;即其最坏情况下的时间复杂度随着问题规模的增大按指数方式增长&#xff0c;到目前为止还未找到一个多项式时间的有效算法。 TSP问题可描述为&#xff1a;已知n个城市相互之间的距离&…

chatgpt赋能python:PythonUrwid:一个优秀的控制台UI工具

Python Urwid&#xff1a;一个优秀的控制台UI工具 在开发控制台应用程序时&#xff0c;通常需要一种轻而易举的方法来创建用户界面。Python Urwid是一个高效&#xff0c;可定制的控制台UI工具&#xff0c;它可以帮助你创建强大的用户界面&#xff0c;同时获取出色的响应时间。…