C#数据库开发学习SQL教材_第1页
C#数据库开发学习SQL教材_第2页
C#数据库开发学习SQL教材_第3页
C#数据库开发学习SQL教材_第4页
已阅读5页,还剩91页未读 继续免费阅读

下载本文档

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

文档简介

目录TOC\o"1-5"\h\z第一章数据库基本概念 4ー、数据库是什么 4\o"CurrentDocument"什么是数据 4什么是数据库 4\o"CurrentDocument"使用数据库存储数据的优势 4\o"CurrentDocument"数据库的发展历史 4\o"CurrentDocument"主流的数据库 5\o"CurrentDocument"SQLServer的版本 5\o"CurrentDocument"数据库的组成 5\o"CurrentDocument"数据库平台和数据库管理系统 6\o"CurrentDocument"二、数据库基本概念 6\o"CurrentDocument"数据库系统(DBS) 6\o"CurrentDocument"实体(Entity) 6\o"CurrentDocument"属性(Attribute) 7\o"CurrentDocument"数据类型(DataType) 7\o"CurrentDocument"数据表(Table) 7\o"CurrentDocument"数据库(DataBase) 7\o"CurrentDocument"数据库文件的分类 7\o"CurrentDocument"三、数据库的分类 8\o"CurrentDocument"系统数据库 8\o"CurrentDocument"示范数据库 8\o"CurrentDocument"用户数据库 8\o"CurrentDocument"数据库操作 9\o"CurrentDocument"四、数据库中数据类型 9\o"CurrentDocument"第二章数据库对象一数据表 10\o"CurrentDocument"ー、数据完整性 10\o"CurrentDocument"实体完整性 10\o"CurrentDocument"域完整性 11\o"CurrentDocument"引用完整性 11\o"CurrentDocument"自定义完整性 11\o"CurrentDocument"二、创建表和约束 11\o"CurrentDocument"主键约束(PrimarykeyConstraint) 11\o"CurrentDocument"タト键约束(ForeignKeyConstraint) 12\o"CurrentDocument"标识列(Identity) 12\o"CurrentDocument"DEFAULT约束 12\o"CurrentDocument"检查约束(CHECKConstraint) 12\o"CurrentDocument"三、数据完整性和约束的关系 13\o"CurrentDocument"四、删除表 14\o"CurrentDocument"第三章结构化查询语言SQL 14\o"CurrentDocument"ー、什么是结构化查询语句 14\o"CurrentDocument".!创建数据库和删除数据库 15\o"CurrentDocument"创建及删除数据表 16\o"CurrentDocument"添加和删除约束 16二、表数据操作 18插入数据 18\o"CurrentDocument"UPDATE语句 19\o"CurrentDocument"WHERE子句 19\o"CurrentDocument"DELETE语句 20\o"CurrentDocument"TRUNCATE语句 21\o"CurrentDocument"三、数据查询 21\o"CurrentDocument"简单SELECT语句 21\o"CurrentDocument"TOP关键字 22\o"CurrentDocument"单条件查询 22多条件查询 22模糊查询 22\o"CurrentDocument"查询NULL 23\o"CurrentDocument"OrderBy排序 23\o"CurrentDocument"查询语句的执行顺序: 23二、复杂数据查询 24聚合函数 24\o"CurrentDocument"分组查询(GROUPBY子句) 24\o"CurrentDocument"HAVING子句 24\o"CurrentDocument"对比WHERE、GROUPBY,HAVING 25三、多表数据查询 26什么是连接查询 26\o"CurrentDocument"联接的分类: 26\o"CurrentDocument"内联接 26\o"CurrentDocument"外联接 26\o"CurrentDocument"右外联接 27\o"CurrentDocument"3.5完全外联接 27\o"CurrentDocument"第四章T_SQL编程 28\o"CurrentDocument"ー、什么是T_SQL? 28\o"CurrentDocument"二、T_SQL和SQL的区别与联系 29\o"CurrentDocument"三、T_SQL编程基础 29\o"CurrentDocument"注释 29\o"CurrentDocument"运算符 29\o"CurrentDocument"常量和变量 29\o"CurrentDocument"常用命令 30\o"CurrentDocument"BEGIN-END 30\o"CurrentDocument"IF***ELSE:ifelse 31\o"CurrentDocument"CASE:switchcase 31\o"CurrentDocument"WHILE:while 32\o"CurrentDocument"CONTINUE,Break,return语句 32练习题 32\o"CurrentDocument"第五章存储过程和函数 33ー、存储过程 33什么是存储过程 33\o"CurrentDocument"存储过程的优点与缺点 33彳jイ诸的^>'^^ 34二、自定义存储过程 34\o"CurrentDocument"不带参数的存储过程 34\o"CurrentDocument"带输出参数的存储过程 35\o"CurrentDocument"调用存储过程 36\o"CurrentDocument"分页存储过程 36三、自定义函数语法: 42自定义函数分类 42\o"CurrentDocument"调用自定义函数语法 42\o"CurrentDocument"标量值函数:返回一个标量值 43\o"CurrentDocument"表格值函数 44\o"CurrentDocument"第六章视图和索引 47ー、视图 47什么是视图 47\o"CurrentDocument"视图的优点 48\o"CurrentDocument"视图与表的区别 48\o"CurrentDocument"创建视图 48二、索引 49什么是索弓1 49\o"CurrentDocument"创建索引 49\o"CurrentDocument"第七章事务和触发器 50ー、事务 50什么是事务 50\o"CurrentDocument"事务4大属性: 50\o"CurrentDocument"事务处理 50二、触发器 51什么是触发器 51\o"CurrentDocument"触发器语法 51\o"CurrentDocument"触发器与存储过程的区别? 51\o"CurrentDocument"触发器的作用 52\o"CurrentDocument"第八章ADO.NET 52\o"CurrentDocument"ー、什么是ADO.NET 52\o"CurrentDocument"三、程序中访问数据库的工法 52\o"CurrentDocument"四、System.Data.SqlClient 53五、建立连接 53连接字符串 53\o"CurrentDocument"连接对象SqlConnection 53\o"CurrentDocument"命令对象Sqに。mmand 54\o"CurrentDocument"SQL参数SqIParameter 55\o"CurrentDocument"数据读取SqlDataReader 55\o"CurrentDocument"数据适配器SqlDataAdapter 56

