如果需要在项目中处理大量的数据,数据库是不二之选,本课将了解SQL Server数据库的基本应用,下一课将讨论如何在C#代码中操作SQL Server数据库。

学习或轻量级应用中,可以使用SQL Server Express,这是一个免费版本。此外,为操作方便,大家还需要一个图形化的管理工具,这里当然是使用SSMS(Microsoft SQL Server Management Studio),此工具同样可以从微软网站免费下载使用。

安装SQL Server Express时,有几点需要注意,以防下一课测试时无法连接到数据库。第一,在实例配置中需要记得“实例 ID”,如下图所示。

enter image description here

第二,需要配置超级管理员sa的密码,如下图所示。请注意,这里只是在自己的计算机测试时使用,实际工作中是不应该直接使用sa用户的,而是根据需要合理创建用户并以最小化原则分配权限。

enter image description here

SQL Server Express和SSMS安装成功后,可以测试一下数据的连接,打开SSMS,如下图所示。

enter image description here

这里,选择“Windows 身份验证”,单击“连接”,如果能成功连接,如会在左侧的“对象资源管理器”中看到连接的实例,如下图所示。

enter image description here

现在,数据库环境已经准备好了,接下来,再了解一些关于数据库操作的基本概念。首先,SQL Server属于关系型数据库,特点是,数据都以二维表的形式保存和处理,如果大家不熟悉二维表,可以打开Excel或WPS表格熟悉一下,如下图所示。

enter image description here

这里分为列(Column)和行(Row)。其中,列又称为字段(Field),定义了每行数据中每一个数据的名称、类型等信息,如图中的UserID、UserName、UserPwd、IsLocked、CreationTime。行则是表中真正的数据,每一行称为一条记录(Record),上图中共包含了3行记录。

操作数据库时,我们会使用SQL(结构化查询语句,Structured Query Language)。现在,我们打开SSMS,并连接到数据库实例;然后,新建一个查询,如下图所示。

enter image description here

然后,我们输入如下内容。

create database Cdb_Test;
go

use Cdb_Test;
go

create table UserMain(
    UserId bigint identity(1,1) not null,
    UserName nvarchar(50) not null unique,
    UserPwd nvarchar(50) not null,
    IsLocked int not null default(0),
    CreationTime datetime,
    primary key (UserID)
);

按键盘F5键执行此代码,我们可以在数据,如下图所示。

enter image description here

代码中,首先使用create database语句创建了Cdb_Test数据库,然后,使用use语句引用它,这样,接下来的操作就会默认在Cdb_Test数据库中进行。

create table语句用于创建数据表,其中定义了几个字段,分别是:

  • UserID,定义为bigint类型,即64位整数,并指定为自动管理的ID数据,设置为从1开始,每次自动加1。not null指定数据不能为空值(NULL)。在操作数据时,不需要人工管理,此字段数据可以自动生成。
  • UserName,定义为nvarchar(50)类型,指定可以最多保存50个Unicode字符。unique关键字指定字段的数据不能重复。
  • UserPwd,同样定义为可以保存50个Unicode字符。
  • IsLocked,定义为int类型,即32位整数。default(0)指定字段默认值为0,即没有指定数据时,字段数据就是0。
  • CreationTime,定义为datetime类型,即用于保存日期和时间的类型。这里没有指定not null,表示如果没有指定字段数据,其数据为空值(null);请注意,这里的空值是指没有数据,注意区别C#中的null,它表示为对象的空引用。

最后,我们使用primary key语句定义了表的主键,即以UserID字段作为表的主键,主键字段会作为记录的唯一标识数据。

添加数据

接下来,我们就来操作UserMain表中的数据。首先,新建查询,并执行如下代码。

use Cdb_Test;
go

insert into UserMain(UserName,UserPwd)
values('Tom','123456');

insert into UserMain(UserName,UserPwd,IsLocked)
values('Jerry','123456',1);

insert into UserMain(UserName,UserPwd,CreationTime)
values('John','123456','2018-11-7 15:51:45');

如果代码执行成功,就会向UserMain表中添加三条记录,使用下面的语句可以查看添加的数据。

use Cdb_Test;
go

select * from UserMain;

代码执行结果如下图所示。

enter image description here

向数据表添加记录时,我们使用insert into语句,其格式如下。

insert into <表名> (<字段1>,<字段2>,<字段3>,...) 
values(<值1>,<值2>,<值3>,...);

这里应注意字段和值的一一对应关系。此外,如果字段名中包含特殊字符,可以使用一对方括号定义,如[UserName]。指定字段值时,数值类可以书写,而文本和日期类则需要使用一对单引号定义。

常用数据类型

下面,我们了解一些在SQL Server中常用的数据类型:

  • int类型,32位整数,对应C#中的int类型。
  • bigint类型,64位整数,对应C#中的long类型。
  • nvarchar(n)类型,处理Unicode编码的可变长度字符串,n指定最大的字符数量,如果定义为最大字符数,可以定义为nvarchar(max)。
  • nchar(n)类型,处理Unicode编码的定长字符串,n指定字符数。
  • datetime类型,日期和时间类型,一般可以使用标准的格式,如'YYYY-MM-DD hh:mm:ss'。
  • decimal(m,n)类型,定义实数类型,m指定整数和小数部分共有几位,n指定小数位,如decimal(5,2)可以保存123.45格式的数据。

