SQL Server

1.数据库基础

1.1创建数据库
语法:

CREATE DATABASE database_name
[ON
{ [PRIMARY] 
(NAME=逻辑文件名,FILENAME=物理文件名)
[,SIZE=大小]
[,MASIZE={最大容量 |UNLIMITED }]
[,FILEGROWTH=增长量]
}[,...n]
]
[LOG ON
{ (NAME=逻辑文件名,FILENAME=物理文件名
[,SIZE=大小]
[,MASIZE={最大容量 |UNLIMITED }]
[,FILEGROWTH=增长量])
} [,...n]
]

eg:

CREATE DATABASE DB 
ON PRIMARY  
(  
NAME = DB_data,  
FILENAME = 'F:\DB_data1.mdf',   
SIZE = 10MB,  
MAXSIZE = UNLIMTED  
),  
FILEGROUP TESE1
(  
NAME = DB_data2,  
FILENAME = 'F:\DB_data2.ndf',   
SIZE = 11MB,  
MAXSIZE = 20MB,   
FILEGROWTH = 2MB  
)  
LOG ON  
(  
NAME = DB_log1,  
FILENAME = 'F:\DB_log1.ldf',   
SIZE = 1MB,  
MAXSIZE = 30MB,  
FILEGROWTH = 10%  
) 

1.2 修改数据库
语法:

ALTER DATABASE database_name
{       ADD FILE[,...n][TO FILEGROUP filegroup_name]
/*在文件组中增加数据文件*/
| ADD LOG FILE [,...n]  /*增加日志文件*/
| REMOVE FILE logical_file_name  /*删除数据文件*/
| ADD FILEGROUP filegroup_name /*增加文件组*/
| REMOVE FILEGROUP filegroup_name  /*删除文件组*/
| MODIFY FILE /*更改文件属性*/
| MODIFY NAME=new_dbname  /*数据库更名*/
| MODIFY FILEGROUP filegroup_name {filegroup_property | NAME=new_filegroup_name}
| SET [,...n][WITH]/*设置数据库属性*/
| COLLATE   /*指定数据库排序规则*/
}

ADD FILE 子句:向数据库添加数据文件
ADD LOG FILE 子句:向数据库添加日志文件
REMOVE FILE 子句:删除数据文件
ADD FILEGROUP 子句:添加文件组
REMOVE FILEGROUP 子句:删除文件组
MODIRY FILE 子句:修改数据文件的属性
MODIFY NAME 子句:更改数据文件的属性
MODIFY FILEGROUP 子句:修改文件组的属性
SET 子句:设置数据库的属性

ALTER DATABASE DB
MODIFY FILE
(  
    NAME = DB_DATA,   
    FILEGROWTH =5MB ,  
    MAXSIZE =100MB   
)  
ALTER DATABASE DB  
   ADD FILEGROUP FGROUP
GO
ALTER DATABASE TEST1    
ADD FILE   
(  
    NAME = ,  
    FILENAME = ,  
    SIZE = ,  
    FILEGROWTH =   
)
alter database db1  
modify name = gl
ALTER DATABASE TEST1
   REMOVE FILE TEST1BAK
GO

1.3 删除数据库
语法:

DROP DATABASE database_name[,...n][;]

eg:

DROP DATABASE DB
GO

2.表与表数据操作

2.1创建表
语法:

CREATE TABLE [database_name.[schema_name].|schema_name.] table_name
(
{   /*列的定义*/
| column_name AS computed_columne_expression[PERSISTED[NOT NULL]]    /*定义计算列*/
}
[][,...n]  /*指定表的约束*/
)
[ON {partition_scheme_name} (partition_column_name) | filegroup | "default"} ]
[{ TEXTIMAGE_ON {filegroup |"default"}}]/*指定存储text.ntext和image类型数据的文件组*/
[;]
  ::=
