SQL概述
二,SQL的特点
?综合统一
?高度非过程化
?面向集合的操作方式
?以同一种语法结构提供两种使用方式
?语言简捷、易学易用
一,SQL语言的基本功能
定义、查询、操纵、控制
二,SQL语言的基本概念
三级体系结构
?一个 SQL数据库是一组表的汇集
?一个 SQL数据库中的表分为 视图
和 基表
?一个基表可对应一个或多个存储
文件,一个存储文件也可存放一个
或多个基表
?用户通过 SQL语句对视图和基表
进行查询和其他操作。
SQL
视图 2视图 1
基表 4基表 3基表 2基表 1
存储文件 2存储文件 1
外模式
模式
内模式
?SQL Server的初步认识
?SQL语言
?数据的定义
?定义基本表,CREATE TABLE
说明,1.在 SQL语句中不区分大小写
2.UNIQUE,PRIMARY KEY的区别,
在一个表中只能定义一个 PRIMARY KEY,
不允许空值;而 UNIQUE可定义多个,且
允许空值
3.在 SQL Server中支持的数据类型
4.自动计数和标识符列,IDENTITY,GUID
注,GUID可由 NEWID()自动创建
?修改基本表,ALTER TABLE
?删除基本表,DROP TABLE
?建立与删除索引
?数据的查询:数据库的核心操作
?语法:
?选择若干列
?选择若干元组
1,消除重复的行
2,查询满足条件的元组
?对查询结果排序
说明:
1,要排序的列,可为列名,列的别名或表达式
Order by order_by_expression [ASC|DESC]
例:查询全体学生情况,结果按学生的出生
年份的降序排列
2,在排序时,空值最大
3,查询结果多个列排序时,排序列间用“,”隔开
?使用集函数
?对查询结果分组
说明:
1,Group by对 where子句的结果进行分组。
2,Having子句只能在 Group by后出现,不能单独使用。
3,Having子句只能对分组计算的结果进行筛选。
4,Having子句不能使用别名。
例:检索选课人数超过 1人的课程号及相应人数
关于 Where子句,group by子句和 having子句的区别
?Where子句:作用于 table,view
?group by子句:对查询结果分组,目的是为了
细化集合函数的作用对象。
?having子句:对分组后的结果进行筛选。
例,1、列出各科成绩的最高分及最低分
2,按平均成绩从高到低顺序,列印出所有学生的三
门课( 1,2,3)的成绩。其列印格式如下:
Sno 课程一 课程二 课程三 有效课程数 有效平均分
3,按各科平均成绩从低到高和及格率的百分数从高
到低顺序,统计并列印各科平均成绩和及格率百分数。
4,统计列印各科成绩各分数段人数
?笛卡尔积:
?等值与非等值连接:
?同一个表自身连接:
?外连接:
1,左连接
2,右连接
3,完整外连接
Tableref join tableref on <join_condition>
Left join…on…
right join…on…
full join…on…
?复合条件连接:
?多表连接 Inner merge join …on..inner hash join…on
?连接查询
?子查询
?返回一个值的子查询,
例 2,检索与 95001学生在同一个系的所有学生信息
例 1,查询选修了课的的学生信息(学号、姓名、课程名、成绩)
注,1.子查询可嵌套,而嵌套的层次由系统决定
2.在子查询中不能用 order by
3.子查询一般用()括起
?内外层查询相互依赖:
例 3,检索成绩> 85的学生名称
例 4,Sno 课程一 课程二 课程三 有效课程数 有效平均分
例 5,返回每门课成绩最高的学生信息及课程信息。
?内外层查询相互独立:
(不包括 95001)
?返回一个集合的子查询,
?[NOT]IN:元素与某一集合进行比较。
?ANY:任一个
?ALL:所有的
?EXISTS:存在量词
和比较运算符使用的子查询
例:学生刘晨没选的课程号。
例:学生刘晨没选的课程号。
注:有些 IN子查询可以用连接代替,有些不可以。
注:可以用集函数代替,且查询效率高些。
注:可以代替前面的子查询
例:请分别用关系代数和 SQL语言进行下列的查询:
1、求被所有学生选修的课程名
2、没有被任何学生选的课程名
3、只有‘ 95001’选修了的课程名
4、求‘ 95001’选了但‘ 95002’未选的课程名
例题
?集合查询
多个 select语句的结果可进行集合操作
并操作 UNION
交操作 INTERSECT
差操作 MINUS
注:标准的 SQL中没有直接提供集合交和差操作
查询综合例题:
教学数据库中有四个表:
教师情况基本表 T(TNO,TN,TD);
课程基本表 C(CNO,CN,TNO);
学生情况基本表 S(SNO,SN,SA,SEX);
学习成绩基本表 SC(SNO,CNO,G);
用 SQL语句完成如下查询:
1) 查询所有女生的姓名和年龄。
2) 查询计算机系教师开设的所有课程的课程号和课程名。
3) 查询选修“微机原理”的所有学生的姓名和成绩。
4) 查询未选修“高等数学”的所有学生的姓名和成绩。
5) 查询不是计算机系教师讲授的课程的课程名和课程号
6) 查询年龄在 18到 20岁(包括 18和 20)间的所有学生信息。
7) 查询至少选修了“高等数学”或“普通物理”的学
生姓名。
8) 查询男、女同学各多少人。
9) 查询每门课的学生选修人数(只输出超过 10人的课
程)要求输出课程号和选修人数,查询结果按人数
降序排列,若人数同,按课程号升序排列。
10) 查询至少选修了两门课程的学生学号。
11) 查询至少讲授两门课程的教师姓名和其所在系。
12) 查询年龄大于女生平均的男生的姓名和年龄。
13) 查询年龄大于所有女生年龄的男生姓名和年龄。
14) 查询只选修了一门课程的学生学号和姓名。
查询小结:
SELECT [ALL|DISTINCT] <目标列表达式 >[别名 ] [,<目
标列表达式 >[别名 ]]… FROM < 表名或视图名 >[别名 ] [,
<表名或视图名 >[别名 ]]… [WHERE < 条件表达式 >]
[GROUP BY<列名 >[ HAVING<条件表达式 >]] [ORDER
BY<列名 > [ASC|DESC]]
作业
P148,5 (1)-(6)
数据更新
一、插入数据
(一),INSERT INTO,向数据表中添加一个或多个新行,
1、语法:
INSERT INTO TABLEREF[( COLNAME1,|
COLNAME2,… )] VALUES( EXPR| NULL,
EXPR| NULL] … )| SUBQUERY
⑴ 使用 VALUES结构:一次只能插入一条记录。
例,向 STUDENT表插入一条新记录(学号,95021,年龄,20)
?在列表中没指定的列,都必须允许为空,或
有默认指派值。
注:
?提供的数据值类型必和列表相匹配。
⑵ 用 select子查询来添加数据:
添加的数据来自于其它表或视图
?在 INTO子句中没指定列表,则新插入的记录必须
在每个属性列均有值。
(二) SELECT INTO
用查询的结果集来创建新数据表,数据表的
名字在子句中定义。
例:把 95001学生的选修课程情况放入一个 NEWTABLE表
(三)大量数据复制 SQL SERVER DTS
开始 导入导出数据
企业管理器 数据库 任务 导入导出数据
二、修改数据,UPDATE
(一)功能:
修改单独一个行、一组行或者数据表或视图中所有行的
数据。还可用该语句来更新远程服务器上的行。
(二)语法:
UPDATE tableref
SET colname={expr|NULL|subquery,}…
[WHERE search_condition | FROM subquery]
其中:
1,SET子句:指定要被修改的列及对于该列的新值。
例:将所有学生的各科成绩上调 10%
UPDATE SC
SET GRADE= GRADE* 1.1
2,WHERE子句:指定要更新的行。
例:把 95001学生的各科成绩上调 10%
UPDATE SC
SET GRADE= GRADE* 1.1
WHERE SNO=’ 95001’
3,FROM子句:从多个数据表和视图中取数据
例:请把刘晨各科成绩上调 10%
UPDATE SC
SET GRADE= GRADE* 1.1
FROM SC JOIN STUDENT S
ON SC.SNO= STUDENT.SNO
WHERE S.SNAME=’刘晨’
注意,UPDATE语句只能对一个表进行修改。以下写法 错
误。
UPDATE SC
SET SC.GRADE= GRADE* 1.1
(三)删除数据
1,功能:从表中删除满足条件的记录。
2,注意:
1) DELETE语句只删除表中的记录,并不删除表结
构。用 DROP TABLE删除表结构。
2) 删改表时,要考虑数据的完整性。
?从表记录存在时,不能删除主表记录。
?先删关联的从表记录,再删主表记录。
二,SQL的特点
?综合统一
?高度非过程化
?面向集合的操作方式
?以同一种语法结构提供两种使用方式
?语言简捷、易学易用
一,SQL语言的基本功能
定义、查询、操纵、控制
二,SQL语言的基本概念
三级体系结构
?一个 SQL数据库是一组表的汇集
?一个 SQL数据库中的表分为 视图
和 基表
?一个基表可对应一个或多个存储
文件,一个存储文件也可存放一个
或多个基表
?用户通过 SQL语句对视图和基表
进行查询和其他操作。
SQL
视图 2视图 1
基表 4基表 3基表 2基表 1
存储文件 2存储文件 1
外模式
模式
内模式
?SQL Server的初步认识
?SQL语言
?数据的定义
?定义基本表,CREATE TABLE
说明,1.在 SQL语句中不区分大小写
2.UNIQUE,PRIMARY KEY的区别,
在一个表中只能定义一个 PRIMARY KEY,
不允许空值;而 UNIQUE可定义多个,且
允许空值
3.在 SQL Server中支持的数据类型
4.自动计数和标识符列,IDENTITY,GUID
注,GUID可由 NEWID()自动创建
?修改基本表,ALTER TABLE
?删除基本表,DROP TABLE
?建立与删除索引
?数据的查询:数据库的核心操作
?语法:
?选择若干列
?选择若干元组
1,消除重复的行
2,查询满足条件的元组
?对查询结果排序
说明:
1,要排序的列,可为列名,列的别名或表达式
Order by order_by_expression [ASC|DESC]
例:查询全体学生情况,结果按学生的出生
年份的降序排列
2,在排序时,空值最大
3,查询结果多个列排序时,排序列间用“,”隔开
?使用集函数
?对查询结果分组
说明:
1,Group by对 where子句的结果进行分组。
2,Having子句只能在 Group by后出现,不能单独使用。
3,Having子句只能对分组计算的结果进行筛选。
4,Having子句不能使用别名。
例:检索选课人数超过 1人的课程号及相应人数
关于 Where子句,group by子句和 having子句的区别
?Where子句:作用于 table,view
?group by子句:对查询结果分组,目的是为了
细化集合函数的作用对象。
?having子句:对分组后的结果进行筛选。
例,1、列出各科成绩的最高分及最低分
2,按平均成绩从高到低顺序,列印出所有学生的三
门课( 1,2,3)的成绩。其列印格式如下:
Sno 课程一 课程二 课程三 有效课程数 有效平均分
3,按各科平均成绩从低到高和及格率的百分数从高
到低顺序,统计并列印各科平均成绩和及格率百分数。
4,统计列印各科成绩各分数段人数
?笛卡尔积:
?等值与非等值连接:
?同一个表自身连接:
?外连接:
1,左连接
2,右连接
3,完整外连接
Tableref join tableref on <join_condition>
Left join…on…
right join…on…
full join…on…
?复合条件连接:
?多表连接 Inner merge join …on..inner hash join…on
?连接查询
?子查询
?返回一个值的子查询,
例 2,检索与 95001学生在同一个系的所有学生信息
例 1,查询选修了课的的学生信息(学号、姓名、课程名、成绩)
注,1.子查询可嵌套,而嵌套的层次由系统决定
2.在子查询中不能用 order by
3.子查询一般用()括起
?内外层查询相互依赖:
例 3,检索成绩> 85的学生名称
例 4,Sno 课程一 课程二 课程三 有效课程数 有效平均分
例 5,返回每门课成绩最高的学生信息及课程信息。
?内外层查询相互独立:
(不包括 95001)
?返回一个集合的子查询,
?[NOT]IN:元素与某一集合进行比较。
?ANY:任一个
?ALL:所有的
?EXISTS:存在量词
和比较运算符使用的子查询
例:学生刘晨没选的课程号。
例:学生刘晨没选的课程号。
注:有些 IN子查询可以用连接代替,有些不可以。
注:可以用集函数代替,且查询效率高些。
注:可以代替前面的子查询
例:请分别用关系代数和 SQL语言进行下列的查询:
1、求被所有学生选修的课程名
2、没有被任何学生选的课程名
3、只有‘ 95001’选修了的课程名
4、求‘ 95001’选了但‘ 95002’未选的课程名
例题
?集合查询
多个 select语句的结果可进行集合操作
并操作 UNION
交操作 INTERSECT
差操作 MINUS
注:标准的 SQL中没有直接提供集合交和差操作
查询综合例题:
教学数据库中有四个表:
教师情况基本表 T(TNO,TN,TD);
课程基本表 C(CNO,CN,TNO);
学生情况基本表 S(SNO,SN,SA,SEX);
学习成绩基本表 SC(SNO,CNO,G);
用 SQL语句完成如下查询:
1) 查询所有女生的姓名和年龄。
2) 查询计算机系教师开设的所有课程的课程号和课程名。
3) 查询选修“微机原理”的所有学生的姓名和成绩。
4) 查询未选修“高等数学”的所有学生的姓名和成绩。
5) 查询不是计算机系教师讲授的课程的课程名和课程号
6) 查询年龄在 18到 20岁(包括 18和 20)间的所有学生信息。
7) 查询至少选修了“高等数学”或“普通物理”的学
生姓名。
8) 查询男、女同学各多少人。
9) 查询每门课的学生选修人数(只输出超过 10人的课
程)要求输出课程号和选修人数,查询结果按人数
降序排列,若人数同,按课程号升序排列。
10) 查询至少选修了两门课程的学生学号。
11) 查询至少讲授两门课程的教师姓名和其所在系。
12) 查询年龄大于女生平均的男生的姓名和年龄。
13) 查询年龄大于所有女生年龄的男生姓名和年龄。
14) 查询只选修了一门课程的学生学号和姓名。
查询小结:
SELECT [ALL|DISTINCT] <目标列表达式 >[别名 ] [,<目
标列表达式 >[别名 ]]… FROM < 表名或视图名 >[别名 ] [,
<表名或视图名 >[别名 ]]… [WHERE < 条件表达式 >]
[GROUP BY<列名 >[ HAVING<条件表达式 >]] [ORDER
BY<列名 > [ASC|DESC]]
作业
P148,5 (1)-(6)
数据更新
一、插入数据
(一),INSERT INTO,向数据表中添加一个或多个新行,
1、语法:
INSERT INTO TABLEREF[( COLNAME1,|
COLNAME2,… )] VALUES( EXPR| NULL,
EXPR| NULL] … )| SUBQUERY
⑴ 使用 VALUES结构:一次只能插入一条记录。
例,向 STUDENT表插入一条新记录(学号,95021,年龄,20)
?在列表中没指定的列,都必须允许为空,或
有默认指派值。
注:
?提供的数据值类型必和列表相匹配。
⑵ 用 select子查询来添加数据:
添加的数据来自于其它表或视图
?在 INTO子句中没指定列表,则新插入的记录必须
在每个属性列均有值。
(二) SELECT INTO
用查询的结果集来创建新数据表,数据表的
名字在子句中定义。
例:把 95001学生的选修课程情况放入一个 NEWTABLE表
(三)大量数据复制 SQL SERVER DTS
开始 导入导出数据
企业管理器 数据库 任务 导入导出数据
二、修改数据,UPDATE
(一)功能:
修改单独一个行、一组行或者数据表或视图中所有行的
数据。还可用该语句来更新远程服务器上的行。
(二)语法:
UPDATE tableref
SET colname={expr|NULL|subquery,}…
[WHERE search_condition | FROM subquery]
其中:
1,SET子句:指定要被修改的列及对于该列的新值。
例:将所有学生的各科成绩上调 10%
UPDATE SC
SET GRADE= GRADE* 1.1
2,WHERE子句:指定要更新的行。
例:把 95001学生的各科成绩上调 10%
UPDATE SC
SET GRADE= GRADE* 1.1
WHERE SNO=’ 95001’
3,FROM子句:从多个数据表和视图中取数据
例:请把刘晨各科成绩上调 10%
UPDATE SC
SET GRADE= GRADE* 1.1
FROM SC JOIN STUDENT S
ON SC.SNO= STUDENT.SNO
WHERE S.SNAME=’刘晨’
注意,UPDATE语句只能对一个表进行修改。以下写法 错
误。
UPDATE SC
SET SC.GRADE= GRADE* 1.1
(三)删除数据
1,功能:从表中删除满足条件的记录。
2,注意:
1) DELETE语句只删除表中的记录,并不删除表结
构。用 DROP TABLE删除表结构。
2) 删改表时,要考虑数据的完整性。
?从表记录存在时,不能删除主表记录。
?先删关联的从表记录,再删主表记录。