SQL Server数据库 -- 表的高级查询

news2024/11/17 11:57:20

文章目录

  • 一、子查询
    • 嵌套子查询
    • 相关子查询
  • 二、查询运算
    • 并运算union
    • 交运算intersect
    • 差运算except
  • 三、函数的使用
    • if语句
    • while语句
    • case语句
  • 四、总结


前言

高级子查询是对查询更灵活的运用,学会了高级查询将对数据库使用有很大的帮助。


一、子查询

     1、子查询简介

      在SQL语言中,一个select-from-where语句称为一个查询块。如果一个select语句嵌套在另一个select、insert、update或delete语句中,则称之为子查询或内层查询。

      包含子查询的语句则称为主查询或父查询,一个子查询可以嵌套在另一个子查询中,这样就可以形成:父查询->子查询->子查询......

     where子句中的子查询通常有如下几种形式:

      where <列名> (not)   in   (子查询)  

      where <列名> (>=)    <=  (子查询)   

      where <列名>    exists    (子查询)

下面分别介绍上述几种形式的子查询。


2、嵌套子查询

      嵌套子查询指在内层查询中不关联外层查询的子查询,在where下面的这种子查询,要么返回一个单值,要么返回一个值的列表,嵌套子查询的信息传递是单项的,子查询只向外传递信息。

形式如下:

       select *from 表 

       where 列名  (not)  in 

       ( select * from ...)

例如:select *from 表

          where sno in(子查询)

子查询 求sno 张三、sno李四...

现在有学生表如下:

查询与李晨是同一个系的学生 

 基本思路:查找结果是学生信息,条件是在where中寻找相同的系,子查询条件是和李晨相同的系,则在子查询中查询所有和李晨相同系的系名即可

select * from student
where dept in 
(select dept from student
where sname = '李晨'
)

查找考试成绩大于等于90岁的学生的学号和姓名

 基本思路:

方法1:首先应从sc表中找出所有成绩大于等于90的学生学号,然后再根据这些学号在student表中查找出对应的学生学号和姓名,此方法不连接表

方法2:直接连接sc表 设置条件为grade>=90

select sno ,sname from student
where sno in
(select sno from sc
where grade>=90
)


 3、相关子查询

      相关子查询与嵌套子查询的主要区别在于信息传递,嵌套子查询的信息传递是单向的,子查询向外传递信息。相关子查询的信息传递是双向的,子查询给外层查询传递信息,外层查询也向子查询传递信息。 

      相关子查询的执行过程可分为3个步骤:

1、从外层查询获取一条记录,并将该记录信息传递给内层查询

2、内层查询根据外层查询传递的值执行查询操作

3、内层查询将执行结果传回给外层查询,外层查询利用返回值完成对当前记录的处理

SC表如下:

 由于内层查询和外层查询使用的是同一张表,而且内、外层查询都需要从对方处获取信息,因此需要为表取别名以区分是外层查询的表还是内层查询的表

查询每门课程中考试成绩低于该门课程的平均成绩的学生的课程号、学号和成绩

 分析:要的东西是:课程号、学号和成绩,条件是考试成绩低于--课程平均成绩

则子查询为:课程平均成绩

select cno,sno,grade from sc sc1
where grade <
( select avg(grade) from sc sc2
  where sc1.cno = sc2.cno
)


二、查询运算

SQL支持对查询结果再进行并、交、差运算。每个运算都有属于自己的关键字。

1、并运算

并运算可将两个或多个查询语句的结果集 合并为一个结果集,并运算关键字为:union,可以让两个表或多个表以行的形式合并,之前的join on是以列的形式合并。

如示意图所示:

并运算的语法格式如下:

      select 语句1

      union

      select 语句2

      ......

规定:两个语句的列数必须相同,列数的数据类型必须相同或兼容

union all 保留重复的数据行,union 不保留重复数据行

course表和course2表如下:

合并course表和course2表

select *from course
union
select *from course2

 

 由于限定列数和类型相同,所以对表的要求很高


2、交运算

 交运算是返回同时在两个集合中出现的记录,即返回两个查询结果列值相同的记录,其关键词为:intersect

course表和course2表如下:

查询同时出现在course表和course2表中的记录

select *from course
intersect
select *from course2


3、差运算

差运算是返回一个表中有但另一个表中没有的记录,实现差运算的关键词为:except

course表和course2表如下:

查询在course1表中有但在course2表中没有的记录

select *from course
except
select *from course2

 

 查询在course2表中有但在course1表中没有的记录

select *from course2
except
select *from course


三、函数的使用

      在使用SQL语句编程时,经常需要按照指定的条件进行控制转移或重复执行某些操作,这个过程可以通过流程控制语句来实现!

      流程控制语句用于控制程序的流程,一般分为三类:顺序,分支和循环。SQL Server也提供了对这三种流程控制的支持!!!

1、if分支语句

      if~else语句用于构造分支选择结构,是最基本的选择结构,可以利用if~else语句对一个条件进行测试,并根据测试结果执行相应的操作!!!

