数据库原理第4章sql语言基础_第1页
数据库原理第4章sql语言基础_第2页
数据库原理第4章sql语言基础_第3页
数据库原理第4章sql语言基础_第4页
数据库原理第4章sql语言基础_第5页
已阅读5页,还剩113页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、数据库原理与应用高等院校计算机教材系列第4章 SQL语言基础4.1 基本概念4.2 SQL的数据类型 4.3 基本表的定义、删除及修改 4.4 数据查询功能 4.5 数据更改功能 4.6 建立与删除索引4.1 基本概念4.1.1 SQL语言的发展 4.1.2 SQL语言的特点4.1.3 SQL语言功能概述 4.1.1 SQL语言的发展1986年10月由美国ANSI 公布最早的SQL标准。 1989年4月,ISO提出了具备完整性特征的SQL,称为SQL-89 。1992年11月,ISO又公布了新的SQL标准,称为SQL-92(以上均为关系形式)。 1999年颁布SQL-99,是SQL92的扩展。

2、4.1.2 SQL语言的特点1. 一体化。 2. 高度非过程化。 3. 简洁。 4. 使用方式多样。4.1.3 SQL语言功能概述SQL功能命令动词数据查询SELECT数据定义CREATE、DROP、ALTER数据操纵INSERT、UPDATE、DELETE数据控制GRANT、REVOKE四部分:数据定义功能、数据控制功能、数据查询功能和数据操纵功能。 4.2 SQL的数据类型数值型 字符串型日期时间型货币型数值型准确型 整数Bigint: 8字节, Int:4字节Smallint:2字节, Tinyint:1字节 Bit:1位,存储1或0小数Numeric(p,q)或Decimal(p,q)

3、, 其中:p为数字位长度,q:小数位长度。近似型 Float:8字节 Real:4字节字符串型普通编码字符串类型统一字符编码字符串类型二进制字符串类型普通编码字符串类型Char(n):定长存储,n=8000 Varchar(n):不定长存储(按实际长度存储),长度最大不超过n , n=8000 注:n 为字符个数Text:存储大于8000字节的文本统一字符编码字符串类型nchar(n):定长存储,n=4000 nvarchar(n):不定长存储,长度最大不超过n , n=4000 ntext:存储大于8000字节的文本特点:每个字符占两个字节二进制字符串类型Binary(n):固定长度,n =

4、 8000。Varbinary(n):可变长度,n 8000 。注:n为二进制数据的字节数image:大容量、可变长二进制字符数据,可用于存储文件。日期时间型Datetime:8字节,年月日时分秒毫秒(例:2001/08/03 10:30:00.000 ) SmallDateTime:4字节,年月日时分 (例: 2001/08/03 10:30:00 )日期、时间的输入格式货币类型Money: 8 个字节,精确到货币单位的千分之十。Smallmoney: 4 个字节,精确到货币单位的千分之十。限制到小数点后 4 位。可以带有适当的货币符号。例如,100 英镑可表示为 100。4.3 基本表的定

5、义、删除及修改 4.3.1 基本表的定义与删除 4.3.2 修改表结构 4.3.1 基本表的定义与删除1定义基本表 使用SQL语言中的CREATE TABLE语句实现,其一般格式为:CREATE TABLE ( 列级完整性约束定义, 列级完整性约束定义 , 表级完整性约束定义 ) 在列级完整性约束定义处可以定义的约束NOT NULL:限制列取值非空。DEFAULT:给定列的默认值。UNIQUE:限制列取值不重。CHECK:限制列的取值范围。PRIMARY KEY:指定本列为主码。FOREIGN KEY:定义本列为引用其他表的外码。使用形式为:FOREIGN KEY() REFERENCES (

6、) 几点说明NOT NULL和DEFAULT只能是列级完整性约束;其他约束均可在表级完整性约束处定义。注意以下几点:第一,如果CHECK约束是定义多列之间的取值约束,则只能在表级完整性约束处定义;第二,如果表的主码由多个列组成,则也只能在表级完整性约束处定义,并将主码列用括号括起来,即:PRIMARY KEY(列1,列2 );第三,如果在表级完整性约束处定义外码,则“FOREIGN KEY ()”部分不能省。约束定义 列取值非空约束 NOT NULL例:sname char(10) NOT NULL约束定义(续) 表主码约束在定义列时定义主码(仅用于单列主码)列定义 PRIMARY KEY例:

