5、SQL Server数据库、T-SQL

时间:2021-09-02 23:59:48

SQL Server数据库基础

一、安装SQL Server数据库

setup.exe->安装->全新SQL Server独立安装或向现有安装添加功能->输入序列号->下一步->默认实例->混合模式->输入sa密码->实例账号添加当前账号即可。

如果想要其他机器访问这台机器的sqlserver,需要使用windows防火墙中的入站规则,端口写1433.

二、SQL Server配置管理器

包含各个sql服务,连接数据库时,务必保证sql server服务已开启.

三、系统数据库

1、master数据库

主系统数据库,丢失该库,sqlserver将无法启动。

2、tempdb数据库

用来创建临时对象,包括临时表,存储过程,表变量,全局临时表以及游标等。

3、model数据库

sqlserver实例中创建的全部数据库的模型。

4、msdb数据库

主要用于sqlserver代理的支撑后台。

5、resource数据库

资源数据库,隐藏的制度数据库。主要用于改进sqlserver版本升级时的进程功能。

6、distribution数据库

分发数据库,只有将实例配置为复制的分发者时,该库才存在。复制中所有的元数据与各种类型的历史记录都存储在此数据库中。

四、数据库的组成

数据库主要由文件和文件组组成。数据库中的所有数据和对象(表、存储过程和触发器等)都被存储在文件中。

1、文件

主要数据文件:存放数据和数据库的初始化信息。每个数据库只有一个主要数据文件,默认扩展名是.mdf。
次要数据文件:存放除主要数据文件意外的所有数据文件。有些数据库可能没有次要数据文件,也可能有多个次要数据文件,默认扩展名是.ndf。
事物日志文件:存放用于恢复数据库的所有日志信息。每个数据库至少有一个事物日志文件,也可以有多个事物日志文件,默认扩展名是.ldf。

2.文件组
主文件组:包含主要数据文件和任何没有明确指派给其他文件组的文件。系统表的所有页都分配在主文件组中。
用户定义文件组:主要是在create database 或者alter database 语句中,使用filegroup关键字指定的文件组。

五、创建数据库
创建数据库时包括常规、选项和文件组 常规用于设置数据库的名称大小位置等,选项和文件组中定义数据库的一些选项,显示文件和文件组的统计信息,默认即可。
SQL Server 默认创建了一个primary文件组,用于存放若干个数据文件,但日志没有文件组。
SQL Server数据库的数据文件分逻辑名称和屋里名称。逻辑名称是在sql 语句中引用文件时所使用的名称;物理名称用于操作管理系统。

维护SQL Server数据库

一、脱机与联机

数据库->右键脱机,copy之后右键联机->完成

二、分离与附加

分离不是删除数据库而是从服务器中移除。 exec sp_detach_db @dbname='webDB'

数据库->右键分离->需要时再右键附加上。create database webDB on (filename='c:\webDB.mdf'),(c:\webDB.ldf) for attach

三、导入和导出

数据库->右键导入->选择数据源->完成。

数据库->右键导出->输入服务器名称,账号密码->选择导出方式->完成。

四、备份和恢复

数据库->右键备份->完整备份->完成。

数据库->右键恢复->选择bak文件->完全覆盖->完成。

五、收缩数据库和文件

因为数据库空间分配采用的是现分配、后使用的机制,所以数据库使用过程中就可能会存在多余的空间。收缩数据库功能允许对数据库的每个文件进行收缩。
数据库和日志文件都可以收缩,可以手动收缩额自动收缩。
自动收缩:数据库->右键属性->选项->自动收缩->完成。
手动收缩:数据库->右键任务收缩->数据库/文件->确定。

六、生成与执行SQL脚本

将数据库生成SQL脚本:数据库->编写脚本->create database ->完成。
将数据表生成SQL脚本:数据表->编写脚本->create table->完成。
执行SQL脚本:新建查询->输入脚本->执行。

数据表

一个数据库由多张数据表组成,每个数据表由行和列组成

一、数据类型

1、基本数据类型

精确数字类型:bigint、int、smallint、tinyint、bit、decimal、numeric、money、smallmoney。

浮点数据类型:freal、float。

字符数据类型:text、ntext、char、nchar(n)、varchar、nvarchar(n)。

二进制数据类型:binary、varbinary、image。

日期/时间数据类型:time、date、smalldatetime、datetime、datetime2、datetimeoffset。

2、用户自定义数据类型

2.1 可编程性->类型->用户自定义数据类型->右键新增数据类型。

2.2 exec sp_addtype code_name,'char(8)','not null'