六、ADO.NET六、ADO.NET应用57第一章数据库基本概念ー、数据库是什么什么是数据数据是对客观事物的抽象表示,在计算机科学中所有输入到计算机中并被计算机程序处理的符号都是数据。数据可以存储在纸张上、文件中,也可以存储在数据库中。存储在纸张上的数据不便于查阅和更新操作,存储在文件(如:Word)中的数据无法保证准确性,比如我们要求在Word文档中输入的年龄是数字21,但是我们写成“二十一”也是可以的,这样就产生了数据不准确的问题。在软件开发中我们必须保证数据是准确的,这恰恰是数据库存储数据具有的优点。什么是数据库数据库是存储在一起的相关数据的集合,是存储数据的“仓库”。13使用数据库存储数据的优势(1)数据库是将数据存储在表中,数据与数据之间可以建立关系(2)还可以对数据实施完整性约束,这样就可以保证数据库中的数据是准确的、可靠的(3)使用数据库存储数据还便于数据的查询、检索、更新及删除等操作。数据库的发展历史数据库的发展总体来说一共经历了三个时代(1)第一代是网状、层次数据库系统(2)第二代是关系型数据库系统(3)第三代是以基于对象数据模型为主要特征的数据库系统数据库发展到今天,主要以关系型数据库和基于对象型数据库为主。我们将要学习的MicrosoftSQLServer2012就是关系型数据库系统。主流的数据库关系型数据库主要有MicrosoftSQLServer、Oracle>IBMDB2三大主流数据库平台SQLServerSQLServer是Microsoft(微软)公司开发和推广的关系型数据库管理系统,它最初是由Microsoft公司、Sybase公司、Ashton-Tate公司联合开发的,并在1988年推出了针对于OS/2系统的版本。后来SQLServer产品在不断的更新,Sybase公司和Ashton・Tate公司退出了SQLServer的开发。1998年,Microsoft公司推出了SQLServer7.0版本,2000年,推出了SQLServer2000版本,在2005年底,推出了SQLServer2005版本。SQLServer的版本随着SQLServer版本不断的更新,SQLServer在易用性和安全性上持续增强,SQLServer在Windows平台上的绝对地位是无法撼动的。SQLServer2012根据不同的环境,提供了如下几个主要版本:SQLServer2012EnterpriseEdition(企业版),针对于大型企业SQLServer2012StandardEdition(标准版),针对于中小型企业SQLServer2012WorkgroupEdition(工作组版),适用于对大小和用户数量上没有限制的数据库的小型企业。SQLServer2012DeveloperEdition(开发版),针对于数据库开发人员SQLServer2012ExpressEditionSQLServerExpress(Express版),是ー个免费、易用且便于管理的数据库。OracleOracle是Oracle(甲骨文)公司运营的数据库产品,Oracle在数据库领域始终保持领先。DB2DB2是IBM公司研发的数据库产品。功能强大DB2支持从PC到UNIX,从中小型机到大型机,从IBM到非IBM(HP及SUNUNIX系统等)各种操作平台。其中服务平台可以是QS/400,AIX、OS/2、HP-UNIX或SUN-Solaris等操作系统,客户机平台可以是OS/2、Window或DOS等操作系统。MySqlMySql是现在流行的中小型关系型数据库,开发者是瑞典MySqlAB公司,2008年被SUN收购。它具有小巧,功能齐全,查询快捷等优点。数据库的组成内容 说明可视化的集成管理工具提供对数据库的可视化的管理方式。MicrosoftSQLServer2012平台有许 多管理工具,其中最重要的当属SQLServerManagementStudio,它提供 一种可视化的数据库操作方式,如创建、删除