声明一个整形变量@grade,给该变量赋值为88,并判断如果@grade大于等于90,则显示“优”,如果@grade在80~89之间则显示“良”,如果小于80则显示其他

declare @grade int
set @grade = 88
if @grade>=90
	print '优'
else if @grade between 80 and 89
    print '良'
else
	print '其他'


2、while语句

      while语句用于设置重复执行的语句块,例如遍历某个重复代码。如果嵌套了两个或多个while循环,则内层的break将会退出到下一个外层循环。

用while循环实现计算5000减1、减2、减3、......一直减到50的结果,并显示最终结果

declare @i int,@sum int
set @i=1
set @sum=5000
while @i<=50
begin
set @sum = @sum-@i
set @i = @i+1
end
print @sum

3、case语句

      case表达式是一种多分支表达式,它可以根据条件列表的值返回多个可能的结果表达式中的一个。

      case表达式可用在任何允许使用表达式的地方,但它不是一个完整的SQL语句,因此不能单独执行,只能作为可以单独执行的语句的一部分来使用。

学生表如下:

查询学生表的考试情况,列出学号、姓名和成绩,同时对成绩进行如下处理:

如果成绩大于等于90分,则在查询结果中显示“优”;

如果成绩在80到89分之间,则在查询结果中显示“良”;

如果成绩在70到79分之间,则在查询结果中显示“中”;

如果成绩在60到69分之间,则在查询结果中显示“及格”;

如果成绩在60分以下,则查询结果中显示“不及格。

select id,name,grade,
case
	when grade >=90 then '优'
	when grade between 80 and 89 then '良'
	when grade between 70 and 79 then '中'
	when grade between 60 and 69 then '及格'
	when grade <60 then '不及格'
end as 成绩
from student


四、总结

      本章主要介绍了SQK Server 查询语句的高级使用,以及一系列辅助查询的小知识点。首先介绍了子查询的嵌套子查询,只返回一个值或一个列表,并且传递由内到外是单项的,相关子查询是内外相互影响,是双向的。子查询大概有三种形式,要么in ,要么比值符号,要么exists存在的意思。

      往后介绍了并运算union:两个表合在一起去掉重复的,交运算intersect:两张表重复的部分,差运算except:一张表有另一张表没有的部分。最后介绍了几种函数语句的使用。

      总体只介绍了这些东西的基本语法,并没有很深入的探讨,先打好基础了解大概,以后遇到真正的问题能够更快更好的学习,慢慢加深数据库的知识,可以积少成多,一步一步的走下去!!!

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

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

相关文章

MATLAB画等深度构造图

clc;clear;close all; data xlsread(J_UNCONFORMITY等深度.xlsx); x data(:,1) xmax max(x); xmin min(x); y data(:,2) ymax max(y); ymin min(y); z data(:,3); N 45…

天天刷题-->LeetCode(两数相加)

个人名片&#xff1a; &#x1f405;作者简介&#xff1a;一名大二在校生&#xff0c;热爱生活&#xff0c;爱好敲码&#xff01; \ &#x1f485;个人主页 &#x1f947;&#xff1a;holy-wangle ➡系列内容&#xff1a; &#x1f5bc;️ tkinter前端窗口界面创建与优化 &…

MachineLearningWu_7+8_LogisticRegression/Classification

x.1 logistic regression 对于诸如分辨细胞是恶性肿瘤细胞与否的类似分类问题&#xff0c;我们使用Linear Regression的模型并不合适&#xff0c;所以引入Logistic Regression的模型&#xff0c;并绘制decision boundary&#xff0c;如下&#xff0c; Classification的最后一层…

mysql多表查询内连接,左外连接,排序,having

