《SQL语言基础》教学课件_第1页
《SQL语言基础》教学课件_第2页
《SQL语言基础》教学课件_第3页
《SQL语言基础》教学课件_第4页
《SQL语言基础》教学课件_第5页
已阅读5页,还剩383页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《SQL语言基础》幻灯片本课件PPT仅供大家学习使用学习完请自行删除,谢谢!本课件PPT仅供大家学习使用学习完请自行删除,谢谢!《SQL语言基础》幻灯片本课件PPT仅供大家学习使用1第4章SQL语言根底4.1SQL语言概述4.2系统提供的数据类型4.3用户定义数据类型4.4T-SQL语言的一些根底知识4.5变量2/34第4章SQL语言根底4.1SQL语言概述2/342概述SQL〔StructuredQueryLanguage〕是用户操作关系数据库的通用语言。包含数据定义、数据查询、数据操作和数据控制等与数据库有关的全部功能。已成为关系数据库的标准语言。所有的关系数据库管理系统都支持SQL。3/34概述SQL〔StructuredQueryLanguag34.1SQL语言概述语言的开展语言的特点语言功能概述4/344.1SQL语言概述语言的开展4/344语言的开展1986年10月美国ANSI公布最早的SQL标准。1989年4月,ISO提出了具备完整性特征的SQL,称为SQL-89〔SQL1)。1992年11月,ISO又公布了新的SQL标准,称为SQL-92〔SQL2)〔以上均为关系形式〕。1999年公布SQL-99〔SQL3),是SQL92的扩展。5/34语言的开展1986年10月美国ANSI公布最早的SQL标准。5语言的特点1.一体化2.高度非过程化3.简洁4.使用方式多样6/34语言的特点1.一体化6/346语言功能概述SQL功能命令动词数据查询SELECT数据定义CREATE、DROP、ALTER数据操纵INSERT、UPDATE、DELETE数据控制GRANT、REVOKE四部分:数据定义功能、数据控制功能、数据查询功能和数据操纵功能。

7/34语言功能概述SQL功能命令动词数据查询SELECT数据定义C74.2系统提供的数据类型数值类型字符串类型日期时间类型货币类型8/344.2系统提供的数据类型数值类型8/348准确数值类型精确数值类型说明存储空间bigint存储从–263(–9,223,372,036,854,775,808)到263-1(9,223,372,036,854,775,807)范围的整数8字节int存储从–231(–2,147,483,648)到

231-1(2,147,483,647)范围的整数。4字节smallint存储从–215(–32,768)到

215-1(32,767)范围的整数2字节tinyint存储从

0到

255之间的整数。1字节bit存储1或0。如果一个表中有不多于8个的bit列,则这些列公用一个字节存储1字节numeric(p,s)或decimal(p,s)定点精度和小数位数。使用最大精度时,有效值从

–1038+1到

1038-1。其中,s为精度,指定小数点左边和右边可以存储的十进制数字的最大个数。精度必须是从1到最大精度之间的值。最大精度为38。s为小数位数,指定小数点右边可以存储的十进制数字的最大个数,0<=s<=p。s的默认值为0最多17字节9/34准确数值类型精确数值说明存储空间bigint存储从–2639近似数值数类型近似数值类型说明存储空间float[(n)]存储从-1.79E+308至-2.23E–308、0以及2.23E–308至1.79E+308范围的浮点数。n有两个值,如果指定的n在1~24之间,则使用24,占用4字节空间;如果指定的n在25~53之间,则使用53,占用8字节空间。若省略(n),则默认为534字节或8字节real存储从–3.40E+38到3.40E+38范围的浮点型数4字节10/34近似数值数类型近似数值说明存储空间float[(n)]存储从10字符串类型普通编码字符串类型统一字符编码字符串类型二进制字符串类型11/34字符串类型普通编码字符串类型11/3411普通编码字符串类型普通编码字符串类型说明存储空间char(n)固定长度的普通编码字符串类型,n表示字符串的最大长度,取值范围为1~8000n个字节。当实际字符串所需空间小于n时,系统自动在后边补空格varchar(n)可变长度的字符串类型,n表示字符串的最大长度,取值范围为1~8000字符数+2字节额外开销text最多可存储231-1(2,147,483,647)个字符每个字符1个字节varchar(max)最多可存储231-1个字符字符数+2字节额外开销说明:如果在使用char(n)或varchar(n)类型时未指定n,则默认长度为1。如果在使用CAST和CONVERT函数时未指定n,则默认长度为30。12/34普通编码字符串类型普通编码说明存储空间char(n)固定长度12统一字符编码字符串类型统一编码字符串类型说明存储空间nchar(n)固定长度的统一编码字符串类型,n表示字符串的最大长度,取值范围为1~40002n字节。当实际字符串所需空间小于2n时,系统自动在后边补空格nvarchar(n)可变长度的统一编码字符串类型,n表示字符串的最大长度,取值范围为1~40002*字符数+2字节额外开销ntext最多可存储230-1(1,073,741,823)个统一字符编码的字符每个字符2个字节nvarchar(max)最多可存储230-1个统一字符编码的字符2*字符数+2字节额外开销13/34统一字符编码字符串类型统一编码说明存储空间nchar(n)固13二进制字符串类型二进制字符串类型说明存储空间binary(n)固定长度的二进制数据,n的取值范围为1~8000n字节varbinary(n)可变长度的二进制数据,n的取值范围为1~8000。字符数+2字节额外开销image可变长度的二进制数据,最多为231-1(2,147,483,647)个十六进制数字每个字符1个字节varbinary(max)可变长度的二进制数据,最多为231-1(2,147,483,647)个十六进制数字字符数+2字节额外开销14/34二进制字符串类型二进制说明存储空间binary(n)固定长度14日期时间类型日期时间类型说明存储空间date定义一个日期,范围为

