【MySQL】多表查询 综合练习

多表查询笔记

综合练习

# 1.显示所有员工的姓名,部门号和部门名称。
SELECT e.last_name,e.department_id,d.department_name
FROM employees e 
LEFT JOIN departments d 
ON e.department_id = d.department_id;SELECT e.last_name,e.department_id,d.department_name
FROM employees e 
LEFT JOIN departments d 
USING(department_id);# 2.查询90号部门员工的job_id和90号部门的location_id
SELECT e.employee_id,e.job_id,d.department_id,d.location_id
FROM employees e,departments d 
WHERE e.department_id = d.department_id
AND e.department_id = 90;SELECT e.employee_id,e.job_id,d.department_id,d.location_id
FROM employees e
JOIN departments d 
ON e.department_id = d.department_id
WHERE e.department_id = 90;SELECT e.employee_id,e.job_id,d.department_id,d.location_id
FROM employees e
JOIN departments d 
USING(department_id)
WHERE e.department_id = 90;# 3.选择所有有奖金的员工的 last_name , department_name , location_id , city
SELECT e.employee_id, e.last_name,d.department_name,l.location_id,l.city
FROM employees e 
JOIN departments d ON e.department_id = d.department_id 
JOIN locations l ON d.location_id = l.location_id
WHERE NOT ISNULL(e.commission_pct);SELECT e.employee_id, e.last_name,d.department_name,l.location_id,l.city
FROM employees e 
JOIN departments d ON e.department_id = d.department_id 
JOIN locations l ON d.location_id = l.location_id
WHERE e.commission_pct IS NOT NULL;# 4.选择city在Toronto工作的员工的 last_name , job_id , department_id , department_name
SELECT last_name , job_id , department_id , department_name
FROM employees e 
JOIN departments d 
USING(department_id)
JOIN locations l 
USING(location_id)
WHERE l.city = 'Toronto';# 5.查询员工所在的部门名称、部门地址、姓名、工作、工资,其中员工所在部门的部门名称为’Executive’
SELECT e.employee_id,e.last_name,e.salary,e.job_id,d.department_name,l.street_address
FROM employees e 
JOIN departments d ON e.department_id = d.department_id 
JOIN locations l ON d.location_id = l.location_id
WHERE d.department_name = 'Executive';# 6.选择指定员工的姓名,员工号,以及他的管理者的姓名和员工号,结果类似于下面的格式
# kochhar 101 king 100
SELECT e.last_name,e.employee_id,m.last_name,m.manager_id
FROM employees e , employees m
WHERE e.manager_id = m.employee_id;SELECT CONCAT(e.last_name,'  ',e.employee_id,'  ',m.last_name,'  ',IFNULL(m.manager_id,100))
FROM employees e , employees m
WHERE e.manager_id = m.employee_id# 7.查询哪些部门没有员工
SELECT e.employee_id,d.department_id,d.department_name
FROM employees e 
RIGHT JOIN departments d USING(department_id) -- 查询显示右表 --
WHERE e.employee_id IS NULL; -- 多虑左边 --#方式1:
SELECT d.department_id
FROM departments d LEFT JOIN employees e
ON e.department_id = d.`department_id`
WHERE e.department_id IS NULL
#方式2:
SELECT department_id
FROM departments d
WHERE NOT EXISTS (
SELECT *
FROM employees e
WHERE e.`department_id` = d.`department_id`
)# 8. 查询哪个城市没有部门
SELECT d.department_name,l.location_id,l.city
FROM departments d 
RIGHT JOIN locations l      --   查右 滤左     --
ON d.location_id = l.location_id
where d.department_id IS NULL;SELECT l.location_id,l.city
FROM locations l LEFT JOIN departments d
ON l.`location_id` = d.`location_id`
WHERE d.`location_id` IS NULL# 9. 查询部门名为 Sales 或 IT 的员工信息
SELECT e.employee_id,e.last_name,d.department_name
FROM employees e 
JOIN departments d 
ON e.department_id = d.department_id 
WHERE d.department_name = 'Sales'
OR d.department_name = 'IT';SELECT employee_id,last_name,department_name
FROM employees e,departments d
WHERE e.department_id = d.`department_id`
AND d.`department_name` IN ('Sales','IT');