多表连接查询 use mydb3; -- 创建部门表 create table if not exists dept3(deptno varchar(20) primary key , -- 部门号name varchar(20) -- 部门名字 );– 创建员工表 create table if not exists emp3(eid varchar(20) primary key , -- 员工编号ename varchar(20), -- 员…

python接口自动化(二十二)--unittest执行顺序隐藏的坑(详解)

简介 大多数的初学者在使用 unittest 框架时候&#xff0c;不清楚用例的执行顺序到底是怎样的。对测试类里面的类和方法分不清楚&#xff0c;不知道什么时候执行&#xff0c;什么时候不执行。虽然或许通过代码实现了&#xff0c;也是稀里糊涂的一知半解&#xff0c;这样还好&am…

基于深度学习的高精度Caltech行人检测系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度Caltech数据集行人检测识别系统可用于日常生活中或野外来检测与定位行人目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的行人目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv…

部署HAproxy + Nginx负载均衡集群

目录 一、常规Web集群调度器 HAproxy概念&#xff08;主要特性&#xff09; HAproxy负载均衡八种策略 二、LVS、Nginx、HAproxy区别 Nginx服务 LVS服务 HAproxy服务 三、部署HAproxy Nginx负载均衡集群 第一步 关闭防火墙和安全机制 第二步 安装依赖环境 第三步 导…

基于paddelOCR的车票识别以及在PCB板上应用

基于paddelOCR的车票识别 任务简介 车牌识别就是从图片或者视频中提取车牌信息 任务难点 尺度差异大&#xff0c;悬挂位置不固定&#xff1b;角度倾斜&#xff0c;图片模糊&#xff0c;光照不足&#xff0c;过曝等问题&#xff1b;边缘和端测场景应用对模型大小有限制&#…

C++之装饰器适配器模式

目录 一、装饰器模式 模式思想 模式简介 模式优点 模式缺点 代码实现 情景模拟 代码实现 运行结果 二、适配器模式 模式简介 介绍 优点 缺点 代码实现 情景模拟 一、装饰器模式 模式思想 模式简介 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向…

前端基础(三十六):读取本地音视频设备并进行播放

效果 navigator.mediaDevices.enumerateDevices 请求媒体输入和输出设备的列表&#xff0c;例如麦克风&#xff0c;摄像机&#xff0c;耳机设备等 navigator.mediaDevices.getUserMedia 会提示用户给予使用媒体输入的许可&#xff0c;媒体输入会产生一个MediaStream&#xff0c…

伺服系统行业发展

伺服系统行业发展 1 介绍1.1 概述1.2 一般应用1.3 分类按系统功率分类按动力来源分类 1.4 工业控制中的伺服系统1.5 数字信号驱动与模拟信号驱动对比1.6 发展历史 2 伺服系统厂家工业机械臂移动AMR 3 关键指标及难点4 三相交流逆变器&#xff08;直流电转换为交流电&#xff09…

创建 Code Interpreter Demo: 一次实践的探索

好消息&#xff0c;好消息&#xff0c;Code Interpreter可以测试使用了&#xff01;&#xff01;&#xff01; 在这篇文章中&#xff0c;我们将探索如何创建一个 Code Interpreter Demo。提交一个2023年1-5月份的融资记录数据&#xff0c;让它来帮我们分析一下这些数据。 执行…

TCP 重传机制 滑动窗口 流量控制 拥塞控制 学习总结!

大家好&#xff0c;我是三叔&#xff0c;很高兴这期又和大家见面了&#xff0c;一个奋斗在互联网的打工人。 这篇博客主要记录 tcp 的基础知识的学习总结相关内容&#xff01;备注&#xff1a;图片均来自作者&#xff1a;小林哥 tcp 的三大特性 tcp 大家都不陌生&#xff0c…

Python制作gif表情包生成工具,斗图再也不会输啦

在当前无表情包不会聊天的时代&#xff0c;怎么也不能输在表情包数量不足上啊&#xff0c;今天咱们就来制作一个 gif 生成工具&#xff0c;用来制作表情包也太好用啦 先来看看整体效果 技术交流 技术要学会分享、交流&#xff0c;不建议闭门造车。一个人可以走的很快、一堆人…

如何解决PostgreSQL执行语句长时间卡着不动,不报错也不执行的问题?

1 问题现象 执行SQL语句&#xff0c;卡着不动&#xff0c;不成功也不执行&#xff0c;就像挂住了一样。 truncate table simple; 2 原因分析 一般来说&#xff0c;语句呈现卡着的状态&#xff0c;主要会是两种原因比较多&#xff0c; 原因1&#xff1a;SQL语句是一个耗时操…

Java8新特性——lambda表达式、函数式接口、方法引用、Stream API与Optional类

目录 一、lambda表达式 (一)lambda相关概念 (二)lambda示例 (三)lambda用法 1.语法格式一&#xff1a;无参&#xff0c;无返回值 2.语法格式二&#xff1a;有参数&#xff0c;无返回值 3.数据类型可以省略&#xff0c;因为可由编译器推断得出&#xff0c;称为”类型推断…

统计数据记录

分红20% 分红22% 分红25%

手把手教大家实现 npm 包,并发布 npm 仓库,搭建文档(二)

昨天写了第一篇文章,反响平平 一个 NPM 包,帮助数十万程序员提高数十倍效率,难道不开源出来?(一) 首先贴下我们的官网 【预览页】 https://kennana.github.io/toolkit-use/ 我们的推特 【toolkituse】 https://twitter.com/Toolkituse 我们的github 【toolkit-u…

实现一个周选择器组件

1、需求&#xff1a; 默认每个月的第一个周一为该月的第一周开始&#xff0c;规则如图所示 2、使用到的工具&#xff1a; vue2vant2momentjs 3、父组件&#xff1a; data中定义涉及到的参数 minDate: new Date(this.$moment().subtract(12,month)) maxDate: new Date(),…

OpenCV 入门教程:全局阈值处理

OpenCV 入门教程&#xff1a;全局阈值处理 导语一、全局阈值处理二、示例应用2.1 图像二值化2.2 图像去噪 总结 导语 全局阈值处理是图像处理中常用的技术之一&#xff0c;用于将图像转换为二值图像&#xff0c;从而提取感兴趣的目标区域。在 OpenCV 中&#xff0c;全局阈值处…