《SQL语言及T-SQL的应用.ppt》由会员分享,可在线阅读,更多相关《SQL语言及T-SQL的应用.ppt(100页珍藏版)》请在三一办公上搜索。
1、第三章SQL语言及T-SQL的应用(1),本章学习重点之一:1、关系数据库的标准语言SQL基本知识。2、SQL的数据定义语句、数据操作语句、数据控制语句。3、视图、索引的概念与操作。,内容概要(之一):3.1 关系数据库的标准语言SQL3.2 数据定义3.3 数据查询语言,3.1关系数据库标准语言SQL3.1.1 SQL的发展史1974年IBM圣约瑟实验室(San Jose Research Laboratory)的Boyce和Chamberlin为关系数据库管理系统System-R设计的一种查询语言,当时称为SEQUEL语言(Structured English Query Language
2、),后简称为SQL。1981年IBM推出关系数据库系统SQL/DS后,SQL得到了广泛应用。,1986年美国国家标准协会(American National Standard Institute 简称ANSI)公布了第一个SQL标准SQL86。1987年,国际标准化组织(International Organization for Standardization 简称ISO)通过SQL86标准。1989年,ISO制定SQL89标准,SQL89标准在SQL86基础上增补了完整性描述。1990年,我国制定等同SQL89的国家标准。1992年,ISO制定SQL92标准,即SQL2。1999年,ANS
3、I制定SQL3标准。注:Server 2000中使用Transact-SQL语言。,3.1.2 SQL的特点,SQL(Structured Query Language)的特点:综合统一a、SQL集各种数据语言的功能于一体,语言风格统一。b、实体和实体之间的联系均用关系表示。2.高度非过程化 只要提出“做什么”。有利于各种数据库之间交换数据、有利于程序的移植、有利于实现程序和数据间的独立性;有利于实施标准化。,3.面向集合的操作方式 操作数是集合,操作结果也是集合。4.以同一种语法结构提供两种使用方法自含式语言:联机交互的使用方式。嵌入式语言:嵌入到高级语言中。5.语言简洁,易学易用,3.1.
4、3 SQL的分类1、数据定义语言(DDL:Data Definition Language)创建、修改或删除数据库中各种对象,包括表、视图、索引等。2、查询语言(QL:Query Language)按照指定的组合、条件表达式或排序检索。3、数据操纵语言(DML:Data Manipulation Language)插入、删除、修改等操作。,4、数据控制语言(DCL:Data Control Language)授予或收回访问数据库的某种特权、控制数据操纵事务的发生时间及效果、对数据库进行监视。注意:在书写各种SQL 命令时,命令中所涉及的标点符号,如括号、逗号、分号、圆点(英文句号)等都应是英文
5、半角,如果写成中文全角符号,则会在执行命令时出错。,3.2 数据定义命令 数据定义命令用于建立数据库和建立、修改、删除基本表。,3.2.1 建立数据库ANSI标准SQL建立数据库(SCHEMA:模式)的命令是:CREATE SCHEMA AUTHORIZATION;例如:创建者是duck,则上面命令写作:CREATE SCHEMA AUTHORIZATION duck;注:RDBMS更常用下面命令格式:CREATE DATABASE;例如:建立学费管理数据库的命令CREATE DATABASE xfgl;,Server语言,SQL SERVER中建立数据库补充,SQL Server 2000中
6、常用的数据类型:,Server中的数据类型,3.2.2 建立数据表(标准)建立基本表的命令格式为:CREATE TABLE(,);:所要定义的基本表的名字:组成该表的各个属性(列):涉及相应属性列的完整性约束条件,如:NOT NULL:指该列的值不能为空值。UNIQUE:指该列的值是唯一的。:涉及一个或多个属性列的完整性约束条件 注:完整性约束被存入系统的数据字典中。,创建表语句中常用完整性约束、主码约束:PRIMARY KEY、唯一性约束:UNIQUE、非空值约束:NOT NULL、参照完整性约束:FOREIGN KEY REFERENCES 引用表名(引用列)、检查约束:CHECK(检查表
7、达式)、默认值约束:DEFAULT默认值,例1 建立一个”学生”表Student,它由学号Sno、姓名Sname、性别Ssex、年龄Sage、所在系Sdept五个属性组成。其中学号不能为空,值是唯一的,并且姓名取值也唯一。(非空约束、唯一性约束实例)CREATE TABLE Student(Sno CHAR(8)NOT NULL UNIQUE,Sname VARCHAR(10)UNIQUE,Ssex CHAR(2),Sage tinyint,Sdept CHAR(2);Not null、unique组合等价于主键约束。,例2主键约束、默认约束:CREATE TABLE student(Sno
8、CHAR(8)PRIMARY KEY,Sname VARCHAR(10)UNIQUE,Ssex CHAR(2)default 男,Sage TINYINT,Sdept CHAR(2);,列级约束,PRIMARY KEY与 UNIQUE 的区别?()主键具有以下特征:每个表只能定义一个主键主键值不能为空。主键列可以由一个或多个列组成。主键值不重复。()惟一键通常限定的是没有被选为主键的关键字,它列或多列值的不重复,惟一性与主键的区别如下:每个表可以有多个惟一键。惟一键的列值可以为空,但只能有一个空。,例3建立一个“学生选课”表SC,它由学号Sno、课程号Cno,修课成绩Grade组成,其中(Sn
9、o,Cno)为主码。(CHECK约束实例)CREATE TABLE SC(Sno CHAR(8),Cno CHAR(3),Grade int check(grade=0 and grade=100),Primary key(Sno,Cno);,表级约束,例4参照完整性约束与check约束。CREATE TABLE SC(Sno CHAR(8)FOREIGN KEY REFERENCES student(sno),Cno CHAR(3)FOREIGN KEY REFERENCES course(cno),Grade int check(grade=0 and grade=100),primary
10、 key(Sno,Cno);,3.2.3 修改基本表,ALTER TABLE ADD 完整性约束 DROP MODIFY;:要修改的基本表 ADD子句:增加新列和新的完整性约束条件 DROP子句:删除指定的完整性约束条件 MODIFY子句:用于修改列名和数据类型注:标准SQL无删除列的语句。,1、添加新列命令:ALTER TABLE ADD 列名 数据类型;例向Student表增加“入学时间”列,其数据类型为日期型。ALTER TABLE Student ADD Scome DATETIME;不论基本表中原来是否已有数据,新增加的列一律为空值。2、删除指定的完整性约束条件的命令:ALTER T
11、ABLE DROP 完整性约束名;例删除学生表中姓名列必须取唯一值的约束。ALTER TABLE Student DROP UNIQUE(Sname);,注:-SQL中删除约束命令:ALTER TABLE DROP CONSTRAINT 约束名;例7将Student表中的删除主键约束删除。ALTER TABLE STUDENT DROP CONSTRAINTPK_student_21B6055D 注:在创建时若未给所设置的约束取名,系统将自动取名字。查看约束信息)可以用存储过程:sp_help 数据表名)可以在sysobjects中查到。,如:IF EXISTS(SELECT*FROM sys
12、objectsWHERE NAME=PK_student_21B6055D),、修改列命令:ALTER TABLE MODIFY 列名 数据类型;例将年龄的数据类型改为占2字节整数。ALTER TABLE Student MODIFY Sage SMALLINT;注:修改原有的列定义有可能会破坏已有数据。T-SQL:ALTER TABLE Student alter column Sage SMALLINT;、-SQL中删除列命令:ALTER TABLE DROP COLUMN 列名;例将Student表中新增加的“入学时间”列删除。ALTER TABLE Student DROP COLUM
13、N Scome;注:在删除列时,必须先删除该列的索引和约束后,才能删除该列。,back,3.2.4 数据表的删除,DROP TABLE;基本表删除 数据、表上的索引都删除 表上的视图往往仍然保留,但无法引用。删除基本表时,系统会从数据字典中删去有关该基本表及其索引的描述。例10 删除Student表 DROP TABLEStudent;,须使用的基本操纵、查询语句:1、查看表数据:(1)使用企业管理器(2)SQL语句格式简单格式:Select*/属性列组 from 数据表名2、向数据表中插入数据()使用企业管理插入数据(2)SQL语句格式INSERT INTO(,)VALUES(,);,例1、
14、向学生基本情况表(student)中插入一条记录(学号:95020;姓名:陈林;性别:女;所在系:MA;年龄:19岁)。INSERT INTO student VALUES(95020,陈林,女,19,MA);,3、删除数据(1)使用企业管理器:(2)SQL删除语句;DELETE FROM WHERE;例1、删除学号为95010的学生记录。DELETE FROM student WHERE sno=95010;,4、修改数据(1)使用企业管理器(2)修改数据SQL语句UPDATE SET=,=WHERE;例1、将课程表(course)中所有课程的学时(credit)减少5学时。UPDATE c
15、ourse SET credit=credit-5;,SQL SERVER中建立数据表、数据完整性约束补充之一:,、企业管理器创建数据表、数据完整性约束方法(演示)创建数据表数据完整性约束、语句)用select into以复制创建数据表格式:Select*/属性列组 into 新数据表名 from 数据表名如复制表结构:Select*into stu from student where 2=1,SQLSERVER课后阅读,如复制表的结构和内容:Select*into stu from student 思考:如何实现不同数据库间数据表的复制?如何实现不同数据服务器间数据表的复制?提示:服务器实
16、例名.数据库名.拥有者.数据表名)创建数据表时自定义约束名例():主键约束create table course(cno char(3)constraint pk_course primary key,cname varchar(10),credit_hour tinyint),例():check约束如:要求课程表中学分(credit_hour)限制在(,范围内。create table course(cno char(3)constraint pk_course primary key,cname varchar(10),credit_hour tinyint constraint ch_c
17、ourse check(credit_hour0 and credit_hour=5),例():外键约束CREATE TABLE SC(Sno CHAR(5)CONSTRAIT FK_SNO FOREIGN KEY REFERENCES student(sno),Cno CHAR(3)CONSTRAIT FK_CNO FOREIGN KEY REFERENCES course(cno),Grade int check(grade=0 and grade=100),Primary key(Sno,Cno);,表是包含数据库中所有数据的数据库对象,用来存储各种各样的信息。在SQL Server 2
18、000中,一个数据库中最多可以创建200万个表,用户创建数据库表时,最多可以定义1024列。在同一数据库的不同表中,可以有相同的字段,但在同一个表中不允许有相同的字段。,小知识:,3)对计算列使用表达式例()下例显示如何使用表达式(low+high)/2)计算 myavg 计算列。(假设low:最低分、high:最高分、myavg:平均分)CREATE TABLE mytable(low int,high int,myavg AS(low+high)/2),例()对计算列使用系统函数下例在 myuser_name 列中使用系统函数 USER_NAME 函数。CREATE TABLE mylog
19、intable(date_in datetime,user_id int,myuser_name AS USER_NAME()思考:可以用自定义函数吗?可以!,4)创建临时表(1)局部临时表例:Create table#productTemp(productID int primary key,productname char(10)(2)全局临时表例:Create table#tempWork(pk int,coll int),5)在列中使用 uniqueidentifier 数据类型 下例创建含有 uniqueidentifier 列的表。该表使用 PRIMARY KEY 约束以确保用户不
20、会在表中插入重复的值,并在DEFAULT 约束中使用 NEWID()函数为新行提供值。CREATE TABLE Globally_Unique_Data(guid uniqueidentifier CONSTRAINT Guid_Default DEFAULT NEWID(),Employee_Name varchar(60),CONSTRAINT Guid_PK PRIMARY KEY(Guid),6)修改数据库添加一个或多个属性列,ALTER TABLE 表名 ADD 列名 数据类型(长度)null|not null实例:修改数据库abab中表a,添加两个属性列cc、dd,使cc为整型,且
21、不为空,取默认值为5,dd类型为字符型,最多占20字节。use abab alter table a add cc int not null default 5,dd char(20),7)修改字段的属性ALTER TABLE 表名 ALTER COLUMN 列名 数据类型(长度)约束注:将一个原来允许为空的列改为不允许为空时,必须满足列中没有存放空值的记录,以及在该列上没有创建索引。,8)删除字段(列)(T-SQL),ALTER TABLE 表名 DROP COLUMN 列名实例:例1例2 删除表a中的cc属性列。alter table a drop column cc注:须先删除属性列上的
22、约束,再删除该列。,查询数据表信息。sp_help a,9)修改表名,调用存储过程:Sp_rename 原表名,新表名 实例:将学生信息库student中studentx表更名为student。Use studentsp_rename studentx,student注:修改会影响调用该表的存储过程、触发器、视图等,使它们无效。,待续!,3.2.索引的建立与删除索引是对数据库表中一个或多个列的值进行排序的结构。1、建立索引语句CREATE UNIQUE CLUSTERED INDEX 索引名 ON 基本表名(列名次序,列名次序);说明:索引可以建立在一列和多列之上,索引顺序可以是ASC(升序)
23、或DESC(降序),缺省值是升序。UNIQUE表示每一个索引值对应唯一的数据记录。CLUSTERED表示要建立的索引是聚簇索引。,a、唯一值索引对于已含重复值的属性列不能建UNIQUE索引。对某个列建立UNIQUE索引后,插入新记录时DBMS会自动检查新记录在该列上是否取了重复值。这相当于增加了一个UNIQUE约束。例1 为学生-课程数据库中的Student,Course,SC三个表建立索引。其中Student表按学号升序建索引,Course表按课程号升序建唯一索引,SC表按学号升序和课程号降序建唯一索引。CREATE INDEX Stusno ON Student(Sno);CREATE U
24、NIQUE INDEX Coucno ON Course(Cno ASC);CREATE UNIQUE INDEX SCno ON SC(Sno,Cno DESC);,b、聚簇索引聚簇索引是指索引项顺序与表中记录的物理顺序一致。在一个基本表上最多只能建立一个聚簇索引。聚簇索引用途:对于某些类型的查询,可以提高查询效率。聚簇索引的适用范围:()很少对基表进行增删操作。()很少对其中的变长列进行修改操作。()该列为最常查询列。,例3在Student表的Sname(姓名)列上建立一个聚簇索引,而且Student表中的记录将按照Sname值的升序存放。CREATE CLUSTERED INDEX St
25、usname ON Student(Sname);例4在学生基本情况表jbqk之上建立一个关于学生表的索引文件。索引文件名为“学生索引”,索引建立在学号之上,按学号降序排序。Create index 学生索引 on jbqk(sno desc);,2删除索引语句DROP INDEX.;注意:该命令不能删除由CREATE TABLE或者ALTER TABLE命令创建的主键和唯一性约束索引,也不能删除系统表中的索引。删除索引时,系统会从数据字典中删去有关该索引的描述。例12删除例5创建的索引“学生索引”。程序如下:DROP INDEX JBQK.学生索引例13 删除Student表的Stusnam
26、e索引。DROP INDEX Student.Stusname;,返回,3.3 数据查询语言,3.3.1 查询语句格式SQL语言的查询语句一般格式是:SELECT ALL|DISTINCT,FROM,WHERE GROUP BY HAVING,ORDER BY ASC|DESC,;,下面对该命令进行一些说明:SELECT子句:指定显示的属性列,选出元组中的属性值形成结果表。FROM子句:指定查询对象(基本表或视图)。WHERE子句:指定查询条件,筛选出满足条件的元组。GROUP BY子句:对查询结果按指定列(列1)的按值分组,该属性列值相等的元组为一个组。通常会在每组中作用集函数。HAVING
27、短语:筛选出分组中满足指定条件的元组,和GROUP BY子句一起用。ORDER BY子句:对查询结果表按指定列(列2)值的升序或降序排序。,注、目标列表达式几种表示:列表达式可以是“列名1,列名2”的形式;如果FROM子句指定了多个表,则列名应是“表名.列名”的形式。也可以是全部列,指定为*。列表达式可以使用函数形成表达式DISTINCT参数:表示在结果集中,查询出的内容相同的记录只留下一条。,示例数据库,学生-课程数据库学生表:Student(Sno,Sname,Ssex,birthday,Sdept)课程表:Course(Cno,Cname,Cpno,Ccredit)学生选课表:SC(Sn
28、o,Cno,Grade),back,3.3.2 单表查询单表查询是指仅涉及一个表的查询。一、选择表中的若干列(1)查询指定列,例1 查询全体学生的学号与姓名、性别。SELECT Sno,Sname,SsexFROM Student;例2 查询全体学生的学号、姓名、所在系。SELECT Sno,Sname,SdeptFROM Student;,(2)、查询全部列例3 查询全体学生的详细记录。SELECT Sno,Sname,Ssex,birthday,Sdept FROM Student;或SELECT*FROM Student;,(3)、查询经过计算的值 SELECT子句的不仅可以是表中的属性
29、列,也可以是表达式。(如算术表达式、字符串常量、函数、列别名等),例4 查全体学生的姓名及其出生年份。SELECT Sname,year(birthday)FROM Student;输出结果:Sname 2004-Sage-李勇 1976 刘晨 1977 王名 1978 张立 1978,思考:如何通过出生年月信息求出年龄?,例5 查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名。SELECT Sname,Year of Birth:,year(birthday),ISLOWER(Sdept)FROM Student;,输出结果:Sname Year of Birth:year(
30、birthday)ISLOWER(Sdept)-李勇 Year of Birth:1980 cs 刘晨 Year of Birth:1981 is 王名 Year of Birth:1982 ma 张立 Year of Birth:1981 is,例 使用列别名改变查询结果的列标题,SELECT Sname NAME,Year of Birth:BIRTH,BirthYear=year(birthday),ISLOWER(Sdept)as DEPARTMENT FROM Student;输出结果:NAME BIRTH BirthYear DEPARTMENT-李勇 Year of Birth:
31、1980 cs 刘晨 Year of Birth:1981 is 王名 Year of Birth:1982 ma 张立 Year of Birth:1981 is,用:空格或AS,二、选择表中的若干元组,消除取值重复的行在SELECT子句中使用DISTINCT短语。假设SC表中有下列数据 Sno Cno Grade-95001 1 92 95001 2 85 95001 3 88 95002 2 90 95002 3 80,例7 查询选修了课程的学生学号。(1)SELECT Sno FROM SC;或(默认 ALL)SELECT ALL Sno FROM SC;结果:Sno-95001 95
32、001 95001 95002 95002,(2)SELECT DISTINCT Sno FROM SC;结果:Sno-95001 95002,注意:DISTINCT短语的作用范围是所有目标列。,查询满足条件的元组WHERE子句常用的查询条件:,(1)比较大小,在WHERE子句的中使用比较运算符=,=,!,!=30;,或Select Sname,SageFrom StudentWhere Sage!=30,(2)确定范围,使用谓词:BETWEEN AND NOT BETWEEN AND 例1查询年龄在2029岁(包括20岁和29岁)之间的学生的姓名、年龄和所在系SELECT Sname,yea
33、r(getdate()-year(birthday),SdeptFROM StudentWHERE year(getdate()-year(birthday)BETWEEN 20 AND 29;,例1 查询年龄不在2029岁之间的学生姓名、年龄和系别。SELECT Sname,year(getdate()-year(birthday),SdeptFROM StudentWHERE year(getdate()-year(birthday)NOT BETWEEN 20 AND 29;,(3)确定集合,使用谓词 IN,NOT IN:用逗号分隔的一组取值例1查询信息系(IS)、数学系(MA)和计算机
34、科学系(CS)学生的学号、姓名和性别。SELECT Sno,Sname,SsexFROM StudentWHERE Sdept IN(IS,MA,CS);,例1查询既不是信息系、数学系,也不是计算 机科学系的学生的学号、姓名和性别。SELECT Sno,Sname,SsexFROM Student WHERE Sdept NOT IN(IS,MA,CS);其它实例:、查询考试成绩不及格学生的学号。、查询学分在24之间的课程名称和学分。,case,(4)字符串匹配,NOT LIKE ESCAPE:指定匹配模板 匹配模板:固定字符串或含通配符的字符串 当匹配模板为固定字符串时:可以用=运算符取代
35、LIKE 谓词 用!=或 运算符取代 NOT LIKE 谓词,通配符,%(百分号)代表任意长度(长度可以为0)的字符串。例:a%b表示以a开头,以b结尾的任意长度的字符串。如acb,addgb,ab 等都满足该匹配串。_(下横线)代表任意单个字符。例:a_b表示以a开头,以b结尾的长度为3的任意字符串。如acb,afb等都满足该匹配串。,case,ESCAPE 短语:,当查询的字符串本身就含有%或 _ 时,需用ESCAPE 短语对通配符进行转义。LIKE DB_Design ESCAPE ESCAPE 短语表示为换码字符,这样匹配串中紧跟在后面的字符_不再具有通配符的含义,转义为普通的_字符。
36、,例题:,1)匹配模板为固定字符串 例1 查询学号为95001的学生的详细情况。SELECT*FROM Student WHERE Sno LIKE 95001;等价于:SELECT*FROM Student WHERE Sno=95001;,case,2)匹配模板为含通配符的字符串例1 查询所有姓刘学生的姓名、学号和性别。SELECT Sname,Sno,SsexFROM StudentWHERE Sname LIKE 刘%;例1 查询姓“欧阳”且全名为三个汉字的学生的姓名和性别。SELECT Sname,Ssex FROM Student WHERE Sname LIKE 欧阳_ _;,c
37、ase,例18 查询名字中第2个字为“阳”字的学生的学号、姓名。SELECT Sno,Sname FROM Student WHERE Sname LIKE _ _阳%;例19查询所有不姓刘的学生学号、姓名、性别。SELECT Sno,Sname,Ssex FROM Student WHERE Sname NOT LIKE 刘%;,case,3)使用换码字符将通配符转义为普通字符 例20查询DB_sql课程的课程号和学分。SELECT Cno,Ccredit FROM Course WHERE Cname LIKE DB_sqlESCAPE 例21 查询以DB_开头,且倒数第3个字符为 i的课
38、程的详细情况。SELECT*FROM Course WHERE Cname LIKE DB_%i_ _ ESCAPE;,case,(5)涉及空值的查询,使用谓词 IS NULL 或 IS NOT NULL“IS NULL”不能用“=NULL”代替例22 某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。(该列允许为空,不是零值,即无成绩)SELECT Sno,CnoFROM SCWHERE Grade IS NULL;,case,case,例22 查所有有成绩的学生学号和课程号。SELECT Sno,Cno FROM SC WHERE Gr
39、ade IS NOT NULL;,(6)多重条件查询,用逻辑运算符AND和 OR来联结多个查询条件 AND的优先级高于OR 可以用括号改变优先级可用来实现多种其他谓词 NOT IN NOT BETWEEN AND,case,例24查询计算机系年龄在20岁以下的学生姓名。SELECT Sname FROM Student WHERE Sdept=CS AND year(getdate()-year(birthday)20;,原例12查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。SELECT Sname,SsexFROM StudentWHERE Sdept IN(IS
40、,MA,CS)可改写为:SELECT Sname,SsexFROM StudentWHERE Sdept=IS OR Sdept=MA OR Sdept=CS;,case,思考:?原例10 查询年龄在2029岁(包括20岁和29岁)之间的学生的姓名、系别和年龄。,case,(7)T-SQL:Top子句(选择)Top n子句:在查询结果中输出前面的n条记录;Top n percent子句,则在查询结果中输出前面占结果记录总数的n%条记录。注:top 子句不能和Distinct关键字同时使用。1)显示student表中,最前面的两条记录:select top 2*from student 2)显示
41、student表中,占总数10%条记录:select top 10 percent*from student,三、对查询结果排序,使用ORDER BY子句 可以按一个或多个属性列排序 升序:ASC;降序:DESC;缺省值为升序当排序列含空值时ASC:排序列为空值的元组最后显示DESC:排序列为空值的元组最先显示,例2 查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。SELECT Sno,Grade FROM SC WHERE Cno=3 ORDER BY Grade DESC;,case,SQLserver中执行后:Sno Grade-95007 92 95003 82 950
42、10 82 95009 75 95014 61 95002 55 95010 95024,例26查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按姓名降序排列。SELECT*FROM Student ORDER BY Sdept,Sname DESC;,case,查询中集函数(又称为聚合函数)的使用说明:DISTINCT:取消列中的重复值ALL:为默认状态,表示不取消重复值。,例27 查询学生总人数。SELECT COUNT(*)FROM Student;例28 查询选修了课程的学生人数。SELECT COUNT(DISTINCT Sno)FROM SC;注:用DISTINCT
43、以避免重复计算学生人数。,例29计算1号课程的学生平均成绩。SELECT AVG(Grade)FROM SC WHERE Cno=1;例30查询选修1号课程的学生最高分数。SELECT MAX(Grade)FROM SC WHER Cno=1;,四、对查询结果分组,使用GROUP BY子句分组 细化集函数的作用对象:未对查询结果分组,集函数将作用于整个查询结果。对查询结果分组后,集函数将分别作用于每个组。,例31 求各个课程号及相应的选课人数。SELECT Cno,COUNT(Sno)FROM SC GROUP BY Cno;结果Cno COUNT(Sno)1 22 2 34 3 44 4 3
44、3 5 48,GROUP BY子句的作用对象是查询的中间结果表分组方法:按指定的一列或多列值分组,值相等的为一组使用GROUP BY子句后,SELECT子句的列名列表中只能出现分组属性和集函数,例32按学号查询选修了课程的学生的总平均成绩和总成绩。SELECT Sno,avg(grade),sum(grade)FROM SCGROUP BY Sno,使用HAVING短语筛选最终输出结果,例33查询选修了3门以上课程的学生学号。SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*)3;例34查询有3门以上课程是90分以上的学生的学号及(90分以上的)课程数
45、。SELECT Sno,COUNT(*)FROM SC WHERE Grade90 GROUP BY Sno HAVING COUNT(*)3;,只有满足HAVING短语指定条件的组才输出 HAVING短语与WHERE子句的区别:(1)作用对象不同WHERE子句作用于基表或视图,从中选择满足条件的元组。HAVING短语作用于组,从中选择满足条件的组。()集函数的使用WHERE子句的条件表达式中不能有集函数。HAVING短语的条件中可以使用集函数。,当WHERE子句、GROUP BY子句、HAVING子句和集函数同时出现在一个查询中时,SELECT命令的执行顺序如下:执行WHERE子句,从表中选
46、取行。由GROUP BY对选取的行进行分组。执行集函数。执行HAVING子句选取满足条件的分组。,8、查询结果的分组与排序例4:查询选修了2门以上课程的学生学号,并且查询结果按照学号升序排列。SELECT Sno FROM SCGROUP BY Sno HAVING COUNT(*)2ORDER BY Sno ASC;思考:order by 的作用范围?应是对order by 之前语句所查询到的结果集的排序。,该语句一定放置在最后!,9、T-SQL:computer子句:能获得统计数据及相应统计的明细数据。注:使用compute by子句时必须使用order by对compute by中的列进
47、行排序。Compute子句中的集函数中的列一定要出现在select子句的选择列表中。语法格式:COMPUTE AVG|COUNT|MAX|MIN|STDEV|STDEVP|VAR|VARP|SUM(expression),.n BY expression,.n,Compute 集合函数(列名)与compute 集合函数 by 列名 的区别:Compute 集合函数(列名):获得该列的统计值,及该列的详细信息(未分组)。例:select sno,gradefrom sccompute avg(grade),Compute 集合函数(列名)by 列名:获得该列的统计值,及该列的详细分组信息。如:select sno,gradefrom scorder by sno-须先按分类的字段排序compute avg(grade)by sno,待续!,