SQL语句之SELECT语句

一般格式
SELECT DISTINCT/ALL 目标列表达式   //要显示的属性列
FROM 表名/视图名   //查询的对象
WHERE 条件表达式   //查询条件
GROUP BY 列名 HAVING 条件表达式   //查询结果分组
ORDER BY 列名 次序;   //最终查询结果排序

文章目录

一、基本查询

1、SELECT 目标列表达式

2、WHERE 条件表达式

3、GROUP BY 列名 HAVING 条件表达式

4、ORDER BY 次序

二、连接查询

三、嵌套查询

1、IN-子查询

2、运算符-子查询

3、ANY/ALL-子查询

4、EXISTS-子查询

四、集合查询

1、UNION 并操作

2、INTERSECT 交操作

3、EXCEPT 差操作

五、基于派生表的查询

一、基本查询

1、SELECT 目标列表达式

(1)查询指定列:SELECT 列名 1,列名 n
eg.查询 TAB 表的 X属性列和 Y属性列

SELECT X, Y
FROM TAB;

(2)查询全部列:SELECT *
eg.查询 TAB 表的全部记录

SELECT *
FROM TAB;

(3)查询计算后的值:SELECT 表达式 //可以是算术表达式、字符串常量、函数等等
eg.查询 TAB 表(假定有一项属性 age 记录人们的年龄)中人们的出生日期

SELECT 2022-age
FROM TAB;

(4)改变查询结果的列标题:SELECT 列名 别名
eg.查询 TAB 表中的 X和Y属性列,并在结果中用别名 x1 和 y1 显示

SELECT X x1, Y y1
FROM TAB;

(5)取消查询结果中的重复行:SELECT DISTINCT 列名
eg.查询 TAB 表中的X属性,并去掉结果中的重复列

SELECT DISTINCT X, //如果没有用 DISTINCT,则默认为 ALL
​​​​​​​FROM TAB;

(6)聚集函数
注意:当聚集函数遇到空值时,都跳过空值,只处理非空值
聚集函数只能用于 SELECT 语句和 GROUP BY 中的 HAVING 子句(见后部分)

① 统计元组的个数
COUNT(*)//某个元组的一个或部分取空值时,不影响统计结果
eg.查询 Student 表中学生的总数

SELECT COUNT(*)
FROM SC;

② 统计某一列值的个数
COUNT (DISTINCT/ALL 列名)
如果指定 DISTINCT,则表示计算时要取消重复值。若不指定,则默认为 ALL,表示不取消重复值③ 计算某一列值的平均数(该列必须为数值型)
AVG (DISTINCT/ALL 列名)
eg 计算 SC 表中的平均成绩(Grade)

SELECT AVG(Grade)
FROM SC;

④ 计算某一列值的总和(该列必须为数值型)
SUM(DISTINCT/ALL 列名)
⑤ 计算某一列值的最大值/最小值
MAX/MIN (DISTINCT/ALL 列名)

2、WHERE 条件表达式

(1)比较大小
常用比较运算符: = > < >= <= !=(或者<>) !> !<
eg.查询 SC 表中全体计算机学生的姓名

SELECT Sname
FROM SC
WHERE Sdept='cs';

eg.查询 TAB 表中X>20 的Y

SELECT Y
FROM TAB
WHERE X>20;

(2)确定范围
WHERE 列名 BETWEEN 最小值 AND 最大值;

eg.查询 TAB 表上 age 在 20 到 30 之间的人的 name 和 sex

SELECT name, sex
FROM TAB
WHERE age BETWEEN 20 AND 30;

WHERE 列名 NOT BETWEEN 最小值 AND 最大值;

eg.查询 TAB 表上 age 不在 20 到 30 之间的人的 name 和 sex

SELECT name, sex
FROM TAB
WHERE age NOT BETWEEN 20 AND 30;

