
第四章 结构化查询语言-SQL 一、要点解析 4!数据库模式的建立和刷障 4.1.1建立数据库榄式: 格式:cre{hemal databa}[AUTHORIZATION] 语句功能:在计算机系饶中建立一个只有一个名字的空数据库,并定文它的所有者名称, 例如:(1)create schema xues动authorization刘勇 (2 create database教学库 4.1.2刷除数据库榄式 格式:dop{schemaldataba}c数据岸> 语句功能:从计算机系统中刷除一个数据库。 例如l:drop database xues动 42表结构的建立、修政和到聪 4.21建立表结构 格式:create table.K基本表名(,D 语句功能:在当前或给定的数据库中定义一个表的结构。 例如: create table学生( 学号cha7)primary ke 姓名ch6)ot null unique, 性别cha(2)not null check性别-'男'ar性别='女' 出生日期datatime c小ec女出生日期-land课程学分。6) create table选课 学生号cha7 课程号dh4 成绩int check成绩>0and成辏-IO0), primary key(学生号,课程号) foreign key学生号)references学生(学生号), foreign ke课程号)references误程(课程号) 422修改表结构 语句格式:ALT正R TABLE.K基本表名> {ADD-DDK表级完整性约束>DROP COLUM<列
1 第四章 结构化查询语言-SQL 一、要点解析 4.1 数据库模式的建立和删除 4.1.1 建立数据库模式: 格式:creat {schema|database} [AUTHORIZATION] 语句功能:在计算机系统中建立一个只有一个名字的空数据库,并定义它的所有者名称。 例如:(1)create schema xuesh authorization 刘勇 (2)create database 教学库 4.1.2 删除数据库模式 格式:drop {schema|database} 语句功能:从计算机系统中删除一个数据库。 例如:drop database xuesh 4.2 表结构的建立、修改和删除 4.2.1 建立表结构 格式:create table [..](,…[,,…]) 语句功能:在当前或给定的数据库中定义一个表的结构。 例如: create table 学生( 学号 char(7) primary key, 姓名 char(6) not null unique, 性别 char(2) not null check(性别=’男’ or 性别=’女’), 出生日期 datatime check(出生日期=1 and 年级=1 and 课程学分=0 and 成绩..] {ADD ,…|ADD,…|DROP COLUM< 列

名>,DROP,} 语句功能:向已定义过的表中添加一些列的定义或一些表级完整性约束,或者从已定 义过的表中副除一些列域一些完整性钓束。 例如:alter table学生add箱贯ar6们 heak学生drop colum籍贯 4.23副除表结构 语句格式:©pble【,K基本表名> 语句功能:从当前给定的数据库中到除一个表,当然在到除比哦结构的同时也制除了 全部内容, 例如:drop table学生 4.3表内容的插入、修政和别除 4.3.1插入记录 单行插入 语句格式:insert [into]..卜基本表名vue,长基木表名,eg子句> 功修:向一个表中所指定的若干列插入一行或多行数据。 Creste table眼工( 眼工号char6)primary key, 姓名dha8 ot null, 性别ha(2)onul 年龄m, 基本工资1 inesert into积工(积工号,姓名,性别,年龄,基本工货) values0002034,张三,女'28,1560 irsert into职工(职工号,姓名,性别,年龄,基本工货) at期工号,姓名,性别,年龄,基本工资from积工I where性别‘男' 4.32修政记录 语句格式:UPDA正..K目的表名> SET=FROM,]川VHERE列 语句功能:按条件修政一个表中一些列的植。 制如:(1)upde职工t年静=年静十1 (2)p山e期工t基本工货-眼工1基本工货+职工1.职务津贴rm积工1 whe取工取工号=眼工1.职工号 4.33别除记录 语句格式:delete [from].下目的表名r心m源表名>,-I[where 2
2 名>,…|DROP,…} 语句功能:向已定义过的表中添加一些列的定义或一些表级完整性约束,或者从已定 义过的表中删除一些列或一些完整性约束。 例如:alter table 学生 add 籍贯 char(6) alter table 学生 drop colum 籍贯 4.2.3 删除表结构 语句格式:drop table [..] 语句功能:从当前给定的数据库中删除一个表,当然在删除比哦结构的同时也删除了 全部内容。 例如:drop table 学生 4.3 表内容的插入、修改和删除 4.3.1 插入记录 单行插入 语句格式:insert [into][..](,…)values(,…) 多行插入: 语句格式:insert [into][..](,…) 功能:向一个表中所指定的若干列插入一行或多行数据。 Create table 职工( 职工号 char(6) primary key, 姓名 char(8) not null, 性别 char(2) not null, 年龄 int, 基本工资 float ) insert into 职工(职工号,姓名,性别,年龄,基本工资) values(‘0002034’,’张三’,’女’,28,1560) insert into 职工(职工号,姓名,性别,年龄,基本工资) select 职工号,姓名,性别,年龄,基本工资 from 职工 1 where 性别=‘男’ 4.3.2 修改记录 语句格式: UPDATE[..] SET =,…[FROM ,…][WHERE ] 语句功能:按条件修改一个表中一些列的值。 例如:(1)update 职工 set 年龄=年龄+1 (2)update 职工 set 基本工资=职工 1.基本工资+职工 1.职务津贴 from 职工 1 where 职工.职工号=职工 1.职工号 4.3.3 删除记录 语句格式:delete [from] ..][from ,…][where ]