数据库,创建、删除数据表新操作等,添加、维护各种相关对象等,对数据表中的数据进行查询、更同时它还提供了查询窗SQL语句,ロ,使得可以直接在该窗口中录入并执行SQL或T-即通过手工编写SQL或T-SQL,对数据表中的数据进行查询、更同时它还提供了查询窗SQL语句,数据库编程语言T-SQL是SQL作。各类数据库服务默的エ令正是由这些服务数据库编程语言包括SQL数据库编程语言T-SQL是SQL作。各类数据库服务默的エ令正是由这些服务MicrosoftSQLServer2012平台下有很多服务,这些服务在后台默这些服务来实现对数据库的操作。前台的管理工具、SQL或T-SQL程序代码所发出的指翻译并执行的。也就是说,本质上正是通过作,所以它们オ是真正的“为人这些服务来实现对数据库的操民服务”,是典型的“地下工作者’数据文件 存储数据库数据及事务日志数据,这些数据在物理及逻辑存储上均有一定 的关联。数据库平台和数据库管理系统MicrosoftSQLServer2012,提供了一系列的管理工具,支持ー种或几种数据库查询或编程语言,营造了一种开发及管理环境,可称得上是一个数据库平台,也称之为数据库管理系统(DBMS)o数据库管理系统(DBMS),主要的目标在于方便和有效的建立、使用和维护数据库中的数据。它对数据库进行统一的管理和控制,使用户能方便的定义和操纵数据,并保证数据的安全性和完整性。用户通过DBMS访问数据库中的数据,数据库管理员(DBA)也可通过DBMS进行数据库的维护工作。数据库管理系统(DBMS)一般包括相应的管理工具,支持ー种或几种数据库查询或编程语言,提供ー系列的管理和操作功能,包含ー组后台运行的数据库服务,以及相互关联的数据集合等。二、数据库基本概念数据库系统(DBS)ー种常用的说法是,数据库系统一般由数据库、数据库管理系统(DBMS)、使用数据库存取数据的第三方应用程序(如采用Java和•NET构建的应用程序)、数据库管理员(DBA)和用户构成。DBMS是数据库系统的基础和核心。实体(Entity)实体是客观世界中存在的且可互相区分的事物,例如桌子、人、汽车等。在数据库中,用表的一行来描述ー个实体,这一行也叫做记录(Record)。属性(Attribute)实体本身固有的特性叫做属性,例如桌子的属性有长、宽、高,人的属性有姓名、性别、年龄,汽车的属性有颜色等。在数据库中,用表的一列来描述ー个属性,这一列也叫做字段(Field)«数据类型(DataType)数据按照其本身的特点可以进行分类,例如:“中国"、"database”都是字符,1、100都是数字,2008-8-8、2009-1-1都是日期,我们把数据分成了多个类别,称每个类别为ー个数据类型。在数据库中常用的数据类型有varchar(表示字符串)、int(表示整数)、datetime(表示日期)等。数据表(Table)数据表是实体的集合,可以理解为表是由记录构成的。数据库(DataBase)广义上的数据库概念是指数据的ー种存储方式,区别于纸质文档及一般的文件存储方式。狭义上的数据库概念,要放在ー个具体的数据库平台中去理解。如在SQLServer2012下的SQLServerManagementStudio管理工具中,系统为了维护这些数据表中的数据而提供了一套相应的机制或对象,为了管理这些机构或对象,同时也为了管理多个相关的数据表,系统提供了一个逻辑上的集合体,称之为数据库。数据库中真正存储数据的是数据表。ー个数据库中可以包含多个数据表。数据库文件的分类数据库文件数据库文件用于存储数据库数据和数据库对象,是数据在磁盘中的物理存在形式。一个数据库中可以有一个或多个数据库文件。当有多个数据库文件时,必须有一个文件被定义为主数据库文件,主数据库文件的后缀名为.mdf,其它的文件被定义为次要数据库文件,次要数据库文件后缀名为.ndf。一个数据库只能有一个主数据库文件,可以有多个次数据库文件,主数据库文件和次数据库文件可以位于不同的磁盘分区。ー个数据库文件只属于ー个数据库,不能‘脚踏两只船”。在创建数据库时可以指定数据库文件存放的位置,默认存放在SQLServer的安装路径下。事务日志文件事务日志文件用于记录数据操作时数据库中的数据内容更改的信息,日志文件后缀名为Jdf。ー个数据库中可以有一个或多个事务日志文件。在创建数据库时可以指定数据库文件存放的位置,默认存放在SQLServer的安装路径下。文件组(FileGroup)FileGroup,即文件的逻辑集合,可以理解为ー个文件夹。它的目的是为了在逻辑上方便数据的管理和分配。文件组可以把指定的文件组合在ー起。每个文件组均要有一个组名。三、数据库的分类MicrosoftSQLServer2012的数据库按用途分为三类:系统数据库、示范数据库和用户数据库。系统数据库系统数据库是SQLServer2005自带的数据库,随SQLServer2012ー起安装到计算机中。共有4个,它们是master,model,msdb,tempdb.master数据库是SQLServer系统最重:要的数据库,它记录了SQLServer系统的所有系统信息。这些系统信息包括所有的登录信息、系统设置信息、SQLServer的初始化信息和其他系统数据库及用户数据库的相关信息。因此,如果master数据库不可用,则SQLServer无法启动。如果没有充分理由,我们最好不要对master做任何改动。mode!数据库用于在SQLServer实例上创建的所有数据库的模板。因为每次启动SQLServer时都会创建tempdb,所以mode!数据库必须始终存在于SQLServer系统中。当发出CREATEDATABASE(创建数据库)语句时,将通过复制model数据库中的内容来创建数据库的第一部分,然后用空页填充新数据库的剩余部分。msdb数据库是代理服务数据库,为其报警、任务调度和记录操作员的操作提供存储空间。tempdb是ー个临时数据库,它为所有的临时表、临时存储过程及其他临时操作提供存储空间。tempdb数据库由整个系统的所有数据库使用,不管用户使用哪个数据库,他们所建立的所有临时表和存储过程都存储在tempdb上。SQLServer每次启动时,tempdb数据库被重新建立。当用户与SQLServer断开连接时,其临时表和存储过程自动被删除。示范数据库MicrosoftSQLServer2005平台下还有一些示范性的数据库,如pubs、Northwind,AdventureWorks等,这些数据库给出了一些示范性的数据,系统的帮助文档中的案例,基本都是基于这些数据库来构造的。用户数据库用户数据库就是用户自己创建的数据库,用于存放用户定义的数据。

