《数据库sql基础知识大全.ppt》由会员分享,可在线阅读,更多相关《数据库sql基础知识大全.ppt(74页珍藏版)》请在三一办公上搜索。
1、数据库原理,主讲:赵海霞,河南科技大学电信学院,第三章 关系数据库语言SQL,概述 SQL的数据定义 SQL的数据操纵 SQL的视图定义 SQL的数据控制 嵌入式SQL,第三章关系数据库语言SQL,概述,SQL(Structured Query Language)是1974年由Boyde和Chamberlin提出的1974年 IBM的System R1979年 Oracle1982年 IBM的DB21984年 Sybase1986年10月ANSI公布SQL-86标准1989年ISO公布SQL-89标准(120页)1992年公布SQL-92标准(622页)1999年公布SQL-99标准(1700
2、页)2003年公布SQL-2003标准(3600页),SQL语言的特点,综合统一集DDL、DML、DCL为一体实体和联系都是关系,因此每种操作只需一种操作符高度非过程化面向集合的操作方式以同一种语法结构提供两种使用方式(交互式和嵌入式)语言简捷,易学易用数据定义 CREATE、DROP、ALTER数据查询 SELECT数据更新 INSERT、UPDATE、DELETE数据控制 GRANT、REVOKE,SQL语言的特点,支持三级模式结构 视图 外模式 基本表(的集合)模式 存储文件和索引 内模式,SQL数据库体系结构,SQL的组成,数据定义语言(The Data Definition Lang
3、uage,DDL)数据操作语言(The Data Manipulation Language,DML)嵌入式和动态SQL事务管理安全性管理触发器和高级完整性约束客户服务器执行和远程数据库存取高级特性,SQL的数据定义,定义和修改基本表(定义模式中的关系):CREATE TABLE DROP TABLE ALTER TABLE定义视图(定义外模式):CREATE VIEW DROP VIEW定义索引(定义内模式):CREATE INDEX DROP INDEX,基本表的定义,基本格式 CREATE TABLE(,);:所要定义的基本表的名字:组成该表的各个属性(列):涉及相应属性列的完整性约束条
4、件:涉及一个或多个属性列的完整性约束条件,例1 建立一个“学生”表Student,它由学号Sno、姓名Sname、性别Ssex、年龄Sage、所在系Sdept五个属性组成。其中学号不能为空,值是唯一的,并且姓名取值也唯一。CREATE TABLE Student(Sno CHAR(5)NOT NULL UNIQUE,Sname CHAR(20)UNIQUE,Ssex CHAR(1),Sage INT,Sdept CHAR(15);,基本表的定义,基本表的定义,说明:SQL支持空值的概念。允许空值的列未输入数据时系统自动置为空值。SQL支持的数据类型随系统不同而有所差异,但一般都有:全字长整型、
5、半字长整型、定点实型、浮点实型、CHAR(n)、VARCHAR(n)、TEXT、DATE,基本表的定义,常用完整性约束主码约束:PRIMARY KEY唯一性约束:UNIQUE非空值约束:NOT NULL参照完整性约束 FOREIGN KEYcheck约束思考:PRIMARY KEY与 UNIQUE的区别?Primary key在建立的时候会默认地建立此field的索引,且此primary key可以作为作为另外的表的foreign key;再者primary key跟unique的区别是Primary key 一定是not null,而unique则没有此限制,SQL Server 2005中
6、的数据类型,精确数字,近似数字,日期和时间,字符串,Unicode字符串,二进制字符串,其他数据类型,例2 建立一个“课程”表C,它由课程号Cno,课程名称Cname,教师Teacher组成,其中Cno为主码。CREATE TABLE C(Cno CHAR(5),Cname CHAR(10),Teacher CHAR(10),Primary key(Cno);或像书上写的将Primary key 直接定义在属性列后。,基本表的定义,例3 建立一个“学生选课”表SC,它由学号Sno、课程号Cno,修课成绩Grade组成,其中(Sno,Cno)为主码。CREATE TABLE SC(Sno CHA
7、R(5),Cno CHAR(3),Grade int,Primary key(Sno,Cno),FOREIGN KEY(Sno)REFERENCES S(Sno),FOREIGN KEY(Cno)REFERENCES C(Cno);,基本数据类型,(1)数值型(DB2)SMALLINT 半字长二进制整数INTEGER 全字长二进制整数DECIMAL(P,q)或者DEC(p,q)压缩十进制数,共p位,其中小数点后q位FLOAT 双字长浮点数(2)字符串型CHARTER(n)或CHAR(n)VARCHAR(n)(3)时间型DATETIME(4)位串型BIT(n),基本表的删除,基本格式 DROP
8、TABLE 表名;示例 DROP TABLE S;,基本表的修改,基本格式 ALTER TABLE ADD 完整性约束 DROP ALTER COLUMN;:要修改的基本表ADD子句:增加新列和新的完整性约束条件DROP子句:删除指定的完整性约束条件ALTER COLUMN子句:用于修改列名和数据类型,基本表的修改,增加列基本格式ALTER TABLE 表名 ADD 列名 类型;示例 ALTER TABLE S ADD ADDRESS VARCHAR(30)修改列基本格式 ALTER TABLE 表名 ALTER COLUMN 列名 类型;ALTER TABLE S ALTER COLUMN
9、SA SMALLINT;删除列基本格式 ALTER TABLE 表名 DROP 列名;ALTER TABLE S DROP UNIQUE(Sn);,例子 修改表,ALTER TABLE studentADD sno CHAR(5)NULL-向student表中添加一列snoALTER TABLE student-修改sno的定义保障此列不为空MODIFY sno CHAR(5)NOT NULL ALTER TABLE student-向student表添加主键约束ADD PRIMARY KEY(sno)ALTER TABLE student-从student表删除列sexDROP COLUMN
10、 sex,例子 修改表,-向study表中添加外键约束ALTER TABLE studyADD CONSTRAINT fkcno FOREIGN KEY(cno)REFERENCES course(cno)ON DELETE CASCADE ON UPDATE CASCADE-向study表中添加外键约束 ALTER TABLE study ADD CONSTRAINT fksno FOREIGN KEY(sno)REFERENCES student(sno)ON DELETE CASCADE ON UPDATE CASCADE,视图的定义和修改,基本操作 CREATE VIEW DROP V
11、IEW后面详细讨论,索引的建立和删除,建立索引是加快查询速度的有效手段建立索引DBA或表的属主(即建立表的人)根据需要建立有些DBMS自动建立以下列上的索引 PRIMARY KEY UNIQUE维护索引 DBMS自动完成使用索引 DBMS自动选择是否使用索引以及使用哪些索引,索引的建立和删除,索引的结构RDBMS中,索引一般采用B+树或HASH索引实现,具体由RDBMS决定。B+树具有动态平衡的优点HASH索引查找速度快。索引是关系数据库的内部实现技术,属内模式范畴。用户创建索引时,可创建唯一索引、非唯一索引或聚簇索引。,在SQL86和SQL89标准中,基本表没有关键码概念,可以用索引机制来弥
12、补。索引属于物理存储的路径概念,而不是逻辑的概念。在定义基本表时,还要定义索引,就把数据库的物理结构和逻辑结构混在一块了。因此在SQL2中引入了主码(主键)的概念,用户在创建基本表时用主码子句Primary key直接定义主码。但至今大多数DBMS仍使用索引机制,有索引创建和撤销语句,其功能仅限于查询时起作用。,索引的建立,索引建立的基本格式,聚簇索引,Unique索引表明此索引的每个索引值只对应唯一的数据记录Cluster索引又称聚簇索引,必须维护表中行的物理存储顺序和索引顺序一致,经常进行更新操作的表不宜建立聚簇索引。,索引的建立,例、为学生-课程数据库中的S,C,SC三个表建立索引。其中
13、S表按学号升序建唯一索引,C表按课程号升序建唯一索引,SC表按学号升序和课程号降序建唯一索引。CREATE UNIQUE INDEX Ssno ON S(Sno);CREATE UNIQUE INDEX Ccno ON C(Cno);CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);,索引的建立,唯一值索引对于已含重复值的属性列不能建UNIQUE索引对某个列建立UNIQUE索引后,插入新记录时DBMS会自动检查新记录在该列上是否取了重复值。这相当于增加了一个UNIQUE约束,索引的建立,聚簇索引建立聚簇索引后,基表中数据也需要按指定的聚簇属性值的
14、升序或降序存放。也即聚簇索引的索引项顺序与表中记录的物理顺序一致例:CREATE CLUSTER INDEX Ssname ON S(SN);在S表的SN(姓名)列上建立一个聚簇索引,而且S表中的记录将按照SN值的升序存放,索引的建立,在一个基本表上最多只能建立一个聚簇索引聚簇索引的用途:对于某些类型的查询,可以提高查询效率聚簇索引的适用范围 很少对基表进行增删操作 很少对其中的变长列进行修改操作,索引的删除,索引删除的基本格式 DROP INDEX 索引名删除索引时,系统会从数据字典中删去有关该索引的描述。,SQL的数据操纵,SQL的数据查询(检索)SELECTSQL的数据更新(增、删、改)
15、INSERT,DELETE,UPDATE,SQL的数据查询,一般格式,SELECT 目标列FROM 基本表(或视图)WHERE 条件表达式 GROUP BY 列名1 HAVING 内部函数表达式 ORDER BY 列名2,SQL的数据查询,常用格式(SELECT-FROM-WHERE句型)SELECT A1,A2,AnFROM R1,R2,RmWHERE F其中,条件表达式F可使用下列操作符:算术比较运算符(,=,=,)逻辑运算符(AND,OR,NOT)集合运算符(UNION,INTERSECT,EXCEPT)集合成员资格运算符(IN,NOT IN)谓词(EXISTS,ALL,SOME,UNI
16、QUE)聚合函数(AVG,MIN,MAX,SUM,COUNT)嵌套的SELECT语句,示例数据库,学生-课程数据库学生表:Student(Sno,Sname,Ssex,Sage,Sdept)课程表:Course(Cno,Cname,Cpno,Ccredit)学生选课表:SC(Sno,Cno,Grade),一、单表查询,查询仅涉及一个表,是一种最简单的查询操作选择表中的若干列选择表中的若干元组对查询结果排序使用集函数对查询结果分组,查询指定列,例1 查询全体学生的学号与姓名。SELECT Sno,SnameFROM Student;例2 查询全体学生的姓名、学号、所在系。SELECT Sname
17、,Sno,SdeptFROM Student;,查询全部列,例3 查询全体学生的详细记录。SELECT Sno,Sname,Ssex,Sage,Sdept FROM Student;或SELECT*FROM Student;,查询经过计算的值,例4 查全体学生的姓名及其出生年份。SELECT Sname,2009-SageFROM Student;输出结果:Sname 2009-Sage-李勇 1976 刘晨 1977 王名 1978 张立 1978,查询经过计算的值,例5 查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名。SELECT Sname,Year of Birth:
18、,2009-Sage,ISLOWER(Sdept)FROM Student;,查询经过计算的值,输出结果:Sname Year of Birth:2009-Sage ISLOWER(Sdept)-李勇 Year of Birth:1976 cs 刘晨 Year of Birth:1977 is 王名 Year of Birth:1978 ma 张立 Year of Birth:1977 is,使用列别名改变查询结果的列标题,SELECT Sname NAME,Year of Birth:BIRTH,2009-Sage BIRTHDAY,ISLOWER(Sdept)DEPARTMENTFROM
19、Student;输出结果:NAME BIRTH BIRTHDAY DEPARTMENT-李勇 Year of Birth:1976 cs 刘晨 Year of Birth:1977 is 王名 Year of Birth:1978 ma 张立 Year of Birth:1977 is,选择表中的若干元组,消除取值重复的行查询满足条件的元组,1.消除取值重复的行,在SELECT子句中使用DISTINCT短语假设SC表中有下列数据 Sno Cno Grade-95001 1 92 95001 2 85 95001 3 88 95002 2 90 95002 3 80,ALL 与 DISTINCT
20、,例6 查询选修了课程的学生学号。(1)SELECT Sno FROM SC;或(默认 ALL)SELECT ALL Sno FROM SC;结果:Sno-95001 95001 95001 95002 95002,(2)SELECT DISTINCT Sno FROM SC;结果:Sno-95001 95002,ALL 与 DISTINCT,注意 DISTINCT短语的作用范围是所有目标列例:查询选修课程的各种成绩错误写法SELECT DISTINCT Cno,DISTINCT GradeFROM SC;正确写法 SELECT DISTINCT Cno,Grade FROM SC;,2.查询
21、满足条件的元组,比较大小确定范围确定集合字符串匹配涉及空值的查询多重条件查询,比较大小,在WHERE子句的中使用比较运算符=,=,!,!=20;,确定范围,使用谓词 BETWEEN AND NOT BETWEEN AND 例10 查询年龄在2023岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。SELECT Sname,Sdept,SageFROM StudentWHERE Sage BETWEEN 20 AND 23;,相当于若干 AND 的缩写,确定范围,例11 查询年龄不在2023岁之间的学生姓名、系别和年龄。SELECT Sname,Sdept,SageFROM StudentW
22、HERE Sage NOT BETWEEN 20 AND 23;,确定集合,使用谓词 IN,NOT IN:用逗号分隔的一组取值例12查询信息系(IS)、数学系(MA)和计 算机科学系(CS)学生的姓名和性别。SELECT Sname,SsexFROM StudentWHERE Sdept IN(IS,MA,CS);,相当与若干OR的缩写,字符串匹配,NOT LIKE ESCAPE DB2中,下划线 _表示匹配任何单个字符 百分号%表示匹配任何字符串当用户要查询的字符串本身含有%或 _ 时,要使用ESCAPE 短语对通配符进行转义,字符串匹配,匹配模板为固定字符串 例14 查询学号为95001的
23、学生的详细情况。SELECT*FROM Student WHERE Sno LIKE 95001;等价于:SELECT*FROM Student WHERE Sno=95001;,字符串匹配,匹配模板为含通配符的字符串例15 查询所有(不)姓刘学生的姓名、学号和性别。SELECT Sname,Sno,Ssex FROM Student WHERE Sname(NOT)LIKE 刘%;,匹配模板为含通配符的字符串(续)例16 查询姓欧阳且全名为三个汉字的学生的姓名。SELECT Sname FROM Student WHERE Sname LIKE 欧阳_;,字符串匹配,匹配模板为含通配符的字符
24、串(续)例17 查询名字中第2个字为阳字的学生的姓名和学号。SELECT Sname,Sno FROM Student WHERE Sname LIKE _阳%;,字符串匹配,使用换码字符将通配符转义为普通字符 例19 查询DB_Design课程的课程号和学分。SELECT Cno,Ccredit FROM Course WHERE Cname LIKE DB_Design ESCAPE,涉及空值的查询,使用谓词 IS NULL 或 IS NOT NULL“IS NULL”不能用“=NULL”代替例21 某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和
25、相应的课程号。SELECT Sno,Cno FROM SC WHERE Grade IS NULL;,涉及空值的查询,例22 查所有有成绩的学生学号和课程号。SELECT Sno,Cno FROM SC WHERE Grade IS NOT NULL;,多重条件查询,用逻辑运算符AND和 OR来联结多个查询条件 AND的优先级高于OR 可以用括号改变优先级可用来实现多种其他谓词 NOT IN NOT BETWEEN AND,多重条件查询,例23 查询计算机系年龄在20岁以下的学生姓名。SELECT Sname FROM Student WHERE Sdept=CS AND Sage20;,对查
26、询结果排序,使用ORDER BY子句 可以按一个或多个属性列排序 升序:ASC;降序:DESC;缺省值为升序当排序列含空值时ASC:排序列为空值的元组最后显示DESC:排序列为空值的元组最先显示,对查询结果排序,例24 查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。SELECT Sno,Grade FROM SC WHERE Cno=3 ORDER BY Grade DESC;,查询结果,Sno Grade-95010 95024 95007 92 95003 82 95010 82 95009 75 95014 61 95002 55,使用集函数,COUNT 对一列中的值的
27、个数记数 COUNT(*)计算记录个数 SUM 对一列求和 AVG 对一列求平均值 MAX 对一列求最大值 MIN 对一列求最小值,使用集函数,SELECT COUNT(DISTINCT Sno)FROM SC;,例25 求选修了课程的学生人数。,重复的只记一个,对查询结果分组,使用GROUP BY子句分组 细化集函数的作用对象 未对查询结果分组,集函数将作用于整个查询结果 对查询结果分组后,集函数将分别作用于每个组,对查询结果分组,例30 求各个课程号及相应的选课人数。SELECT Cno,COUNT(Sno)FROM SC GROUP BY Cno;结果 Cno COUNT(Sno)1 2
28、2 2 34 3 44 4 33 5 48,将表按列的值分组,列的值相同的分在一组。GROUP BY常和库函数一起使用,用于分组统计。,对查询结果分组,GROUP BY子句的作用对象是查询的中间结果表分组方法:按指定的一列或多列值分组,值相等的为一组使用GROUP BY子句后,SELECT子句的列名列表中只能出现分组属性和集函数,使用HAVING短语,例31 查询选修了3门以上课程的学生学号。SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*)3;,使用HAVING短语,例32 查询有3门以上课程是90分以上的 学生的学号及(90分以上的)课程数 SE
29、LECT Sno,COUNT(*)FROM SC WHERE Grade=90 GROUP BY Sno HAVING COUNT(*)=3;,HAVING是选择分组的条件,且必须和GROUP BY一起使用,WHERE是选择记录的条件;,使用HAVING短语,只有满足HAVING短语指定条件的组才输出HAVING短语与WHERE子句的区别:作用对象不同WHERE子句作用于基表或视图,从中选择满足条件的元组HAVING短语作用于组,从中选择满足条件的组,使用聚合函数对数据进行汇总和统计,聚合函数常见的几种用法:SUM(ALL|DISTINCT expression)返回表达式中所有值的和,或只返
30、回DISTINCT值。SUM 只能用于数字列。空值将被忽略。COUNT(ALL|DISTINCT expression|*)返回组中项目的数量。COUNT(*)返回组中项目的数量,这些项目包括 NULL 值和重复值。COUNT(ALL expression)对组中的每一行都计算相应的expression的值,并返回非空值的expression的数量。COUNT(DISTINCT expression)对组中的每一行都计算 expression并返回唯一的非空值的数量。,使用聚合函数对数据进行汇总和统计,AVG(ALL|DISTINCT expression)返回组中值的平均值。空值将被忽略。MAX(ALL|DISTINCT expression)返回表达式的最大值MIN(ALL|DISTINCT expression)返回表达式的最小值。聚合函数一般仅能出现在SELECT和HAVING子句中。不同的DBMS系统对聚合函数有不同的扩充。使用聚合函数之后,SELECT子句中所出现的列名或列名表达式必须出现在GROUP BY子句中或者为聚合函数表达式。,