数据库基本select

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

4.1基本SELECT查询语句•SELECT语句的执行窗口:使用SQL编辑器数据查询假定已建好Students、Courses、Enrollment三个表,并已向各个表添加了数据(见下页表)。讨论一下数据查询问题:数据查询用来描述怎样从数据库中获取所需的数据。数据查询用到的语句就是查询语句,即SELECT语句,它是数据库操作中最基本、最重要的语句之一。SELECT语句的功能就是从一个或多个表或视图(一种虚拟表)中查到满足条件的数据。它的数据源是表或视图,而结果是另一个表。查询语句基本结构语法:SELECT目标列名表FROM数据源表[WHERE查询条件][GROUPBY分组列][HAVING组选择条件][ORDERBY排序列]SELECT语句说明SELECT语句包括:SELECT子句,FROM子句,可选的WHERE子句、GROUPBY子句、HAVING子句和ORDERBY子句。(1)SELECT目标列名表,称为SELECT子句,用于指定整个查询结果表中包含的列。假定已经执行完FROM、WHERE、GROUPBY、HAVING子句,从概念上来说得到了一个表,若将该表称为T,从T表中选择SELECT子句指定的目标列组成表就为整个查询的结果表。(2)FROM数据源表,称为FROM子句。用于指定整个查询语句用到的一个或多个基本表或视图,是整个查询语句的数据来源,通常称为数据源表。(3)WHERE查询条件,称为WHERE子句。用于指定多个数据源表的连接条件和单个源表中行的筛选条件或选择条件。如果只有一个源表,则没有表间的连接条件,只有行的筛选条件。(4)GROUPBY分组列,称为GROUPBY子句。假定已经执行完FROM、WHERE子句,则从概念上来说得到了一个表,若将该表称为T1表,则GROUPBY用于指定T1表按哪些列(称为分组列)进行分组,所有这些行组成一个表,不妨把它称为T2表,T2表实际上是一个组表。(5)HAVING组选择条件,称为HAVING子句。与GROUPBY子句一起使用。用于指定组表T2表的选择条件,即选择T2表中满足组选择条件的行,组成一个表就是SELECT子句中提到的表T。(6)ORDERBY排序列,称为ORDERBY子句。若有ORDERBY子句,则用于指定查询结果表T中按指定列进行升序或降序排序,得到整个查询的结果表。SELECT语句包含了关系代数中的选择、投影、连接、笛卡儿积等运算。下面首先学习单表查询SELECT语句中的各个子句4.1.1单表查询单表查询指的是在一个源表中查找所需的数据。因此,单表查询时,FROM子句中的数据源表只要给出一个源表表名。1.SELECT子句(1)选择表中若干列在SELECT子句的目标列名表中指定整个查询结果表中出现的若干个列名,各列名之间用逗号分隔【例4..1】查询全体学生的学号与姓名SELECTSno,SnameFROMStudents【例4.2】查询数据库studentcourse学生基本信息表s中学生的学号,姓名,所在系。SELECT学号,姓名,系FROMs(2)选择表中所有列(无条件查询)可以在目标列名表中指定表中所有列的列名,也可以用*来代替,或用表名.*代表指定表的所有列。*代表所有列;输出显示列的次序由SELECT指定【例4.1】查询所有学生可选的课程信息。SELECT*FROMc*表示选择当前表的所有属性列【例4.2】查询全体学生的学号、姓名、性别、年龄、所在系SELECTSno,Sname,Ssex,Sage,SdeptFROMStudents等价于:SELECT*FROMStudents(3)查询的数据可以使用表达式表达式可以是列名、常量、函数、或用列名、常量、函数等经过+(加)、-(减)、*(乘)、/(除)等组成的公式。【例4.3.3】查询全体学生的选课情况,即学号、课程号、成绩,对成绩值都加5。SELECTSno,Cno,Grade+5FROMEnrollment注意:结果中表达式列Grade+5无列名。实际上所有表达式列都没有列名。(4)设置列的别名所谓别名,就是另一个名字。有时需要显示特殊的输出列名,主要是为了方便阅读。例如:select职称‘高校教师职称’from教师设置列别名的方法有:原列名[AS]列别名或者:列别名=原列名【例4.3.4】查询全体学生的学号、姓名,并为原来的英文列名设置中文别名。以下三种方法等价:SELECTSno'学号',Sname'姓名'FROMStudentsSELECTSnoAS'学号',SnameAS'姓名'FROMStudentsSELECT'学号'=Sno,'姓名'=SnameFROMStudents【例4.3.5】查询全体学生的选课情况,其成绩列值都加5,并为各列设置中文的别名SELECTSno'学号',Cno'课程号',Grade+5'成绩'FROMEnrollment结果为:【例4.4】查询表s的学号和姓名信息,其中设置学号的别名为xh,设置姓名的别名为xmSELECT学号ASxh,姓名ASxmFROMS或SELECT学号AS'xh',姓名AS'xm'FROMS或SELECT学号AS[xh],姓名AS[xm]FROMS或SELECT'xh'=学号,'xm'=姓名FROMS(5)使用DISTINCT消除结果表中完全重复的行例如:SELECT职称from教师职称副教授讲师教授教授selectdistinct职称from教师【例3.3.6】显示所有选课学生的学号。SELECTSno'学号'FROMEnrollment【例4.3.7】显示所有选课学生的学号,并去掉重复行。SELECTDISTINCTSno'学号'FROMEnrollment与DISTINCT相反的是ALL,ALL表示保留结果表中的重复行。默认情况下是ALL,表示保留重复行。2.FROM子句单表查询中,源表只有一个:FROM源表名•例如,要查找学生有关的信息,用到Students表,则FROM子句为:FROMStudents•例如,要查找课程有关的信息,用到Courses表,则FROM子句为:FROMCourses•例如,要查找选课有关的信息,用到Enrollment表,则FROM子句为:FROMEnrollment3、通过TOP子句限制结果集输出的行数(1)命令格式SELECT[TOPn[PERCENT]][属性列表](2)功能n是一个正整数,如果指定PERCENT关键字,则返回前百分之n条记录,n必须介于0到100之间的正整数。比如“SELECTTOP3”表示输出查询结果集的前3行,“SELECTTOP3PERCENT”表示输出查询结果集的前3%记录行。例如:selectdistincttop8籍贯from学生信息【例4.8】将课程成绩70分以下的同学的成绩提高5分,然后把结果存储到(另存)新数据表“最新成绩”中。SELECT成绩+5AS最新成绩INTO最新成绩FROMscWHERE成绩704、INTO子句的使用4.1.2WHERE子句WHERE查询条件:只获得满足条件的数据。查询体条件中没有多表连接条件,只有一个表的行筛选条件。查询条件中常用的运算符:比较运算符和逻辑运算符。(P101表4-1)常用的比较运算符有:=(等于)、(大于)、(小于)、=(大于等于)、=(小于等于)、!=或(不等于)、!((不大于)、!((不小于)共9种。范围比较运算符:BETWEEN…AND…,NOTBETWEEN…AND集合比较运算符:IN,NOTIN字符匹配运算符:LIKE,NOTLIKE空值比较运算符:ISNULL,ISNOTNULL条件连接运算符:AND,OR,NOT基于其它运算符的查询【例4.10】在基本表S中检索1978-01-06出生的学生情况。SELECT*FROMsWHERE出生日期='1978-01-06'【例4.11】在基本表S中检索1978年及以后出生的学生情况。SELECT*FROMsWHEREyear(出生日期)=1978或SELECT*FROMsWHEREyear(出生日期)!1978【例4.14】列出表S中管理信息系年龄小于28岁的学生的学号和出生年份情况。SELECT学号,year(出生日期)as出生年份FROMsWHERE系='管理信息系'and(year(getdate())-year(出生日期))28基于BETWEEN…AND的查询基本形式:列名BETWEEN下限值AND上限值等价于:列名=下限值AND列名=上限值列名可以是表达式列的别名。BETWEEN…AND…一般用于数值型范围的比较。表示当列值在指定的下限值和上限值范围内时,条件为TRUE,否则,为FALSE。NOTBETWEEN…AND…与BETWEEN…AND…正好相反,表示列值不在指定的下限值和上限值范围内时,条件为TRUE,否则为FALSE。注意:列名类型要与下限值或上限值的类型一致。【例4.3.10】查询学生选课成绩在80~90分之间的学生学号、课程号、成绩。SELECT*FROMEnrollmentWHEREGradeBETWEEN80AND90SELECT*FROMEnrollmentWHEREGrade=80ANDGrade=90【例4.3.11】查询学生年龄不在20~30之间的学生学号、姓名、所在系。SELECTSno,Sname,SdeptFROMStudentsWHERESageNOTBETWEEN20AND30SELECTSno,Sname,SdeptFROMStudentsWHERESage20ORSage30基于IN的查询IN用于测试一个列值是否与常量表中的任何一个值相等。IN条件表示格式为:列名IN(常量1,常量2,…常量n)当列值与IN中的任一常量值相等时,则条件为TRUE,否则为FALSE。NOTIN与IN的含义正好相反,当列值与IN中的任一常量值都不相等时,则结果为TRUE,否则为FALSE。【例4.3.12】查询数学系、计算机系、艺术系学生的学号、姓名。SELECTSno,SnameFROMStudentsWHERESdeptIN('Math','Computer','Art')此句等价于:SELECTSno,SnameFROMStudentsWHERESdept='Math'ORSdept='Computer'ORSdept='Art'【例4.3.13】查询既不是数学系、计算机系,也不是艺术系学生的学号、姓名。SELECTSno,SnameFROMStudentsWHERESdeptNOTIN('Math','Computer','Art')此句等价于:SELECTSno,SnameFROMStudentsWHERESdept!='Math'ANDSdept!='Computer'ANDSdept!='Art'基于LIKE的查询LIKE用于测试一个字符串是否与给定的模式匹配。所谓模式是一种特殊的字符串,其中可以包含普通字符,也可以包含特殊意义的字符(通常叫通配符)。一般形式为:列名LIKE模式串模式串中可包含四种通配符:_:匹配任意一个字符。注意,在这里一个汉字或一个全角字符也算一个字符。如'_u_'表示第二个字符为u或U,%:匹配任意0个或多个字符。如'S%'表示以S开头的字符串。[]:匹配[]中的任意一个字符。如[SDJ]。[^]:不匹配[]中的任意一个字符。如[^SDJ]可以用LIKE来实现模糊查询【例4.3.14】查找姓名的第二个字符是u并且只有三个字符的学生的学号、姓名。SELECTSno,SnameFROMStudentsWHERESnameLIKE'_u_'【例4.3.15】查找姓名以S开头的所有学生的学号、姓名。SELECTSno,SnameFROMStudentsWHERESnameLIKE'S%'【例4.3.16】查找姓

1 / 60
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功