多表查询综合归纳

目录

1. 多表关系

1.1 一对多(多对一)

1.2 多对多

 1.3 一对一

2. 多表查询概述

2.1 熟悉表

2.2 笛卡尔积

2.3 消除笛卡尔积

2.4 多表查询分类

3. 内连接

3.1 隐式内连接

3.2 显式内连接

4. 外连接

4.1 左外连接

4.2 右外连接

5. 自连接

5.1 自连接查询 

5.2 外连接查询

6. 联合查询

6.1 union all 

6.2 union

6.3 使用联合查询条件

7. 嵌套/子查询

7.1 标量子查询

7.2 列子查询

1) in 的使用

2)all 的使用

3) any 的使用

7.3 行子查询

7.4 表子查询

8. 多表查询案例

9. 总结

9.1 多表关系

 9.2 多比查询

​编辑

 10 源代码(复制自取)


1. 多表关系

1.1 一对多(多对一)

1.2 多对多

 1.3 一对一

2. 多表查询概述

 

2.1 熟悉表

在接下来的学习中,我们暂且需要使用这两张表,因此,十分有必要熟悉表的结构及其内容;

1. 员工表

2. 部门表

2.2 笛卡尔积

2.3 消除笛卡尔积

在上述多表查询中,可以查到这样的元组。

 显然,有许多信息是我们不需要的,接下来就需要过滤信息,消除笛卡尔积;

2.4 多表查询分类

3. 内连接

内连接又分为隐式内连接和显示内连接;

3.1 隐式内连接

先执行 from ,因此表取别名后,仅允许使用表名;

3.2 显式内连接

显示内连接中, innet 常省略不写;

4. 外连接

外连接分为左外连接和右外连接

此外,左外连接可以改为右外连接,右外连接可以改为左外连接;

4.1 左外连接

左外连接中,out 通常省略;

4.2 右外连接

5. 自连接

5.1 自连接查询 

其使用如下案例所示:

5.2 外连接查询

6. 联合查询

6.1 union all 

这是薪资低于 5000 的员工信息

这是年龄大于 50 的员工信息

这是将两个条件的查询结果联合起来的表

6.2 union

union 可以去除重复;

6.3 使用联合查询条件

7. 嵌套/子查询

7.1 标量子查询

7.2 列子查询

 

1) in 的使用

下面举例演示:

2)all 的使用

 

 

3) any 的使用

7.3 行子查询

7.4 表子查询

再看第二个例子;

8. 多表查询案例

注意:以下查询并非只有一种方式;

 1. 查询员工的姓名,年龄,职位,部门信息;

 2. 查询年龄小于30岁的员工的姓名,年龄,职位,部门信息;

3. 查询拥有员工的部门ID,部门名称(6号部门没有员工)

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

 5. 查询所有员工的工资等级

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

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

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

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

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

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

9. 总结
9.1 多表关系

 9.2 多表查询

 此外,较惋惜的是,本篇未涉及 having,group by ,order by 的使用以及SQL 语句的执行顺序;

 10 源代码(复制自取)
--创建数据库
create database mul_table_demo;

--使用数据库
use mul_table_demo;

--创建表 department
create table department(
	de_id smallint primary key,  --部门id
	de_name varchar(20)			 --部门名称
);

--插入表 department
insert into department values
	(1,'研发部'),(2,'市场部'),(3,'财务部'),
	(4,'销售部'),(5,'总经办'),(6,'人事部');


--创建表 employee
create table employee (
	em_id smallint primary key,                  --员工ID
	em_name varchar(20),						 --员工名字
	age smallint check (age between 18 and 65),  --年龄
	job varchar(20),							 --工作
	salary int not null,						 --薪水
	entrydate date,								 --入职日期
	manager_id smallint,						 --员工的领导ID
	dept_id smallint foreign key references department(de_id)--部门ID 
);