column_name data_type   /*指定列名,类型*/
[COLLATE collation_name]    /*指定排序规则*/
[NULL | NOT NULL]       /*指定是否为空*/
[
[CONSTRAINT constraint_name]
[DEFAULT constant_expression]   /*指定默认值*/
| [IDENTITY [ (seed,increment)][NOT FOR REPLICATION]] /*指定列为标识列*/]
[ROWGUIDCOL]   /*指定列为全绝标识符列*/
[[...n]]  /*指定列的约束*/
USE  PXSCJ
GO 
CREATE TABLE XSB
(
    StudentID char(6) PRIMARY KEY,
    Sname char(8) NOT NULL,
    Speciality char(10),
    Sex char(5),
    Birthday datatime NOT NULL,
    Total int NOT NULL,
    Grade real NOT NULL,
    Avggrade AD Grade/Num PERSIDTED,/*平均成绩*/
    Remark text NULL
)
GO

2.2修改表

ALTER TABLE[database_name.[schema_name].|schema_name.]
table_name
 { [ ALTER COLUMN column_name    /*修改已有列的属性*/
    { new data type [ ( precision [,scale ] ) ]
    [COLLATE]
    [NULL | NOT NULL]
    | {ADD | DROP}[ROWGUIDCOL |PERSISTED]
 }
 ]
 | [WITH {CHECK | NOCHECK}] ADD  /*添加列*/
 {
 < column_definition>
 | column_name AS computed_column_expression [PERSISTED [NOT NULL] |]
 }[,...n]
| DROP            /*删除列*/
{
[ CONSTRAINT ] constraint_name [WITH ([,...n])]
| COLUMN column_name
}[,...n]
|[WITH {CHECK |NOCHECK}]{CHECK |NOCHECK}CONSTRAINT
    {ALL | constraint_name[,...n]}
|{ENABLE | DISABLE} TRIGGER
    {ALL | trigger_name[,...n]}
|SWITCH[PARTITION source_partition_number_expression]
    TO[schema_name.]target_table
    [PARTITION target_partition_number_expression]

ALTER COLUMN:修改表中列的属性
NULLL | NOT NULL:是否将列设置为空
ADD:向表中增加新列
[WITH{CHECK | NOCHECK}]:指定表中的数据是否用新添加的或重新启用的FOREIGN KEY或CHECK约束进行验证
DROP:从表中删除列或约束
{ENABLE | DISABLE}TRIGGER:启用或禁用触发器
SWITCH:用于切换分区

USE PXSCJ
GO 
ALTER TABLE XSB
   ADD Address varchar(50) NULL
GO
USE PXSCJ
GO 
ALTER TABLE XSB
   ALTER COLUMN Sname char(10)
GO
ALTER TABLE XSB
   ALTER COLUMN Birthday smalldatetime 

2.3删除表
语法:

DROP TABLE table_name
USE PXSCJ
GO
DROP TABLE XSB
GO

2.4插入记录

[WITH ][,...]] /*指定临时结果集*/
INSERT [TOP (expression)[PERCENT]]
[INTO]
{
table_name   
|view_name    
|rowset_function_limited    /*可以是OPENQUERY或OPENROWSET函数*/
[WITH(table_hint_limited))[,...n]]   /*指定表提示,可省略*/
}
{[column_list]    /*列列名*/
[<OUTPUT Clause>]   /*OUTPUT子句*/
{VALUES  /*指定列值的子句*/
({DEFAULT | NULL |expression}[,...n])  /*列值的构成形式*/
|derived_table   /*结果集*/
|exectute_statement}   /*有效的EXECTUTE语句*/
}
|DEFAULT VALUES  /*所有列均取默认值*/
INSERT INTO Student(SNO,SNAME,SAGE,SDEPT) VALUES ('132','ZHANGSAN',23,'ASD')  
INSERT INTO Student VALUES ('1234','ZHANGSAN','143','MAN',22,'YI',)  

2.5删除记录