语句功能:副除一个表中满足条件的所有行。 例如,(1)delete from取工where年静>45 (2 delete眼工fom职工1tere职工.职工号-眼工1.职工号 (3)delete眼工 4.4视图的建立,修政和国除 4.4.1建立视图 语句格式:creale view.AS 语句功能:在当前数据库中根据SELECT子句的查询结果建立一个视图。包括视图的 结构和内容。 例如:create view成绩锐图表学生号,姓名,课程号,课程名,成债) 越选课,学生号,姓名,选课,课程号。课程名,成铸 rom学生,误程。选课 whee学生学生号=选误.学生号and课程课程号=选课.误程号 md专业‘电子” 4.42修改祝图内容 语句格式:dc.卜视图名> Gam源表名>,][WHERE逐辑表达式>] 语句功能:按照一定条件对当前或指定数据岸中的一些列值进行修政。 例:upde成镜程图表xt成辏-80 where学生号-‘0102005”md课程号-‘E002' 4.43修改视图定义 语句格式: ALT正R VIEW-)AS 语句功能: 在当前数据库中修政已知视图的列,它与SELECT子句的查询结果相对应, 例如:(1》create view学生视图(学生号,姓名》 运买let学生号,姓名om学生 (2》alter view学生视图(学生号,专业) sle学生号,专业fram学生 4.44刷除视图 语句格式:drop view 语句功能:副除当前数据库中一个视图。 例如,(1)drop view成镜视图表 4.5SQ1.查询 一、eled语句 例,显示表中所有数据 sagt·from student 二、选择列 例:显示表中学号、姓名、性别列的所有数据 select sid.name.sex from student 1,重新对列排序 SELECT name.sex,sid from student
3 语句功能:删除一个表中满足条件的所有行。 例如:(1)delete from 职工 where 年龄>45 (2)delete 职工 from 职工 1 where 职工.职工号=职工 1.职工号 (3) delete 职工 4.4 视图的建立、修改和删除 4.4.1 建立视图 语句格式:create view (,…AS 语句功能:在当前数据库中根据 SELECT 子句的查询结果建立一个视图,包括视图的 结构和内容。 例如:create view 成绩视图表(学生号,姓名,课程号,课程名,成绩) as select 选课,学生号,姓名,选课,课程号,课程名,成绩 from 学生,课程,选课 where 学生.学生号=选课.学生号 and 课程.课程号=选课.课程号 and 专业=‘电子’ 4.4.2 修改视图内容 语句格式:update [..] set =,…[from ,…][WHERE ] 语句功能:按照一定条件对当前或指定数据库中的一些列值进行修改。 例: update 成绩视图表 set 成绩=80 where 学生号=‘0102005’ and 课程号=‘E002’ 4.4.3 修改视图定义 语句格式: ALTER VIEW (,…) AS 语句功能: 在当前数据库中修改已知视图的列, 它与 SELECT 子句的查询结果相对应。 例如:(1)create view 学生视图(学生号,姓名) as select 学生号,姓名 from 学生 (2)alter view 学生视图(学生号,专业) as select 学生号,专业 from 学生 4.4.4 删除视图 语句格式:drop view 语句功能:删除当前数据库中一个视图。 例如:(1)drop view 成绩视图表 4.5SQL 查询 一、select 语句 例:显示表中所有数据 select * from student 二、选择列 例:显示表中学号、姓名、性别列的所有数据 select sid, name, sex from student 1.重新对列排序 SELECT name,sex,sid from student

2,使用文字串 在t关键字后面可以加文字串 select“学号='.sd.'姓名=°,ame from student 3,改变列标思 ect sid AS学号,name AS姓名,AS性别 from student 三、选择行 语法形式 SELECTFOMWHERE ★1.比较 三,之,-20 例5:是示所有年龄不为20的学生情况 select*from student where ape20 ★2.范围Between关键字 例1:暴示19-21岁之间的学生 select+from student where age between 19 and 21 例2:最示成领在8090之间的记录 select*from report where result between 80 and 90 ★3列表N关健字 例1:选释年龄为18,21,22的学生 select from student where age IN(18,21,22) 例2:选出学习“计算机网铬“电子技术“专业的学生 scet·from student where speciality IN(计算机网铬',"电子技术") ★4.字符串模期匹配 匹配符: %:代表0个或多个任意字符 (下划线:代表一个任意学符: [小:指定范围内的任意单个字符 []:不在指定范围内的任意单个字符. 示例: LIKE'BR%':返以日R开始的任意字符串 KE张%':返回以”张开始的任意字符串。 Like%een':运回以”eem结束的任意字符串. ,IKE%EN%':更国有EN的任意字符用 LIKE'[CK': 运目以℃或以"”K“开始的任意字符串
4 2.使用文字串 在 select 关键字后面可以加文字串 select ‘学号=’, sid,’姓名=’ , name from student 3.改变列标题 select sid AS 学号, name AS 姓名, sex AS 性别 from student 三、选择行 语法形式: SELECT FROM WHERE ★ 1. 比较 =, >, =, , ( ) 优先级控制 例 1:查找”张三”这条记录 select * from student WHERE name=’张三’ 例 2:查找 20 岁以上的学生姓名和年龄 select name,age From student Where age>=20 例 3:显示所有年龄不为 20 的学生情况 select * from student where age<>20 ★ 2. 范围 Between 关键字 例 1:显示 19~21 岁之间的学生 select * from student where age between 19 and 21 例 2:显示成绩在 80~90 之间的记录 select * from report where result between 80 and 90 ★ 3. 列表 IN 关键字 例 1:选择年龄为 18,21,22 的学生 select * from student where age IN(18,21,22) 例 2:选出学习“计算机网络”和“电子技术”专业的学生 select * from student where speciality IN (‘计算机网络’,’电子技术’) ★ 4.字符串模糊匹配 匹配符: %:代表 0 个或多个任意字符; _(下划线):代表一个任意字符; [ ]:指定范围内的任意单个字符; [^]:不在指定范围内的任意单个字符。 示例: LIKE ‘BR%’ :返回以”BR”开始的任意字符串。 LIKE ‘张%’:返回以” 张”开始的任意字符串。 Like ‘%een’:返回以”een”结束的任意字符串。 LIKE %EN%’:返回有”EN”的任意字符串。 LIKE ‘[CK]%’: 返回以”C”或以”K”开始的任意字符串

LIKE'[S-V]ing" 运目长为四个字符的字符串,结尾是"ig”,开始是从s到V。 LIKE'MC%': 运目以M开始且第二个字符不是℃"的任意字符串。 例,设s表中有一计算机软件计算机应用“和计算机网铬”专业的若干学生。求 出所有计算机“专业的学生记录 SELECT·from student where speciality like'计算机% ★5.逻拥运算符 运算符:AND与OR或NOT事 制1:选择23岁以上的男月学 select◆from student where age-23ANDx-'男' 例2:选择23岁以上的或男的学生 sclect·from student where age>-230R买x-男 例35:透择所有的20-23岁之间的计算机应用专业的女学生 cad◆from student where age between 20 and 23 and s=女'd speciality=计算机应用 例4:选择计算机软件”或是“电子技术”专业的男生 eat◆from student here平eili的yi'计算机软件”,'电子技术') andx-'男 四、算术运算符 1、算术运算符 +,,·,,%(取模) elect◆fromn student where 2age>40 2、连接运算符 +:把两个或者多个字符数据连接起来 例:t张+志排 五、数据排序 格式:tom [ORDER BY<列名水列表达式 [ASQDESC].】 例1:按年龄持序 select from student order by age 例2:按专业和年龄挂序 select◆from student order by speciality,买 大、合计函数
5 LIKE ‘[S-V]ing’ : 返回长为四个字符的字符串, 结尾是”ing”,开始是从 S 到 V。 LIKE ‘M[^C]%’: 返回以”M”开始且第二个字符不是”C”的任意字符串。 例:设 student 表中有“计算机软件”“计算机应用”和“计算机网络”专业的若干学生。求 出所有“计算机”专业的学生记录 SELECT * from student where speciality like '计算机%' ★5.逻辑运算符 运算符:AND 与 OR 或 NOT 非 例 1:选择 23 岁以上的男同学 select * from student where age>=23 AND sex=’男’ 例 2:选择 23 岁以上的或男的学生 select * from student where age>=23 OR sex=’男’ 例 3:选择所有的 20~23 岁之间的“计算机应用”专业的女学生 select * from student where age between 20 and 23 and sex=‘女’ and speciality=‘计算机应用’ 例 4:选择“计算机软件”或是“电子技术”专业的男生 select * from student where speciality in(‘计算机软件’,’电子技术’) and sex=’男’ 四、算术运算符 1、算术运算符 +,-,*,/,%(取模) select * from student where 2*age>40 2、连接运算符 +: 把两个或者多个字符数据连接起来 例: select '张'+ '志雄' 五、数据排序 格式:select from [ORDER BY | [ASC|DESC],……] 例 1:按年龄排序 select * from student order by age 例 2:按专业和年龄排序 select * from student order by speciality, age 六、合计函数

1.AvG(ALLDISTINCT水表达式>)I 数据表达式的平均值。 2、COUNT([ALLIDISTINCT表达式: 在某个表达式中的数据值的个数。 3、CONT):所选择行的个数 4,MA加表达式中的最大值。 5,M):表达式中的最小值, 6、SUM(ALLDISTINCT可K表达式H 数据表达式的总和值。 例1:求全体学生数 select counl()from student 例2:有多少学生参加考试 select count (distinct sid)from report 例3:求学生的平均年龄 select avglage)from student 例4:求误程号=1的最高成领 sclect MAX(result)from report Where cid-l 制5:求最小男生的年龄 select min(age)from student where sex 例6:求所有课程的学分总和 sat到m(credit)from cours买 七,GROUP BY和HAVING子句 例:求各专业学生的平均年龄 select speciality,avglage)from student group by speciality 2.HAVING子句持除那些不满足条件的组。 例:列出平均年龄>20岁的各专业学生的平均年龄。 select speciality,avglage)from student group by speciality having avg(age)>20 八,COMPUTE和COMPUTE BY子句 1.Compute子句使用合计函数在查询的结果集中生成汇总行 例按专业显示明细的同时生成平均年龄汇总行。 select name,speciality,age from student odk灯by speciality C0 mpute avy以aee) 2,Compute by子句增加各列汇总行 例按专业显示明细的同时生成平均年龄汇总行。 elect speciality,name ag买
6 1、AVG([ALL|DISTINCT]): 数据表达式的平均值。 2、COUNT([ALL|DISTINCT]): 在某个表达式中的数据值的个数。 3、COUNT(*):所选择行的个数。 4、MAX():表达式中的最大值。 5、MIN():表达式中的最小值。 6、SUM([ALL|DISTINCT]): 数据表达式的总和值。 例 1:求全体学生数 select count(*) from student 例 2:有多少学生参加考试 select count (distinct sid) from report 例 3:求学生的平均年龄 select avg(age) from student 例 4:求课程号=1 的最高成绩 select MAX(result) from report Where cid=1 例 5:求最小男生的年龄 select min(age) from student where sex='男' 例 6:求所有课程的学分总和 select sum(credit) from course 七、GROUP BY 和 HAVING 子句 例:求各专业学生的平均年龄 select speciality,avg(age) from student group by speciality 2.HAVING 子句排除那些不满足条件的组。 例:列出平均年龄>20 岁的各专业学生的平均年龄。 select speciality,avg(age) from student group by speciality having avg(age)>20 八、COMPUTE 和 COMPUTE BY 子句 1.Compute 子句使用合计函数在查询的结果集中生成汇总行 例:按专业显示明细的同时生成平均年龄汇总行。 select name, speciality, age from student order by speciality compute avg(age) 2.Compute by 子句增加各列汇总行 例:按专业显示明细的同时生成平均年龄汇总行。 select speciality,name,age