--插入表 employee
insert into employee values								--在将 varchar 值 '*' 转换成数据类型 int 时失败。表示数据类型弄错了
(1, '金庸',  65,'总裁'    ,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,'会计'    ,4800, '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, '2000-01-01',10,2),
(14,'张三丰',65,'销售总监',14000,'2009-02-12',1, 4),
(15,'俞莲舟',38,'销售',    4600, '2004-10-12',14,4),
(16,'宋远桥',40,'销售',    4600, '2004-10-12',14,'4'),	-- 4 or '4':加引号不加引号都是可以的;
(17,'陈友谅',42,null,    2000, '2010-01-01',1, null);	--null不属于任何数据类型,因此外键可以插入 null ,char/int 数据类型都可以插入 null

--多表查询:笛卡尔积
select * from employee,department;

--消除笛卡尔积
select * from employee,department where employee.dept_id = department.de_id;

--内连接
--隐式内连接
--查询每个员工的姓名及关联的部门名称
select 
	em.em_name as '员工姓名',de.de_name as '部门名称' 
from 
	employee as em ,department as de 
where 
	em.dept_id = de.de_id;


--显式内连接
--查询每个员工的姓名及关联的部门名称
select 
	em.em_name,de.de_name 
from 
	employee as em 
join 
	department as de
on 
	em.dept_id = de.de_id


--外连接
--左外连接
--查询 emp 表的全部数据及对应的部门信息
select 
	em.*,de.de_name
from 
	employee as em 
left join 
	department as de 
on 
	em.dept_id = de.de_id

--右外连接
--查询 dept 表的所有信息,和对应的员工信息
select 
	de.de_id,de.de_name,em.* 
from 
	employee as em 
right join 
	department as de
on 
	em.dept_id = de.de_id

--自连接
select * from employee;
--查询员工及其领导的名字
select 
	b.em_name as '员工姓名', a.em_name as '领导姓名' 
from 
	employee as a,employee as b
where 
	a.em_id = b.manager_id;

--查询所有员工及其领导的名字,如果员工没有领导,也要查询出来
select * from employee;
select
	b.em_name  as '员工姓名' ,a.em_name  as '领导姓名'
from 
	employee as a 
right join 
	employee as b
on a.em_id = b.manager_id; 

--联合查询
--查询薪资低于 5000 或年龄大于 50 岁的员工的信息(union all)

select * from employee as e where e.salary < 5000
union all
select * from employee as e where e.age > 50

--查询薪资低于 5000 或年龄大于 50 岁的员工的信息(union)
select * from employee as e where e.salary < 5000
union 
select * from employee as e where e.age > 50

select * from employee as e where e.salary < 5000 or e.age > 50;

--子查询
--标量子查询
--查询“销售部”所在员工的全部信息

--1. 查询“销售部”部门ID
select de_id from department as de where de.de_name ='销售部';
--2. 根据部门ID,查询“员工表”员工信息
select * from employee as em where em.dept_id = 4;
--使用子/嵌套查询,将上述结果整合起来
select * from employee as em 
where em.dept_id = (
	select de.de_id from department as de 
	where de.de_name ='销售部'
);

--查询“方东白”入职之后的员工信息
--方东白的入职日期
select e.entrydate from employee as e where e.em_name='方东白';
--根据方东白的入职日期,查询员工信息
select * from employee as em where em.entrydate > '2000-01-01';
----使用子/嵌套查询,将上述结果整合起来
select * from employee as em where em.entrydate > (
	select e.entrydate from employee as e 
	where e.em_name='方东白'
	);

--列子查询
--查询“销售部”和“市场部”的员工信息
--1. 查询“销售部”和“市场部”的部门ID
select de.de_id from department as de where de.de_name in ('销售部','市场部'); 
--2. 查询根据“销售部”和“市场部”的部门ID,查询其员工信息
select * from employee as em where em.dept_id in (2,4);
--使用子/嵌套查询,将上述结果整合起来
select * from employee as em where em.dept_id in (
	select de.de_id 
	from department as de 
	where de.de_name in ('销售部','市场部')
);

--查询比财务部所有人员工资都高的员工信息
--1. 查询财务部的人员工资
select e.salary 
from employee as e 
where e.dept_id in (
	select d.de_id 
	from department as d 
	where d.de_name = '财务部');
--2. 根据财务部的人员工资,查询比其工资都高的员工信息
select * from employee as e where e.salary > 8500;
--使用子/嵌套查询,将上述结果整合起来(all)
select * from employee as e where e.salary > all(
	select e.salary 
	from employee as e 
	where e.dept_id in (
		select d.de_id 
		from department as d 
		where d.de_name = '财务部'
	)
);

--查询比研发部其中任意一人工资高的员工信息
--1. 查询研发部人员的工资
select e.salary 
from employee as e 
where e.dept_id in (
	select d.de_id 
	from department as d 
	where d.de_name = '研发部'); 
--2.查询比其任意一人工资高的员工信息
select * from employee as e where e.salary > 6600;
----使用子/嵌套查询,将上述结果整合起来( any)
select * from employee as e where e.salary > any (
	select e.salary 
	from employee as e 
	where e.dept_id in (
		select d.de_id 
		from department as d 
		where d.de_name = '研发部'
	)
);

--行子查询
--查询 张无忌的薪资及直属领导相同 的员工信息
--1.查询张无忌的薪资
select e.salary,e.manager_id from employee as e where e.em_name = '张无忌';
--2.根据查询结果,查询员工信息
select * from employee as e where e.salary = 12500 and e.manager_id = 1;
--使用子/嵌套查询,将上述结果整合起来
select * from employee as e where (e.salary,e.manager_id) =
	(
	select e.salary,e.manager_id 
	from employee as e 
	where e.em_name = '张无忌'
	);

--表子查询
--查询“鹿仗客”,“宋远桥”的职位和薪资相同的员工信息
select * from employee as e where (e.salary,e.job) in 
	(
		select e.salary,e.job 
		from employee as e 
		where e.em_name in ('鹿仗客','宋远桥')
    );

--查询入职日期是“2006-01-01”之后的员工信息,及其部门信息
select e.*,d.* 
from ( 
	   select * 
	   from employee as e 
	   where e.entrydate > '2006-01-01'
	 ) as e ,department as d
where
	   e.dept_id = d.de_id;


--案例巩固
select * from employee;
select * from department;
select * from salgrade;
--在创建一张表
create table salgrade(
	grade int,			--薪资等级
	losal int,			--最低薪资
	hisal int			--最高薪资
)
insert into salgrade values
	(1,0,3000),(2,3001,5000),(3,5001,8000),(4,8001,10000),
	(5,10001,15000),(6,15001,20000),(7,20001,25000),(8,25001,3000);
	
--1. 查询员工的姓名,年龄,职位,部门信息;
select 
	e.em_name,e.age,e.job,d.de_name 
from 
	employee as e 
left join 
	department as d 
on 
	e.dept_id = d.de_id ; 
--2. 查询年龄小于30岁的员工的姓名,年龄,职位,部门信息
select 
	e.em_name,e.age,e.job,d.de_name 
from 
	employee as e 
left join 
	department as d 
on 
	e.dept_id = d.de_id 
where e.age < 30;

--3. 查询拥有员工的部门ID,部门名称(6号部门没有员工)
--方法1:子查询
select distinct
	d.de_id,d.de_name 
from 
	(select e.dept_id from employee as e) as em ,department as d
where 
	em.dept_id = d.de_id;
--方法2:内连接
select distinct
	d.de_id,d.de_name 
from 
	employee as e,department as d 
where 
	e.dept_id = d.de_id; 

--4. 查询所有年龄大于40岁的员工,及其所属部门名称,如果员工没有分配部门,也需要展示出来;
select 
	e.*,d.de_name 
from	
	employee as e 
left join 
	department as d 
on 
	e.dept_id = d.de_id 
where 
	e.age > 40; 

--5. 查询所有员工的工资等级(薪水等级表没有外键,如何连接表是关键)
select * 
from 
	employee as e ,salgrade as s 
where 
	e.salary between s.losal and s.hisal; 

--6. 查询研发部所有员工的信息及工资等级
select e.*,s.grade 
from 
	(
		select * 
		from employee as e 
		join department as d 
		on e.dept_id = d.de_id 
		where d.de_name = '研发部'
	) as e ,salgrade as s 
where e.salary between s.losal and s.hisal;

--7. 查询“研发部“员工的平均工资
select 
	avg(e.salary)
from 
	employee as e 
join 
	department as d 
on 
	e.dept_id = d.de_id 
where
	d.de_name = '研发部'

--8. 查询工资比”灭绝“高的员工信息
select * from 
employee as e 
where e.salary > 
	( 
		select e.salary 
		from employee as e 
		where e.em_name = '灭绝'
	);

--9. 查询比平均工资高的员工信息
select * from 
employee as e 
where e.salary > ( select avg(salary) from employee);


--10. 查询低于本部门平均工资的员工信息
select e2.*,(select avg(e1.salary) from employee as e1 where e1.dept_id = e2.dept_id ) as '平均' 
from employee as e2 
where e2.salary < 
	(
		select avg(e1.salary) 
		from employee as e1 
		where e1.dept_id = e2.dept_id 
	) ;

--11. 查询所有部门信息,并统计部门员工人数
select count(*) from employee as e where e.dept_id = 6;
select d.de_id,d.de_name,(select count(*) from employee as e where e.dept_id = d.de_id) as '人数' 
from department as d;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python爬虫(二)爬取国家博物馆的信息

import requests from bs4 import BeautifulSoup# 起始网址 url https://www.chnmuseum.cn/zx/xingnew/index_1.shtml # 用于存储所有数据 all_data [] page 1 global_index 1 # 定义全局序号变量并初始化为1 while True:html_url requests.get(url).textif requests.get…

基于NI Vision和MATLAB的图像颜色识别与透视变换

1. 任务概述 利用LabVIEW的NI Vision模块读取图片&#xff0c;对图像中具有特征颜色的部分进行识别&#xff0c;并对识别的颜色区域进行标记。接着&#xff0c;通过图像处理算法检测图像的四个顶点&#xff08;左上、左下、右上、右下&#xff09;&#xff0c;并识别每个顶点周…

Qt_day7_文件IO

目录 文件IO 1. QFileDialog 文件对话框&#xff08;熟悉&#xff09; 2. QFileInfo 文件信息类&#xff08;熟悉&#xff09; 3. QFile 文件读写类&#xff08;掌握&#xff09; 4. UI操作与耗时操作&#xff08;掌握&#xff09; 5. 多线程&#xff08;掌握&#xff09;…

[论文笔记]An LLM Compiler for Parallel Function Calling

引言 今天带来一篇优化函数调用的论文笔记——An LLM Compiler for Parallel Function Calling。 为了简单&#xff0c;下文中以翻译的口吻记录&#xff0c;比如替换"作者"为"我们"。 当前的函数(工具)调用方法通常需要对每个函数进行顺序推理和操作&…

网络性能测试

一、iperf网络性能测试工具 测试udp丢包率 在服务器启动 iperf 服务端 iperf -p 9000 -s -u -i 1参数说明&#xff1a; -p : 端口号 -s : 表示服务端 -u : 表示 udp 协议 -i : 检测的时间间隔(单位&#xff0c;秒) 在客户端&#xff0c;启动 iperf 客户端 iperf -c xxx.xxx.14…

Rust语言在系统编程中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 Rust语言在系统编程中的应用 Rust语言在系统编程中的应用 Rust语言在系统编程中的应用 引言 Rust 概述 定义与原理 发展历程 Ru…

1-Equity-Transformer:求解NP-Hard Min-Max路由问题的顺序生成算法(AAAI-24)(完)(code)

文章目录 AbstractIntroduction问题表述Methodology多智能体位置编码公平上下文编码训练方案ExperimentsmTSP的性能评估mPDP的性能评估Related WorkConclusionAbstract 最小最大路由问题旨在通过智能体合作完成任务来最小化多个智能体中最长行程的长度。这些问题包括对现实世界…

数字后端教程之Innovus report_property和get_property使用方法及应用案例

数字IC后端实现Innovus中使用report_property可以报告出各种各样object的属性&#xff0c;主要有cell&#xff0c;net&#xff0c;PG Net&#xff0c;Pin&#xff0c;时钟clock&#xff0c;时序库lib属性&#xff0c;Design属性&#xff0c;timing path&#xff0c;timin arc等…

【Vitepress报错】Error: [vitepress] 8 dead link(s) found.

原因 VitePress 在编译时&#xff0c;发现 死链接(dead links) 会构建失败&#xff01;具体在哪我也找不到… 解决方案 如图第一行蓝色提示信息&#xff0c;设置 Vitepress 属性 ignoredeadlinks 为 true 可忽略报错。 .vuepress/config.js export default defineConfig(…

【开源风云】从若依系列脚手架汲取编程之道(七)

&#x1f4d5;开源风云系列 本篇文字量巨大&#xff0c;甚至在发表编辑之时造成编辑器卡顿&#xff0c;哈哈&#xff0c;最近在忙人生的另一项规划&#xff0c;文章更新就逐渐缓慢了&#xff0c;希望我们都逐渐走向自己的道路呀&#xff01; &#x1f34a;本系列将从开源名将若…

Docker+Django项目部署-从Linux+Windows实战

一、概述 1. 什么是Docker Docker 是一个开源的应用容器引擎&#xff0c;支持在win、mac、Linux系统上进行安装。可以帮助我们在一台电脑上创建出多个隔离的环境&#xff0c;比传统的虚拟机极大的节省资源 。 为什么要创建隔离的环境&#xff1f; 假设你先在有一个centos7.…

[项目代码] YOLOv5 铁路工人安全帽安全背心识别 [目标检测]

YOLOv5是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv5具有更高的…

蓝桥杯备赛(持续更新)

16届蓝桥杯算法类知识图谱.pdf 1. 格式打印 %03d&#xff1a;如果是两位数&#xff0c;将会在前面添上一位0 %.2f&#xff1a;会保留两位小数 如果是long&#xff0c;必须在数字后面加上L。 2. 进制转化 2.1. 十进制转任意进制&#xff1a; 十进制转任意进制时&#xff…

使用Element UI实现前端分页,及el-table表格跨页选择数据,切换分页保留分页数据,限制多选数量

文章目录 一、前端分页1、模板部分 (\<template>)2、数据部分 (data)3、计算属性 (computed)4、方法 (methods) 二、跨页选择1、模板部分 (\<template>)2、数据部分 (data)3、方法 (methods) 三、限制数量1、模板部分 (\<template>)2、数据部分 (data)3、方法…

ThriveX 博客管理系统前后端项目部署教程

前端 前端项目地址&#xff1a;https://github.com/LiuYuYang01/ThriveX-Blog 控制端项目地址&#xff1a;https://github.com/LiuYuYang01/ThriveX-Admin Vercel 首先以 Vercel 进行部署&#xff0c;两种方式部署都是一样的&#xff0c;我们以前端项目进行演示 首先我们先…

使用electron-egg把vue项目在linux Ubuntu环境下打包并安装运行

electron-egg一个入门简单、跨平台、企业级桌面软件开发框架https://www.kaka996.com/electron-egg 跳转地址 1,使用 git下载代码到本地,如果没有git需要进行安装 # gitee git clone https://gitee.com/dromara/electron-egg.git # github git clone https://github.com/dro…

力扣-Mysql-3322- 英超积分榜排名 III(中等)

一、题目来源 3322. 英超积分榜排名 III - 力扣&#xff08;LeetCode&#xff09; 二、数据表结构 表&#xff1a;SeasonStats --------------------------- | Column Name | Type | --------------------------- | season_id | int | | team_id …

深度学习基础—Beam search集束搜索

引言 深度学习基础—Seq2Seq模型https://blog.csdn.net/sniper_fandc/article/details/143781223?fromshareblogdetail&sharetypeblogdetail&sharerId143781223&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 上篇博客讲到&#xff0c;贪心算…

vueRouter路由切换时实现页面子元素动画效果, 左右两侧滑入滑出效果

说明 vue路由切换时&#xff0c;当前页面左侧和右侧容器分别从两侧滑出&#xff0c;新页面左右分别从两侧滑入 效果展示 路由切换-滑入滑出效果 难点和踩坑 现路由和新路由始终存在一个页面根容器&#xff0c;通过<transition>组件&#xff0c;效果只能对页面根容器有效…

【EasyExcel】复杂导出操作-自定义颜色样式等(版本3.1.x)

文章目录 前言一、自定义拦截器二、自定义操作1.自定义颜色2.合并单元格 三、复杂操作示例1.实体(使用了注解式样式)&#xff1a;2.自定义拦截器3.代码4.最终效果 前言 本文简单介绍阿里的EasyExcel的复杂导出操作&#xff0c;包括自定义样式&#xff0c;根据数据合并单元格等。…