多表查询与子查询

问题的引出:

这里有一个留言板,其中一条评论包含了商品名称good(商品表),留言content(留言表)。 那么请问如将这个评论从数据库查询出来?这就涉及到了多表查询

多表查询是指基于两个和两个以上的表查询.在实际应用中,查询单个表可能不能满足你的需求。

笛卡尔集

首先新建三张表并插入测试数据

#新建一张部门表
create table dept (
				deptno MEDIUMINT  UNSIGNED  NOT NULL DEFAULT 0,
				dname varchar(20) not null default '',
				loc varchar(13) not null default '');
INSERT INTO dept VALUES (10,'ACCOUNTING','NEW YORK'),(20,'RESEARCH','DALLAS'),(30,'SALES','CHICAGO'),(40,'OPERATIONS','BOSTON');
#新建一张员工表
create table emp (
				empno MEDIUMINT unsigned not null default 0,
				ename varchar(20) not null default '',  /* 名字*/
				job varchar(9) not null default '',
				mgr mediumint unsigned , /* 上级编号*/
				hiredate date not null, /* 入职时间*/
				sal  decimal (7,2) not null , /* 薪水*/
				comn decimal(7,2), /* 红利*/
				deptno MEDIUMINT unsigned not null default 0);  /* 部门编号*/
				
INSERT INTO emp VALUES (7369,'SMITH','CLERK', 7902, '1990-12-17', 800.00, NULL , 20);
INSERT INTO emp VALUES ( 7499,'ALLEN' , 'SALESMAN', 7698, '1991-2-20', 1600.00, 300.00, 30);
INSERT INTO emp VALUES (7521,'WARD','SALESMAN', 7698,'1991-2-22', 1250.00, 500.00, 30);
INSERT INTO emp VALUES (7566,'JONES','MANAGER', 7839,'1991-4-2', 2975.00, NULL, 20);
INSERT INTO emp VALUES (7654,'MARTIN','SALESMAN',7698,'1991-9-28',1250.00,1400.00,30);
INSERT INTO emp VALUES (7698, 'BLAKE', 'MANAGER', 7839,'1991-5-1', 2850.00, NULL, 30);
INSERT INTO emp VALUES (7782,'CLARK','MANAGER',7839,'1991-6-9',2450.00,NULL,10);
INSERT INTO emp VALUES (7788, 'SCOTT', 'ANALYST', 7566, '1997-4-19', 3000.00, NULL, 20);
INSERT INTO emp VALUES (7839, 'KING', 'PRESIDENT' , NULL, '1991-11-17' , 5000.00, NULL,10);
INSERT INTO emp VALUES (7844,'TURNER', 'SALESMAN', 7698, '1991-9-8', 1500.00, NULL, 30);
INSERT INTO emp VALUES (7900, 'JAMES', 'CLERK' , 7698, '1991-12-3', 950.00, NULL, 30);
INSERT INTO emp VALUES (7902,'FORD', 'ANALYST', 7566, '1991-12-3', 3000.00, NULL, 20);
INSERT INTO emp VALUES (7934,'MILLER' , 'CLERK', 7782,'1992-1-23', 1300.00,NULL, 10) ;
SELECT * from emp;

#工资级别表
CREATE TABLE salgrade 
(
 grade MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, -- 级别
losal DECIMAL(17,2) NOT NULL, -- 该级别最低工资
hisal DECIMAL(17,2) NOT NULL); -- 该级别最高工资

RENAME TABLE salgradegrade TO salgrade;

INSERT INTO salgrade VALUES(2, 1201, 1400);
INSERT INTO salgrade VALUES(3,1401, 2000);
INSERT INTO salgrade VALUES(4, 2001, 3000);
INSERT INTO salgrade VALUES(5,3001,9999);
INSERT INTO salgrade VALUES(1,700,1200);

 ?显示部门、工资、及所在部门的名称

分析:显示部门编号、工资 需要 查询emp表

          显示部门名称需要查询 dept 表

          在不加where子句的情况下, 先来看 select * from emp,dept (查询两张表用逗号隔开) 返回的结果。总共52条记录。

        那么这52条记录是如何查出来的呢? 从结果来看,每一个员工都对应了所有部门。

 ?显示部门、工资、及所在部门的名称

