多表查询与子查询

news2025/1/24 22:53:25

问题的引出:

这里有一个留言板,其中一条评论包含了商品名称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';																																				

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

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

相关文章

mediapipe+opencv实现保存图像中的人脸,抹去其他信息

mediapipeopencv MediaPipe本身不提供图像处理功能,它主要用于检测和跟踪人脸、手势、姿势等。如果您想要从图像中仅提取人脸主要信息并去除其他信息. # codingutf-8 """project: teatAuthor:念卿 刘file: test.pydate&…

【KPDK】概述

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

LeetCode Hot100 169.多数元素

题目: 给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 方法一:哈希表 ​ class Solution {public int…

记录一次vscode markdown的图片路径相关插件学习配置过程

插件及说明查找过程 csdn搜索markdown图片路径,找到关于这一款插件的回答。打开vscode拓展搜索Paste Image这款插件,看到下载量挺高的,应该不赖。 点击仓库,进入该插件开源的github仓库,查看README文件阅读说明. 淡然在Vscode 插件项目下的细…

C语言之结构体

一.前言引入. 我们知道在C语言中有内置类型,如:整型,浮点型等。但是只有这些内置类 型还是不够的,假设我想描述学⽣,描述⼀本书,这时单⼀的内置类型是不⾏的。描述⼀个学⽣需要名字、年龄、学号、⾝⾼、体…

vue $nextTick 样式私有化

$nextTick 先updated中更新,再nextTick 状态更改做什么事情: updated $nextTick 同步执行完之后,把当前放到队列中 $forceUpdate->sub.update() // 把更新操作放在队列里面 队列机制 基于发布订阅模式,callbacks队列 更新完毕…

Java类的初始化顺序

类初始化顺序遵循以下三个原则(优先级依次递减) 1、静态对象(变量)优先于非静态对象(变量)初始化,其中静态对象(变量)只初始化一次,而非静态对象&…

揭秘原型链:探索 JavaScript 面向对象编程的核心(上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

[UnityWebGL]修改webgl启动模板

首先了解什么是WEBGGL启动模板,如下图: 其次,启动模板在哪里设置,如下图: 最后,怎么改启动模板里面的内容(提供最简单的方式,直接改官方的): 1、首先在Asset…

Spring Cloud Gateway与spring-cloud-circuitbreaker集成与理解

官方文档 spring-cloud-gateway文档地址: https://spring.io/projects/spring-cloud-gateway#overview spring-cloud-circuitbreaker文档地址: https://spring.io/projects/spring-cloud-circuitbreaker 两者关系 首先spring-cloud-gateway集成了断路…

[c++]——string类____详细初步了解string类的运用

在成为大人的路上喘口气. 目录 🎓标准库类型string 🎓定义和初始化string对象 💻string类对象的常见构造 💻string类对象的不常见构造 💻读写string对象 🎓 string类对象的修改操作 &#x1f4…

Opencv制作电子签名(涉及知识点:像素过滤,图片通用resize函数,像素大于某个阈值则赋值为其它的像素值)

import cv2def resize_by_ratio(image, widthNone, heightNone, intercv2.INTER_AREA):img_new_size None(h, w) image.shape[:2] # 获得高度和宽度if width is None and height is None: # 如果输入的宽度和高度都为空return image # 直接返回原图if width is None:h_ratio …

git-6

1.如何用project管理issue? 用project看板管理issue 有五种类型:None、Basic kanban、Automated kanban、Automated kanban with reviews、Bug triage 首先选用Bug triage 利用看板就会很直观,很便捷,Issues也支持,有…

OpenTelemetry系列 - 第4篇 OpenTelemetry K8S生态

目录 一、【Helm】添加OTel Helm repo二、【Helm Chart】OTel Collector2.1 daemonset2.2 deloyment 三、【K8S Operator】OTel Operator3.1 安装OTel Operator3.2 部署OpenTelemetryCollector3.2.1 Deloyment Mode3.2.2 DeamonSet Mode3.2.3 StatefulSetMode3.2.4 Sidecar Mod…

思维模型 莫扎特效应

本系列文章 主要是 分享 思维模型,涉及各个领域,重在提升认知。音乐激发无限潜能。 1 莫扎特效应的应用 1.1 莫扎特效应在教育领域的应用-Baby Einstein”公司 在美国,有一家名为“Baby Einstein”的公司,该公司生产和销售专门为…

SQL自学通之简介

目录 一、SQL 简史 二、数据库简史 1、Dr. Codds 对关系型数据库系统的十二条规则 2、设计数据库的结构 3、数据库的前景 4、对于什么是客户机/服务器型电脑系统 BernardH.Boar的定义如下: 5、交互式语言 6、易于实现 7、SQL 总览 三、流行的 SQL 开发工具…

前端小记--2.element-ui中级联选择器cascader如何默认展开下拉框

最近做项目时,遇到一个需求:在一个排班表中,展示人员的值班情况,点击单元格,弹出下拉框,修改人员排班信息。 由于下拉框选择内容是树状结构,这里使用了element-ui中级联组件cascader&#xff0c…

一起学docker系列之十七Docker Compose 与手动操作的比较与优势分析

目录 1 前言2 不使用 Docker Compose2.1 启动 MySQL 容器2.2 启动 Redis 容器2.3 启动微服务容器 3 使用 Docker Compose4 使用 Docker Compose 的优势5 结语参考地址 1 前言 在当今容器化应用的开发与部署中,容器编排工具的选择对于简化流程、提高效率至关重要。本…

6-69.鸭子也是鸟

按要求完成下面的程序: 1、定义一个Bird类,包含一个void类型的无参的speak方法,输出“Jiu-Jiu-Jiu”。 2、定义一个Duck类,公有继承自Bird类,其成员包括: (1)私有string类型的成员na…

WPF实现文字纵向排布的TabItem

文章目录 基本用法文字竖排显示 WPF布局 基本用法 WPF中的TabControl是一个容器控件,用于在单个窗体或页面中承载多个选项卡。每个选项卡可以包含不同的控件,用于显示不同的内容,其最简单的调用方法如下,只需在TabControl中无脑…