from shudent order by speciality compute avglage)by speciality 注 I在compute子句中出现的列必须出现在该语句的®t_1以中: 2列名必须用在ard:的子句中: 如果使用compute by子句,多须使用 order by子句 (4)在Q0 mpute by子句中出现的列必须小于在od:的子句中出现的列,这些列必须有 同样的从左到右的顺序。 九、连接查询 语法 g表名列名,表名.列名, f©m!表名[连接类型]ON表名2ON! where 1、内连接 用于把两个表连接成第三个表,在第三个表中,仅包合那些满足连接条件的记录行, 例1:显示每位学生的各科考试成锁 select student name,report ci,report result from student INNER JOIN report on student.sid-report.sid 例2:最示课程名称 select student name.course.course.report.result from student JOIN report on student.sid=reportsid JOIN course on report.cid=course cid 2、无限制连接(交又连接) 包含了所连接的两个表中所有行的全部组合。 例:显示学生表与成绩单的所有行的全部组合 select student.sid.report.cid.report.result from student cross join report 3、外连接 只限制其中一个表的行,而不限制另外一个表中的行。 LEFT OUTER JOIN:包括了左表中的全部行, RIGHT OUTER JOIN:包括了右表中的全部行。 FULL OUT正RJON:包括了左表和右表中所有 不满足条件的行。 例:外连接ut和e印or表 select student sid.student name,reportcid,report.result from student LEFTOUTER JOIN report ON student.sid=report sid 4、自连接 就是把某一个表中的行同该表中另外一些行连接起米。 7
7 from student order by speciality compute avg(age) by speciality 注: ⑴在 compute 子句中出现的列必须出现在该语句的 select_list 中; ⑵列名必须用在 order by 子句中; ⑶如果使用 compute by 子句,必须使用 order by 子句 (4)在 compute by 子句中出现的列必须小于在 order by 子句中出现的列,这些列必须有 同样的从左到右的顺序。 九、连接查询 语法: select 表名.列名,表名.列名,…… from {表名 [连接类型] JOIN 表名 2 ON } where 1、 内连接 用于把两个表连接成第三个表,在第三个表中,仅包含那些满足连接条件的记录行。 例 1:显示每位学生的各科考试成绩 select student.name, report.cid,report.result from student INNER JOIN report on student.sid= report.sid 例 2:显示课程名称 select student.name,course.course, report.result from student JOIN report on student.sid= report.sid JOIN course on report.cid=course.cid 2、无限制连接(交叉连接) 包含了所连接的两个表中所有行的全部组合。 例:显示学生表与成绩单的所有行的全部组合 select student.sid,report.cid,report.result from student cross join report 3、外连接 只限制其中一个表的行,而不限制另外一个表中的行。 LEFT OUTER JOIN: 包括了左表中的全部行。 RIGHT OUTER JOIN:包括了右表中的全部行。 FULL OUTER JOIN: 包括了左表和右表中所有 不满足条件的行。 例:外连接 student 和 report 表 select student.sid, student.name, report.cid, report.result from student LEFT OUTER JOIN report ON student.sid= report.sid 4、自连接 就是把某一个表中的行同该表中另外一些行连接起来