。字符长度10位,默认格式为:YYYY-MM-DD。YYYY表示4位年份数字,范围从0001到9999;MM表示2位月份数字,范围从01到12;DD表示2位日的数字,范围从

01到

31(最大值取决于具体月份)3字节time[(n)]定义一天中的某个时间,该时间基于24小时制。默认格式为:hh:mm:ss[.nnnnnnn],范围为00:00:00.0000000到23:59:59.9999999。精确到100纳秒。n为秒的小数位数,取值范围是0到7的整数。默认秒的小数位数是7(100ns)3~5字节datetime定义一个采用24小时制并带有秒的小数部分的日期和时间,范围为到-,时间范围是00:00:00到23:59:59.997。默认格式为:YYYY-MM-DDhh:mm:ss.nnn,n为数字,表示秒的小数部分(精确到0.00333秒)8字节15/34日期时间类型日期时间说明存储空间date定义一个日期,范围为15日期时间类型〔续〕日期时间类型说明存储空间smalldatetime定义一个采用24小时制并且秒始终为零(:00)的日期和时间,范围为到。默认格式为:YYYY-MM-DDhh:mm:00。精确到1分钟4字节datetime2定义一个结合了24小时制时间的日期。可将该类型看成是datetime类型的扩展,其数据范围更大,默认的小数精度更高,并具有可选的用户定义的精度。默认格式是:YYYY-MM-DDhh:mm:ss[.nnnnnnn],n为数字,表示秒的小数位数(最多精确到100纳秒),默认精度是7位小数。该类型的字符串长度最少19位(YYYY-MM-DDhh:mm:ss),最多27位(YYYY-MM-DDhh:mm:ss.0000000)6~8字节datetimeoffset定义一个与采用

24小时制并与可识别时区的一日内时间相组合的日期,该数据类型使用户存储的日期和时间(24小时制)是时区一致的。语法格式为:datetimeoffset[(n)],n为秒的精度,最大为7。默认格式为:YYYY-MM-DDhh:mm:ss[.nnnnnnn][{+|-}hh1:mm1],其中hh1的取值范围为-14到

+14,mm1的取值范围为00到

59。该类型的日期范围为到,时间范围为00:00:00到

23:59:59.9999999。时区偏移量范围为-14:00到+14:00。该类型的字符串长度为:最少26位(YYYY-MM-DDhh:mm:ss{+|-}hh:mm),最多34位