7、 SNO char(7) PRIMARY KEY在定义完列时定义主码(用于单列或多列主码)PRIMARY KEY ()例: PRIMARY KEY(SNO) PRIMARY KEY(SNO,CNO)约束定义(续)外码引用约束指明本表外码列引用的表及表中的主码列。 FOREIGN KEY ()REFERENCES ()例: FOREIGN KEY (sno) REFERENCES 学生表(sno)约束定义(续)默认值约束格式:DEFAULT 默认值例:定义系的默认值为“计算机系”。 DEFAULT 计算机系约束定义(续)CHECK约束格式:CHECK (约束表达式)例:定义成绩大于等于0。 CH

8、ECK ( grade = 0 )约束定义(续)UNIQUE约束在列级约束定义(仅用于单列约束)列定义 UNIQUE例: SNAME char(7) UNIQUE在表级约束定义(用于单列或多列组合约束)UNIQUE ()例: UNIQUE (SNO,CNO)创建学生表CREATE TABLE Student ( Sno char ( 7 ) PRIMARY KEY, Sname char ( 10 ) NOT NULL, Ssex char (2) CHECK (Ssex = 男 OR Ssex = 女), Sage tinyint CHECK (Sage = 15 AND Sage 0),

9、Semester tinyint CHECK (Semester 0), Period int CHECK (Period 0), PRIMARY KEY(Cno) ) 创建SC表CREATE TABLE SC ( Sno char(7) NOT NULL, Cno char(10) NOT NULL, Grade tinyint, CHECK (Grade = 0 and Grade = 100), PRIMARY KEY ( Sno, Cno ), FOREIGN KEY ( Sno ) REFERENCES Student ( Sno ), FOREIGN KEY ( Cno ) REF

10、ERENCES Course ( Cno ) )删除表当确信不再需要某个表时,可以将其删除删除表时会将与表有关的所有对象一起删掉,包括表中的数据。删除表的语句格式为:DROP TABLE , 例:删除test表的语句为:DROP TABLE test4.3.2 修改表结构 在定义完表之后,如果需求有变化,比如添加列、删除列或修改列定义,可以使用ALTER TABLE语句实现。ALTER TABLE语句可以对表添加列、删除列、修改列的定义、定义主码、外码,也可以添加和删除约束。 修改表结构语法ALTER TABLE ALTER COLUMN | ADD COLUMN | DROP COLUMN

11、| ADD PRIMARY KEY(列名 , n ) | ADD FOREIGN KEY(列名) REFERNECES 表名(列名)示例例2为SC表添加“修课类别”列,此列的定义为:XKLB char(4)ALTER TABLE SC ADD XKLB char(4) NULL 示例例3将新添加的XKLB的类型改为 char(6)。ALTER TABLE SC ALTER COLUMN XKLB char(6)示例例4删除Course表的Period列。 ALTER TABLE Course DROP COLUMN Period 4.4 数据查询功能 4.4.1 查询语句的基本结构4.4.2

12、简单查询4.4.3 多表连接查询4.4.4 子查询 查询语句基本格式SELECT -需要哪些列 FROM -来自于哪些表 WHERE -根据什么条件 GROUP BY HAVING ORDER BY 4.4.2 简单查询1. 选择表中若干列 之1. 查询指定的列查询表中用户感兴趣的部分属性列。例5:查询全体学生的学号与姓名。SELECT Sno,Sname FROM Student例6:查询全体学生的姓名、学号和所在系。SELECT Sname,Sno,Sdept FROM Student 2. 查询全部列 例7查询全体学生的记录SELECT Sno,Sname,Ssex, Sage, Sde