二、数据表的数据完整性

表中的每一列都有一组属性,如名称、数据类型、数据长度和是否为空等。

1.空与非空值(null/not null):定义是否允许为空

2.默认值(default):默认指定值。

3.标识属性(identity):自动为表中插入新行生成连续递增的编号,因标识值通常唯一,所以标识列通常定义为主键(整型数据类型,标识列不能为空)。

4.约束:用来定义自动强制数据库完整性的方式,约束优先于使用触发器、规则和默认值。

非空:用户必须输入一个值。可以有多个非空约束。

检查:用来指定一个布尔操作,限制输入到表中的值。

唯一性:用户的应用程序向列中输入一个唯一的值,值不能重复,但可以为空。

主键:可以保证实体完整性,一个表只能有一个主键,主键不能为空。

外键:控制存储在外键表中的数据。一个表可以有多个外键。

三、企业管理器管理数据表

创建表:数据库->表->右键新建表->输入列名->选择数据类型->是否允许空->保存输入表名。

修改表:数据库->表->右键设计。

重命名:数据库->表->f2。

删除表:数据库->表->右键删除。

非空约束->列->列属性->允许NULL -> 是/否。

主键约束->列->右键->设为主键->完成。

唯一约束->列->索引/键->唯一->是->完成。

检查约束->列->右键->check约束->表达式->完成。

默认约束->列->列属性->默认值。

外键约束->列->右键->关系->表和列规范->选择外键表列。

四、关系的创建与维护

SQL Server 是一个关系数据库管理系统(Relational Datable Management System,RDBMS),当数据库中包含多个表时,需要通过主关键字来建立表之间的关系。

主表user 从表work 主表wid右键->关系->主键work id 外键 user wid。

五、计算列

列属性->计算列规范->公式。

由同一表中的其他列的表达式计算结果来生成列。一般用来对数据表进行扩展或增强。

T-SQL

一、T-SQL概述

T-SQL(Transact Structured Query Language)是标准的Microsoft SQL Server的扩展,是标准的SQL程序设计语言的增强版,程序与SQL Server沟通的主要语言。

SQL是关系数据库系统的标准语言,标准的SQL可以运用在所有的关系型数据库上。但T-SQL是SQL Server系统产品独有的。

二、T-SQL语言的组成

数据定义语言(Data Definition Language,DDL):用于在数据库系统中对数据库、表、视图、索引等数据库对象进行创建和管理。

数据控制语言(Data Control Language,DCL):用于实现对数据库中数据的完整性、安全性等控制。

数据操纵语言(Data Mainpulation Language,DML):用于插入、修改、删除和查询数据库中的数据。

三、T-SQL语句结构

每条SQL语句由一个谓词开始,该谓词描述这条语句要产生的动作,如select或update关键字。谓词后紧接着一个或多个子句,子句中给出了被谓词作用的数据或提供谓词动作的详细信息,每一条子句都由一个关键字开始。

select 子句[into 子句] from子句 [where 子句] [group by 子句][having 子句][order by 子句]

四、T-SQL语句分类

变量说明语句:用来说明变量的命令。

数据定义语句:用来简历数据库、数据库对象和定义列,如create table、create view、drop table等。

数据操纵语句:用来操纵数据库中数据的命令,如select、insert、update、delete和cursor等。

数据控制语句:用来控制数据库组件的存取许可、存取权限等,如grant、revoke等。

内嵌函数:说明变量的命令。

其他命令:嵌于命令中使用的标准函数。

五、常量

数据在内存中存储始终不变化的量叫常量,常量,也称为文字值或标量值,是标识一个特定数据值的符号。格式区别与它所标识的值的类型。

1.数字常量:包括整数常量、小数常量以及浮点常量。【 1 2 3】

2.字符串常量:括在单引号内并且包含字母数字字符(a~z、A~Z、0~9)以及特殊字符,如”!、@、#“。 【‘a’ ‘asd’】

3.日期和时间常量:SQL规定日期、时间和时间间隔的常量值被指定为日期和时间常量。【'2014-08-01'】

4.符号常量:除了用户定义的常量外, SQL包含几个特定的符号常量,这些常量代表不同的常用数据值。【current_date标识当前的日期】

六、变量

数据在内存中存储可以变化的量叫变量。用户必须指定存储信息的单元,并为该存储单元命名。T-SQL可以使用两种变量,局部变量和全局变量。

1.局部变量

局部变量是用户可自定义的变量,作用范围仅在程序内部,局部变量名必须以“@”开头。