[WITH ][,...]] 
DELETE [TOP (expression)[PERCENT]]
[FROM]
{
table_name   /*从表中删除数据*/
|view_name    
|rowset_function_limited    /*可以是OPENQUERY或OPENROWSET函数*/
[WITH(table_hint_limited))[,...n]]   /*指定表提示,可省略*/
}
[FROM {}[,...n]]   /*从table_source删除数据*/
[<OUTPUT Clause>]   /*OUTPUT子句*/
[WHERE{}]  /*指定条件*/
| {[CURRENT OF{{[GLOBAL]cursor_name} | cursor_variable_name}]}   /*游标*/
[OPTION ([,...n])]/*使用优化程序*/
USE PXSCJ
GO
DELETE
    FROM XSB
    WHERE Total>52
GO

2.6修改记录

USE PXSCJ
GO
UPDATA XSB
    SET Remark='1'
    WHERE StdentID='08081'
GO

3.数据库查询和视图

3.1数据库的查询

SELECT [ ALL | DISTINCT ]
[ TOP expression [ PERCENT ] [ WITH TIES ] ] 
 
 ::= 
    { 
           * 
      | { table_name | view_name | table_alias }.* 
      | {
          [ { table_name | view_name | table_alias }. ]
             { column_name | $IDENTITY } } ]
      | expression
          [ [ AS ] column_alias ]  }
      | column_alias = expression 
    } [ ,...n ]
USE PXSCJ
GO
SELECT StudentID AS 学号,Sname AS 姓名,等级=
    CASE
        WHEN Total IS NULL THEN '未选'
        WHEN Total <50 THEN '不及格'
        WHEN Total > =50 and Total < =60 THEN '合格'
        ELSE '优秀'
    END
    FROM XSB
    WHERE Speciality='计算机'
GO

关键字:
distinct:消除结果集中的重复行
top:限制结果集的返回行数
between,in:范围指定
IS NULL:空值比较
GROUP BY :分组
WITH:指定CUBE或ROLLUP操作符,增加记录
HAVING:可使用聚合函数
ORDER BY:排序
INTO:将所查询结果保存至新表
UNION:联合查询

3.2函数
COUNT(*):统计表中元组的个数。
COUNT([DISTINCT] <列名>):统计列值个数
SUM(<列名>):计算列值的和值(必须是数值型列)。
AVG(<列名>):计算列值的平均值(必须是数值型列)。
MAX(<列名>):得到列值的最大值。
MIN(<列名>):得到列值的最小值。

3.3模式匹配
LIKE:指出一个字符串是否与指定的字符串相匹配
NOT LIKE:相反

通配符 说明
% 匹配0个或多个字符
_ 匹配一个字符
[] 匹配方括号中的任何一个字符 如[a-f]
[^] 不匹配方括号中的任何一个字符 如[^0-9]

3.4IN子查询

select  name, sex from sudent  
where dept in ('信息管理系', '通信工程系', '计算机系') 

3.5JOIN连接
内连接:ON
按on条件合并
外连接:OUTER
左外连接:LEFT OUTER JOIN 满足条件和左表所有行
右外连接:RIGHT OUTER JOIN 满足条件和右表所有行
完全外连接:FULL OUTER JOIN 满足条件和两表所有行
交叉连接:CROSS JOIN

SELECT Sname, Grade  
  FROM  Student s  
  JOIN  SC ON s.Sno = SC. Sno  
  JOIN  Course c ON c.Cno = SC.Cno  
  WHERE Dept = '信息管理系'   
  AND Cname = '计算机文化学'

3.6视图
语法:

create   view   view_name
  [ (列名表) ]
  [ with  encryption ]          --用于加密视图的定义,用户只能查看不能修改。
    as
    select查询语句
  [ with   check  option ]  
CREATE   view    v1 (学生学号,男生姓名, 生日)  
    as  
    select   学号, 姓名, 出生日期     from      xsqk  
    where   专业名=‘计算机网络’   and   性别=1  
GO 

3.6.1更新视图
插入数据:

INSERT INTO CS
    VALUES('989834','刘哥''男''计算机')

修改数据:

UPDATE CS
    SET Total=Total + 8

删除数据:

DELETE FROM CS
    WHERE Sex=0

修改视图:

alter   view    v1  
   (学生学号,男生姓名,生日,专业,系)  
    as  
    select   学号,姓名,出生日期,专业名,所在系  
    from      xsqk  
    where   专业名=‘计算机网络’   and   性别=1