例:显示学习同一专业的学员 select a.name.a.speciality.b.name from student a join student b ana.peciali中h.specia where a.nameb.name 注: 1.指定表别名引用表的两个副本。 2.在创建自连接时,每一行匹配它自己,有成对的重复出现,导政重复行.使用he 子句情除这您重复行。 二、典型例题 P110书上的课后习题就是该章的典型例题. 课后练习答案如下: 一填空题: 1、视图。基本表 2、非过程化,集合 3、KUCUN,IU 4、列级。表级 5、主码约束,单植约束,外码约束,检查约束 6、primary key.foreign key ?、建立表,继政表结构。酬除表结构 8、单行,多行 9、扬入。修政。副除 10. 基本表,产生 11. 查询,修改 12. 基本表,视图 13. 没有影响,有影响 14 create viewalter view,drop view 15. 投影。连接。选释 16 group by,order by 17、 中阿连接,左违接,右连接 二、按属下列每条查淘命令相应的功能 1、从简品晖中查询出每一种商品的商品代号、分类名、数量和品牌信息。 2、从育品库中查询所有商品的品牌。 3、从育品库中查询品神为“德猫”或“春兰”的商品的育品代号、分类名、产地、品牌 4、从教学岸中查询出每门误程被选修的学生登量。 5、从教学库中查询选修了一门课程的学生信息 6、从教学库中查询网s1选修了但@2没有选修的课程的信息。 7、从教学岸中查淘被选修了的课程的信息, 8、从教学岸中查询选修了3门误的全部学生, 9、从教学零中查询各专业的人数,并按专业人数由高到低排序。 10. 从教学库中查询学生选修课程的所有信息,并拔学号和成锁生序排序
8 例:显示学习同一专业的学员 select a.name,a.speciality,b.name from student a join student b on a.speciality=b.speciality where a.name<>b.name 注: 1.指定表别名引用表的两个副本。 2.在创建自连接时,每一行匹配它自己,有成对的重复出现,导致重复行。使用 where 子句清除这些重复行。 二、典型例题 P110 书上的课后习题就是该章的典型例题。 课后练习答案如下: 一填空题: 1、 视图,基本表 2、 非过程化,集合 3、 KUCUN,LIU 4、 列级,表级 5、 主码约束,单值约束,外码约束,检查约束 6、 primary key,foreign key 7、 建立表,修改表结构,删除表结构 8、 单行,多行 9、 插入, 修改,删除 10、 基本表,产生 11、 查询,修改 12、 基本表,视图 13、 没有影响,有影响 14、 create view,alter view,drop view 15、 投影,连接,选择 16、 group by,order by 17、 中间连接,左连接,右连接 二、按照下列每条查询命令相应的功能 1、 从商品库中查询出每一种商品的商品代号、分类名、数量和品牌信息。 2、 从商品库中查询所有商品的品牌。 3、 从商品库中查询品牌为“熊猫”或“春兰”的商品的商品代号、分类名、产地、品牌。 4、 从教学库中查询出每门课程被选修的学生数量。 5、 从教学库中查询选修了一门课程的学生信息。 6、 从教学库中查询@s1 选修了但@s2 没有选修的课程的信息。 7、 从教学库中查询被选修了的课程的信息。 8、 从教学库中查询选修了 3 门课的全部学生。 9、 从教学库中查询各专业的人数,并按专业人数由高到低排序。 10、 从教学库中查询学生选修课程的所有信息,并按学号和成绩生序排序