1.1声明局部变量:使用declare语句声明变量。

declare @a char(10)

1.2局部变量赋值:一种select,一种set。

select : select @a = 1

set : set @a = 'i love sql'

/*定义变量 查询结果*/

declare @title varchar(10)

set @title = 'xxx'

select * from article where title = @title

输出语句

select : select @a as ‘A’ 返回带列明的变量值

print : print @a 输出变量

2.全局变量

系统内部事先定义好的变量称为全局变量,不用用户定义,任何程序均可随时调用。全局变量以“@@”开头。

@@identity: 最后一次自增的值。

@@rowcount: 影响行数

@@cursor_rows: 返回连接上打开的游标当前限定的数目

@@error:返回错误号。若执行成功则返回0。

@@connections:记录最后一次服务器启动以来,所有针对这台服务器进行的链接数目,包括没有链接成功的尝试。

@@cup_busy:记录上次启动以来尝试的连接数,无论链接成功还是失败,都以ms为单位的cpu工作时间

@@dbts:返回当前数据库中timestamp数据类型的当前值。

@@fetch_status:返回上一次使用游标fetch操作所返回的状态值,并且返回值为整型。0成功,-1失败或不存在,-2被提取的行不存在。

@@idle:返回以ms为单位计算SQL Server服务器自最近一次启动以来处于停顿状态的时间。

@@io_busy:返回以ms为单位计算的SQL Server服务器自最近一次启动以来花在输入和输出上的时间。

@@lock_timeout:返回当前对数据锁定的超时设置。

@@pack_received:返回SQL Server服务器自最近一次启动以来一共从网络上接收数据分组的数目。

@@pack_sent:返回SQL Server服务器自最近一次启动以来一共向网络上发送数据分组的数目。

@@procid:返回当前存储过程ID标识。

@@remserver:返回在登陆记录中记在远程SQL Server服务器的名字

@@spid:返回当前服务器进程的ID标识。

@@total_errors:返回自服务器启动以来,所遇到读写错误的总数。

@@total_read:返回自服务器启动以来,读磁盘的次数。

@@total_write:返回自服务器启动以来,写磁盘的次数。

@@trancount:返回当前链接中,处于活动状态事务的数目。

@@version:返回当前服务器的安装日期、版本、一级处理器的类型。

七、运算符

代码注释:/*此处注视*/

1、算数运算符

+、-、*、/。加减乘除。1+1。

2、赋值运算符

=为赋值运算符,将 等号右侧的值赋给左侧变量。

3、比较运算符

>、=、<=、<>、!=、!>、! 比较运算符测试两个表达式是否相同

4、逻辑运算符

  • all:如果一个比较集中全部都是true,则值为true。
  • and:如果两个布尔值表达式均为true,贼值为true。
  • any:如果一个比较集合中任何一个为true,则值为true。
  • between:如果操作数是在某个范围内,则值为true。
  • exists:如果子查询包含该行,则返回true。
  • in:如果操作数与一个表达式列表中的某个相等,则值为true。
  • like:如果操作数匹配某个模式,则值为true。
  • not:对任何其他布尔运算符的值相反。
  • or:如果任何一个表达式是true,则值为true。
  • some:如果一个比较集中的某些true,则值为true。
  • not and or 同意表达式中,优先级是not>and>or。

5、位运算符

&(AND) |(OR) ^(互斥OR) ~(NOT)

6、连接运算符

使用"+"用于连接两个或者两个以上的字符串。'123'+'asd'

7、运算符优先级

  • 1.+(加) -(减) ~(位反)
  • 2. *(乘) /(除) %(余)
  • 3.+(加) +(字符串连接) -(减)
  • 4.=、>、=、<=、<>、!=、!>、! >、!
  • 5.^(按位异或) &(按位与) | (按位或)
  • 6. NOT
  • 7. AND
  • ALL ANY BETWEEN IN LIKE OR SOME(逻辑运算符)。
  • =(赋值)

8、通配符

  • % : 包含0个或多个字符的任意字符(%title% "1title1","title","titlecsd")。
  • _ : 任何单个字符 (title_ "titlec"),通配符后只可跟一个字母。
  • [] : 指定范围[a~c] 或集合[abc]中的任何单个字符([0~9]123标识0~9之间任意一个字符开头,123结尾的字符)。
  • [^]:不属于指定范围或集合中的任何单个字符([^0~6]123 标识不以0~6之间的任意一个字母开头,却以123结尾的字符)。

