您好,欢迎访问三七文档
《SQL查询语句》查询语句基本结构SELECT目标列名表FROM数据源表[WHERE查询条件][GROUPBY分组列][HAVING组选择条件][ORDERBY排序列]其中:1)SELECT目标列名表,用于指定整个查询结果表中包含的列;2)FROM数据源表,用于指定查询语句中用到的一个或多个基本表或视图。3)[WHERE查询条件],用于指定多个数据源表的连接条件和单个源表中行的筛选条件或选择条件。4)[GROUPBY分组列],用于指定执行FROM、WHERE子句后得到的表按哪些列进行分组;5)[HAVING组选择条件],与GROUPBY子句一起使用,用于指定GROUPBY子句得到组表的选择条件;6)[ORDERBY排序列],在表中按指定列进行升序或降序排列。注意:SELECT语句的结果表不一定满足关系的性质,也即不一定是一个关系。单表查询定义:在一个源表中查找所需要的数据。1.SELECT子句(1)选择表中若干列在SELECT目标列名表中指定整个查询结果表中出现的若干个列名,各列名之间用逗号分隔。例7查询全体学生的学号和姓名:SELECTSno,SnameFROMStudents(2)选择表中所有列在目标列名表中指定表中所有列的列名,也可以用*替代,或用表名。例8查询全体学生的学号、姓名、性别、年龄和所在系:SELECTSno,Sname,Ssex,Sage,SdeptFROMStudentsSELECT*FROMStudents(3)使用表达式表达式由列名、常量或函数及+、-、X、/组成例9查询全体学生的选课情况,即学号、课程号、成绩,对成绩都加5:分析:对成绩都加5,因此SELECT子句中不能直接输出Grade列,必须使用表达式Grade+5作为一列。SELECTSno,Cno,Grade+5FROMEnrollmentSnoCnoGrade20010101C19020010102C18820010102C29420010102C362SnoCno20010101C19520010102C19320010102C29920010102C367(4)设置列的别名定义:给列设置另一个名字。方法:原列名[AS]列别名列别名=原列名例10查询全体学生的学号、姓名,并为原来的英文列名设置中文列名。SELECTSno‘学号’,Sname‘姓名’FROMStudentsSELECTSnoAS‘学号’,SnameAS‘姓名’FROMStudentsSELECT‘学号’=Sno,‘姓名’=SnameFROMStudents例11查询全体学生的选课情况,其成绩列值都加5,并为各列设置中文的别名。SELECTSno‘学号’,Cno‘课程号’,Grade+5‘成绩’FROMEnrollment学号课程号成绩20010101C19520010102C19320010102C29920010102C367SnoCno20010101C19520010102C19320010102C29920010102C367(5)使用DISTINCT消除结果表中完全重复的行例12显示所有选课学生的学号:SELECTSno‘学号’FROMEnrollment例13显示所有选课学生的学号并去掉重复行:SELECTDISTINCTSno‘学号’FROMEnrollment学号20010101200101022001010220010102学号20010101200101022.FROM子句由于单表查询中源表只有一个,所以FROM子句形式:FROM源表名例如,要查找学生的信息,用到Students表FROMStudents例如,要查找课程的信息,用到Courses表FROMCourses例如,要查找选课的信息,用到Enrollment表,FROMEnrollment3.WHERE子句查询条件决定了结果表中的行应该满足的条件,由列名、运算符、常量、函数等连接而成。常用的比较运算符:=(等于)、(大于)、(小于)、=(大于等于)、=(小于等于)、!=或(不等于)、!(不大于)、!(不小于)共9种。逻辑运算符:1)范围比较运算符:BETWEEN…AND,NOTBETWEEN…AND2)集合比较运算符:IN,NOTIN3)字符匹配运算符:LIKE,NOTLIKE4)空值比较运算符:ISNULL,ISNOTNULL5)条件连接运算符:AND,OR,NOT(1)基于比较运算符的查询例14查询学生选课成绩大于80分的学生学号、课程号、成绩。SELECT*FROMEnrollmentWHEREGrade80例15查询计算机系全体学生的学生学号、姓名号。SELECTSno,SnameFROMStudentsWHERESdept=‘Computer’(2)基于BETWEEN…AND的查询适用情况:表中某一列值或表达式列值在一个确定的范围内,也即用于数值型范围的比较。适用格式:列名BETWEEN下限值AND上限值列名=下限值AND列名=上限值注意:列名类型要与下限值或上限值的类型一致。例16查询学生选课成绩在80-90分之间的学生学号、课程号和成绩。SELECT*FROMEnrollmentWHEREGradeBETWEEN80AND90SELECT*FROMEnrollmentWHEREGrade=80ANDGrade=90例17查询女学生的学号、姓名及所在系。SELECTSno,Sname,SdeptFROMStudentsWHERESsex=‘F’(3)基于IN的查询适用情况:测试一个列值是否与常量表中的任何一个值相等。表示格式:列名IN(常量1,常量2,…常量n)例18查询年龄为19、20岁的学生学号、姓名。SELECTSno,SnameFROMStudentsWHERESageIN(19,20)例19查询数学系、计算机系、艺术系学生的学号、姓名及所在系。SELECTSno,Sname,SdeptFROMStudentsWHERESdeptIN(‘Math’,’Computer’,’Art’)SELECTSno,SnameFROMStudentsWHERESdept=‘Math’ORSdept=’Computer’ORSdept=’Art’(4)基于LIKE的查询适用情况:测试一个字符串是否与给定的模式匹配。模式的概念:是一种特殊的字符串,可以包含普通字符,也可包含特殊意义的字符,通常称为通配符。表示形式:列名LIKE模式串四种通配符:_:匹配任意一个字符;%:匹配任意多个字符;[]:匹配[]中的任意一个字符;[^]:不匹配[]中的任意一个字符。例20查找姓名的第二个字符是u并且只有3个字符的学生的学号及姓名。SELECTSno,SnameFROMStudentsWHERESnameLIKE‘_u_’例21查找姓名以S开头的所有学生的学号及姓名。SELECTSno,SnameFROMStudentsWHERESnameLIKE‘S%’例22查找姓名以S、D或A开头的所有的学生学号及姓名。SELECTSno,SnameFROMStudentsWHERESnameLIKE‘[SDA]%’例23查找姓名不是以D或J开头的所有的学生学号及姓名。SELECTSno,SnameFROMStudentsWHERESnameLIKE‘[^DJ]%’(5)基于NULL空值的查询空值:尚未确定或不确定的值。NULL空值的查询:不能使用比较运算符等于和不等于。判断列值为空的语句格式:列名ISNULL判断列值不为空的语句格式:列名ISNOTNULL例24查找无考试成绩的学生的学号和相应的课程号。SELECTSno,CnoFROMEnrollmentWHEREGradeISNULLWHEREGrade=0X例25查找有考试成绩的学生的学号和相应的课程号。SELECTSno,CnoFROMEnrollmentWHEREGradeISNOTNULL(6)基于多个条件的查询使用AND、OR逻辑谓词来连接多个条件。使用格式:条件1AND条件2AND…条件n或条件1OR条件2OR…条件n例26查询数学系的男学生的学号和姓名。SELECTSno,SnameFROMStudentsWHERESdept=‘Math’ANDSsex=‘M’例27查询计算机系或者年龄为19岁的学生的学号和姓名。SELECTSno,SnameFROMStudentsWHERESdept=‘Computer’ORSage=‘19’WHERE(Sdept=‘Computer’ORSage=19)例28查询选修了C1或C3课程的学生的学号和成绩。SELECTSno,GradeFROMEnrollmentWHERE(Cno=‘C1’ORCno=‘C3’)(6)基于统计函数的查询统计函数:集合(或聚集)函数;作用:对一组值进行计算并返回一个值。常用的统计函数:COUNT(*):求表中或组中记录的个数;COUNT(列名):求不是NULL的列值个数;SUM(列名):求该列所有值的总和(必须是int);AVG(列名):求该列所有值的平均值(必须是int);MAX(列名):求该列的最大值(必须是int);MIN(列名):求该列的最小值(必须是int)。例29求课程的总数。SELECTCOUNT(*)AS‘课程总数’FROMCourses例30求选修了课程的学生人数。SELECTCOUNT(DISTINCTSno)AS‘选修课程的总人数’FROMEnrollment例31求选修了C1课程的学生的平均成绩。SELECTAVG(Grade)AS‘平均成绩’FROMEnrollmentWHERECno=‘C1’例32求选修了C1课程的学生的最高分和最低分。SELECTMAX(Grade)AS‘最高分’,MIN(Grade)AS‘最低分’FROMEnrollmentWHERECno=‘C1’4.GROUPBY子句—在WHERE子句的后面操作过程:将FROM、WHERE子句产生的表按某种原则分组,然后对每个组进行统计,一组形成一行,最后把这些行组成一个表(称为组表)。一般形式:GROUPBY分组列[,…n]例33求选修每门课程的学生人数。SELECTCnoAS‘课程号’,COUNT(Sno)AS‘选修人数’FROMEnrollmentGROUPBYCno课程号选修人数C12C21C315.HAVING子句HAVING子句指定GROUPBY生成的组表的选择条件,在GROUPBY子句之后,并且必须与GROUPBY子句一起使用。一般形式:HAVING组选择条件例34求选修课程数大于等于2的学生的学号、平均成绩及其选修的课程门数。SELECTSno,AVG(Grade)AS‘平均成绩’,COUNT(*)AS‘选修门数’FROMEnrollmentGROUPBYCnoHAVINGCOUNT(*)=26.ORDERBY子句将查询结果按某种顺序输出。一般形式:ORDERBY列名[ASC][DESC][,…n]ASC—列值升序方式排序;DESC—列值降序方式。默认的排序方式:升序排列(ASC)。例35查询所有学生的行,并按学生的年龄从小到大排序。SELECT*FROMStudentsORDERBYSage例36查询全体学生的信息,查询结果按所在系的系名升序排列,同一系的学生按年龄降序排列。SELECT*FROMStudentsORDERBYSdeptASC,SageDESC例37求选修课程数大于等于2的学生的学号、平均成绩和选课门数,并按平均成绩降序排列。SELECTSno,AVG(Grade)AS‘平均成绩’,COUNT(*)AS‘选课门数’FROMEnrollmentGROUPBYSnoHAVINGC
本文标题:《SQL查询语句》
链接地址:https://www.777doc.com/doc-3939573 .html