资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第二章 SQL,SQL概述,SQL数据定义功能,SQL数据查询功能,SQL数据修改功能,SQL数据控制功能,嵌入式SQL,SQL概述(),历史,1974年,由Boyce和Chamber提出。,1975-1979年,在System R上实现,由IBM的San Jose研究室研制,称为Sequel,现在称为SQL(Structured Query Language)。,标准化,有关组织,ANSI(American Natural Standard Institute),ISO(International Organization for Standardization),有关标准,SQL-86:“数据库语言SQL”,SQL概述(),SQL-89:“具有完整性增强的数据库语言SQL”,增加了对完整性约束的支持。,SQL-92:“数据库语言SQL”,是SQL-89的超集,增加了许多新特性,如新的数据类型,更丰富的数据操作,更强的完整性、安全性支持等。即SQL2.,SQL-3:正在讨论中的新的标准,将增加对面向对象模型的支持。,SQL语言的应用情况:,Oracle、Sybase、Informix、Ingres、DB2、SQL Server、Rdb等大型数据库管理系统实现了SQL语言;,Dbase、Foxpro、Acess等PC机数据库管理系统部分实现了SQL语言;,SQL概述(),高度非过程化,用户只需提出“做什么”,无须告诉“怎么做”,不必了解存取路径。,两种使用方式,统一的语法结构,SQL既是自含式语言(用户使用),又是嵌入式语言(程序员使用)。,语言简洁,易学易用,SQL语言的基本概念,SQL语言支持关系数据库的三级模式结构.,SQL,视图1,视图2,存储文件2,存储文件1,基本表4,基本表3,基本表2,基本表1,外模式,模式,内模式,基本概念,基本表:,本身独立存在的表,SQL中一个关系就对应一个表,一个(或多个)基本表对应一个存储文件.,存储文件:,文件的实际存放情况,对用户是透明的.,视图:,由一个或几个基本表导出的表,是,虚表,.,示例关系,DEPT(DNO,DNAME,DEAN),S(Sno,SNAME,SEX,AGE,D#),COURSE(Cno,CN,PCno,CREDIT),SC(Sno,Cno,SCORE),PROF(Pno,PNAME,AGE,D#,SAL),Teach(Pno,Cno),域,数据类型,char(n):长度为n的定长字符串。,varchar(n):最大长度为n的可变长字符串。,int,smallint:整数类型。,numeric(p,s):p(精度),小数点左边和右边可以存储的十进制数字的最大个数,s(小数位数),小数点右边可以存储的十进制数字的最大个数;同decimal(p,s)。,float:,用于表示浮点数字数据的近似数字数据类型,。,datetime:代表日期和一天内的时间的日期和时间数据类型。,其他:money,bit,基本表的定义(),示例,create table,PROF,(PNO char(10),PNAME char(20),not null,SAL int,AGE int,DNO char(10),primary key,(PNO),foreign key,(DNO),references,DEPT(DNO),check,(SAL 0),基本表的定义(),撤消基本表定义(drop),格式,drop table,表名,示例,drop table,DEPT,DANGER,撤消基本表后,基本表的定义、表中数据、索引、以及由此表导出的视图的定义都被删除。,WHATS THE MEAN OF,CASCADE,?,数据库的建立与撤消,有的数据库系统支持多库,。,建立一个新数据库,create database,数据库名,撤消一个数据库,drop database,数据库名,指定当前数据库,use,数据库名,SQL数据定义特点,SQL中,任何时候都可以执行一个数据定义语句,随时修改数据库结构。而在非关系型的数据库系统中,必须在数据库的装入和使用前全部完成数据库的定义。若要修改已投入运行的数据库,则需停下一切数据库活动,把数据库卸出,修改数据库定义并重新编译,再按修改过的数据库结构重新装入数据。,数据库定义不断增长(不必一开始就定义完整)。,数据库定义随时修改(不必一开始就完全合理)。,可进行增加索引、撤消索引的实验,检验其对效率的影响,。,SQL数据查询功能,SQL数据查询基本结构,单表查询,连接查询,嵌套查询,集合查询,SELECT语句的一般格式,SQL数据查询基本结构,基本结构,select,from,where,含义:根据where子句的条件表达式,从from子句指定的表或视图找出满足条件的元组,再按SELECT子句中的目标列表达式,选出元组中的属性值形成结果表。,单表查询-,选择表中的若干列,查询指定列,通过指定,SELECT,子句的,来完成,例,1,查询全体学生的学号和姓名。,SELECT,Sno,Sname,FROM Student,例,2,查询全体学生的姓名、学号、年龄。,SELECT,Sname,Sno,Sage,FROM Student,单表查询-,选择表中的若干列,查询全部列,“,*,”:表示“所有的属性”。,例,3,给出所有学生的信息。,select,*,等价于,select,Sno,Sname,Ssex,Sage,Sdept,from,Student from Student,查询经过计算的值,select,子句的,可以是表达式,例,4,给出所有学生的姓名及其出生年份,。,select,SNAME,,,2005,Sage,from,Student,单表查询-,选择表中的若干元组,消除取值重复的行,例,6,查询选修了课程的学生学号,select,Sno,select DISTINCT,Sno,from,SC from SC,如果没有指定,distinct,,,则缺省为,ALL,,,即保留重复行,查询满足条件的元组,查询满足指定条件的元组可以通过,WHERE,子句来实现。,WHERE,子句常用的查询条件如下表所示:,取消重复行,单表查询-选择表中的若干元组,查询满足条件的元组,单表查询-选择表中的若干元组,(2)确定范围,例10 查询年龄在2023岁之间的学生姓名、系别、年龄,select Sname,Sdept,Sage,from Student,where Sage BETWEEN 20 AND 23,例11查询年龄不在2023岁之间的学生姓名、系别、年龄,select Sname,Sage,from Student,where Sage NOT BETWEEN 20 AND 23,单表查询-选择表中的若干元组,(3)确定集合,谓词,IN,可以用来查找属性值属于指定集合的元组,例,12,查询信息系(,IS,)、,数学系(,MA,),和计算机系(,CS,),学生的姓名和性别,select,Sname,Ssex,from Student,where Sdept in(IS,MA,CS),例,13,查询既不是信息系、数学系,也不是计算机系的学生姓名和性别,:select Sname,Sage,from Student,where Sdept NOT IN(IS,MA,CS),单表查询-选择表中的若干元组,(3)字符匹配,谓词LIKE可以用来进行字符串的匹配。其一般语法格式:,NOT LIKE ESCAPE ,含义:查找指定的属性列值与相匹配的元组,例14 查询姓名为李勇的学生的详细情况,select *select*,from student from student,where sname like 李勇 where sname=李勇,匹配串可以是一个完整的字符串,也可以含有通配符和_。其中:,例16 查询姓“欧阳”且全名为三个汉字的学生的姓名,select Sname,from Student,where Sname like 欧阳_,如果用户要查询的字符串本身就含有或,_,,这时就要使用,ESCAPE,断语对通配符进行转义,例,17,查询,DB_design,的课程的课程号和学分,select,Cno,Ccredit,from Course,where,Cname,like db_design escape,单表查询-选择表中的若干元组,单表查询-选择表中的若干元组,例18 查询以“DB_”开头,且倒数第三个字符为i的课程的详细情况,select*,from Course,where Cname like DB_%i_ _ESCAPE,(5)涉及空值的查询,例19 某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号,select Sno,Cno,from SC,where Score IS NULL,例20 查询所有有成绩的学生学号和课程号,select Sno,Cno from SC where Score IS NOT NULL,单表查询-选择表中的若干元组,(6)多重条件查询,例21 查询计算机系年龄在20岁以下的学生姓名,select Sname,from student,where Sdept=cs and Sage 20,例22查询信息系(IS)、数学系(MA)和计算机系(CS),学生的姓名和性别,select Sname,Ssex,from Student,where Sdept=IS OR Sdept=MA OR Sdept=CS,用,ORDER BY,子句对查询结果按照一个或多个属性列的升序(),ASC,),或降序(,DESC,),例,24,查询选修了,C03,号课程的学生的学号及其成绩,查询结果按分数的降序排列,select,Sno,Score,from SC,where,cno,=c03,order by score,desc,排序的时候对空值的处理,若按升序排,空值的元组最后显示;若按降序排,空值的元组最先显示,单表查询-对查询结果排序,单表查询-对查询结果排序,例25 查询全体学生情况,查询结果按所在系的系号排列,同一系中的学生按年龄降序排列。,SELECT *,FROM STUDENT,ORDER BY Sdept,Sage desc,SQL,中,常用的集函数:,COUNT(DISTINCT|ALL*),统计元组个数,COUNT(DISTINCT|ALL),统计一列中值的个数,SUM(DISTINCT|ALL),计算一列值的总和,AVG(DISTINCT|ALL),计算一列值的平均值,MAX(DISTINCT|ALL),求一列值的,最大值,MIN(DISTINCT|ALL),求一列值的最小值,注意:指定,DISTINCT,,,表示取消指定列的重复值;,不指定或者指定,ALL,,,表示不取消重复值,例,26,查询学生人数,SELECT COUNT(*),FROM STUDENT,单表查询-使用集函数,例27 查询选修了课程的学生人数,SELECT COUNT(DISTINCT SNO),FROM SC,例28 计算C01号课程的学生平均成绩,SELECT AVG(SCORE),FROM SC,WHERE CNO=C01,例29 查询选修了C01课程的学生最高分数,SELECT MAX(SCORE),FROM SC,WHERE CNO=C01,单表查询-使用集函数,关于集函数的思考,思考:,查询有选修,C01,或者,C02,课程的学生人数,查询既选修了,C01,又,选修了,C02,课程的学生人数,select count(distinct sno),from sc,where cno=c01 or cno=c02,select count(sno),from sc,where cno=c01 and sno in(select sno from sc where cno=c02),关于集函数的思考,思考:,查询至少选修了两门课的学生学号,select sno,from sc,group by sno,having count(cno)=2,思考:统计每个系的人数,要求结果按人数的升序排序,单表查询-对查询结果分组,使用,GROUP BY,子句将查询结果按某一列或者多列值分组,值相等的为一组,例,30,求各个课程号及相应的选课人数,课程平均成绩,SELECT,Cno,COUNT(Sno,),,,AVG(SCORE),FROM SC,GROUP BY,Cno,观察其运行结果,如果分组后还要求按一定的条件对这些组进行筛选,最终只输出满足指定条件的组,则可以使用,HAVING,断语指定筛选条件,例,31,查询选修了,3,门以上课程的学生学号,SELECT SNO FROM SC,GROUP BY,Sno,HAVING COUNT(*)3,单表查询-对查询结果分组,WHERE,子句与,HAVING,子句的区别:,WHERE,子句作用于基本表或视图,从中选择满足条件的元组;,HAVING,子句作用于组,从中选择满足条件的组,总结:,查询语句的一般格式:,SELECT,all|distinct ,FROM,WHERE,GROUP BY,HAVING,ORDER BY,ASC|DESC,
展开阅读全文