1、数据库技术与应用,袁宝库 ,SQL语言基础,基本概念 SQL的数据类型 基本表的定义、删除及修改 数据查询功能 数据更改功能 建立与删除索引,SQL语言的发展,1986年10月由美国ANSI 公布最早的SQL标准。 1989年4月,ISO提出了具备完整性特征的SQL,称为SQL-89 。 1992年11月,ISO又公布了新的SQL标准,称为SQL-92。 1999年颁布SQL-99,是SQL92的扩展。,SQL语言的特点,一体化。 高度非过程化。 简洁。 使用方式多样。,SQL语言功能概述,四部分:数据定义功能、数据控制功能、数据查询功能和数据操纵功能。,SQL Server 2008 的数据
2、类型,数字数据类型 字符数据类型 二进制数据类型 日期和时间数据类型 货币型 特殊数据类型,数值型,准确型 整数Bigint: 8字节, Int:4字节Smallint:2字节, Tinyint:1字节 Bit:1位,存储1或0 小数Numeric(p,q)或Decimal(p,q), 近似型Float:8字节 Real:4字节,字符串型,普通编码字符串类型 统一字符编码字符串类型,普通编码字符串类型,Char(n):定长存储,n=8000 Varchar(n):不定长存储(按实际长度存储),长度最大不超过n , n=8000 注:n 为字符个数 Text:存储大于8000字节的文本,统一字符
3、编码字符串类型,nchar(n):定长存储,n=4000 nvarchar(n):不定长存储,长度最大不超过n , n=4000 ntext:存储大于8000字节的文本 特点:每个字符占两个字节,二进制字数据,Binary(n):固定长度,n = 8000。 Varbinary(n):可变长度,n 8000 。 注:n为二进制数据的字节数 image:大容量、可变长二进制字符数据,可用于存储文件。,日期时间型,Datetime:8字节,年月日时分秒毫秒(例:2001/08/03 10:30:00.000 )SmallDateTime:4字节,年月日时分(例: 2001/08/03 10:30:
4、00 ) 日期、时间的输入格式,货币类型,Money: 8 个字节,精确到货币单位的万分之一。 Smallmoney: 4 个字节,精确到货币单位的万分之一。 限制到小数点后 4 位。 可以带有适当的货币符号。例如,100 英镑可表示为 100。,特殊数据类型,timestamp、uniqueidentifier和xml等。,基本表的定义、删除及修改,基本表的定义与删除 修改表结构,基本表的定义与删除,定义基本表 使用SQL语言中的CREATE TABLE语句实现, 其一般格式为: CREATE TABLE (列级完整性约束定义 , 列级完整性约束定义 , 表级完整性约束定义 ),在列级完整性
5、约束定义处可以定义的约束,NOT NULL:限制列取值非空。 DEFAULT:给定列的默认值。 UNIQUE:限制列取值不重。 CHECK:限制列的取值范围。 PRIMARY KEY:指定本列为主码。 FOREIGN KEY:定义本列为引用其他表的外码。使用形式为: FOREIGN KEY() REFERENCES (),几点说明,NOT NULL和DEFAULT只能是列级完整性约束; 其他约束均可在表级完整性约束处定义。 注意以下几点: 第一,如果CHECK约束是定义多列之间的取值约束,则只能在表级完整性约束处定义; 第二,如果表的主码由多个列组成,则也只能在表级完整性约束处定义,并将主码列
6、用括号括起来,即:PRIMARY KEY(列1,列2 ); 第三,如果在表级完整性约束处定义外码,则“FOREIGN KEY ()”部分不能省。,约束定义,列取值非空约束NOT NULL 例:sname char(10) NOT NULL,约束定义,表主码约束 在定义列时定义主码(仅用于单列主码) 列定义 PRIMARY KEY 例: SNO char(7) PRIMARY KEY 在定义完列时定义主码(用于单列或多列主码) PRIMARY KEY () 例: PRIMARY KEY(SNO)PRIMARY KEY(SNO,CNO),约束定义,外码引用约束 指明本表外码列引用的表及表中的主码列
7、。 FOREIGN KEY () REFERENCES () 例: FOREIGN KEY (sno) REFERENCES 学生表(sno),约束定义,默认值约束 格式:DEFAULT 默认值 例:定义系的默认值为“计算机系”。 DEFAULT 计算机系,约束定义,CHECK约束 格式:CHECK (约束表达式) 例:定义成绩大于等于0。 CHECK ( grade = 0 ),约束定义,UNIQUE约束 在列级约束定义(仅用于单列约束) 列定义 UNIQUE 例: SNAME char(7) UNIQUE 在表级约束定义(用于单列或多列组合约束) UNIQUE () 例: UNIQUE (
8、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 =45),Sdept char (20 ) DEFAULT 计算机系 ),创建课程表,CREATE TABLE Course (Cno char(10) NOT NULL,Cname char(20) NOT NULL,Ccredit tinyint
9、CHECK (Ccredit 0),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 (
10、 Cno ) REFERENCES Course ( Cno ) ),删除表,当确信不再需要某个表时,可以将其删除 删除表时会将与表有关的所有对象一起删掉,包括表中的数据。 删除表的语句格式为: DROP TABLE , 例:删除test表的语句为: DROP TABLE test,修改表结构,在定义完表之后,如果需求有变化,比如添加列、删除列或修改列定义,可以使用ALTER TABLE语句实现。 ALTER TABLE语句可以对表添加列、删除列、修改列的定义、定义主码、外码,也可以添加和删除约束。,修改表结构语法,ALTER TABLE ALTER COLUMN | ADD COLUMN |
11、 DROP COLUMN | ADD PRIMARY KEY( , n ) | ADD FOREIGN KEY( )REFERNECES 表名( ),示例,为SC表添加“修课类别”列,此列的定义为:XKLB char(4) ALTER TABLE SC ADD XKLB char(4) NULL 将新添加的XKLB的类型改为 char(6)。 ALTER TABLE SC ALTER COLUMN XKLB char(6),示例,删除Course表的Period列。 ALTER TABLE Course DROP COLUMN Period,数据查询功能,查询语句的基本结构 简单查询 多表连接
12、查询 子查询,查询语句基本格式,SELECT -需要哪些列FROM -来自于哪些表WHERE -根据什么条件GROUP BY HAVING ORDER BY ,简单查询-选择表中若干列,查询指定的列 查询表中用户感兴趣的部分属性列。 例5:查询全体学生的学号与姓名。例6:查询全体学生的姓名、学号和所在系。,SELECT Sno,Sname FROM Student,SELECT Sname,Sno,Sdept FROM Student,简单查询-选择表中若干列,查询全部的列 例7查询全体学生的记录等价于:,SELECT Sno,Sname,Ssex, Sage, Sdept FROM Stud
13、ent,SELECT * FROM Student,简单查询-选择表中若干列,查询经过计算的列 例8查询全体学生的姓名及其出生年份。例9查询全体学生的姓名和出生年份所在系,并在出生年份列前加入一个列,此列的每行数据均为出生年份常量值。,SELECT Sname,2013 - Sage FROM Student,SELECT Sname,出生年份, 2012-Sage FROM Student,简单查询-选择表中若干列,改变列标题 语法:列名 | 表达式 AS 列标题 或:列标题 列名 | 表达式 例: SELECT Sname 姓名,Year of Birth 出生年份,2006 - Sage
14、 年份, FROM Student,简单查询-选择表中若干元组,例10在修课表中查询有哪些学生修了课程,要求列出学生的学号。消除取值相同的记录 结果中有重复的行。 用DISTINCT关键字可以去掉结果中的重复行。 DISTINCT关键字放在SELECT词的后边、目标列名序列的前边。,SELECT Sno FROM SC,SELECT DISTINCT Sno FROM SC,简单查询-选择表中若干元组,查询满足条件的元组,简单查询-选择表中若干元组,比较 例11查询计算机系全体学生的姓名。例12查询年龄在20岁以下的学生的姓名及年龄。例13查询考试成绩有不及格的学生的学号,SELECT Sna
15、me FROM Student WHERE Sdept = 计算机系,SELECT Sname, Sage FROM Student WHERE Sage 20,SELECT DISTINCT Sno FROM SC WHERE Grade 60,简单查询-选择表中若干元组,确定范围 用BETWEENAND和NOT BETWEENAND 是逻辑运算符,可以用来查找属性值在或不在指定范围内的元组,其中BETWEEN后边指定范围的下限,AND后边指定范围的上限。 BETWEENAND的格式为: 列名|表达式 NOT BETWEEN 下限值 AND 上限值 如果列或表达式的值在不在下限值和上限值范围
16、内,则结果为True,表明此记录符合查询条件。,简单查询-选择表中若干元组,例14查询年龄在2023岁之间的学生的姓名、所在系和年龄。例15查询年龄不在2023之间的学生姓名、所在系和年龄。,SELECT Sname, Sdept, Sage FROM Student WHERE Sage BETWEEN 20 AND 23,SELECT Sname, Sdept, Sage FROM Student WHERE Sage NOT BETWEEN 20 AND 23,简单查询-选择表中若干元组,使用IN运算符 用来查找属性值属于指定集合的元组。 格式为:列名 NOT IN (常量1, 常量2,
17、 常量n) 当列中的值与IN中的某个常量值相等时,则结果为True,表明此记录为符合查询条件的记录; NOT IN:当列中的值与某个常量值相同时,则结果为False,表明此记录为不符合查询条件的记录,简单查询-选择表中若干元组,例16查询信息系、数学系和计算机系学生的姓名和性别。例17查询既不是信息系、数学系,也不是计算机系学生的姓名和性别。,SELECT Sname, Ssex FROM Student WHERE Sdept IN (信息系, 数学系, 计算机系),SELECT Sname, Ssex FROM Student WHERE Sdept NOT IN (信息系, 数学系, 计
18、算机系),简单查询-选择表中若干元组,字符匹配 使用LIKE运算符 一般形式为:列名 NOT LIKE 匹配串中可包含如下四种通配符: _:匹配任意一个字符; %:匹配0个或多个字符; :匹配 中的任意一个字符; :不匹配 中的任意一个字符,简单查询-选择表中若干元组,例18查询姓张的学生的详细信息。例19查询学生表中姓张、李和刘的学生的情况。例20查询名字中第2个字为小或大的学生的姓名和学号,SELECT * FROM Student WHERE Sname LIKE 张%,SELECT * FROM Student WHERE Sname LIKE 张李刘%,SELECT Sname, S
19、no FROM Student WHERE Sname LIKE _小大%,简单查询-选择表中若干元组,例21查询所有不姓“刘”的学生。例22查询学号的最后一位不是2、3、5的学生情况。,SELECT Sname FROM Student WHERE Sname NOT LIKE 刘% ,SELECT * FROM Student WHERE Sno LIKE %235,简单查询-选择表中若干元组,涉及空值的查询 空值(NULL)在数据库中表示不确定的值。 例如,学生选修课程后还没有考试时,这些学生有选课记录,但没有考试成绩,因此考试成绩为空值。 判断某个值是否为NULL值,不能使用普通的比较
20、运算符。 判断取值为空的语句格式为:列名 IS NULL 判断取值不为空的语句格式为:列名 IS NOT NULL,简单查询-选择表中若干元组,例23查询无考试成绩的学生的学号和相应的课程号。例24查询所有有考试成绩的学生的学号和课程号。,SELECT Sno, Cno FROM SC WHERE Grade IS NULL,SELECT Sno, Cno FROM SC WHERE Grade IS NOT NULL,简单查询-选择表中若干元组,多重条件查询 在WHERE子句中可以使用逻辑运算符AND和OR来组成多条件查询。 用AND连接的条件表示必须全部满足所有的条件的结果才为True;
21、用OR连接的条件表示只要满足其中一个条件结果即为True。 例25查询计算机系年龄在20岁以下的学生姓名。,SELECT Sname FROM Student WHERE Sdept = CS AND Sage 20,简单查询-对查询结果进行排序,可对查询结果进行排序。 排序子句为: ORDER BY ASC | DESC , 说明:按进行升序(ASC)或降序(DESC)排序。 例26将学生按年龄的升序排序。,SELECT * FROM Student ORDER BY Sage,简单查询-对查询结果进行排序,例27查询选修了c02号课程的学生的学号及其成绩,查询结果按成绩降序排列。例28查询
22、全体学生的信息,查询结果按所在系的系名升序排列,同一系的学生按年龄降序排列。,SELECT Sno, Grade FROM SC WHERE Cno=c02 ORDER BY Grade DESC,SELECT * FROM Student ORDER BY Sdept, Sage DESC,思考题,查询所有年龄在20岁以下姓刘的学生姓名及其年龄。,SELECT SNAME,SAGE FROM STUDENT WHERE SAGE20 AND SNAME LIKE 刘%,简单查询-使用计算函数汇总数据,SQL提供的计算函数有: COUNT( * ):统计表中元组个数; COUNT(DISTIN
23、CT ):统计本列列值个数; SUM(DISTINCT ):计算列值总和; AVG(DISTINCT ):计算列值平均值; MAX(DISTINCT ):求列值最大值; MIN(DISTINCT ):求列值最小值。 上述函数中除COUNT(*)外,其他函数在计算过程中均忽略NULL值。,简单查询-使用计算函数汇总数据,例29统计学生总人数。 例30统计选修了课程的学生的人数。例31 计算9512101号学生的考试总成绩之和。,SELECT COUNT(*) FROM Student,SELECT COUNT (DISTINCT Sno) FROM SC,SELECT SUM(Grade) FR
24、OM SC WHERE Sno = 9512101,简单查询-使用计算函数汇总数据,例32计算C01号课程学生的考试平均成绩。例33查询选修了C01号课程的学生的最高分和最低分。注意:计算函数不能出现在WHERE子句中,SELECT AVG(Grade) FROM SC WHERE Cno=C01,SELECT MAX(Grade) , MIN(Grade) FROM SC WHERE Cno=C01,简单查询-对查询结果进行分组计算,作用:可以控制计算的级别:对全表还是对一组。 目的:细化计算函数的作用对象。 分组语句的一般形式:GROUP BY HAVING ,简单查询-使用计算函数汇总数
25、据,使用GROUP BY 例34统计每门课程的选课人数,列出课程号和人数。对查询结果按Cno的值分组,所有具有相同Cno值的元组为一组,然后再对每一组使用COUNT计算,求得每组的学生人数。,SELECT Cno as 课程号, COUNT(Sno) as 选课人数 FROM SC GROUP BY Cno,简单查询-使用计算函数汇总数据,简单查询-使用计算函数汇总数据,简单查询-使用计算函数汇总数据,使用GROUP BY 例35查询每名学生的选课门数和平均成绩,SELECT Sno as 学号, COUNT(*) as 选课门数, AVG(Grade) as 平均成绩 FROM SC GRO
26、UP BY Sno,简单查询-使用计算函数汇总数据,使用HAVING HAVING用于对分组自身进行限制,它有点象WHERE子句,但它用于组而不是对单个记录。 例36查询修了3门以上课程的学生的学号,SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*) 3,简单查询-使用计算函数汇总数据,使用HAVING 例37查询修课门数等于或大于4门的学生的平均成绩和选课门数,SELECT Sno, AVG(Grade) 平均成绩, COUNT(*) 修课门数 FROM SC GROUP BY Sno HAVING COUNT(*) = 4,多表连接查询,若一个查
27、询同时涉及两个或两个以上的表,则称之为连接查询。 连接查询是关系数据库中最主要的查询 连接查询包括内连接、外连接和交叉连接等,多表连接查询,连接基础知识 连接查询中用于连接两个表的条件称为连接条件或连接谓词。 一般格式为: ,必须是可比的,多表连接查询,内连接 SQL-92 内连接语法如下:SELECT FROM 表名 INNER JOIN被连接表ON 连接条件,多表连接查询,执行连接操作的过程: 首先取表1中的第1个元组,然后从头开始扫描表2,逐一查找满足连接条件的元组, 找到后就将表1中的第1个元组与该元组拼接起来,形成结果表中的一个元组。 表2全部查找完毕后,再取表1中的第2个元组,然后
28、再从头开始扫描表2, 重复这个过程,直到表1中的全部元组都处理完毕为止。,多表连接查询,例38.查询每个学生的基本信息及其选课情况例39.去掉上例中重复的列,SELECT * FROM Student INNER JOIN SC ON Student.Sno = SC.Sno,SELECT Student.Sno, Sname, Ssex, Sage, Cno, Grade ,XKLB FROM Student JOIN SC ON Student.Sno = SC.Sno,多表连接查询,例40.查询计算机系学生的修课情况,要求列出学生的名字、所修课的课程号和成绩。,SELECT Sname,
29、 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 c.Cno = SC.Cno WHERE Sdept = 信息系 AND Cname = VB,多表连接查询,自连接 为特殊的内连接 相互连接的表物理上为同一张表。 必须为两个表
30、取别名,使之在逻辑上成为两个表。,多表连接查询,例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方式的外连
31、接的语法格式为: 左外连接: FROM 表1, 表2 WHERE 表1.列名(+) 表2.列名 右外连接: FROM 表1, 表2 WHERE 表1.列名 表2.列名(+),多表连接查询,例44. 查询学生的修课情况,包括修了课程的学生和没有修课的学生。,SELECT Student.Sno, Sname, Cno, Grade FROM Student LEFT OUTER JOIN SC ON Student.Sno = SC.Sno,子查询,在SQL语言中,一个SELECTFROMWHERE语句称为一个查询块。 子查询是一个 SELECT 查询,它嵌套在 SELECT、INSERT、UP
32、DATE、DELETE 语句的 WHERE 或 HAVING 子句内,或其它子查询中 子查询的 SELECT 查询总是使用圆括号括起来。,子查询-使用子查询进行基于集合的测试,使用子查询进行基于集合的测试的语句的一般格式为: 列名 NOT IN (子查询),子查询,例45. 查询与刘晨在同一个系的学生。,SELECT Sno, Sname, Sdept FROM StudentWHERE Sdept IN( SELECT Sdept FROM StudentWHERE Sname = 刘晨 )AND Sname != 刘晨,子查询,例46. 查询成绩为大于90分的学生的学号、姓名。,SELEC
33、T Sno, Sname FROM Student WHERE Sno IN( SELECT Sno FROM SCWHERE Grade 90 ),子查询,例47. 查询选修了“数据库”课程的学生的学号、姓名。,SELECT Sno, Sname FROM Student WHERE Sno IN( SELECT Sno FROM SCWHERE Cno IN(SELECT Cno FROM CourseWHERE Cname = 数据库),子查询-使用子查询进行比较测试,带比较运算符的子查询指父查询与子查询之间用比较运算符连接, 当用户能确切知道内层查询返回的是单值时,可用、=、运算符。,
34、子查询,例48. 查询修了c02课程且成绩高于此课程的平均成绩的学生的学号和成绩。,SELECT Sno , Grade FROM SC WHERE Cno = c02AND Grade (SELECT AVG(Grade)FROM SC WHERE Cno = c02),子查询-使用子查询进行存在性测试,一般使用EXISTS谓词。 带EXISTS谓词的子查询不返回查询的数据,只产生逻辑真值(有数据)和假值(没有数据)。,子查询,例49.查询选修了c01号课程的学生姓名。,SELECT Sname FROM Student WHERE EXISTS(SELECT * FROM SCWHERE
35、Sno = Student.Sno AND Cno = c01),子查询-使用子查询进行存在性测试,注1:处理过程为:先外后内;由外层的值决定内层的结果;内层执行次数由外层结果数决定。 注2: 由于EXISTS的子查询只能返回真或假值,因此在这里给出列名无意义。所以在有EXISTS的子查询中,其目标列表达式通常都用*。,子查询-使用子查询进行存在性测试,例49的处理过程 找外层表Student表的第一行,根据其Sno值处理内层查询 由外层的值与内层的结果比较,由此决定外层条件的真、假 顺序处理外层表Student表中的第2、3、行。,子查询,例50.查询没有选修c01号课程的学生姓名和所在系。
36、,SELECT Sname, Sdept FROM Student WHERE NOT EXISTS(SELECT * FROM SCWHERE Sno = Student.Sno AND Cno = c01),子查询,查询选修了全部课程的学生姓名,SELECT sname FROM student WHERE NOT EXISTS (SELECT *FROM courseWHERE NOT EXISTS (SELECT *FROM scWHERE sno=student.snoAND cno= o),思考题,查询选课门数大于10门的学生的平均成绩和选课门数。 查询没有选修课程2的学生姓名。,
37、思考题,查询选课门数大于10门的学生的平均成绩和选课门数。,SELECT SNO, AVG(GRADE) 平均成绩,COUNT(*) 修课门数 FROM SC GROUP BY SNO HAVING COUNT(*) 10,思考题,查询没有选修课程2的学生姓名。,SELECT SNAME FROM STUDENT WHERE NOT EXISTS(SELECT * FROM SCWHERE SNO = STUDENT.SNO AND CNO = 课程2),数据更改功能,插入数据 更新数据 删除数据,插入数据,插入单行记录的INSERT语句的格式为: INSERT INTO () VALUES
38、(值表) 功能:新增一个符合表结构的数据行,将值表数据按表中列定义顺序或列名表顺序赋给对应列名 值列表中的值与列名表中的列按位置顺序对应,它们的数据类型必须一致。 如果后边没有指明列名,则新插入记录的值的顺序必须与表中列的定义顺序一致,且每一个列均有值(可以为空)。,插入数据,例51将新生记录(9521105,陈冬,男,信息系,18岁)插入到Student表中。例52在SC表中插入一新记录,成绩暂缺。,INSERT INTO Student VALUES (9521105, 陈冬, 男, 18, 信息系),INSERT INTO SC(Sno, Cno, XKLB) VALUES(952110
39、5, c01, 必修),实际插入的值为: (9521105, c01 ,NULL ,必修),更新数据,用UPDATE语句实现。 格式: UPDATE SET , n WHERE ,更新数据-无条件更新,例53. 将所有学生的年龄加1。,UPDATE Student SET Sage = Sage + 1,更新数据-有条件更新,基于本表条件的更新 例54. 将9512101学生的年龄改为21岁,UPDATE Student SET Sage = 21 WHERE Sno = 9512101,更新数据-有条件更新,基于其他表条件的更新 例55:将计算机系全体学生的成绩加5分。 用子查询实现,UPD
40、ATE SC SET Grade = Grade + 5 WHERE Sno IN(SELECT Sno FROM StudentWHERE Sdept = 计算机系 ),更新数据-有条件更新,基于其他表条件的更新 例55:将计算机系全体学生的成绩加5分。 用多表连接实现,UPDATE SC SET Grade = Grade + 5 FROM SC JOIN Student ON SC.Sno = Student.Sno WHERE Sdept = 计算机系,删除数据,用DELETE语句实现 格式: DELETE FROM WHERE ,删除数据-无条件删除,例56. 删除所有学生的选课记录
41、。,DELETE FROM SC,删除数据-有条件删除,基于本表条件的删除。 例57删除所有不及格学生的修课记录。,DELETE FROM SC WHERE Grade 60,删除数据-有条件删除,基于其他表条件的删除 例58删除计算机系不及格学生的修课记录。 用子查询实现,DELETE FROM SC WHERE Grade 60 AND Sno IN (SELECT Sno FROM Student WHERE Sdept = 计算机系 ),删除数据-有条件删除,基于其他表条件的删除 例58删除计算机系不及格学生的修课记录。 用多表连接实现,DELETE FROM SC FROM SC J
42、OIN Student ON SC.Sno = Student.Sno WHERE Sdept = 计算机系AND Grade 60,建立与删除索引,索引的概念 索引的分类 创建和删除索引,索引的概念,索引主要是为了加快数据的查询速度 与书籍中的索引或目录类似,建立索引的考虑,索引为性能所带来的好处是有代价的,因为索引在数据库中会占用一定的存储空间。 在对数据进行插入、更改和删除操作时,需要对索引进行维护,这需要花费额外的时间。 在设计和创建索引时,应确保对性能的提高程度大于在存储空间和处理资源方面的代价,数据的存储方式,在数据库管理系统中,数据是按数据页存储的,索引项也按数据页存储。 不同的
43、数据库管理系统的数据页的大小不完全相同,在SQL Server 中一个数据页的大小是8 KB。,索引的分类,聚簇索引 非聚簇索引 惟一索引,聚簇索引,数据按索引列进行物理排序,类似于电话号码簿中数据按姓氏排列。一个表只能包含一个聚簇索引。 但一个索引可以包含多个列。,聚簇索引的考虑,将聚簇索引用于: 包含大量非重复值的列。 使用:BETWEEN、=、 和 =返回一个范围值的查询。 被连续访问的列。 返回大型结果集的查询。 经常被用作连接的列,一般来说,这些是外码列 对 ORDER BY 或 GROUP BY 子句中指定的列进行索引,聚簇索引不适用于,频繁更改的列。因为这将导致整行移动。 字节长
44、的列。因为聚簇索引的键值将被所有非聚簇索引作为查找键使用,并被存储在每个非聚簇索引的B树的叶级索引项中。,非聚簇索引,数据存储在一个地方,索引存储在另一个地方 索引带有指向数据的存储位置的指针。 索引中的索引项按索引键值顺序存储,而表中的信息按另一种顺序存储。 与图书的目录类似。,非聚簇索引特点,数据行不按非聚簇索引键的顺序排序和存储。 非聚簇索引的叶层不包含数据页。 非聚簇索引B树的叶节点包含索引行。每个索引行包含非聚簇索引键值以及一个或多个行定位器,这些行定位器指向该键值对应的数据行。 可以在有聚簇索引的表和无聚簇索引的表上定义。,SQL Server非聚簇索引中的行定位器,如果表没有聚簇
45、索引,则行定位器就是指向行的指针。该指针用文件标识符 (ID)、页码和页上的行数生成。整个指针称为行ID。 如果表有聚簇索引,则行定位器就是行的聚簇索引键值。通过使用聚簇索引键搜索聚簇索引来检索数据行,而聚簇索引键存储在非聚簇索引的叶节点行内,非聚簇索的考虑,包含大量非重复值的列。 不返回大型结果集的查询。 经常作为查询条件使用的列。 经常作为连接和分组条件的列。,唯一索引,可以确保索引列不包含重复的值。 在多列唯一索引的情况下,该索引可以确保索引列中每个值的组合都是唯一的。 聚簇索引和非聚簇索引都可以是唯一的。只要列中的数据是唯一的,就可以在同一个表上创建一个唯一的聚簇索引和多个唯一的非聚簇
46、索引。,创建索引,语句格式:CREATE UNIQUE CLUSTERED|NONCLUSTEREDINDEX ON ( , n ) UNIQUE:创建唯一索引。 CLUSTERED:创建聚簇索引。 NONCLUSTERED:创建聚簇索引。 如果没有指定索引类型,则默认是创建非聚簇索引,创建索引,示例: 为Student表的Sname列创建非聚簇索引。 CREATE INDEX Sname_ind ON Stuent ( Sname ) 为Student表的Sid列创建惟一的聚簇索引。 CREATE UNIQUE CLUSTERED INDEX Sid_ind ON Stuent (Sid ),删除索引,删除索引语句格式: DROP INDEX 示例 删除Student表中的Sname_ind索引。 DROP INDEX Sname_ind,