数据库操作(1)数据库的分离与附加分离数据库在对象资源管理器中右键点击要分离的数据库(如StuDB)つ选择“任务”つ选择“分离”。附加数据库在对象资源管理器中右键点击“数据库”节点。然后点击“附加”。然后弹出定位数据库文件对话框,在这个对话框中找到要附加的数据库文件后点击“确定”按钮,附加完成。(2)数据库脚本在对象资源管理器中右键点击要分离的数据库(如StuDB)->选择“任务”つ选择“生成脚本“。四、数据库中数据类型数据类型 类型描述bit 整型int 整型bit数据类型是整型,其值只能是bit 整型int 整型int-21474836482147483647之间的整数。smallint整型smallint数据类型可以存储从ー3276832767之间的整数。tinyint 整型decima! 精确数值型用这种数右所能存储的数字的总tinyint数据类型能存储从tinyint 整型decima! 精确数值型用这种数右所能存储的数字的总decimal数据类型能用来存储固定精度和范围的数值型数据。使位数。money-9220位数。money-9220亿到货币型money数据类型用来表示钱和货币值。这种数据类型能存储从9220亿之间的数据。float近似数值型float数据类型是ー种近似数值类型,供浮点数使用。datetime日期时间型datetime数据类型用来表示日期和时间。这种数据类型存储从!753年1月1 日到9999年12月31日间所有的日期和时间数据。Smalldatetime日期时间型smalldatetime数据类型用来表示从1900年1月1日到2079年6月6日间的日 期和时间char 字符型 char数据类型用来存储指定长度的定长非统ー编码型的数据。此数据类型 的列宽最大为8000个字符varchar 字符型 varchar数据类型用来存储非统一编码型字符数据。此数据类型为变长。text 字符型 text数据类型用来存储大量的非统ー编码型字符数据。nchar统ー编码字符型nchar数据类型用来存储定长统ー编码字符型数据。nvarchar统ー编码字符型nvarchar数据类型用作变长的统ー编码字符型数据。此数据类型能存储 4000种字符。image 二进制数据类型image数据类型用来存储变长的二进制数据,最大可达231-1或大约20亿字节表:保存数据时,先要分析我要保存那些数据,这些数据有什么特点,把每ー个属性特点作为一列放在ー个表里主键:ー个表中每一个数据行的唯一标识,不会重复的列才能当主键,ー个表可以没有主键,单数将处理数据时会非常困难,所以除非有特殊要求,否则每ー张表都要有主键,选中某ー列,设置为主键业务主键和逻辑主键业务主键:针对业务来说的,把手机号做为主键,这样你需要人工添加这个主键的值,这样会很难添加这个值,而使它不重复逻辑主键:和业务逻辑无关,这个列存粹的目的就是唯一标识,并且不需要你手动添加,用户不关心这个主键如何产生,系统自动处理,这种功能需要用标识列来实现标识列规则:每自己新增ー张表,在系统表中会新增ー张表a来代表你自己新增的这张表,用于数据库软件来管理你自己创建的这长表,主键最后一次新增的值保存在他所对应的系统表中第二章数据库对象一数据表一、数据完整性什么是数据完整性数据完整性:指表中的数据都是准确的,可靠的数据库中包含数据表,数据表是二维结构(行和列),行称为记录,也叫实体,列称为字段,也叫属性或数据项。我们来看看如图1所示的学员信息表Infos。在学生信息表的设计中会要求Gender列的值只能是‘男’或者‘女‘(不允许是其它数据,如‘先生’或者‘女士‘),Age列的值只能是整数(不允许是其它数据,比如字母),学员的学号不能重复等。如果学员信息表中的数据都能满足上述要求,也即符合客观实际,我们说学员信息表实现了数据完整性。实体完整性实体可以理解为表中的一条记录,实体完整性是指实体的唯一性,即在同一张表中每条记录都是唯一的,不存在两条完全相同的记录,因为完全相同的记录是没有必要同时存在于数据库中。1)能够唯一标识行的键称之为“候选键”。2)被明确用来唯一标识行的候选键称之为“主键”。3)主键用来保证实体完整性。域完整性域完整性是指列中的值是否符合指定的要求。1)数据类型。2)格式3)值的范围4)默认值5)是否允许空值(NOTNULL)-NULL与‘NULL’是不同的,前者表示没有数据,后者表示字符串。引用完整性什么是引用完整性呢?提供值的表(Infos)叫做主表,也可以称作父表,被引用的列必须是主键或唯一键,把引用主表的表叫做从表,也可以称作子表,用于引用的列叫做外键,也称作Scores表的外键。那么究竟什么是引用完整性呢?引用完整性是指从表外键的值引用主表中主键的值。一旦建立了引用关系,从表外键的所有值在主表的主键中都必须存在。引用完整性创建了表与表之间的关系,关系分为三种ー对ー,主表中的一条记录对应子表中的一条记录。一对多,主表中的一条记录对应子表中的多条记录。3)多对多,主表中的多条记录对应子表中的多条记录。自定义完整性自定义完整性用来制定特定的业务规则,使用规则、存储过程、触发器来实现自定义完整性。实体完整性描述行,域完整性描述列,引用完整性描述关系。自定义完整性描述逻辑。二、创建表和约束在SQLServerManagementStudio中创建Infos表和Scores表我们知道数据完整性是指数据的准确性和可靠性,包括实体完整性、引用完整性、域完整性、自定义完整性,那么如何实现数据完整性呢?下面要讲的约束就是用来实现数据完整性的。约束包括主键约束、外键约束、检查约束、默认值约束、唯一约束。主键约束(PrimarykeyConstraint)表中用来唯一标识表中一行的列称为主键。主键列中所有行的值都不能重复,也不能为NULL,主键约束实现了实体完整性。注意:1)如果两个或两个以上的列组合为主键,称其为“组合键”,组合键中的所有列组合在ー起是唯一的。2)设计主键遵循列最少性原则。3)每张表只有一个主键。4)表中可以没有主键,但不推荐这样做。外键约束(ForeignKeyConstraint)引用完整性约束了表与表之间的关系(Relationship),外键约束是用来实现引用完整性的。注意:一个表可以有多个外键。2)主表中应该有主键3)从表外键的数据类型必须与主表主键的类型相同。4)添加数据时要先添加主表记录,后填加子表记录。5)删除数据时要先删除子表记录,后删除主表记录。标识列(Identity)每个表都应该有主键,有些情况下很难找到不重复的列作为表的主键,此时,可以利用SQLServer提供的“标识列”,也叫“自动编号”列来作为主键。这样,每添加一行数据时,标识列都会自动产生一个新值,因此标识列中任意两行的值都不会重复。标识列中有三个重要的属性,分别是“是标识”、“标识种子”、“标识增量”:“是标识”是指是否将该列设置为标识列。“标识种子”是指第一次添加数据时标识列的初始值。“标识增量”是指标识列中每次增加的值。注意:1)标识列必须是数字类型。2)标识列的值是自动生成的,在输入数据时,它的值会随着数据行的增加自动产生一个新的数字,作为该列的值。一个表中只能有一个标识列。DEFAULT约束我们可以为表中某列设置ー个默认值,比如将学员表的Address列设置默认值为“地址不详”,当添加一名学生时,如果Address列没有提供值,这ー列就会使用默认值。生日获取当前时间为默认值getDate()函数是系统内置函数,获取当前时间检查约束(CHECKConstraint)检查约束(CHECK)用来定义可以接受的数据值或数据格式。例如,笔试成绩的值在0-100之间,Email中必须包含字符@等,设置了检查约束后,在添加或修改数据时,如果数据不

符合CHECK约束,就不能实现添加或修改。HECK约束数据格式。Infos表的StulD是主键,它的格式是字母s连接ー个1或2,再连接5位数字,例如S100101,意义如下:第一个字母s是学期semester的缩写。第二个数字如果是1,表示第一学期,如果是2,表示第二学期。后5位数字中的前3位表示班级编号。后5为数字中的后2位表示学生编号为了约束StulD列的值都符合这个格式,在StulD列添加CHECK约束来限制格式,如图18。约束表达式中LIKE语句表示模糊查询,即表示“像…的形式”,[0-9]表示在0到9之间的任意ー个数字,OR表示或者。这样StulD的值就必须符合CHECK格式的要求。输入S100101、s200102是正确的,输入s300101、slOOlOa是错误的,错误的数据无法输入的。LIKE语句中还有两个通配符%和一,其中%表示任意零个或多个字符,ー表示任意ー个字符。如:StuNameLIKE'王%’-查找姓王的学员。StuNameLIKE’王ー'-查找姓王的,名字只有一个字的学员。唯一约束(UNIQUEConstraint)主键是唯一的,但有时候我们要求非主键列也是唯一的,这时候就要使用唯一约束(UNIQUE)。一个表中可以有多个UNIQUE约束。完整性域约束的关系:数据完整性

