数据库应用第5章-1_结构化查询语言SQL_V08_2
- 格式:pdf
- 大小:777.63 KB
- 文档页数:74
第5章关系数据库的结构化查询语言SQL本章介绍关系数据库标准语言SQL。
主要内容包括:数据定义、数据操纵、数据控制和数据约束等。
(1)SQL数据库的体系结构,SQL的组成。
(2)SQL的数据定义:SQL模式、基本表和索引的创建和撤销。
(3)SQL的数据查询:SELECT语句的句法,SELECT语句的几种形式及各种限定,基本表的联接操作。
(4)SQL的数据更新:插入、删除和修改语句。
(5)视图的创建和撤消,对视图更新操作的限制。
(6)嵌入式SQL:预处理方式,使用规定,使用技术,卷游标,动态SQL语句。
5.1 SQL概述1)SQL的发展历程SQL语言1974年由Boyce和Chamberlin提出,并首先在IBM公司研制的关系数据库系统System R上实现。
1986年10月,经美国国家标准局(ANSI)的数据库委员会批准了SQL作为关系数据库语言的美国标准,并公布了标准SQL文本。
1987年6月国际标准化组织(ISO)将其采纳为国际标准,称为“SQL86”。
相继出现了“SQL89”、“SQL2(SQL92)”、“SQL3”。
SQL已成为关系数据库领域中的一个主流语言:首先,各个数据库产品厂家纷纷推出了自己的支持SQL的软件或与SQL 接口的软件。
其次,SQL在数据库以外的其他领域也受到了重视。
不少软件产品将SQL的数据检索功能与面向对象技术、图形技术、软件工程工具、软件开发工具、人工智能语言等相结合,开发出功能更强的软件产品。
2)SQL 数据库的体系结构SQL 数据库的体系结构的特征:一个SQL 模式是表和约束的集合。
一个表(TABLE )是行的集合。
每行是列的序列,每列对应一个数据项。
一个表可以是一个基本表,也可以是一个视图。
一个基本表可以跨一个或多个存储文件,一个存储文件也可存储一个或多个基本表。
用户可以用SQL 语句对视图和基本表进行查询等操作。
SQL 用户可以是应用程序,也可以是终端用户。
第5章结构化查询语言结构化查询语言(SQL,Structured Query Language)是一种用于管理关系型数据库的标准化语言,也是数据库操作的基础。
SQL可以实现数据库的创建、查询、插入、更新和删除等操作,可以对数据库中的表、视图等进行管理和操作。
SQL语言包括数据定义语言(DDL)、数据操纵语言(DML)、数据查询语言(DQL)和事务控制语言(TCL)等几个方面。
数据定义语言(DDL)用于定义、修改和删除数据库对象,包括创建数据库(CREATEDATABASE)、创建表(CREATETABLE)、修改表结构(ALTERTABLE)和删除表(DROPTABLE)等。
数据操纵语言(DML)用于对数据库中的数据进行操作,包括插入数据(INSERT)、更新数据(UPDATE)和删除数据(DELETE)等。
数据查询语言(DQL)用于从数据库中查询数据,SQL语句的核心部分,可以实现复杂的数据查询和数据过滤。
常见的查询语句包括SELECT、FROM、WHERE、GROUPBY、HAVING、ORDERBY等。
事务控制语言(TCL)用于控制数据库中的事务,包括BEGINTRANSACTION、COMMIT、ROLLBACK等。
通过TCL语句可以确保数据库的操作具有原子性、一致性、隔离性和持久性(ACID特性)。
SQL语言的特点有以下几个方面:1.简单易学:SQL语言的语法相对简单,易于学习和使用。
2.高效可靠:SQL语言是标准化的数据库操作语言,可以高效地对数据库进行管理和操作。
3.跨平台性:SQL语言是一种通用的数据库操作语言,可以在不同的平台和数据库系统上使用。
4.强大灵活:SQL语言可以实现复杂的数据查询和处理,支持多表联合查询、条件查询、分组统计等功能。
SQL语言在现代数据库管理系统中得到了广泛的应用,是数据库开发和管理中非常重要的一部分。
掌握SQL语言可以更好地进行数据库设计、数据管理和数据分析等工作。
第5章SQL结构化查询语言SQL(Structured Query Language)是一种用于管理和操作关系型数据库的语言。
它是一种标准化的查询语言,用于从数据库中检索和操作数据。
本章将介绍SQL的基本语法和常用命令,以及如何使用它进行数据查询、插入、更新和删除。
1.SQL语法SQL语法由关键字、函数、操作符和参数组成。
SQL语句通常以分号结尾,并且可以写在一行或多行中。
常见的SQL语句包括:- SELECT语句:用于从数据库中检索数据。
例如:SELECT * FROM table_name;- INSERT语句:用于向数据库中插入新的数据。
例如:INSERT INTO table_name (column1, column2) VALUES (value1, value2);- UPDATE语句:用于更新数据库中的数据。
例如:UPDATEtable_name SET column_name = new_value WHERE condition;- DELETE语句:用于从数据库中删除数据。
例如:DELETE FROM table_name WHERE condition;2.数据查询使用SELECT语句可以从数据库中检索数据。
可以使用通配符*检索所有列,或者指定要检索的列名。
例如,SELECT * FROM customers; 将检索customers表中的所有数据。
可以使用WHERE子句来添加过滤条件,例如:SELECT * FROM customers WHERE age > 18; 将检索年龄大于18的顾客数据。
3.数据插入使用INSERT语句可以向数据库中插入新的数据。
插入数据需要指定插入的表名和要插入的数据的列和值。
例如,INSERT INTO customers (name, age) VALUES ('John', 25); 将向customers表中插入一条名为John,年龄为25的新数据。
第5章-SQL结构化查询语言第5章 SQL结构化查询语言5.1 SQL语言简介SQL(Structured Query Language 结构化查询语言)语言的核心是数据查询,在标准化过程中不断成为通用的数据库语言。
(1)高度集成化: SQL语言在数据定义、数据操纵、数据查询和数据控制方面都有规范的格式。
可以独立完成数据库管理的各项工作。
(2)非过程化语言:它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,只需告诉要做什么,系统就可以自动完成。
(3)集合操作:SQL语言的的操作对象和操作结果都是记录集合,这种集合特性允许一条SQL 语句的输出作为另一条SQL语句的输入,SQL语句可以嵌套。
(4)简单易学:SQL语言语句不多,语言接近英语自然语言。
在多数情况下,在其他语言中需要一大段程序实现的功能只需要一个SQL语句就可以达到目的。
(5)用法灵活:SQL语言可以在数据库管理中直接应用,可以嵌入其它高级程序设计语言中,完成对数据库的操作。
SQL语言包含4个部分:数据定义语句(DDL):CREATE(创建)、DROP(撤掉)、ALTER(更改)。
数据操作语句(DML):INSERT(插入)、UPDATE(更新)、DELETE(删除)。
数据查询语句(DQL):SELECT(选择)。
数据控制语句(DCL):GRANT(授予)、REVOKE(吊销)、COMMIT(提交)、ROLLBACK(回滚)。
本章主要讲ACCESS 2003中所支持的SQL语句。
●使用SQL语句的步骤如下:●打开数据库窗口,进入查询设计器。
●关闭显示表窗口,执行菜单“查询|SQL特定查询|数据定义”命令。
●在打开的查询设计编辑窗口中,输入SQL语句。
●单击工具栏上的执行按钮,可以直接执行查询。
保存查询,单击工具栏上的保存按钮,在弹出的对话框中命名查询。
5.2 SQL数据查询语句完整的SQL查询语句常用的语法格式如下:SELECT [ALL|DISTINCT|TOP<n>]< * | 表名.* | [表名.]字段1 [AS 列标题1] [, [表名.]字段2 [AS 列标题2] [, …]]> [INTO <新表名>]FROM <表列或者表之间的联接关系>[WHERE <查询条件> ][GROUP BY <分组项> ] [HAVING <分组筛选条件> ][ORDER BY <排序项>[ASC|DESC] [,…]]其中:(1)语句中的符号“[]”表示可选项,“|”表示在多项选一,“<>”表示必选项。
第5章 结构化查询语言SQL数据库系统应用Data Base System Application张建国哈工大计算机科学与技术学院2008-10-7哈工大计算机学院 张建国 Slide 5-1第5章 结构化查询语言SQL2008-10-72第5章 结构化查询语言SQL本章主要内容SQL概述 基本表的定义、修改与删除 SQL的数据更新 数据记录的插入 数据记录的修改 数据记录的删除 SQL的数据查询 索引的建立与删除 T-SQL语言2008-10-7哈工大计算机学院 张建国Slide 5-3第5章 结构化查询语言SQL5.1 SQL概述1. SQL的发展 SQL(Structured Query Language)意为结构化查询语言. 1974年由Boyce和Chamberlin提出来. 最初在System R关系数据库中实现.该语言功能丰富、语言简捷、使用灵活方便、深受各界欢迎.1986年成为美国国家标准. 1987年成为国际标准SQL86. 1989年,ISO颁布了增强完整性特征的SQL89标准. 1993年,ISO对SQL89标准进行了大量的修改和扩充,推出 SQL2(SQL92).2008-10-7哈工大计算机学院 张建国 Slide 5-4第5章 结构化查询语言SQL5.1 SQL概述(Cont.)SQL是一种通用的、功能极强的关系数据库语言. 各数据库厂家纷纷推出各自支持SQL的软件或与SQL 接 口软件,使自己的数据库可以运行SQL. 许多其他软件(例如图形处理、人工智能、软件工程工具 、软件开发工具等)也利用SQL语言的数据查询功能,作为 自身的一部分,使其数据查询功能更强大. 许多程序设计语言中也都引入了SQL.2008-10-7哈工大计算机学院 张建国Slide 5-5第5章 结构化查询语言SQL5.1 SQL概述(Cont.)2. SQL的特点 (1) 一体化 非关系模型的数据语言 模式数据定义语言:Schema DDL 外模式(子模式)数据定义语言:SubSchema DDL 存储模式数据定义语言: DSDL(Data Storage Definition Language) 数据操纵语言:DML SQL语言 SQL将数据定义语言DDL、数据操纵语言DML和数据控 制语言DCL集成在一起,各种语言风格统一.2008-10-7哈工大计算机学院 张建国 Slide 5-6第5章 结构化查询语言SQL5.1 SQL概述(Cont.)(2) 高度非过程化 非关系语言 通过存取路径存取数据. SQL语言 SQL是一种面向问题的语言,只需提出“做什么”,不必指出“ 怎么做”.存取路径的选择和SQL的操作过程是由系统自动 完成的. (3) 面向集合的操作方式 非关系语言 一次一个记录 SQL 采用集合操作,操作对象和操作结果都是元组的集合.2008-10-7哈工大计算机学院 张建国 Slide 5-7第5章 结构化查询语言SQL5.1 SQL概述(Cont.)(4) 两种使用方式、统一的语法结构 SQL既是自含式语言,又是嵌入式语言. 自含式语言 能独立地在联机方式下使用(命令方式),用户可以在终端键 盘上直接输入SQL命令对DB进行操作. 嵌入式语言 嵌入到高级语言(VB、PB、Java等)程序中,利用主语言(高 级语言)进行计算处理、利用DB语言进行数据管理. 同一条命令在两种操作方式中的语法结构基本一致.2008-10-7哈工大计算机学院 张建国Slide 5-8第5章 结构化查询语言SQL5.1 SQL概述(Cont.)(5) 语言简捷、易学易用 SQL具有很强的功能,但由于其设计巧妙,使得语言十分简捷. 完成其核心功能只用9个动词:数据查询:SELECT(查询) 数据定义:CREATE(创建表、索引、视图) DROP(删除表、索引、视图) ALTER(修改表) 数据操纵:INSERT(插入) DELETE(删除) UPDATE(修改) 数据控制:GRANT(授权) REVOKE(收回授权)2008-10-7哈工大计算机学院 张建国 Slide 5-9第5章 结构化查询语言SQL5.1 SQL概述(Cont.)3. SQL支持三级模式结构 外模式 外模式对应于视图View和部分基本表Base Table 用户可以用SQL语言对基本表和视图进行操作 从用户的观点看基本表和视图是一样的 模式 模式对应于基本表 基本表是独立存在的表 每个基本表对应一个关系2008-10-7哈工大计算机学院 张建国Slide 5-105.1 SQL概述(Cont.)内模式内模式对应于存储文件存储文件是在计算机存储介质中存放的文件形式一个或若干个基本表对应一个存储文件视图视图是从一个或几个基本表或其他视图导出的表视图并不存放实际的数据,仅保存视图的定义使用视图时,根据视图定义,从基本表中取数据因此,视图实际上是一个虚表5.1 SQL 概述(Cont.)SQL 用户2视图3视图2视图1基本表3基本表2基本表1存储文件3存储文件2存储文件1基本表4外模式模式内模式SQL 用户1SQL 用户35.2 基本表的定义、修改与删除1. 基本表的定义格式:CREATE TABLE 表名(列名1 数据类型1 [列级完整性约束条件1][,列名2 数据类型2 [列级完整性约束条件2]]…[,列名n 数据类型n [列级完整性约束条件n]]);表名:基本表的表名列名:属性名数据类型:属性的数据类型,可参考具体数据库系统的数据类型5.2 基本表的定义、修改与删除列级完整性约束条件:相应属性的完整性约束条件NULL/NOT NULL: 该项是否可以取空值UNIQUE: 该项是否具有唯一性CHECK: 该项的取值范围PRIMARY KEY: 设置主码FOREIGN KEY: 设置外码5.2 基本表的定义、修改与删除(Cont.)例:建立一个”学生”表Student和一个”系”表.Student(Sno,Sname,Birthday,Score,Dno)Dpet(Dno,Dname,Dtel)设:学号Sno:CHAR(10),主码姓名Sname:CHAR(8)性别Sex: CHAR(2),取值范围:”男”或”女”出生日期Birthday:SMALLDATETIME考分Score:SMALLINT,取值范围:500~750系号Dno: CHAR(2),系的主码,学生的外码系名Dname: CHAR(30)系电话Dtel: CHAR(13)5.2 基本表的定义、修改与删除(Cont.) CREATE TABLE Dept(Dno CHAR(2) primary key,Dname CHAR(30),Dtel CHAR(13));CREATE TABLE Student (Sno CHAR(10),Sname CHAR(8),Sex CHAR(2) CHECK (Sex=‘男’or Sex=‘女’),Birthday SMALLDATETIME,Score SMALLINT CHECK(Score>=500 and Score<=750, Dno CHAR(2),PRIMARY KEY(Sno),FOREIGN KEY (Dno) REFERENCES Dept(Dno) );5.2 基本表的定义、修改与删除(Cont.)2. 修改基本表格式:ALTER TABLE 表名[ADD 列名数据类型[完整性约束条件]]| [DROP COLUMN 列名]| [ALTER COLUMN 列名数据类型];其中:ADD子句:增加新列及其完整性约束DROP子句:删除指定的列ALTER子句:修改列的定义,包括列名和数据类型5.2 基本表的定义、修改与删除(Cont.)例:在Student表中加入一列性别”民族”,6位字符.ALTER TABLE Student ADD Nation CHAR(6);例:将”民族”的数据类型改为bit.ALTER TABLE Student ALTER COLUMN NationCHAR(8);例:删除”民族”.ALTER TABLE Student DROP COLUMN Nation;5.2 基本表的定义、修改与删除(Cont.)3. 删除基本表格式:DROP TABLE 表名删除基本表时,该表的数据以及在此表上建立的视图及索引全部删除,因此执行删除操作时应特别小心.例:删除基本表Student.DROP TABLE Student;数据库实例设学生-课程数据库中包含三个表:Student(Sno ,Sname,Sex,Birthday,Score,Dname)SC(Sno,Cno ,Grade)Course(Cno ,Cname,CPno,Credit)其中:Sno: CHAR(10); Sname: CHAR(8); Sex: CHAR(2); Birthday: SMALLDATETIME; Score: INT; Dname: CHAR(30)Grade: SMALLINTCno: CHAR(6); Cname: CHAR(30); CPno: CHAR(6);credit: TINYINT学生课程选课分数m n5.3 SQL的数据更新插入数据插入单个元组插入子查询的结果数据修改修改一个元组的数据修改多个元组的数据根据查询结果修改删除数据删除一个元组删除多个元组删除子查询的结果5.3 SQL的数据更新(Cont.)1. 插入数据(1) 插入单个元组格式:INSERT INTO 表名[(列名1[,列名2>,…)]VALUES (常量1[,常量2],…);例:将一个新学生元组的全部属性插入到Student中.•INSERT INTO Student•VALUES('6053610301','李兰','女','1989-3-5',658,'实验学院');5.3 SQL的数据更新(Cont.)例:将一个新学生元组的部分属性插入到Student中. INSERT INTO Student(Sno,Sname,Dname)VALUES('1030310105','王芳','计算机系');未列出的属性列取空值.(2) 插入子查询结果INSERTINTO 表名([列名1[,列名2,……)]子查询;5.3 SQL的数据更新(Cont.)例:建立一个学生平均成绩表SG,包括学号Sno和平均成绩Gavg CREATE TABLE SG(Sno CHAR(10) NOT NULL UNIQUE, Gavg SMALLINT);INSERTINTO SG(Sno,Gavg)SELECT Sno, AVG(Grade)FROM SCGROUP BY Sno;(3) 插入应注意的问题对于表Student和SC若在SC中插入的记录的Sno在Student不存在,则系统不允许插入.5.3 SQL的数据更新(Cont.)2. 修改数据格式:UPDATE 表名SET 列名1=表达式1[,列名2=表达式2]……[WHERE 条件];对满足条件的元组中的指定列用相应的表达式的值修改.(1) 修改一个元组的值例:将学生“6053610301”的性别改为“男”.•UPDATE Student•SET Sex='男'•WHERE Sno='6053610301';5.3 SQL的数据更新(Cont.)(2) 修改多个元组的值例:将课号为“101001”的所有成绩提高10%. UPDATE SCSET Grade=Grade*1.1 Where Cno=‘101001’;例:计算每种商品的金额.UPDATE 商品SET 金额=单价*数量;例:将选修课号为“101001”的成绩每人提高10分. UPDATE SCSET Grade=Grade+10WHERE Cno=‘101001’;(3) 带子查询的修改例:将“计算机系”全体学生的成绩清零.UPDATE SCSET Grade=0WHERE ‘计算机系’= (SELECT DnameFROM StudentWHERE Student.Sno=SC.Sno);(4) 修改应注意的问题对于表Student和SC若修改Student中的Sno,而未修改SC中对应记录的Sno.若修改SC中的Sno,而未修改Student中对应的Sno.5.3 SQL的数据更新(Cont.)5.3 SQL的数据更新(Cont.)3. 删除数据格式:DELETEFROM 表名[WHERE 条件];删除满足条件的元组.(1) 删除一个元组例:删除“6053610301"的学生记录.DELETE FROM Student WHERE Sno=‘6053610301’;5.3 SQL的数据更新(Cont.)(2) 删除多个元组例:删除所有学生的选课记录.DELETEFROM SC;(3) 删除子查询的结果例:删除“计算机系”学生的全部选课记录.DELETEFROM SCWHERE ‘计算机系’=(SELECT DnameFROM StudentWHERE Student.Sno=SC.Sno);5.3 SQL的数据更新(Cont.)(4) 删除操作注意保持数据的一致性一个学生的各种数据可能存放在多个表中,但一个删除语句只能对一个表进行删除,这样可能会引起数据不一致问题.例:删除学生“6053610301”在Student表中的记录后,学生的基本数据被删除了.但在SC表中仍存在该学生的选课及成绩记录,若不删除,将会使数据不一致.解决办法:执行两次删除操作,既删除Student表中6053610301的记录,又删除SC表中6053610301的相关记录.为了保证数据的完整性和一致性,许多系统的DBMS都提供了相应的处理机制.当主表的记录被删除后,其参照关系的相关记录自动删除.5.4 SQL的数据查询查询功能是数据库系统的核心.格式:SELECT [ALL|DISTINCT] */目标列表达式[,目标列表达式2…]FROM 表名/视图名[WHERE 条件表达式][GROUP BY 列名1 [HAVING 条件表达式]][ORDER BY 列名2 [ASC/DESC]];5.4 SQL的数据查询(Cont.)其中:SELECT:表示查询ALL:显示所有满足条件的元组DISTINCT:消除重复元组*:所有列目标列表达式:查询结果,可以有函数运算FROM:从哪些表或视图中查询WHERE:查询条件GROUP BY:按指定的列分组,例如,计算每个学生平均成绩时,要按学号分组HAVING:GROUP BY分组的条件ORDER BY:输出时按指定列排序ASC:升序(缺省值)DESC:降序5.4 SQL的数据查询(Cont.)1. 单表查询(1) 查询指定列例:查询全体学生的学号和姓名.SELECT Sno,SnameFROM Student;在表Student对Sno,Sname进行投影相当于:Π(Student)Sno,SnameSnameSno5.4 SQL的数据查询(Cont.)(2) 按用户要求的顺序查询指定列例:查询全体学生的姓名,学号和所在系的系名. SELECT Sname,Sno,DnameFROM Student;查询结果列的顺序可以与表中列的顺序不一致.SnameSno Dname5.4 SQL的数据查询(Cont.)(3) 查询全部列例:查询全体学生的全部数据.方法1SELECT Sno,Sname,Sex,Birthday,Score,DnameFROM Student;方法2SELECT *FROM Student;5.4 SQL的数据查询(Cont.) (4) 查询经过计算的值例:查询全体学生的学号,姓名和出生年份.SELECT Sno,Sname,YEAR(Birthday)FROM Student;计算学生的年龄:SELECT Sno,Sname,YEAR(GETDATE( ))-YEAR(Birthday) FROM Student;计算学生出生的月份:SELECT Sno,Sname,MONTH(Birthday)FROM Student;5.4 SQL的数据查询(Cont.)(5) 消除取值重复的元组例:查询所有课程名称.SELECT DISTINCT CnameFROM Course;例:查询所有系名.SELECT DISTINCT DnameFROM Student;(6) 查询满足条件的元组查询条件可以通过WHERE 子句实现,其常用的条件有:IN, NOT IN 集合LIKE, NOT LIKE 字符匹配IS NULL,IS NOT NULL 空值AND,OR 多重条件BETWEEN AND, NOT BETWEEN AND 范围=, >, <, <=, >=, !=(<>), !<,!>比较谓词条件5.4 SQL 的数据查询(Cont.)5.4 SQL的数据查询(Cont.)1) 比较大小例:查询“计算机”系全体学生的学号和姓名.SELECT Sno,SnameFROM StudentWHERE Dname=‘计算机’;例:查询全体21岁以下学生的学号和姓名.SELECT Sno,SnameFROM StudentWHERE YEAR(GETDATE( ))-YEAR(Birthday)<=21;5.4 SQL的数据查询(Cont.)2) 在一个范围内查询例:查询全体年龄在20至23岁的学生的学号和姓名. SELECT Sno,SnameFROM StudentWHERE YEAR(GETDATE( ))-YEAR(Birthday)BETWEEN20 AND23;例:查询全体年龄不在20至23岁的学生的学号和姓名. SELECT Sno,SnameFROM StudentWHERE YEAR(GETDATE( ))-YEAR(Birthday)NOT BETWEEN20 AND23;5.4 SQL的数据查询(Cont.)3) 条件为一个集合例:查询“计算机”系和“电气工程”系全体学生的全部数据. SELECT *FROM StudentWHERE Dname IN(‘计算机’,’电气工程’);括号中的内容为一个集合,相当于:SELECT *FROM StudentWHERE Dname=‘计算机’OR Dname=’电气工程’;若查询不是上述系的学生,可用条件:WHERE Dname NOT IN(‘计算机’,’电气工程’);5.4 SQL的数据查询(Cont.)4)字符匹配用谓词LIKE表示字符串匹配,形式为:[NOT] LIKE ‘匹配串’[ESCAPE ‘换码字符’]匹配串中:%表示任意长度的字符串;_表示任意单个字符例:查询“本科生05级03系”学生的全部数据.SELECT *FROM StudentWHERE Sno LIKE‘10503%’;若查询除“本科生05级03系”学生的全部数据,则条件可改为:WHERE Sno NOT LIKE’10503%’;若查询全校“03系”学生的全部数据,则条件可改为:WHERE Sno LIKE’_ _ _03%’;5.4 SQL的数据查询(Cont.)例:查询姓名中有“伟”字的学生的全部数据.SELECT *FROM StudentWHERE Sname LIKE‘%伟%’;若查询所有姓“王”的且姓名仅为两个汉字的学生的全部数据WHERE Sname LIKE‘王_’;若查询的字符串中包含%或_,可用转意符ESCAPE‘<转换码>’例:查询名称为“DB_Design”课程的课号和学分.SELECT Cno,creditFROM CourseWHERE Cname LIKE‘DB\_Design’ESCAPE‘\’;其中:\为转换码,表示该字符码后面的‘\’或‘%’不再具有匹配符的意义,而表示该字符本身.5.4 SQL的数据查询(Cont.)5)空值查询例:查询所有选课但未参加考试学生的学号和课号. SELECT Sno,CnoFROM SCWHERE Grade IS NULL;成绩为空值若查询所有有成绩的学生的学号和课号:WHERE Grade IS NOT NULL;6)多重条件查询例:查询“计算机”系年龄在21岁以下的学生的学号和姓名. SELECT Sno,Sname FROM StudentWHERE Dname=‘计算机’AND YEAR(GETDATE())-YEAR(Birthday) <=21;5.4 SQL的数据查询(Cont.)(7) 对查询结果排序用ORDER BY子句,ASC表示升序,DESC表示降序.例:查询选修了“101001”号课程的学生学号和成绩,并按成绩从高到低排序.SELECT Sno,GradeFROM SCWHERE Cno=‘101001’ORDER BY Grade DESC;若先按成绩从高到低排序,成绩相同者按学号从小到大排序.ORDER BY Grade DESC,Sno;5.4 SQL的数据查询(Cont.)(8) 集函数统计元组个数:COUNT([DISTINCT|ALL]|*)统计一列中值的个数:COUNT([DISTINCT|ALL]<列名>) 对一列求和:SUM([DISTINCT|ALL]<列名>)对一列求平均值:AVG([DISTINCT|ALL]<列名>)求一列中最大值:MAX([DISTINCT|ALL]<列名>)求一列中最小值:MIN([DISTINCT|ALL]<列名>) DISTINCT: 消除重复元组ALL: 所有元组,缺省值例:统计学生总数.SELECT COUNT (*) FROM Student;例:统计男生人数.SELECT COUNT (*) FROM Student WHERE Sex=‘男’;例:统计选修了课程的学生人数.SELECT COUNT (DISTINCT Sno) FROM SC;在SC 中对Sno 投影,然后统计去掉重复元组后的记录个数.例:查找选修“101001”号课程的学生最高分.SELECT MAX (Grade) FROM SCWHERE Cno=‘101001’;5.4 SQL 的数据查询(Cont.)怎样获得尚未选课的学生人数?怎样获得女生人数?例:计算选修“101001”号课程的学生平均成绩.SELECT AVG (Grade) FROM SC WHERE Cno=‘101001’;若显示课号及平均成绩,则:SELECT Cno,AVG (Grade) FROM SCWHERE Cno=‘101001’GROUP BY Cno;例:统计每个学生的平均成绩.SELECT Sno, AVG (Grade) FROM SCGROUP BY Sno;按课号分组5.4 SQL 的数据查询(Cont.)5.4 SQL的数据查询(Cont.)(9) 对查询结果分组分组方法用GROUP BY子句将查询结果按某一列或多列值分组,值相等的为一组.分组的目的进一步细化集函数的作用对象.例:求各门课程的课号及其选修该课的人数.SELECT Cno,COUNT(Sno) FROM SC GROUP BY Cno;例:求每一个学生的平均成绩.SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno;5.4 SQL的数据查询(Cont.)若分组后还要按一定条件进行筛选, 可以用HAVING短语指定筛选条件.例:查询选修了3门以上课程的学生学号.SELECT Sno FROM SC GROUP BY SnoHAVING COUNT(*)>=3;先用GROUP语句进行分组,对每组用COUNT统计元组个数,对于每组元组个数大于等于3的学号进行输出.注意WHERE与HAVING语句的区别WHERE:作用于基本表或视图,选择满足条件的元组HAVING:作用于GROUP分成的子组,选择满足条件的组。