9、控制流程

  • begin···end:用于将多个T-SQL语句组合为一个逻辑块。当流程控制语句必须执行一个包含两条或两条以上T-SQL语句时,使用begin end。
  • if:if@x%2=0 print '偶数' end
  • if···else:set @y = 3; if@x>0 print '1'else print'c'
  • case:使用case可以很方便的实现多重选择的情况,比if···then结构有更多的选择和判断机会。
    case······when aa > 10 then 'ok' when aa
  • while:T-SQL循环结构,条件为真的情况下while子句可以循环的其后的一条T-SQL命令,如果向循环执行一组命令,需配合begin······end。
  • while······continue······break:循环结构while子句还可以用continue和break控制while循环中语句的执行。
  • return:用于从查询或者过程中无条件退出。
  • goto:用来改变程序执行的流程,使程序调到标识符指定的程序行再继续往下执行。
  • dbcc:用来验证数据库完整性,查找错误和分析系统使用情况等。
  • declare:用来声明一个或多个局部变量、游标变量或表变量。
  • print: 用来向客户端返回一个字符串。
  • backup:用于将数据库内容或事务处理日志备份到磁盘或硬盘中。
  • restore:数据库发生丢失或者被破坏后可以使用restore将事务处理日志备份文件还原到SQL Server中。
  • select : 除查询外还可以给变量赋值。select @x=1,@y='love',多个赋值。
  • set:用来给局部变量赋值,set一次只能给一个变量赋值,select可以多个,不过set功能更强更严密。
  • shutdown:离职终止所有的用户过程,并在对每一现行的事务发生一个回滚后退出SQL Server。终止SQL服务。
  • use:用于在当前工作区打开数据库,如:use master select * from sysdatabases。

 八、SQL语言操作

1、GO批处理语句

用于同时执行多个语句

使用、切换数据库

use master

go

2、使用T-SQL语句操作数据库

2.1、创建数据库

/*检查是否已存在该数据库*/
if(exists(select * from sys.databases where name = 'webDB'))
    drop database webDB
go
create database webDB on primary /*数据库名字 默认属于praimary组 可省略不写*/
(
    name = webDB, /*逻辑名称*/
    filename='d:\webDB.mdf', /*物理名称*/
    size = 5mb, /*初始大小*/
    maxsize = unlimited, /*增长率的最大值*/
    filegrowth = 10% /*增长率*/
)
log on
(
    name = webDB_log,
    filename = 'd:\webDB.ldf',
    size = 3mb,
    maxsize = 50mb,
    filegrowth = 2mb
)

2.2修改数据库

alter database webDB /*要修改的数据库*/
modify file /*修改文件*/
(
    name = webDB, /*逻辑名*/
    size = 6mb /*修改初始大小*/
)

2.3使用存储过程修改数据库名

exec sp_renamedb 'webDB','newDB'

2.4删除数据库

drop database webDB

3、创建表

use webDB
go
if(exists(select * from sys.objects where name='student'))
    drop table student
go
create table student(
    name nvarchar(50),
    age int
)

4、修改表

/*如果student表存在address列则删除该列*/
if(exists(select * from sys.all_columns where object_id=object_id('student') and name='address'))
    alter table student drop column address/*删除表中谋列*/

/*向表追加列*/
alter table student add address varchar(50) not null

/*修改该列*/
alter table student alter column address varchar(20)

/*向表中追加多列*/
alter table student add tel varchar(50),sex char(2),hits int

5、备份数据表

select * into newTable from student

6、创建约束

/*1、非空约束
创建表时 创建非空约束*/
create table [user]( 
    id int not null,
    name varchar(50),
    age int
)
/*在现有表中追加约束*/
alter table student 
alter column name varchar(50) not null 

/*2、主键约束
创建表时 创建主键约束*/
create table [user1](
    id int constraint pk_id primary key, 
    name varchar(50)
)
/*在现有表中 创建主键约束*/
alter table user1 add constraint pk_id primary key(id) 

/*3、唯一约束
创建表时 创建唯一约束*/
create table [user2](
    id int constraint uq_id unique,
    name varchar(50)
)
/*在现有表中 创建唯一约束*/
alter table [user2] add constraint qu_id unique(id)

/*4、检查约束*/
create table user3
(
    sex char(2) constraint ck_sex check(sex in ('',''))
)

alter table user3 add constraint ck_sex check(sex in ('',''))

/*5、默认约束*/
create table [defualt](
    hits int constraint def_hits default 0
)

alter table [defualt] add constraint def_hits default 0 for [hits]


/*6、外键约束*/
alter table text add constraint fkey_id foreign key(id) references test(id)