13、pt FROM Student等价于: SELECT * FROM Student 3. 查询经过计算的列 例8查询全体学生的姓名及其出生年份。SELECT Sname,2006 - Sage FROM Student例9查询全体学生的姓名和出生年份所在系,并在出生年份列前加入一个列,此列的每行数据均为出生年份常量值。SELECT Sname,出生年份, 2006-Sage FROM Student 改变列标题 语法:列名 | 表达式 AS 列标题或:列标题 列名 | 表达式例: SELECT Sname 姓名,Year of Birth 出生年份, 2006 - Sage 年份, FROM

14、Student 4.4.2 简单查询2. 选择表中若干元组 之1. 消除取值相同的记录例10在修课表中查询有哪些学生修了课程,要求列出学生的学号。 SELECT Sno FROM SC结果中有重复的行。用DISTINCT关键字可以去掉结果中的重复行。DISTINCT关键字放在SELECT词的后边、目标列名序列的前边。SELECT DISTINCT Sno FROM SC2. 查询满足条件的元组 查询条件谓 词比较运算符=, , =, , =, (或!=)NOT+比较运算符 确定范围BETWEENAND, NOT BETWEENAND确定集合IN, NOT IN字符匹配LIKE, NOT LIK

15、E 空值IS NULL, IS NOT NULL逻辑谓词)AND, OR比较大小例11查询计算机系全体学生的姓名。SELECT Sname FROM Student WHERE Sdept = 计算机系例12查询年龄在20岁以下的学生的姓名及年龄。SELECT Sname, Sage FROM Student WHERE Sage 20例13查询考试成绩有不及格的学生的学号 SELECT DISTINCT Sno FROM SC WHERE Grade 60确定范围用BETWEENAND和NOT BETWEENAND是逻辑运算符,可以用来查找属性值在或不在指定范围内的元组,其中BETWEEN后

16、边指定范围的下限,AND后边指定范围的上限。BETWEENAND的格式为: 列名 | 表达式 NOT BETWEEN 下限值 AND 上限值如果列或表达式的值在不在下限值和上限值范围内,则结果为True,表明此记录符合查询条件。 示例例14查询年龄在2023岁之间的学生的姓名、所在系和年龄。SELECT Sname, Sdept, Sage FROM Student WHERE Sage BETWEEN 20 AND 23例15查询年龄不在2023之间的学生姓名、所在系和年龄。SELECT Sname, Sdept, Sage FROM Student WHERE Sage NOT BETWE

17、EN 20 AND 23确定集合使用IN运算符。用来查找属性值属于指定集合的元组。格式为: 列名 NOT IN (常量1, 常量2, 常量n)当列中的值与IN中的某个常量值相等时,则结果为True,表明此记录为符合查询条件的记录;NOT IN:当列中的值与某个常量值相同时,则结果为False,表明此记录为不符合查询条件的记录 示例例16查询信息系、数学系和计算机系学生的姓名和性别。SELECT Sname, Ssex FROM Student WHERE Sdept IN (信息系, 数学系, 计算机系)例17查询既不是信息系、数学系,也不是计算机系学生的姓名和性别。SELECT Sname,

18、 Ssex FROM Student WHERE Sdept NOT IN (信息系, 数学系, 计算机系)字符匹配使用LIKE运算符一般形式为: 列名 NOT LIKE 匹配串中可包含如下四种通配符:_:匹配任意一个字符;%:匹配0个或多个字符; :匹配 中的任意一个字符; :不匹配 中的任意一个字符 示例例18查询姓张的学生的详细信息。SELECT * FROM Student WHERE Sname LIKE 张%例19查询学生表中姓张、李和刘的学生的情况。SELECT * FROM Student WHERE Sname LIKE 张李刘%例20查询名字中第2个字为小或大的学生的姓名和