(YYYY-MM-DDhh:mm:ss.nnnnnnn{+|-}hh:mm)8~10字节16/34日期时间类型〔续〕日期时间说明存储空间smalldateti16货币类型货币类型说明存储空间money存储–922,337,203,685,477.5808到922,337,203,685,477.5807范围的数值,精确到小数点后4位8字节smallmoney存储-214,748.3648到214,748.3647范围的数值,精确到小数点后4位4字节17/34货币类型货币类型说明存储空间money存储–922,337,174.3用户定义数据类型实际上是为系统数据类型起了个别名,因此也称为别名类型。当在多个表中存储语义一样的列时,一般要求这些列的数据类型和长度应该完全一致。为防止语义一样的列在不同的地方定义不一致,可以使用用户定义的数据类型。18/344.3用户定义数据类型实际上是为系统数据类型起了个别名,因18创立用户定义数据类型CREATETYPE[schema_name.]type_name{FROMbase_type[(precision[,scale])][NULL|NOTNULL]例1.创立一个名为telephone的数据类型,其相应的系统数据类型为:char(8),不允许空CREATETYPEtelephoneFROMCHAR(8)NOTNULL19/34创立用户定义数据类型CREATETYPE[schema194.4T-SQL语言的一些根底知识语句批 一组SQL语句集合作为一个执行单元完毕标记:GO脚本存储在文件中的SQL语句集合注释单行注释符:--多行注释符:/**/20/344.4T-SQL语言的一些根底知识语句批20/34204.5变量变量的种类变量的声明与赋值21/344.5变量变量的种类21/3421变量种类〔1〕局部变量: @变量名:用户使用〔2〕全局变量: @@变量名:系统用于记录信息22/34变量种类〔1〕局部变量:22/3422声明局部变量DECLARE{@local_variable[AS]data_type}|[=value]}[,...n]@local_variable:变量名。必须以“@〞开头,且最多可包含128个字符。data_type:任何系统提供的数据类型或用户定义的数据类型。但不能是text、ntext或image。23/34声明局部变量DECLARE{@local_variab23给变量赋值SET{@local_variable=expression}|{@local_variable{+=|-=|*=|/=|%=|&=|^=||=}expression}SELECT@local_variable=expression24/34给变量赋值SET{@local_variable=e24显示变量的值PRINTmsg_str|@local_variable|string_exprmsg_str:字符串或Unicode字符串常量。@local_variable:任何有效的字符数据类型的变量。@local_variable的数据类型必须为char或varchar,或者能够隐式转换为这些类型的数据。string_expr:返回字符串的表达式。可包括串联的文字值、函数和变量。25/34显示变量的值PRINTmsg_str|@local_v25例如计算两个变量的和值,然后显示其结果 DECLARE@xint=10 DECLARE@yint=20 DECLARE@zint SET@z=@x+@y Print@z26/34例如计算两个变量的和值,然后显示其结果26/3426全局变量是SQLServer系统内部使用的变量。通常存储SQLServer的配置设置值和性能统计数据。不能定义与全局变量同名的局部变量。用户可查询全局变量值。例:SELECT@@ERROR:获取系统的错误信息SELECT@@ServerName:获取本地效劳器名称SELECT@@Version:获取当前SQLServer版本号27/34全局变量是SQLServer系统内部使用的变量。27/34274.6流程控制语句1.语句块

BEGIN语句序列END

2.分枝语句IF条件表达式语句块[ELSE语句块

]3.循环语句WHILE条件表达式语句块28/344.6流程控制语句1.语句块28/3428T-SQL提供的流程控制语句语

句描

述BEGIN…END定义语句块BREAK退出最内层的

WHILE循环CASE(表达式)允许表达式按照条件返回不同的值CONTINUE重新开始

WHILE循环GOTO标签从标签所定义的标签之后的语句处继续进行处理IF…ELSE如果指定条件为真,执行一个分支,否则执行另一个分支RETURN无条件退出WAITFOR为语句的执行设置延迟WHILE当指定条件为真时重复一些语句29/34T-SQL提供的流程控制语句语句描述BEGIN291.BEGIN…END语句定义一个语句块,它将一系列T-SQL语句包容起来,使得它们可以作为一个语句块来执行。BEGIN{sql_statement|statement_block}END30/341.BEGIN…END语句定义一个语句块,它将一系列T-302.IF…ELSE语句IFBoolean_expression

{sql_statement|statement_block}[ELSE

{sql_statement|statement_block}]31/342.IF…ELSE语句IFBoolean_exp31例如DECLARE@xint,@yint,@zintSET@x=40Set@y=30IF(@x>@y)SET@z=@x-@yELSESET@z=@y-@xPrint@xPrint@yPrint@z32/34例如DECLARE@xint,@yint,@zi323.WHILE语句WHILEBoolean_expression{sql_statement|statement_block}[BREAK]{sql_statement|statement_block}[CONTINUE]{sql_statement|statement_block}33/343.WHILE语句WHILEBoolean_expres33例如计算1+2+3+…+100的和值。DECLARE@iint,@sumintSET@i=1SET@sum=0WHILE@i<=100BEGINSET@sum=@sum+@iSET@i=@i+1ENDPRINT@sum34/34例如计算1+2+3+…+100的和值。34/34345.1根本表5.2分区表*第5章数据表35/385.1根本表第5章数据表35/38355.1根本表CREATETABLE[database_name.[schema_name].|schema_name.]table_name({<column_definition>|<computed_column_definition>|<column_set_definition>}[<table_constraint>][,...n])[ON{partition_scheme_name(partition_column_name)|filegroup|"default"}][;]<computed_column_definition>::=column_nameAScomputed_column_expression36/385.1根本表CREATETABLE36/3836根本表定义〔续〕<column_definition>::=column_name<data_type>[COLLATEcollation_name][NULL|NOTNULL][[CONSTRAINTconstraint_name]DEFAULTconstant_expression]|[IDENTITY[(seed,increment)]

]37/38根本表定义〔续〕<column_definition>::37例如:创立学生表CREATETABLEStudent(SnoCHAR(7)PRIMARYKEY,SnameNCHAR(5) NOTNULL,SIDCHAR(18) UNIQUE,SsexNCHAR(1) DEFAULT'男',SageTINYINT CHECK(Sage>=15ANDSage<=45),SdeptNVARCHAR(20))38/38例如:创立学生表CREATETABLEStudent(38创立课程表CREATETABLECourse(CnoCHAR(6) PRIMARYKEY,CnameNVARCHAR(20) NOTNULL,CreditNUMERIC(3,1) CHECK(Credit>0),SemesterTINYINT)39/38创立课程表CREATETABLECourse(39/339创立选课表CREATETABLESC(SnoCHAR(7)NOTNULL,CnoCHAR(6)NOTNULL,GradeTINYINT,PRIMARYKEY(Sno,Cno),FOREIGNKEY(Sno)REFERENCESStudent(Sno),FOREIGNKEY(Cno)REFERENCESCourse(Cno))40/38创立选课表CREATETABLESC(40/3840例如:创立有计算列的表CREATETABLECompTable(lowint,highint,myavgAS(low+high)/2)41/38例如:创立有计算列的表CREATETABLECompTa41例如:创立包含标识列的表标识列的种子值为1,增量值也为1。CREATETABLEIDTable(SIDINTIDENTITY(1,1)NOTNULL,NameVARCHAR(20))42/38例如:创立包含标识列的表标识列的种子值为1,增量值也为1。442说明一般情况下,在插入数据时不能为标识列提供值。标识列的值是系统自动生成的。如果确实要为标识列提供值,那么必须将表的IDENTITY_INSERT属性设置为ON〔默认时该属性的值为OFF〕。SETIDENTITY_INSERT[database_name.[schema_name].]table{ON|OFF}43/38说明一般情况下,在插入数据时不能为标识列提供值。标识列的值是43修改表构造可以使用ALTERTABLE语句实现。ALTERTABLE语句可以对已定义的表进展添加列、删除列、修改列定义等操作,也可以进展添加和删除约束的操作。44/38修改表构造可以使用ALTERTABLE语句实现。44/3844ALTERTABLE[database_name.[schema_name].|schema_name.]table_name{ALTERCOLUMNcolumn_name{[type_schema_name.]type_name[({precision[,scale]|max})][NULL|NOTNULL]}|ADD{<column_definition>|<computed_column_definition>|<table_constraint>}[,...n]|DROP{[CONSTRAINT]constraint_name|COLUMNcolumn_name}[,...n]}[;]45/38ALTERTABLE[database_name.[sc45例如例2.为SC表添加“修课类别〞列,此列的定义为:TypeNCHAR(1),允许空。ALTERTABLESCADDTypeNCHAR(1)NULL例3.将新添加的Type列的数据类型改为NCHAR(2)。ALTERTABLESCALTERCOLUMNTypeNCHAR(2)46/38例如例2.为SC表添加“修课类别〞列,此列的定义为:Type46例如例4.为Type列添加限定取值范围为{必修、重修、选修}的约束。ALTERTABLESCADDCHECK(TypeIN('必修','重修','选修'))例5.删除SC表的“Type〞列。ALTERTABLESCDROPCOLUMNType47/38例如例4.为Type列添加限定取值范围为{必修、重修、选修}47删除表DROPTABLE<表名>{[,<表名>]…}例6.删除test表。DROPTABLEtest注意:如果被删除的表中有其他表对它的外键引用约束,那么必须先删除外键所在的表,然后再删除被引用的表。48/38删除表DROPTABLE<表名>{[,<表名485.2分区表分区表是把数据按某种标准划分成区域存储在不同的文件组中,使用分区可以快速而有效地管理和访问数据子集,从而使大型表或索引更易于管理。合理的使用分区会在很大程度上提高数据库的性能。分区表是将表中的数据按水平方式划分成不同的子集,这些数据子集存储在数据库的一个或多个文件组中。49/385.2分区表分区表是把数据按某种标准划分成区域存储在不同的49比较适于进展分区的情况表中数据量大;该表包含〔或将包含〕以多种不同方式使用的大量数据。数据是分段的,比方数据以年为分隔。对表的常规维护操作只针对表的一个数据子集。50/38比较适于进展分区的情况表中数据量大;50/3850分区表特点分区表是从物理上将一个大表分成几个小表,但从逻辑上来看,还是一个大表。对用户而言,所面对的依然是一个大表,他们不需要考虑操作的年份对应的小表,用户只要将记录插入到大表——逻辑表中就可以了,数据库管理系统会自动将数据放置到它对应的那个物理小表中。51/38分区表特点分区表是从物理上将一个大表分成几个小表,但从逻辑上51创立分区表步骤1.创立分区函数。告诉SQLServer以什么方式对表进展分区。2.创立分区方案。将分区函数生成的分区映射到文件组中去。分区函数的作用是告诉SQLServer如何将数据进展分区,而分区方案的作用那么是告诉SQLServer将已分区的数据放在哪个文件组中。3.使用分区方案创立表。说明:在创立分区表之前,最好先创立数据库文件组。52/38创立分区表步骤1.创立分区函数。告诉SQLServer以什521.创立分区函数CREATEPARTITIONFUNCTIONpartition_function_name(input_parameter_type)ASRANGE[LEFT|RIGHT]FORVALUES([boundary_value[,…n]])53/381.创立分区函数CREATEPARTITIONFUNC53例如例1.在int列上创立左侧分区函数。以下分区函数将表分为四个分区。CREATEPARTITIONFUNCTIONmyRangePF1(int)ASRANGELEFTFORVALUES(1,100,1000);54/38例如例1.在int列上创立左侧分区函数。以下分区函数将表54例如例2.在int列上创立右侧分区函数。CREATEPARTITIONFUNCTIONmyRangePF2(int)ASRANGERIGHTFORVALUES(1,100,1000)55/38例如例2.在int列上创立右侧分区函数。55/3855例如例3.在datetime列上创立右侧分区函数。将表分成12个分区,每个分区对应一个月的值CREATEPARTITIONFUNCTIONmyDateRangePF1(datetime)ASRANGERIGHTFORVALUES('20210201','20210301','20210401','20210501','20210601','20210701','20210801','20210901','20211001','20211101','20211201');56/38例如例3.在datetime列上创立右侧分区函数。将表分成156例如例3.在字符列上创立右侧分区函数。以下分区函数将表分为四个分区。CREATEPARTITIONFUNCTIONmyRangePF3(char(20))ASRANGERIGHTFORVALUES('EX','RXE','XR');57/38例如例3.在字符列上创立右侧分区函数。以下分区函数将表分为四572.创立分区方案CREATEPARTITIONSCHEMEpartition_scheme_nameASPARTITIONpartition_function_name[ALL]TO({file_group_name|[PRIMARY]}[,...n])[;]58/382.创立分区方案CREATEPARTITIONSCHE58例如例4.先创立一个分区函数,该函数将表分为四个分区。然后创立一个分区方案,在其中指定拥有这四个分区中每一个分区的文件组CREATEPARTITIONFUNCTIONmyRangePF1(int)ASRANGELEFTFORVALUES(1,100,1000);GOCREATEPARTITIONSCHEMEmyRangePS1ASPARTITIONmyRangePF1TO(test1fg,test2fg,test3fg,test4fg);59/38例如例4.先创立一个分区函数,该函数将表分为四个分区。然后创59例4的分区情况在某表上对分区依据列col1使用分区函数myRangePF1后,对该表的分区进展分配的情况:60/38例4的分区情况在某表上对分区依据列col1使用分区函数myR60例如例5.创立将多个分区映射到同一个文件组的分区方案。如果要将所有分区都映射到同一个文件组,可使用ALL关键字。但如果是将多个〔不是全部〕分区映射到同一个文件组,那么必须分别列出文件组名称CREATEPARTITIONFUNCTIONmyRangePF2(int)ASRANGELEFTFORVALUES(1,100,1000);GOCREATEPARTITIONSCHEMEmyRangePS2ASPARTITIONmyRangePF2TO(test1fg,test1fg,test1fg,test2fg)61/38例如例5.创立将多个分区映射到同一个文件组的分区方案。如果61例5分区情况在某表上对分区依据列col1使用分区函数myRangePF2后,对该表的分区进展分配的情况62/38例5分区情况在某表上对分区依据列col1使用分区函数myRa62例如例6.创立将所有分区映射到同一个文件组的分区方案。CREATEPARTITIONFUNCTIONmyRangePF3(int)ASRANGELEFTFORVALUES(1,100,1000);GOCREATEPARTITIONSCHEMEmyRangePS3ASPARTITIONmyRangePF3ALLTO(test1fg)63/38例如例6.创立将所有分区映射到同一个文件组的分区方案。6363例如例7.创立指定“NEXTUSED〞文件组的分区方案。本例如所创立的分区方案列出的文件组数超过了关联的分区函数所创立的分区数。CREATEPARTITIONFUNCTIONmyRangePF4(int)ASRANGELEFTFORVALUES(1,100,1000);GOCREATEPARTITIONSCHEMEmyRangePS4ASPARTITIONmyRangePF4TO(test1fg,test2fg,test3fg,test4fg,test5fg)执行该语句时系统返回以下消息:分区方案'myRangePS4'已成功创立。'test5fg'在分区方案'myRangePS4'中标记为下次使用的文件组。64/38例如例7.创立指定“NEXTUSED〞文件组的分区方案。本64例如例8.本例如首先创立一个分区函数,将数据分为四个分区。然后创立一个分区方案,最后创立使用该分区方案的表。本例如假定数据库中已经存在文件组。CREATEPARTITIONFUNCTIONmyRangePF1(int)ASRANGELEFTFORVALUES(1,100,1000);GOCREATEPARTITIONSCHEMEmyRangePS1ASPARTITIONmyRangePF1TO(test1fg,test2fg,test3fg,test4fg);GOCREATETABLEPartitionTable(col1int,col2char(10))ONmyRangePS1(col1);65/38例如例8.本例如首先创立一个分区函数,将数据分为四个分区。65第6章

数据操作语言6.1数据查询语句6.2数据更改功能66第6章数据操作语言6.1数据查询语句66666.1数据查询语句查询语句根本构造单表查询多表连接查询使用TOP限制结果集将查询结果保存到新表中67/1306.1数据查询语句查询语句根本构造67/13067查询语句根本构造SELECT<目标列名序列>--需要哪些列FROM<表名>--来自于哪些表[WHERE<行选择条件>]--根据什么条件[GROUPBY<分组依据列>][HAVING<组选择条件>][ORDERBY<排序依据列>]68/130查询语句根本构造SELECT<目标列名序列>--68<目标列名序列>局部能够包含的内容SELECT[ALL|DISTINCT][TOPexpression[PERCENT][WITHTIES]]<select_list><select_list>::={*|{table_name|view_name|table_alias}.*|{[{table_name|view_name|table_alias}.]{column_name|$IDENTITY}}]|expression[[AS]column_alias]}|column_alias=expression}[,...n]69/130<目标列名序列>局部能够包含的内容SELECT[ALL69单表查询1.选择表中假设干列2.选择表中的假设干元组3.对查询结果排序4.使用聚合函数统计数据5.对数据进展分组统计70/130单表查询1.选择表中假设干列70/130701.选择表中假设干列:查询指定列在SELECT子句的<目标列名序列>中指定要查询的属性。例1.查询全体学生的学号与姓名。SELECTSno,SnameFROMStudentSnoSnameSexSageDept0811101李勇

男21计算机系0811102刘晨

男20计算机系0811103王敏

女20计算机系0811104张小红

女19计算机系0821101张立

男20信息管理系0821102吴宾

女19信息管理系0821103张海

男20信息管理系0831101钱小平

女21通信工程系0831102王大力

男20通信工程系0831103张姗姗

女19通信工程系SnoSname0811101李勇

0811102刘晨

0811103王敏

0811104张小红

0821101张立

0821102吴宾

0821103张海

0831101钱小平

0831102王大力

0831103张姗姗

71/1301.选择表中假设干列:查询指定列在SELECT子句的<目标列71例如例2.查询全体学生的姓名、学号和所在系。SELECTSname,Sno,DeptFROMStudent说明:查询列表中的列顺序与表中列定义的顺序无关。72/130例如例2.查询全体学生的姓名、学号和所在系。72/13072查询全部列如果要查询表中的全部列,可以使用两种方法:在<目标列名序列>中列出所有的列名;如果列的显示顺序与其在表中定义的顺序一样,那么可以简单地在<目标列名序列>中写星号“*〞。73/130查询全部列如果要查询表中的全部列,可以使用两种方法:73/173例如例3查询全体学生的详细记录。SELECTSno,Sname,Sex,Sage,DeptFROMStudent等价于:

SELECT*FROMStudent74/130例如例3查询全体学生的详细记录。74/13074查询经过计算的列SELECT子句中的<目标列名序列>可以是表中存在的属性列,也可以是表达式、常量或者函数。例4查询全体学生的姓名及其出生年份。SELECTSname,year(getdate())-year(Birthdate)FROMStudentgetdate():得到系统的当前日期和时间year():得到日期数据中年的局部75/130查询经过计算的列SELECT子句中的<目标列名序列>可以是表75例如例5.含字符串常量的列。SELECTSname,'出生年份',year(getdate())FROMStudentSnoSnameSexBirthdateDept0811101李勇

男1990/5/6计算机系0811102刘晨

男1991/8/8计算机系0811103王敏

女1990/3/18计算机系0811104张小红

女1992/1/10计算机系0821101张立

男1990/10/12信息管理系0821102吴宾

女1991/3/20信息管理系0821103张海

男1991/6/3信息管理系0831101钱小平

女1990/11/9通信工程系0831102王大力

男1990/5/6通信工程系0831103张姗姗

女1991/2/26通信工程系76/130例如例5.含字符串常量的列。SnoSnameSexBirt76指定列别名[列名|表达式][AS]列别名或

列别名=[列名|表达式]例:SELECTSname,year(getdate())-year(Birthdate)AS年龄FROMStudent77/130指定列别名[列名|表达式][AS]列别名777指定列别名后的查询结果SELECTSname,year(getdate())-year(Birthdate)AS年龄FROMStudentSnoSnameSexBirthdateDept0811101李勇

男1990/5/6计算机系0811102刘晨

男1991/8/8计算机系0811103王敏

女1990/3/18计算机系0811104张小红

女1992/1/10计算机系0821101张立

男1990/10/12信息管理系0821102吴宾

女1991/3/20信息管理系0821103张海

男1991/6/3信息管理系0831101钱小平

女1990/11/9通信工程系0831102王大力

男1990/5/6通信工程系0831103张姗姗

女1991/2/26通信工程系78/130指定列别名后的查询结果SELECTSname,SnoSn78用DISTINCT去掉结果中的重复行

SELECTDISTINCTSnoFROMSC

SnoCnoGrade0811101C001960811101C002800811101C003840811101C005620811102C001920811102C002900811102C004840821102C001760821102C004850821102C005730821102C007NULLSno08111010811101081110108111010811102081110208111020821102082110208211020821102Sno081110108111020821102SnoDISTINCTSno79/130用DISTINCT去掉结果中的重复行 SELECTDIS79注意SELECT语句不会自动去掉结果中的重复行,如果要求结果中不出现行,必须要明确地指出DISTINCT是确保检索后的每一行是唯一的,这种唯一性是相对于其他行来说的。80/130注意SELECT语句不会自动去掉结果中的重复行,如果要求结果802.选择表中的假设干元组查询满足条件的元组可通过

WHERE子句实现。

81/1302.选择表中的假设干元组查询满足条件的元组可通过81/1381常用的查询条件查询条件谓词比较运算符=,>,>=,<,<=,<>(或!=)确定范围BETWEENAND,NOTBETWEENAND确定集合IN,NOTIN字符匹配LIKE,NOTLIKE空值ISNULL,ISNOTNULL多重条件AND,OR82常用的查询条件查询条件谓词比较运算符=,>,>82〔1〕比较大小例7.查询计算机系全体学生。SELECTSnameFROMStudentWHEREDept='计算机系'例8.查询所有年龄20岁以下的学生的姓名及年龄。SELECTSname,year(getdate())-year(Birthdate)AS年龄FROMStudentWHEREyear(getdate())-year(Birth)<2083/130〔1〕比较大小例7.查询计算机系全体学生。83/13083例如例9.查询成绩不及格学生的学号。SELECTDISTINCTSnoFROMSCWHEREGrade<60SnoCnoGrade0811101C001960811101C002550811101C003840811101C005520811102C001920811102C002900821102C004850821102C005730821102C007NULL0821103C00150Sno0811101082110384/130例如例9.查询成绩不及格学生的学号。SnoCnoGrade084〔2〕确定范围BETWEEN…AND…NOTBETWEEN…AND…作用:查找属性值在或不在指定范围内的元组。说明:BETWEEN后是范围的下限〔低值〕AND后是范围的上限〔高值〕85/130〔2〕确定范围BETWEEN…AND…85/13085例如例10.查询考试成绩在80~90之间的学生学号、课程号和成绩。SELECTSno,Cno,GradeFROMSC WHEREGradeBETWEEN80AND90等价于:

SELECTSno,Cno,GradeFROMSC WHEREGrade>=80ANDGrade<=9086/130例如例10.查询考试成绩在80~90之间的学生学号、课程号和86例如例11.查询考试成绩不在80~90之间的学生学号、课程号和成绩。SELECTSno,Cno,GradeFROMSC WHEREGradeNOT

BETWEEN80AND90等价于:

SELECTSno,Cno,GradeFROMSC WHEREGrade<80ANDGrade>9087/130例如例11.查询考试成绩不在80~90之间的学生学号、课程号87例如:日期比较例12.设有图书表〔titles〕,其中包含书号〔title_id〕、类型〔type〕、价格〔price〕和出版日期〔pubdate〕列,查询1991年6月出版的图书信息:SELECTtitle_id,type,price,pubdateFROMtitlesWHEREpubdateBETWEEN'1991/6/1'AND'1991/6/30'88/130例如:日期比较例12.设有图书表〔titles〕,其中包含88〔3〕确定集合〔IN〕作用:用来查找属性值属于指定集合的元组。

格式:

列名[NOT]IN(常量1,常量2,…)89/130〔3〕确定集合〔IN〕作用:用来查找属性值属于指定集合的元组89例如SELECTSname,SexFROMStudentWHEREDeptIN('信息管理系','通信工程系','计算机系')例13.查询信息管理系、通信工程系和计算机系学生的姓名和性别。等价于:

SELECTSname,SexFROMStudent WHEREDept='信息管理系', ORDept='通信工程系',ORDept='计算机系'90/130例如SELECTSname,SexFROMStud90例如例14.查询信息管理系、通信工程系和计算机系三个系之外的其他系学生的姓名和性别。SELECTSname,SexFROMStudentWHEREDeptNOTIN('信息管理系','通信工程系','计算机系')等价于:SELECTSname,SexFROMStudentWHEREDept!='信息管理系'ANDDept!='通信工程系'ANDDept!='计算机系'91/130例如例14.查询信息管理系、通信工程系和计算机系三个系之外的91〔4〕字符串匹配〔LIKE〕 列名[NOT]LIKE<匹配串>[ESCAPE<转义字符>]匹配串中可包含如下通配符:%〔百分号〕:匹配0个或多个字符。_〔下划线〕:匹配一个字符。[]:匹配方括号中的任何一个字符。[^]:不匹配方括号中的任何一个字符。假设要比较的字符是连续的,那么可以用连字符“-〞表达,例如,要匹配b、c、d、e中的任何一个字符,那么可以表示为:[b-e]92/130〔4〕字符串匹配〔LIKE〕 列名[NOT]LIKE<92例如例15.查询姓“张〞的学生详细信息。SELECT*FROMStudentWHERESnameLIKE'张%'93/130例如例15.查询姓“张〞的学生详细信息。93/13093例如例16.查询姓“张〞、姓“李〞和姓“刘〞的学生的详细信息。SELECT*FROMStudentWHERESnameLIKE'[张李刘]%'94/130例如例16.查询姓“张〞、姓“李〞和姓“刘〞的学生的详细信息94例如例17.查询名字的第2个字为“小〞或“大〞的学生的姓名和学号。SELECTSname,SnoFROMStudentWHERESnameLIKE'_[小大]%'例18.查询所有不姓“刘〞的学生姓名。SELECTSnameFROMStudentWHERESnameNOTLIKE'刘%'95/130例如例17.查询名字的第2个字为“小〞或“大〞的学生的姓名和95例如例19.在Student表中查询学号的最后一位不是2、3、5的学生信息。SELECT*FROMStudentWHERESnoLIKE'%[^235]'96/130例如例19.在Student表中查询学号的最后一位不是2、396转义字符如果要查找的字符串正好含有通配符,比方下划线或百分号,就需要用ESCAPE来说明。ESCAPE转义字符其中“转义字符〞是任何一个有效的字符,在匹配串中也包含这个字符,说明位于该字符后面的那个字符将被视为普通字符,而不是通配符。97/130转义字符如果要查找的字符串正好含有通配符,比方下划线或百分号97例如查找field1字段中包含字符串“30%〞的记录:WHEREfield1LIKE'%30!%%'ESCAPE'!'查找field1字段中包含下划线〔_〕的记录:WHEREfield1LIKE'%!_%'ESCAPE'!'98/130例如查找field1字段中包含字符串“30%〞的记录:98/98〔5〕涉及空值的查询空值是未确定的值或其值尚不知道。例如,学生选课,在开学初学生只有选课记录,没有修课成绩,这时成绩成绩一项的值就是空值。判断列取值为空的语句格式为:列名ISNULL判断列取值不为空的语句格式为:列名ISNOTNULL99/130〔5〕涉及空值的查询空值是未确定的值或其值尚不知道。99/199例如例20.查询还没有考试的学生的学号和相应的课程号。SELECTSno,CnoFROMSCWHEREGradeISNULL100/130例如例20.查询还没有考试的学生的学号和相应的课程号。100100注意空值不是一个确定的值,所以不可以用等于或不等于来比较或衡量;空值只能说是空值〔ISNULL〕或不是空值〔ISNOTNULL〕。101/130注意空值不是一个确定的值,所以不可以用等于或不等于来比较或衡101〔6〕多重条件查询当需要多个查询条件时,可以在WHERE子句中使用逻辑运算符AND和OR来组成多条件查询。例21.查询计算机系男生的姓名。

SELECTSnameFROMStudentWHEREDept='计算机系'ANDSex='男'102/130〔6〕多重条件查询当需要多个查询条件时,可以在WHERE子句102例如例22.查询C002和C003课程中考试成绩在80~90的学生的学号、课程号和成绩。

SELECTSno,Cno,GradeFROMSC

WHERECnoIN('C002','C003')ANDGradeBETWEEN80AND90注:OR的优先级小于AND,要改变运算的顺序可以通过加括号的方式实现。

SELECTSno,Cno,GradeFROMSCWHERE(Cno='C001'ORCno='C002')ANDGradeBETWEEN80AND90103/130例如例22.查询C002和C003课程中考试成绩在80~901033.对查询结果排序可用ORDERBY子句对查询结果进展排序。 ORDERBY<列名>[ASC|DESC][,<列名>…]说明:按<列名>进展升序〔ASC〕或降序〔DESC〕排序。当用多个列排序时,这些列在该子句中出现的顺序决定了对结果集进展排序的方式。104/1303.对查询结果排序可用ORDERBY子句对查询结果进展排104例如例23.查询修了“C002〞课程的学生的学号及成绩,查询结果按成绩降序排列。SELECTSno,GradeFROMSCWHERECno='C002'ORDERBYGradeDESC105/130例如例23.查询修了“C002〞课程的学生的学号及成绩,查询105例如例24.查询全体学生详细信息,结果按系名升序排列,同一个系的学生按出生日期降序排列。SELECT*FROMStudent

ORDERBYDeptASC,BirthdateDESC106/130例如例24.查询全体学生详细信息,结果按系名升序排列,同一个106例24执行结果ORDERBYDept,BirthdateDESCSnoSnameSexBirthdateDept0811101李勇

男1990/5/6计算机系0811102刘晨

男1991/8/8计算机系0811103王敏

女1990/3/18计算机系0811104张小红

女1992/1/10计算机系0821101张立

男1990/10/12信息管理系0821102吴宾

女1991/3/20信息管理系0821103张海

男1991/6/3信息管理系0831101钱小平

女1990/11/9通信工程系0831102王大力

男1990/5/6通信工程系0831103张姗姗

女1991/2/26通信工程系107/130例24执行结果ORDERBYDept,Birthda1074.使用聚合函数汇总数据也称为集合函数或聚合函数,其作用是对一组值进展计算并返回一个统计结果。108/1304.使用聚合函数汇总数据也称为集合函数或聚合函数,108/1108聚合函数COUNT〔*〕:统计表中元组的个数。COUNT〔[DISTINCT]<列名>〕:统计列值个数SUM〔<列名>〕:计算列值的和值〔必须是数值型列〕。AVG〔<列名>〕:计算列值的平均值〔必须是数值型列〕。MAX〔<列名>〕:得到列值的最大值。MIN〔<列名>〕:得到列值的最小值。除COUNT〔*〕外,其他函数在计算过程中均忽略NULL值。109/130聚合函数COUNT〔*〕:统计表中元组的个数。109/130109例如例25.统计学生总人数。SELECTCOUNT(*)FROMStudentSnoSnameSexSageDept0811101李勇

男21计算机系0811102刘晨

男20计算机系0811103王敏

女20计算机系0811104张小红

女19计算机系0821101张立

男20信息管理系0821102吴宾

女19信息管理系0821103张海

男20信息管理系0831101钱小平

女21通信工程系0831102王大力

男20通信工程系0831103张姗姗

女19通信工程系10110/130例如例25.统计学生总人数。SnoSnameSexSage110例如例26.统计选修了课程的学生人数。SELECTCOUNT(DISTINCTSno)FROMSCSnoCnoGrade0811101C001960811101C002550811101C003840811101C005520811102C001920811102C002900821102C004850821102C005730821102C007NULL0821103C001504111/130例如例26.统计选修了课程的学生人数。SnoCnoGrade111例如例.计算学号为“0811101〞的学生的考试总成绩。SELECTSUM(Grade)FROMSCWHERESno='0811101'322SnoCnoGrade0811101C001960811101C002800811101C003840811101C005620811102C001920811102C00290112/130例如例.计算学号为“0811101〞的学生的考试总成绩。3112例如例28.计算“0831103〞学生的平均成绩。SELECTAVG(Grade)FROMSCWHERESno='0831103'SnoCnoGrade0831102C007NULL0831103C004780831103C005650831103C007NULL71113/130例如例28.计算“0831103〞学生的平均成绩。SnoCn113例如例28.查询“C001〞课程考试成绩的最高分和最低分。SELECTMAX(Grade)最高分,MIN(Grade)最低分FROMSCWHERECno='C001'SnoCnoGrade0811101C001960811101C005620811102C001920811102C002900821102C001760821102C004850821102C007NULL0821103C001500821103C004800831101C001500831101C004809650114/130例如例28.查询“C001〞课程考试成绩的最高分和最低分。S114注意聚合函数不能出现在WHERE子句中。例如,查询学分最高的课程名,如下写法是错误的:SELECTCnameFROMCourseWHERECredit=MAX(Credit)115/130注意聚合函数不能出现在WHERE子句中。115/1301155.对数据进展分组统计作用:可以控制计算的级别:对全表还是对一组。目的:细化聚合函数的作用对象。分组语句的一般形式:

[GROUPBY<分组条件>]

[HAVING<组自身条件>]

116/1305.对数据进展分组统计作用:可以控制计算的级别:对全表还是对116使用GROUPBY子句例29.统计每门课程的选课人数,列出课程号和选课人数。SELECTCno,COUNT(Sno)FROMSCGROUPBYCno对查询结果按Cno的值分组,所有具有一样Cno值的元组为一组,然后再对每一组使用COUNT计算,求出每组的学生人数。117/130使用GROUPBY子句例29.统计每门课程的选课人数,列出117例如例30.统计每个学生的选课门数和平均成绩。SELECTSno学号,COUNT(*)选课门数,AVG(Grade)平均成绩FROMSCGROUPBYSno118/130例如例30.统计每个学生的选课门数和平均成绩。118/130118注意GROUPBY子句中的分组依据列必须是表中存在的列名,不能使用AS子句指派的列别名。带有GROUPBY子句的SELECT语句的查询列表中只能出现分组依据列和统计函数,因为分组后每个组只返回一行结果。119/130注意GROUPBY子句中的分组依据列必须是表中存在的列名,119例如例31.带WHERE子句的分组。统计每个系的女生人数。SELECTDept,Count(*)女生人数FROMStudentWHERESex='女'

GROUPBYDept120/130例如例31.带WHERE子句的分组。统计每个系的女生人数。120例如例32按多个列分组。统计每个系的男生人数和女生人数以及男生的最大年龄和女生的最大年龄。结果按系名的升序排序。SELECTDept,Sex,Count(*)人数,Max(Sage)最大年龄FROMStudent

GROUPBYDept,SexORDER

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论