7.1 数据库基础

  要了解数据库,首先就要掌握数据库基础,数据库就是存放数据的仓库。当开发人员在应用程序的开发中,可以将任何可以抽象成数据的信息存放在数据库中,数据库的特点是数据能够按照数据模型组织进行存取,数据库是高度的结构化并且可以为多个用户共享的。

7.1.1 结构化查询语言
  结构化查询语言简称“SQL”,最早的是圣约瑟研究实验室为其关系数据库管理系统SYSTEM R开发的一种查询语言。现今的数据库,无论是大型的数据库,如Oracle 、Sybase、Informix、SQL server这些大型的数据库管理系统,还是Visual Foxpro,PowerBuilder这些微机上常用的数据库开发系统,都支持SQL语言作为查询语言。

  SQL是高级的非过程化编程语言,允许用户在高层数据结构上工作,它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同的底层结构的不同数据库系统都可以使用相同的SQL语言作为数据输入与管理的接口。它以记录集作为操作对象,所有SQL语句接受集合作为输入,返回集合作为输出,这种集合特性允许一条SQL语句的输出作为另一条SQL语句的输入,所以SQL语言可以嵌套,这也使SQL语句具有极大的灵活性和强大的功能。在多数情况下,在其他语言中需要一大段程序实现的一个单独事件只需要一个SQL语句就可以达到目的,这也意味着用SQL语言可以写出非常复杂的语句。下面给出一组例子来演示SQL语句的使用方法。
1.查询表中所有记录
通过使用select关键字进行查询,示例代码如下所示。
+展开
-SQL
    SELECT * FROM NEWS

2.带条件的查询语句
通过使用where语句进行带条件的查询,示例代码如下所示
+展开
-SQL
    SELECT * FROM NEWS WHERE TITLE=‘新闻’

3.使用函数
语句中也可以使用内置函数,示例代码如下所示。
+展开
-SQL
    SELECT COUNT(*) AS MYCOUNT FROM NEWS

4.插入数据语句
通过使用insert进行插入数据库操作,示例代码如下所示。
+展开
-SQL
    INSERT INTO NEWS VALUES (‘新闻’,’2008/9/9’,’新闻内容’)

5.删除数据语句
通过使用delete关键字删除数据库中的数据,示例代码如下所示。
+展开
-SQL
    DELETE FROM NEWS WHERE ID=1

注意:当delete后面的条件没有限定时,则会删除该表的所有数据。
6.更新数据语句
通过使用update关键字更新数据,示例代码如下所示。
+展开
-SQL
    UPDATE NEWS SET TITLE=‘新闻标题’ WHERE ID=‘1’

注意:SQL并不区分大小写,但是推荐使用大写来书写SQL语句,这样能够在应用程序中清晰的辨认。

7.1.2 表和视图
  表是关系数据库中最主要的数据对象,开发人员通过创建表并向表中进行数据操作来存储和操作数据,表是用来存储和操作数据的一种逻辑结构。表通常以二维表形式呈现,在SQL Server Management Studio中可以看见表的结构,如图7-1所示。
表的表现形式
图7-1 表的表现形式
创建表可以使用SQL语句进行创建,下面是创建表的表脚本代码。
+展开
-SQL
    CREATE TABLE [dbo].[news](
[id] [int] IDENTITY(1,1) NOT NULL,
[title] [nvarchar](50) NULL,
[time] [datetimeNULL,
[content] [ntext] NULL,
)

  上述代码创建了一个新闻表并且该表具有4个字段,这4个字段分别为id、title、time和content,表是一个具体的表,用于数据的存放和读取。视图不同于表,视图并不是实际存在的表,视图是一种虚拟的表,视图将存在的表中按照一定的规则读取若干列,组成新的结果集,视图在物理上并不存在。当对视图进行操作时,系统会根据视图的定义去操作与视图相关联的基本表。视图有助于隐藏现有的表中的数据,创建视图代码如下所示。
+展开
-SQL
    CREATE VIEW myview as
    SELECT title,[timefrom news

  上述代码创建了一个视图,是基于查询语句select title,[time] from news所查询的集合的。
注意:视图不是一个表,是一个虚拟的表,视图可以是多个表的集合、筛选形成的新表,视图是这些表的一个结果集。

7.1.3 存储过程和触发器
  存储过程是一组为了完成特定功能的SQL语句集,在编写完成后,系统会编译代码并存储在数据库中。用户只需要指定存储过程的名字并给出传递的参数,就可以使用存储过程。存储过程的概念有点像应用程序开发中的方法。

1.存储过程
  存储过程是数据库中一个非常重要的对象,使用好存储过程能够将数据库应用与程序应用相分离。当维护与数据库相关的功能的时候,只需要维护存储过程即可,另外使用存储过程能够提升性能,存储和过程会在运行中被编译,当没有显著的数据更新时,可以直接从编译后的文件中获取相应的结果。存储过程优点如下所示:
1)存储过程允许标准组件式编程。
2)存储过程的执行速度较快。
3)存储过程能够减少网络流量,降低应用程序读取数据库的次数。
4)存储过程比查询语句更加安全。