在笛卡尔积当中,一个员工对应了4个部门,我们只需要部门编号deptno相等的那个部门,所以加上where子句进行过滤。

SELECT emp.deptno,sal,dept.dname from dept,emp where emp.deptno = dept.deptno

多表查询 

多表查询SQL书写思路 :  首先要对表结构高度熟悉。  先用?代替select的具体colunm,  然后考虑需要查询的表是哪几张(from),再考虑筛选条件(where)

-- 显示各个员工的姓名,工资,及其工资的级别
SELECT ename,sal,salgrade.grade 
             from emp,salgrade 
			 where sal BETWEEN salgrade.losal AND salgrade.hisal
-- 如何显示部门号为10的部门名、员工名和工资
SELECT dept.dname,ename,sal ,emp.deptno from dept,emp 
			 where emp.deptno = dept.deptno AND emp.deptno=10;
															
-- 显示雇员名,雇员工资及所在部门的名字,并按部门排序[降序排].
SELECT ename,sal,dept.dname 
             from emp, dept 
			 where emp.deptno = dept.deptno 
			 ORDER BY emp.deptno desc;

自连接

自表连接是指在同一张表上的连接查询。

? 显示公司员工和他的上级的名字 

 -- 显示公司员工和他的上级的名字
 SELECT temp.ename , emp.ename as boss 
                      from emp ,emp as temp  
					  where emp.empno = temp.mgr

子查询

概念 :      子查询是指嵌入在其它sql语句中的select语句,也叫嵌套查询

单行子查询

    单行子查询是指只返回一行数据的子查询语句。

-- 如何显示与smith在同一个部门的员工
SELECT * from emp where deptno = (
				SELECT deptno FROM emp
				where ename = 'SMITH');
																

多行子查询

    多行子查询指返回多行数据的子查询, 使用关键字in

-- 如何查询和部门10的工作相同的雇员的名字、岗位、工资、部门号,但是不含10号部门自己的雇员
-- 分析 首先查10 部门的job
SELECT job from emp where deptno = '10';	
--然后使用子查询
SELECT ename,job,sal,deptno from emp where job in (
				SELECT job from emp
				where deptno = '10'
				)
				and deptno != 10;

子查询临时表

先创建一张商品表并插入测试数据

CREATE TABLE goods_l (
						goods_id INT,
						cat_id INT,
						goods_name VARCHAR(32),
						shop_price DOUBLE );
insert into goods_l VALUES 
				(1,2,'奥利奥',15.00),
				(2,2,'好丽友',20.00),
				(3,3,'卫龙',2.00),
				(4,3,'巧乐兹',5.00),
				(5,4,'可爱多',5.00),
				(6,4,'东方树叶',5.00);
	

-- 查询ecshop中各个类别中,价格最高的商品

	-- 查询ecshop中各个类别中,价格最高的商品.
	-- 分析先查询出 各个类别中的 价格最高
	SELECT cat_id ,MAX(shop_price) from goods_l GROUP BY cat_id;
	-- 再使用临时表
	SELECT goods_l.* from goods_l,( 
							SELECT cat_id ,MAX(shop_price) as max_good 
							from goods_l
							GROUP BY cat_id
					      ) goods 
					 where goods_l.cat_id= goods.cat_id and shop_price = max_good;

查询结果

关键字 ALL 与 ANY

-- 请思考:如何显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号

-- 请思考:如何显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
SELECT ename,sal,deptno from emp where sal >ALL(
																																		 
     SELECT sal from emp where deptno = '30');
SELECT ename,sal,deptno from emp where sal >(
																																		 
  SELECT MAX(sal) from emp where deptno = '30');

 -- 请思考:如何显示工资比部门30的其中一个员工的工资高的员工的姓名、工资和部门号

-- 请思考:如何显示工资比部门30的其中一个员工的工资高的员工的姓名、工资和部门号
SELECT ename,sal,deptno from emp where sal >ANY(
																																		 
 SELECT sal from emp where deptno = '30');

多列子查询

多列子查序则是指查询返回多个列数据的子查询语句

(字段1,字段2...)=(select 字段1,字段2 from。。。。)

-- 请思考如何查询与smith的部门和岗位完全相同的所有雇员(并且不含smith本人)

