结构化查询语言 Structured Query Language,简称SQL,含数据查询、数据定义、数据操纵、数据控制。
大型数据库: Sybase SQL Server Oracle DB2 MySQL
小型数据库: FoxPro Access SQLite
SQL的基本概念
SQL的主要特点
SQL语言是类似于英语的自然语言,简洁易用
SQL是一种一体化的语言
SQL语言是一种非过程化的语言
SQL语言是一种面向集合的语言
SQL语言既是自含式语言,又是嵌入式语言
SQL Server 2012 简介
SQL Server是一个支持关系模型的关系数据库管理系统
企业版(Enterprise Edition):可作为大型web站点服务器
标准版(Standard Edition) :适用于部门级等中小规模的应用(学习数据库时常使用此版本)
Web版(Web Edition) :面向Internet Web服务环境设计,成本低
开发者版(Developer Edition):拥有企业版的特性,但只限于在开发、测试和演示中使用
从逻辑上看:描述信息的数据存在数据库中并由DBMS统一管理
从物理上看:描述信息的数据是以文件的方式存储在物理磁盘上,由操作系统进行统一管理数据库的存储结构是指数据库文件在磁盘上如何存储。
在SQL Server 2012中,创建数据库时,会对应地在物理磁盘上创建相应的操作系统文件,数据库中的所有数据、对象和数据库操作日志都存储在这些文件中
数据库的结构——数据文件和事务日志文件
数据文件
存放数据库数据和数据库对象的文件
主要数据文件(.mdf ) +次要数据文件(.ndf ) (主要数据文件只有一个,次要数据文件可有多个)
事物日志文件
保存用于恢复数据库的日志信息,扩展名为.ldf
当数据库破坏时可以用事务日志还原数据库内容
文件组
文件组(File Group)是将多个数据文件集合起来形成的一个整体,(相当于文件夹)
主要文件组+次要文件组;
一个数据文件只能存在于一个文件组中,一个文件组也只能被一个数据库使用;
日志文件不分组,它不属于任何文件组。
“SQL Server 2012的系统数据库有master、model、msdb、tempdb和resource。
前4个数据库存储路径为:\Program Files\Microsoft SQL Server\MSSQL11.SQLSERVER\MSSQL\DATA\;
resource数据库是一个只读和隐藏的数据库,不显示在系统数据库列表中,它的物理文件名为mssqlsystemresource.mdf和mssqlsystemresource.ldf,存储路径为:\Program Files\Microsoft SQL Server\MSSQL11. SQLSERVER\MSSQL\Binn\。
SQL Server 2012提供了AdventureWorks示例数据库。
与SQL Server 2000等早期版本不同,SQL Server 2012默认并不安装示例数据库,需要手工下载安装。
SQL Server 2012联机丛书基本都以该数据库为例讲解,建议读者手工下载安装该示例数据库。
创建用户数据库有两种典型方法:一是通过Management Studio创建;二是通过SQL命令创建。
修改用户数据库有两种典型方法:一是通过Management Studio修改;二是通过SQL命令修改。
用 Management Studio修改数据库
在“对象资源管理器”窗口,右键单击要修改的数据库,从快捷菜单中选择“属性”命令,即可弹出数据库属性对话框。
“常规”选项卡包含数据库的状态、所有者、创建日期、大小、可用空间、用户数、备份和维护等信息。
“文件”选项卡
包含数据文件和日志文件的名称、存储位置、初始容量大小、文件增长和文件最大限制等信息。“文件组”选项卡
可以添加或删除文件组。但是,如果文件组中有文件则不能删除,必须先将文件移出文件组,才能删除文件组。
“选项”选项卡可以设置数据库的许多属性,如排序规则、恢复模式、兼容级别等。
更改跟踪”项卡 可以设定是否对数据库的修改进行跟踪。
“权限”选项卡可以设定用户或角色对此数据库的操作权限。
“扩展属性”选项卡可以设定表或列的扩展属性。在设计表或列时,通常通过表名或列名来表达含义,当表名或列名无法表达含义时,就需要使用扩展属性。
“镜像”选项卡可以设定是否对数据库启用镜像备份。镜像备份是一种高性能的备份方案,但需要投入一定的设备成本,一般用于高可靠性环境。
“事务日志传送”选项卡设定是否启用事务日志传送。事务日志传送备份是仅次于镜像的高可靠性备份方案,可以达到分钟级的灾难恢复能力,实施成本远小于镜像备份,是一种经济实用的备份方案。
用SQL命令修改数据库
可以使用ALTER DATABASE命令修改数据库。注意,只有数据库管理员 ( DBA ) 或者具有 CREATEDATABASE权限的人员才有权执行此命令。下面列出常用的修改数据库的SQL命令的语法格式:
ALTER DATABASE 数据库名称
ADD FILE(具体文件格式)
[,…n][TO FILEGROUP 文件组名]|ADD LOG FILE(具体文件格式)
[,…n]|REMOVE FILE 文件逻辑名称|MODIFY FILE(具体文件格式)|ADD FILEGROUP 文件组名
|REMOVE FILEGROUP 文件组名|MODIFY FILEGROUP 文件组名
{ READ_ONLY|READ_WRITE,| DEFAULT,| NAME = 新文件组名} }
其中,“具体文件格式”为:
( NAME = 文件逻辑名称[ , NEWNAME = 新文件逻辑名称][ , SIZE = 初始文件大小] [ , MAXSIZE = 文件最大容量] [ , FILEGROWTH = 文件自动增长容量] )
例子:
-----
删除用户数据库有两种典型方法:一是通过Management Studio删除;二是通过SQL命令删除。
查看数据库信息有两种典型方法:一是通过Management Studio查看;二是通过系统存储过程查看
当需要将数据库文件从一台电脑迁移到另外的电脑上时,介绍两种常用的迁移数据库的方法:一是分离和加载数据库;二是生成脚本
SQL使用数据定义语言(Data DefinitionLanguage,DDL)实现数据定义功能。
关系表中的每一列(即每个字段)都来自同一个域,属于同一种数据类型。
创建数据表之前,需要为表中的每一个属性设置一种数据类型。
整数型
按照取值范围从大到小,包括bigint、int、smallint、tinyint、bit。在实际应用中,可以根据属性的具体取值范围选择适合的整数型
数值型
包括精确数值型numeric、decimal和近似数值型float、real。 numeric与decimal在功能上等效,用于精确存储数值。 以numeric为例,格式为numeric(p,s),其中p表示数据长度,s表示小数位数。
例如,成绩的数据类型可以设置为numeric(4,1),表示数据长度为4,小数位为小数点后一位。 float和real用来存储数据的近似值,当数值的位数太多时,可用它们存取数值的近似值。
货币型
按 照 取 值 范 围 从 大 到 小 , 包 括 money 和smallmoney,它们可以精确到所代表的货币单位的万分之一,也就是小数点后面4位。通常情况下,货币型可以转换为精确数值型。
日期型
按照时间范围从大到小,包括datetime和
smalldatetime,可以精确到秒,smalldatetime
比datetime少占用4个字节。此外,还有一个
常用的日期型是date,这种数据类型只显示
日期,不显示时间。
字符型
包括char、varchar、nchar、nvarchar、text、ntext。其中,char、varchar存放非Unicode字 符(即ASCII字符),一个字符占1个字节,
char是定长的,varchar是非定长的。
例如, “学号(SNo)”可以设置为char(6),表示学号最多可以包含6个非Unicode字符,即使小于6个,在内存中也要分配6个字节的空间;如果设置为varchar(6),则学号实际包含多少非Unicode字符,在内存中就分配多少字节。
nchar、nvarchar存放Unicode字符,一个字符占2个字节,nchar是定长的,nvarchar是非定长的。nchar、nvarchar的用法与char、varchar相同,只是 占 用 内 存 空 间 不 同 。 例 如 , 如 果 “ 学 号(SNo)”设置为nchar(6),则学号占12个字节;如果设置为nvarchar(6),则学号根据实际长度分配字节。
当某个字符型属性需要描述的字符数比较多时,可以将其设置为text、ntext。其中,text存放非
Unicode字符,定长,最大可存储2GB;ntext存 放Unicode字符,非定长,最大可存储2GB。
二进制数据型
包括binary、varbinary、image。 binary是定长的二进制数据型,varbinary是非定长的二进制数据型,两者最多可以表示8000个字节。任何类型的数据都可存储在这种类型的字段中,不需数据转换。
image类型可以存储图片本身,这时需要事先将图片转换成二进制流的形式,也可以存储图片路径。
特殊类型
包括timestamp 、uniqueidentifier、sql_variant、table。
timestamp数据类型提供数据库范围内的唯一值。此类型相当于binary(8)或varbinary(8),但当它所定义的列更新或添加数据行时,此列的值会被自动更新 , 一 个 计 数 值 将 自 动 地 添 加 到 此timestamp数据列中。每个数据库表中只能有一个timestamp数据列。
uniqueidentifier数据类型称为全球唯一标识符(Globally Unique Identifier,GUID ),可用NEWID( )函数产生。
sql_variant数据类型可以存储除文本、图形数据和timestamp类型数据外的其他任何合法的SQL Server数据,此数据类型大大方便了SQL Server的开发工作。
table数据类型用于存储对表或视图处理后的结果集,这一类型使得变量可以存储一个表,从而使函数或过程返回查询结果更加方便、快捷。
创建数据表有两种典型方法:一是通过Management Studio创建;二是通过SQL命令创建
右键单击“对象资源管理器”中“数据库”节点下的“表”节点,从快捷菜单中选择“新建表”命令,会弹出定义数据表结构对话框。 其中,每一行用于定义数据表的一个字段,包括字段名、数据类型、长度、字段是否为NULL以及默认值等。
“列名”(即表中某个字段名)由用户命名,最长128字 符,可包含中文、英文、下划线、#号、货币符号(¥) 及@符号。同一表中不允许有重名的列。 “数据类型”,定义字段可存放数据的类型。 “允许空”,当对某个字段的“允许空”列上打勾时,
表示该字段的值允许为NULL值。这样,在向数据表中
输入数据时,如果没有给该字段输入数据,系统将自动
取NULL值,否则,必须给该字段提供数据。 “默认值”,表示该字段的默认值(即DEFAULT值)。
如果规定了默认值,在向数据表中输入数据时,如果没
有给该字段输入数据,系统自动将默认值写入该字段。
在SQL Server中,对于数据表的约束分为列约束和表约束。
列约束是对某一个特定列的约束,包含在列定义中,直接跟在该列的其他定义之后,用空格分隔,不必指定列名。
表约束与列定义相互独立,不包括在列定义中,通常用于对多个列一起进行约束,与列定义用“,”分隔,定义表约束时必须指出要约束的列的名称。
用Management Studio修改数据表的结构
在Management Studio中的“对象资源管理器”窗口中,展开“数据库”节点。
右键单击要修改的数据表,从快捷菜单中选择“设计”命令,则会弹出修改数据表结构对话框。可以在此对话框中修改列的数据类型、名称等属性,添加或删除列,也可以指定表的主关键字约束。
修改完毕后,单击工具栏中的保存按钮,存盘退出。
[例] 在S表中增加一个班号列和住址列。
ALTER TABLE S
ADD
Class_No VARCHAR(6),
Address NVARCHAR(20)
使用此方式增加的新列自动填充NULL值,所以不能
为增加的新列指定NOT NULL约束。
[例] 在SC表中增加完整性约束定义,使
Score在0~100之间。
ALTER TABLE SC
ADD
CONSTRAINT Score_Chk CHECK(Score
BETWEEN 0 AND 100)
[例] 把S表中的SN列加宽到12个字符。
ALTER TABLE S
ALTER COLUMN
SN NVARCHAR(12)
不能改变列名;
不能将含有空值的列的定义修改为NOT NULL约束;
若列中已有数据,则不能减少该列的宽度,也不能
改变其数据类型;
只能修改NULL/NOT NULL约束,其他类型的约束
在修改之前必须先将约束删除,然后再重新添加修
改过的约束定义。
[例] 删除S表中的主键。
ALTER TABLE S
DROP CONSTRAINT S_Prim
当某个基本表已不再使用时,可将其删除。
删除后,表中的数据和所建的索引都被删除,建立在该表上的视图不会删除,系统将继续保留其定义,但已无法使用。
如果重新恢复该表,这些视图可重新使用。
用Management Studio删除数据表
在Management Studio中,右键单击要删除的表,从快捷菜单中选择“删除”命令,会弹出“删除对象”对话框。
单击“显示依赖关系”按钮,即会弹出“依赖关系”对话框,其中列出了表所依靠的对象和依赖于表的对象,当有对象依赖于表时不能删除表。
DROP TABLE <表名>
只能删除自己建立的表,不能删
除其他用户所建的表
查看数据表的属性
在Management Studio的“对象资源管理器”中展开“数据库”节点,选中相应的数据库,从中找到要查看的数据表。
右键单击该表,从快捷菜单中选择“属 性”菜单项,则会弹出“表属性”对话框,从中可以看到表的详细属性信息,如表名、所有者、创建日期、文件组、记录行数、数据表中的字段名称、结构和类型等。
查看数据表中的数据
在Management Studio的“对象资源管理器”中,用右键单击要查看数据的表,从快捷菜单中选择“选择前1000行(W)”命令,则会显示表中的前1000条数据。
无条件查询是指只包含“SELECT…FROM”的查询,这种查询最简单,相当于只对关系(表)进行投影操作。
[例] 查询全体学生的学号、姓名和年龄。
SELECT SNo, SN, Age
FROM S
在菜单栏下方的快捷工具中,单击“新建查询”,会弹出查询窗口(即对象资源管理器右侧的窗口)。
当要在表中找出满足某些条件的行时,则需使用WHERE子句指定查询条件。WHERE子句中,条件通常通过三部分来描述。
(1)列名 (2)比较运算符 (3)列名、常数
常用的比较运算符如下表所示:
SQL提供了许多库函数,增强了基本检索能力。常用的库函数如下表所示。
COUNT(*)用来统计元组的个数,不消除重复行 ,不允许使用DISTINCT关键字。
GROUP BY子句可以将查询结果按属性列或属性列组合在行的方向上进行分组,每组在属性列或属性列组合上具有相同的值。
若在分组后还要按照一定的条件进行筛选,则需使用HAVING子句
当需要对查询结果排序时,应该使用ORDER BY子句,ORDER BY子句必须出现在其他子句之后。排序方式可以指定,DESC为降序,ASC为升序,缺省时为升序。
当查询同时涉及两个及两个以上的表时,称为连接查询。
连接查询实际上是通过各个表之间共同字段的关联性来查询数据的,这种字段称为连接字段。
表的连接方法有以下两种 :
[例] 查询“刘伟”老师所讲授的课程,要求列出教师号、教师姓名和课程号。
方法1
SELECT T.TNo,TN,CNo
FROM T,TC
WHERE (T.TNo = TC.TNo) AND (TN=‘刘伟’)
这里TN='刘伟’为查询条件,而T.TNo = TC.TNo为连接条件,TNo为连接字段。
方法2
SELECT T.TNo, TN, CNo
FROM T INNER JOIN TC
ON T.TNo = TC.TNo
WHERE (TN = ‘刘伟’)
[例] 查询所有选课学生的学号、姓名、选课名称及成绩。
SELECT S.SNo,SN,CN,Score
FROM S,C,SC
WHERE S.SNo=SC.SNo AND SC.CNo=C.CNo
符合连接条件的数据将直接返回到结果集中,对那些不符合连接条件的列,将被填上NULL值后再返回到结果集中。
外部连接分为左外部连接和右外部连接两种。以主表所在的方向区分外部连接,主表在左边,则称为左外部连接;主表在右边,则称为右外部连接。
[例] 查询所有学生的学号、姓名、选课名称及成绩(没有选课的同学的选课信息显示为空)
SELECT S.SNo,SN,CN,Score
FROM S
LEFT OUTER JOIN SC
ON S.SNo=SC.SNo
LEFT OUTER JOIN C
ON C.CNo=SC.CNo
交叉查询(CROSS JOIN)对连接查询的表没有特殊的要求,任何表都可以进行交叉查询操作。
[例] 对学生表S和课程表C进行交叉查询。
SELECT *
FROM S CROSS JOIN C
[例] 查询所有比“刘伟”工资高的教师姓名、工资和刘伟的工资
方法1:
SELECT X.TN,X.Sal AS
Sal_a,Y.Sal AS Sal_b
FROM T AS X ,T AS Y
WHERE X.Sal>Y.Sal
AND Y.TN=‘刘伟’
方法2:
SELECT X.TN, X.Sal,Y.Sal
FROM T AS X INNER JOIN
T AS Y
ON X.Sal>Y.Sal
AND Y.TN=‘刘伟’
相关子查询的执行顺序是:
(1)选取父查询表中的第一行记录,内部的子查询利用此行中相关的属性值进行查询;
(2)父查询根据子查询返回的结果判断此行是否满足查询条件。如果满足条件,则把该行放入父查询的查询结果集合中。
(3)重复执行这一过程,直到处理完父查询表中的每一行数据。
使用EXISTS
带有EXISTS的子查询不返回任何实际数据,它只得到逻辑值“真”或“假” 。当子查询的查询结果为非空时,外层的WHERE子句返回真值,否则返回假值。
NOT EXISTS与此相反。
[例] 用含有EXISTS的语句查询讲授课程号为C5的教师姓名。
SELECT TN
FROM T
WHERE EXISTS ( SELECT *
FROM TC
WHERE TNo = T.TNo AND CNo = ‘C5’)
合并查询是使用UNION操作符将来自不同查询的数据组合起来,形成一个具有综合信息的查询结果,UNION操作会自动将重复的数据行剔除。
参加合并查询的各个子查询使用的表结构应该相同,即各个子查询中的字段数目和对应的数据类型都必须相同。
[例] 从SC数据表中查询出学号为“S1”同学的学号和总分,再从SC数据表中查询出学号为“S5”的同学的学号和总分,然后将两个查询结果合并成一个结果集。
SELECT SNo AS 学号, SUM(Score) AS 总分
FROM SC
WHERE (SNo = ‘S1’)
GROUP BY SNo
UNION
SELECT SNo AS 学号, SUM(Score) AS 总分
FROM SC
WHERE (SNo = ‘S5’)
GROUP BY SNo
使用SELECT…INTO 语句可以将查询结果存储到一个新建的数据库表或临时表中。
[例]从SC数据表中查询出所有同学的学号和总分,并将查询结果存放到一个新的数据表Cal_Table中。
SELECT SNo AS 学号, SUM(Score) AS 总分
INTO Cal_Table
FROM SC
GROUP BY SNo
UPDATE
UPDATE <表名>
SET <列名>=<表达式> [,<列名>=<表达式>]…
[WHERE <条件>]
DELETE
FROM<表名>
[WHERE <条件>]
视图是一个虚拟表,其内容由查询定义。
同基本表一样,视图包含一系列带有名称的列和行数据。
行和列数据来自定义视图的查询所引用的基本表,并且在引用视图时动态生成。
用SQL命令创建视图
CREATE VIEW view_name [ (column [ ,…n ] ) ] AS select_statement
[例] 创建一个计算机系教师情况的视图Sub_T。
CREATE VIEW Sub_T
AS SELECT TNo, TN, Prof
FROM T
WHERE Dept = ‘计算机’
[例] 创建一学生情况视图S_SC_C(包括学号、姓名、课程名及成绩)。
CREATE VIEW S_SC_C(SNo, SN, CN, Score)
AS SELECT S.SNo, SN, CN, Score
FROM S, C, SC
WHERE S.SNo = SC.SNo AND SC.CNo = C.CNo
[例] 创建一学生平均成绩视图S_Avg。
CREATE VIEW S_Avg(SNo, Avg)
AS SELECT SNo, Avg(Score)
FROM SC
GROUP BY SNo
用SQL命令修改视图
ALTER VIEW <视图名>[(<视图列表>)] AS <子查询> [例] 修改学生情况视图S_SC_C(包括姓名、课程名及成绩)。
ALTER VIEW S_SC_C(SN, CN, Score)
AS SELECT SN, CN, Score
FROM S, C, SC
WHERE S.SNo = SC.SNo AND SC.CNo =C.CNo
用SQL命令删除视图 DROP VIEW <视图名>
[例] 删除计算机系教师情况的视图Sub_T。
DROP VIEW Sub_T
修改索引的SQL命令语法如下:
ALTER INDEX { index_name | ALL }
ON table_or_view_name
{ REBUILD
[ [PARTITION = ALL]
[ WITH (
| [ PARTITION = partition_number
[ WITH (
| DISABLE
| REORGANIZE
[ PARTITION = partition_number ]
[ WITH ( LOB_COMPACTION = { ON | OFF } ) ]
| SET (
修改索引的参数介绍:
(1)REBUILD:删除索引并且重新生成索引。
(2)PARTITION:指定只重新生成或重新组织索引的一个分区。
(3)DISABLE:将索引标记为禁用,从而不能由数据库引擎使用。
(4)REORGANIZE:重新组织索引。
用SQL语句删除索引
DROP INDEX
用Sp_helpindex存储过程查看索引
Sp_helpindex [@objname =] ‘name’ ,其中[@objname =] 'name’为 表的名称
[例] 查看表SC的索引。
EXEC Sp_helpindex SC
如果要更改索引名称,可利用Sp_rename存储过程更改,其语法如下:
Sp_rename ‘数据表名.原索引名’, ‘新索引名’ [例] 更改T表中的索引TI名称为T_Index。
EXEC Sp_rename ‘T.TI’, ‘T_Index’