删除视图:

DROP VIEW CS_XS,CS_KC

3.7游标
语法:

DECLARE cursor_name CURSOR     
[LOCAL | GLOBAL]                   /*游标作用域*/
[FORWORD_ONLY | SCROLL]            /*游标移动方向*/ 
[STATIC |KEYSET | DYNAMIC| FAST_FORWARD]  /*游标类型*/
[READ_ONLY | SCROLL_LOCKS| OPTIMISTIC]      /*访问属性*/
[TYPE_WARNING]     /*类型转换警告信息*/
FOR select_statement   /*SELECT查询语句*/
[FOR UPDATE[ OF column_name[,...n]]]   /*可修改的列*/
[;]

eg:

DECLARE XC CURSOR
    DYNAMIC
    FOR
    SELECT studentid,sname,total
        FROM xsb
        WHERE speciality='计算机'
FOR UPDATE  OF total

打开游标:

OPEN XC

读取游标:

FETCH NEXT FROM XC

关闭游标:

CLOSE XS

删除游标:

DEALLOCATE XC

4.索引,数据完整性与事务

4.1索引
作用:
快速存取数据
保证数据记录的唯一性
实现表与表之间的参照完整性
在使用ORDER BY,GROUP BY子句进行的数据检索时,利用索引可以减少排序和分组的时间

4.2创建索引
语法:

CREATE[UNIQUE]                   /*指定索引是否唯一*/
        [CLUSTERED | NONCLUSTERED]   /*索引的组织方式*/
    INDEX index_name                 /*索引名称*/
ON{[database_name.[schema_name].|schema_name.]table_or_view_name}
        (column[ASC|DESC][,...n])   /*索引定义的数据*/
    [INCLUDE(column_name[,...n])]
    [WITH([,...n])]   /*索引选项*/
    [ON{partition_acheme_name(column_name) /*指定分区方案*/
    |filegroup_name    /*指定索引文件所在的文件组*/
        |default
}]
[;]

CLUSTERED | NONCLUSTERED:指定聚集索引和非聚集索引
eg:

USE PXSCJ
GO
CREATE INDEX kc
ON KCB(CourseName)
CREATE UNIQUE CLUSTERED INDEX xs_ind
ON XSB(StudentID)
WITH IGNORE_DUP_KEY  /*指定对唯一聚集索引或唯一非聚集索引执行多行插入操作时出现重复键值的错误响应*/

4.3视图索引
对七个选项进行设置,六个SET选项必须设置为ON:
eg:

/*定义视图,由于使用WITH SCHEMABINDING子句,SELECT子句中表名必须为架构名.表明的形式*/
CREATE VIEW View_stu WITH SCHEMABINDING
AS
SELECT StudentID,Sname
    FROM dbo.XSB
GO
/*设置选项*/
SET NUMERIC_ROUNDABORT OFF
SET ANSI_PADDING,ANSI_WARNINGS,CONCAT_NULL_YIELDS_NULL,ARITHABORT,QUOTED_IDENTIFIER,ANSI_NULLS  ON
/*在视图上创建索引*/
CREATE UNIQUE CLUSTERED INDEX Inx1
    ON View_stu(StudentID)
GO

4.4重建索引
重建表KCB上的所有索引:

USE PXSCJ
GO
ALTER INDEX ALL ON KCB REBUILD
/*指定将相同的列,索引类型,唯一性属性和排序重新生成索引,结合ALTER INDEX可重建单个或全部与表相关的索引*/

重建表KCB上的kc_name_ind索引

ALTER INDEX kc_name_ind ON KCB REBUILD

4.5删除索引
drop index {表名 . | 视图名 . } 索引名 [ , … n ]

4.6默认值约束
默认值约束的定义:

CREATE TABLE table_name     /*表明*/
(column_name datatype NOT NULL| NULL
[CONSTRAINT constraint_name]    /*指派约束名*/
[DEFAULT constraint_expression]   /*缺省值约束表达式*/
[,...n]
)