19、学号 SELECT Sname, Sno FROM Student WHERE Sname LIKE _小大%示例(续)例21查询所有不姓“刘”的学生。SELECT Sname FROM Student WHERE Sname NOT LIKE 刘%例22查询学号的最后一位不是2、3、5的学生情况。SELECT * FROM Student WHERE Sno LIKE %235 涉及空值的查询空值(NULL)在数据库中表示不确定的值。例如,学生选修课程后还没有考试时,这些学生有选课记录,但没有考试成绩,因此考试成绩为空值。判断某个值是否为NULL值,不能使用普通的比较运算符。判断取值为空的语

20、句格式为:列名 IS NULL判断取值不为空的语句格式为:列名 IS NOT NULL 示例例23查询无考试成绩的学生的学号和相应的课程号。SELECT Sno, Cno FROM SC WHERE Grade IS NULL例24查询所有有考试成绩的学生的学号和课程号。SELECT Sno, Cno FROM SC WHERE Grade IS NOT NULL 多重条件查询在WHERE子句中可以使用逻辑运算符AND和OR来组成多条件查询。用AND连接的条件表示必须全部满足所有的条件的结果才为True;用OR连接的条件表示只要满足其中一个条件结果即为True。例25查询计算机系年龄在20岁以

21、下的学生姓名。SELECT Sname FROM Student WHERE Sdept = CS AND Sage 20 4.4.2 简单查询3. 对查询结果进行排序 之对查询结果进行排序可对查询结果进行排序。 排序子句为:ORDER BY ASC | DESC , 说明:按进行升序(ASC)或降序(DESC)排序。示例例26将学生按年龄的升序排序。SELECT * FROM Student ORDER BY Sage例27查询选修了c02号课程的学生的学号及其成绩,查询结果按成绩降序排列。SELECT Sno, Grade FROM SCWHERE Cno=c02 ORDER BY Gra

22、de DESC 例28查询全体学生的信息,查询结果按所在系的系名升序排列,同一系的学生按年龄降序排列。SELECT * FROM StudentORDER BY Sdept, Sage DESC 4.4.2 简单查询4. 使用计算函数汇总数据 之使用计算函数汇总数据 SQL提供的计算函数有:COUNT( * ):统计表中元组个数;COUNT(DISTINCT ):统计本列列值个数;SUM(DISTINCT ):计算列值总和;AVG(DISTINCT ):计算列值平均值;MAX(DISTINCT ):求列值最大值; MIN(DISTINCT ):求列值最小值。上述函数中除COUNT(*)外,其他

23、函数在计算过程中均忽略NULL值。示例例29统计学生总人数。SELECT COUNT(*) FROM Student 例30统计选修了课程的学生的人数。SELECT COUNT (DISTINCT Sno) FROM SC例31 计算9512101号学生的考试总成绩之和。SELECT SUM(Grade) FROM SC WHERE Sno = 9512101 示例(续)例32计算C01号课程学生的考试平均成绩。SELECT AVG(Grade) FROM SC WHERE Cno=C01例33查询选修了C01号课程的学生的最高分和最低分。SELECT MAX(Grade) , MIN(Gra

24、de) FROM SC WHERE Cno=C01注意:计算函数不能出现在WHERE子句中 4.4.2 简单查询5. 对查询结果进行分组计算 之对查询结果进行分组计算 作用:可以控制计算的级别:对全表还是对一组。目的:细化计算函数的作用对象。分组语句的一般形式: GROUP BY HAVING 1. 使用GROUP BY例34统计每门课程的选课人数,列出课程号和人数。 SELECT Cno as 课程号, COUNT(Sno) as 选课人数 FROM SC GROUP BY Cno 对查询结果按Cno的值分组,所有具有相同Cno值的元组为一组,然后再对每一组使用COUNT计算,求得每组的学生

25、人数。SnoCnoGrade951201C0180951201C0278951202C0190952103C0288952103C0185952103C0391952103C0474CnoCount(Sno)C013C022C031C041SnoCnoGrade951201C0180951202C0190952103C0185951201C0278952103C0288952103C0391952103C0474例35查询每名学生的选课门数和平均成绩。 SELECT Sno as 学号, COUNT(*) as 选课门数, AVG(Grade) as 平均成绩 FROM SC GROUP BY

