幻灯片1
第4章SQL结构化查询语言
4.1 SQL简介
SQL是在20世纪70年代末由IBM公司开发出来的一套程序语言,并被用在DB2关系数据库系统中。但是,直到1981年,IBM推出商用的SQL/DS关系型数据库系统;Oracle及其他大
型关系型数据库系统相继出现,SQL才得以广
泛应用。例如,Sybase 与Microsoft公司使
用T(transact)-SQL,而Oracle公司使用
PL/SQL。
幻灯片2
4.1 SQL简介
SQL的发展
1974年提出,在SYSTEM R上实现。
1986年10月,ANSI定为关系数据库语言的美国标准,并公布了标准SQL。
1992年通过的修改标准SQL---92(简称SQL2)。1999年--- SQL99标准。
2003年--- SQL2003标准。
幻灯片3
4.1 SQL简介
SQL( Structured Query Language)称为结构化
查询语言,它集数据定义语言DDL、数据操纵语言DML、数据控制语言DCL于一体。
SQL已成为关系型数据库的标准查询语言。
幻灯片4
4.1 SQL简介
SQL语言是应用于数据库的语言,本身是不能独立存在的。它是一种非过程性(non-procedural) 语言,与一般的高级语言(如C、JAVA)不同。一般的高级语言在存取数据库时,需要依照每一行程序的顺序处理许多的动作。但是使用SQL时,只需告诉数据库需要什么数据,怎么显示就可以了。具体的内部操作则由数据库系统来完成。
幻灯片5
4.1 SQL简介
SQL的分类
DDL(数据定义语言):用于定义数据库对象(数据库、表、视图、索引)。如create,drop,alter;
DML(数据操纵语言):用于对表或视图进行添加、删除和修改等操作,如insert,update,delete。
DQL (数据查询语言) :用于从数据库中检索数据。如select。
DCL(数据控制语言):用于控制用户对数据库的存取能力。如grant,deny,revoke。
幻灯片6
4.1 SQL简介
SQL语言的主要特点是:
SQL语言是一种一体化的语言,提供了完整的数据定义和操纵功能。
SQL语言具有完备的查询功能。
SQL语言非常简洁,易学易用。
SQL语言是一种高度非过程化的语言。
SQL语言的执行方式多样。
SQL语言不仅能对数据表进行各种操作,也可对视图进行操作。
幻灯片7
4.2 Select 语句
查询是SQL的核心。用于表达查询的SELECT
语句是功能最强也是最复杂的SQL语句。它
可以实现各种查询,还能进行统计、结果排
序等。
幻灯片8
4.2.1 SELECT语句格式
SELECT [谓词] [表别名.] SELECT 表达式[ AS 列别名][,[[表别名.] SELECT 表达式[ AS 列别名]…]
[INTO 新表名][IN 库名]
FROM 表名[AS 表别名]
[[INNER|LEFT|RIGHT|JOIN{{<表名>][AS 表别名]
[ON 联接条件]]…] [IN 库名]
[WHERE 逻辑表达式]
[GROUP BY 分组字段列表]
[HAVING 过滤条件]
[UNION [ALL] SELECT语句]
[ORDER BY 排序字段[ASC | DESC] [,排序字段[ASC | DESC] ...]]
幻灯片9
4.2.1 SELECT语句格式
SELECT语句的完整格式中包括6个子句。SELECT和
FROM子句是必须的,其它子句任选。
SELECT子句列出所有要求SELECT语句检索的数据
项。这些项可以取自数据库中的字段,也可以是SQL
在执行查询时计算出的列。
FROM子句列出包含所要查询数据的表。
WHERE子句告诉SQL只查询某些行中的数据,这些
行用逻辑表达式描述。
GROUP BY子句将结果按<分组字段列表>的值进行
分组,该值相等的记录为一个组。
幻灯片10
StudentNo int PRIMARY KEY IDENTITY(1,1)
4.2.1 SELECT语句格式
HAVING子句告诉SQL只产生由GROUP BY 得到的
某些组的结果。
ORDER BY子句将查询结果按一列或多列中的数据
排序。
幻灯片11
4.2.1 简单查询
1、SELECT子句
用于指定在查询结果中包含的字段、常量和表达式。
① [表别名]:在FROM子句中给表取别名,主要用于当不同的表中存在同名字段时区别数据来源表。
② SELECT表达式:是用户要查询的内容。如果多个字段用逗号分割。内容可以是字段名,也可以是函数(系统及自定义函数),还可以是* ,表示输出表中的所有
字段。
幻灯片12
4.2.1 简单查询
③[谓词]:指定查询选择的记录,可取ALL 、DISTINCT 、DISTINCTROW、TOP n [PERCENT]
谓词
说明
例子
SELECT ALL 学号 FROM
显示查询结果中全部数据
学生选课
ALL
忽略在选定字段中包含重复数
SELECT DISTINCT 学号
据的记录。
FROM 学生选课
DISTINCT
SELECT DISTINCTROW 学
忽略整个重复记录的数据,而
不仅仅是重复的字段。SELECT DISTINCTROW 学
号 FROM 学生选课
DISTINCTROW
返回在一定范围内的一定数量
的记录。
SELECT TOP 5 学号 FROM
学生选课
TOP n
[PERCENT]
幻灯片13
4.2.1 简单查询
1、SELECT子句
例如:
select 学号,姓名,性别 from 学生
select * from 课程
select 学生.学号, 学生.姓名, 专业.专业名称 FROM 学生,专业 where 学生.专业编号 =专业.专业编号select 学号,姓名,性别,year(出生日期) as 出生年份 from 学生
幻灯片14
4.2.1 简单查询
2、FROM子句
用于指定在查询的表名,并给出表别名。
①[表名] [AS 表别名]:为表指定一个临时别名。若指定了别名,则整个SELECT语句中必须使用这个别名代
替表名。
② INNER JOIN:规定内连接。只有在被连接的表中
有匹配的记录才会出现在查询结果中。
幻灯片15
4.2.1 简单查询
③LEFT JOIN:规定左外连接。JOIN左侧表中的所
有记录及JOIN右侧表中匹配的记录才会出现在查询结果中。
④RIGHT JOIN:规定右外连接。JOIN右侧表中的所
有记录及JOIN左侧表中匹配的记录才会出现在查询结果中。
⑤[ON 连接条件]:指定连接条件。
⑥[IN 库名]:指定表所在的库。省略表示当前库。
! SQL查询的结果总是一个数据表。
幻灯片16
4.2.1 简单查询
例如:
SELECT 学生.姓名, 学生.性别, 专业.专业名称FROM 专业 INNER JOIN 学生 ON 专业.专业编号
= 学生.专业编号;
SELECT 学生.姓名, 学生.性别, 学生.专业编号FROM 学生 INNER JOIN 学生选课 ON 学生.[学号] = 学生选课.[学号] ;
SELECT 学生.姓名, 学生.性别, 学生.专业编号FROM 学生 LEFT JOIN 学生选课 ON 学生.[学号] = 学生选课.[学号] WHERE (((学生选课.学号) Is Null));
幻灯片17
4.2.1 简单查询
3.单表查询
最简单的查询是从单表中请求得到数据列的值(1) 选择需要的列
SELECT * FROM 学生
SELECT 姓名,出生日期, 性别 FROM 学生SELECT ALL * FROM 学生选课
幻灯片18
4.2.1 简单查询
(2) 列计算
SELECT 学号, 平时成绩*0.3+考试成绩*0.7 as
学期成绩FROM 学生选课
幻灯片19
4.2.1 简单查询
(3) 重复行
在“学生选课”表中列出所有选课的学生学号。
SELECT DISTINCT 学号FROM 学生选课
! “学生选课”表中存储着选课学生的学号,有些学生同时选了几门课,如果直接用SELECT选取就会出
现重复记录。因此,加DISTINCT可去掉重复行。
幻灯片20
4.2.1 简单查询
4. WHERE 子句
指定查询条件。只将满足逻辑表达式的数据作
为查询结果。如果不加WHERE 子句,则所有
数据都作为查询结果。
幻灯片21
4.2.1 简单查询
(1) 逻辑表达式
逻辑表达式一般包括连接条件和过滤条件。
(1)连接条件用于当从多个表中进行数据查询时,指定
表和表之间的连接字段,也可以在FROM的ON子句中
指定连接条件。格式为:
别名1.字段表达式1=别名2.字段表达式2
幻灯片22
4.2.1 简单查询
(2) 过滤条件用于对数据进行筛选时指定筛选条件。
格式为:
别名.字段表达式=值
幻灯片23
4.2.1 简单查询
查询条件
关系条件
复合条件
确定范围
所用符号或关键字=,>,>=,<,<=,=,<>
NOT,AND,OR
BETWEEN… AND (或 NOT BETWEEN…
AND )
包含子项
IN
(或NOT IN)
字符匹配
字符串表达式 [NOT] LIKE <模式> 幻灯片24
4.2.1 简单查询
(2) 有条件查询
(1) 列出2009级学生的学号、姓名等信息。SELECT 学号,姓名,入学成绩FROM 学生where
left(学号,4)="2009“
(2) 查询2009年9月1日入学且入学成绩不低于600 分的学生信息。
SELECT * FROM 学生 where 入学时间
=#2009-9-1# AND 入学成绩>=600
幻灯片25
如果要求某列
的数据在某个
区间内,可以
4.2.1 简单查询
使用该运算符
(3) 列出工资在1000—2000之间的教师信息。
SELECT * FROM 教师 where 工资 BETWEEN
1000 AND 2000
SELECT * FROM 教师 where 工资 NOT
BETWEEN 1000 AND 等价于:
SELECT * FROM 教师
注意:WHERE 工资>= 1000 AND工
资<=2000
BETWEEN包括边界值,而NOT BETWEEN
不包括边界值
2000
幻灯片26
当要求表的列
值是某几个值
中的一个时用
4.2.1 简单查询
IN运算符
(4)列出选修了课程号为“01”和“53”的学
生的学号和成绩。
SELECT 学号,成绩FROM 学生选课WHERE 课程编号IN("01","53")
要求表的列
值是某几个值
中的一个时用in.
等价于:
SELECT 学号,成绩FROM 学生选
课WHERE 课程编号="01" OR 课
程编号="53"
SELECT 学号,成绩FROM 学生选课WHERE
课程编号NOT IN("01","53")
幻灯片27
4.2.1 简单查询
(5)查找考试成绩为空的学生的学号和课程号。
SELECT 学号,课程编号FROM 学生选课WHERE 考试成绩IS NULL
! 注意WHERE不要写成“WHERE 成绩 = NULL”IS NULL的功能是
测试属性值是否为
空值。
SELECT 学号,课程编号 FROM 学生选课 WHERE
考试成绩 IS NOT NULL
SELECT 学号,课程编号 FROM 学生选课 WHERE NOT 考试成绩 IS NULL
幻灯片28
4.2.1 简单查询
(6) 在“教师”表中列出非计算机系的教师信息。SELECT * FROM 教师 WHERE 所属系 <> "计算
机“
或SELECT * FROM 教师 WHERE所属系 != “计
算机“(在SQL SERVER中)
或SELECT * FROM教师WHERE NOT(所属系= "计算机")
幻灯片29
4.2.1 简单查询
(7) LIKE中可使用的通配符
通配含义
匹配零个或多个字符
例子
%
任意类型和长度的字符串
‘李%’
?
匹配任何一个字符
_(下划线)
任何单个字符
#
匹配一个数字
描述可匹配的字符范围
[]
幻灯片30
4.2.1 简单查询
从学生表中查找姓名中第2个字是“天”的学生:SELECT * FROM 学生WHERE 姓名LIKE ‘?天*'
从“学生”表中查找姓“刘”的学生:
SELECT * FROM 学生WHERE (姓名LIKE '刘*' )
SELECT * FROM 学生WHERE (姓名LIKE '刘%' )
幻灯片31
4.2.1 简单查询
5. ORDER子句
指定查询结果排列顺序,一般放在SQL语句的最后。其中:
排序字段:设置排序的字段或表达式。
ASC:按表达式升序排列。(默认)
DESC:按表达式降序排列。
幻灯片32
4.2.1 简单查询
根据“学生”表查询所有入学成绩大于500分的女生的姓名、性别、专业和入学成绩,并按入学成绩升序排列记录。
SELECT 学号,性别,专业,入学成绩FROM 学生WHERE 性别= "女" AND 入学成绩> 500
ORDER BY 入学成绩ASC
ASC是用来指明显示结果的
顺序,在此处可以不加。
幻灯片33
4.2.1 简单查询
列出学生表前3个学生的全部信息
SELECT TOP 3 * FROM 学生 ORDER BY
学号
注意:
TOP是指逻辑头,若存在排序,则是排序后的TOP
幻灯片34
4.2.1 简单查询
6. GROUP子句
对查询结果进行分组统计,统计选项必须是数值型的数据。其中:
分组字段列表:列表中的字段名称的顺序决定了分
组的先后顺序。
可以和GROUP BY 一起使用的统计函数有:sum、avg、max、min、first、last等。
幻灯片35
4.2.1 简单查询
根据学生选课表查询输出已选了课的学生的信
息
SELECT 学号, avg(考试成绩) FROM 学生选课GROUP BY 学号ORDER BY 学号
幻灯片36