实体完整性引用完整性域完整性三、数据完整性和约束的关系数据完整性

实体完整性引用完整性域完整性主键约束唯一键约束标识列外键约束数据类型长度空约束默认约束检查约束自定义完整性 默认规则触发器四、删除表删除表时,在要删除的表上右击,在弹出对话框中选中“删除(D)”命令,就可以将表删除。如果删除的表是关系表中的主表,删除就会失败,如图22所示。这时要先删除子表,再删除主表。第三章结构化查询语言SQLー、什么是结构化查询语句结构化查询语言(StructuredQueryLanguage)简称SQL,专门用于数据存取、数据更新及管理数据库等数据库操作。SQL是由美国国家标准局(ANSI)与国际标准化组织(ISO)制定的标准,因此SQL语句适用于任何数据库操作。SQL是髙级的非过程化编程语言,允许用户在更高的层面上工作。它不要求用户指定数据如何存放,也不需要用户了解数据如何存放,所以不同底层结构的数据库系统均可以使用相同的SQL语言作为数据输入与管理的工具。它以数据的记录集合作为操作对象,SQL语句接受集合作为输入,返回集合作为输出,这种集合特性允许一条SQL语句的输出作为另一条SQL语句的输入,所以SQL语句可以嵌套,这使它具有极大的灵活性和强大的功能。在多数情况下,在其它语言中需要一大段程序实现的功能,在SQL语句中可能只需要一条SQL语句就可以达到目的,这也意味着用SQL语言可以写出功能强大而复杂的数据操作语句。数据定义语言(DDL)用于建立数据库、数据库对象、删除数据库、数据库对象等操作,例如:CREATE>DROP,ALTER等语句。数据操作语言(DML)用于数据查询、插入、更新、删除等操作,例如:SELECT.INSERT.UPDATE,DELETE语句数据控制语言(DCL)用户控制数据库操作的许可、权限等操作,例如:GRANT、REVOKE.COMMIT等语句在SQLServer2012中使用SQL——“新建查询窗口”.!创建数据库和删除数据库⑴语法:创建数据库CREATEDATABASE<数据库名)ON[PRIMARY]① ②(ー创建数据文件参数信息[NAME=逻辑文件名,)③FILENAME=物理文件名,④[SIZE=数据库大小,]⑤[MAXSIZE=最大容量,]©[FILEGROWTH=增长量]⑦)[LOGON]®(ー创建日志文件参数信息[NAME=逻辑文件名,]FILENAME=物理文件名,[SIZE=数据库大小,][MAXSIZE=最大容量,][FILEGROWTH=增长量]GO-GO是SQL中批处理关键字,往往表示ー组SQL语句的结束GOUSEStuDB-USE是SQL中更换当前数据库关键字注意:1)仅使用CREATEDATABASEStuDB就可以快速创建数据库,所有参数均使用默认值。2)注意多个参数中用,”隔开,最后ー个参数不需要在添加“,”。语法:删除数据库DROPDATABASE数据库名USEMasterGOIFEXISTS(SELECT*FROMsysdatabasesWHEREname='StuDB')DROPDATABASEStuDB注意:我们创建的每ー个数据库,它的名称都存放在Master库的sysdatabases表中,因此首先要将当前数据库切换到Master库,才能使用EXISTS语句判断StuDB是否存在SQL语句对换行没有要求,但是为了易读性,应该根据需要加入换行。创建及删除数据表语法;创建数据表CREATETABLE数据表名(字段名字段类型[NOTNULLINULL][约束描述],字段名字段类型INOTNULLINULL][约束描述],字段名字段类型[NOTNULL|NULL][约束描述],)注意:1)创建表前,注意选择当前数据库,否则有可能将数据表建立到其他的数据库中。2)数据列的数据类型的选择要合理。语法:删除数据表DROPTABLE数据表名USEStuDBGOIFEXISTS(SELECT*FROMsysobjectsWHEREname='Infos')DROPTABLEInfosGO注意:每ー个数据库中都有一个名为sysobjects的表,该表中存储了当前数据库中所有表的名称。添加和删除约束语法:添加约束ALTERTABLE数据表名ADDCONSTRAINT约束名约束语句约束名称关键字 简称主键约束PRIMARYKEYPK外键约束FOREIGNKEYFK默认约束DEFAULTDF检查约束CHECKCK唯一约束UNIQUEUQ约束名称定义格式为:约束简称+数据表名+数据列名。例如:CK_lnfos_Gender/**添加约束方式ー:一条SQL语句添加一个约束・*/ALTERTABLEInfosADDCONSTRAINTPK_lnfos_StulDPRIMARYKEY(StulD)ALTERTABLEInfosADDCONSTRAINTCK_lnfos一GenderCHECKfGender=’男'orGender='女’)ALTERTABLEInfosADDCONSTRAINTDE_lnfos_StuAddressDEEAUE’地址不详’)EORStuAddress,ALTERTABLEInfosADDCONSTRAINTUQJnfos一StuNameUNIQUE(StuName)/**添加约束方式二:一条SQL语句添加多个约束・*/ALTERTABLEScoresー添加主键约束,设置Id列为Scores的主键ADDCONSTRAINTPK_Scores_ldPRIMARYKEY(ld),--添加外键约束,Scores表的StulD列连接Infos表的StuID列CONSTRAINTFK_Scores_StulDFOREIGNKEY(StulD)REFERENCESInfos(StulD),CONSTRAINTDF_Scores_WrittenScoreDEFAULT(O)FORWrittenScore,CONSTRAINTCK_Scores_WrittenScoreCHECK(WrittenScore>=0ANDWrittenScore<=100),CONSTRAINTDF_Scores_LabScoreDEFAUiT(O)FORLabScore,CONSTRAINTCK_Scores_LabScoreCHECK(LabScore>=0ANDLabScore<=100)/**添加约束方式三:创建数据表的时候添加约束・*/CREATETABLEInfosStulDVARCHAR(7)NOTNULLPRIMARYKEY语法:删除约束ALTERTABLE数据表名DROPCONSTRAINT约束名例:IFEXISTS(SELECTnameFROMsysobjectsWHEREname='CK_lnfos_Gender')BEGINALTERTABLEInfosDROPCONSTRAINTCK_lnfos_GenderEND二、表数据操作插入数据语法:INSERT[INTO]数据表名(列名1,列名2,列名3,...…)VALUES(值:L,值2,值3, )插入单行数据1INSERTINTOInfos(StulD,StuName,Gender,Age,Seat,EnrollDate,StuAddress,ClassNo)VALUES“100110ン公孙、胜;女丁18,,T,DEFAULT」河北保定,「1001リ注意:VALUES中的值,如果没有要使用默认值,可以用DEFAULT代替。2)VAULES中的值,尽量使用单引,否则容易出现错误。3)需要保证列名和值ーー对应,包括数目、类型、小数位数等等。4)插入的数据需要注意完整性,以免出现违背约束而导致无法插入数据的情况。5)不可以显示插入标识列,插入时无需指定标识列。6)注意列名、表名书写的正确性和规范性«7)当为所有列插入数据时(不包括标识列)可以省略字段列表,省略字段列表时,VALUES中的值要与各列 对应。例:INSERTINTOInfosVALUES“100111「秦明,「女,,19,1,DEFAULT/陕西户县ソ1001リUPDATE语句语法:UPDATE<表名)SET歹リ名1=值1[,列名2=值2,...][WHERE条件表达式)注意:1)上面给出的语法格式中,同前面的章节中的介绍,U表示可选,。表示必选。UPDATE,SET,WHERE均为系统关键字,即系统中已经存在、能够识别或进行相应解读的重要词汇,在SQL语句书写规范中,关键字建议大写。2)关键字与其它词汇间应有空格,如UPDATE与表名之要有空格。3)同时修改多列,则在SET后面采用“列名1=值1,列名2=值2,…”的形式修改多列的值,每列值的修改采用“列名=值”的形式,列之间用“,”分隔。4)WHERE子句(整条语句中的子句)设定了一个条件表达式,用来标识对满足条件的行进行修改。5)SQL语句中,如果要更新或插入的数据是字符串、时间等类型的数据,则在更新或插入时,值要用单引号引起来。WHERE子句WHERE子句用于告诉系统对满足条件的行进行修改,即对哪一行或哪些行进行修改,其格式为:语法:WHEREく条件表达式〉注意:1)其中“条件表达式”用于指定操作的条件,上面说的“满足条件的行”即由该表达式来指定,条件表达式由单个的关系表达式或逻辑表达式组成关系表达式:采用关系运算符将两个操作数据联接起来,构造成的表达式即为关系表达式常用的关系运算符运算符 说明大于= 大于等于小于= 小于等于= 等于〇或!=不等于如:15>12,即为ー个关系表达式,再如Age>18>Address。1西安,、StuName='张三’等,均表达ー种比较关系的关系表达式,其中Age、StuAddress,StuName是数据表中的字段名。关系表达式的结果为真或假,在SQL用TRUE或FALSE来表达,如15>12的结果为TRUE,而15<12的结果为FALSE〇那么如果在WHERE子句中,要表达多个条件该如何做呢?逻辑表达式:辑表达式用于将多个关系表达式组合起来,表达一种“同时”或“或者”或“非”的情况,采用逻辑运算符将多个关系表达式联接起来形成逻辑表达式常用的逻辑运算符运算符(优先级由高到低) 说明AND与,即“同时”NOT非OR或,即“或者”NULL空NOTNULL非空UPDATEInfosSETStuAddress=)地址不详’WHEREStuAddressISNULLUPDATEInfosSETStuAddress=1西安’WHEREStuAddressISNOTNULL注意:AND运算符的组合优先级髙于NOT,NOT高于。R,NOT一般采用就近原则结合,所以“NOTAge>18ANDSeat>3ORStuAddress。‘西安’”可以看作是NOT对“Age>18ANDSeat>3”取非,结果值再与“StuAddress。'西安'”的结果值作“或”运算。一般为避免计算优先级的问题,可以采用加“()”的方式,来改变优先级,同时表达也很清楚,避免混乱。如:(NOT(Age>18ANDSeat>3))OR(StuAddress。,西安')同上面的表式式效果是ー样的。逻辑表达式,如:StuName='张三'ANDAge>18,表示:姓名为张三,同时年龄大于18岁;再如:StulD='s200102'ORStulD='s200103’表示学号为s200102或s200103:再如:NOTAge=18即为年龄不等于18岁,但是这种形式较很少用,而用Age<>18来表示。like子句在WHERE子句中的应用实现“模糊”查询操作语法:LIKE,条件%'DELETE语句语法:删除数据DELETE[FROM]〈表名)[WHERE条件表达式)注意:主表删除数据的问题默认情况下,两张表如果存在主外键关系,系统并不允许我们直接去删除主表中的数据(可以删除子表中的数据,所以オ有’’删除数据时一般应先删除子表中的数据,后删除主表中的数据”的说法),除非在系统中设置了“级联删除”。级联删除和级联更新清空数据库的所有数据语法:DELETEFROMScoresTRUNCATE语句语法:truncatetable表名三、数据查询1.1简单SELECT语句把数据的添加、査询、修改、删除简称为CRUD(CreateヽRetrieve,Update>Delete)«结果集:查询是将表中全部或部分数据提取出来,可以简单的理解为逐行读取,并判断这行数据是否符合要求,把所有符合要求的行组织在ー起,称其为结果集。语法:SELECTく列名〉FROMく表名〉[WHEREく条件表达式〉][ORDERBYく列名〉[ASC或DESC]]注意:1)以逗号分隔的查询结果集中要显示的列名,如果查询所有列,用・代替所有列名。2)查询条件,可选项,如果省略则査询所有的数据。2.SELECT语句的应用:查询所有列(*)和查询部分列(',,分割列名)更改结果集的列名和表名:AS子句或者省略AS子句(2)等号改列名,但不能更改表名SELECT学号=StulD,姓名=StuName,性别=GenderFROMInfos学员信息表(3)AS还可以为组合列名起名称。SELECTStulDAS学号,WrittenScoreAS笔试成绩,LabScoreAS机试成绩,WrittenScore+LabScoreAS总成绩FROMScoresAS学员信息表注意:AS子句更改的是结果集中的列名,对原始表中的列没有影响。TOP关键字(1)查询前N条记录SELECTTOP5*FROMScores(2)按照百分比查询记录SELECTTOP5PERCENT*FROMScores注意:按照百分百查询数据时,当遇到不足一条记录时,按照一条来查询。例如表中有60条记录,查询7%的数据,则会查询出5条。单条件查询关键字WHERE用于为查询提供条件,写在FROM关键字的后面。多条件查询模糊查询模糊查询使用like语句实现,我们还记得like语句中有两个通配符,%表示任意零个或多个字符,ー表示任意ー个字符。SELECT*FROMinfosWHEREStuNameLIKE'孙%'SELECT*FROMinfosWHEREStuNameLIKE'ー进’查询通配符‘%’或者]'本身如果要查询通配符,要使用ESCAPE关键字定义转义符,当转义符置于通配符之前时,该通配符就解释为普通字符。(1)要搜索在任意位置包含字符串5%的字符串,应使用:WHERE歹リ名LIKE'%5/%%'ESCAPE'/'(2)要搜索ー个字符串Ig_',应使用WHERE列名LIKE'gs_'ESCAPE's'(3)ESCAPE后的参数只能包含一个字符。1.6查询NULLNULL表示不存在数据,查询NULL值时使用ISNULL或者ISNOTNULLoSELECT*FROMscoresWHERETermISNULLSELECT*FROMscoresWHERETermisNOTNULL注意:'=’是用来查询已经存在的数据,而‘NULL,表示不存在数据,因此不能使用,=餐询NULL值。BETWEENAND查询范围值SELECT*FROMscoresWHEREWrittenScoreBETWEEN60AND80SELECT*FROMscoresWHEREWrittenScore>=60ANDWrittenScore<=80OrderBy排序如果要对查询结果集中的数据按照特定的顺序排列,则需要使用ORDERBY子句,如果按照升序排序时,在。RDERBY子句后连接关键字ASC,默认情况下就是升序排序,因此ASC可以省略。如果按照降序排序时,在ORDERBY子句后连接关键字DESC。降序:SELECT*FROMscoresWHERETerm='si'ORDERBYwrittenscoreDESC升序:SELECT*FROMscoresWHERETerm='s2'ORDERBYlabscoreASC多列组合排序:SELECT*FROMScoresORDERBYwrittenScoreDESC,labscoreASC查询语句的执行顺序:查询语句“SELECT歹リFROM表WHERE条件ORDERBY列名”执行的顺序是FROM->WHERE->ORDERBY->SELECT二、复杂数据查询聚合函数聚合函数的作用是对ー组值进行计算,然后返回结果。例:查询1002班所有学员的平均年龄。在SQL语句中,可以采用聚合函数来完成类似于求平均值这样的数据统计功能。常用的聚合函数名称作用 语法AVG 平均值AVG(表达式)SUM求和 SUM(表达式)MIN 最小值 MIN(表达式)MAX 最大值 MAX(表达式)COUNT 数据统计COUNT(表达式)语法:SELECTく聚合函数〉FROMく表名>[WHEREく条件表达式〉]SELECTAVG(Age)AS‘平均年龄’FROMInfosWHEREClassNo='1002'SELECTAVG(WrittenScore+LabScore)AS’总平均成绩’FROMScoresWHERETerm='SI'SELECTSUM(Age)AS'总年龄’FROMInfosWHEREClassNo='1002'SELECTMAX(Age)AS‘最大年龄MIN(Age)AS'最小年龄'FROMInfosWHEREClassNo='1002'SELECTCOUNT(Age)AS'KWFROMInfosWHEREClassNo='1002'ANDAge<20分组查询(GROUPBY子句)GROUPBY子句用于对查询数据源中的数据根据一列或多列进行分组,被分组列中所有相同的记录被分为ー组。查询1002班男学员与女学员的平均年龄。首先要通过WHERE子句过滤1002班的学员,然后将1002班中所有男学员分为ー组,女学员分为ー组,最后对这两个组分别求平均年龄。SELECTGenderAS'性别'FROMInfosWHEREClassNo='1002'GROUPBYGenderselectsex性别,avg(age)平均值fromuserinfowheregradeld='l'groupbysexselectgradeld班级,avg(age)平均值fromuserinfogroupbygradeldHAVING子句按照班级分组,查询男学员平均年龄,按照平均年龄降序,但是只查询平均年龄大于22岁的班级。案例分析:在之前的基础上,只需要加入查询条件即可。HAVING子句同WHERE子句的功能,也是ー种查询条件,它可以解决上述问题。HAVING子句可以将聚合函数作为搜索条件加入到SQL语句中。HAVING子句只能和SELEC!语句ー起使用,通常需要与GROUPBY子句ー起使用,如果不使用GROUPBY子句,则HAVING子句的行为与WHERE子句ー样。通常理解为WHERE用于GROUPBY之前,HAVING用于GROUPBY之后。语法结构:HAVING子句语法结构SELECT(列名,聚合函数》FROMく表名〉[WHERE查询表达式][GROUPBY〈歹リ名〉][HAVING查询表达式][ORDERBY〈歹リ名>[ASC|DESC]]注意:⑴出现在SELECT字段列表中,要么参与聚合运算,要么是分组中分组依据字段,否则不允许出现在SELECT字段列表中。(2JHAVING的表达式是聚合函数,或者字段名必须是分组字段SELECTClassNoAS,班级’,AVG(Age)AS‘平均年龄’FROMInfosWHEREGender=’男’GROUPBYClassNoHAVINGAVG(Age)>22ORDERBY平均年龄DESC例5中的演示代码改为如下形式:对比WHERE、GROUPBY>HAVING在SELECT语句中应用WHERE子句、GROUPBY子句、HAVING子句时,要清晰的了解它们各自的作用,注意它们之间的关系,才能够很好的将它们应用到SELECT语句中。WHERE用于GROUPBY之前,满足条件的记录参与分组,HAVING用于GROUPBY之后,对分组后的每组再进行筛选。三、多表数据查询什么是连接查询概念:根据两个表或多个表的列之间的关系,从这些表中查询数据。目的:实现多个表查询操作。联接的分类:内联接、外联接、交叉联接。内联接内联接操作用于查询具有一定关联的两张(或两张以上)表的关联部分(按关联对应的字段)的数据,操作表之间不一定要有主外键关系。内联接返回两个表中所有相匹配的数据。不匹配的数据不显示,采用INNERJOIN关键字实现。语法:SELECT(表A.字段11表B.字段1>し表A.字段2,-]FROMく表A>INNERJOIN〈表B>ONく表A.关联字段=表B.关联字段)例:SELECTInfos.StulD,StuName,Gender,WrittenScore,LabScoreFROMInfosINNERJOINScoresONInfos.StulD=Scores.StulDSELECTInfos.StulD,StuName,Gender,WrittenScore,LabScoreFROMInfosINNERJOINScoresONInfos.StulD=Scores.StulDWHEREWrittenScore>=60ANDLabScore>=60ORDERBYWrittenScoreDESC,LabScoreDESC外联接外联接分为左外联接、右外联接和完全外联接。左外联接:简称左联接,语法格式基本同内联接,不同的是使用关键字LEFTJOIN或LEFTOUTERJOIN实现。LEFTJOIN左边的表称为左表,右边的表称为右表,左联接查询时将返回左表中的所有的行,右表中不存在的行以NULL填充。语法:SELECT〈表A.字段11表B.字段1>し表A.字段2,…]FROMく表A>LEFTJOIN<表B>ON<表A.关联字段=表B.关联字段〉SELECTlnfos.StulD,StuName,Gender,WrittenScore,LabScoreFROMInfosLEFTJOINScoresONInfos.StulD=Scores.StulD右外联接简称右联接,语法格式基本同内联接,不同的是使用关键字RIGTHJOIN或RIGTHOUTERJOIN实现。RIGTHJOIN左边的表称为左表,右边的表称为右表,右联接查询时将返回右表中的所有的行,左表中不存在的行以NULL填充。SELECT(表A.字段11表B.字段1>[,表A.字段2,…]FROMく表A>RIGTHJOIN<表B>ONく表A.关联字段=表B.关联字段〉完全外联接语法格式基本同内联接,不同的是使用关键字FULLOUTERJOIN或FULLJOIN实现。完全外联接返回左表与右表中所有的行,左表中的行在右表中没有匹配项时右表值为NULL,右表中的数据行在左表中没有匹配项时左表值为NULLoSELECTlnfos.StulD,StuName,Gender,WrittenScore,LabScoreFROMInfosFULLJOINScoresONInfos.StulD=Scores.StulD综合练习例:查询所有部门的名称及其主管人员的姓名,要求查询结果集中出现部门名称、主管。SELECTDeps.DepNameas部门名称,PerNameas主管FROMDepsINNERJOINPersonsONDeps.ChargelD=Persons.PerlD例:查询所有人员的信息,并确定其中哪些人主管了哪些部门,要求查询结果集中出现人员ID、姓名、主管部门。SELECTPerlDas人员ID,PerNameas姓名,Deps.DepNameas主管部门FROMPersonsLEFTJOINDepsONPersons.PerlD=Deps.ChargelDSELECTPeriDas人员!D,PerNameas姓名,Deps.DepNameas主管部门FROMDepsRIGTHJOINPersonsONDeps.ChargelD=Persons.PerlD例:查询所有的部门由哪些人来主管,要求查询的结果集中出现部门ID、部门名称,主管人员。SELECTDepIDas部门!D,DepNameas部门名称,PerNameas主管人员FROMDepsLEFTJOINPersonsONDeps.ChargelD=Persons.Perl例:针对Deps表和Salary作完全外联接。SELECT*FROMDepsFULLJOINSalaryONDeps.ChargelD=Salary.PerlD第四章T_SQL编程ー、什么是T_SQL?其实T-SQL,就是Transact-SQL,是SQLServer对标准结构化查询语言的扩展(SQL,即StructuredQueryLanguage)»而在。racle中我们使用的是PL/SQL,也就是oracle对标准SQL的扩展。二、T.SQL和SQL的区别与联系SQL是StructruedQueryLanguage的缩写,即结构化查询语言。它是负责与ANSI(美国国家标准学会)维护的数据库交互的标准。作为关系数据库的标准语言,它已被众多商用DBMS产品所采用,使得它已成为关系数据库领域中一个主流语言,不仅包含数据查询功能,还包括插入、删除、更新和数据定义功能.T-SQL是SQL语言的ー种版本,且只能在SQLSERVER上使用。它是ANSISQL的加强版语言、提供了标准的SQL命令。另外,T-SQL还对SQL做了许多补允,提供了类似C、Basic和Pascal的基本功能,如变量说明、流控制语言、功能函数等。三、T_SQL编程基础3.1注释.单行注释:一.多行注释:/* */.2运算符.算数运算符:+,-,*,/,%.比较运算符:>,<,>=<=,<>,!>,!<,=.赋值运算符:=.逻辑运算符NOT,AND,ALL\OR\BETWEEN\IN\LIKE\SOME\ANY.一元运算符:+(正数),-(负数),~(取反).字符串运算符:+.3常量和变量.常量:23,,32432',$20.变量2.!局部变量:用户可自定义的变量,它的作用范围仅在程序内部。局部变量的名称都是以@开头的。声明局部变量DECLARE@局部变量名数据类型[,-n]declare@xint为局部变量赋值set@x=500select@x=max(score)fromscore2.2全局变量全局变量是SQLServer系统内部事先定义好的变量,不用用户参与定义,对用户而言,其作用范围并不局限于某ー程序,而是任何程序均可随时调用。全局变量通常用于存储ー些SQLServer的配置设定值和效能统计数据。全局变量的名称都是以@@开头的。@@IDENTITY返回最后插入的标识值@@ROWCOUNT返回受上一语句影响的行数常用命令PRINT将用户定义的消息返回客户端命令用于在指定设备上显示信息。可以输出的数据类型只有:char、nchar,varc

温馨提示

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

评论

0/150

提交评论