新建表2:

CREATE TABLE `t_dept` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`deptName` VARCHAR(30) DEFAULT NULL,
`address` VARCHAR(40) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;CREATE TABLE `t_emp` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20) DEFAULT NULL,
`age` INT(3) DEFAULT NULL,
`deptId` INT(11) DEFAULT NULL,
empno int not null,
PRIMARY KEY (`id`),
KEY `idx_dept_id` (`deptId`)
#CONSTRAINT `fk_dept_id` FOREIGN KEY (`deptId`) REFERENCES `t_dept` (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;#1.所有有门派的人员信息 ( A、B两表共有)INSERT INTO t_dept(deptName,address) VALUES('华山','华山');
INSERT INTO t_dept(deptName,address) VALUES('丐帮','洛阳');
INSERT INTO t_dept(deptName,address) VALUES('峨眉','峨眉山');
INSERT INTO t_dept(deptName,address) VALUES('武当','武当山');
INSERT INTO t_dept(deptName,address) VALUES('明教','光明顶');
INSERT INTO t_dept(deptName,address) VALUES('少林','少林寺');
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('风清扬',90,1,100001);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('岳不群',50,1,100002);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('令狐冲',24,1,100003);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('洪七公',70,2,100004);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('乔峰',35,2,100005);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('灭绝师太',70,3,100006);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('周芷若',20,3,100007);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('张三丰',100,4,100008);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('张无忌',25,5,100009);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('韦小宝',18,null,100010);#【题目】
#1.所有有门派的人员信息 ( A、B两表共有)
SELECT e.id,e.`name`,e.age,d.id AS "门派ID",d.deptName
FROM t_emp e 
JOIN t_dept d
ON e.deptId = d.id#2.列出所有用户,并显示其机构信息 (A的全集)
SELECT e.id,e.`name`,e.age,d.id AS "门派ID",d.deptName
FROM t_emp e 
LEFT JOIN t_dept d
ON e.deptId = d.id#3.列出所有门派 (B的全集)
SELECT *
FROM t_dept;SELECT d.id AS "门派ID",d.deptName
FROM t_emp e 
RIGHT JOIN t_dept d
ON e.deptId = d.id;#4.所有不入门派的人员 (A的独有)
# 公示: 查左 滤右
SELECT e.id,e.`name`,e.age,d.id AS "门派ID",d.deptName
FROM t_emp e 
LEFT JOIN t_dept d  
ON e.deptId = d.id
WHERE d.id IS NULL;#5.所有没人入的门派 (B的独有)
# 公式: 查右 滤左
SELECT e.id,e.`name`,e.age,d.id AS "门派ID",d.deptName
FROM t_emp e 
RIGHT JOIN t_dept d
ON e.deptId = d.id
WHERE e.deptId IS NULL;#6.列出所有人员和机构的对照关系 (AB全有)
# 左右外连接 使用 UNION 再连接
SELECT * FROM t_emp e LEFT JOIN t_dept d ON e.deptId = d.id
UNION
SELECT * FROM t_emp e RIGHT JOIN t_dept d ON e.deptId = d.id;#MySQL Full Join的实现 因为MySQL不支持FULL JOIN,下面是替代方法
#left join + union(可去除重复数据)+ right join
#7.列出所有没入派的人员和没人入的门派 (A的独有+B的独有)
SELECT * FROM t_emp e LEFT JOIN t_dept d ON e.deptId = d.id WHERE d.id IS NULL
UNION ALL
SELECT * FROM t_emp e RIGHT JOIN t_dept d ON e.deptId = d.id WHERE e.deptId IS NULL;

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

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