默认值约束的删除:

ALTER TABLE XSB
    DROP CONSTRAINT adddatedflt

默认值对象:

CREATE DEFAULT[schema_name.] default_name
    AS constant_expression[;]

默认值对象删除:

DROP DEFAULT {default} [,...n]

修改PXSCJ数据库的表CJB,增加成绩字段的CHECK约束:

USE PXSCJ
GO
ALTER TABLE CJB
    ADD CONSTRAINT cj_constraint CHECK (grade>=0 and grade<=100)

将规则对象绑定到列或用户定义的数据类型中可以使用系统存储过程sp_bindrule
创建一个规则,并绑定到表KCB的课程号列,用于限制课程号的输入范围

USE PXSCJ
GO 
CREATE RULE kc_rule
    AS @range like '[1-5][1-9][1-9]'
GO
EXEC sp_bindrule 'KC_rule','KCB.CourseID'
GO

解除绑定继而删除规则用:EXEC sp_unbindrule,DROP RULE

5.存储过程和触发器

常用的系统存储过程:

系统存储过程 说明
sp_satabases 列出服务器上所有数据库
sp_helpdb 报告有关指定数据库或所有数据库的信息
sp_renamedb 更改数据库的名称
sp_tables 返回当前环境下可查询的对象的列表
sp_columns 返回某个表列的信息
sp_help 查看某个表的所有信息
sp_helpconstraint 查看某个表的约束
sp_helpindex 查看某个表的索引
sp_stored_procedures 列出当前环境中的所有存储过程
sp_password 添加或修改登录帐号的密码
sp_helptext 显示默认值,未加密的存储过程,用户存储过程,触发器和视图的实际文本

5.1创建存储过程
语法:
CREATE PROC[EDURE] 存储过程名
[ { @参数名 数据类型 } [ = default ] [OUTPUT] ] [ , … n ]
AS SQL语句 [ … n ]
无参:

CREATE  PROCEDURE  p_StudentGrade1  
AS  
 SELECT Sname, Cname, Grade  
    FROM Student s INNER JOIN SC  
    ON s.Sno = SC.Sno  INNER JOIN Course c  
ON c.Cno = sc.Cno  
      WHERE Dept = '计算机系' 
EXEC p_StudentGrade1  

有参:

create    procedure   p_xsqk    @xh   char(6)  
    as    select   姓名,课程号,成绩    from    xsqk , xs_kc     
   where   xsqk.学号=xs_kc.学号  and  xsqk.学号= @xh  
go 
exec  p_xsqk   ‘020102‘        --(1)按位置传递参数  
exec  p_xsqk   @xh=‘020103‘    --(2)通过参数名传递参数 

使用output参数的存储过程:

CTEATE PROCEDUTE selectavggrade
    @avggrade float output
AS
    SELECT @avggrade=AVG(Grade) FROM CJB WHERE StudentID='034023'
    GO

执行:

DECLATE @str float
EXEC selectavggrade @str OUTPUT
SELECT @str AS 平均成绩

5.2修改存储过程
语法:
alter proc[edure] 存储过程名
[@形参 数据类型 [=默认值] [output ],…n ]
as SQL语句

5.3删除存储过程
语法:
drop proc[edure] 存储过程名

查看存储过程
语法:
sp_help 存储过程名 –显示存储过程的基本信息
sp_helptext 存储过程名 –显示存储过程的源代码

5.4触发器
分为DML触发器(insert,update,delete)和DDL触发器(create,alter,drop)
触发器有2个特殊的表:inserted表和deleted表

修改操作 inserted表 deleted表
增加(insert)记录 存放新增的记录 -
删除(delete)记录 - 存放被删除的记录
更新(update)记录 存放更新后的记录 存放更新前的记录

5.4.1创建触发器
语法:
create trigger 触发器名
on 表名| 视图名
[with encryption] /–加密/
for | after | instead of [ insert , update, delete ]
as SQL语句
注意:1个表上可有多个触发器。 每个触发器只能作用在一个表上。这是一个一对多的关系
insert触发器:

