您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据结构与算法 > 实验参考SQL的数据查询(单表查询)
数据查询是关系运算理论在SQL语言中的主要表现。SQL的数据查询只有一条SELECT语句,但它是用途最广泛的一条语句,功能非常强大。在学习时,应注意把与聚合关系代数表达式联系起来考虑问题。一、SELECT命令的格式与基本使用SQL语言提供SELECT语句,通过查询操作可得到所需的信息。SELECT语句的一般格式为:SQL的数据查询SELECT[ALL|DISTINCT]〈目标表的列名或列表达式序列〉FROM〈基本表名或视图名〉[{,〈基本表名或视图名〉}][WHERE〈行条件表达式〉][GROUPBY列名1[HAVING条件表达式]][ORDERBY列名2[ASC|DESC]];1、SELECT完整语句的执行过程:SQL的数据查询SELECT的完整语句格式根据WHERE子句的条件表达式,从FROM子句指定的基本表或视图中找出满足条件的元组,再按SELECT子句中的目标列表达式,选出元组中的属性值形成结果表。如果有GROUP子句,则将结果按列名1的值进行分组,该属性列值相等的元组为一个组,每个组产生结果表中的一条记录。通常会在每组中作用集函数。如果GROUP子句带HAVING短语,则只有满足指定条件的组才予输出。如果有ORDER子句,则结果表还要按列名2的值的升序或降序排序。2、SELECT完整语句的说明SQL的数据查询SELECT[DISTINCT]〈目标表的列名或列表达式序列〉FROM〈基本表名或视图名〉[{,〈基本表名或视图名〉}][WHERE〈行条件表达式〉][GROUPBY列名1[HAVING条件表达式]][ORDERBY列名2[ASC|DESC]];DISTINGT:去掉重复的列名行。列表达式序列:SELECT后除了放列名,为了增强了基本检索能力,还可以放以特定数据类型为域的列名为变量的函数,SQL提供了许多库函数(聚合函数)。常用的库函数,如下表所示:例如:设教学数据库EDUCATION中有三个关系:学生关系S(SNO,SNAME,AGE,SEX,SDEPT)学习关系SC(SNO,CNO,GRADE)课程关系C(CNO,CNAME,CDEPT,TNAME)SQL的数据查询函数名称功能AVG按列计算平均值(列值必须是数值)SUM按列计算值的总和(列值必须是数值)MAX求一列中的最大值MIN求一列中的最小值COUNT按列值计个数,COUNT(*)元组个数SQL的数据查询SNO,SNAME,AGE,SEX,SDEPTs1LiYang20M通讯s2WangLi21M计算机s3WuFang19F材料……………………snTangWen20F物理SNO,CNO,GRADES1c1AS2c2B………CNO,CNAME,CDEPT,TNAMEC1离散数学计算机林英C2接口技术计算机李凡……………………C3固体物理材料……………………Cn理论物理物理张礼学生关系S学习关系SC课程关系C【例1】(1)查询全体学生的学号、姓名和年龄。(2)查询学生的全部信息。(3)查询选修了课程的学生号。【解答】(1)SELECTSNO,SNAME,AGEFROMSSQL的数据查询SNO,SNAME,AGE,SEX,SDEPTs1LiYang20M通讯s2WangLi21M计算机s3WuFang19F材料……………………snTangWen20F物理SNO,SNAME,AGEs1LiYang20s2WangLi21s3WuFang19…………snTangWen20(2)SELECT*FROMS用‘*’表示S表的全部列名,而不必逐一列出。(3)SELECTDISTINCTSNOFROMSC查询结果中的重复行被去掉。上述查询均为不使用WHERE子句的无条件查询,也称作投影查询。另外,利用投影查询可控制列名的顺序,并可通过指定别名改变查询结果的列标题的名字。(1)问也可以写成:SELECTSNAMENAME,SNO,AGEFROMS其中,NAME为SNAME的别名。【例2】SQL的数据查询(1)求计算机系学生的总数。SELECTCOUNT(SNO)FROMSWHERESDEPT='计算机'SNO,SNAME,AGE,SEX,SDEPTs1LiYang20M通讯s2WangLi21M计算机s3WuFang19F材料……………………snTangWen20F物理(2)求学校中共有多少个系SELECTCOUNT(DISTINCTSDEPT)ASDeptNumFROMS注意:a.加入关键字DISTINCT后表示消去重复行,可计算字段“SDEPT“不同值的数目。b.COUNT函数对空值不计算,但对零进行计算。(3)统计有成绩同学的人数SELECTCOUNT(GRADE)FROMSC上例中成绩为零的同学计算在内,没有成绩(即为空值)的不计算。SQL的数据查询SELECT[DISTINCT]〈目标表的列名或列表达式序列〉FROM〈基本表名或视图名〉[{,〈基本表名或视图名〉}][WHERE〈行条件表达式〉][GROUPBY列名1[HAVING条件表达式]][ORDERBY列名2[ASC|DESC]];WHERE〈行条件表达式〉:当要在表中找出满足某些条件的行时,则需使用WHERE子句指定查询条件。WHERE子句中,条件通常通过三部分来描述:Section1:列名;Section3:列名、常数Section2:比较运算符;WHERE子句中常用的比较运算符如下表:SQL的数据查询查询条件谓词算术比较运符确定范围集合运算符确定集合逻辑运算符字符匹配空值谓词聚合函数=,,,=,=,!=,或!=BETWEENAND,NOTBETWEENANDUNION(并),INTERSECT(交),EXCEPT(差)IN,NOTINAND,OR,NOTLIKE,NOTLIKEISNULL,ISNOTNULLEXISTS(存在量词),ALL,SOME,UNIQUEAVG(平均值),MIN,MAX,SUM,COUNT(计数)SQL的数据查询SELECT[DISTINCT]〈目标表的列名或列表达式序列〉FROM〈基本表名或视图名〉[{,〈基本表名或视图名〉}][WHERE〈行条件表达式〉][GROUPBY列名1[HAVING条件表达式]][ORDERBY列名2[ASC|DESC]];GROUPBY:GROUPBY子句可以将查询结果表的各行按一列或多列取值相等的原则进行分组。ORDERBY:用户也可以用ORDERBY子句指定按照一个或多个属性列的升序(ASC)或降序(DESC)重新排列查询结果,其中升序ASC为缺省值。二、SELECT命令的格式的应用SQL的数据查询SELECT[DISTINCT]〈目标表的列名或列表达式序列〉FROM〈基本表名或视图名〉[{,〈基本表名或视图名〉}][WHERE〈行条件表达式〉][GROUPBY列名1[HAVING条件表达式]][ORDERBY列名2[ASC|DESC]];应用1、单表查询2、多表查询(连接查询)3、集合查询1、单表查询单表查询选择表中的若干列查询指定列查询全部列查询经过计算的值对查询结果排序使用集函数对查询结果分组选择表中的若干元组消除取值重复的行查询满足条件的元组比较确定范围确定集合字符匹配涉及空值的查询多重条件查询单表查询1、单表查询(一)选择表中的若干列设教学数据库EDUCATION中有一个关系:学生关系Student(SNO,SNAME,AGE,SEX,SDEPT)中有一万条记录。单表查询SNO,SNAME,AGE,SEX,SDEPT95001李勇20M通讯95002刘晨21M计算机95003王名19F材料……………………99999张立20M物理……………………(1)查询指定列【例1】查询全体学生的姓名、学号、所在系SELECTSname,Sno,SdeptFROMStudent;(2)查询全部列【例2】查询全体学生的详细记录SELECT*FROMStudent;(3)查询经过计算的值SELECT子句的目标列表达式不仅可以是表中的属性列,也可以是有关表达式,即可以将查询出来的属性列经过一定的计算后列出结果。【例3】查全体学生的姓名及其出生年份这时结果表中的列的顺序与基表中不同,是按查询要求,先列出姓名属性,然后再列学号属性和所在系属性。实际上是无条件地把Student表的全部信息都查询出来,所以也称为全表查询,这是最简单的一种查询。单表查询SELECTSname,2003-SageFROMStudent本例中,目标列表达式中第二项不是通常的列名,而是一个计算表达式,是用当前的年份减去学生的年龄,这样,所得的即是学生的出生年份。输出的结果为:此外,不仅可以是算术表达式,还可以是字符串常量、函数等用户可以通过指定别名来改变查询结果的列标题,例如对于上例,可以如下定义列别名SELECTSnameNAME,'YearofBirth:'BIRTH,2003-SageBIRTHDAY,ISLOWER(Sdept)DEPARTMENTFROMStudent;Sname2003-Sage李勇刘晨王名张立……1983198219841981……单表查询结果为:SELECT命令的格式目标列表达式不仅可以是算术表达式,还可以是字符串常量、函数等。同时用户可以通过指定别名来改变查询结果的列标题,这对于含算术表达式、常量、函数名的目标列表达式尤为有用。NAMEBIRTHBIRTHDAYDEPARTMENT李勇刘晨王名张立……YearofBirth:YearofBirth:YearofBirth:YearofBirth:……1976197619761976……csifmais……单表查询(二)选择表中的若干元组(1)消除取值重复的行【例4】假如教学数据库EDUCATION中有一个学习关系:SC(SNO,CNO,GRADE)查所有选修过课的学生的学号SELECTSnoFROMSC;该查询结果里包含了许多重复的行。如果想去掉结果表中的重复行,必须指定DISTINCT短语:SELECTDISTINCTSnoFROMSC;(2)查询满足条件的元组查询满足指定条件的元组可以通过WHERE子句实现。单表查询SNO,CNO,GRADE95001c19695001c298………99999c586………SNO9500195001……95002……99999SNO9500195002……95100……ⓐ比较【例5】从学生关系Student中查计算机系全体学生的名单SELECTSnameFROMStudentWHERESdept='CS';【例6】查所有年龄在20岁以下的学生姓名及其年龄单表查询SELECTSname,SageFROMStudentWHERESage20;SELECTSname,SageFROMStudentWHERENOTSage=20;或【例7】查考试成绩有不及格的学生的学号SELECTDISTINCTSnoFROMCWHEREGrade60;这里使用了DISTINCT短语,当一个学生有多门课程不及格,他的学号也只列一次。注:C为课程关系C(CNO,CNAME,CDEPT,TNAME)ⓑ确定范围【例8】在学生关系Student中,查询年龄在20至23岁之间的学生的姓名、系别、和年龄与BETWEEN...AND...相对的谓词是NOTBETWEEN...AND...。【例9】查询年龄不在20至23岁之间的学生姓名、系别和年龄。单表查询SELECTSname,Sdept,SageFROMStudentWHERESageBETWEEN20AND23;SELECTSname,Sdept,SageFROMStudentWHERESageNOTBETWEEN20AND23;ⓒ确定集合【例9】在学生关系Student中,查信息系(IS)、数学系(MA)和计算机科学系(CS)的学生的姓名和性别单表查询SELECTSname,SsexFROMStudentWHERESdeptIN('
本文标题:实验参考SQL的数据查询(单表查询)
链接地址:https://www.777doc.com/doc-2459635 .html