26、 Sno2. 使用HAVINGHAVING用于对分组自身进行限制,它有点象WHERE子句,但它用于组而不是对单个记录。例36查询修了3门以上课程的学生的学号SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*) 3 示例例37查询修课门数等于或大于4门的学生的平均成绩和选课门数。SELECT Sno, AVG(Grade) 平均成绩, COUNT(*) 修课门数 FROM SC GROUP BY Sno HAVING COUNT(*) = 4 4.4.3 多表连接查询 若一个查询同时涉及两个或两个以上的表,则称之为连接查询。连接查询是关系数据库中最主要的

27、查询连接查询包括内连接、外连接和交叉连接等。连接基础知识连接查询中用于连接两个表的条件称为连接条件或连接谓词。 一般格式为: 必须是可比的内连接SQL-92 内连接语法如下: SELECT FROM 表名 INNER JOIN 被连接表 ON 连接条件执行连接操作的过程:首先取表1中的第1个元组,然后从头开始扫描表2,逐一查找满足连接条件的元组,找到后就将表1中的第1个元组与该元组拼接起来,形成结果表中的一个元组。表2全部查找完毕后,再取表1中的第2个元组,然后再从头开始扫描表2, 重复这个过程,直到表1中的全部元组都处理完毕为止。 例40.查询计算机系学生的修课情况,要求列出学生的名字、所修

28、课的课程号和成绩。SELECT Sname, Cno, Grade FROM Student JOIN SC ON Student.Sno = SC.Sno WHERE Sdept = 计算机系 例41. 查询信息系修了VB课程的学生的修课成绩,要求列出学生姓名、课程名和成绩。SELECT Sname, Cname, Grade FROM Student s JOIN SC ON s.Sno = SC. Sno JOIN Course c ON o = o WHERE Sdept = 信息系 AND Cname = VB 自连接为特殊的内连接相互连接的表物理上为同一张表。必须为两个表取别名,使

29、之在逻辑上成为两个表。例43. 查询与刘晨在同一个系学习的学生的姓名和所在的系。SELECT S2.Sname, S2.Sdept FROM Student S1 JOIN Student S2 ON S1.Sdept = S2.Sdept WHERE S1.Sname = 刘晨 AND S2.Sname != 刘晨外连接只限制一张表中的数据必须满足连接条件,而另一张表中数据可以不满足连接条件。 ANSI方式的外连接的语法格式为:FROM 表1 LEFT | RIGHT OUTER JOIN 表2 ON theta方式的外连接的语法格式为:左外连接: FROM 表1, 表2 WHERE 表1.

30、列名(+) 表2.列名右外连接: FROM 表1, 表2 WHERE 表1.列名 表2.列名(+) 例44. 查询学生的修课情况,包括修了课程的学生和没有修课的学生。SELECT Student.Sno, Sname, Cno, GradeFROM Student LEFT OUTER JOIN SCON Student.Sno = SC.Sno 4.4.4 子查询 在SQL语言中,一个SELECTFROMWHERE语句称为一个查询块。子查询是一个 SELECT 查询,它嵌套在 SELECT、INSERT、UPDATE、DELETE 语句的 WHERE 或 HAVING 子句内,或其它子查询中

31、 子查询的 SELECT 查询总是使用圆括号括起来。使用子查询进行基于集合的测试使用子查询进行基于集合的测试的语句的一般格式为:列名 NOT IN (子查询) 示例例45. 查询与刘晨在同一个系的学生。SELECT Sno, Sname, Sdept FROM StudentWHERE Sdept IN ( SELECT Sdept FROM Student WHERE Sname = 刘晨 ) AND Sname != 刘晨 示例例46. 查询成绩为大于90分的学生的学号、姓名。SELECT Sno, Sname FROM StudentWHERE Sno IN( SELECT Sno FR

32、OM SCWHERE Grade 90 ) 例47. 查询选修了“数据库基础”课程的学生的学号、姓名。 SELECT Sno, Sname FROM Student WHERE Sno IN( SELECT Sno FROM SC WHERE Cno IN(SELECT Cno FROM Course WHERE Cname = 数据库基础) ) 使用子查询进行比较测试 带比较运算符的子查询指父查询与子查询之间用比较运算符连接,当用户能确切知道内层查询返回的是单值时,可用、=、=、运算符。例48. 查询修了c02课程且成绩高于此课程的平均成绩的学生的学号和成绩。SELECT Sno , Gra