(3)确定集合
WHERE 列名 IN('列名 1,'列名 n');

eg.在SC表的 Sdept列中査找属于计算机专业(CS)、数学专业(MA)、信息专业(IS)的学生姓名(S name)

SELECT Sname
FROM SC
WHERE Sdept IN ('CS', 'MA', 'IS’);

WHERE 列名 NOT IN('列名 1','列名 n');

eg.在 SC表的 Sdept列中查找既不是计算机专业(CS)也不是数学专业(MA)的学生姓名(Sname)

SELECT S name
FROM SC
WHERE Sdept NOT IN ('CS', 'MA');

(4)字符匹配
通配符:写在字符串当中,用来求一些有特殊条件的字符串

%  表示任意长度(可以为 0)的字符串。如 a%b,表示以a开头,b结尾的任意长度字符串
_   表示单个字符。如 a_b,表示以a开头b结尾的长度为3的字符串

注意:在 ASCII 码表中,一个汉字的长度为 2
转义字符:字符串中紧跟在转义字符后的字符"%"或"_"不再具有通配符的含义
设置转义字符的语句为 ESCAPE"符号",该符号可以自己设置,一般采用'\'

例如需要查找的字符串为"50%',那么应写"50\%',否则会査找以 50 开头的不定长字符串

WHERE 列名 LIKE '字符串' ESCAPE '\';
eg.在 Student 表中查找所有姓刘且全名为3个汉字的学生的 Sname、Sno 和 Ssex

SELECT Sname, Sno, Ssex
FROM Student
WHERE Sname LIKE '刘_ _ _';

eg.在 SC表中查找课程名(Cname)为 DB Design 的课程号(Cno)

SELECT CnO
FROM SC
WHERE Cname LIKE 'DB\ Design' ESCAPE '\';

WHERE 列名 NOT LIKE '字符串' ESCAPE '\';
eg.在 Student 表中查找所有不姓刘的学生的 Sname

SELECT Sname
FROM Student
WHERE Sname NOT LIKE '刘%';

(5)空值查询
WHERE 列名 IS NULL;
eg.在 SC表中查询缺少成绩(Grade)的学生的姓名(Sname)

SELECT Sname
FROM SC
WHERE Grade IS NULL;

WHERE 列名 IS NOT NULL;
eg.查询全部有成绩(Grade)的学生的姓名(Sname)

SELECT Sname
FROM SC
WHERE Grade IS NOT NULL;

(6)多重条件查询
WHERE 条件表达式 AND 条件表达式:
WHERE 条件表达式 OR 条件表达式;
可以用 AND 或者 OR将上述各类条件表达式组合在一起。其中,AND 的优先级大于 OR

3、GROUP BY 列名 HAVING 条件表达式

用于将查询结果按某一列或多列的值分组,值相等的为一组目的是细化聚集函数的作用对象,分组后聚集函数将作用于每一个组,每一组都有一个函数值

(1)GROUP BY 列名
eg.求 SC 表中,各个课程号(Cno)下相应的选课人数(Sno)

SELECT Cno, COUNT(Sno)
FROM SC
GROUP BY Cno; //表示具有相同 Cno 值的元组为一组,对每一组用 COUNT 进行计算,求得该组的人数

(2)GROUP BY 列名 HAVING 筛选条件

与 WHERE 的区别:
HAVING 用于从组中选择满足条件的组
WHERE用于从基本表或视图中选择满足条件的元组(注意:WHERE 子句不可以接聚集函数)
eg.在 SC表中查询平均成绩(Grade)大于等于 90的学生学号(Sno)和平均成绩(Grade)

SELECT Sno, Grade
​​​​​​​FROM SC
GROUP BY Sno
HAVING AVG(Grade)>=90;

4、ORDER BY 次序

ORDER BY 列名 1 列名n ASC
对查询结果按照一个或多个属性列的升序排列(若不表明次序,默认为升序)
ORDER BY 列名 1 列名n DESC
对查询结果按照一个或多个属性列的降序排列
eg.查序 SC 表中 Cno 为3的学生的 Sno 和 Grade,结果按照 Grade 的降序排列

SELECT Sno, Grade
FROM SC
WHERE Cno='3'
ORDER BY Grade DESC;

二、连接查询

1、两表连接查询

WHERE 表名 1.列名1 比较运算符 表名 2.列名 2; //当列名在参与连接的各表中唯一时,可省去表名前缀

eg.查询 Student 表中学生的情况以及 SC表中他们对应的选课情况,要求在一个查询结果中展示

SELECT Student.*,Sc.* //若两个表中有相同名的属性列,自然连接
FROM Student, Sc
WHERE Student.Sno=Sc.Sno; //用 Sno 作为连接字段,将两个表连接在一起

/*若想获得自然连接,则列举全部属性列,并去掉一个相同的属性列即可。可以将上述 SELECT 语句改写如下*/

SELECT Student.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade

eg.在 Student表和 SC表中,查询选修了2号课程(Cno='2”)且成绩(Grade)在90 分以上的学生学号(Sno)和姓名(Sname)

SELECT Student.Sno, Sname
FROM Student, SC
WHERE Student.Sno=SC.Sno AND SC.Cno='2' AND SC.Grade>90; // AND 用作多重条件

2、单表连接查询

eg.在 Course 表中查询先修课的先修课(即间接先修课),其中课程号为 Cno,先修课程号为 Cpno

SELECT FIRST.CNO, SECOND.Cpno//利用下述别名进行选择
FROM Course FIRST, Course SECOND//为这个表取两个别名
WHERE FIRST.CpnO=SECOND.Cno;

3、外连接查询

将悬浮元组保留在结果关系中,没有属性值的位置填上 NULL

(1)左外连接查询
FROM 表名1LEFT OUTER JOIN 表名2 ON(连接条件); //也可以将 ON 换成 USING,去掉结果中的重复值

(2)右外连接查询
FROM 表名1 RIGHT OUTER JOIN 表名 2 ON(连接条件);

eg.以 Student表为主体列,排出每个学生的基本情况和选课情况(SC 表中),没选课的学生依旧保留在结果中

SELECT Student.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade
FROM Student LEFT OUTER JOIN SC ON (Student.Sno=Sc.Sno); //左外连接

4、多表连接查询

WHERE 表名 1.列名 1=表名 2.列名 2 AND 表名 2.列名 2=表名 3.列名 3
多表连接一般是先进行两个表的连接操作,再将其连接结果与第三个表执行连接

eg.从 Student表、SC表、Course 表中查询每个学生的学号(Sno)、姓名(Sname)、课程(Cname)和成绩(Grade)

SELECT Student.Sno, Sname, Cname, GradeFROM Student, SC, Course
WHERE Student.Sno=Sc.Sno AND SC.Cno=Course.Cno;

三、嵌套查询

查询块:SELECT-FROM-WHERE
嵌套査询:将一个查询块嵌套在另一个查询块的 WHERE 子句或者 HAVING 子句其中,上层的查询块称为外层查询/父查询;下层的查询块称为内层查询/子查询
注意:子査询的 SELECT 语句中不能使用 ORDER BY 子句,ORDER BY 子句只能对最终查询结果排序

1、IN-子查询

父查询与子查询之间用 IN 连接
WHERE 列名 IN(子查询);

eg.查找与刘晨同一个专业的同学

SELECT Sdept
FROM Student
WHERE Sname='刘晨;

查找结果为刘晨在 CS 专业,之后再査找 CS 专业的学生

SELECT Sno, Sname, Sdept
FROM Student
WHERE Sdept='Cs';
SELECT Sno, Sname, Sdept
FROM Student
WHERE Sdept IN
    (SELECT Sdept
     FROM Student
     WHERE Sname='刘晨”);//本例的子查询条件不依赖于父査询,这类子査询称为不相关子查询比较

2、运算符-子查询

父查询与子查询之间用比较运算符连接
WHERE 列名 比较运算符(子查询);//当用户能确切知道内层査询返回的是单个值时,可用比较运算符连接

eg.在 SC表中,找出每个学生(Sno)超过他自己选修课程平均成绩(Grade)的课程号(Cno)

SELECT Sno, Cno
FROM SC x //x 是表 SC 的别名,又称为元组变量,可以用来表示 SC 的一个元组
WHERE Grade >=
        (SELECT AVG(Grade)
         FROM SC y
         WHERE y.Sno=x.Sno);/*本例的子查询条件依赖于父查询,这类子查询称为相关子查询,整个查询称为相关嵌套查询*/

3、ANY/ALL-子查询

WHERE 列名 比较运算符 ANY/ALL (子查询); //有的系统中 ANY用 SOME 代替 

eg.在 Student表中,查询不是 CS 专业的学生中,比 CS 专业任意一个学生年纪小的学生姓名和年龄

SELECT Sname, Sage
FROM Student
WHERE Sage<ANY
    (SELECT Sage
     FROM Student
     WHERE Sdept='CS')
AND Sdept<>'CS://注意这是父查询块中的条件

4、EXISTS-子查询

EXISTS 代表存在量词(与之对应的为 NOT EXISTS)
EXISTS 谓词的子查询不返回任何数据,只产生逻辑真值'true"或逻辑假值'false

逻辑蕴涵表达:
eg1.在 SC表中查询至少选修了1号学生选修的全部课程(Cno)的学生的学号(Sno)

SELECT DISTINCT SnO
FROM SC SCX
WEHRE NOT EXISTS
    (SELECT *    //由 EXISTS 引出的子查询,其目标列表达式通常都用*
     FROM SC SCY
     WHERE SCY.SnO='1' AND NOT EXISTS
        (SELECT *
         FROM SC SCZ
     WHERE SCZ.Sno=SCX.Sno AND SCZ.Cno=SCY.Cno)
    );

eg2.基于 SC表,查询选修了全部课程(Course 表)的学生姓名(Student 表)

SELECT SnameFROM Student
WHERE NOT EXISTS
    (SELECT *
     FROM Course
     WHERE NOT EXISTS
        (SELECT *
         FROM SC
         WHERE Sno=Student.Sno AND Cno=Course.Cno)
    );

四、集合查询

多个 SELECT 语句的结果可以进行集合的并(UNION)、交(INTERSECT)、差(EXCEPT)操作
注意:参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同

SELECT 语句1 UNION/INTERSECT/EXCEPT SELECT 语句 2

1、UNION 并操作

UNION 合并查询结果时,系统会自动去掉重复元组,若需保留,则采用 UNION ALL

eg1.在 Student 表中查询 CS 专业的学生和年龄不大于 19 岁的学生

SELECT *
FROM Student
WHERE Sdept='CS
UNION
SELECT *
FROM Student
WEHRE Sage<=19;

eg2.在 SC 表中查询选修了课程1或者课程2的学生

SELECT SnO
FROM SC
WHERE CnO='1'
UNION
SELECT SnO
FROM SC
WEHRE Cno='2';

2、INTERSECT 交操作

eg.查询既选修了课程1又选修了课程2的学生

SELECT SnO
FROM SC
WHERE Cno='1’
INTERSECT
SELECT SnO
FROM SC
WEHRE Cno='2';

3、EXCEPT 差操作

eg.查询 CS 专业的学生与年龄不大于 19 岁的学生的差集

SELECT *
FROM Student
WHERE Sdept='CS'
EXCEPT
SELECT *
FROM Student
WEHRE Sage<=19;

五、基于派生表的查询

子查询出现在 FROM 子句时,子查询将生成临时的派生表,成为主查询的查询对象。
FROM (子查询 ) AS 别名(属性列名 1,属性列名 n);
//如果子査询中没有聚集函数,派生表可以不指定属性列,子査询 SELECT 子句后面的列名为其默认属性
//AS 可以省略,但必须为派生表关系指定一个别名;
eg1.找出每个学生超过他自己选修课程平均成绩的课程号

SELECT Sno, Cno
FROM SC, (SELECT SnO, Avg(Grade) FROM SC GROUP BY Sno) AS Avg_sc(avg_sno, avg_grade)
WHERE SC.Sno = Avg_sc.avg_sno AND SC.Grade>=Avg_sc.avg_grade;

eg2.查询所有选修了1号课程的学生姓名

SELECT Sname
FROM Student, (SECLECT SnO FROM SC WHERE CnO='1') AS SC1
WHERE Student.Sno=Sc1.Sno;

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

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

相关文章

猜数字游戏有三变(Java篇)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

Debug和Release

Debug和Release 在VS上编写代码的时候&#xff0c;就能看到有 debug 和 release 两个选项&#xff0c;分别是什么意思呢&#xff1f; Debug 通常称为调试版本&#xff0c;它包含调试信息&#xff0c;并且不作任何优化&#xff0c;便于程序员调试程序&#xff1b;程序员在写代码…

跟着cherno手搓游戏引擎【29】Batch简单合批

思路&#xff1a; CPU和GPU都开辟同样大小的一大块内存&#xff08;为了存储顶点信息&#xff09; 索引在程序运行时生成对应规则后绑定到索引缓冲中 动态生成顶点信息&#xff08;现在改成Drawquad只是确定图形顶点的位置&#xff09; 然后在Endscene&#xff0c;将CPU的动…

零基础入门数据挖掘系列之「建模调参」

摘要&#xff1a;对于数据挖掘项目&#xff0c;本文将学习如何建模调参&#xff1f;从简单的模型开始&#xff0c;如何去建立一个模型&#xff1b;如何进行交叉验证&#xff1b;如何调节参数优化等。 建模调参&#xff1a;特征工程也好&#xff0c;数据清洗也罢&#xff0c;都是…

EtherCAT运动控制器在LabVIEW中的运动控制与实时数据采集

本文以正运动技术EtherCAT运动控制器ZMC408CE为例&#xff0c;介绍如何使用LabVIEW对控制器参数进行获取内容并生成示波器波形。 一、ZMC408CE硬件介绍 ZMC408CE是正运动推出的一款多轴高性能EtherCAT总线运动控制器&#xff0c;具有EtherCAT、EtherNET、RS232、CAN和U盘等通…

STM32相关资料汇总

STM32选型表 STM32手册参考网站 https://www.stmcu.org.cn/

Python 深度学习第二版(GPT 重译)(四)

九、高级计算机视觉深度学习 本章涵盖 计算机视觉的不同分支&#xff1a;图像分类、图像分割、目标检测 现代卷积神经网络架构模式&#xff1a;残差连接、批量归一化、深度可分离卷积 可视化和解释卷积神经网络学习的技术 上一章通过简单模型&#xff08;一堆Conv2D和MaxP…

Linux:Prometheus的源码包安装及操作(2)

环境介绍 三台centos 7系统&#xff0c;运行内存都2G 1.prometheus监控服务器&#xff1a;192.168.6.1 主机名&#xff1a;pm 2.grafana展示服务器:192.168.6.2 主机名&#xff1a;gr 3.被监控服务器&#xff1a;192.168.6.3 …

uniapp开发h5项目使用baidu-map组件实现地图引入,定位渲染,弹窗功能实现,根据定位路线图的实现

1.效果图 2.准备工作 cnpm install vue-baidu-map --save 在main.js中全局引入 import BaiduMap from vue-baidu-map Vue.use(BaiduMap, {// ak 是在百度地图开发者平台申请的密钥 详见 http://lbsyun.baidu.com/apiconsole/key */ak: sRDDfAKpCSG5iF1rvwph4Q95M6tDCApL }) …

DNA存储技术原理是什么?

随着大数据和人工智能的发展&#xff0c;全球每天产生的数据量剧增&#xff0c;对存储设备的需求也随之增长&#xff0c;数据存储问题日益凸显。传统的硬盘驱动器&#xff08;HDD&#xff09;、磁带等冷存和深度归档存储占据数据中心存储的60-70%&#xff0c;由于它们的访问频率…

服务器数据恢复—异常断电导致服务器磁盘阵列崩溃的数据恢复案例

服务器数据恢复环境&故障&#xff1a; 由于机房多次断电导致一台服务器中raid阵列信息丢失。该阵列中存放的是文档&#xff0c;上层安装的是Windows server操作系统&#xff0c;没有配置ups。 因为服务器异常断电重启后&#xff0c;raid阵列可以正常使用&#xff0c;所以未…

Swift 从获取所有 NSObject 对象聊起:ObjC、汇编语言以及底层方法调用链(一)

概览 Swift 语言给我们的印象是&#xff1a;简洁、现代化和可以“心安神泰”的完全信赖。不过&#xff0c;在一些特殊情况下我们唯有进入 Swift 底层的动态世界方能真正地“随遇而安”。 保安局“刘局长”曾语重心长的教导过我们&#xff1a;“非常时期&#xff0c;用非常方法…

leetcode代码记录(删除字符串中的所有相邻重复项

目录 1. 题目&#xff1a;2. 我的代码&#xff1a;小结&#xff1a; 1. 题目&#xff1a; 给出由小写字母组成的字符串 S&#xff0c;重复项删除操作会选择两个相邻且相同的字母&#xff0c;并删除它们。 在 S 上反复执行重复项删除操作&#xff0c;直到无法继续删除。 在完成…

Uibot6.0 (RPA财务机器人师资培训第1天 )RPA+AI、RPA基础语法

训练网站&#xff1a;泓江科技 (lessonplan.cn)https://laiye.lessonplan.cn/list/ec0f5080-e1de-11ee-a1d8-3f479df4d981(本博客中会有部分课程ppt截屏,如有侵权请及请及时与小北我取得联系~&#xff09; 紧接着小北之前的几篇博客&#xff0c;友友们我们即将开展新课的学习~…

Socket类

2.2 Socket类 Socket 类&#xff1a;该类实现客户端套接字&#xff0c;套接字指的是两台设备之间通讯的端点。 构造方法 public Socket(String host, int port) :创建套接字对象并将其连接到指定主机上的指定端口号。如果指定的host是null &#xff0c;则相当于指定地址为回送…

论文阅读之AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE

文章目录 原文链接主要内容模型图技术细节实验结果 原文链接 AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE 主要内容 这篇文章的主要内容是介绍了一种新的计算机视觉模型——Vision Transformer&#xff08;ViT&#xff09;&#xff0c;这是…

爬虫基础:HTTP基本原理

爬虫基础&#xff1a;HTTP基本原理 前言HTTP基本原理URI 和 URLHTTP 和 HTTPSHTTP 请求过程请求与响应HTTP请求HTTP响应请求与响应的交互过程 HTTP 2.0二进制传输多路复用Header压缩服务器端提前响应内容安全 前言 了解 HTTP的基本原理&#xff0c;了解从往测览器中输人 URL到获…

软件安全测评要点有哪些?第三方软件安全测试是必需品吗?

在当今数字化时代&#xff0c;软件安全测试是每个软件开发团队都不能忽视的重要环节。安全测试是指对软件产品进行系统、全面的安全性评测与检测的过程。它旨在发现并修复软件中存在的漏洞和安全隐患&#xff0c;以确保软件能够在使用过程中保护用户的数据和隐私不被非法访问和…

Pytest自动化测试框架快速上手(超详细)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号&#xff1a;互联网杂货铺&#xff0c;回复1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;薪资嘎嘎涨 pytest是一个非常成熟的全功能的Python测试框架&#…

《操作系统实践-基于Linux应用与内核编程》第10章--实验 Qt聊天程序

前言: 内容参考《操作系统实践-基于Linux应用与内核编程》一书的示例代码和教材内容&#xff0c;所做的读书笔记。本文记录再这里按照书中示例做一遍代码编程实践加深对操作系统的理解。 引用: 《操作系统实践-基于Linux应用与内核编程》 作者&#xff1a;房胜、李旭健、黄…