SQL Server 的管理套件(SSMS)是 SQL Server 的主管理控制台;
SSMS 中您可以创建数据库对象(如数据库,表,存储过程,视图等),在数据库中查看该数据,配置用户帐户,执行备份,复制,进行数据库之间的数据传输,等等;
SQL Server 管理套件的图形用户界面,做的最多的事情是 “点击”;
SSMS 使您能够运行 SQL 脚本接口,因此也有需要编程/脚本任务。许多任务可以通过 GUI 或 SQL 脚本来执行,所以你自己的选择使用哪一个。例如,您可以创建一个使用 GUI 或通过运行SQL 脚本的数据库。虽然如此,但你仍然需要 GUI 运行脚本。
在我们安装 SQL Server 的时候,会自动创建下面的四个数据库。
这些系统数据库有它们特有的用处,系统数据库是我们新建数据库的模板。
下述步骤将展示如何使用 SQL Server 管理套件在 SQL Server 2014 创建数据库。
新数据库显示
上面创建的新数据库会出现在对象资源管理器中的数据库部分。如下图所示:
新的数据库是基于模型数据库,该模型数据库是被用作每当创建一个新的数据库模板的系统数据库。
在左侧窗格中浏览数据库,并展开左侧列表,会看到数据库已经包含了许多对象,例如,它已经包含的系统功能,系统视图,存储系统过程,和(隐藏)系统表。这些都是提供有关数据库的信息系统对象。
其他选项
我们刚刚创建数据库的时候使用的是默认的选项。当创建的数据库,数据文件和一个事务日志中创建。他们在服务器的默认位置创建。
我们可以在创建数据库的时候给这些文件指定一个不同的位置,我们也可以改变其它的规范,比如是否允许将文件自动增长(如它存储越来越多的数据),如果是这样,增长应进行管理。
我们可以通过在数据库中右击选择属性来访问这些选项:
在属性对话框中有大量的可以更改数据库配置的选项。在左上面板点击各个项目,会显示各自的选择。
目前,我们不对这些配置进行更改,而是保留/使用一切的默认设置。
好了,到现在我们已经创建好了一个数据库,过程很简单是吧?但是唯一的不足就是它还只是一个空数据库,里面什么也没有,接下来,我们就要学习如何在一个空数据库中添加数据了。
我们依旧选择使用 SQL Server 管理套件(SSMS) 在 SQL Server 2014 数据库中创建一个表。
我们现在做的是创建的列名,指定可以输入数据类型,并设置默认值。限制每一列的数据类型是非常重要的,以帮助维护数据的完整性。例如,它可以防止我们意外输入任务名称到一个字段,用于存储当前日期。SQL Server 将阻止进入表,数据不会粘附到我们已经为每列设置的规则的数据。
新表显示
新建的表会出现在数据库表部分,如果它不能显示出来,请尝试刷新对象资源管理器。
您可以通过右键单击 onTables 并单击从上下文菜单刷新:
下图是显示了该表以及列文件夹扩展:
好了,这样就建立好一个数据库的表了。
以下是数据库添加数据的全部方法的大概介绍:
(1)手动输入数据
在数据库中选择“编辑前200行”选项,然后就可以手动直接输入数据到表行中了。
手动输入的数据是确定的,而且只能一点点输入,遇到大量的数据的时候,操作会变得很繁重,而且它不满足大多数业务的需求,而且不利于更新。
下面显示了如何手工直接输入数据到表:
需要注意的是在使用我们刚刚创建的表,我们并不需要输入数据到 TaskId 和 dateCreated 这两列。 这是因为他们将被自动填充(请记住,我们设置 TASKID 是唯一标识并且dateCreated 会以(GetDate()))填充。 无需为 StatusId 输入任何东西,因为我们还没有创建状态表,再加上我们的表设计使该字段为空(我们选择允许空值)。
(2)使用复制/粘贴功能
通过从另一数据源复制并粘贴到数据库表的方法也能添加数据库中的数据。
这将需要在源表具有相同的列的目标表。
类似于上面的手动方法中,这适合一个小数量的记录。
以下是具体的操作描述:
如果需要粘贴超过200行,单击显示 SQL 窗格图标,从工具栏中显示的 SQL 语句显示后面200行。
简单地根据需要将200改变为数量较多的行。
注意:在遇到多量数据的时候,这种方式可能要多次执行,或需要使用其他方法。
(3)直接导入
当然也可以从另一个数据源导入数据。
导入数据与复制/粘贴的方法相似,但是它更加灵活,可以更合适于许多场合。
例如,您可以选择从多个视图和表中的数据,可以写一个查询就可以导入需要的数据。
要导入数据,在数据库上单击鼠标右键,并选择 Tasks > Import Data... 并从那里按照向导执行操作。
在 SQL Server 中导入和导出向导数据,可以将数据复制到并从其中一个托管的 .NET Framework 数据提供程序或本机 OLE DB 提供程序可用的任何数据源。
这些包括:
您也可以从 Windows 开始菜单中启动 SQL Server 导入和导出向导,从内部 SQL Server 数据工具(SSDT),并通过在命令提示符(通过运行 DTSWizard.exe,你可能会找到在:C:Program FilesMicrosoft SQL Server100DTSBinn or inC:Program FilesMicrosoft SQL Server120DTSBinn 或其他位置,具体取决于您的配置和驱动器盘符)。
很多时候,使用包含需要插入数据的 SQL 脚本会更加有效。
您可以使用 SQL INSERT 语句插入指定数据。
SQL 脚本是静态插入/引用数据,它们可以存储并重新运行需要它的任何时间(例如在另一数据库)。脚本通常不进行数据的不断变化(如客户详细信息)那么好。你可能不会被保留过时的数据在一个副本的SQL脚本。但总有例外。例如,你可以使用这样一个脚本来填充客户表,用于测试/开发环境。
应用/网站
大多数的 SQL Server 数据库后端数据存储为一个前端应用程序。该应用程序的用户负责将数据添加到数据库(以编辑)。 因此,许多表中您的数据库将通过应用程序进行更新。在这种情况下,应用程序被更新是使用 SQL 脚本到数据库。
这些脚本和那些我们上面讨论的区别在于,在应用程序正在使用的脚本将是动态的。他们将接受数据作为传递给脚本的参数。因此,用户可以输入,电子邮件地址到应用程序中,但他并不知情在应用程序运行的 SQL 脚本,需要他的电子邮件地址,验证它,把它添加到脚本,如果通过了所有的业务/验证规则,最后将其插入到数据库中。
这些 SQL 脚本可以直接放置到您的网站的代码(PHP,ColdFusion的等),也可以将它们存储在数据库中的存储过程或视图。
利用 SQL 脚本我们能做很多事情,比如插入数据、读取数据、更新数据以及删除数据等;它们也可以用于创建数据库对象,如表,视图,存储过程,他们甚至可以用于创建整个数据库、数据、用户等。
什么是 Transact-SQL
SQL Server 支持 Transact-SQL 作为脚本语言。
Transact-SQL 是基于 SQL(结构化查询语言),它是用于应用程序和它们的数据库之间的接口的编程语言。
Transact-SQL 是一个相对容易的语言学习,这里提到的 SQL 脚本,意思就是一个 Transact-SQL 脚本。
SQL 语句
SQL 脚本通常由一个或多个“语句”得来的,每个语句告诉 SQL Server 该怎么做。
SQL 脚本可以包含许多语句。例如,SQL 脚本可以包含一个语句创建一个表,另一份声明将数据插入到该表,而另一份语句中,以选择所有刚刚插入到表中的数据。事实上,SQL 有用于确切操作的具体语句:CREATE语句,INSERT语句和SELECT语句。
SQL语句示例
最简单的 SQL 语句就是 SELECT 语句。
下述是一个SELECT语句最简单的例子:
SELECT * FROM Tasks
上述语句表示从任务表中选择所有列,其中(*)表示 “所有列”。
稍微修改上述语句就可以只返回一个特定的列。
我们添加一个 WHERE 子句来过滤数据,只选择我们想要的数据:
SELECT TaskName FROM Tasks
WHERE StatusId = "3"
上述语句从任务表 TaskName 中选择特定列,只返回那些具有 StatusId 为3的记录,值为3 的记录表示了具体的意思。在我们的 TaskTracker 数据库中,我们将创建一个新的表称为Status,我们将指定“3”是指什么。这些数字只是在 StatusId 字段中(我们指定为标识列 - 一个自动编号)的值。这些数字在 StatusName 字段每个相应值将告诉我们实际上是什么状态。
然后,一旦我们已经创建了状态表中,我们可以修改上面的SQL语句,以包括状态表,以便我们可以编写为WHERE StatusName=“To Do”,而不是试图记住“To Do”数字是什么。
使用SQL脚本创建表
下面使用SQL脚本在我们的数据库中新建一个名为 Status 的表。
在此脚本中,我们并不容许任何 NULL 字段(因此 NOT NULL 毗邻每一列)。
我们也将创建主键 StatusId 字段,我们设定的默认值的 dateCreated 字段,使用(getdate())。
请执行以下操作:
一旦脚本运行,你应该看到一条消息,读取命令已成功完成。
下面提供的是脚本:
CREATE TABLE Status(
StatusId int IDENTITY(1,1) NOT NULL,
StatusName varchar(50) NOT NULL,
DateCreated datetime NOT NULL CONSTRAINT DF_Status_DateCreated DEFAULT (getdate()),
CONSTRAINT PK_Status PRIMARY KEY CLUSTERED (StatusId)
)
键盘快捷键
注:也可以通过键盘上的 F5 键来运行一个查询。
另外,你甚至可以通过选择要运行的部分,然后按 F5 运行查询的一部分。
这包含大量的 SQL 语句的较大的脚本,但是,当由于某种原因,只要运行的一个或两个(或甚至运行所有这些,但只是一次一个)。
通过SQL脚本添加数据
通过 SQL 脚本添加数据将使用 INSERT 语句将数据插入到指定的表。
你可以使用脚本插入数据到所有列在表中,或者只是那些指定的表。
使用下面的脚本将数据插入 Status 表,然后选择该数据:
INSERT INTO Status (StatusName) VALUES ('To Do');
INSERT INTO Status (StatusName) VALUES ('In Progress');
INSERT INTO Status (StatusName) VALUES ('Done');
SELECT * FROM Status
这里是这个样子的:
正如你所看到的,查询的结果显示在底部窗格中。
交叉参考数据
现在,我们已经得到了 Status 表,让我们把值添加到任务表的 StatusId 字段中(还记得我们保留那个字段为空的所有记录,因为我们还没有Status表)。
所以我们增加值要将任务表链接到 Status 表。在任务表中的每个记录现在将有一个 StatusId,它的值可能是 1,2 或 3(在状态表的 StatusId 字段中匹配的值)。
现在,我们需要使用 UPDATE 语句(因为我们正在更新记录,而不是插入新的)。
运行下面的脚本:
UPDATE Tasks
SET StatusId='1'
WHERE TaskId='1';
UPDATE Tasks
SET StatusId='1'
WHERE TaskId='2';
UPDATE Tasks
SET StatusId='2'
WHERE TaskId='3';
UPDATE Tasks
SET StatusId='3'
WHERE TaskId='4';
UPDATE Tasks
SET StatusId='3'
WHERE TaskId='5';
UPDATE Tasks
SET StatusId='2'
WHERE TaskId='6';
UPDATE Tasks
SET StatusId='1'
WHERE TaskId='7';
SELECT * FROM Tasks
现在应该看到其 StatusId 字段中填写的所有记录您的任务表:
合并脚本
事实上,我们可能只是很容易地结合上述所有脚本并运行它们为一体。我只保留了它们,才能分离出来,使其更易于了解哪些部分做什么。
区分大小写
SQL 语句不区分大小写。
下面的语句都是执行同样的事情:
SELECT * FROM TASKS
SELECT * FROM Tasks
Select * From Tasks
select * from tasks
数据库管理
大多数的数据库管理任务(如创建用户,备份等),可以在 SSMS 通过图形用户界面进行编程,可以通过 SQL 脚本来执行。
本教程集中使用的图形用户界面,主要是因为它通常是一个更容易为新用户得到一个简单的入门。 当你更熟悉 SQL Server,就可以使用 SQL 脚本来执行许多任务,也可通过图形用户界面做自己的事情。
查询分析器是一个图形化的数据库编程接口,是SQL server 客户端的重要组成部分。在构建复杂的查询,涉及到许多表,视图等的时候,查询分析器特别有用。
查询设计器还可以有利于学习如何编写 SQL。通过查询设计器生成 SQL,可以学习 SQL,学习语法等。
查询分析器如何建立查询
使用查询设计器建立查询的具体操作如下:
当点击OK,会发现工作空间中已经添加了查询。然后,就可以像其他查询一样运行它:
从用户角度来看,一个视图是从一个特定的角度来查看数据库中的数据 。
从数据库系统内部来看,一个视图是由 SELECT 语句组成的查询定义的虚拟表(因为一个视图可以拉动多个表,并汇总数据在一起并将其显示,就好像它是一个单一的表)
视图是由一张或多张表中的数据组成的,当你运行视图,会看到它的结果,就像打开一个表时一样。
从数据库系统外部来看,视图就如同一张表一样,对表能够进行的一般操作都可以应用于视图,例如查询,插入,修改,删除操作等。
SQL Server视图的优点
视图可以执行以下操作:
SQL Server视图语法
通过使用 CREATE VIEW 语句创建一个视图,其次是 SELECT 语句,如下:
CREATE VIEW ViewName AS
SELECT ...
SQL Server创建视图
我们以前使用的查询设计器创建两个表中选择数据的查询。
现在让我们将查询保存为一个名为 “ToDoList” 的视图。
我们需要做的就是把 CREATE VIEW ToDoList 的 AS 查询,如下:
CREATE VIEW ToDoList AS
SELECT Tasks.TaskName, Tasks.Description
FROM Status INNER JOIN
Tasks ON Status.StatusId = Tasks.StatusId
WHERE (Status.StatusId = 1)
运行该脚本,在左窗格中刷新浏览文件夹,你会看到视图就在左窗格中:
SQL Server 运行视图
创建视图后,就可以简单地查看结果,就像你会选择任何表。
可以简单地键入 select * from todolist,它会运行完整的查询,而不是输入出大量的 SELECT 语句的 INNER JOIN :
注:也可以在视图上单击鼠标右键,并选择 "Select Top 1000 Rows".
数据更新
该视图将返回最新的数据。
如果表中的数据发生变化时,视图的结果会改变过;所以,如果要添加新任务以及状态 "To Do", 下一次运行来看,这将包括在结果集中的新纪录。
修改视图
通过使用 ALTER 修改现有的视图,而不是 CREATE。
如果我们想要更改视图就要使用 StatusName 字段,而不是 StatusId,做法如下:
ALTER VIEW ToDoList AS
SELECT Tasks.TaskName, Tasks.Description
FROM Status INNER JOIN
Tasks ON Status.StatusId = Tasks.StatusId
WHERE (Status.StatusName = 'To Do')
注:使用查询设计器也可以右键单击视图,然后选择设计来修改您的视图。
正如你所看到的,视图让您保存查询,以便可以做一个 SELECT,再次运行它也会比较简单。
但它们的确有其局限性:它们允许选择数据,但不允许执行任何业务逻辑,如条件语句等。
SQL Server 中视图通过简单的 SELECT 查询来解决复杂的查询,但是视图不能提供业务逻辑功能,而存储过程可以办到这点。
存储过程 Procedure 是一组为了完成特定功能的 SQL 语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。
存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。
由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中,所以存储过程运行要比单个的 SQL 语句块要快。同时由于在调用时只需用提供存储过程名和必要的参数信息,所以在一定程度上也可以减少网络流量、简单网络负担。
下面是一些在使用存储过程的主要优点:
好处 | 说明 |
---|---|
模块化编程 | 可以写一个存储过程一次,然后一次又一次地调用它,从应用程序的不同部分(甚至多个应用程序)。 |
性能 | 存储过程提供更快的代码执行和减少网络流量。
|
安全 | 用户无需执行任何直接的语句可以执行存储过程。因此,存储过程可以谁也不能正常访问这些任务的用户提供先进的数据库功能,但这种功能是在严格控制的方式提供。 |
我们需要使用 CREATE PROCEDURE 语句创建一个存储过程,接着要补充存储过程的代码,如果存储过程将要接受参数,它们需要被包括在名称后,如下:
CREATE PROCEDURE myStoredProcedure AS
...
OR
CREATE PROCEDURE myStoredProcedure @{Parameter Name} {data type} AS
...
下述代码创建了一个被称为 “LatestTasks” 的存储过程。
它接受一个参数名为 @Count. 当调用这个存储过程,通过 @count 参数,它决定你想要多少行返回。
代码如下:
CREATE PROCEDURE LatestTasks @Count int AS
SET ROWCOUNT @Count
SELECT TaskName AS LatestTasks, DateCreated
FROM Tasks
ORDER BY DateCreated DESC
在SQL Server管理套件运行这段代码,会看到它被在存储过程节点创建为 “LatestTasks”。
在SQL Server 2014,可以在存储过程节点/文件夹中创建通过右键单击一个存储过程,选择存储过程....这将打开一个模板,这是随时可以填入自己的具体程序。
创建了存储过程后,要在任何时候执行它,可以执行或者调用 EXEC。如果存储过程的参数要求提供这些程序名在后面,像这样:
EXECUTE LatestTasks
EXEC LatestTasks
EXEC LatestTasks @Count = 5
在下面的例子中,我们在同一时间执行两次存储过程。
我们第一次调用它的时候 @Count 传递值为 3,第二次传递的值为 5。
该截图显示,通过传递参数(和值),存储过程返回结果的基础上提供值。顶端结果集返回3行,因为我们通过值3。第二个结果集返回5行,因为我们提供一个值5:
还可以使用图形用户界面来执行存储过程。
具体方法如下:
SQL Server 修改存储过程
如果需要修改现有的存储过程,只需更换掉 CREATE ,使用 ALTER。
我们在 “Latest” 和 “Tasks”间添加一个空格(即“Latest Tasks”),并添加描述字段,如下:
ALTER PROCEDURE LatestTasks @Count int AS
SET ROWCOUNT @Count
SELECT TaskName AS "Latest Tasks", Description, DateCreated
FROM Tasks
ORDER BY DateCreated DESC
SQL Server 系统存储过程
SQL Server 包含了大量的系统存储过程,以帮助数据库管理任务。
通过 GUI 执行的任务可以通过系统存储过程来完成。
例如,有些东西可以用系统存储过程的包括:
SQL Server 命名约定
一起来看看扩展系统存储过程节点,我们发现,他们的名字都以 sp_ 开始,这样的命名表明它是一个存储过程。
该系统存储过程显然遵循的命名约定,在存储过程制定一个一致的命名约定是好的,但是每个人的命名习惯都有不同。
有些人前缀的存储过程 usp_,另外其他人使用 SQL 关键字,如 SELECT,INSERT,UPDATE,DELETE;也有人使用的缩写是一些下划线(例如,latest_tasks)。
因此,我们的存储过程可以被命名为以下任意一种,这取决于命名约定的使用。
不管选择哪一种,都要保持一致性,这样才会在需要使用存储过程时显得更加容易使用。
所以这是存储过程覆盖。
我们登录了一个 SQL Server 数据库后,必须分配登录的一个或多个服务器角色的选项。
注意:
SQL Server 查看服务器角色
要查看在 SQL Server 2014 管理 Studio 服务器角色,在对象资源管理器,展开安全文件夹:
SQL Server 2014 提供了九个固定服务器角色,被授予固定服务器角色的权限,不能更改。
九层固定服务器角色的说明
下面是安装过程中在 SQL Server 2014 中定义的服务器角色的解释:
服务器角色 | 描述 |
---|---|
sysadmin | 可以在SQL Server中执行任何活动。 |
serveradmin | 可以设置服务器范围的配置选项和关闭服务器。 |
setupadmin | 可以添加和使用Transact-SQL语句删除链接的服务器。 (使用SQL Server管理套件,当系统管理员成员需要。) |
securityadmin | 可以管理登录及其属性。他们可以GRANT, DENY和REVOKE服务器级别的权限。他们还可以GRANT, DENY和REVOKE数据库级别的权限,如果他们有机会获得一个数据库。 他们还可以重置SQL Server登录密码。 |
processadmin | 可以结束了在SQL Server实例中运行的进程。 |
dbcreator | 可以创建,修改,删除,并恢复所有数据库。 |
diskadmin | 可以管理磁盘文件。 |
bulkadmin | 可以执行BULK INSERT语句。 |
public | 每一个SQL Server登录属于公共服务器角色。当一个服务器主体没有被授予或拒绝对受保护对象的特定权限,用户继承对象授予public权限。只有当你想提供给所有用户对象上的任何对象分配公共权限。不能改变的成员在公共权限。 |
一些这些角色允许执行非常特定的任务。如果只有一个小团队,很可能只使用其中的一个角色(包括系统管理员)的两个。如果有一个大的团队,那么可以使用它们。
在 SQL Server 2014(和 SQL Server 2012),可以创建用户定义的服务器角色,并添加服务器级别的权限用户定义的服务器角色。
SQL Server 中的数据库模式可以帮助确定谁可以对数据库的对象进行访问,也可以作为命名空间,防止来自不同模式的对象名称发生冲突。
什么是数据库模式?
数据库模式是一种逻辑分组对象,如表,视图,存储过程等。
可以指定一个用户登录权限的单一模式,以便用户只能访问他们被授权访问的对象。
模式可以创建和改变在数据库中,并且用户可以被允许访问的模式; 一个模式可以被任何用户所拥有,并且架构所有权转让。
SQL Server 创建数据库模式
在 SQL Server 2014 创建数据库模式的方法如下:
SQL Sever 添加一个表的新模式
现在我们有一个新的模式,我们可以添加对象,如表、视图和存储过程。
例如,我们可以转移,在新的模式中创建一个或多个表。
当我们创建了一个表(称为“Tasks”),它在默认数据库模式(“dbo”)建立。
通过以下几点,将 “Tasks” 表转移到 “Maintenance” 模式:
你的表已经被转移到了 “Maintenance” 模式。
确认更改
确认更改:
SQL Server 中存在可以链接到其他服务器的选项,一般情况下是用来与别的 SQL Server 数据库相连接,但是有时候也可以与一个Microsoft Access数据库 相连接。这样的操作是通过链接服务器节点实现的。
链接服务器节点可以连接到另一个数据库,通常/通常在不同的机器上运行,也许在不同的城市/国家。如果您需要执行分布式查询(查询远程数据库),这可能是有用的。
设置链接服务器就是相当于使用简单的 SQL Server 管理套件,所有需要的就是查询远程服务器的详细信息,以及数据库。
SQL Server 创建链接服务器
创建链接的服务器:
现在应该看到新的链接服务器坐在对象资源管理器的链接服务器节点下。
分布式查询
链接服务器配置完成之后,我们就能够运行查询等操作了,但是当您运行链接服务器查询时,它会被称为分布式查询。
链接服务器的分布式查询必须包括每个数据源来查询一个完全合格的,由四部分组成的表名。
这四部分的名称的形式为:linked_server_name.catalog.schema.object_name.
如下述例子所示:
SELECT * FROM PAYROLL.Paywiz.dbo.Employees
这个例子是基于上面的链接服务器的例子。
它假定远程数据库有一个名为 “dbo” 模式和一个名为 “Employees” 的表。