相关文章

class_4:car类

#include <iostream> using namespace std; class Car{ public://成员数据string color; //颜色string brand; //品牌string type; //车型int year; //年限//其实也是成员数据&#xff0c;指针变量&#xff0c;指向函数的变量&#xff0c;并非真正的成员函数void (*…

Win10(CPU)+ Anaconda3 + python3.9安装pytorch

1. 安装Anaconda3 1.1 下载Anaconda3 可以在官网下载Anaconda3-2022.05-Windows-x86_64.exe&#xff0c;这个版本对应的是python3.9。 1.2 安装Anaconda3 此步骤比较简单&#xff0c;双击.exe文件&#xff0c;一步一步执行即可&#xff0c;有不确定的可以自行百度&#xff…

BM25(Best Matching 25)算法基本思想

BM25&#xff08;Best Matching 25&#xff09;是一种用于信息检索&#xff08;Information Retrieval&#xff09;和文本挖掘的算法&#xff0c;它被广泛应用于搜索引擎和相关领域。BM25 基于 TF-IDF&#xff08;Term Frequency-Inverse Document Frequency&#xff09;的思想…

使用Spring Boot集成中间件:Elasticsearch基础->提高篇

使用Spring Boot集成中间件&#xff1a;Elasticsearch基础->提高篇 导言 Elasticsearch是一个开源的分布式搜索和分析引擎&#xff0c;广泛用于构建实时的搜索和分析应用。在本篇博客中&#xff0c;我们将深入讲解如何使用Spring Boot集成Elasticsearch&#xff0c;实现数…

C++ 对象模型 | 关于对象

一、C 对象模型 1、对象内存布局 在C中&#xff0c;有两种数据成员&#xff1a;static和nonstatic&#xff0c;以及三种成员方法static、nonstatic、virtual&#xff0c;下面从虚函数、非虚函数、静态成员变量、非静态成员变量等维度来分析&#xff0c;类对象的内存布局。例如…

多线程(1)

1.实现多线程 1.1简单了解多线程【理解】 是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程&#xff0c;提升性能。 1.2并发和并行【理解】 并行&#xff1a;在同一时刻&#xff0c;有多个指令在多个CPU上…

【打卡】牛客网:BM87 合并两个有序的数组

思想&#xff1a; 简单粗暴的方法是先合并、再排序。没有技术含量。 此外&#xff0c;很容易想到是用归并方法。问题是对A[]从前往后赋值&#xff0c;会覆盖A[]中有用的数值。 模板的巧妙之处是&#xff0c;从后往前赋值&#xff0c;完美避开覆盖问题。 我看了模板的之后写…

js let和var的区别

在JavaScript中&#xff0c;let和var都是用来声明变量的关键字&#xff0c;但它们之间存在一些重要的区别&#xff1a; 作用域&#xff1a;var声明的变量具有函数作用域或全局作用域&#xff0c;这意味着它们的作用域范围在函数内或全局范围内。相比之下&#xff0c;let声明的…

Centos创建一个Python虚拟环境

在 CentOS 上创建一个 Python 虚拟环境&#xff0c;可以使用 virtualenv 工具。以下是创建和激活虚拟环境的基本步骤&#xff1a; 1.安装virtualenv 如果还没有安装 virtualenv&#xff0c;可以使用以下命令安装&#xff1a; sudo yum install python3-virtualenv请注意&…

聚道云软件连接器助力知名企业,提升合同管理效率

一、客户介绍 某服饰股份有限公司是一家集服装设计、生产、销售及品牌建设于一体的企业。该公司的产品线涵盖男装、女装、童装等多个领域&#xff0c;设计风格时尚、简约、大方&#xff0c;深受消费者喜爱。公司注重产品研发&#xff0c;不断推陈出新&#xff0c;紧跟时尚潮流…

