2023年6月21日发(作者:)
数据库学习笔记7关系数据库标准语⾔SQLSQL概述⽬前,没有⼀个数据库系统能够⽀持SQL标准的所有概念和特性许多软件⼚商对SQL基本命令集还进⾏了不同程度的扩充和修改,有可以⽀持标准以外的⼀些功能特性SQL的特点SQL集数据查询(data query)、数据操纵(data manipulation)、数据定义(data definition)和数据控制(data control)功能于⼀体。综合统⼀⾮关系模型(层次模型、⽹状模型)的数据语⾔⼀般都分为:模式数据定义语⾔(Schema Data Definition Language,模式DDL) ——定义模式外模式数据定义语⾔(Subschema Data Definition Language,外模式DDL或⼦模式DDL)——定义外模式数据存储有关的描述语⾔(Data Stroage Description Language, DSDL)——定义内模式数据操纵语⾔(Data Manipulation Language,DML)——进⾏数据的存储与处置SQL集数据定义语⾔、数据操纵语⾔、数据控制语⾔的功能于以梯,语⾔风格统⼀,可以独⽴完成数据库⽣命周期中的全部活动,包括以下⼀系列操作要求:定义和修改、删除关系模式,定义和删除视图,插⼊数据,建⽴数据库对数据库中的数据进⾏查询和更新数据库重构和维护数据库安全性、完整性控制,以及事务控制嵌⼊式SQL和动态SQL定义⾼度⾮过程化⾮关系数据模型的数据操纵语⾔是⾯向过程的与i眼,⽤过程化语⾔完成某项请求必须指定存取路径SQL进⾏数据操作时,只要提出“做什么”,⽽⽆须知名“怎么做”,因此⽆需了解存取路径。存取路径的选择以及SQL的操作过程由系统⾃动完成⾯向集合的操作⽅式⾮关系数据模型采⽤的是⾯向记录的操作⽅式,操作对象是⼀条记录。SQL采⽤的是集合擦制作⽅式,不仅操作对象、查找结果可以是元组的集合,⽽且⼀次插⼊、删除、更新操作的对象也可以是元组的集合以同⼀种语法结构提供多种使⽤⽅式语⾔简介,易学易⽤学⽣-课程数据库使⽤学⽣-课程数据库为例StudentSno201215121Sname李勇Ssex男Sage20SdeptCS201215122Sno215125刘晨Sname王敏张⽴⼥Ssex⼥男19Sage1819CSSdeptMAISCourseCno1234567Cname数据库数学信息系统操作系统数据结构数据处理PASCAL语⾔6167Cpno5Ccredit4243424SCSno2201215122Cno12323Grade9285889080数据定义SQL的数据定义语句操作对象模式表视图索引创建CREATE SCHEMACREATE TABLECREATE VIEWCREATE INDEX删除DROP SCHEMADROP TABLEDROP VIEWDROP INDEXALTER INDEXALTER TABLE修改SQL标准不提供修改模式定义和修改视图定义的操作。⽤户如果想修改这些队形,只能先将它们删除然后重建。⼀个关系数据库管理系统的实例中可以建⽴多个数据库,⼀个数据库中可以建⽴多个模式,⼀个模式下通常包括多个表、视图和索引等数据库对象模式的定义与删除定义模式代码CREATE SCHEMA<模式名>AUTHORIZATION<⽤户名>如果没有指定模式名,那么模式名隐含为⽤户名调⽤创建模式命令必须有CREATE SCHEMA的权限⽬前,在CREATE SCHEMA中可以接受CREATE TABEL,CREATE VIEW和GRANT⼦句。也就是说⽤户可以在创建模式的同时在这个模式定义中进⼀步创建基本表、视图,即CREATE SCHEMA <模式名> AUTHORIZATION <⽤户> [<表定义⼦句>|<视图定义⼦句>|<授权定义⼦句>]删除模式DROP SCHEMA <模式名>其中CASCADE和RESTRICT两者必须选其⼀。CASCASDE(级联),表⽰在删除模式的同时把该模式种所有的数据库对象全部删除;RESTRICT(限制)表⽰如果该模式中已经定义了下属的数据库对象(如表、视图等),则拒绝改删除语句的执⾏,只有当该模式中没有任何下属的对象时才能执⾏DROP SCHEMA语句基本表的定义、删除与修改定义基本表语法格式CREATE TABLE<表名>(<列名><数据类型>[列级完整性约束条件],<列名><数据类型>[列级完整性约束条件]……[,<表级完整性约束条件>])数据类型关系模型中有⼀个很重要的概念是域。每⼀个属性来⾃⼀个域,它的取值必须是域中的值。SQL中域的概念⽤数据类型来实现。定义表的各个属性时需要指明其数据类型及长度。模式与表每⼀个基本表都属⼀某⼀种模式,⼀个模式包含多个基本表。当定义基本表时⼀般有三种⽅法定义它所属的模式⽅法⼀、在表名中明显地给出模式名⽅法⼆、在创模式语句中同时创建表⽅法三、设置所属的模式,这样在创建表时表明中不必给出模式名当⽤户创建基本表时若没有指定模式,系统根据搜索路径来确定该对象所属的模式修改基本表ALTER TABLE<表名>[ADD [COLUMN]<新列名><数据类型>[完整性约束]][ADD<表级完整性约束>][DROP [COLUMN]<列名>[CASCADE|RESTRICT]][DROP CONSTRAINT<完整性约束名> [RESTRICT|CASCADE]][ALTER COLUMN<列名><数据类型>]表名是要修改的基本表ADD⽤于增加新列、新的列级完整性约束条件和新的表级完整性约束条。DROP COLUMN⼦句⽤于删除表中的列,如果指定了CASCADE,则⾃动删除引⽤了该列的其他对象,⽐如视图。如果指定了RESTRICT短语,则如果改列被其他对象引⽤,RDBMS将拒绝删除该列。DROP CONSTRAINT⽤于删除指定的完整性约束条件ALTER COLUMN⽤于修改原有的列定义,包括修改列明和数据类型删除基本表DROP TABLE<表名>[RESTRICT|CASCADE]RESTRICT该表的删除是有限制条件的。欲删除的基本表不能被其他表的约束所引⽤,不能有视图,不能有触发器,不能有存储过程或者函数CASCADE该表的删除没有限制条件。在删除基本表的同时,相关的依赖对象,如视图,都将被⼀起删除先声明⼀下,此处是按照王珊⽼师的数据库系统概论写的,但是如果⽤sql server运⾏的话指令是没法运⾏的索引的建⽴与删除当表的数据量⽐较⼤时,查询操作会⽐较耗时。建⽴索引是加快查询速度的有效⼿段。常见的索引包括顺序⽂件上的索引B+树索引散列(hash)索引位图索引建⽴索引在sql语⾔中,建⽴索引使⽤CREATE INDEX语句格式CREATTE [UNIQUE][CLUSTER] INDEX <索引名>ON <表名>(<列名>[<次序>][,<列名>[<次序>]]……)表名是要建⽴索引的基本表的名字。索引可以建⽴在该表的⼀列或多列上,各列名之间⽤逗号分隔。每个列名后⾯还可以⽤次序指定索引值的排列次序,可选ASC(升序)或DESC(降序),默认值为ASCUNIQUE表明此索引的每⼀个索引值只对应唯⼀的数据记录CLUSTER表明要建⽴的索引是聚簇索引修改索引对于已经建⽴的索引,如果需要对其重新命名,可以使⽤ALTER INDEX语句格式ALTER INDEX <旧索引名> RENAME TO <新索引名>这段代码是会报错的,⽐如这个地⽅错因在于alter不能改变索引名,如若改变索引名就需要调⽤存储过程将上⾯的代码改成这个即可EXEC sp_rename @objname = 'scno', @newname = 'scsno', @objtype = 'index';删除索引索引⼀旦建⽴就由系统使⽤和维护,不需要⽤户⼲预,建⽴索引是为了减少查询操作的时间,但如果数据增、删、改频繁。系统会花费许多时间来维护索引,从⽽降低了查询效率,这样可以删除⼀部分不必要的索引在SQL中,删除索引使⽤的是DROP INDEX语句格式DROP INDEX <索引名>删除索引时,系统会同时从数据字典中删除有关该索引的描述数据字典是关系数据库管理系统内部的⼀组系统表,记录了数据库中所有的定义信息,包括关系模式定义、视图定义、索引定义、完整性约束定义、各类⽤户对数据库的操作权限、统计信息等。关系数据库管理系统在执⾏SQL的数据定义语句时,实际上就是在更新数据字典中的相应信息。在进⾏查询优化和查询处理是啊,数据字典中的信息是其重要依据数据查询格式SELECT [ALL|DISTINCT]<⽬标列表达式>[,<⽬标列表达式>]…FROM <表名或视图名>[,<表名或视图名>…]|(
IS NOT NULL空值的约束条件不能为空值的情况属性定义(域定义)中有NOT NULL约束条件的不能为空值码属性不能为空值空值的算术预算、⽐较运算和逻辑运算空值与另⼀个值的算术运算的结果为空值,空值与另⼀个值得⽐较运算的结果为UNKNOWN有了UNKNOWN后,传统的逻辑运算中⼆值(TRUE,FALSE)逻辑就扩展成了三值逻辑视图视图是从⼀个或⼏个表(或视图)导出的表,它与基本表不同,是⼀个虚表。数据库中只存放视图的定义,⽽不存放视图对应的数据,这些数据仍存放在原来的基本表中定义视图建⽴视图CREATE VIEW<视图名>[(<列名>)[,<列名>…]]AS<⼦查询>[WITH CHECK OPTION]⼦查询可以实⼈⼀的SELECT语句,是可以含有ORDER BY⼦句和DISTINCT短语,则取决于具体系统的实现下列情况必须明确指定组成视图的所有列名:某个⽬标列不是单纯的属性名,⽽是聚集函数或表达式多表连接时选出了⼏个同名列作为视图的字段需要在视图中为某个列期⽤新的更合适的名字关系数据库管理系统执⾏CREATE VIEW语句的结果只是把视图的定义存⼊数据字典,并不执⾏其中得SELECT语句CREATE VIEW IS_StudentASSELECT Sno,Sname,SageFROM StudentWHERE Sdept='IS'WITH CHECK OPTION由于加上了WITH CHECK OPTION⼦句,以后对该视图进⾏插⼊、修改和删除操作时,关系数据库管理系统会⾃动加上Sdept='IS’的条件。若⼀个视图是从单个基本表导出的,并且只是去掉了基本表的某些⾏和某些列,但保留了主码,则称这类视图为⾏列⼦集视图视图不仅可以建⽴在⼀个或多个基本表上,也可以建⽴在⼀个或多个已定义好的视图上,或建⽴在基本表与视图上定义基本表时,为了减少数据库中的冗余数据,表中只存放基本数据,由基本数据经过各种计算派⽣出的数据⼀般是不存储的。由于视图中的数据并不实际存储,所以定义视图时可以根据应⽤的需要设置⼀些派⽣属性列。这些派⽣属性由于在基本表中并不实际存在,也称它们为虚拟列。带虚拟列的视图也称为带表达式的视图带有聚类函数和GROUP BY⼦句的查询来定义视图,这种视图称为分组视图如果视图对应得基本表发⽣了更改,视图将⽆法正常⼯作,修改基本表后应该删除由该基本表导出得视图,然后重建这个视图删除视图DROP VIEW <视图名> [CASCADE]视图删除后视图的定义将从数据字典中删除。如果该视图上还到处了其他视图,则使⽤CASCADE级联删除语句把该视图和由它导出的所有视图⼀起删除基本表删除后,由该基本表导出的所有视图均⽆法使⽤了,但是视图的定义没有从字典中清除。删除这些视图定义需要显式地使⽤DROPVIEW语句如果由于该视图还导出了其他视图需要使⽤级联删除语句DROP VIEW IS_S1 CASCADE查询视图关系数据库关系系统执⾏对视图的查询时,⾸先进⾏有效检查,检查查询中涉及的表、视图等是否存在。如果存在,则从数据字典中取出视图的定义,把定义中的⼦查询和⽤户查询结合起来,转换为等价的对基本表的查询,然后再执⾏修正了的查询。这⼀转换过程称为视图消解因为WHERE⼦句中是不能⽤聚类函数作为条件表达式的,因此执⾏修正后的查询将会出现语法错误⽬前多数关系数据库系统对⾏列⼦集视图的查询均能进⾏正确转换。但对⾮⾏列⼦集视图的查询就不⼀定能做转换了定义视图并查询与基于派⽣表的查询是有区别的,派⽣表只是在语句执⾏时临时定义,语句执⾏后该定义即被删除更新视图更新视图是指通过插⼊、删除和修改数据由于视图是不实际存储数据的虚表,因此对视图的更新最终要转换为对基本表的更新为了防⽌⽤户通过视图对数据进⾏增加、删除、修改时,有意⽆意地对不属于视图范围内的基本表数据进⾏操作,可在定义视图时加上WITH CHECK OPTION⼦句。这样在视图上增、删、改数据时,关系数据库管理系统会检查定义中的条件,若不满⾜条件则拒绝执⾏该操作关系数据库中,并不是所有的视图都是可更新的,因为有些视图的更新不能唯⼀地有意义地转换成对相应基本表的更新⼀般地,⾏列⼦集视图是可更新的。视图的作⽤视图能简化⽤户的操作视图使⽤户能以多种⾓度看待同⼀数据视图对重构数据库提供了⼀定程度的逻辑独⽴性视图能够对机密数据提供安全保护适当利⽤视图可以更清晰地表达查询联系我⼀笑不琅然⼀个专注于搞事的IT男
2023年6月21日发(作者:)
数据库学习笔记7关系数据库标准语⾔SQLSQL概述⽬前,没有⼀个数据库系统能够⽀持SQL标准的所有概念和特性许多软件⼚商对SQL基本命令集还进⾏了不同程度的扩充和修改,有可以⽀持标准以外的⼀些功能特性SQL的特点SQL集数据查询(data query)、数据操纵(data manipulation)、数据定义(data definition)和数据控制(data control)功能于⼀体。综合统⼀⾮关系模型(层次模型、⽹状模型)的数据语⾔⼀般都分为:模式数据定义语⾔(Schema Data Definition Language,模式DDL) ——定义模式外模式数据定义语⾔(Subschema Data Definition Language,外模式DDL或⼦模式DDL)——定义外模式数据存储有关的描述语⾔(Data Stroage Description Language, DSDL)——定义内模式数据操纵语⾔(Data Manipulation Language,DML)——进⾏数据的存储与处置SQL集数据定义语⾔、数据操纵语⾔、数据控制语⾔的功能于以梯,语⾔风格统⼀,可以独⽴完成数据库⽣命周期中的全部活动,包括以下⼀系列操作要求:定义和修改、删除关系模式,定义和删除视图,插⼊数据,建⽴数据库对数据库中的数据进⾏查询和更新数据库重构和维护数据库安全性、完整性控制,以及事务控制嵌⼊式SQL和动态SQL定义⾼度⾮过程化⾮关系数据模型的数据操纵语⾔是⾯向过程的与i眼,⽤过程化语⾔完成某项请求必须指定存取路径SQL进⾏数据操作时,只要提出“做什么”,⽽⽆须知名“怎么做”,因此⽆需了解存取路径。存取路径的选择以及SQL的操作过程由系统⾃动完成⾯向集合的操作⽅式⾮关系数据模型采⽤的是⾯向记录的操作⽅式,操作对象是⼀条记录。SQL采⽤的是集合擦制作⽅式,不仅操作对象、查找结果可以是元组的集合,⽽且⼀次插⼊、删除、更新操作的对象也可以是元组的集合以同⼀种语法结构提供多种使⽤⽅式语⾔简介,易学易⽤学⽣-课程数据库使⽤学⽣-课程数据库为例StudentSno201215121Sname李勇Ssex男Sage20SdeptCS201215122Sno215125刘晨Sname王敏张⽴⼥Ssex⼥男19Sage1819CSSdeptMAISCourseCno1234567Cname数据库数学信息系统操作系统数据结构数据处理PASCAL语⾔6167Cpno5Ccredit4243424SCSno2201215122Cno12323Grade9285889080数据定义SQL的数据定义语句操作对象模式表视图索引创建CREATE SCHEMACREATE TABLECREATE VIEWCREATE INDEX删除DROP SCHEMADROP TABLEDROP VIEWDROP INDEXALTER INDEXALTER TABLE修改SQL标准不提供修改模式定义和修改视图定义的操作。⽤户如果想修改这些队形,只能先将它们删除然后重建。⼀个关系数据库管理系统的实例中可以建⽴多个数据库,⼀个数据库中可以建⽴多个模式,⼀个模式下通常包括多个表、视图和索引等数据库对象模式的定义与删除定义模式代码CREATE SCHEMA<模式名>AUTHORIZATION<⽤户名>如果没有指定模式名,那么模式名隐含为⽤户名调⽤创建模式命令必须有CREATE SCHEMA的权限⽬前,在CREATE SCHEMA中可以接受CREATE TABEL,CREATE VIEW和GRANT⼦句。也就是说⽤户可以在创建模式的同时在这个模式定义中进⼀步创建基本表、视图,即CREATE SCHEMA <模式名> AUTHORIZATION <⽤户> [<表定义⼦句>|<视图定义⼦句>|<授权定义⼦句>]删除模式DROP SCHEMA <模式名>其中CASCADE和RESTRICT两者必须选其⼀。CASCASDE(级联),表⽰在删除模式的同时把该模式种所有的数据库对象全部删除;RESTRICT(限制)表⽰如果该模式中已经定义了下属的数据库对象(如表、视图等),则拒绝改删除语句的执⾏,只有当该模式中没有任何下属的对象时才能执⾏DROP SCHEMA语句基本表的定义、删除与修改定义基本表语法格式CREATE TABLE<表名>(<列名><数据类型>[列级完整性约束条件],<列名><数据类型>[列级完整性约束条件]……[,<表级完整性约束条件>])数据类型关系模型中有⼀个很重要的概念是域。每⼀个属性来⾃⼀个域,它的取值必须是域中的值。SQL中域的概念⽤数据类型来实现。定义表的各个属性时需要指明其数据类型及长度。模式与表每⼀个基本表都属⼀某⼀种模式,⼀个模式包含多个基本表。当定义基本表时⼀般有三种⽅法定义它所属的模式⽅法⼀、在表名中明显地给出模式名⽅法⼆、在创模式语句中同时创建表⽅法三、设置所属的模式,这样在创建表时表明中不必给出模式名当⽤户创建基本表时若没有指定模式,系统根据搜索路径来确定该对象所属的模式修改基本表ALTER TABLE<表名>[ADD [COLUMN]<新列名><数据类型>[完整性约束]][ADD<表级完整性约束>][DROP [COLUMN]<列名>[CASCADE|RESTRICT]][DROP CONSTRAINT<完整性约束名> [RESTRICT|CASCADE]][ALTER COLUMN<列名><数据类型>]表名是要修改的基本表ADD⽤于增加新列、新的列级完整性约束条件和新的表级完整性约束条。DROP COLUMN⼦句⽤于删除表中的列,如果指定了CASCADE,则⾃动删除引⽤了该列的其他对象,⽐如视图。如果指定了RESTRICT短语,则如果改列被其他对象引⽤,RDBMS将拒绝删除该列。DROP CONSTRAINT⽤于删除指定的完整性约束条件ALTER COLUMN⽤于修改原有的列定义,包括修改列明和数据类型删除基本表DROP TABLE<表名>[RESTRICT|CASCADE]RESTRICT该表的删除是有限制条件的。欲删除的基本表不能被其他表的约束所引⽤,不能有视图,不能有触发器,不能有存储过程或者函数CASCADE该表的删除没有限制条件。在删除基本表的同时,相关的依赖对象,如视图,都将被⼀起删除先声明⼀下,此处是按照王珊⽼师的数据库系统概论写的,但是如果⽤sql server运⾏的话指令是没法运⾏的索引的建⽴与删除当表的数据量⽐较⼤时,查询操作会⽐较耗时。建⽴索引是加快查询速度的有效⼿段。常见的索引包括顺序⽂件上的索引B+树索引散列(hash)索引位图索引建⽴索引在sql语⾔中,建⽴索引使⽤CREATE INDEX语句格式CREATTE [UNIQUE][CLUSTER] INDEX <索引名>ON <表名>(<列名>[<次序>][,<列名>[<次序>]]……)表名是要建⽴索引的基本表的名字。索引可以建⽴在该表的⼀列或多列上,各列名之间⽤逗号分隔。每个列名后⾯还可以⽤次序指定索引值的排列次序,可选ASC(升序)或DESC(降序),默认值为ASCUNIQUE表明此索引的每⼀个索引值只对应唯⼀的数据记录CLUSTER表明要建⽴的索引是聚簇索引修改索引对于已经建⽴的索引,如果需要对其重新命名,可以使⽤ALTER INDEX语句格式ALTER INDEX <旧索引名> RENAME TO <新索引名>这段代码是会报错的,⽐如这个地⽅错因在于alter不能改变索引名,如若改变索引名就需要调⽤存储过程将上⾯的代码改成这个即可EXEC sp_rename @objname = 'scno', @newname = 'scsno', @objtype = 'index';删除索引索引⼀旦建⽴就由系统使⽤和维护,不需要⽤户⼲预,建⽴索引是为了减少查询操作的时间,但如果数据增、删、改频繁。系统会花费许多时间来维护索引,从⽽降低了查询效率,这样可以删除⼀部分不必要的索引在SQL中,删除索引使⽤的是DROP INDEX语句格式DROP INDEX <索引名>删除索引时,系统会同时从数据字典中删除有关该索引的描述数据字典是关系数据库管理系统内部的⼀组系统表,记录了数据库中所有的定义信息,包括关系模式定义、视图定义、索引定义、完整性约束定义、各类⽤户对数据库的操作权限、统计信息等。关系数据库管理系统在执⾏SQL的数据定义语句时,实际上就是在更新数据字典中的相应信息。在进⾏查询优化和查询处理是啊,数据字典中的信息是其重要依据数据查询格式SELECT [ALL|DISTINCT]<⽬标列表达式>[,<⽬标列表达式>]…FROM <表名或视图名>[,<表名或视图名>…]|()[AS]<别名>[WHERE<条件表达式>][GROUP BY<列名1>[HAVING<条件表达式>]][ORDER BY<列名2>[ASC|DESC]]根据where⼦句的条件表达式从from⼦句指定的基本表、视图或派⽣表中找出满⾜条件的元组,再按select⼦句中的⽬标列表达式选出元组中的属性值形成结果表若有group by⼦句,则将结果按<列名1>的值进⾏分组,该属性列值相等的元组为⼀个组。通常会在每组中作⽤聚集函数。如果group by⼦句带having短语,则只有满⾜指定条件的组才予以输出如果有order by⼦句,则结果表还要按<列名2>的值的升序或者降序排序select语句即可完成简单的单表查询,也可以完成复杂的连接查询和嵌套查询。单表查询选择表中的若⼲列查询指定列SELECT <⽬标列表达式>查询全部列SELECT *查询经过计算的值SELECT⼦句的⽬标表达式不仅可以实表中的属性列,也可以是表达式(如通过出⽣年份计算年龄)选择表中的若⼲元组消除取值重复的⾏两个本来并不完全相同的元组在投影到指定的某些列上后,可能会变成相同的⾏。可以⽤DISTINCT消除它们例原SELECT SnoFROM SC使⽤DISTINCT后SELECT DISTINCT SnoFROM SC查询满⾜条件的元组查询满⾜指定条件的元组可以通过WHERE⼦句实现。WHERE⼦句常⽤的查询条件如表所⽰查询条件谓词⽐较查询条件确定范围确定集合字符匹配空值多重条件(逻辑运算)=,>,<,>=,<=,!=,<>,!>,!<;NOT+上述⽐较运算符谓词BETWEEN AND, NOT BETWEEN ANDIN, NOT INLIKE, NOT LIKEIS NULL, IS NOT NULLAND, OR, NOT⽐较⼤⼩⽤于进⾏⽐较的运算符⼀般包括=(等于),>(⼤于),<(⼩于),>=(⼤于等于),<=(⼩于等于),!=(不等于),<>(不等于),!>(不⼤于),!<(不⼩于)关系数据管理系统执⾏查询的⼀种可能的过程是:对全表进⾏扫描,取出⼀个元组,检查该元组是否符合条件,如果符合则取出,并形成⼀个新的元组输出,否则跳过该元组,取下⼀个元组。重复该过程,知道处理完所有元组第⼆种⽅法系统,利⽤索引找出满⾜条件的索引,加快查询速度。ps:如果学⽣较少,索引查询不⼀定能提⾼查询效率,系统仍会使⽤全表扫描。这由查询优化器按照某些规则或估计执⾏代价来作出选择确定范围BETWEEN……AND……和NOT BETWEEN……AND……可以⽤来查找属性值在(或者不在)指定范围内的元组,其中BETWEEN后是范围的下限(即低值),AND后是范围的上限(即⾼值)确定合集IN⽤来查找属性值属于指定集合的元组字符匹配⽤LIKE可以进⾏字符串的匹配,格式[NOT] LIKE'<匹配串>'[ESCAPE '<换码字符>']查找指定的属性列与<匹配串>相匹配的元组。匹配串可以是⼀个完整的字符串,也可以是含有通配符%和_%代表任意长度的字符串_代表任意单个字符如果⽤户要查询的字符本⾝就含有通配符 % 或 _ 需要⽤ESCAPE '<换码字符>'对通配符进⾏转意涉及空值的查询WHERE GRADE IS [NOT]NULL多重条件查询逻辑运算符AND和OR可⽤来连接多个查询条件。AND的优先级⾼于OR,但⽤户可以⽤括号改变优先级ORDER BY⼦句⽤户可以⽤ORDER BY⼦句对查询结果按照⼀个或多个属性列的升序(ASC)或降(DESC)排序,默认值为升序对于空值,排序时显⽰的次序由具体系统实现来决定。例如,按升序排,含空值的元组最后显⽰,按降序排,空值的元组最先显⽰,各个系统的实现可以不同,只要保持⼀致就⾏聚集函数为了进⼀步⽅便⽤户,增强检索功能,SQL提供了许多聚类函数COUNT(*) 统计元组个数COUNT([DISTINCT|ALL]<列名>) 统计⼀列中值的个数SUM([DISTINCT|ALL]) 计算⼀列值的总和(此列必须是数值型)AVG([DISTINCT|ALL]<列名>) 计算⼀列值的平均值(此列必须是数值型)MAX([DISTINCT|ALL]<列名>) 求⼀列值中的最⼤值MIN([DISTINCT|ALL]<列名>) 求⼀列值中的最⼩值如果指定DISTINCT短语,则表⽰在计算时要取消指定列中的重复值。如果不指定或者指定ALL短语,则表⽰不取消重复值当据类函数遇到空值时,除COUNT( * )外,都跳过空值⽽只处理⾮空值,COUNT( * )是对元组进⾏技术,某个元组的⼀个或者部分列取空值不影响COUNT的统计结果ps:WHERE⼦句中是不能⽤聚类函数作为条件表达式的。聚类函数只能⽤于SELECT⼦句和GROUP BY中的HAVING⼦句GROUP BY ⼦句将查询结果按照某⼀列或多列的值分组,值相等的为⼀组。对查询结果分组的⽬的是为了细化据类函数的作⽤对象。如果未对查询结果分组,聚类函数将作⽤与整个查询结果分组后聚类函数将作⽤于每⼀个组,即每⼀个组都有⼀个函数值。可以搭配count聚类函数实现对满⾜某些条件的元组进⾏数量统计连接查询若⼀个查询同时涉及两个以上的表,则称之为连接查询。连接查询是关系数据库中最主要的查询,包括等值连接查询、⾃然连接查询、⾮等值连接查询、⾃⾝连接查询、外连接查询和复合条件连接查询等值与⾮等值连接查询连接查询的WHERE⼦句中⽤来连接两个表的条件称为连接条件或连接谓词,其⼀般格式为[<表名1>.]<列名1><⽐较运算符>[<表名2>.]<列名2>其中⽐较运算符主要有=、>、<、>、+、<=、!=(或<>)等此外连接谓词还可以使⽤下⾯形式:[<表名1>.]<列名1>BETWEEN[<表名2>.]<列名2>AND[<表名2>.]<列名3>当连接运算符为=时,称为等值连接。使⽤其他运算符称为⾮等值连接连接谓词中的列名称为连接字段,连接条件中的各连接字段类型必须是可⽐的,但名字不必相同关系数据库管理系统执⾏连接操作的⼀种可能过程是:⾸先在表1中找到第⼀个元组,然后从头开始扫描第⼆个表,注意查找与第⼀个表中第⼀个元组的列1相等的第⼆个表的元组,找到后与将第⼀个表中的第⼀个元组与该元组拼接起来,形成结果表中⼀个元组。第⼆个表中全部查找完毕后,再照第⼀个表中第⼆个元组,然后从头开始扫描第⼆个表,逐⼀查找满⾜连接条件的元组,找到后将第⼀个表中的第⼆个元组与该元组拼接起来,形成结果表中⼀个元组,重复上述操作,直到第⼀个表中全部元组处理完毕位为⽌,这就是嵌套循环连接算法的基本思想。如果在建⽴了索引的表中,就不需要每次全表扫描了,根据表中的值通过索引找到相应的元组。ps:⽤索引查询通常回避全表扫描快若在等值连接中把⽬标列中重复的属性列去掉则为⾃然连接⼀条SQL语句可以同时完成选择和连接查询,这时的WHERE⼦句是由连接谓词和选择谓词组成的复合条件,此种查询是⼀种优化(⾼效)的执⾏过程⾃⾝连接⼀个表与其⾃⾝进⾏连接,称为表的⾃⾝连接取别名select * from "first", "second"此时要为表取两个别名,⼀个是FIRST,另⼀个是SECONDSELECT "first".Cno,"second".CpnoFROM "first", "second"WHERE "first".Cpno="second".Cno外连接将悬浮元组保存在结果关系中的连接称为外连接(悬浮元组的值为NULL)select ,sname,ssex,sage,adept,cno,gradefrom student left outer join sc on (=)也可以使⽤USING来去掉结果中的重复值:FROM Student LEFT OUTER JION SC USING (Sno)左外连接列出左边关系中的所有元组,右外连接列出右边关系中所有的元组多表连接连接操作除了可以两表连接、⼀个表与其⾃⾝连接外,还可以是两个以上的表进⾏连接,后者通常称为多表连接过程理解:通常是先进⾏两个表的连接操作,再将连接结果与第三个表进⾏连接。嵌套查询在SQL语⾔中,⼀个SELECT-FROM-WHERE语句称为⼀个查询块,将⼀个查询块嵌套在另⼀个查询块的WHERE⼦句或HAVING短语的条件中的查询称为嵌套查询上层的查询块称为外层查询或⽗查询下层的查询块称为内层查询或⼦查询嵌套查询使⽤户可以⽤过个简餐查询构成复杂的查询,从⽽增强SQL的查询能⼒。以层层嵌套的⽅式来构造程序正是SQL中“结构化”的含义所在带有IN谓词的⼦查询在嵌套查询中,⼦查询的结果往往是⼀个集合,所以谓词IN是嵌套查询中最经常使⽤的谓词⼦查询的查询条件不依赖于⽗查询,称为不相关⼦查询有些嵌套查询可以⽤连接运算替代,有些是不能替代的查询涉及多个关系时,⽤嵌套查询逐步求解层次清楚,易于构造,具有结构化程序设计的优点,再实际应⽤中,能够⽤连接运算表达的查询尽可能采⽤连接运算如果⼦查询的查询条件依赖于⽗查询,这类⼦查询称为相关⼦查询,整个查询语句称为相关嵌套查询语句带有⽐较运算符的⼦查询带有⽐较运算符的查询是指⽗查询与⼦查询之间⽤⽐较运算符进⾏连接。当⽤户能确切知道内层查询返回的是单个值时,可⽤⽐较运算符连接带有ANY(SOME)或ALL谓词的⼦查询⼦查询返回单值时可以⽤⽐较运算符,但返回多值要⽤ANY(有的系统⽤SOME)或ALL谓词修饰符。⽽是⽤ANY或ALL谓词时则必须同时使⽤⽐较运算符表达式>ANY>ALL=ANY>=ALL<=ANY<=ALL=ANY含义⼤于⼦查询结果中的某个值⼤于⼦查询结果中的所有值⼩于⼦查询结果中的某个值⼩于⼦查询结果中的所有值⼤于等于⼦查询结果中的某个值⼤于等于⼦查询结果中的所有值⼩于等于⼦查询结果中的任意值⼩于等于⼦查询结果中的所有值等于⼦查询结果中的某个值=ALL表达式!=(<>)ANY!=(<>ALL)等于⼦查询结果中的所有值(通常没有实际意义)含义不等于⼦查询结果中的某个值不等于查询结果中的任何⼀个值ANY(SOME)、ALL谓词与聚类函数、IN谓词的等价转换关系=ANYALLIN–<>或!=–NOT IN<>MIN>MAN>=>=MIN>=MAX带有EXISTS谓词的⼦查询带有EXISTS谓词的⼦查询不返回任何数据,只产⽣逻辑真值“true”或逻辑假值“false”使⽤存在两次NOT EXISTS后,则相反集合查询集合操作主要包括并操作 UNION交操作 INTERSECT差操作 EXCEPT参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同基于派⽣表的查询⼦查询不仅可以出现在WHERE⼦句中,还可以出现在FROM⼦句中,这时⼦查询⽣成的临时派⽣表称为著查询的查询对象FROM Student,(SELECT Sno FROM SC WHERE Cno='1') AS SC1通过from⼦句⽣成派⽣表时,as关键字可以省略,但是必须为派⽣关系指定⼀个别名,⽽对于基本表,别名是可选项SELECT语句的⼀般格式SELECT [ALL|DISTINCT]<⽬标列表达式>[别名][,<⽬标列表达式>[别名]]……FROM<表名或视图名>[别名][,<表明或视图名>[别名]]…|()[AS]<别名>[WHERE<条件表达式>][GROUP BY<列名1>[HAVING<条件表达式>]][ORDER BY<列名2>[ASC|DESC]]数据更新插⼊数据插⼊语句INSERT通常有两种形式,⼀种是插⼊⼀个元组,另⼀种是插⼊⼦查询结果。后者可以⼀次插⼊多个元组插⼊元组INSERTINTO <表名>[(<属性列1>[,<属性列2>]…)]VALUES(<常量1>[,<常量2>…)INTO⼦句中没有出现的属性列,⼼猿族再这些列上将取空值。但必须注意的是,在表定义事说明了NOT NULL的属性列不能取空值,否则会出错如果INTO⼦句中没有指明任何属性列表,则新插⼊的元组必须再每个属性列上均有值ps:字符串常数要⽤单引号(英⽂括号)括起来插⼊⼦查询结果INSERTINTO<表名>[(<属性列1>[,<属性列2>…])]⼦查询修改数据UPDATE<表名>SET<列名>=<表达式>[,<列名>=<表达式>]…[WHERE<条件>]修改指定表中满⾜WHERE⼦句条件的元组。其中SET⼦句给出<表达式>的值⽤于取代相应的属性列值。如果省略WHERE⼦句,则表⽰要修改表中的所有元组删除数据DELECTFROM <表名>[WHERE <条件>]DELETE语句删除的是表中的数据,⽽不是关于表的定义空值的处理所谓空值就是不知道或者不存在或者⽆意义的值,SQL语⾔中允许某些元组的某些属性再⼀定情况下取空值。⼀般有⼀下⼏种情况该属性有⼀个值,但⽬前不知道它的具体值该属性不应该有值由于某种原因不便于填写空值是⼀个很特殊的值,含有不确定性主键不能为空值空值的产⽣插⼊值时产⽣空值外连接空值的判断判断⼀个属性是否为空值使⽤IS NULL
IS NOT NULL空值的约束条件不能为空值的情况属性定义(域定义)中有NOT NULL约束条件的不能为空值码属性不能为空值空值的算术预算、⽐较运算和逻辑运算空值与另⼀个值的算术运算的结果为空值,空值与另⼀个值得⽐较运算的结果为UNKNOWN有了UNKNOWN后,传统的逻辑运算中⼆值(TRUE,FALSE)逻辑就扩展成了三值逻辑视图视图是从⼀个或⼏个表(或视图)导出的表,它与基本表不同,是⼀个虚表。数据库中只存放视图的定义,⽽不存放视图对应的数据,这些数据仍存放在原来的基本表中定义视图建⽴视图CREATE VIEW<视图名>[(<列名>)[,<列名>…]]AS<⼦查询>[WITH CHECK OPTION]⼦查询可以实⼈⼀的SELECT语句,是可以含有ORDER BY⼦句和DISTINCT短语,则取决于具体系统的实现下列情况必须明确指定组成视图的所有列名:某个⽬标列不是单纯的属性名,⽽是聚集函数或表达式多表连接时选出了⼏个同名列作为视图的字段需要在视图中为某个列期⽤新的更合适的名字关系数据库管理系统执⾏CREATE VIEW语句的结果只是把视图的定义存⼊数据字典,并不执⾏其中得SELECT语句CREATE VIEW IS_StudentASSELECT Sno,Sname,SageFROM StudentWHERE Sdept='IS'WITH CHECK OPTION由于加上了WITH CHECK OPTION⼦句,以后对该视图进⾏插⼊、修改和删除操作时,关系数据库管理系统会⾃动加上Sdept='IS’的条件。若⼀个视图是从单个基本表导出的,并且只是去掉了基本表的某些⾏和某些列,但保留了主码,则称这类视图为⾏列⼦集视图视图不仅可以建⽴在⼀个或多个基本表上,也可以建⽴在⼀个或多个已定义好的视图上,或建⽴在基本表与视图上定义基本表时,为了减少数据库中的冗余数据,表中只存放基本数据,由基本数据经过各种计算派⽣出的数据⼀般是不存储的。由于视图中的数据并不实际存储,所以定义视图时可以根据应⽤的需要设置⼀些派⽣属性列。这些派⽣属性由于在基本表中并不实际存在,也称它们为虚拟列。带虚拟列的视图也称为带表达式的视图带有聚类函数和GROUP BY⼦句的查询来定义视图,这种视图称为分组视图如果视图对应得基本表发⽣了更改,视图将⽆法正常⼯作,修改基本表后应该删除由该基本表导出得视图,然后重建这个视图删除视图DROP VIEW <视图名> [CASCADE]视图删除后视图的定义将从数据字典中删除。如果该视图上还到处了其他视图,则使⽤CASCADE级联删除语句把该视图和由它导出的所有视图⼀起删除基本表删除后,由该基本表导出的所有视图均⽆法使⽤了,但是视图的定义没有从字典中清除。删除这些视图定义需要显式地使⽤DROPVIEW语句如果由于该视图还导出了其他视图需要使⽤级联删除语句DROP VIEW IS_S1 CASCADE查询视图关系数据库关系系统执⾏对视图的查询时,⾸先进⾏有效检查,检查查询中涉及的表、视图等是否存在。如果存在,则从数据字典中取出视图的定义,把定义中的⼦查询和⽤户查询结合起来,转换为等价的对基本表的查询,然后再执⾏修正了的查询。这⼀转换过程称为视图消解因为WHERE⼦句中是不能⽤聚类函数作为条件表达式的,因此执⾏修正后的查询将会出现语法错误⽬前多数关系数据库系统对⾏列⼦集视图的查询均能进⾏正确转换。但对⾮⾏列⼦集视图的查询就不⼀定能做转换了定义视图并查询与基于派⽣表的查询是有区别的,派⽣表只是在语句执⾏时临时定义,语句执⾏后该定义即被删除更新视图更新视图是指通过插⼊、删除和修改数据由于视图是不实际存储数据的虚表,因此对视图的更新最终要转换为对基本表的更新为了防⽌⽤户通过视图对数据进⾏增加、删除、修改时,有意⽆意地对不属于视图范围内的基本表数据进⾏操作,可在定义视图时加上WITH CHECK OPTION⼦句。这样在视图上增、删、改数据时,关系数据库管理系统会检查定义中的条件,若不满⾜条件则拒绝执⾏该操作关系数据库中,并不是所有的视图都是可更新的,因为有些视图的更新不能唯⼀地有意义地转换成对相应基本表的更新⼀般地,⾏列⼦集视图是可更新的。视图的作⽤视图能简化⽤户的操作视图使⽤户能以多种⾓度看待同⼀数据视图对重构数据库提供了⼀定程度的逻辑独⽴性视图能够对机密数据提供安全保护适当利⽤视图可以更清晰地表达查询联系我⼀笑不琅然⼀个专注于搞事的IT男
发布评论