查询数据

前面,我们已经使用select语句进行数据的查询的操作,下面了解一些常用的数据查询语法;首先,使用select语句从数据表中执行查询的一般格式如下。

select <字段> from <表> where <条件>;

其中:

  • select、from和where为SQL关键字。
  • <字段>指定返回数据的字段列表,每个字段使用逗号分隔,返回表中所有字段时,可以使用*通配符。
  • <表>指定数据表的名称。
  • where <条件>为可选,用于指定查询条件,如果返回所有记录,则不需要使用where子句。

下面着重了解<条件>的设置,常用的条件类型有:

  • =,等于。
  • <>,不等于。
  • >,大于。
  • >=,大于等于。
  • <,小于。
  • <=,小于等于。
  • like,字符串模糊查询,可以使用%符号匹配0到多个字符,也可以使用_(下画线)匹配一个字符,如UserName like 'J%'就是查询UserName数据中使用J开头的记录。
  • between,指定一个范围,如Age between 1 and 10就是匹配Age数据从1到10的记录。
  • in,指定一个值列表,如UserName in ('Tom','Jerry')就是查询UserName等于Tom和Jerry的记录。
  • is null,查询字段数据为空的记录,如CreationTime is null。
  • is not null,查询字段数据不为空的记录,如CreationTime is not null。

下面的代码,我们查询UserName以J开头的记录。

use Cdb_Test;
go

select * from UserMain where UserName like 'J%';

代码执行结果如下图所示。

enter image description here

下面的代码查询CreationTime为空的记录。

use Cdb_Test;
go

select * from UserMain where CreationTime is null;

代码执行结果如下图所示。

enter image description here

更多的条件设置,大家可以自己动手测试。

更新数据

更新数据表的语法如下:

update <表名> set <字段与数据列表> where <条件>;

这里,<表名>和<条件>相信大家已经不陌生了,而<字段与数据列表>则是设置新数据的列表,每个新字段和数据使用逗号分隔,如UserName = 'Tom',IsLocked = 0。

请注意,使用没有条件的update语句是很危险的,它会更新表中所有记录的数据!!!

下面的代码,将UserName为Jerry的记录中的IsLocked设置为0。

use Cdb_Test;
go

update UserMain set IsLocked=0 where UserName = 'Jerry';

执行代码后,我们使用"select * from UserMain;"语句就可以看到数据的变化,如下图所示。

enter image description here

删除数据和清空数据表

删除数据表中的记录时,使用如下语法。

delete from <表名> where <条件>;

请注意,没有条件的删除操作也是非常危险的!!!

如果真的需要清空数据表的内容,可以使用如下语句。

truncate table <表名>;

执行此语句后,数据表会被重置,就像刚刚创建那样,Identity字段的值也会从初始值开始重新计数。

高级查询

排序,可以使用order by子句,如下面的代码会按用户名(UserName)升序排序记录。

use Cdb_Test;
go

select * from UserMain order by UserName asc;

执行结果如下图所示。

enter image description here

实际上,语句中的asc关键字是可以省略的,因为排序的默认方式就是升序,如果需要降序排列,可以使用desc关键字。排序时,还可以指定多个字段,当第一个字段的数据相同时,就会按第二个字段进行排序,以此类推。

分组统计,如下面的代码,我们将统计CreationTime字段的每种数据各有多少个。

use Cdb_Test;
go

select CreationTime,count(CreationTime) from UserMain group by CreationTime;

代码执行结果如下图所示。

enter image description here

除了在select关键字后使用count()计数函数,还可以使用以下一些函数进行简单的计算工作:

  • min()函数,求指定字段数据中的最小值。
  • max()函数,求指定字段数据中的最大值。
  • sum()函数,求指定字段数据的和。
  • avg()函数,求指定字段数据的平均值。

当查询结果只需要返回一定数量的记录时,可以在select关键字后,字段列表前使用top n子句,其中n指定返回的记录数量,如“select top 2 * from UserMain;”;此外,在SQL Server中,还可以使用top(n)格式。

当查询结果中有完全重复的记录时,可以在select关键字后使用distinct子句过滤,如“select distinct CreationTime from UserMain;”。

更多内容

一篇文章能学会SQL Server数据库??我也不相信哦!以上内容只是简单地了解了如何操作数据表中的数据,而像SQL Server这样的大型数据库系统,功能是非常强大的,应用和学习也是一个长期的过程;在学习和工作中,可以根据需要选择一些知识点逐步学习和应用,下面,介绍一些在C#应用开发中可能需要关注的知识点,大家可以参考学习。

视图(View),简单的理解就是定义了查询模板。请注意,视图并不是真的保存数据,从视图中查询数据时,会先生成视图数据集合,然后再从这个集合中进行查询操作。

存储过程(SP,Stored Procedure),相当于功能封装代码,并可以带入参数,就像C#中的方法。对于经常操作的查询,可以定义为存储过程,以简化功能的实现。

事务(Transaction),相当于一组任务的集合,但其特点是,这些任务要不全部完成,要不什么都不做。如银行的转账操作,从A账户向B账户转账,就必须从A账户扣款,并在B账户添加相应的金额,两项任务都成功执行时,转账才算真的完成。

下一课将讨论如何在C#代码中操作SQL Server数据库。

CHY软件小屋原创作品!