提纲SQL概述SQL数据定义功能SQL数据查询功能SQL数据修改功能SQL数据控制功能嵌入式SQLSQL概述历史SQL:StruceuredQueryLanguang1974年,由Boyce和Chamber提出1975-1979年,在SystemR上实现,由IBM的SanJose研究室研制,称为SequelSQL概述用户1用户2用户4视图V1视图V1用户3基本表B1基本表B2基本表B4基本表B3存储文件S1存储文件S2存储文件S4存储文件S3SQL数据库体系结构SQL用户VIEWBaseTableStoredfileSQL概述标准化有关组织ANSI(AmericanNaturalStandardInstitute)ISO(InternationalOrganizationforStandardization)有关标准SQL-86“数据库语言SQL”SQL-89“具有完整性增强的数据库语言SQL”,增加了对完整性约束的支持SQL-92“数据库语言SQL”,是SQL-89的超集,增加了许多新特性,如新的数据类型,更丰富的数据操作,更强的完整性、安全性支持等。SQL-3正在讨论中的新的标准,将增加对面向对象模型的支持SQL概述特点一体化集DDL,DML,DCL于一体单一的结构----关系,带来了数据操作符的统一面向集合的操作方式一次一集合高度非过程化用户只需提出“做什么”,无须告诉“怎么做”,不必了解存取路径两种使用方式,统一的语法结构SQL既是自含式语言(用户使用),又是嵌入式语言(程序员使用)语言简洁,易学易用SQL概述SQL功能操作符数据查询SELECT数据定义CREATE,ALTER,DROP数据操纵INSERT,UPDATE,DELETE数据控制GRANT,REVOKE示例关系DEPT(D#,DNAME,DEAN)S(S#,SNAME,SEX,AGE,D#)COURSE(C#,CN,PC#,CREDIT)SC(S#,C#,SCORE)PROF(P#,PNAME,AGE,D#,SAL)PC(P#,C#)SQL数据定义功能域定义基本表的定义索引的定义数据库的建立与撤消SQL数据定义特点域定义域类型(SQL-92)char(n):固定长度的字符串varchar(n):可变长字符串int:整数smallint:小整数类型numeric(p,d):定点数,小数点左边p位,右边q位real:浮点数doubleprecision:双精度浮点数date:日期(年、月、日)time:时间(小时、分、秒)interval:两个date或time类型数据之间的差域定义域定义格式createdomain域名数据类型示例createdomainperson-namechar(20)类似C语言中:typedefADDRESS_LIST{charname[10];chartelephone[20];charlocation[20]charemail[20]};ADDRESS_LISTtom;基本表的定义基本表的定义(CREATE)格式createtable表名(列名数据类型[default缺省值][notnull][,列名数据类型[default缺省值][notnull]]……[,primarykey(列名[,列名]…)][,foreignkey(列名[,列名]…)references表名(列名[,列名]…)][,check(条件)])基本表的定义示例CREATETABLES(S#CHAR(4),SNAMECHAR(8)NOTNULL,AGESMALLINT,SEXCHAR(1),PRIMARYKEY(S#),CHECK(SEX=0ORSEX=1))基本表的定义CREATETABLEC(C#CHAR(4),CNAMECHAR(10)NOTNULL,TEACHERCHAR(8),PRIMARYKEY(C#),)基本表的定义CREATETABLESC(S#CHAR(4),C#CHAR(4),GRADESAMLLINT,PRIMARYKEY(S#,C#),FOREIGNKEY(S#)REFERENCESS(S#),FOREIGNKEY(C#)REFERENCESC(S#),CHECK((GRADEISNULL)ORGRADEBETWEEN0AND100))基本表的定义示例createdomainperson_namechar(20)createtablePROF(PNOchar[10],person_namePNAMEnotnull,SALint,AGEint,DNOchar[10],primarykey(PNO),foreignkey(DNO)referencesDEPT(DNO),check(SAL0))基本表的定义修改基本表定义(ALTER)格式:altertable表名[add子句]增加新列[drop子句]删除列[modify子句]修改列定义示例altertablePROFaddLOCATIONchar[30]基本表的定义撤消基本表定义(drop)格式droptable表名示例droptableDEPTDANGER撤消基本表后,基本表的定义、表中数据、索引、以及由此表导出的视图的定义都被删除索引的定义索引的定义格式create[unique/distinct][cluster]index索引名on表名(列名[asc/desc][,列名asc/desc]]…)unique(distinct):唯一性索引,不允许表中不同的行在索引列上取相同值。若已有相同值存在,则系统给出相关信息,不建此索引。系统并拒绝违背唯一性的插入、更新cluster:聚集索引,表中元组按索引项的值排序并物理地聚集在一起。一个基本表上只能建一个聚集索引asc/desc:索引表中索引值的排序次序,缺省为asc索引的定义示例:createclusterindexs-indexonS(S#)索引的删除格式dropindex索引名索引的定义索引的有关说明可以动态地定义索引,即可以随时建立和删除索引不允许用户在数据操作中引用索引。索引如何使用完全由系统决定,这支持了数据的物理独立性应该在使用频率高的、经常用于连接的列上建索引一个表上可建多个索引。索引可以提高查询效率,但索引过多耗费空间,且降低了插入、删除、更新的效率数据库的建立与撤消有的数据库系统支持多库建立一个新数据库createdatabase数据库名撤消一个数据库dropdatabase数据库名指定当前数据库database数据库名指定当前数据库closedatabase数据库名SQL数据定义特点SQL中,任何时候都可以执行一个数据定义语句,随时修改数据库结构。而在非关系型的数据库系统中,必须在数据库的装入和使用前全部完成数据库的定义。若要修改已投入运行的数据库,则需停下一切数据库活动,把数据库卸出,修改数据库定义并重新编译,再按修改过的数据库结构重新装入数据数据库定义不断增长(不必一开始就定义完整)数据库定义随时修改(不必一开始就完全合理)可进行增加索引、撤消索引的实验,检验其对效率的影响SQL数据查询功能SQL数据查询基本结构select子句重复元组的处理from子句where子句更名运算字符串操作元组显示顺序集合操作SQL数据查询功能分组和聚集函数空值嵌套子查询派生关系视图关系的连接SQL数据查询基本结构基本结构selectA1,A2,…,Anfromr1,r2,…,rmwhereP∏A1,A2,…,An(p(r1r2…rm))SQL数据查询基本结构示例给出所有老师的姓名selectPNAMEfromPROFselect子句目标列形式可以为列名,*,算术表达式,聚集函数“*”:表示“所有的属性”给出所有老师的信息select*fromPROFselect子句带,,,的算术表达式给出所有老师的姓名及税后工资额selectPNAME,SAL0.95fromPROF重复元组的处理语法约束缺省为保留重复元组,也可用关键字all显式指明。若要去掉重复元组,可用关键字distinct或unique指明示例找出所有选修课程的学生selectdistinctSNOfromSCfrom子句说明from子句列出查询的对象表当目标列取自多个表时,在不混淆的情况下可以不用显式指明来自哪个关系示例例:找出工资低于500的职工的姓名、工资、系别selectPNAME,SAL,DNAMEfromPROF,DEPTwhereSAL500andPROF.DNO=DEPT.DNOfrom子句例:列出教授“哲学”课程的老师的教工号及姓名selectPROF.PNO,PNAMEfromPROF,PC,COURSEwherePROF.PNO=PC.PNOandPC.CNO=COURSE.CNOandCOURSE.CNAME=“哲学”where子句语法成分比较运算符、、、、=、逻辑运算符and,or,notbetween条件判断表达式的值是否在某范围内where子句示例列出工资在500~800之间的老师姓名selectPNAMEfromPROFwhereSALbetween500and800更名运算格式old_nameasnew_name为关系和属性重新命名,可出现在select和from子句中注:as可选更名运算示例属性更名例:给出所有老师的姓名、所纳税额及税后工资额selectPNAME,SAL0.05astaxi,SAL*0.95asincomingfromPROF更名运算关系更名找出工资比所在系主任工资高的老师姓名及工资selectP1.PNAME,P1.SALfromPROFasP1,PROFasP2,DEPTwhereP1.DNO=DEPT.DNOandDEPT.DEAN=P2.PNOandP1.SALP2.SAL字符串操作命令格式格式列名[not]like“字符串”找出满足给定匹配条件的字符串字符串操作匹配规则“%”匹配零个或多个字符“_”匹配任意单个字符Escape定义转义字符,以去掉特殊字符的特定含义,使其被作为普通字符看待如escape“\”,定义\作为转义字符,则可用\%去匹配%,用\_去匹配_思考:用什么去匹配\?字符串操作示例列出姓名以“张”打头的教师的所有信息select*fromPROFwherePNAMElike“张%”字符串操作列出名称中含有4个字符以上,且倒数第3个字符是d,倒数第2个字符是_的系的所有信息select*fromPROFwherePNAMElike“%_d\__”元组显示顺序命令orderby列名[asc|desc]示例按系名升序列出老师姓名,所在系名,同一系中老师按姓名降序排列selectDNAME,PNAMEfromPROF,DEPTwherePROF.DNO=DEPT.DNOorderbyDNAMEasc,PNAMEdesc集合操作命令集合并:union集合交:intersect集合差:except提示集合操作自动去除重复元组,如果要保留重复元组的话,必须用all关键词指明集合操作示例求选修了001或(且)002号课程的学生号(selectSNOfromSCwhereCNO=001)union(intersect)(selectSNOfromSCwhereCNO=002)集合操作求选修了001和002号而没有选003号课程的学生号(selectSNOfromSCwhereCNO=001orCNO=002)except(selectSNOfromSCwhereCNO=003)分组和聚集函数分组命令groupby列名[having条件表达式]groupby将表中的元组按指定列