【linux笔记】vim

【linux笔记】vim 启动和退出 启动 vi退出 q强制退出 q&#xff01;编辑模式 vi foo.txt创建一个文件&#xff0c;启动后&#xff0c;是命令模式&#xff0c;是不能编辑的&#xff0c;键盘上的按键对应不同的命令。 插入模式 按键盘上的i&#xff0c;进入插入模式 保…

Redis(概述、应用场景、线程模式、数据持久化、数据一致、事务、集群、哨兵、key过期策略、缓存穿透、击穿、雪崩)

目录 Redis概述 应用场景 Redis的线程模式 数据持久化 1.Rdb&#xff08;Redis DataBase&#xff09; 2.Aof&#xff08;Append Only File&#xff09; mysql与redis保持数据一致 redis事务 主从复制&#xff08;Redis集群) 哨兵模式 key过期策略 缓存穿透、击穿、…

剑指offer面试题5 从尾到头打印链表

考察点 链表知识点 数组和链表都属于线性表。线性表在计算机中有俩种存储方式&#xff0c;按照顺序存储的就是数组&#xff0c;按照链式存储的就是链表&#xff0c;二者最大的区别在于一个是顺序存储(地址空间连续)一个是链式存储(地址空间不连续)。因此数组元素只包含元素值…

iToF wiggling校正技术

iToF技术中,wiggling是一种校正处理方法。在iToF模组获取深度图后,会进行一系列的补偿和校正处理,wiggling校正就是其中之一。这样的校正处理有助于最终获得更准确的3D数据。 wiggling校正技术有哪些应用场景 wiggling校正技术主要应用在间接飞行时间测量(iToF)装置中,…

【大厂秘籍】 - Java多线程面试题

Java多线程面试题 友情提示&#xff0c;看完此文&#xff0c;在Java多线程这块&#xff0c;基本上可以吊打面试官了 线程和进程的区别 进程是资源分配的最小单位&#xff0c;线程是CPU调度的最小单位 线程是进程的子集&#xff0c;一个进程可以有很多线程&#xff0c;每条线…

分享八个常用的 JavaScript 库

今天给大家分享8个常用的 JavaScript 库&#xff0c;掌握这些 JavaScript 工具库&#xff0c;让你的项目看起来很棒。 专家与普通人的重要区别在于他们善于使用工具&#xff0c;留出更多的时间用于计划和思考。编写代码也是如此。有了合适的工具&#xff0c;你就有更多的时间来…

UDS 诊断通讯

UDS有哪些车型支持 UDS(统一诊断服务)协议被广泛应用于汽车行业中,支持多种车型。具体来说,UDS协议被用于汽车电子控制单元(ECU)之间的通讯,以实现故障诊断、标定、编程和监控等功能。 支持UDS协议的车型包括但不限于以下几种: 奥迪(Audi)车型:包括A3、A4、A5、A6…

239.【2023年华为OD机试真题(C卷)】求幸存者之和(模拟跳数-JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-求幸存数之和二.解题思路三.题解代码Python题解…

剑指offer题解合集——Week3day7

文章目录 剑指offerWeek3周七&#xff1a;分行从上往下打印二叉树AC代码思路&#xff1a; 周日&#xff1a;之字形打印二叉树AC代码思路&#xff1a; 剑指offerWeek3 周七&#xff1a;分行从上往下打印二叉树 题目链接&#xff1a;分行从上往下打印二叉树 从上到下按层打印…

JDK8终将走进历史,Oracle宣布JDK继续免费

目录 前言Oracle 已免费提供 JDKOracle Java SE 产品最新动态 为什么业界中用JDK8那么多Java SE 8 公共更新结束总结 前言 今天想到上个月无意中听闻到的一句话&#xff1a;JDK8之后收费了&#xff0c;所以大家都用JDK8。当时只觉得这个话说得不对&#xff0c;但因为和说话的人…