数据技术应用概论
第一章 绪论
数据素质培养意义
数据技术
数据科学应用体系框架
第二章 计算机信息系统
计算机信息系统的构成
计算机信息系统技术路线
第三章 抽样技术
抽样技术概述
网络调查和社会调查
抽样学习
抽样技术的基本概念
第四章 网络爬虫与文本数据生成
网络爬虫概述
网络爬虫技术操作
文本数据生成
第五章 数据库技术
数据库技术概述
数据库系统开发
关系数据库
数据仓库
第六章 SQL语言
SQL概述
SQL关系定义
SQL查询基本结构
数据库修改
视图
第七章 数据预处理技术
数据预处理概述
数据清理
数据集成
数据规约
数据变换
第八章 回归模型
回归模型的基础知识
最小二乘法
其他常用回归模型
第九章 Logistic建模技术
基础知识
梯度上升算法
第十章 关联规则挖掘
关联规则挖掘的基础知识
关联规则挖掘的 Apriori 算法
其它常用关联规则挖掘算法
第十一章 决策树分类规则
决策树分类规则的基础知识
决策树分类规则挖掘的ID3算法
几种常用的决策树
第十二章 K-平均聚类
基础知识
基于划分的K‐平均聚类算法
其他常用的聚类
第十三章 神经网络模型
神经网络模型的基础知识
误差逆传播算法
其他常用的神经网络算法
第十四章 支持向量机
支持向量机的基础知识
支持向量机的SMO算法
其他常用的支持向量机算法
第十五章 集成学习算法
集成学习算法的基础知识
随机森林算法
其他常用的集成学习算法
第十六章 数据可视化
数据可视化的基础知识
可视化设计基础
数据可视化工具
-
+
首页
SQL查询基本结构
## 6.3.1 查询的基本结构 - SQL查询语句的基本结构由`SELECT`、`FROM`和`WHERE`三个子句构成。其给出目标的选择(SELECT)、来源(FROM)和选择条件(WHERE)指令。 查询输入的是在FROM子句中列出的关系,在这些关系上进行WHERE和SELECT子句中指定的运算,然后产生一个关系作为结果。SQL为此设计了 SELECT—FROM—WHERE 句型: ```sql SELECT A1,…,An FROM R1,…,Rm WHERE F ``` 其中:A1、…、An为属性,R1、…、Rm为关系,F是条件表达式。 - `SELECT子句`包含下列操作: - 查询指定的属性:列出所要查询的属性名 - 查询全部属性:用*表示 - 查询计算的值:带有+、-、*、/运算符的算术表达式 - 聚合函数:AVG、MIN、MAX、SUM、COUNT - 通常SELECT子句后的内容都是关系中有关属性列的操作,查询结果可以默认或利用关键字ALL给出全部。 - 返回操作,或者利用关键字DISTINCT给出剔除掉重复的行的操作。 - `WHERE子句`的条件表达式F中可使用下列运算符: - 比较运算符:<、 <= 、 > 、 >= 、 、=、<> 、 != - 逻辑运算符:AND、OR、NOT - 谓词:EXISTS、IN、BETWEEN、LIKE - 聚合函数:AVG、MIN、MAX、SUM、COUNT - F中运算对象还可以是另一个SELECT语句,即SELECT句型可以嵌套 - `SELECT语句`完整的句法: ```sql SELECT [ ALL|DISTINCT ] 目标表的列名或列表达式序列 FROM 基本表名和(或)视图序列 WHERE 行条件表达式 GROUP BY 列名序列 HAVING 组条件表达式 ORDER BY 列名 [ASC|DESC] ``` - `整个语句`的执行过程如下: - (1)读取FROM子句中基本表、视图的数据。 - (2)选取满足WHERE子句中给出的条件表达式的元组。 - (3)按GROUP BY子句中指定列的值分组,同时提取满足HAVING子句中组条件表达式的那些组。 - (4)按SELECT子句中给出的列名或列表达式求值输出。 - (5)ORDER BY子句对输出的目标表进行排序,按附加说明ASC升序排列,或按DESC降序排列。 > d 注意:一般SQL的语句不区分字母的大小写,而且可以灵活的写在一行或多行上,采用上面的多行结构只是为了表达更清楚。  ## 6.3.2 单个关系查询 - 例:“找出所有学生名字”的简单查询为示例。 ```sql SELECT Sname FROM S; ``` 其中,SELECT Sname表示学生名字归属Sname属性,将其放置于SELECT子句中。FROM S表示, 学生名字可在S关系中找到,S为查询对象,应放置于FROM子句中。上述查询结果是由属性名为 name的单个属性构成的关系。 ## SQL查询基本结构 - #### 实验环境 使用本平台在线工具进行学习。 地址:首页->工作台[【快捷链接】](https://zenodt.com/workbench "【快捷链接】"),点击按钮,登录即可。 - 利用星号 “`*`” 可在SELECT子句中表示 “`所有的属性`”。 如: ```sql SELECT * FROM S ``` - 等价于: ```sql SELECT Sno,Sname,Ssex,Sage,Sdept FROM S ``` ## 6.3.3 单个关系查询中的若干选择操作 - `去掉重复行` 考虑“找出所有学生所在系名”的查询, ```sql SELECT Sdept FROM S ``` 这一处理背景是,一个系有多名学生,上述查询结果中的系名出现重复,有时需要强行删除。要求出现一次系名的去除重复操作可在SELECT后加入关键词DISTINCT,将上述查询重写为: ```sql SELECT DISTINCT Sdept FROM S ``` 当然,SQL中保留默认重复元组,也允许使用关键词ALL指明不去除重复: ```sql SELECT ALL Sdept FROM S ``` - `查询计算值` SELECT子句还可带含有+、-、*、/运算符的算术表达式。运算对象可以是常数或元组的属性,包括如日期一类的特殊数据。例如查询全体学生的姓名及其出生年度。 ```sql SELECT Sname,2023-Sage FROM S; ``` 其中,2023为查询时的年度,结果为每个学生出生年度,且不导致对S关系的任何改变。 - `别名` - 由某种原因,可能需要重新对属性或关系命名。SQL使用如下形式的AS子句,重新命名结果关系属性的方法。 ```sql Old name AS New name ``` - AS子句既可出现在SELECT子句中,也可出现在FROM子句中。如上例的出生年份,可以改写为: ```sql Old name AS New name SELECT Sname,2021-Sage AS Birthday FROM S; ``` 查询结果的出生年月属性列名改为Birthday;AS子句重新命名关系的意义在于,可将长关系名缩减,为其他查询提供方便。 - `选择满足条件的行` 关系查询中,除选择指定属性列之外,还能选择满足条件的行。行选择操作除上述`DISTINCT重复行删除`外,更多依赖`WHERE子句中的选择条件`。 - 相关思路为:WHERE给出只选出在FROM子句结果关系中满足特定谓词元组的指令;该指令由一个条件表达式构成,其计算结果为逻辑值True(真)或False(假);查询中将目标关系中的每一行带入条件表达式,若表达式返回True,表示该行结果满足条件要求,否则舍弃。WHERE子句使用的逻辑运算符为and、or和not。逻辑运算对象包含比较运算符的表达式。 - `选择满足条件的行` >查询计算机科学系(用字符‘CS’表示)中年龄大于20的所有学生姓名。 ```sql SELECT Sname FROM S WHERE Sdept=’CS’ AND Sage>20; ```  - `选择满足条件的行` - 查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。 ```sql SELECT Sname,Sdept,Sage FROM S WHERE Sage BETWEEN 20 AND 23; ``` 其中,WHERE 语句中的BETWEEN是比较运算符,用于表达一个值小于等于某个值,同时大于等于另一个值的选择条件。BETWEEN后的数值是范围下限,AND后的数值是范围的上限。 - 与BETWEEN…AND…相对的谓词是NOT BETWEEN…AND…。 如查询年龄不在20~23岁之间的学生姓名、系别和年龄。 ```sql SELECT Sname,Sdept,Sage FROM S WHERE Sage NOT BETWEEN 20 AND 23; ``` - `选择满足条件的行` >使用谓词IN查找属性值为指定集合的元组。 查询计算机科学系(CS)、数学系(MA)和信息系(IS)学生的姓名和性别。 ```sql SELECT Sname,Ssex FROM S WHERE Sdept IN(’CS’,’MA’,’IS’); ``` 与IN相对的谓词是NOT IN,用于查找属性值不属于指定集合的元组。 - `选择满足条件的行` - 关于字符运算。使用单引号标示字符串,SQL提供多种字符串函数操作,如字符串匹配、提取子串,计算字符串长度,大小写转换,以及去掉字符串前后空格等等。使用LIKE操作符实现字符串匹配: ```sql LIKE <匹配串> ESCAPE <换码字符> ``` - 查找指定的属性列值与<匹配串>相匹配的元组。<匹配串>可以是一个完整的字符串,也可以含有匹配任意长度、任意字符的百分号(%),以及匹配任意一个字符的下划线(_) 。如:查询所有刘姓学生的姓名、学号和性别。 ```sql SELECT Sname,Sno,Ssex FROM S WHERE Sname LIKE ’刘%’ ``` - ` 结果排序` - 使用`ORDER BY`子句按顺序显示查询结果的元组。其中可按一个或多个属性列排序,默认使用升序。 - 以`ASC或DESC`表示`升或降序`。排序列中含空值时,可由ASC或DESC给出空值的排序列元组最后或最先的显示。 如查询选修3号课程学生的学号及其成绩,查询结果按分数的降序排列: ```sql SELECT Sno,Grade FROM SC WHERE Cno=’3’ ORDER BY Grade DESC; ```  - `空值处理` 空值不能进行比较运算。采用谓词`IS NULL`或者`IS NOT NULL`判定一个属性是否为空值。如有学生选修课程后没有参加考试,有选课记录但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。 ```sql SELECT Sno,Cno FROM SC WHERE Grade IS NULL; /* 分数GRADE是空值 */ ``` - `聚集函数` 涉及整个关系的一类运算操作。即通过聚集函数可以把某一列中的值形成单个值。SQL提供5个聚集函数: - 计数count: ```sql COUNT ([DISTINCT|ALL] <列名>) ``` - 总和sum: ```sql SUM([DISTINCT|ALL] <列名>) ``` - 平均值avg: ```sql AVG([DISTINCT|ALL] <列名>) ``` - 最大值max: ```sql MAX([DISTINCT|ALL] <列名>) ``` - 最小值min: ```sql MIN([DISTINCT|ALL] <列名>) ``` - `聚集函数` 计算选修1号课程的学生平均成绩 ```sql SELECT AVG(Grade) FROM SC WHERE Cno=’1’; ``` - `聚集函数` 分组查询。如查询课程号及相应的选课人数。需要先将选课表SC中的元组按课程号分组,然后再按课程号分组计数。可用分组聚集`GROUP BY`子句实现这个功能。 ```sql SELECT Cno,COUNT(Sno) FROM SC GROUP BY Cno; ``` - 其中GROUP BY子句中给出的一个或多个属性可`构造分组`。在GROUP BY子句中的所有属性上取值相同的元组将被分在一个组中。查询分组后,聚合函数将分别作用于每个组。注意使用GROUP BY子句后,SELECT子句的列名列表中只能出现分组属性和聚合函数,否则查询就是错误的。 - 使用HAVING可对GROUP BY分组进一步选择。HAVING子句的谓词在分组之后发挥作用。HAVING的条件表达式可以使用聚集函数。 - `聚集函数` 例子,查询有3门以上课程是90分以上学生的学号及90分以上的课程数: ```sql SELECT Sno, COUNT(*) FROM SC WHERE Grade>=90 GROUP BY Sno HAVING COUNT(Cno)>=3; ``` 与SELECT子句的情况类似,任何出现在HAVING子句中,但没有被聚集的属性必须出现在GROUP BY子句中,否则该查询作为错误处理。 ## 6.3.4 多关系查询 - 通常大多数查询需要从多个关系表中获取信息。严格意义上,由于SQL查询操作只能从一个二维表中完成最终的检索运算,当需要从多个关系表得到结果时就需要将两个关系按一定的条件组成一个二维表,这个操作就是连接操作。 - 连接操作分为两步: - 通过所谓“笛卡儿积”操作将两个关系合并成一个表 - 以连接条件作为选择条件选出所需要的行。 > d 注意:在多表查询中,如果引用不同关系中的同名属性,则需要在属性名前加关名,即用“关系名.属性名”的形式表示,以便区分。 - 一个多关系SQL查询的思路可理解如下: (1)为FROM子句中列出的关系提供合成两个关联表的笛卡儿积。 (2)在步骤1的结果集上应用WHERE子句中指定的谓词进行筛选。 (3)针对步骤2结果中的每个元组,输出SELECT子句中指定的属性(或表达式的果)。 上述思路是通过`优化算法`实现的。 - 例子,查询每个学生的选修课程情况。该查询涉及S与SC两个表。两个表之间的联系可以通过公共属性如Sno(学号)实现。 ```sql SELECT S.*,SC.* FROM S,SC WHERE S.Sno=SC.Sno; /* 将S与SC中同一学生的元组连接起来 */ ``` 上述WHERE子句的条件表达式称为连接条件或连接谓词,其中的属性称为连接属性。如该例中的Sno。一般格式为: ```sql [<表名1>.] <列名1> <比较运算符> [<表名2>.]<列名2> ``` 其中比较运算符主要有:=、>、<、>=、<=、!=(或<>)等。常见运算是`等值运算`,称为等值连接。SQL还支持可以指定任意连接条件的连接,这里不再赘述。 ## 6.3.5 嵌套子查询 在SQL中,一个SELECT─FROM─WHERE语句称为一个查询块。将一个查询块嵌套在另一个查询 块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询(nested query)。包括: - `IN谓词的子查询` 当关系集合是由SELECT子句产生的一组值构成时,连接词IN用来判断关系中的元组是否是集合中 的成员。连接词NOT IN则测试元组是否不是集合中的成员。 如:查询选修了课程名为“信息系统”的学生学号和姓名。 ```sql SELECT Sno,Sname /* 外层在S关系中取出SNO和SNAME */ FROM S WHERE Sno IN SELECT Sno /* 在SC关系中找出选修了3号课程的学生学号 */ FROM SC WHERE Cno IN SELECT Cno /* 在C关系中找出“信息系统”的课程号,结果为3号 */ FROM C WHERE Cname = `信息系统` ``` - `集合的比较` 在子查询中做比较,如查询“至少比某一个要大”,在WHERE子句中用`>ANY`表示: - 也可以用<ANY,<=ANY,>=ANY,=ANY和<>ANY字符比较。 - 以及允许<ALL,<= ALL,>= ALL,= ALL和<> ALL的比较。 - 例子1:找出每个学生超过他选修课程平均成绩的课程号。 ```sql SELECT Sno,Cno FROM SC AS X WHERE Grade>=( SELECT AVG(Grade) FROM SC AS Y WHERE Y.Sno=X.Sno); ``` - 例子2:查询其他系中比计算机科学系某一学生年龄小的学生姓名和年龄。 ```sql SELECT Sname,Sage FROM S WHERE Sage<ANY(SELECT Sage FROM S WHERE Sdept=’CS’) AND Sdept<>’CS’; ``` - `EXISTS谓词的子查询` 指测试子查询结果是否为空集。EXISTS子查询结果非空时返回True值,否则返回False。 如:查询没有选修1号课程的学生姓名。 ```sql SELECT Sname FROM S WHERE NOT EXISTS (SELECT * FROM SC WHERE Sno = S.Sno AND Cno='1') ``` - `全称量词(FOR ALL)查询` 通过EXIST/NOT EXIST实现全称量词查询。如查询选修了全部课程的学生姓名。 ```sql SELECT Sname FROM S WHERE NOT EXISTS (SELECT * FROM C WHERE NOT EXlSTS (SELECT * FROM SC WHERE Sno=S.Sno AND Cno=C.Cno)); ``` 
张龙
2024年8月12日 14:53
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码