33、de FROM SC WHERE Cno = c02 and Grade ( SELECT AVG(Grade) from SC WHERE Cno = c02) 使用子查询进行存在性测试 一般使用EXISTS谓词。带EXISTS谓词的子查询不返回查询的数据,只产生逻辑真值(有数据)和假值(没有数据)。 例49.查询选修了c01号课程的学生姓名。SELECT Sname FROM Student WHERE EXISTS(SELECT * FROM SC WHERE Sno = Student.Sno AND Cno = c01) 注意注1:处理过程为:先外后内;由外层的值决定内层的结果;内层

34、执行次数由外层结果数决定。注2: 由于EXISTS的子查询只能返回真或假值,因此在这里给出列名无意义。所以在有EXISTS的子查询中,其目标列表达式通常都用*。上句的处理过程1.找外层表Student表的第一行,根据其Sno值处理内层查询2.由外层的值与内层的结果比较,由此决定外层条件的真、假3.顺序处理外层表Student表中的第2、3、 行。例50.查询没有选修c01号课程的学生姓名和所在系。SELECT Sname, Sdept FROM Student WHERE NOT EXISTS (SELECT * FROM SC WHERE Sno = Student.Sno AND Cno

35、= c01) 4.5 数据更改功能 4.5.1 插入数据 4.5.2 更新数据 4.5.3 删除数据4.5.1 插入数据 插入单行记录的INSERT语句的格式为:INSERT INTO () VALUES (值表)功能:新增一个符合表结构的数据行,将值表数据按表中列定义顺序或列名表顺序赋给对应列名。注意值列表中的值与列名表中的列按位置顺序对应,它们的数据类型必须一致。如果后边没有指明列名,则新插入记录的值的顺序必须与表中列的定义顺序一致,且每一个列均有值(可以为空)。示例例51将新生记录(95020,陈冬,男,信息系,18岁)插入到Student表中。INSERT INTO Student V

36、ALUES (9521105, 陈冬, 男, 18, 信息系)例52在SC表中插入一新记录,成绩暂缺。INSERT INTO SC(Sno, Cno, XKLB) VALUES(9521105, c01, 必修) 实际插入的值为: (9521105, c01 ,NULL ,必修) 4.5.2 更新数据 用UPDATE语句实现。格式: UPDATE SET , n WHERE 无条件更新例53. 将所有学生的年龄加1。UPDATE Student SET Sage = Sage + 1有条件更新1. 基于本表条件的更新例54. 将9512101学生的年龄改为21岁UPDATE Student S

37、ET Sage = 21WHERE Sno = 9512101 2. 基于其他表条件的更新例55:将计算机系全体学生的成绩加5分。(1)用子查询实现UPDATE SC SET Grade = Grade + 5 WHERE Sno IN(SELECT Sno FROM Student WHERE Sdept = 计算机系 )(2)用多表连接实现UPDATE SC SET Grade = Grade + 5 FROM SC JOIN Student ON SC.Sno = Student.Sno WHERE Sdept = 计算机系4.5.3 删除数据 用DELETE语句实现格式:DELETE FROM WHERE 无条件删除例56. 删除所有学生的选课记录。DELETE FROM SC 有条件删除 (1)基于本表条件的删除。例57删除所有不及格学生的修课记录。 DELETE FROM SC WHERE Grade 60 基于其他表条件的删除例58删除计算机系不及格学生的修课记录。(1)用子查询实现DELETE FROM SC WHERE Grade 60 AN

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论