数据库基础5-复合查询

news2024/11/22 10:03:25

文章目录

  • 多表查询
  • 自连接
  • 子查询
  • 合并查询

基础查询中,再补充一个点:

在使用年薪进行降序排序中,我们有以下语句

//A:
select ename, sal*12+ifnull(comm,0) as '年薪' from emp order by 年薪 desc;

查询到的结果:

在这里插入图片描述

//B:
select ename, sal*12+ifnull(comm,0) as '年薪' from emp order by '年薪' desc;

查询到的结果:

在这里插入图片描述

A语句和B语句的执行结果不同,原因在于对于‘order by’子句中的排序字段的引用方式不同。

在A语句中,‘order by 年薪 desc ’中的‘年薪’是按照列名的方式引用的,表示按照查询结果中的列名进行排序。

在B语句中,‘order by '年薪’desc ’中的‘年薪’是作为字符串常量进行引用的,表示按照字符串进行排序,而不是按照查询结果中的列名进行排序。

因此,A语句中会按照查询结果中计算得到的年薪字段进行降序排序,而第二条语句会按照字符串常量进行排序,结果可能与预期不符。

正确的做法是使用第一种方式,即按照列名的方式引用排序字段,确保按照查询结果中的实际字段进行排序。

多表查询

多表查询在没有指定连接条件的时候会形成笛卡尔积,这意味着每个表中的每一行都将与其他表中的每一行进行组合,生成一个结果集的所有可能组合。

例如,如果有两个表A和B,每个表分别有3行记录,执行以下查询:

SELECT * FROM table1, table2;

这将返回A表和B表之间的笛卡尔积,即9行的结果集。

最终我们可以通过where来约束笛卡尔积,查询到我们想要的结果。

(数据库来源:前文提到的雇员信息表(来自oracle 9i的经典测试表))
显示雇员名、雇员工资以及所在部门的名字,字因为上面的数据来自EMP和DEPT表,因此要联合查询:

select ename,sal,dname from emp,dept;

得到笛卡尔积,在此展示一部分:

在这里插入图片描述

其实我们只要emp表中的deptno = dept表中的deptno字段的记录,所以我们加上where条件

select ename,sal,dname from emp,dept where emp.deptno=dept.deptno;

在这里插入图片描述

自连接

自连接是一种特殊的多表查询操作,它指的是将表与自身进行连接。在自连接中,表被视为两个独立的实体,通过连接条件将它们关联起来。

语法:

select t1.column1, t2.column2 from table_name t1, table_name t2 where condition;

自连接常用于解决以下情况:

  • 层级关系:当表中的数据具有层级结构时,可以使用自连接来处理这种层级关系。例如,员工表中的每个员工可能有一个上级领导,自连接可以用来查找员工及其对应的上级领导。

  • 关联数据:当表中的数据与自身的其他数据存在关联关系时,可以使用自连接来查找这种关联数据。例如,某个表中的记录可能与同一表中的其他记录相关联,自连接可以用来查找这些关联数据。

举个例子:显示员工FORD的上级领导的编号和姓名

select leader.empno, leader.ename from emp leader, emp worker 
where leader.empno=worker.mgr and worker.ename='FORD';

在这里插入图片描述

也可以用子查询实现:

select empno, ename from emp 
where empno=(select mgr from emp where ename='FORD');

子查询

子查询是指在一个查询语句中嵌套使用另一个完整的查询语句。子查询可以嵌套在 SELECT、FROM、WHERE 或 HAVING 子句中,用于提供额外的条件、过滤数据或进行更复杂的查询操作。

  • 单行子查询

返回一行记录的子查询

例子:显示SMITH同一部门的员工编号和名字

select * from emp 
WHERE deptno = (select deptno from emp where ename='SMITH');
  • 多行子查询

返回多行记录的子查询

in 关键字:在SQL中,in 关键字用于指定一个条件,其中一个值匹配列表或子查询中的任何值。通常在 WHERE 子句中使用它来根据特定的值集过滤行。

例子:查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自己的

select ename, job, sal, deptno from emp 
where job in (select distinct job from emp where deptno=10) and deptno!=10;

在这里插入图片描述

all 关键字 :在SQL中,all 关键字用于将一个值与列表或子查询中的所有值进行比较。它通常与比较运算符一起使用,如 >(大于)、<(小于)、=(等于)等。

例子:显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号

select ename, sal, deptno from emp 
where sal > all(select sal from emp where deptno=30);

any 关键字:在SQL中,any 关键字用于将一个值与列表或子查询中的任何值进行比较。它类似于 ALL 关键字,但只要条件对于列表或子查询中的至少一个值为真即可。

例子:显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门的员工)

select ename, sal, deptno from emp 
where sal > any(select sal from emp where deptno=30);
  • 多列子查询