create    trigger    tr_insert_cj  
     on   xs_kc      after   insert  
     as    print   ‘有新成绩信息插入到xs_kc表! ’  
go 

执行触发:

insert     into   xs_kc    values( '020105', '101', 87, null ) 

update触发器:

create   trigger   tr_update_xsqk2   on   student   after   update  
as  
     if   update(姓名)  
            begin  
                  rollback   transaction         -- 撤消修改操作  
                  raiserror(‘不能修改学生姓名!’ , 16 ,1)   
             end  
go 
update   student   set   姓名=‘小花’    where    姓名=‘杨颖’ 

delete触发器:

 create   trigger   tr_delete_xsqk  
     on   xsqk  
     after   delete  
as  
      rollback   transaction  
      print    ‘不能删除xsqk表中的信息!’  
go
delete   xsqk    where    学号= '020101'  

5.4.2修改触发器
语法:
alter trigger 触发器名

5.4.3删除触发器
语法:
drop trigger 触发器名[,…n]
on {database | all server}

6.备份和恢复

以下角色可做备份操作:
sysadmin(系统管理员)
,db_owner(数据库所有者)
,db_backupoperator(允许进行数据库备份的用户)
,授权允许者

不要备份数据库tempdb,因为其不包括临时数据

备份方法:
1,完全数据库备份
2,数据库和事务日志备份
3,差异备份
4,数据库文件或文件组备份

6.1.1创建命名备份设备
EXEC sp_addumpdevice
介质类型(disk | tape),逻辑名称,物理名称

DISK表示硬盘文件,tape表示磁带设备

exec sp_addumpdevice 'disk','mybackupfile','E:\mybackupfile.bak'

6.1.2删除命名备份设备
用系统存储过程sp_dropdevice删除命名备份设备时,若被删除的命名备份设备的类型为磁盘,那么必须指定DELFILE选项
exec sp_dropdevice ‘mybackupfile’ ,DELFILE

6.1.3创建临时备份设备
backup database 库名 to 介质类型=物理名称
backup database pxscj to disk=’E:\tmppxscj.ba’

6.1.4备份整个数据库

use master
go 
exec sp_addumpdevice 'disk','test1','E:\test1.bak'
backup database pxscj to test1
backup database pxscj to test1 with init   --覆盖
backup database pxscj to test1 with noinit   --追加

6.1.5差异备份

backup batabase pxscj to disk='E:\pxscjbk.bak' with differential     --差异备份关键字

6.1.6备份数据库文件或文件组
设TT数据库有2个数据文件t1和t2,事务日志存储在文件tlog中。将文件t1备份到备份设备t1backup中,将事务日志文件备份到tbackuplog中。

EXEC sp_addumpdevice 'disk','t1backup','E:\t1backup.bak'
EXEC sp_addumpdevice 'disk','tbackuplog','E:\t1backuplog.bak'
GO
BACKUP DATABASE TT
    FILE='t1'  TO t1backup
BACKUP LOG TT TO tbackuplog

FILT:用于给一个或多个包含在数据库备份中的文件命名
FILTGROUP:文件组

6.1.7事务日志备份

EXEC sp_addumpdevice 'disk','pxscjlogbk','E:\testlog.bak'
backup log pxscj to pxscjlogbk

6.1.8清除事务日志

BACKUP LOG  库名
with [NO_LOG | TRUNCATE_ONLY]

6.2恢复数据库
RESTORE DATABASE 库名
[FROM [,…n]]
[with [,…n]]

restore database pxscj
from pxscjbk1
with file=1,replace    /*replace如果存在相同名称的数据库,恢复时指定该选项时备份的数据库将会覆盖现有的数据库*/

6.2.1恢复数据库部分内容
RESTORE DATABASE 库名
/指定需恢复的逻辑文件或文件组的名称/
[FROM [,…n]]
[with partial
[,…n]]

6.2.2恢复事务日志
RESTORE LOG DATABASE 库名
[ [,…n]]
[FROM [,…n]]
[with [,…n]]

你可能感兴趣的:(数据库,sql,数据库,primary,name,filename)