#请思考如何查询与smith的部门和岗位完全相同的所有雇员(并且不含smith本人)																											
-- 先分析 查询smith的部门与岗位
SELECT deptno,job FROM emp WHERE ename = 'SMITH';	
SELECT * from emp WHERE (deptno,job) = (
                                SELECT deptno,job FROM emp  
								WHERE ename = 'SMITH'
				  ) AND ename != 'SMITH';				

子查询练习

# 请思考:如何显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
SELECT ename,sal,deptno from emp where sal >ALL(
																																		SELECT sal from emp where deptno = '30');
# 请思考:如何显示工资比部门30的其中一个员工的工资高的员工的姓名、工资和部门号
SELECT ename,sal,deptno from emp where sal >ANY(
																																		SELECT sal from emp where deptno = '30');
--
#请思考如何查询与smith的部门和岗位完全相同的所有雇员(并且不含smith本人)																											
# 先分析 查询smith的部门与岗位
SELECT deptno,job FROM emp WHERE ename = 'SMITH';	
SELECT * from emp WHERE (deptno,job) = (
                                      SELECT deptno,job FROM emp  
																																			 
                                      WHERE ename = 'SMITH'
				 ) AND ename != 'SMITH';																																				

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

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

相关文章

idea通过remote远程调试云服务器

引用了第三方的包,调试是看不到运行流程,于是想到了idea的remote方法 -agentlib:jdwptransportdt_socket,servery,suspendn,address9002 写一个.sh文件并启动 nohup java -jar -agentlib:jdwptransportdt_socket,servery,suspendn,address9002 ./demo.j…

论文解读--Robust lane detection and tracking with Ransac and Kalman filter

使用随机采样一致性和卡尔曼滤波的鲁棒的车道线跟踪 摘要 在之前的一篇论文中,我们描述了一种使用霍夫变换和迭代匹配滤波器的简单的车道检测方法[1]。本文扩展了这项工作,通过结合逆透视映射来创建道路的鸟瞰视图,应用随机样本共识来帮助消…

基于算能的国产AI边缘计算盒子8核心A53丨17.6Tops算力

边缘计算盒子 8核心A53丨17.6Tops算力 ● 可提供17.6TOPS(INT8)的峰值计算能力、2.2TFLOPS(FP32)的高精度算力,单芯片最高支持32路H.264 & H.265的实时解码能力。 ● 适配Caffe/TensorFlow/MxNet/PyTorch/ ONNX/…

倒计时 1 天,2023 IoTDB 用户大会期待与您相见!

终于!就在明天,2023 IoTDB 用户大会即将在北京与大家见面! 这场筹备已久的盛会,汇集了超 20 位大咖嘉宾带来的精彩议题,届时来自美国国家工程院、清华大学软件学院的产业大拿,与能源电力、钢铁冶炼、城轨运…

康托展开(Cantor Expansion)

【康托展开简介】康托展开(Cantor Expansion)是一种特殊的哈希函数,是一个相对快速的判重方法,其时间复杂度为O(n^2),其中 n 是集合中元素的个数。康托展开能够判重,依据的是一个集合各元素产生的全部排列中…

翻译: GPT4等大型语言模型的原理解析和未来预测慢思考和模型自我迭代和LLM安全

YouTube: Intro to Large Language Models - YouTube 1. Large Language Model LLM 大家好,最近我做了一个关于大型语言模型的 30 分钟演讲,有点像介绍性演讲,不幸的是,那个演讲没有被录制下来,但很多人在演讲结束后…

企业计算机服务器locked1勒索病毒数据恢复,locked1勒索病毒解密流程

随着计算机技术的不断发展,越来越多的企业走向数字化办公时代,计算机技术为企业的生产运营提供了有利条件,但也为企业带来了网络安全威胁。在本月,云天数据恢复中心陆续接到很多企业的求助,企业的速达办公软件遭到了lo…

Linux周期任务

我自己博客网站里的文章 Linux周期任务:at和crontab 每个人或多或少都有一些约会或者是工作,有的工作是长期周期性的, 例如: 每个月一次的工作报告每周一次的午餐会报每天需要的打卡…… 有的工作则是一次性临时的&#xff0…

面试数据库八股文十问十答第二期