多列子查询是指在子查询中返回多列的结果,然后将该结果作为外部查询的条件或结果之一。多列子查询可以用于各种情况,例如在 WHERE 子句中使用子查询作为条件、在 SELECT 语句中使用子查询作为列等。

需要注意的是,子查询返回的列数必须与外部查询中使用它的地方所需的列数相匹配。否则,将会引发语法错误或返回意外的结果。

例子:查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人

select empno, ename, job from emp 
where (deptno, job) = (select deptno, job  from emp 
where ename='SMITH') and ename<>'SMITH';
  • 在from子句中使用子查询

子查询语句出现在from子句中。这里要用到数据查询的技巧,把一个子查询当做一个临时表使用。

例子:显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资

//获取各个部门的平均工资,将其看作临时表
select ename, deptno, sal,format(asal,2) from emp,
(select avg(sal) asal, deptno dt from emp group by deptno) tmp 
where emp.sal > tmp.asal and emp.deptno=tmp.dt;

例子:查找每个部门工资最高的人的姓名、工资、部门、最高工资

select ename, sal, deptno, ms from emp, 
(select max(sal) ms,deptno dt from emp group by deptno) tmp 
where emp.deptno=tmp.dt and emp.sal=tmp.ms;

例子:显示每个部门的信息(部门名,编号,地址)和人员数量

使用多表:

select dname, dept.deptno,loc,count(*) '部门人数' from emp,dept  
where emp.deptndeptno=dept.deptno group by dept.deptno;

使用子查询:

select dept.deptno, dname, mycnt, loc from dept, 
(select count(*) mycnt, deptno from emp group by deptno) tmp 
where dept.deptno=tmp.deptno;

合并查询

在 SQL 中,可以使用 union 或 union all 运算符来合并查询结果集。这些运算符用于将两个或多个 SELECT 语句的结果合并成一个结果集。

union 运算符会合并并去重两个查询结果集,即它会删除重复的行。而 union all 运算符则会合并两个查询结果集,包括重复的行。

例子:将工资大于2500或职位是MANAGER的人找出来

union(去重):

mysql> select ename, sal, job from emp where sal>2500 union
    -> select ename, sal, job from emp where job='MANAGER';

执行结果:

在这里插入图片描述

union all(不去重):

mysql> select ename, sal, job from emp where sal>2500 
    -> union all select ename,sal,job from emp where job='MANAGER';

执行结果:

在这里插入图片描述

需要注意的是,要使用 union 或 union all 运算符,两个查询的列数和列类型必须相同或兼容。否则,可能会引发错误。

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

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

相关文章

Leetcode 剑指 Offer II 027. 回文链表

题目难度: 简单 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个链表的 头节点 head &#xff0c;请判断其是否为回文链表…

ROS 开发环境搭建(虚拟机版本)(一)

相关工具&#xff0c;以及镜像&#xff08;以后有用&#xff09; 链接&#xff1a;https://pan.baidu.com/s/1xgtp-XGFFNCACV_-0TJO2A 提取码&#xff1a;ar1w 1. 下载vm虚拟机&#xff08;我选择的官方最新的vm虚拟机&#xff09;&#xff0c;安装好 2.安装百度网盘里面的…

办公智慧化风起云涌,华为MateBook X Pro 2023是最短距离

今年以来&#xff0c;我们几乎每个月&#xff0c;甚至每星期都可以看到大模型应用&#xff0c;在办公场景下推陈出新。 办公智慧化已成必然&#xff0c;大量智力工作正在被自动化。一个普遍共识是&#xff1a;AI能力范围之内的职业岌岌可危&#xff0c;AI 能力范围之外的职业欣…

【TES710D】基于复旦微的FMQL10S400全国产化ARM核心模块

板卡概述 TES710D是一款基于上海复旦微电子FMQL10S400的全国产化核心模块。该核心模块将复旦微的FMQL10S400&#xff08;兼容FMQL20S400&#xff09;的最小系统集成在了一个50*70mm的核心板上&#xff0c;可以作为一个核心模块&#xff0c;进行功能性扩展&#xff0c;特别是用…

第二章、认识用户体验五要素(本文作用是通俗讲解,让你更容易理解)

1.用户体验要素分五个层面&#xff0c;分别是战略层、范围层、结构层、框架层、表现层。 战略层&#xff1a;指的是产品所要解决的社会问题&#xff0c;和公司在这个产品上的收益目标。也就是大家所说的产品战略。 范围层&#xff1a;指的是我们要做的业务范围&#xff0c;我…

零基础学Java——基础part01

java基础第一篇 今日任务&#xff1a; 1、什么是软件开发 2、人机交互 3、常用的dos命令&#xff08;了解&#xff09; 4、什么是计算机语言 5、Java三种技术架构&#xff08;了解&#xff09; 6、Java语言特性&#xff08;跨平台原理) (了解&#xff09; 7、Java开发环境搭…

模拟运行600万年 数据0损坏!Solidigm把QLC闪存玩到了极致

