第二章 SQL
? SQL概述
? SQL数据定义功能
? SQL数据查询功能
? SQL数据修改功能
? SQL数据控制功能
? 嵌入式 SQL
SQL概述( Ⅰ )
? 历史
? 1974年, 由 Boyce和 Chamber提出 。
? 1975-1979年, 在 System R上实现, 由 IBM的 San
Jose 研究室研制, 称为 Sequel,现在称为 SQL
(Structured Query Language)。
? 标准化
? 有关组织
? ANSI(American Natural Standard Institute)
? ISO(International Organization for Standardization)
? 有关标准
? SQL-86:, 数据库语言 SQL”
SQL概述( Ⅱ )
? SQL-89:, 具有完整性增强的数据库语言 SQL”,增加
了对完整性约束的支持 。
? SQL-92:, 数据库语言 SQL”,是 SQL-89的超集, 增加
了许多新特性, 如新的数据类型, 更丰富的数据操作,
更强的完整性, 安全性支持等 。 即 SQL2.
? SQL-3:正在讨论中的新的标准, 将增加对面向对象模
型的支持 。
? SQL语言的应用情况,
? Oracle,Sybase,Informix,Ingres,DB2,SQL
Server,Rdb等大型数据库管理系统实现了 SQL语
言;
? Dbase,Foxpro,Acess等 PC机数据库管理系统部
分实现了 SQL语言;
SQL概述
? 可以在 HTML中嵌入 SQL语句, 通过 WWW访问数
据库 ;
? 在 VC,VB,DEPHI,CB也可嵌入 SQL语句 。
? SQL特点,
? 一体化
集 DDL,DML,DCL于一体 。
单一的结构 ----关系, 带来了数据操作符的统一 。
? 面向集合的操作方式
一次一集合。
SQL概述( Ⅲ )
? 高度非过程化
用户只需提出“做什么”,无须告诉“怎么做”,不必
了解存取路径。
? 两种使用方式,统一的语法结构
SQL既是自含式语言 ( 用户使用 ), 又是嵌入式语言
( 程序员使用 ) 。
? 语言简洁, 易学易用
SQL功能 操作符
数据查询 SELECT
数据定义 CREATE,DROP,ALTER
数据操纵 INSERT,UPDATE,DELETE
数据控制 GRANT,REVOKE
SQL语言的基本概念
? SQL语言支持关系数据库的三级模式结构,
SQL
视图 1 视图 2
存储文件 2存储文件 1
基本表 4基本表 3基本表 2基本表 1
外模式
模式
内模式
基本概念
? 基本表,本身独立存在的表,SQL中一个关系就
对应一个表,一个 (或多个 )基本表对应一个存储
文件,
? 存储文件,文件的实际存放情况,对用户是透明
的,
? 视图,由一个或几个基本表导出的表,是 虚表,
示例关系
DEPT(DNO,DNAME,DEAN)
S(Sno,SNAME,SEX,AGE,D#)
COURSE(Cno,CN,PCno,CREDIT)
SC(Sno,Cno,SCORE)
PROF(Pno,PNAME,AGE,D#,SAL)
Teach(Pno,Cno)
SQL数据定义功能
? 基本表的定义
? 索引的定义
? 数据库的建立与撤消
? SQL数据定义特点
域
? 数据类型
? char( n),长度为 n的定长字符串 。
? varchar( n),最大长度为 n的可变长字符串 。
? int,smallint:整数类型 。
? numeric( p,s), p(精度 ),小数点左边和右边可以存
储的十进制数字的最大个数, s(小数位数 ),小数点右
边可以存储的十进制数字的最大个数;同 decimal(p,s)。
? float,用于表示浮点数字数据的近似数字数据类型 。
? datetime:代表日期和一天内的时间的日期和时间数据
类型 。
? 其他,money,bit,
基本表的定义( Ⅰ )
? 基本表的定义( CREATE)
? 格式
create table 表名 (
列名 数据类型 [default 缺省值 ] [not null]
[,列名 数据类型 [default 缺省值 ] [not null]]
……
[,primary key( 列名 [,列名 ] … ) ]
[,foreign key ( 列名 [,列名 ] … )
references 表名 ( 列名 [,列名 ] … ) ]
[,check( 条件 ) ])
基本表的定义( Ⅱ )
? 示例
create table PROF
( PNO char(10),
PNAME char(20) not null,
SAL int,
AGE int,
DNO char(10),
primary key (PNO),
foreign key (DNO) references DEPT(DNO),
check (SAL > 0))
基本表的定义( Ⅲ )
? 修改基本表定义( ALTER)
? 格式:
alter table 表名
[add 子句 ] 增加新列
[drop 子句 ] 删除列和完整性约束条件
[modify 子句 ] 修改列定义
? 示例
alter table PROF
add LOCATION char[30]
基本表的定义( Ⅳ )
? 撤消基本表定义( drop)
? 格式
drop table 表名
? 示例
drop table DEPT
?DANGER
撤消基本表后, 基本表的定义, 表中数据, 索引,
以及由此表导出的视图的定义都被删除 。
? WHAT’S THEMEANOFCASCADE?
数据库的建立与撤消
有的数据库系统支持多库 。
? 建立一个新数据库
create database 数据库名
? 撤消一个数据库
drop database 数据库名
? 指定当前数据库
use 数据库名
SQL数据定义特点
SQL中,任何时候都可以执行一个数据定义语句,随
时修改数据库结构。而在非关系型的数据库系统中,
必须在数据库的装入和使用前全部完成数据库的定义。
若要修改已投入运行的数据库,则需停下一切数据库
活动,把数据库卸出,修改数据库定义并重新编译,
再按修改过的数据库结构重新装入数据。
? 数据库定义不断增长(不必一开始就定义完整)。
? 数据库定义随时修改(不必一开始就完全合理)。
? 可进行增加索引、撤消索引的实验,检验其对效率的
影响 。
SQL数据查询功能
? SQL数据查询基本结构
? 单表查询
? 连接查询
? 嵌套查询
? 集合查询
? SELECT语句的一般格式
SQL数据查询基本结构
? 基本结构
select <目标表达式 >[,<目标表达式 >]
from <表名或者视图名 >[,<表名或者视图名 >]
where <条件表达式 >
含义,根据 where子句的条件表达式, 从 from
子句指定的表或视图找出满足条件的元组,
再按 SELECT子句中的目标列表达式, 选出
元组中的属性值形成结果表 。
讲课中所用的表结构
? 学生表,Student(Sno,Sname,Ssex,Sage,Sdept)
? 课程表,Course(Cno,Cname,Cpno,Ccredit)
? 学生选课表,SC(Sno,Cno,score)
单表查询 -选择表中的若干列
? 查询指定列
通过指定 SELECT子句的 <目标表达式 >来完成
例 1 查询全体学生的学号和姓名 。
SELECT Sno,Sname
FROM Student
例 2 查询全体学生的姓名, 学号, 年龄 。
SELECT Sname,Sno,Sage
FROM Student
单表查询 -选择表中的若干列
? 查询全部列
?, *”,表示, 所有的属性, 。
例 3 给出所有学生的信息 。
select * 等价于 select Sno,Sname,Ssex,Sage,Sdept
from Student from Student
? 查询经过计算的值
? select子句的 <目标表达式 >可以是表达式
例 4 给出所有学生的姓名及其出生年份 。
select SNAME,2005- Sage
from Student
单表查询 -选择表中的若干列
? <目标表达式 >不仅可以是算术表达式, 还可以是字
符串常量, 函数 。
例 5 给出所有学生姓名, 出生年份和所在系编号 ( 小写 ) 。
select Sname,’Year of Birth’,2005-Sage,LOWER(Sdept)
from STUDENT
用户可以通过指定别名来改变查询结果的列标题, 格式如下:
oldname as newname,其中 as可选
select Sname NAME,’Year of Birth’ BIRTH,2004-Sage
BIRTHDAY,LOWER(Sdept) as DEPARTMENT
from STUDENT
单表查询 -选择表中的若干元组
? 消除取值重复的行
例 6 查询选修了课程的学生学号
select Sno select DISTINCT Sno
from SC from SC
如果没有指定 distinct,则缺省为 ALL,即保留重复行
? 查询满足条件的元组
? 查询满足指定条件的元组可以通过 WHERE子句来
实现 。 WHERE子句常用的查询条件如下表所示:
取消重复行
单表查询 -选择表中的若干元组
查询条件 谓词
比较 =,>,<,>=,<=,!=,<>,!>,!<
确定范围 BETWEEN AND,
NOT BETWEEN AND
确定集合 IN,NOT IN
字符匹配 LIKE,NOT LIKE
空值 IS NULL,IS NOT NULL
多重条件 AND,OR
?查询满足条件的元组
单表查询 -选择表中的若干元组
( 1) 比较大小
例 7 查询计算机系全体学生的名单
select Sname
from Student
where Sdept=‘CS’
例 8 查询所有年龄在 20岁以下的学生姓名及其年龄
select Sname,Sage
from Student
where Sage<20
单表查询 -选择表中的若干元组
( 2) 确定范围
例 10 查询年龄在 20~ 23岁之间的学生姓名, 系别, 年龄
select Sname,Sdept,Sage
from Student
where Sage BETWEEN 20 AND 23
例 11查询年龄不在 20~ 23岁之间的学生姓名, 系别, 年龄
select Sname,Sage
from Student
where Sage NOT BETWEEN 20 AND 23
单表查询 -选择表中的若干元组
( 3) 确定集合
? 谓词 IN可以用来查找属性值属于指定集合的元组
例 12 查询信息系 ( IS), 数学系 ( MA) 和计算机系 ( CS)
学生的姓名和性别
select Sname,Ssex
from Student
where Sdept in(‘IS’,’MA’,’CS’)
例 13查询既不是信息系, 数学系, 也不是计算机系的学生
姓名和性别, select Sname,Sage
from Student
where Sdept NOT IN(‘IS’,’MA’,’CS’)
单表查询 -选择表中的若干元组
( 3) 字符匹配
谓词 LIKE可以用来进行字符串的匹配 。 其一般语法格式:
[NOT] LIKE ‘<匹配串 >’[ESCAPE ‘ <换码字符 > ’]
含义:查找指定的属性列值与 <匹配串 >相匹配的元组
例 14 查询姓名为李勇的学生的详细情况
select * select *
from student from student
where sname like ‘李勇 ’ where sname=‘李勇 ’
匹配串可以是一个完整的字符串, 也可以含有通配符 % 和
_。 其中:
单表查询 -选择表中的若干元组
? % ( 百分号 ) 代表任意长度 ( 可以为 0) 的字符串 。
例如 a%b表示以 a开头, 以 b结尾的任意长度的字符
串 。 如 acb,addgb,ab等都满足该匹配串
? _( 下横线 ) 代表任意单个字符
例如 a_b代表以 a开头, 以 b结尾的长度为 3的任意字
符串, 比如 acb,afb都满足该匹配串
例 15 查询所有姓刘的学生姓名, 学号和性别
select Sname,Sno,Ssex
from Student
where Sname like ‘刘 % ’
例 16 查询姓, 欧阳, 且全名为三个汉字的学生的姓
名
select Sname
from Student
where Sname like ‘欧阳 _ ’
? 如果用户要查询的字符串本身就含有 % 或 _,这时
就要使用 ESCAPE’<转义字符 >’断语对通配符进行
转义
例 17 查询 DB_design的课程的课程号和学分
select Cno,Ccredit from Course
where Cname like ‘db\_design’ escape ‘\’
单表查询 -选择表中的若干元组
单表查询 -选择表中的若干元组
例 18 查询以,DB_”开头,且倒数第三个字符为 i的课程的详细情
况
select *
from Course
where Cname like ‘DB\_%i_ _’ESCAPE ‘\’
(5) 涉及空值的查询
例 19 某些学生选修课程后没有参加考试,所以有选课记录,但
没有考试成绩。查询缺少成绩的学生的学号和相应的课程号
select Sno,Cno
from SC
where Score IS NULL
例 20 查询所有有成绩的学生学号和课程号
select Sno,Cno from SC where Score IS NOT NULL
单表查询 -选择表中的若干元组
(6) 多重条件查询
例 21 查询计算机系年龄在 20岁以下的学生姓名
select Sname
from student
where Sdept=‘cs’ and Sage <20
例 22查询信息系( IS)、数学系( MA)和计算机系( CS)
学生的姓名和性别
select Sname,Ssex
from Student
where Sdept =‘IS’ OR Sdept =‘MA’ OR Sdept =‘CS’
? 用 ORDER BY子句对查询结果按照一个或多个属性列的升序()
ASC)或降序( DESC)
例 24 查询选修了 C03号课程的学生的学号及其成绩,查询结果
按分数的降序排列
select Sno,Score
from SC
where cno=‘c03’
order by score desc
? 排序的时候对空值的处理
若按升序排,空值的元组最后显示;若按降序排,空值的元组
最先显示
单表查询 -对查询结果排序
单表查询 -对查询结果排序
例 25 查询全体学生情况, 查询结果按所在系的系号
排列, 同一系中的学生按年龄降序排列 。
SELECT *
FROM STUDENT
ORDER BY Sdept, Sage desc
? SQL中常用的集函数:
COUNT([DISTINCT|ALL] *) 统计元组个数
COUNT([DISTINCT|ALL] <列名 >) 统计一列中值的个数
SUM([DISTINCT|ALL] <列名 >) 计算一列值的总和
AVG ([DISTINCT|ALL] <列名 >) 计算一列值的平均值
MAX ([DISTINCT|ALL] <列名 >) 求一列值的最大值
MIN ([DISTINCT|ALL] <列名 >)求一列值的最小值
? 注意:指定 DISTINCT,表示取消指定列的重复值;
不指定或者指定 ALL,表示不取消重复值
例 26 查询学生人数
SELECT COUNT(*)
FROM STUDENT
单表查询 -使用集函数
例 27 查询选修了课程的学生人数
SELECT COUNT(DISTINCT SNO)
FROM SC
例 28 计算 C01号课程的学生平均成绩
SELECT AVG(SCORE)
FROM SC
WHERE CNO=‘C01’
例 29 查询选修了 C01课程的学生最高分数
SELECT MAX(SCORE)
FROM SC
WHERE CNO=‘C01’
单表查询 -使用集函数
关于集函数的思考
? 思考:
查询有选修 C01或者 C02课程的学生人数
查询既选修了 C01又选修了 C02课程的学生人数
select count(distinct sno)
from sc
where cno='c01' or cno='c02'
select count( sno)
from sc
where cno='c01' and sno in ( select sno from
sc where cno='c02' )
关于集函数的思考
? 思考:
查询至少选修了两门课的学生学号
select sno
from sc
group by sno
having count(cno)>=2
思考:统计每个系的人数,要求结果按人数的升序排序
单表查询 -对查询结果分组
? 使用 GROUP BY 子句将查询结果按某一列或者多列值分组,值
相等的为一组
例 30 求各个课程号及相应的选课人数,课程平均成绩
SELECT Cno,COUNT(Sno),AVG(SCORE)
FROM SC
GROUP BY Cno
观察其运行结果
? 如果分组后还要求按一定的条件对这些组进行筛选,最终只输
出满足指定条件的组,则可以使用 HAVING断语指定筛选条件
例 31 查询选修了 3门以上课程的学生学号
SELECT SNO FROM SC
GROUP BY Sno
HAVING COUNT(*) >3
单表查询 -对查询结果分组
? WHERE 子句与 HAVING子句的区别:
WHERE子句作用于基本表或视图,从中选择满足条件的元组;
HAVING子句作用于组,从中选择满足条件的组
? 总结:
查询语句的一般格式:
SELECT [all|distinct ] <目标表达式 >[,<目标表达式 >]
FROM <表名或者视图名 >[,<表名或者视图名 >]
[WHERE <条件表达式 >]
[GROUP BY<列名 1> [HAVING<条件表达式 >]]
[ORDER BY<列名 2> [ASC|DESC]]
? SQL概述
? SQL数据定义功能
? SQL数据查询功能
? SQL数据修改功能
? SQL数据控制功能
? 嵌入式 SQL
SQL概述( Ⅰ )
? 历史
? 1974年, 由 Boyce和 Chamber提出 。
? 1975-1979年, 在 System R上实现, 由 IBM的 San
Jose 研究室研制, 称为 Sequel,现在称为 SQL
(Structured Query Language)。
? 标准化
? 有关组织
? ANSI(American Natural Standard Institute)
? ISO(International Organization for Standardization)
? 有关标准
? SQL-86:, 数据库语言 SQL”
SQL概述( Ⅱ )
? SQL-89:, 具有完整性增强的数据库语言 SQL”,增加
了对完整性约束的支持 。
? SQL-92:, 数据库语言 SQL”,是 SQL-89的超集, 增加
了许多新特性, 如新的数据类型, 更丰富的数据操作,
更强的完整性, 安全性支持等 。 即 SQL2.
? SQL-3:正在讨论中的新的标准, 将增加对面向对象模
型的支持 。
? SQL语言的应用情况,
? Oracle,Sybase,Informix,Ingres,DB2,SQL
Server,Rdb等大型数据库管理系统实现了 SQL语
言;
? Dbase,Foxpro,Acess等 PC机数据库管理系统部
分实现了 SQL语言;
SQL概述
? 可以在 HTML中嵌入 SQL语句, 通过 WWW访问数
据库 ;
? 在 VC,VB,DEPHI,CB也可嵌入 SQL语句 。
? SQL特点,
? 一体化
集 DDL,DML,DCL于一体 。
单一的结构 ----关系, 带来了数据操作符的统一 。
? 面向集合的操作方式
一次一集合。
SQL概述( Ⅲ )
? 高度非过程化
用户只需提出“做什么”,无须告诉“怎么做”,不必
了解存取路径。
? 两种使用方式,统一的语法结构
SQL既是自含式语言 ( 用户使用 ), 又是嵌入式语言
( 程序员使用 ) 。
? 语言简洁, 易学易用
SQL功能 操作符
数据查询 SELECT
数据定义 CREATE,DROP,ALTER
数据操纵 INSERT,UPDATE,DELETE
数据控制 GRANT,REVOKE
SQL语言的基本概念
? SQL语言支持关系数据库的三级模式结构,
SQL
视图 1 视图 2
存储文件 2存储文件 1
基本表 4基本表 3基本表 2基本表 1
外模式
模式
内模式
基本概念
? 基本表,本身独立存在的表,SQL中一个关系就
对应一个表,一个 (或多个 )基本表对应一个存储
文件,
? 存储文件,文件的实际存放情况,对用户是透明
的,
? 视图,由一个或几个基本表导出的表,是 虚表,
示例关系
DEPT(DNO,DNAME,DEAN)
S(Sno,SNAME,SEX,AGE,D#)
COURSE(Cno,CN,PCno,CREDIT)
SC(Sno,Cno,SCORE)
PROF(Pno,PNAME,AGE,D#,SAL)
Teach(Pno,Cno)
SQL数据定义功能
? 基本表的定义
? 索引的定义
? 数据库的建立与撤消
? SQL数据定义特点
域
? 数据类型
? char( n),长度为 n的定长字符串 。
? varchar( n),最大长度为 n的可变长字符串 。
? int,smallint:整数类型 。
? numeric( p,s), p(精度 ),小数点左边和右边可以存
储的十进制数字的最大个数, s(小数位数 ),小数点右
边可以存储的十进制数字的最大个数;同 decimal(p,s)。
? float,用于表示浮点数字数据的近似数字数据类型 。
? datetime:代表日期和一天内的时间的日期和时间数据
类型 。
? 其他,money,bit,
基本表的定义( Ⅰ )
? 基本表的定义( CREATE)
? 格式
create table 表名 (
列名 数据类型 [default 缺省值 ] [not null]
[,列名 数据类型 [default 缺省值 ] [not null]]
……
[,primary key( 列名 [,列名 ] … ) ]
[,foreign key ( 列名 [,列名 ] … )
references 表名 ( 列名 [,列名 ] … ) ]
[,check( 条件 ) ])
基本表的定义( Ⅱ )
? 示例
create table PROF
( PNO char(10),
PNAME char(20) not null,
SAL int,
AGE int,
DNO char(10),
primary key (PNO),
foreign key (DNO) references DEPT(DNO),
check (SAL > 0))
基本表的定义( Ⅲ )
? 修改基本表定义( ALTER)
? 格式:
alter table 表名
[add 子句 ] 增加新列
[drop 子句 ] 删除列和完整性约束条件
[modify 子句 ] 修改列定义
? 示例
alter table PROF
add LOCATION char[30]
基本表的定义( Ⅳ )
? 撤消基本表定义( drop)
? 格式
drop table 表名
? 示例
drop table DEPT
?DANGER
撤消基本表后, 基本表的定义, 表中数据, 索引,
以及由此表导出的视图的定义都被删除 。
? WHAT’S THEMEANOFCASCADE?
数据库的建立与撤消
有的数据库系统支持多库 。
? 建立一个新数据库
create database 数据库名
? 撤消一个数据库
drop database 数据库名
? 指定当前数据库
use 数据库名
SQL数据定义特点
SQL中,任何时候都可以执行一个数据定义语句,随
时修改数据库结构。而在非关系型的数据库系统中,
必须在数据库的装入和使用前全部完成数据库的定义。
若要修改已投入运行的数据库,则需停下一切数据库
活动,把数据库卸出,修改数据库定义并重新编译,
再按修改过的数据库结构重新装入数据。
? 数据库定义不断增长(不必一开始就定义完整)。
? 数据库定义随时修改(不必一开始就完全合理)。
? 可进行增加索引、撤消索引的实验,检验其对效率的
影响 。
SQL数据查询功能
? SQL数据查询基本结构
? 单表查询
? 连接查询
? 嵌套查询
? 集合查询
? SELECT语句的一般格式
SQL数据查询基本结构
? 基本结构
select <目标表达式 >[,<目标表达式 >]
from <表名或者视图名 >[,<表名或者视图名 >]
where <条件表达式 >
含义,根据 where子句的条件表达式, 从 from
子句指定的表或视图找出满足条件的元组,
再按 SELECT子句中的目标列表达式, 选出
元组中的属性值形成结果表 。
讲课中所用的表结构
? 学生表,Student(Sno,Sname,Ssex,Sage,Sdept)
? 课程表,Course(Cno,Cname,Cpno,Ccredit)
? 学生选课表,SC(Sno,Cno,score)
单表查询 -选择表中的若干列
? 查询指定列
通过指定 SELECT子句的 <目标表达式 >来完成
例 1 查询全体学生的学号和姓名 。
SELECT Sno,Sname
FROM Student
例 2 查询全体学生的姓名, 学号, 年龄 。
SELECT Sname,Sno,Sage
FROM Student
单表查询 -选择表中的若干列
? 查询全部列
?, *”,表示, 所有的属性, 。
例 3 给出所有学生的信息 。
select * 等价于 select Sno,Sname,Ssex,Sage,Sdept
from Student from Student
? 查询经过计算的值
? select子句的 <目标表达式 >可以是表达式
例 4 给出所有学生的姓名及其出生年份 。
select SNAME,2005- Sage
from Student
单表查询 -选择表中的若干列
? <目标表达式 >不仅可以是算术表达式, 还可以是字
符串常量, 函数 。
例 5 给出所有学生姓名, 出生年份和所在系编号 ( 小写 ) 。
select Sname,’Year of Birth’,2005-Sage,LOWER(Sdept)
from STUDENT
用户可以通过指定别名来改变查询结果的列标题, 格式如下:
oldname as newname,其中 as可选
select Sname NAME,’Year of Birth’ BIRTH,2004-Sage
BIRTHDAY,LOWER(Sdept) as DEPARTMENT
from STUDENT
单表查询 -选择表中的若干元组
? 消除取值重复的行
例 6 查询选修了课程的学生学号
select Sno select DISTINCT Sno
from SC from SC
如果没有指定 distinct,则缺省为 ALL,即保留重复行
? 查询满足条件的元组
? 查询满足指定条件的元组可以通过 WHERE子句来
实现 。 WHERE子句常用的查询条件如下表所示:
取消重复行
单表查询 -选择表中的若干元组
查询条件 谓词
比较 =,>,<,>=,<=,!=,<>,!>,!<
确定范围 BETWEEN AND,
NOT BETWEEN AND
确定集合 IN,NOT IN
字符匹配 LIKE,NOT LIKE
空值 IS NULL,IS NOT NULL
多重条件 AND,OR
?查询满足条件的元组
单表查询 -选择表中的若干元组
( 1) 比较大小
例 7 查询计算机系全体学生的名单
select Sname
from Student
where Sdept=‘CS’
例 8 查询所有年龄在 20岁以下的学生姓名及其年龄
select Sname,Sage
from Student
where Sage<20
单表查询 -选择表中的若干元组
( 2) 确定范围
例 10 查询年龄在 20~ 23岁之间的学生姓名, 系别, 年龄
select Sname,Sdept,Sage
from Student
where Sage BETWEEN 20 AND 23
例 11查询年龄不在 20~ 23岁之间的学生姓名, 系别, 年龄
select Sname,Sage
from Student
where Sage NOT BETWEEN 20 AND 23
单表查询 -选择表中的若干元组
( 3) 确定集合
? 谓词 IN可以用来查找属性值属于指定集合的元组
例 12 查询信息系 ( IS), 数学系 ( MA) 和计算机系 ( CS)
学生的姓名和性别
select Sname,Ssex
from Student
where Sdept in(‘IS’,’MA’,’CS’)
例 13查询既不是信息系, 数学系, 也不是计算机系的学生
姓名和性别, select Sname,Sage
from Student
where Sdept NOT IN(‘IS’,’MA’,’CS’)
单表查询 -选择表中的若干元组
( 3) 字符匹配
谓词 LIKE可以用来进行字符串的匹配 。 其一般语法格式:
[NOT] LIKE ‘<匹配串 >’[ESCAPE ‘ <换码字符 > ’]
含义:查找指定的属性列值与 <匹配串 >相匹配的元组
例 14 查询姓名为李勇的学生的详细情况
select * select *
from student from student
where sname like ‘李勇 ’ where sname=‘李勇 ’
匹配串可以是一个完整的字符串, 也可以含有通配符 % 和
_。 其中:
单表查询 -选择表中的若干元组
? % ( 百分号 ) 代表任意长度 ( 可以为 0) 的字符串 。
例如 a%b表示以 a开头, 以 b结尾的任意长度的字符
串 。 如 acb,addgb,ab等都满足该匹配串
? _( 下横线 ) 代表任意单个字符
例如 a_b代表以 a开头, 以 b结尾的长度为 3的任意字
符串, 比如 acb,afb都满足该匹配串
例 15 查询所有姓刘的学生姓名, 学号和性别
select Sname,Sno,Ssex
from Student
where Sname like ‘刘 % ’
例 16 查询姓, 欧阳, 且全名为三个汉字的学生的姓
名
select Sname
from Student
where Sname like ‘欧阳 _ ’
? 如果用户要查询的字符串本身就含有 % 或 _,这时
就要使用 ESCAPE’<转义字符 >’断语对通配符进行
转义
例 17 查询 DB_design的课程的课程号和学分
select Cno,Ccredit from Course
where Cname like ‘db\_design’ escape ‘\’
单表查询 -选择表中的若干元组
单表查询 -选择表中的若干元组
例 18 查询以,DB_”开头,且倒数第三个字符为 i的课程的详细情
况
select *
from Course
where Cname like ‘DB\_%i_ _’ESCAPE ‘\’
(5) 涉及空值的查询
例 19 某些学生选修课程后没有参加考试,所以有选课记录,但
没有考试成绩。查询缺少成绩的学生的学号和相应的课程号
select Sno,Cno
from SC
where Score IS NULL
例 20 查询所有有成绩的学生学号和课程号
select Sno,Cno from SC where Score IS NOT NULL
单表查询 -选择表中的若干元组
(6) 多重条件查询
例 21 查询计算机系年龄在 20岁以下的学生姓名
select Sname
from student
where Sdept=‘cs’ and Sage <20
例 22查询信息系( IS)、数学系( MA)和计算机系( CS)
学生的姓名和性别
select Sname,Ssex
from Student
where Sdept =‘IS’ OR Sdept =‘MA’ OR Sdept =‘CS’
? 用 ORDER BY子句对查询结果按照一个或多个属性列的升序()
ASC)或降序( DESC)
例 24 查询选修了 C03号课程的学生的学号及其成绩,查询结果
按分数的降序排列
select Sno,Score
from SC
where cno=‘c03’
order by score desc
? 排序的时候对空值的处理
若按升序排,空值的元组最后显示;若按降序排,空值的元组
最先显示
单表查询 -对查询结果排序
单表查询 -对查询结果排序
例 25 查询全体学生情况, 查询结果按所在系的系号
排列, 同一系中的学生按年龄降序排列 。
SELECT *
FROM STUDENT
ORDER BY Sdept, Sage desc
? SQL中常用的集函数:
COUNT([DISTINCT|ALL] *) 统计元组个数
COUNT([DISTINCT|ALL] <列名 >) 统计一列中值的个数
SUM([DISTINCT|ALL] <列名 >) 计算一列值的总和
AVG ([DISTINCT|ALL] <列名 >) 计算一列值的平均值
MAX ([DISTINCT|ALL] <列名 >) 求一列值的最大值
MIN ([DISTINCT|ALL] <列名 >)求一列值的最小值
? 注意:指定 DISTINCT,表示取消指定列的重复值;
不指定或者指定 ALL,表示不取消重复值
例 26 查询学生人数
SELECT COUNT(*)
FROM STUDENT
单表查询 -使用集函数
例 27 查询选修了课程的学生人数
SELECT COUNT(DISTINCT SNO)
FROM SC
例 28 计算 C01号课程的学生平均成绩
SELECT AVG(SCORE)
FROM SC
WHERE CNO=‘C01’
例 29 查询选修了 C01课程的学生最高分数
SELECT MAX(SCORE)
FROM SC
WHERE CNO=‘C01’
单表查询 -使用集函数
关于集函数的思考
? 思考:
查询有选修 C01或者 C02课程的学生人数
查询既选修了 C01又选修了 C02课程的学生人数
select count(distinct sno)
from sc
where cno='c01' or cno='c02'
select count( sno)
from sc
where cno='c01' and sno in ( select sno from
sc where cno='c02' )
关于集函数的思考
? 思考:
查询至少选修了两门课的学生学号
select sno
from sc
group by sno
having count(cno)>=2
思考:统计每个系的人数,要求结果按人数的升序排序
单表查询 -对查询结果分组
? 使用 GROUP BY 子句将查询结果按某一列或者多列值分组,值
相等的为一组
例 30 求各个课程号及相应的选课人数,课程平均成绩
SELECT Cno,COUNT(Sno),AVG(SCORE)
FROM SC
GROUP BY Cno
观察其运行结果
? 如果分组后还要求按一定的条件对这些组进行筛选,最终只输
出满足指定条件的组,则可以使用 HAVING断语指定筛选条件
例 31 查询选修了 3门以上课程的学生学号
SELECT SNO FROM SC
GROUP BY Sno
HAVING COUNT(*) >3
单表查询 -对查询结果分组
? WHERE 子句与 HAVING子句的区别:
WHERE子句作用于基本表或视图,从中选择满足条件的元组;
HAVING子句作用于组,从中选择满足条件的组
? 总结:
查询语句的一般格式:
SELECT [all|distinct ] <目标表达式 >[,<目标表达式 >]
FROM <表名或者视图名 >[,<表名或者视图名 >]
[WHERE <条件表达式 >]
[GROUP BY<列名 1> [HAVING<条件表达式 >]]
[ORDER BY<列名 2> [ASC|DESC]]