面试数据库八股文十问十答第二期 作者:程序员小白条,个人博客 相信看了本文后,对你的面试是有一定帮助的! ⭐点赞⭐收藏⭐不迷路!⭐ 1.MySQL的主从复制 MySQL的主从复制是什么?MySQL主从复制是一种常见的…

Kubernetes1.27容器化部署Prometheus

Kubernetes1.27容器化部署Prometheus GitHub链接根据自己的k8s版本选择对应的版本修改镜像地址部署命令对Etcd集群进行监控(云原生监控)创建Etcd Service创建Etcd证书的Secret创建Etcd ServiceMonitorgrafana导入模板成功截图 对MySQL进行监控&#xff0…

C语言-结构体

---------------------------- ------------------ 岁月漫长心怀热爱,携手共赴星辰大海 --------今天来到我们自定义类型 -----结构体的讲解 目录 结构体的类型声明和初始化 结构体的类型声明 结构体成员的直接访问 结构体成员的间接访问 嵌套结构体进行访问 使用…

一文通关物理机Ubuntu22.04融合部署OpenStack

前言 因为博主笔记本是amd的,就最近搞了个小主机,就想装个云平台玩玩,搞了三四天才正儿八经弄完,摸了一大堆错误出来,在文章前面我会将这些需要注意的点列举出来。 环境 物理环境: i5 12450H 32G内存 无线…

深度学习——第1章 深度学习的概念及神经网络的工作原理

1.1 序言——探索智能机器 千百年来,人类试图了解智能的机制,并将它复制到思维机器上。 人类从不满足于让机械或电子设备帮助做一些简单的任务,例如使用滑轮吊起沉重的岩石,使用计算器做算术。 人类希望计算机能够自动化执行更…

【KPDK】概述

DPDK的主要目标是为数据平面应用程序中的快速数据包处理提供一个简单、完整的框架。用户可以使用代码来理解所采用的一些技术,构建原型或添加自己的协议栈。可提供使用DPDK的替代生态系统选项。 DPDK框架通过创建环境抽象层(EAL)为特定环境创…

大文件分片上传、分片进度以及整体进度、断点续传(一)

大文件分片上传 效果展示 前端 思路 前端的思路&#xff1a;将大文件切分成多个小文件&#xff0c;然后并发给后端。 页面构建 先在页面上写几个组件用来获取文件。 <body><input type"file" id"file" /><button id"uploadButton…

PyLMKit(3):基于角色扮演的应用案例

角色扮演应用案例RolePlay 0.项目信息 日期&#xff1a; 2023-12-2作者&#xff1a;小知课题: 通过设置角色模板并结合在线搜索、记忆和知识库功能&#xff0c;实现典型的对话应用功能。这个功能是大模型应用的基础功能&#xff0c;在后续其它RAG等功能中都会用到这个功能。功…

前端项目打包和自动化部署(jenkins+gitee+nginx)

项目打包和自动化部署 一. 项目部署和DevOps 1. 传统的开发模式 在传统的开发模式中&#xff0c;开发的整个过程是按部就班就行&#xff1a; 但是这种模式存在很大的弊端&#xff1a; 工作的不协调&#xff1a;开发人员在开发阶段&#xff0c;测试和运维人员其实是处于等待…

【MOJO】Modular语言安装和测试

目录 一、Mojo介绍 Linux​ Mac 二、安装Mojo SDK 三、mojo代码测试 3.1、在 REPL 中运行代码​ 3.2、构建并运行 Mojo 源文件​ 运行mojo文件​ 构建可执行二进制文件​ 四、VSCode安装 一、Mojo介绍 在学习Rust语言的过程中无意发现了Modular语言&#xff0c;语言…

WIN10 WIN11 关闭更新的绝佳办法(极简单无副作用)

WIN10 WIN11 关闭更新的绝佳办法&#xff08;极简单无副作用&#xff09; 极其简单用实用可以关闭更新20年 winr&#xff0c;输入regedit 打开注册表打开注册表的这个路径&#xff1a; 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings 右键空白的地方…

智慧用电安全动态监控系统

智慧用电安全动态监控系统是一种先进的电力监控技术系统&#xff0c;它运用物联网、大数据、云计算等先进技术&#xff0c;对电力系统的运行状况进行实时监控和预警。 该系统依托电易云-智慧电力物联网&#xff0c;通过智能传感终端采集电气线路的实时运行数据&#xff0c;客户…