不可否认的是&#xff0c;SLC、MLC、TLC、QLC、PLC、HLC……闪存技术一路走下来&#xff0c;整体的可靠性、寿命指标是逐步走低的&#xff0c;这也是NAND闪存架构天然属性所决定的。 当然&#xff0c;这不代表QLC、PLC闪存的就难堪大用&#xff0c;关键是看如何设计与优化&…

Carla自动驾驶仿真四:pygame渲染Camera画面及车辆控制(代码详解)

文章目录 前言一、依赖库安装1、pygame安装2、numpy安装 二、Pygame渲染Carla Camera画面1、连接Carla并初始化TrafficManager2、生成自动驾驶车辆并设置交通行为3、创建初始化pygame surface对象的函数4、创建pygame处理Carla图像的回调函数5、创建pygame键盘控制车辆运动的函…

软件设计师 试题二做题技巧

问题一&#xff1a;去需求分析中找相应的联系类型 问题二先看缺少的属性是不是er图中的实体&#xff0c;如果是实体文中就会有相关的信息&#xff0c;如果没有就对应的去图中找&#xff0c;转化为关系模式对应的联系也要转化为关系模式 如果是一对一就把联系归并到任意一方实…

JS 实现拖拽元素的功能

JS 实现拖拽元素的功能 这篇笔记比较短&#xff0c;主要过一遍 draggable 的事件。 首先简单看一下 HTML 实现&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Comp…

【小程序修改说明】分享朋友的,请忽略!

一、把js文件夹复制到根目录&#xff0c;跟pages同一目录 二、把下面的代码放到app.wxss最下面 代码 import "/js/font-awesome.wxss"; import "/js/font-awesome_small.wxss"; 三、ywym.wxml修改 1、ywym.wxml的最上边加上如下代码 <navigator url&…

【Linux】线程详解之线程控制

文章目录 POSIX线程库创建线程线程ID及进程地址空间布局线程等待pthread_join 线程终止pthread_exit函数pthread_cancel函数 线程分离理解pthread库 POSIX线程库 POSIX线程&#xff08;英语&#xff1a;POSIX Threads&#xff0c;常被缩写为Pthreads&#xff09;是POSIX的线程标…

若依源码解析:DataScopeAspect实现数据范围的控制

文章目录 源代码使用场景界面操作SysDeptServiceImplSysUserServiceImplSysUserMapperDataScope定义 代码解析Aspect和Component不同的数据权限类型Before通知处理数据范围的方法 源代码 Aspect Component public class DataScopeAspect {/*** 全部数据权限*/public static fi…

Python潮流周刊#2:Rust让Python再次伟大

△点击上方“Python猫”关注 &#xff0c;回复“1”领取电子书 这里记录每周值得分享的 Python 及通用技术内容&#xff0c;部分为英文&#xff0c;已在小标题注明。&#xff08;本期标题取自其中一则分享&#xff0c;不代表全部内容都是该主题&#xff0c;特此声明。&#xff…

【Linux Network】I/O多路转接之select

目录 1. 初识select 1.1 select函数原型 1.2 理解select执行过程 1.3 socket就绪条件 1.4 select的特点 1.5 select优缺点 2. 基于select的多人聊天程序 server源代码&#xff1a; client的登录&#xff1a; 结果演示&#xff1a; Linux Network&#x1f337; 1. 初识select 系…

C++初阶--C++入门之基础学习

0.前言 C是一门非常好的编程语言&#xff0c;但可能在学习C的过程中会遇到很多困难。人们常说 “一个人走得很快&#xff0c;一群人会走的更远”&#xff0c; 所以就让我们一起攻坚克难&#xff0c;一起征服C吧&#xff01;从本章开始&#xff0c;我们将开始C的基础学习&#x…

Linux简介及基础操作

1.Linux的作用&#xff1a; 商业服务器基本都是linux的、开源软件都先支持linux、大数据分析&#xff0c;机器学习首选linux、整个互联网地基基本由linux支撑起来。如&#xff1a; 生活中的手机是基于linux二次开发的&#xff0c;还有路由器也是基于linux开发的。 2.Linux是什…

acwing提高--多源BFS+最小步数模型+双端队列广搜

多源BFS 1.矩阵距离 题目https://www.acwing.com/problem/content/description/175/ #include<bits/stdc.h> using namespace std; #define x first #define y second typedef pair<int,int> PII; const int N1010; char g[N][N]; int dist[N][N]; PII q[N*N];…

【轻量化网络系列(2)】MobileNetV2论文超详细解读(翻译 +学习笔记+代码实现)

前言 上一篇我们介绍了MobileNetV1&#xff0c;主要是将普通Conv转换为dw和pw&#xff0c;但是在dw中训练出来可能会很多0&#xff0c;也就是depthwise部分得到卷积核会废掉&#xff0c;即卷积核参数大部分为0&#xff0c;因为权重数量可能过少&#xff0c;再加上Relu激活函数…