标准查询语言sql(共7篇)
1.标准查询语言sql 篇一
select 姓名,sum(成绩)as 总分from 学生 inner join 成绩 on 学生.学号=成绩.学号 group by 姓名 答:从通过学号建立的学生与成绩关系表中选择选择学生成绩的姓名集合Update 学生成绩表 set 高数=93
Where 高数=80;
答:将“学生成绩表”中所有“高数”为80分的记录的改为93分
Select 学号,姓名
From 学生
Where 专业=“计算机应用”;
答:查询出专业为“计算机应用”的所有男生的学号和姓名
Select 学号,姓名
From 学生
Where 年龄>=18 and姓名like“王*”;
答:显示学生表中年龄大于18岁且姓“王”的学生的所有信息。
Select Count(性别)as 男生人数
From 学生
Where 性别=“男”;
答:分别显示男生人数
Select 课程.课程编号, 课程.课程名, 成绩.学生编号, 成绩.成绩 From 课程 Inner Join 成绩 on 课程.课程编号 = 成绩.课程编号 Where(课程.课程名)=“数据库原理”and(成绩.成绩)>70;
答:查找“数据库原理”课程成绩在70分以上学生的学号、姓名和成绩
Select top 3 学号, 姓名
From 学生
Order by 成绩 Desc;
答:显示成绩前3名的学生的学号和姓名
SELECT 学生.学生编号, 学生.学生姓名, 课程.课程编号, 课程.课程名, 成绩.成绩, 班级.班级编号
FROM 课程 INNER JOIN(班级 INNER JOIN(成绩 INNER JOIN 学生 ON 成绩.学生编号=学生.学生编号)ON 班级.班级编号=学生.班级编号)ON 课程.课程编号=成绩.课程编号
WHERE(((课程.课程名)=“计算机基础”)AND((班级.班级编号)=“0401”));
答:查询0401课程成绩
SELECT 学生编号, 学生姓名, 性别, 出生年月, 籍贯, 身高, 班级编号
FROM 学生
WHERE 性别=“男” AND 班级编号=“0401”;
答:查找班级编号为0401的所有男生
UPDATE 成绩 SET 成绩 =((成绩*0.1)+成绩)
WHERE 成绩<60;
答:低于60分的增加10%
SELECT 课程.课程编号, 课程.课程名, 课程.学时, 课程.学分, 教师.教师编号, 教师.教师姓名, 教师.性别, 教师.职务
FROM 课程 INNER JOIN 教师 ON 课程.教师编号=教师.教师编号;答: 教师授课课程查询
SELECT 教研室编号, 教师人数
FROM 教研室;
答:教研室人数查询
SELECT 课程编号, 课程名, 学时
FROM 课程;
答:课程名称查询
SELECT avg(成绩)AS平均成绩
FROM 成绩;
答:平均成绩查询
SELECT avg(身高)AS平均身高
FROM 学生
WHERE 性别=“男”;
答:求出男生的平均身高
SELECT 学生编号, Avg(成绩)AS平均成绩, Sum(成绩)AS 总成绩 FROM 成绩
GROUP BY 学生编号;
答:求学生的平局成绩和总成绩
UPDATE 学生 SET 学生编号 = “050211”
WHERE 学生编号=“050101”;
答:修改学生编号
alter table 学生 add 身高 smallint;
答:增加身高字段
2.标准查询语言sql 篇二
近年来, 电子信息技术快速地融入医疗卫生机构的日常诊疗工作、平时的健康监控记录工作以及医学研究和数据信息研究之中, 极大的提高了医疗相关工作的效率与准确性[1]。人体生理数据一般包括三种[2]: 单值数据 ( 例如: 单次测量的血压、心率体温等数据) 、信号数据 ( 例如: 心电图、脑电图、持续测量的体温血压等数据) 、图像数据 ( 例如: CT图像、核磁共振图像等) 。信号数据又是一种时间序列数据, 这类数据反映了某一事物、现象等随时间变化的状态或程度, 是一种与时间维度紧密相关的典型数据类型。除了信号数据外, 定期测量的单值生理数据, 也可作为时间序列数据进行处理。时间序列数据作为一种特殊的数据, 其存储和管理不同于普通的单值数据, 且具有很高的数据挖掘研究价值。本文针对生理学时间序列数据, 通过对结构化查询语言SQL进行扩展。实现了对时间连续数据的分析和查询功能, 期望通过对生理学数据的分析, 达到发现和预测疾病的目的。
1 SQL 扩展语言设计基础
( 1) 关系型数据库是建立在关系模型基础上的数据库。当前主流的数据库产品都是基于关系模型, 支持结构化查询语言。本文中的时间连续数据是存储在关系型数据库中。
( 2) 结构化查询语言SQL, 是一种用于存取数据以及查询、更新和管理关系数据库系统的语言。结构化查询语言是高级的非过程化编程语言, 允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法, 也不需要用户了解具体的数据存放方式, 所以具有完全不同底层结构的不同数据库系统可以使用相同的结构化查询语言作为数据输入与管理接口。结构化查询语言语句可以嵌套, 这使它具有极大的灵活性和强大的功能[2]。
本项目在SQL语言的框架下, 对其功能进行扩展, 以支持时间连续数据的相似序列查找。使得该SQL扩展语言不仅具有与SQL相同的灵活性, 还使其具有了良好的可移植性。
( 3) 相似序列查询方法标准。相似序列匹配算法是相似查询算法中的重要组成部分, 它的特性极大地影响着整个试验系统的效率与功能的实现。因此它必须满足以下三个条件: 高效性, 由于该数据库中将有百万条以上的记录, 因此每条记录的相似匹配效率显得尤为重要; 准确性, 是指所得结果与给定序列的相似度, 在本项目中, 我们使用欧式距离作为量度二者之间相似度的标准; 可分级, 是指所使用的相似序列匹配算法, 应该易于进行不同相似度等级的序列查询, 通过设置定位匹配容忍值, 分段聚合近似法分块长度或者小波变换级别和序列之间匹配的欧氏距离D等参数, 可得到符 合不同相 似度等级 的结果子序列[3]。
2 SQL 扩展语言处理流程
2. 1 功能流程
通过对用户提交的查询语句进行分解, 分解出标准SQL和扩展功能, 并在关系型数据库返回的原始结果集的基础上进行扩展功能处理, 得到最终的结果数据集。系统实现该扩展SQL语言的功能流程如图1所示。
用户从系统界面输入框输入查询语句后。程序首先对输入的语句进行解析。剥离扩展功能, 将扩展功能处理类型与相关参数写入扩展功能队列, 运行处理后的标准SQL语句返回数据集, 根据扩展功能队列中扩展功能参数, 对返回的数据集进行处理, 将得到的最终数据集返回系统界面; 如果是非法语句, 则返回错误信息。试验系统使用Java程序语言设计实现。
2. 2 时间连续数据存储
在本系统中, 人体生理数据被写入一个EDF ( European DataFormat) 文件中, 每一次检测的数据将以一条记录的形式存储于数据库中, 所有信息存储在传统关系型数据库, 其中包括一个指针。通过该指针, 指向对应的信号文件中的信号, 信号文件则以EDF格式存储于硬盘。指针为一个三元组, 形式如下:
[文件路径, 信号名, 时间段]
其中文件路径是EDF信号文件的物理路径; 可通过该路径找到人体生理数据信号所在的文件, 信号名称是该指针所指向的信号在文件中的名称; 时间段是信号开始和结束的样本点号, 一个文件指针可包含多个时间段, 表示多段信号。
2. 3 SQL 扩展功能
为了不破坏SQL语言原有的语法特征, 让使用者更好地理解扩展功能。本文自定义了一个函数。形式如下:
Time Series Data ( 列名)
通过调用此函数可将调用列当做时间序列数据进行处理。
本文所述工具定义了若干运算符完成四个功能:
(1) 单值查询, 数值范围符合条件的数据段;
(2) 时间段查询, 某一确定位置的数据段;
( 3) 趋势查询, 查询一定粒度下, 时间序列数据变化趋势符合条件的数据段[4];
( 4) 相似性查询, 查询与子序列相似的数据段。
这些运算符只能与扩展函数搭配使用, 完成扩展功能, 运算符的用法如表1所示。
这里所有的扩展符号返回的数据都是一个指针, 可表示一段或者多段子序列。时间段的表示方法如下所示:
[开始点: 结束点]
由一个开始点参数和一个结束点参数表示。开始点必须小于结束点, 且都为正整数, 如果两个参数相等, 则表示一个单独的点。
大于号、小于号等运算符, 可对序列进行单值查询, 返回符合条件的序列段, 如果没有符合条件的序列, 则该条记录不符合此条件。
等于号可以用于单值查询, 也可用于时间段查询, 当等于号用于时间段查询时, 后面可跟多个时间段, 时间段之间不需要分隔符, 默认为‘与’关系。
Slope[x]运算符用于序列趋势查询, 是对序列斜率进行条件判断的符号。方括号内有一个参数用来设置斜率计算的粒度大小, 该参数是正整数, 最小为1, 最大为该序列的长度。假设参数为5, 则该序列中每五个点求平均值得到一个新的点, 相邻的两个点之间计算斜率。当该参数大于等于序列长度时, 斜率为零。
Like[x]运算符是用来查询相似序列的运算符。运算符后跟一个指针表示一个子序列, 在整个序列中查询与此子序列相似的序列。方括号内的参数表示相似度, 参数范围是0到9, 参数越小相似度越高, 0表示完全相同。
2. 4 扩展语言应用
SQL扩展语言采用类似SQL语句的描述, 嵌入扩展功能, 提交系统后可执行子序列查询功能。例如:
Select record_id, Time Series Data ( Respiration) from physioda-ta where Time Series Data ( Respiration) Like[3][Data , Respira-tion, [1000: 2000]]
该例句执行的功能是: 查询生理学数据记录表physiodata中, 与给定序列[Data , Respiration, [1000: 2000]]相似的所有Respiration信号子序列, 其中序列相似度参数为3。
该语句返回的结果集是: 存在的相似子序列的数据记录中, record_id列数据与结果子序列的指针, 这些指针分别指向每条记录的信号序列中符合条件的子序列。
具体的相似查询算法将在后面的章节中进行详细的说明。
通过对SQL进行功能扩展, 可以高效地对时间连续数据的趋势、数值等特征进行搜索, 还可以从一个长序列中找出与某一特定序列相似的子序列。使用这些扩展功能, 可以完成一些标准SQL无法完成的功能。
3 相似序列查找算法
本文设计的算法, 可以通过三步找到相似序列。首先, 需要对子序列进行预处理, 计算子序列的特征值并计算一部分相似查询参数, 然后, 通过这些特征值, 在查询序列中进行定位处理, 找出可能相似的多个位置, 最后通过一些算法与这些可能相似的子序列进行逐点比较, 找出符合相似度的结果序列。
3. 1 预处理给定序列
对给定序列进行预处理, 主要是获得一些后续算法中需要的参数, 以及给定序列的特征值, 用来进行可能相似子序列的定位。在测试系统中, 需要参数包括信号取值范围等, 给定序列的特征值包括序列的开始点、结束点以及极值点。通过特征点可以在一个长序列中, 快速定位到可能与给定序列相似的子序列。如2. 4中所述扩展SQL语句例子, 预处理阶段通过文件指针[Data , Respiration, [1000: 2000]], 读入给定序列数据, 获取信号的取值范围参数、开始点、结束点, 并计算序列的各个极值点作为该序列的特征点, 用于之后的匹配计算。
3. 2 可能相似子序列定位
在这一阶段, 以给定序 列[Data 0, Respiration, [1000:2000]]的开始点的值在整个序列中搜索, 搜索到符合定位容忍值范围的点后, 首先计算匹配序列长度是否足够, 在2. 4节的例子中, 是判断从定位点到信号结尾长度是否大于等于1000, 然后开始按照特征值的相对位置顺序, 进行逐一比较。如图2所示。
图2中的小圆圈表示给定序列和可能相似子序列的特征值点。如果所有的特征值点都符合定位容忍值, 那么该子序列可作为可能相似的子序列, 进入下一 步的处理。定 位容忍值Ltolerance的计算方法如下:
其中, S为给定的序列样本点值, SC为与之相匹配的子序列对应的样本点值。由于每个序列的基值不同, 我们需要使用相对差, 而不是绝对差, 因此需要使用距离除以范围值。在这里, 绝对差是指进行比较的两个样本点之间的真实差值, 而相对差是指绝对差值与样本点取值范围的比值。使用相对差的意义在于忽略不同信号样本基础值不同的差异, 使比较算法可以规范化。Srange为被查询序列的样本点取值范围。
3. 3 子序列相似匹配
在这一阶段, 完成相似定位, 并找出一系列可能相似的子序列之后, 需要将给定序列[Data , Respiration, [1000: 2000]]与可能相似的子序列进行比较。相似序列比较的算法, 是一个研究热点, 现有的算法有许多种, 例如分段聚合近似法 ( PAA) 、小波变换法、数据抽样法、滑动窗口法、在线挖掘算法等等[5]。其中分段聚合近似法与小波变换法简单易用且有较高的处理效率, 且便于进行相似度分级[6]。
两种算法在性能方面有些差别。经过测试, 分段聚合近似法在匹配速度上优于小波变换算法, 而在准确度上, 则是后者更优。
( 1) 分段聚合近似法
分段聚合近似PAA ( Piecewise Aggregate Approximation) 将时间序列Q = { q1, q2, …, qm} 用另外一个序列R表示, 有R ={ r1, r2, …, rw} , 其中w < m, 且m被w整除。令k = m/w, 则R中元素ri满足条件:
分段聚合近似表示将长度为m的时间序列Q转变成长度w的序列R, 进而实现了将原序列从高维到低维的降维过程。降维后的时间序列可以粗糙地表示原时间序列的基本形态, 缩短了序列的长度, 隐藏部分波形细节, 但保留大部分波形变化信息[7], 反映了时间序列的整体变化趋势, 但容易忽视局部数据分布形态, 尤其是当w值逐渐增大时[8]。通过设置子区间的宽度k, 可以控制序列查询的相似度。分段聚合近似法如图3所示, X轴表示采样点序列, Y轴表示采样点数值, 单位为m V。
( 2) 基于小波变换的算法
小波变换法是一种通用的数字信号处理技术。类似于傅里叶变换, 小波变换把输入的序列变换成一系列小波参数, 少数的几个小波参数拥有原来序列的大部分特征, 从而可以通过小波变换的方法以较少内存使用和计算的开销[7,9,10,11]实现快速匹配。在本文的试验系统中, 使用Haar小波对原序列进行不同级别的小波变换, 每个级别的小波变换可以将序列长度变换为上一级别可变换的一半。例如2级的变换将原序列变为其四分之一长度的序列, 但变换后仍然保留原序列的趋势变化信息, 这样可以实现对原序列的降维。不同级别的小波分解如图4所示, X轴Y轴表示意义与图3相同。
3. 4 相似度分级
本文中所定义的相似查询功能的参数范围为0到9, 因此相似度查询等级可分为0到9共十个等级。0表示每一个样本点都完全相同, 等级值越大相似度越低。通过调整一些相似查询参数的值来控制相似度, 得到不同相似度的结果序列[11]。这些参数包括定位匹配容忍值 ( Ltolerance) , 分段聚合近似法分块长度 ( Length) 或者小波变换级别 ( Level) 和序列之间的欧氏距离D等参数, 其中欧氏距离D的计算公式为:
可以通过配置以上相似查询参数的参数变表, 来控制相似查询的功能。
4 结 语
本文所述方法在传统关系型数据库的基础上, 对结构化查询语言SQL进行扩展, 使其可以完成时间连续型数据的分析和查询功能。相似序列查询算法是该扩展语句的核心功能, 通过分段聚合近似法和小波变换方法对给定的序列和可能的子序列进行相似匹配。这两种方法简单高效, 且易于进行相似度分级, 很好地实现了相似子序列的查找。
本文所述SQL扩展语言, 为时间连续数据的分析和处理提供了一种可行的方案。然而试验系统所实现的SQL扩展功能还有所不足。不足之处在于, 这些扩展功能的实现只是对扩展语句进行了预解析, 然后对标准SQL语句返回的结果集进行处理, 得到最终的结果集。这使得SQL的一些特性没有实现, 希望在未来的工作中可以对这一方面进行改进, 重新编写标准SQL的编译器, 以完成这些没有实现的功能。
摘要:在家庭电子医疗平台中, 存在生理学时间连续数据, 实现对其分析和查询是数据利用的基础。针对这类数据的特点, 提出以关系型数据库结构化查询语言SQL为基础, 定义相似查询算法, 快速有效地从给定信号序列中找出符合某一相似度等级的相似子序列。相似匹配使用了分段聚合近似法和小波变换两种算法, 易于进行子序列的相似度分级。实验结果表明, 该试验系统能够高效、准确地完成设计功能。
关键词:时间连续数据,小波变换,扩展结构化查询语言,生理学信号,电子医疗
参考文献
[1]娄海容.国外电子病案现状及前景[J].现代医院, 2003 (01) :73-75.
[2]李武, 姚珺.数据库原理及应用[M].哈尔滨:哈尔滨工程大学出版社, 2011:179-180.
[3]李林海.时间序列数据挖掘中的特征表示与相似性度量方法研究[D].大连:大连理工大学, 2012.
[4]聂淑媛.时间序列分析的早期发展[D].西安:西北大学, 2012.
[5]刘建伟.流数据查询系统结构及模式查询算法的研究[D].上海:东华大学, 2005.
[6]刘博宁, 张建业, 张鹏, 等.基于曲率距离的时间序列相似性搜索方法[J].电子与信息学报, 2012 (9) :2200-2207.
[7]刘敬.基于小波变换的图像压缩算法研究[D].重庆:重庆大学, 2012.
[8]李林海, 郭崇慧.基于云模型的时间序列分段聚合近似方法[J].控制与决策, 2011, 26 (10) :1525-1529.
[9]武永红.基于小波变换的图像无损压缩算法研究[D].重庆:重庆大学, 2012.
[10]张勇.时间序列模式匹配技术研究[D].武汉:华中科技大学, 2012.
[11]刘庆.基于小波变换的图像压缩算法研究[D].荆州:长江大学, 2012.
3.标准查询语言sql 篇三
关键词:SELECT语句查询连接
在关系数据库管理系统中,SQL查询语句——SELECT的使用是非常重要的一部分内容,是任何SQL语言中使用频率最高的语句,它是SQL语言的灵魂。SELECT语句可以使数据库服务器根据客户的要求搜索所需要的信息,并按规定的格式返回给客户。使用T—SQL的SELECT语句,不仅可以查询普通数据库中的表格和视图信息,还可以查询SQL Server的系统信息。在Transact-SQL中绝大多数的语句都是由SELECT构成的。
然而笔者在近几年对关系数据库管理软件(如Access、SQL Server、Oracle等)的教学中,发现对于这部分的内容学生掌握得并不是很好。为此,笔者根据多年的教学经验,将SQL查询语句的一些使用技巧列出来,供学生参考和同行借鉴。
由于SELECT语句的完整语句比较复杂,故在这里只列举出它的主要子句。SELECE语句的主要子句格式如下:
SELECT [ALL|DISTINCT][TOP n] select_list
[INTO new_table]
[FROM table_condition]
[WHERE search_condition]
[GROUP BY group_by_expression]
[HAVING search_condition]
[ORDER BY order_by_expression [ASC|DESC]]
[COMPUTE expression]
下面笔者就结合简单查询、联合查询和连接查询三方面通过举例的形式来谈谈有关Transact-SQL语句的用法。(注:以下所有例子的数据表来自示例数据库“图书管理系统”或“northwind”,在进行查询前,先用USE关键字将相关数据库打开。)
1 简单查询
Transact-SQL的簡单查询包括选择列表、FROM子句和WHERE子句三部分内容。由此说明要查询的列、所查询的表或视图以及检索条件等。
例如,从数据库“图书管理系统”的“图书明细表”中查询定价大于50的“图书编号”、“图书名称”、“出版日期”和“定价”字段的信息。
SELECT图书编号,图书名称,出版日期,定价
FROM 图书明细表
WHERE 定价>50
1.1 选择列表
简单查询中的选择列表(select_list)指出要查询的字段列,可以由一组字段名列表、星号、表达式或变量(包括局部变量和全局变量)等构成。
1.1.1 查询表中所有的字段列
星号(*)在选择列表中有特殊含义,它代表列表中的所有行。
例如,从数据库“图书管理系统”中查询“出版社信息表”的所有行。
SELECT *
FROM 出版社信息表
1.1.2 查询表中指定的列
可以从表中检索指定的列,只需将这些列放在选择列表中。
例如,从数据库“图书管理系统”的“作者表”中查询列为“作者姓名”、“性别”和“电话”的作者信息。
SELECT作者姓名,性别,电话
FROM作者表
1.1.3 改变列名
在选择列表中,通过使用AS关键字创建更具可读性的别名来取代默认的列名。
定义格式为:列标题AS列名或列名列标题
注意:如果指定的列名不是标准的标识符格式,应使用引号定界符。
例如,从数据库“图书管理系统”的“图书明细表”中,查询列“图书名称”和“定价”为八折后的“新价格”的图书信息。
SELECT图书名称,定价*0.8 AS新价格
FROM图书明细表
1.1.4 消除重复行
如果希望一个列表没有重复值,则可以使用DISTINCT子句来消除结果集中的重复行。
例如,从数据库“northwind”的“suppliers”表中检索所有的行,但每个国家只显示一次。
SELECT DISTINCT country
FROM suppliers
1.1.5 使用TOPn列出前n个记录
用TOPn[PERCENT]关键字列出结果集中前n个记录。其中TOPn表示返回结果集中前n行记录,而TOP n PERCENT中的n表示一百分数,指定返回的记录数等于总记录数的百分之几。
例如,从数据库“northwind”的“order details”表中查询出前5条记录,只显示orderid、productid、quantity三列内容。
SELECT TOP 5 orderid,roductid,quantity
FROM [order details]
1.2 FROM子句
1.2.1 FROM子句指定从中查询行和列所属的源表或视图。可以指定多个,最多达256个,其间用“,”分隔。当FROM子句同时指定多个表或视图时,如果在选择列表中有相同的列,则应使用对象名限定这些列所属的表或视图。
例如,在数据库“northwind”的“orders”和“customers”两个表中均有customerid(顾客id)列,在查询两个表中的顾客id时应使用下面语句格式来限定。
SELECT DISTINCT customerid,companyname,orderdate,
FROM orders,customers
WHERE orders. customerid = customers. customerid
1.2.2 在FROM子句中可以为表或视图指定别名。格式:<表名> as <别名>或<表名> <别名>
例如,上面例中的查询语句也可表示为如下形式:SELECT DISTINCT customerid,companyname,orderdate,
FROM orders a,customers b
WHERE a.customerid = b. customerid
1.3 WHERE子句
1.3.1 使用WHERE子句,可以根据给定的搜索条件检索特定的行。
例如,下面的查询将从数据库“northwind”中的“employees”表中检索所有居住在美国的职员的姓和居住的城市。
SELECT lastname,city
FROM employees
WHERE country=USA
1.3.2 在WHERE子句中可包括以下一些运算符:①比较运算符(用于比较大小):>(大于)、>=(大于或等于)、=(等于)、<(小于)、<=(小于或等于)、<>(不等于)。②范围运算符(检索在指定取值范围内的行):BETWEEN…AND…和NOT BETWEEN…AND…。例:unitprice BETWEEN 10 AND 30等价于unitprice>=10 AND unitprice<=30。③列表运算符(检索与指定值列表相匹配的行):IN (项1,项2,……)和NOT IN (项1,项2,……)。例:country IN ('Germany','China')。④字符串比较符(通过字符串比较来选择符合条件的行):LIKE和NOT LIKE,适用于char、nchar、varchar、nvarchar、binary、varbinary、datetime或smalldatetime等数据类型的查询,以及在特定条件下对text、ntext和image数据类型进行的查询。
采用以下四种通配符来形成字符串搜索条件:a百分号%:包含零个或更多字符的任意字符串。b下划线_:匹配任何单个字符。c方括号[]:指定的范围或集合内的任何单个字符。d[^]:不在指定的范围或集合内的任何单个字符。
例如,用LIKE ‘N%来表示以N开头的任意字符串;
用LIKE ‘N[xy]%表示以N开头,第二个字符是x或y的字符串;
用LIKE ‘N[^xy]%表示以N开头,第二个字符不是x或y的字符串;
用LIKE ‘N_M%表示以N开头,第三个字符是M,第二个为任意一个字符的字符串。
⑤空值判断符(检索那些指定列中遗漏信息的行):IS NULL和NOT IS NULL。
例如,从数据库“northwind”的“suppliers”表中检索fax列为空的公司列表。
SELECT companyname,fax
FROM suppliers
WHERE fax IS NULL
⑥逻辑运算符(用于组合多个条件,简化查询处理):NOT、AND和OR,优先级从左到右依次降低。
1.4 ORDER BY子句
用ORDER BY子句对结果集中的行进行升序(ASC)或降序(DESC)排列。
格式:ORDER BY {order_by_expression [ASC|DESC]} [,…n]
注意:不可以在ORDER BY子句中使用ntext、text或image类型的列。
例如,下面从数据库“northwind”的 “products”表中检索每个产品的产品标识、产品名、类别和单价。先将结果集按照类别进行升序排列,对于同一类别,再按照单价进行降序排列。
SELECT productid,productname,categoryid,unitprice
FROM products
ORDER BY categoryid,unitprice DESC
2 联合查询
使用UNION子句的查询称为联合查询。它可以将两个或更多个SELECT语句的返回结果组合到一个单个结果集中,该结果集包含了联合查询中所有查询结果集中的全部行数据。
联合查询的语法格式如下:
select_statement
UNION [ALL] select_statement
[UNION [ALL] select_statement][…n]
其中,select_statement为待联合的SELECT查询语句。ALL选项表示将所有行都合并到结果集中,若缺省,则被联合查询结果集合中的重复行将只保留一行。
注意:①在用UNION子句查询时,查询结果的列标题为第一个查询语句的列标题。因此,必须在第一个SELECT语句中指定列标题;②SQL Server要求所引用的表必须具有相似的数据类型、相同的列数,且每个查询中的选择列表也必须具有相同的列顺序;③如果希望结果集中的行按一定顺序排列,则必须在最后一个有UNION操作符的语句中包含ORDER BY子句,以指定排序方式。
例如:从数据库“经销商”的“顾客信息表”中,查询姓王的顾客的姓名和家庭住址,并为其增加一个类型列TYPE,列的内容为“顾客”;从“销售人员表”中,查询姓王的销售人员的姓名和家庭住址,并增加一个列,列的内容为“营业员”;然后,将两个查询结果合并在一起。
SELECT姓名,家庭住址,顾客AS TYPE
FROM顾客信息表
WHERE姓名LIKE‘王%
UNION
SELECT姓名,家庭住址,营业员
FROM销售人员表
WHERE姓名LIKE ‘王%
3 连接查询
连接操作可以同时查询两个或多个表中的数据,所生成的结果集将多个表中的行和列合并在一起。
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,建议在FROM子句中指定连接,这样有助于将指定的连接条件与WHERE子句中的搜索条件区分开来。
SQL-92标准所定义的FROM子句的连接语法格式为:
FROM table_source1 join_type table_source 2
[ON (join_condition)]
其中,table_source1和table_source 2指定要查询的表;join_type 指定所执行的连接类型,可分为三类:内连接(Inner Join)、外连接(Outer Join)、交叉连接(Cross Join);join_condition指定连接条件。
3.1 内连接
内连接通过比较两个表共同拥有的列的值,把两个表连接起来。SQL Server将只返回满足连接条件的行。它是SQL Server默认的连接方式。根据所使用的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。
3.1.1 等值连接即在连接条件中使用“=”运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括重复列。
例如,列出数据库“图书管理系统”的“作者表”和“出版社信息表”中位于同一城市的作者和出版社信息。
SELECT *
FROM 作者表AS a INNER JOIN 出版社信息表AS b
ON a.籍贯=b.出版社所在城市
3.1.2 不等连接即在连接条件中使用除等于运算符外的其它比较运算符来比较被连接的列的列值。
3.1.3 自然连接即在连接条件中使用等于运算符比较被连接列的列值,但它使用选择列表指出查询。
例:列出数据库“图书管理系统”的“作者表”和“出版社信息表”中位于同一城市的作者和出版社,并删除重复列“籍贯”。
SELECT a.*,b.出版社编号,b.出版社名称,b.出版社电话
FROM 作者表AS a INNER JOIN 出版社信息表AS b
ON a.籍贯=b.出版社所在城市
3.2 外连接
若要创建一个查询,以返回一个或多个表中的所有行(无论在另外的表中是否含有相匹配的行),则需要使用外连接。外连接有三种类型:左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN)和完全外连接(FULL OUTER JOIN或FULL JOIN)。
例如,在数据库“图书管理系统”中,以在同一个城市的出版社和作者为条件,对“出版社信息表”和“作者表”进行左外连接查询。
SELECT a.姓名,a.性别,a.籍贯as 所在城市,b.出版社名称
FROM 作者表as a LEFTJOIN 出版社信息表as b
ON a. 籍贯=b. 出版社所在城市
ORDER BY 姓名
在查询结果窗口中,显示左表中指定列的所有行和对应连接列的所有行,在左表中没有找到相匹配的右表的对应位置填上NULL。
例如,在数据库“图书管理系统”中,以在同一个城市的出版社和作者为条件,对“出版社信息表”和“作者表”进行完全外连接查询。
SELECT a.姓名,a.性别,a.籍贯as 所在城市,b.出版社名称
FROM 作者表as a FULLJOIN 出版社信息表as b
ON a.籍贯=b.出版社所在城市
ORDER BY 姓名
在查询结果窗口中显示相连接的两个表的所有记录,在没有找到相匹配的位置上填上NULL。
3.3 交叉连接
交叉连接(CROSS JOIN)不带WHERE子句,返回的是被连接的两个表所有数据行的笛卡尔积,即返回到结果集中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
例如,下面将显示数据库“northwind”中“shippers”和“suppliers”表交叉连接后的结果集,以列出供应商运输其产品的所有可能方式。
SELECT suppliers.companyname,shippers.companyname
FROM suppliers CROSS JOIN shippers
3.4 自连接
在连接查询时,當table_source1和table_source 2是同一个表时,即对同一个表进行连接操作,则称此连接为自连接。
例如,使用自连接在数据库“图书管理系统”的“作者表”中查找籍贯是“河北石家庄”的作者。
SELECT a.姓名,a.性别,b. 姓名,b.性别
FROM 作者表as a INNER JOIN作者表as b
ON a.籍贯=b.籍贯
WHERE a.籍贯=河北石家庄
ORDER BY 姓名
4.标准查询语言sql 篇四
Student(S#,Sname,Sage,Ssex) 学生表
Course(C#,Cname,T#) 课程表
SC(S#,C#,score) 成绩表
Teacher(T#,Tname) 教师表
问题:
1、查询“001”课程比“002”课程成绩高的所有学生的学号;
代码如下:
select a.S# from (select s#,score from SC where C#=‘001‘) a,(select s#,score
from SC where C#=‘002‘) b
where a.score>b.score and a.s#=b.s#;
2、查询平均成绩大于60分的同学的学号和平均成绩;
代码如下:
select S#,avg(score)
from sc
group by S# having avg(score) >60;
3、查询所有同学的学号、姓名、选课数、总成绩;
代码如下:
select Student.S#,Student.Sname,count(SC.C#),sum(score)
from Student left Outer join SC on Student.S#=SC.S#
group by Student.S#,Sname
4、查询姓“李”的老师的个数;
代码如下:
select count(distinct(Tname))
from Teacher
where Tname like ‘李%‘;
5、查询没学过“叶平”老师课的同学的学号、姓名;
代码如下:
select Student.S#,Student.Sname
from Student
where S# not in (select distinct( SC.S#) from SC,Course,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname=‘叶平‘);
6、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;
代码如下:
select Student.S#,Student.Sname from Student,SC where Student.S#=SC.S# and SC.C#=‘001‘and exists( Select * from SC as SC_2 where SC_2.S#=SC.S# and SC_2.C#=‘002‘);
7、查询学过“叶平”老师所教的所有课的同学的学号、姓名;
代码如下:
select S#,Sname
from Student
where S# in (select S# from SC ,Course ,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname=‘叶平‘ group by S# having count(SC.C#)=(select count(C#) from Course,Teacher where Teacher.T#=Course.T# and Tname=‘叶平‘));
8、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名;
代码如下:
Select S#,Sname from (select Student.S#,Student.Sname,score ,(select score from SC SC_2 where SC_2.S#=Student.S# and SC_2.C#=‘002‘) score2
from Student,SC where Student.S#=SC.S# and C#=‘001‘) S_2 where score2
9、查询所有课程成绩小于60分的同学的学号、姓名;
代码如下:
select S#,Sname
from Student
where S# not in (select Student.S# from Student,SC where S.S#=SC.S# and score>60);
10、查询没有学全所有课的同学的学号、姓名;
代码如下:
select Student.S#,Student.Sname
from Student,SC
where Student.S#=SC.S# group by Student.S#,Student.Sname having count(C#) <(select count(C#) from Course);
11、查询至少有一门课与学号为“1001”的同学所学相同的同学的学号和姓名;
代码如下:
select S#,Sname from Student,SC where Student.S#=SC.S# and C# in select C# from SC where S#=‘1001‘;
12、查询至少学过学号为“001”同学所有一门课的其他同学学号和姓名;
代码如下:
select distinct SC.S#,Sname
from Student,SC
where Student.S#=SC.S# and C# in (select C# from SC where S#=‘001‘);
13、把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩;
代码如下:
update SC set score=(select avg(SC_2.score)
from SC SC_2
where SC_2.C#=SC.C# ) from Course,Teacher where Course.C#=SC.C# and Course.T#=Teacher.T# and Teacher.Tname=‘叶平‘);
14、查询和“1002”号的同学学习的课程完全相同的其他同学学号和姓名;
代码如下:
select S# from SC where C# in (select C# from SC where S#=‘1002‘)
group by S# having count(*)=(select count(*) from SC where S#=‘1002‘);
15、删除学习“叶平”老师课的SC表记录;
代码如下:
Delect SC
from course ,Teacher
where Course.C#=SC.C# and Course.T#= Teacher.T# and Tname=‘叶平‘;
16、向SC表中插入一些记录,这些记录要求符合以下条件:没有上过编号“003”课程的同学学号、2、
号课的平均成绩;
代码如下:
Insert SC select S#,‘002‘,(Select avg(score)
from SC where C#=‘002‘) from Student where S# not in (Select S# from SC where C#=‘002‘);
17、按平均成绩从高到低显示所有学生的“数据库”、“企业管理”、“英语”三门的课程成绩,按如下形式显示: 学生ID,,数据库,企业管理,英语,有效课程数,有效平均分
代码如下:
SELECT S# as 学生ID
,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#=‘004‘) AS 数据库
,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#=‘001‘) AS 企业管理
,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#=‘006‘) AS 英语
,COUNT(*) AS 有效课程数, AVG(t.score) AS平均成绩
FROM SC AS t
GROUP BY S#
ORDER BY avg(t.score)
18、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分
代码如下:
SELECT L.C# As 课程ID,L.score AS 最高分,R.score AS 最低分
FROM SC L ,SC AS R
WHERE L.C# = R.C# and
L.score = (SELECT MAX(IL.score)
FROM SC AS IL,Student AS IM
WHERE L.C# = IL.C# and IM.S#=IL.S#
GROUP BY IL.C#)
AND
R.Score = (SELECT MIN(IR.score)
FROM SC AS IR
WHERE R.C# = IR.C#
GROUP BY IR.C#
);
19、按各科平均成绩从低到高和及格率的百分数从高到低顺序
代码如下:
SELECT t.C# AS 课程号,max(course.Cname)AS 课程名,isnull(AVG(score),0) AS平均成绩
,100 * SUM(CASE WHEN isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) AS 及格百分数
FROM SC T,Course
where t.C#=course.C#
GROUP BY t.C#
ORDER BY 100 * SUM(CASE WHEN isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) DESC
20、查询如下课程平均成绩和及格率的百分数(用“1行”显示): 企业管理(001),马克思(002),OO&UML (003),数据库(004)
代码如下:
SELECT SUM(CASE WHEN C# =‘001‘ THEN score ELSE 0 END)/SUM(CASE C# WHEN ‘001‘ THEN 1 ELSE 0 END) AS 企业管理平均分
,100 * SUM(CASE WHEN C# = ‘001‘ AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = ‘001‘ THEN 1 ELSE 0 END) AS 企业管理及格百分数
,SUM(CASE WHEN C# = ‘002‘ THEN score ELSE 0 END)/SUM(CASE C# WHEN ‘002‘ THEN 1 ELSE 0 END) AS 马克思平均分
,100 * SUM(CASE WHEN C# = ‘002‘ AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = ‘002‘ THEN 1 ELSE 0 END) AS 马克思及格百分数
,SUM(CASE WHEN C# = ‘003‘ THEN score ELSE 0 END)/SUM(CASE C# WHEN ‘003‘ THEN 1 ELSE 0 END) AS UML平均分
,100 * SUM(CASE WHEN C# = ‘003‘ AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = ‘003‘ THEN 1 ELSE 0 END) AS UML及格百分数
,SUM(CASE WHEN C# = ‘004‘ THEN score ELSE 0 END)/SUM(CASE C# WHEN ‘004‘ THEN 1 ELSE 0 END) AS 数据库平均分
,100 * SUM(CASE WHEN C# = ‘004‘ AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = ‘004‘ THEN 1 ELSE 0 END) AS 数据库及格百分数
FROM SC
21、查询不同老师所教不同课程平均分从高到低显示
代码如下:
SELECT max(Z.T#) AS 教师ID,MAX(Z.Tname) AS 教师姓名,C.C# AS 课程ID,MAX(C.Cname) AS 课程名称,AVG(Score) AS平均成绩
FROM SC AS T,Course AS C ,Teacher AS Z
where T.C#=C.C# and C.T#=Z.T#
GROUP BY C.C#
ORDER BY AVG(Score) DESC
22、查询如下课程成绩第 3 名到第 6 名的学生成绩单:企业管理(001),马克思(002),UML (003),数据库(004)
[学生ID],[学生姓名],企业管理,马克思,UML,数据库,平均成绩
代码如下:
SELECT DISTINCT top 3
SC.S# As 学生学号,
Student.Sname AS 学生姓名 ,
T1.score AS 企业管理,
T2.score AS 马克思,
T3.score AS UML,
T4.score AS 数据库,
ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) as 总分
FROM Student,SC LEFT JOIN SC AS T1
ON SC.S# = T1.S# AND T1.C# = ‘001‘
LEFT JOIN SC AS T2
ON SC.S# = T2.S# AND T2.C# = ‘002‘
LEFT JOIN SC AS T3
ON SC.S# = T3.S# AND T3.C# = ‘003‘
LEFT JOIN SC AS T4
ON SC.S# = T4.S# AND T4.C# = ‘004‘
WHERE student.S#=SC.S# and
ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0)
NOT IN
(SELECT
DISTINCT
TOP 15 WITH TIES
ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0)
FROM sc
LEFT JOIN sc AS T1
ON sc.S# = T1.S# AND T1.C# = ‘k1‘
LEFT JOIN sc AS T2
ON sc.S# = T2.S# AND T2.C# = ‘k2‘
LEFT JOIN sc AS T3
ON sc.S# = T3.S# AND T3.C# = ‘k3‘
LEFT JOIN sc AS T4
ON sc.S# = T4.S# AND T4.C# = ‘k4‘
ORDER BY ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) DESC);
23、统计列印各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60]
代码如下:
SELECT SC.C# as 课程ID, Cname as 课程名称
,SUM(CASE WHEN score BETWEEN 85 AND 100 THEN 1 ELSE 0 END) AS [100 - 85]
,SUM(CASE WHEN score BETWEEN 70 AND 85 THEN 1 ELSE 0 END) AS [85 - 70]
,SUM(CASE WHEN score BETWEEN 60 AND 70 THEN 1 ELSE 0 END) AS [70 - 60]
,SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) AS [60 -]
FROM SC,Course
where SC.C#=Course.C#
GROUP BY SC.C#,Cname;
24、查询学生平均成绩及其名次
代码如下:
SELECT 1+(SELECT COUNT( distinct平均成绩)
FROM (SELECT S#,AVG(score) AS平均成绩
FROM SC
GROUP BY S#
) AS T1
WHERE平均成绩 > T2.平均成绩) as 名次,
S# as 学生学号,平均成绩
FROM (SELECT S#,AVG(score)平均成绩
FROM SC
GROUP BY S#
) AS T2
ORDER BY平均成绩 desc;
25、查询各科成绩前三名的记录:(不考虑成绩并列情况)
代码如下:
SELECT t1.S# as 学生ID,t1.C# as 课程ID,Score as 分数
FROM SC t1
WHERE score IN (SELECT TOP 3 score
FROM SC
WHERE t1.C#= C#
ORDER BY score DESC
)
ORDER BY t1.C#;
26、查询每门课程被选修的学生数
代码如下:
select c#,count(S#) from sc group by C#;
27、查询出只选修了一门课程的全部学生的学号和姓名
代码如下:
select SC.S#,Student.Sname,count(C#) AS 选课数
from SC ,Student
where SC.S#=Student.S# group by SC.S# ,Student.Sname having count(C#)=1;
28、查询男生、女生人数
代码如下:
Select count(Ssex) as 男生人数 from Student group by Ssex having Ssex=‘男‘;
Select count(Ssex) as 女生人数 from Student group by Ssex having Ssex=‘女‘;
29、查询姓“张”的学生名单
代码如下:
SELECT Sname FROM Student WHERE Sname like ‘张%‘;
30、查询同名同性学生名单,并统计同名人数
代码如下:
select Sname,count(*) from Student group by Sname having count(*)>1;
31、1981年出生的学生名单(注:Student表中Sage列的类型是datetime)
代码如下:
select Sname, CONVERT(char (11),DATEPART(year,Sage)) as age
from student
where CONVERT(char(11),DATEPART(year,Sage))=‘1981‘;
32、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列
代码如下:
Select C#,Avg(score) from SC group by C# order by Avg(score),C# DESC ;
33、查询平均成绩大于85的所有学生的学号、姓名和平均成绩
代码如下:
select Sname,SC.S# ,avg(score)
from Student,SC
where Student.S#=SC.S# group by SC.S#,Sname having avg(score)>85;
34、查询课程名称为“数据库”,且分数低于60的学生姓名和分数
代码如下:
Select Sname,isnull(score,0)
from Student,SC,Course
where SC.S#=Student.S# and SC.C#=Course.C# and Course.Cname=‘数据库‘and score <60;
35、查询所有学生的选课情况;
代码如下:
SELECT SC.S#,SC.C#,Sname,Cname
FROM SC,Student,Course
where SC.S#=Student.S# and SC.C#=Course.C# ;
36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数;
代码如下:
SELECT distinct student.S#,student.Sname,SC.C#,SC.score
FROM student,Sc
WHERE SC.score>=70 AND SC.S#=student.S#;
37、查询不及格的课程,并按课程号从大到小排列
代码如下:
select c# from sc where scor e <60 order by C# ;
38、查询课程编号为003且课程成绩在80分以上的学生的学号和姓名;
代码如下:
select SC.S#,Student.Sname from SC,Student where SC.S#=Student.S# and Score>80 and C#=‘003‘;
39、求选了课程的学生人数
代码如下:
select count(*) from sc;
40、查询选修“叶平”老师所授课程的学生中,成绩最高的学生姓名及其成绩
代码如下:
select Student.Sname,score
from Student,SC,Course C,Teacher
where Student.S#=SC.S# and SC.C#=C.C# and C.T#=Teacher.T# and Teacher.Tname=‘叶平‘ and SC.score=(select max(score)from SC where C#=C.C# );
41、查询各个课程及相应的选修人数
代码如下:
select count(*) from sc group by C#;
42、查询不同课程成绩相同的学生的学号、课程号、学生成绩
代码如下:
select distinct A.S#,B.score from SC A ,SC B where A.Score=B.Score and A.C# B.C# ;
43、查询每门功成绩最好的前两名
代码如下:
SELECT t1.S# as 学生ID,t1.C# as 课程ID,Score as 分数
FROM SC t1
WHERE score IN (SELECT TOP 2 score
FROM SC
WHERE t1.C#= C#
ORDER BY score DESC
)
ORDER BY t1.C#;
44、统计每门课程的学生选修人数(超过10人的课程才统计),
50条SQL查询技巧、查询语句示例
,
要求输出课程号和选修人数,查询结果按人数降序排列,查询结果按人数降序排列,若人数相同,按课程号升序排列
代码如下:
select C# as 课程号,count(*) as 人数
from sc
group by C#
order by count(*) desc,c#
45、检索至少选修两门课程的学生学号
代码如下:
select S#
from sc
group by s#
having count(*) > = 2
46、查询全部学生都选修的课程的课程号和课程名
代码如下:
select C#,Cname
from Course
where C# in (select c# from sc group by c#)
47、查询没学过“叶平”老师讲授的任一门课程的学生姓名
代码如下:
select Sname from Student where S# not in (select S# from Course,Teacher,SC where Course.T#=Teacher.T# and SC.C#=course.C# and Tname=‘叶平‘);
48、查询两门以上不及格课程的同学的学号及其平均成绩
代码如下:
select S#,avg(isnull(score,0)) from SC where S# in (select S# from SC where score <60 group by S# having count(*)>2)group by S#;
49、检索“004”课程分数小于60,按分数降序排列的同学学号
代码如下:
select S# from SC where C#=‘004‘and score <60 order by score desc;
50、删除“002”同学的“001”课程的成绩
代码如下:
5.SQL语言学习工作总结 篇五
暑假过的真快总感觉昨天才刚放假,还想着这个暑假怎么过时,暑假就已经去了。
这个暑假一开始我们看了浙大的sql的视频,老师给我们的要求是只要看一遍就行。刚开始看的时候还能听懂一些,看到后面的时候基本就听不懂了,幸好老师对我们的要求不高,于时只好硬着头皮继续。
sql的视频其实总的说来无非讲的是对数据库、表、字段等的创建、修改和删除。我们不懂的也就是怎样使用代码来实现这些操作。我们现在只要对这些有了解就够了,以后还会有锻炼机会的。
之后我们参照着原代码做了《学生信息管理系统》,大概用了七天的时间。刚开始做的时候,觉得这个工程肯定会挺复杂的。但是做着做着感觉也就是那么回事。无非就是对几张表的操作。做这个工程最大的收获就是对刚学的sql知识有了一次熟练的机会,巩固了刚学的知识。也可以说是趁热打铁吧。
然后米老师给了我们更大的考验,让我们做《机房收费系统》,而且这次和上一次的《学生信息管理系统》不同的是,这次我们除了只有一个程序和数据库外,没有一个字的原码。
在得知我们可以把这次的工程做成任何样子时,我打算做一个类似于网吧那样的收费系统。也是一个cs系统。在网上查了一些主机如何与客户端通信的资料后,就开工了。虽然遇到了一些困难,但是到最后都一一解决了这三次的学习困难程度可以说是一次比一次高,米老师也是用心良苦呀。
经过这个暑假,对sql已经有了深一步的了解,还有就是将米老师的学习方法又应用了一次。可谓是受益匪浅。
6.Sql分页查询效率分析 篇六
表test中有1000条数据,2个字段:field1(int),field2(nvarchar)
--1000条数据,查询500次第1-10行,39s
--1000条数据,查询500次第500-550行,87s
--1000条数据,查询500次第150-160行,88s
DECLARE @uId int
SET @uId=1 BEGIN while @uId<=500 BEGIN
SELECT *
FROM (
SELECT row_number() over(
ORDER BY [dbo].[test].[filed1] desc) as rownum,* from [dbo].[test]) temp
WHERE temp.rownum BETWEEN 150 AND 160;
SET @uId=@uId+1 END END;
--1000条数据,查询500次第1-10行,78s
--1000条数据,查询500次第500-550行,78s
DECLARE @uId int
SET @uId=1 BEGIN while @uId<=500 BEGIN
SELECT *
FROM [dbo].[test]
ORDER BY [dbo].[test].[filed1] DESC
OFFSET (10 * (15 - 1)) ROWS FETCH NEXT 10 ROWS ONLY
SET @uId=@uId+1 END END
测试效果:
row_Number()不稳定,考前的记录查询比较快,靠后的记录查询时间会增加
OFFSET FETCH 稳定,考前靠后的查询时间都是基本一样
7.SQL查询功能教学总结 篇七
1 SQL查询功能子句
SQL是Structure Query Language的英文简写,意思是结构化查询语言。SQL语言包含三大部分:
(1)数据定义语言(DDL):用来定义和管理如数据库、表等数据库对象。
(2)数据操作语言(DML):用于检索和操作数据。
(3)数据控制语言(DCL):用于控制对数据库对象操作的权限。
本文主要阐述SQL语句中数据操作语言的查询功能。SQL语句查询各功能子句基本结构如下:
SELECT查询结果中的字段列表
FROM查询所用到的表的列表/联接条件
WHERE检索满足的条件
ORDER BY排序字段(asc升序、desc降序)
GROUP BY分组字段
HAVING限制分组条件(和GROUP BY搭配使用)
利用ACCESS建立教学管理.mdb,再创建以下六个数据表。
以教学管理.mdb数据库为基础,按各功能子句来归纳总结。
1.1 Select子句
(1)“觹”的使用
使用“觹”代表在查询集中显示查询所用到表中的所有字段。
例1:查询籍贯是北京的学生的所有字段信息。
select觹from学生
where籍贯='北京'
(2)别名的使用
表中的字段名经常使用英文,但为了使结果中的字段名更好地理解,常给原英文字段名取个别名;或者字段名是中文,结果中用其他字段名显示,都可以使用别名方式。
在SQL语句中,有几种别名的使用方式,这里只采用在各数据库中通用的方式:Select字段名as新字段名
例2:查询籍贯是“北京”的学生学号、姓名,结果字段名显示为学生编号、学生姓名。
select学号as学生编号,姓名as学生姓名from学生where籍贯=“北京”
(3)Distinct的使用
例3:招收了哪些籍贯的学生。select籍贯from学生
运行结果如图1所示。
结果中的籍贯值出现了重复,学生表有多少条记录,就出现相应数量的籍贯值。如果想消除重复值可以使用distinct,把它放在所要消除的字段名前面。改为:select distinct籍贯from学生,结果如图2所示。这样就只显示不重复的籍贯值,符合我们的要求。
(4)计算字段
在查询结果中经常需要看到统计数字,可以使用函数或表达式来完成计算功能。
例4:统计籍贯是北京的学生人数。select count(觹)as人数from学生
where籍贯=“北京”
例5:成绩表(学号,姓名,语文,数学,计算机),要查询各个学生的总分。
Select学号,姓名,(语文+数学+计算机)as总分From成绩表
1.2 From子句
把查询所用到的所有表,利用逗号隔开放在from后面。
例6:查询“胡兰”所选修的课程名称。
王海是学生姓名,姓名信息在学生表中;结果要显示课程名称,只能通过课程表获取;但是这两个表在数据库中没有直接联系,需要通过选课表做中介。这样该查询需要用到学生、课程、选课三个表。
Select课程名称
From学生,课程,选课
Where学生.学号=选课.学号and课程.课程编号=选课.课程编号and姓名=“胡兰”
/此句在后面阐述
1.3 Where子句
基本上大部分的查询语句都是在同时满足多个条件的基础上执行的,查询的条件放在where子句中,多个需同时满足的条件之间用and连接。例5需要满足的条件1:姓名=“胡兰”;因为查询用到了三个表,在这三个表之间进行查找信息应当是在对应字段值相等的时候进行,所以有两个连接条件:学生.学号=选课.学号and课程.课程编号=选课.课程编号。结果书写为:
Select课程名称
From学生,课程,选课
Where学生.学号=选课.学号and课程.课程编号=选课.课程编号and姓名=“胡兰”
在where子句中通常还会用到子查询,子查询的意思是一个查询语句在执行过程中借助了另一个查询语句(子查询)的结果作为中介值。
例7:查询大于平均年龄的学生姓名。Select姓名,年龄
From学生
Where年龄>(select avg(年龄)from学生)
/只有通过一个查询语句(子查询)才能获取到平均年龄
1.4 order by子句
order by子句是用来进行排序,查询的结果往往需要按照一定的规则排序,按升序排列用asc修饰,降序用desc。
若结果按姓名升序排列,写为order by姓名(默认按姓名升序排列)或者order by姓名asc。如果要降序,则写为order by姓名desc。若按多个字段排序,则把多级排序字段用逗号隔开,各个字段分别有升降序的方式。
例8:查看学生记录,结果按籍贯升序排列,籍贯相同的再按性别降序排序,籍贯相同且性别相同的按姓名升序排列。
Select
From学生
Order by籍贯asc,性别desc,姓名asc
1.5 group by子句
group by用来进行分组。把分组用到的字段放在group by后面。通常进行分组还需要满足一定的条件才分组,我们可以在group by子句后面紧接着使用having接分组条件。
例9:查询各地区学生的平均年龄。Select籍贯,avg(年龄)as平均年龄
From学生
Group by籍贯
例10:查询籍贯是“北京”的学生的平均年龄。Select籍贯,avg(年龄)as平均年龄
From学生
Group by籍贯
Having籍贯=“北京”
2 结束语
本文通过十个例子阐述了SQL常用的查询功能,针对高职院校学生注重动手实践能力的特点,在教学过程中主要让学生熟悉常用的查询功能,掌握查询精髓,为以后的软件设计、网页制作奠定基础。
参考文献
[1]教育部考试中心.全国计算机等级考试二级教程-Access数据库程序设计(2009年版).北京:高等教育出版社,2008-10.
[2]李春葆,曾平.数据库原理与应用-基于ACCESS.北京:清华大学出版社,2005-01.
[3]张俊玲.数据库原理与应用》.北京:清华大学出版社,2005-09.
【标准查询语言sql】推荐阅读:
SQL常用查询总结06-28
上海养老保险查询个人账户查询10-11
江西教师职称查询07-26
江苏工商信息查询09-01
房屋权属信息查询11-13
出生证明查询系统06-24
全国社会信用代码查询07-06
查询个人社保缴费明细07-07
数据库查询论文07-27