存储过程声明语法如下所示:
+展开
-SQL
    CREATEPROC[EDURE]procedure_name[;number]
     [{@parameterdata_type}
     [VARYING][=default][OUTPUT]
     ][,...n]
     [WITH
     {RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}]
     [FORREPLICATION]
    ASsql_statement[...n]

  存储过程的各个参数的使用如下所示。
1)procedure_name:新存储过程的名称,过程名必须符合标识符规则,且对于及其所有者必须惟一。
2)number:是可选的整数,用来对同名的过程分组,以便用一条DROPPROCEDURE语句即可将同组的过程一起除去。
3)@parameter:过程中的参数。在CREATEPROCEDURE语句中可以声明一个或多个参数。用户必须在执行过程时提供每个所声明参数的值。
4)data_type:参数的数据类型。所有数据类型如text、ntext和image均可以用作存储过程的参数,而与之不同5)VARYING:指定作为输出参数支持的结果集,其由存储过程动态构造,内容可以变化,VARYING仅适用于游标参数。
6)default:参数的默认值。如果定义了默认值,不必指定该参数的值即可执行过程,默认值必须是常量或NULL,如果过程将对该参数使用LIKE关键字,那么默认值中可以包含通配符(*、_、[]和[^])。
7)OUTPUT:表明参数是返回参数。该选项的值可以返回给EXEC[UTE]。使用OUTPUT参数可将信息返回给调用过程。
8)n:表示最多可以指定2.100个参数的占位符。
9){RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}:RECOMPILE表明SQLSERVER不会缓存该过程的计划,该过程将在运行时重新编译;ENCRYPTION表示SQLSERVER加密syscomments表中包含CREATEPROCEDURE语句文本的条目;使用ENCRYPTION可防止将过程作为SQLSERVER复制的一部分发布。

  通过以上参数可以声明一个存储过程,示例代码如下所示。
+展开
-SQL
    CREATE PROCEDURE UpdatenewsInfo
    @ID int,
    @title nvarchar(50),
    @time datetime,
    @content ntext,
    AS
    UPDATE [newsInfo]
    Set NewsTitle=@title,NewsDatetime=@time
    where [ID]=@ID
    GO

  上述代码创建了一个名为“Updatenewsinfo”的存储过程,该存储过程作用是修改新闻表中的相应的字段的值。

2.触发器
  触发器实际上也是一种存储过程,不过触发器是一种特殊的存储过程,当使用UPDATE,INSERT或DELETE的一种或多种对指定的数据库的相关表进行操作时,会触发触发器。触发器的语法格式如下所示。
+展开
-SQL
    CREATE TRIGGER trigger_name 
    ON { table | view } 
     [ WITH ENCRYPTION ] 
    {
    { { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }
     [ WITH APPEND ]
     [ NOT FOR REPLICATION ]
    AS
     [ { IF UPDATE ( column )
     [ { AND | OR } UPDATE ( column ) ]
     [ ...n ]
    | IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
    { comparison_operator } column_bitmask [ ...n ]
    } ] 
    sql_statement [ ...n ] 
    } 
    }

其中,触发器的各个参数的使用如下所示。
1)trigger_name:是触发器的名称。触发器名称必须符合标识符规则,并且在数据库中必须惟一,开发人员可以选择是否指定触发器所有者名称。
2)Table | view:是在其上执行触发器的表或视图,有时称为触发器表或触发器视图,可以选择是否指定表或视图的所有者名称。
3)WITH ENCRYPTION:加密syscomments表中包含CREATE TRIGGER语句文本的条目。使用 WITH ENCRYPTION 可防止将触发器作为SQL Server复制的一部分发布。
4)AFTER:指定触发器只有在触发 SQL 语句中指定的所有操作都已成功执行后才激发,所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。
5)INSTEAD OF:指定执行触发器而不是执行触发 SQL 语句,从而替代触发语句的操作。
6){ [DELETE] [,] [INSERT] [,] [UPDATE] }:是指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字,必须至少指定一个选项。在触发器定义中允许使用以任意顺序组合的这些关键字。如果指定的选项多于一个,需用逗号分隔这些选项。
7)WITH APPEND:指定应该添加现有类型的其他触发器,只有当兼容级别是 65 或更低时,才需要使用该可选子句。
8)NOT FOR REPLICATION:表示当复制进程更改触发器所涉及的表时,不应执行该触发器。
9)AS:是触发器要执行的操作。
10)sql_statement:是触发器的条件和操作,触发器条件指定其他准则,以确定 DELETE、INSERT 或 UPDATE 语句是否导致执行触发器操作。

  触发器可以包含复杂的SQL语句,主要用于强制复杂的业务规则或要求。同时,触发器也能够维持数据库的完整性,当执行插入、更新或删除操作时,触发器会根据表与表之间的关系,强制保持其数据的完整性。

加支付宝好友偷能量挖...


评论(0)网络
阅读(86)喜欢(0)Asp.Net/C#/WCF