三、按写列给出的每项功修写出相应的查询命令。 1、sgX商品代号,单价数量,产地FOM商品表1X商品表2 Y WHERE X商品代号 -Y商品代号 2、SELECT COUNT)FROM商品表1 WHERE数量BETWEEN I0AND20 3.SELECT分类名,AVG(数量)AS平均数量FROM商品表1 GROUP BY分类名 4、Select·frem商品表1whee单价>=2000ow数量>=15 5、Selg·from商品表1 where单价>al(select avg单价)frem商品表1) 6、Select分类名iom商品表I group by分类名having count("I 7、S商品代号,单价*数量越总价值fom商品表1 NTO总价值表 Seleet·fem商品表1 order by总价值des实
9 三、按写列给出的每项功能写出相应的查询命令。 1、 select x.商品代号,单价,数量,产地 FROM 商品表 1 X,商品表 2 Y WHERE X.商品代号 =Y.商品代号 2、 SELECT COUNT(*) FROM 商品表 1 WHERE 数量 BETWEEN 10 AND 20 3、 SELECT 分类名,AVG(数量) AS 平均数量 FROM 商品表 1 GROUP BY 分类名 4、 Select * from 商品表 1 where 单价>=2000 or 数量>=15 5、 Select * from 商品表 1 where 单价>all(select avg(单价) f rom 商品表 1) 6、 Select 分类名 from 商品表 1 group by 分类名 having count(*)>1 7、 Select 商品代号,单价*数量 as 总价值 from 商品表 1 INTO 总价值表 Select * from 商品表 1 order by 总价值 desc