数据库语言SQL.ppt
第五章第五章 数据库语言数据库语言SQLSQL:Structured Query Language SQL与关系代数之间的关系:与关系代数之间的关系:SQL的多数特性可对应关系代数的特性,如投影、的多数特性可对应关系代数的特性,如投影、选择、自然连接等;选择、自然连接等;SQL也超越关系代数,如聚合运算和数据更新;也超越关系代数,如聚合运算和数据更新;关系代数可实现的计算,标准关系代数可实现的计算,标准SQL都可实现。都可实现。SQL标准:标准:早期标准早期标准ANSI(American National Standard Institute);SQL92或或SQL2;较新的较新的SQL3。数据库语言数据库语言SQL商业数据库系统符合的标准:商业数据库系统符合的标准:都支持都支持ANSI;很大程度支持很大程度支持SQL2标准;标准;支持支持SQL3的部分标准;的部分标准;都有自己的方言。都有自己的方言。SQL的主要内容:的主要内容:DQL数据查询数据查询(select)5.15.5,5.9DML数据操纵数据操纵(insert,delete,update)5.6DDL数据定义数据定义(create,drop,alter)5.75.8和第和第6章章DCL数据控制数据控制(grant,revoke)7.4 数据库语言数据库语言SQL数据库服务器、数据库和表之间的关系:数据库服务器、数据库和表之间的关系:一个数据库服务器一个数据库服务器Database Server是一个驱动引擎程序,是一个驱动引擎程序,当驱动起来之后,可提供当驱动起来之后,可提供SQL服务。服务。一个数据库一个数据库database是一组语义相关的关系模式。通常是一组语义相关的关系模式。通常可对应某一个或几个文件。可对应某一个或几个文件。一个数据库服务器可支持一个数据库服务器可支持1个或多个数据库运行。个或多个数据库运行。一个表一个表table是一个关系。是一个关系。一个数据库可包含多个表,相互间可建立参照完整性。一个数据库可包含多个表,相互间可建立参照完整性。要访问某个表,必须由数据库服务器先启动该表所在的要访问某个表,必须由数据库服务器先启动该表所在的数据库。数据库。数据库语言数据库语言SQL一个表中主要性质和内容:一个表中主要性质和内容:一个表名一个表名一组列一组列columns:列名,数据类型,缺省值,约列名,数据类型,缺省值,约束束(主键、允许空值、唯一值主键、允许空值、唯一值)等。等。一组外键一组外键Foreign keys:本表中某些属性需要参本表中某些属性需要参照其它表的主键。照其它表的主键。(Referenced By)一组约束一组约束constraints一组权限一组权限permissions一组索引一组索引indexes一组触发器一组触发器triggers等等数据库语言数据库语言SQL常用数据类型:常用数据类型:字符型:字符型:Char,Varchar,需确定字符串长度,以字节为单位。单引号标注。需确定字符串长度,以字节为单位。单引号标注。数值型:数值型:整数:整数:Tinyint 1字节字节Smallint 2字节字节Int|Integer 4字节字节BigInt 8字节字节浮点数:浮点数:精确浮点数:精确浮点数:Decimal|Dec(precision,scale)(数字总位数数字总位数,小数点小数点后位数后位数)Numeric(precision,scale)近似浮点数:近似浮点数:Real,Double,Float(小数点后位数小数点后位数)日期型日期型Date yyyy-mm-dd时间型时间型Time hh:mm:ss.sssss每一个属性每一个属性(列列)必须确定一种数据类型。还可能有缺省值。必须确定一种数据类型。还可能有缺省值。数据库语言数据库语言SQL约束之间的主要关系:约束之间的主要关系:主键主键(Primary Key)主键属性不允许为空值主键属性不允许为空值NULL。说明说明unique唯一值的属性隐含不允许为空值唯一值的属性隐含不允许为空值NULL。若表的主键是一个属性,则该属性隐含若表的主键是一个属性,则该属性隐含unique唯一值(如唯一值(如Salesman 中的中的idno);说明);说明unique唯一值的属性未必是主键。唯一值的属性未必是主键。若表的主键是两个以上属性,则每个属性都不能说明为若表的主键是两个以上属性,则每个属性都不能说明为unique唯唯一值。如一值。如Salesitem中的中的salesno,lineno外键外键(Foreign Key)外键所关联的双方必须具有相同的数据类型和长度。外键所关联的双方必须具有相同的数据类型和长度。外键所关联的双方不一定具有相同的名字。外键所关联的双方不一定具有相同的名字。外键是一种参照关系:从外键是一种参照关系:从“参照方参照方”到到“被参照方被参照方”。参照方是本表中的属性,被参照方是其它表的主键属性,或参照方是本表中的属性,被参照方是其它表的主键属性,或unique属性。属性。索引索引(index)说明主键和外键都自动建立索引。说明主键和外键都自动建立索引。已建立索引的属性的性质已建立索引的属性的性质(properties,如属性名、类型、长度,如属性名、类型、长度)不能修改。不能修改。若被参照的主键修改,所有参照它的外键会自动取消。若被参照的主键修改,所有参照它的外键会自动取消。数据库语言数据库语言SQL用用ISQL更新数据更新数据注意:注意:Command-Options 选择选择 Commit After Every Command,并按,并按permanent存储。存储。目的是每条语句执行后都提交数据到数据库,以实现永目的是每条语句执行后都提交数据到数据库,以实现永久存储。久存储。运行运行insert/update/delete指令。指令。在更新数据之前,应确保数据库模式正确;而且保持模在更新数据之前,应确保数据库模式正确;而且保持模式稳定。式稳定。注意:当改变一个数据库模式时注意:当改变一个数据库模式时(修改表或列的性修改表或列的性质质),该数据库不允许有其它连接。,该数据库不允许有其它连接。ISQL必须关必须关闭。闭。数据库语言数据库语言SQLSQL语句计算正确性语句计算正确性的验证:验证:分析计算要求分析计算要求构造构造SQL语句语句准备试验数据准备试验数据手工计算结果手工计算结果运行运行SQL得到结果得到结果结果是否一致结果是否一致?5.1 简单查询简单查询对单个关系的查询。对单个关系的查询。SELECT ALL|DISTINCT select-listFROM RWHERE condORDER BY expression|integer ASC|DESC,select-list:*|column-name|expression AS alias-name,.所有所有SQL语句的关键词、表名、列名大小写无语句的关键词、表名、列名大小写无关。关。SQL语句可多行书写。语句可多行书写。SQL语句用分号语句用分号(英文英文)结尾。结尾。5.1.1 投影投影SELECT子句的构成:子句的构成:*表示所有属性,按缺省次序排列。表示所有属性,按缺省次序排列。SELECT*FROM customer;可投影到若干属性:可投影到若干属性:SELECT custid,name FROM customer;AS 别名别名(改名运算,改变列名改名运算,改变列名)SELECT custid,name AS CUSTNAME FROM customer;表达式表达式SELECT orderno,lineno,singlecost*quantity AS accountFROM salesitem;常量也可作为一列常量也可作为一列SELECT orderno,lineno,singlecost*quantity AS account,Yuan AS RMBFROM DBA.salesitem;5.1.2 选择选择WHERE子句确定条件子句确定条件condition:运算对象:属性、常量、别名运算对象:属性、常量、别名算术运算符:数值运算:算术运算符:数值运算:+-*/比较运算符:比较运算符:=A0053;字符串模式匹配字符串模式匹配LIKEs LIKE p,其中其中s是一个字符串,是一个字符串,p包含包含%或下划线的字符串模式或下划线的字符串模式匹配规则:匹配规则:p中普通字符只和中普通字符只和s中完全相同的字符匹配;中完全相同的字符匹配;%可与可与s中中0个或多个字符匹配;个或多个字符匹配;一个下划线可与一个下划线可与s中一个任意字符匹配。中一个任意字符匹配。SELECT*FROMsalesman WHERE name LIKE 王王%;SELECT*FROMsalesman WHERE name LIKE 王王_;注意:若注意:若p中包含单引号,则用两个单引号表示。中包含单引号,则用两个单引号表示。5.1.4 日期和时间的比较日期和时间的比较日期和时间的比较:大于、等于、小于日期和时间的比较:大于、等于、小于日期类型日期类型Date常量通用格式:常量通用格式:yyyy-mm-dd时间类型时间类型Time常量通用格式:常量通用格式:hh:mm:ss.sssss单引号标注常量。单引号标注常量。小于小于d1d2 即表示即表示d1早于早于d2。select*from salesorder where signdate=d1 AND d=d2select*from salesorder where signdate between 2002-10-1 and 2002-10-31;5.1.5 输出的顺序输出的顺序ORDER BY子句子句 ORDER BY expression|integer ASC|DESC,当输出结果为多行时,往往需要按某次序输出当输出结果为多行时,往往需要按某次序输出结果。即改变行位置。结果。即改变行位置。ASC表示升序表示升序(缺省缺省);DESC表示降序。表示降序。SELECT*FROM salesorder ORDER BY signdate DESC;5.2 多关系查询多关系查询两个以上的关系在两个以上的关系在From子句中连接起来子句中连接起来进行查询。进行查询。Select a1,a2,From R1,R2,Where condOrder By b1,5.2.1 乘积和连接乘积和连接 Select a1,a2,From R1,R2,Where cond实现关系代数运算:实现关系代数运算:a1,a2,.(R1 cond R2)即即 a1,a2,.(cond(R1 R2)注意:结果是一个包,而不是集合注意:结果是一个包,而不是集合(除非显示确定除非显示确定Select distinct.)Select子句和子句和Where子句中可包含子句中可包含From子句中的子句中的R1,R2等关系的属等关系的属性。性。例:计算员工号为例:计算员工号为“A0043”的销售员所经办的客户的姓名的销售员所经办的客户的姓名及其电话号码及其电话号码 计算员工号为计算员工号为“A0044”的销售员所销售的商品的种类的销售员所销售的商品的种类和规格。和规格。自然连接方法:自然连接方法:5.9介绍。介绍。Select type,specFrom salesitem Natural Join salesorder Natural Join productWhere salesorder.empid=A0043;5.2.2 消除属性二义性消除属性二义性属性二义性的出现:属性二义性的出现:一个查询所涉及的多个关系中有两个或两个以上的一个查询所涉及的多个关系中有两个或两个以上的属性同名。属性同名。此时在此时在Select、Where等子句中就不能简单引用属性等子句中就不能简单引用属性名。名。属性二义性的消除:属性二义性的消除:关系名关系名.属性名,限定关系和属性属性名,限定关系和属性若表名或列名与若表名或列名与SQL关键词关键词(keywords)重复,重复,如何消除二义性?如何消除二义性?把表名或列名用双引号标注,以区别关键词。把表名或列名用双引号标注,以区别关键词。5.2.3 元组变量元组变量元组变量:元组变量:对关系的改名。对关系的改名。Select a1,a2From R AS S,Where condSelect、Where等子句中可使用改过的表名,即等子句中可使用改过的表名,即“元组元组变量变量”。例:计算例:计算“所有重名的销售员的员工号及其姓名所有重名的销售员的员工号及其姓名”Select s1.empid,s1.nameFrom salesman as s1,salesman as s2Where s1.empids2.empid AND s1.name=s2.nameOrder by s1.empid;5.2.4 多关系查询的解释多关系查询的解释 Select a1,a2,From R1,R2,Where cond Order By b1,计算过程:计算过程:1.From多关系之间求笛卡尔积多关系之间求笛卡尔积2.Where条件的选择运算。条件的选择运算。连接连接3.Select投影运算。投影运算。运算运算4.Order By结果排序输出结果排序输出 5.2.5 集合运算集合运算并并 Union大部分大部分SQL支持支持交交 Intersect大部分大部分SQL不支持,可用子查询间接不支持,可用子查询间接实现。实现。差差 Except/Minus大部分大部分SQL不支持,可用子查不支持,可用子查询间接实现。询间接实现。Union运算指令:运算指令:select-without-order-by .UNION ALL select-without-order-by .UNION ALL select-without-order-by .ORDER BY integer ASC|DESC,.求所有客户和销售员的名字及其电话。求所有客户和销售员的名字及其电话。Select name,phone From customerUnion AllSelect name,phone From salesman;ALL 说明结果可重复。说明结果可重复。5.3 子查询子查询子查询子查询(subquery):用括号封装的一个用括号封装的一个Select语句,通常在语句,通常在Where子句中增强条件。子句中增强条件。例:计算员工号为例:计算员工号为“A0043”的销售员所经的销售员所经办的客户的姓名及其电话号码办的客户的姓名及其电话号码 Select name,phone From customer Where custid=ANY(Select custid From salesorder Where empid=A0043);5.3.1 涉及关系的条件涉及关系的条件Where子句中如何使用子查询?子句中如何使用子查询?NOT Exists(Subquery):当且仅当子查询结果非空,:当且仅当子查询结果非空,条件为真。条件为真。expression compare ANY(Subquery):比较子查询:比较子查询的结果的任意一个值。的结果的任意一个值。expression compare ALL(Subquery):比较子查询结:比较子查询结果的所有的值。果的所有的值。expression NOT IN(Subquery):当且仅当表达式的:当且仅当表达式的值出现在子查询的结果中,条件为真。值出现在子查询的结果中,条件为真。其中:(其中:(表示等价)表示等价)expression IN(Subquery)expression=ANY(Subquery)expression NOT IN(Subquery)expression ALL(Subquery)5.3.1 涉及关系的条件涉及关系的条件子查询可实现集合的减运算和交运算。子查询可实现集合的减运算和交运算。无订单的销售员无订单的销售员 销售员销售员 有订单的销售员有订单的销售员R S表示为:表示为:R ALL(S)R NOT IN(S)R S表示为:表示为:R=ANY(S)R IN(S)注意:注意:expression compare(Subquery)要求子查询返回要求子查询返回单行值,再进行比较。若返回多行值,则出错。单行值,再进行比较。若返回多行值,则出错。例:计算员工号为例:计算员工号为“A0043”的销售员所经办的客户的姓的销售员所经办的客户的姓名及其电话号码。名及其电话号码。Select name,phoneFrom customerWhere custid=(Select custid From salesorder Where empid=A0043);说明:多数说明:多数DBMS要求子查询中的要求子查询中的Select语句为单列结果,不允语句为单列结果,不允许多列结果。许多列结果。若若A0043销售员只有一个订单时,结果正确;否则出错。销售员只有一个订单时,结果正确;否则出错。5.3.2 涉及元组的条件涉及元组的条件计算员工号为计算员工号为“A0044”的销售员所销售的商品的种类和规格。的销售员所销售的商品的种类和规格。Select type,spec From product Where prodid IN(Select prodid From salesitem Where orderno IN(Select orderno From salesorder Where empid=A0044);等价:等价:Select type,spec From salesitem,salesorder,product Where salesitem.orderno=salesorder.orderno AND salesitem.prodid=product.prodid AND salesorder.empid=A0044;前者无重复,后者可能重复前者无重复,后者可能重复(用用distinct可去掉重复,可去掉重复,5.4节节)。计算次序:从最内层子查询开始计算,逐步扩展到外层。计算次序:从最内层子查询开始计算,逐步扩展到外层。5.3.3 相关子查询相关子查询什么是相关子查询?什么是相关子查询?子查询语句中引用外层关系的属性,对外层关系的每一子查询语句中引用外层关系的属性,对外层关系的每一个元组,子查询都进行一次计算。个元组,子查询都进行一次计算。例:计算例:计算“所有重名的销售员的员工号及其姓名所有重名的销售员的员工号及其姓名”Select empid,name From salesman as s Where empid ANY(Select empid From salesman Where name=s.name)等价:等价:Select s1.empid,s1.name From salesman as s1,salesman as s2 Where s1.empids2.empid AND s1.name=s2.name;5.4 副本副本/重复重复如何产生重复如何产生重复duplicate?投影运算和集合并运算可能产生重复的行。投影运算和集合并运算可能产生重复的行。如何去掉重复?如何去掉重复?Select distinct例:计算员工号为例:计算员工号为“A0044”的销售员所销售的商品的种的销售员所销售的商品的种类和规格。类和规格。Select distinct type,specFrom salesitem,salesorder,productWhere salesitem.orderno=salesorder.orderno AND salesitem.prodid=product.prodid AND salesorder.empid=A0044;集合并集合并Union运算中要保留重复应加运算中要保留重复应加ALL,否则结果中自,否则结果中自动去掉重复。动去掉重复。R1Union ALLR2 5.5 聚合运算聚合运算聚合聚合aggregate:把关系中的所有元组作为一个整体,其中把关系中的所有元组作为一个整体,其中某列的多行数值形成单行值。某列的多行数值形成单行值。进一步,可按某条件先对元组分组,再聚进一步,可按某条件先对元组分组,再聚合运算,每个分组得到一行结果。合运算,每个分组得到一行结果。完整的完整的Select语句格式:语句格式:Select a1,a2,From R1,R2Where cond1Group By C1,C2Having cond2Order By b1,b25.5.1 聚合函数聚合函数主要聚合函数:主要聚合函数:Sum(C)某数值列求汇总值。某数值列求汇总值。Avg(C)某数值列求平均值。某数值列求平均值。Min(C)某数值列求最小值。某数值列求最小值。Max(C)某数值列求最大值。某数值列求最大值。Count(*C)求元组计数值,或对某列求计数。求元组计数值,或对某列求计数。例:求货号例:求货号FR8633的最高销售单价。的最高销售单价。Select Max(singlecost)From salesitemWhere prodid=FR8633;5.5.1 聚合函数聚合函数例:求货号例:求货号FR8633的最高销售单价的订单号。的最高销售单价的订单号。Select ordernoFrom salesitemWhere prodid=FR8633 AND singlecost=(Select Max(singlecost)From salesitem Where prodid=FR8633)求求2002年年10月份的订单的数量。月份的订单的数量。Select Count(*)From salesorderWhere signdate Between 2002-10-1 AND 2002-10-31;求求4001号订单的总金额。号订单的总金额。Select Sum(singlecost*quantity)As amountFrom salesitemWhere orderno=4001;5.5.2 分组分组Group By子句的构成:子句的构成:根据一列或几列的值把元组分成若干组,即调整行的位根据一列或几列的值把元组分成若干组,即调整行的位置,使相同分组值的元组放在一起,每个组再分别进行置,使相同分组值的元组放在一起,每个组再分别进行聚合运算,每个分组得到一行聚合结果。结果可能多行,聚合运算,每个分组得到一行聚合结果。结果可能多行,结果行数是分组值的数目。结果行数是分组值的数目。Group By column-name|alias-name|function|expression,.例:计算每个订单的总金额,并按订单号升序排列。例:计算每个订单的总金额,并按订单号升序排列。Select orderno,Sum(singlecost*quantity)as amountFrom salesitemGroup by ordernoOrder by orderno;例:计算每个订单的销售数量和销售金额,并按订单号例:计算每个订单的销售数量和销售金额,并按订单号升序排列。升序排列。5.5.2 分组分组注意:在包含聚合运算的注意:在包含聚合运算的Select子句中,只有在子句中,只有在Group By子句中出现子句中出现的属性才能在的属性才能在Select子句中以非聚合形式出现。子句中以非聚合形式出现。例:计算每个订单的签单日期、销售数量和销售金额,并按订单号升序排例:计算每个订单的签单日期、销售数量和销售金额,并按订单号升序排列。列。Select salesorder.orderno,signdate,Sum(quantity)qty,Sum(singlecost*quantity)as amountFrom salesitem,salesorderWhere salesorder.orderno=salesitem.ordernoGroup by salesorder.orderno,signdateOrder by salesorder.orderno注意:有注意:有Group By子句不一定就有聚合运算。当没有子句不一定就有聚合运算。当没有Group By子句子句时,可认为所有元组作为一个分组。时,可认为所有元组作为一个分组。例:至少有一个订单的销售员的员工号及其姓名例:至少有一个订单的销售员的员工号及其姓名(结果不重复结果不重复)。Select salesorder.empid,nameFrom salesorder,salesmanWhere salesorder.empid=salesman.empidGroup by salesorder.empid,name;等价等价Select distinct salesorder.empid,nameFrom salesorder,salesmanWhere salesorder.empid=salesman.empid;5.5.3 Having子句子句Having子句条件表示什么?子句条件表示什么?在分组聚合之后按某条件过滤分组,使用在分组聚合之后按某条件过滤分组,使用Having子句确定条件。子句确定条件。例:计算销售金额大于例:计算销售金额大于10000元的订单的签单日元的订单的签单日期、销售数量和销售金额,并按订单号升序排期、销售数量和销售金额,并按订单号升序排列。列。Select salesorder.orderno,signdate,Sum(quantity)qty,Sum(singlecost*quantity)as amount From salesitem,salesorder Where salesorder.orderno=salesitem.orderno Group by salesorder.orderno,signdate Having amount 10000 Order by salesorder.orderno 5.5.3 Having子句子句注意:注意:Where子句中关于常量的条件可在子句中关于常量的条件可在Having子句条件子句条件代替。代替。Select salesorder.orderno,signdate,Sum(quantity)qty,Sum(singlecost*quantity)as amountFrom salesitem,salesorderWhere salesorder.orderno=salesitem.orderno and signdate between 2002-10-1 and 2002-10-31Group by salesorder.orderno,signdateOrder by salesorder.orderno等价于:等价于:Select salesorder.orderno,signdate,Sum(quantity)qty,Sum(singlecost*quantity)as amountFrom salesitem,salesorderWhere salesorder.orderno=salesitem.ordernoGroup by salesorder.orderno,signdateHaving signdate between 2002-10-1 and 2002-10-31Order by salesorder.orderno 5.5.3 Having子句子句注意:注意:Having子句中有关聚合变量的条件不能用子句中有关聚合变量的条件不能用Where条件替代。如果没有条件替代。如果没有Group By子句,通常子句,通常也不需要也不需要Having子句。子句。完整的完整的Select语句格式:语句格式:Select a1,a2,From R1,R2Where cond1Group By C1,C2Having cond2Order By b1,b2试一试:计算销售金额最高的订单号及其签单日试一试:计算销售金额最高的订单号及其签单日期。期。5.6 数据更新数据更新插入插入insert删除删除delete修改修改update5.6.1 插入插入如何在一个表中加入新记录如何在一个表中加入新记录?INSERT INTO R(A1,A2,An)VALUES(V1,V2,Vn)每成功执行一次,插入一行记录。每成功执行一次,插入一行记录。新记录与已有记录之间必须有唯一的键;新记录与已有记录之间必须有唯一的键;新记录中的外键必须满足参照完整性;新记录中的外键必须满足参照完整性;新记录中的所有非空属性都有合法值。新记录中的所有非空属性都有合法值。若若(A1,A2,An)不是不是R的所有属性,则未列出的属性取其缺省值。的所有属性,则未列出的属性取其缺省值。若若(A1,A2,An)省略,则省略,则(V1,V2,Vn)按属性的缺省次序排列。按属性的缺省次序排列。问题:对同一个表能多次执行同一条问题:对同一个表能多次执行同一条INSERT语句吗?语句吗?问题:一条问题:一条insert指令能对多个关系插入记录吗?指令能对多个关系插入记录吗?另一种另一种Insert语句:可插入多条记录。语句:可插入多条记录。INSERT INTO R(A1,A2,An)SELECT B1,B2,BnFROM WHERE 5.6.2 删除删除如何删除某个表中的某一部分记录?如何删除某个表中的某一部分记录?DELETE FROM R WHERE cond关系关系R中满足条件中满足条件cond的记录将被删除。的记录将被删除。条件省略将删除所有记录。条件省略将删除所有记录。例:例:Delete From salesitem Where orderno=4002;Delete From salesorder Where orderno=4002;通过外键被参照的行不能简单删除。通过外键被参照的行不能简单删除。(6.2节节)5.6.3 修改修改如何修改某个表中某一部分记录的属性值如何修改某个表中某一部分记录的属性值?UPDATE R SET A1=V1,A2=V2,An=Vn WHERE cond满足条件满足条件cond的每个记录的的每个记录的A1属性值改为属性值改为V1,A2属性值改为属性值改为V2,.条件省略将修改所有记录。条件省略将修改所有记录。例:例:update product set price=price*0.9;5.7 用用SQL定义关系模式定义关系模式数据类型数据类型创建新表创建新表删除表删除表改变关系模式改变关系模式默认值默认值域域/用户定义数据类型用户定义数据类型索引索引5.7.1 数据类型数据类型每一个属性具有唯一的数据类型,有哪些主要的数据类型?每一个属性具有唯一的数据类型,有哪些主要的数据类型?字符型:字符型:Char,Varchar,需确定其长度,字节为单位。需确定其长度,字节为单位。数值型:数值型:整数:整数:Tinyint 1字节字节Smallint 2字节字节Int|Integer 4字节字节BigInt 8字节字节浮点数:浮点数:精确浮点数:精确浮点数:Decimal|Dec(precision,scale)(数字总位数数字总位数,小数点后位数小数点后位数)Numeric(precision,scale)近似浮点数:近似浮点数:Real,Double,Float(precision)日期型日期型Date yyyy-mm-dd时间型时间型Time hh:mm:ss.sssss时戳型时戳型Timestamp Date+Time注意:在插入数据之前确定属性的数据类型。改变有数据的属性的数注意:在插入数据之前确定属性的数据类型。改变有数据的属性的数据类型不能保证正确。据类型不能保证正确。5.7.2 创建新表创建新表如何创建一个新表?如何创建一个新表?CREATE TABLE salesman(empid char(10)PRIMARY KEY,idno char(18)UNIQUE,name char(8)NOT NULL,gender tinyint NOT NULL,phone char(20)NULL,deptid integer NULL)CREATE TABLE DBA.department(deptid integer PRIMARY KEY,name char(40)NOT NULL,headerid char(10)NULL)注意:同一数据库中不允许同名的表存在。注意:同一数据库中不允许同名的表存在。5.7.3 删除表删除表如何删除一个表?如何删除一个表?DROP TABLE T;注意:自动删除表中所有记录。注意:自动删除表中所有记录。5.7.4 更改关系模式更改关系模式如何修改已建立的表?如何修改已建立的表?ALTER TABLE R Add 列名列名 数据类型数据类型 NOT NULLALTER TABLE R Drop列名列名ALTER TABLE R Modify列名列名 数据类型数据类型 NOT NULLALTER TABLE R Rename SALTER TABLE R Rename 列名列名1 To 列名列名2例:例:Alter Table department Rename name To deptname;5.7.5 默认值默认值缺省值有何用?缺省值有何用?当用当用insert语句插入记录时,若未指定某属性的值时,语句插入记录时,若未指定某属性的值时,则取其缺省值。则取其缺省值。一个属性至多确定一个缺省值。一个属性至多确定一个缺省值。例如:例如:salesorder表中:表中:signdatedate NOT NULL DEFAULT current date,对于数值类型对于数值类型(通常是整数,如通常是整数,如int)有一种常用的有一种常用的缺省值:缺省值:autoincrement每当插入一条新记录,而未确定该属性值时,该属性取每当插入一条新记录,而未确定该属性值时,该属性取该列最大值加该列最大值加1(从从1开始开始)。Autoincrement属性往往作为一个表的主键属性,用于属性往往作为一个表的主键属性,用于人工造键取序列值。人工造键取序列值。5.7.6 域域/用户定义数据类型用户定义数据类型什么是用户定义数据类型?什么是用户定义数据类型?一种命名的类型,依据某一种基本数据类型,一种命名的类型,依据某一种基本数据类型,确定缺省值和约束,可在多个表中使用。确定缺省值和约束,可在多个表中使用。用户定义数据类型存在于当前数据库中。用户定义数据类型存在于当前数据库中。例:例:CREATE DOMAIN sex integer NOT NULL DEFAULT 1 CHECK(col in(0,1)新类型新类型sex可用于本数据库中的多个表中。可用于本数据库中的多个表中。如何撤销用户定义数据类型如何撤销用户定义数据类型?DROP DOMAIN sex5.7.7 索引索引什么是索引什么是索引index?为提高在某一列上查询性能而建立的一种命名为提高在某一列上查询性能而建立的一种命名的数据结构。的数据结构。CREATE INDEX idnoindex ON DBA.salesman(idno ASC)如何撤销?如何撤销?DROP INDEX idnoindex5.8 视图视图什么是视图什么是视图view?依据一条依据一条SELECT语句产生的一个命名的语句产生的一个命名的“虚虚关系关系”或或“虚表虚表”。一个数据库可定义多个视图。一个数据库可定义多个视图。视图的名称不能与表名冲突。视图的名称不能与表名冲突。视图是一个数据库模式的一部分。视图是一个数据库模式的一部分。为何需要视图?为何需要视图?简化计算。简化计算。不同用户关心同一表中的不同属性。不同用户关心同一表中的不同属性。5.8.1 创建视图创