SQLserver数据库教程

SQLserver服务器的安装:

		SQLserver2019的安装:在微软官网下载SQLserve服务器,安装即可


第一章:数据库技术介绍

1.数据库技术:数据库技术口水研究的问题然后科学的组织和存储数据,然后高效的获取和处理数据


数据库技术的重要性:数据库技术能为人们提供安全,可靠,可共享的数据

什么是SQL :结构化查询语言  SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言
在使用SQL的时候,只需要发出做什么的命令,怎么做是不需要使用者考虑的


数据库:数据(Data)  数据库(databases)  数据库管理系统(DBMS)  数据库系统 (DBS)


数据(data)的定义:对客观生物的符号表示,如图形,数字,字母等。数据是数据库中存储的基本对象
在日常中:直接用语言来描述事务,在计算机中为了存储和处理这些事务,就要将事务的特征抽象出来组成一个记录来描述

数据的种类:文字 图形 图像 声音

数据举例;
数据的形式是不能完全表达其内容的

数据库(DB)定义:长期存储在计算机内,有组织的,可共享的的数据集合
数据库中的数据按照一定的数据模型组织,描述和存储

具有较小的 冗余度,较高的数据独立性和易扩展性,并可为各个用户共享

数据源管理系统:DBMS:位于应用程序与存储数据的的一层数据管理软件
是基础软件,是一个大型复杂的软件系统

DBMS的用途:科学的足赤和存储数据,高效的获取和维护数据

数据库定义的功能:用DDL编写的各级源模式不易成各级目标模式。这些目标	模式是对数据库结构信息的描述,而不是数据本身
数据库的操作功能:单独数据操作语言DML及编译程序
数据库的保护功能:数据恢复没数据库的并发控制 数据我在想控制和数据安全性控制
数据库的维护功能:数据库的数据的导入,转换,存储,数据库新性能监控等



DBMS的优点:相互互联的数据的集合 较少的数据冗余 程序和数据相互对立 保证数据的安全 可靠 正确
 数据可以并发使用并能同时保证一致性 也就是同步更新
 
 2.流行的DBMS:
         Oracle 关系型数据库
        MySQL数据库:快捷可靠,开源,免费
        SQLserver数据库:针对不同用户群体的五个特殊的版本

DB2:应用于大型应用系统


数据库系统:DBS 一帮有数据库,数据库管理系统及其开发工具,应用系统,数据库管理员和用户构成

数据库的发展建立了三个阶段:网状数据库,此次数据库和关系型数据库
分别采用网状模型,层次模型,关系模型作为数据的组织方式
层次模型:树形结构
网状模型:图形结构
关系模型:简单二维表结构



信息和数据:
信息;是指数据经过几十个处理后所获取的有用这是,信息是一某种数据形式表现的

信息的三种世界:
现实世界:存在于热闹之外的客观世界
信息世界:信息世界就是现实在人们头脑中的反映,有称观念世界
数据世界:按照特定的数据结构,将数据存储在计算机中

实体-联系模型:
实体:客观事务在信世界中称为实体,他是现实数据中任何可区分,识别的生物

属性:描述实体或者联系的性质或特找那个的数据项
联系:反映生物内部或事务之间的关联集合
 常见的实体联系有3种:一对一
 一对多联系 多对多联系

关系的的基本概念:关系:一个关系就是一张二维表,通常将一个没有重复行,重复列的二维表看成一个关系,每个关系都有一个关系名称

元祖:二维表的每一行在关系中称为元祖 在SQLserver中 一个元祖对于表中的一个记录

属性:二维表的每一列在关系中称为属性,每个属性都有一个属性名  属性值则是各个元祖属性的取值





域:属性的一个取值范围称为域
关键字:关系中能唯一区分,确定不同元祖的属性或属性组合,称为该关系的一个关键字


关系模式;
对关系的描述称为关系模式,其格式为:关系名(属性名1,属性名2,...属性名n)

1.的基本特点:在关系模型中:关系具有如下的基本特点:
2.必须规范化,属性不可在分割
3.一关系中不允许查询系统的属性名
4.一关系中元祖的顺序可任意
5.一关系中的顺序的顺序可以任意

关系运算:选择 投影 和连接

1.选择:从关系模式中找出满足给定条件的元祖组成新的关系(从行的角度来进行的运算)
2.投影:从关系模式中指定若干顺序组成新的关系,从列的角度进行的运算
3.连接:笛卡尔积中选取属性间满足一定条件的元祖,组成性的关系



关系的完整性约束:
实体完整性
参照完整性(引用完整性)
域完整性(用户定义完整性)
实体完整性:主属性值不能取空值



如:学生信息表(姓名,性别,年龄,地址)中姓名不能为空
外键:主要是加强两个表中的联系
参照完整性:简单的来说就是主键域外键的关系
域完整性:限制了某些属性中出现的值,把属性限制在一个有限的集合中
投影:从关系模式中指定若干属性组成新的关系,从列的角度进行,运算


关系模型的规范化:关系模式要满足的条件称为规范化学生,简称范式
关系模型规范化的目的的为了消除
1.异常少数据冗余  
2.数据的完整性和存储效率 
一般规范为3NF即可

第一范式:1NF:如果关系R的所有属性均为简单属性,即每个属性都是不可再分的,则称R满足第一范式
            也就是:每个属性都是不可在分的
            简单来说:第一范式就是无重复的列
第二范式:如果关系R满足第一范式,且每一个非主键字段完全原来域主键 则称R满足第二范式
第三范式:3NF:如果关系R满足第二范式,且非主键字段之间不存在原来关系,则称R满足第三范式


E-R图:也称实体联系图,原来描述现实世界的概念模型

通常:		用矩形来表示实体 矩形内写明实体名
        用椭圆表示实体属性,椭圆内写明实体属名
        用菱形表示实体间的联系,在菱形内写明联系名  用线段连接起来


第二章:数据库的操作

数据控制语言:DCL:矩形安全性管理

grant:授予权限
revoke:收回权限
deny:收回权限,与revoke权限相似,不同之处就是处收回权限外还禁止

SQL语言:
create:常见数据库或者数据库对象
alter:对数据库或数据库对象进行修改
drop:删除数据库或数据库对象
select:从表或视图中检索数据
insert:向表中插入数据
update:修改关系表或视图中的数据
delete:从表或视图中删除数据


一个数据库中包含三个外键:
1.基本数据文件(主数据文件) :一个数据库中有且仅有一个 ,其扩展名为.mdf
2.辅助数据文件:根据需要自由选择,当数据库很大时,可以选择多个,即0个,1个,...其扩展名为.ndf

3.日志文件:英语恢复数据库所需要的事务日志信息,照烧一个。其扩展名为.ldf

主初始化数据文件大小至少为3
1.创建数据库:使用SQL语句

括号里面必须有以下的字段属性 不管主文件还是辅助文件,日志文件
        name='逻辑名',
        filename='文件的存放地址,绝对路径,相对路径',
        size=数据文件的初始大小,
        maxsize=数据文件的最大大小,
        filegrowth=文件的增长方式,



主数据文件和辅助数据文件


例如:
CREATE DATABASE CS
ON PRIMARY
-- 以下是声明主数据文件
(

name='f1',
-- 声明文件的路径及文件的扩展名,注意要和名称保持一致
filename='E:\SQLserverFile\f1.mdf',
size=3mb,
-- 设置文件无限制增长
maxsize=unlimited,
filegrowth=3%
),
(
-- 以下是辅助数据文件
name='f2',
filename='E:\SQLserverFile\f2.ndf',
size=10mb,
maxsize=400mb,
filegrowth=6mb
)
-- 以下是声明日志文件
log ON(
name='f3',
filename='E:\SQLserverFile\f3.ldf',
size=1mb,
maxsize=unlimited,
filegrowth=2%
)
CREATE database 计算机科学与技术
on PRIMARY(
name='软件工程',
filename='E:\SQLserverFile\Database\计算机.mdf',
size=3mb,
maxsize=unlimited,
filegrowth=3mb
),
(
name='网络工程',
filename='E:\SQLserverFile\Database\网络.ndf',
size=6mb,
maxsize=600mb,
filegrowth=2%
)
log on(

name='f3',
filename='E:\SQLserverFile\Database\软件.ldf',
size=1mb,
maxsize=unlimited,
filegrowth=2%
)

修改数据库:
修改数据库名称:语法如下:
alter database 原数据库名
modify name=新数据库名

-- 修改数据库的名字

alter DATABASE tsgl
modify name=计算机科学与技术学院


-- 添加一个辅助文件(add file)
-- 添加一个日志文件(add  log  file)

-- 在计算机科学与技术学院数据库下添加辅助文件和日志文件
alter database 计算机科学与技术学院
add file(
name ='Root',
filename='E:\SQLserverFile\test1\CS.ndf',
size=3mb,
maxsize=unlimited,
filegrowth=2mb
)

-- 添加日志文件
alter database 计算机科学与技术学院
add log FILE(
name='RootTest',
filename='E:\SQLserverFile\test1\CSS.ldf',
size=1mb,
maxsize=400mb,
filegrowth=4%

)


-- 删除数据库:
-- drop database 数据库名



DROP database 计算机科学与技术学院




第三章:表的操作

表的基本概念:在数据库中,表是有数据按照一定的顺序和格式构成的数据集合,是数据库的主要对象,每一行代表一条记,每一列代表记录的一个字段

在关系数据库中每一个关系都体现为一张表

堆土具体的某一张表,在创建之前,需要确定表的下列特征:
表要包含的数据的类型
表的列数,每一列中的数据的类型和长度
那些列允许为空值:

4.是否使用以及何处使用约束,默认设置和规则
那些是主键,那些是外键



数据类型:
大整型:Bigint
常用的整型:int
小整型:smallint:长度为2字节
Bit:是位类型  长度为1字节, 只能存0和1
decimal 两者类型完全系统,提供了小鼠所需的实际存储空间
Money:存储的货币值有8字节组成,前4字节代表整数部分 ,后4字节代表小数部分
smallmoney与money数据类型相似,但范围比money小,由4个字节组成


近似数字:float  Real

Datatime:表示日期和时间类型  存储日期为1753.1.1  --9999.12.31

字符串:char:定义形式为
char(n) 存储数据时,每个字符和符号占用一字节存储空间,n表示所有字符串所占的存储空间  取值1-8000,若不添加n的值系统默认
为1  如果定义了一个char类型,且允许该列为空,则该字段会被当做varchar来处理
varchar:定义形式为varchar(n) 同char类似,但是不同的varchar具有变动长度的特性

text:用于存储文本数据


unicode字符串:定义形式于为nchar(n)与char类似  

二进制字符串:
Binary:定义形式为binary(n)  数据存储长度是固定的,为n+4个字节,当输入的二进制长度小于n时,余下部分会填充0 ,常用于存储图像等数据

varbinary:定义形式为varbinary(n) 数据存储单位是变化的,为实际所输入的数据长度加上4字节
Image:用于存储照片或图画等




举例:创建表:

-- 先切换数据库
use 计算机科学与技术

-- 1.创建表:
-- 语法如下:

-- 创建表(学号,姓名,年龄,性别)

create table 学生表
(

学号 varchar(10) not NULL,
姓名 char(10) not NULL,
年龄 int null,
性别 char(5)

)



对表的操作写法:
数据库名字.DBO.表名 这个也是可以的


创建表之后,可以去更改最初创建表的时候定义的许多选项,这些选项包括:
添加,修改或删除列
可以添加或删除约束


1.添加(列)属性:
	alter table 表名
		add 属性 数据类型(长度)[null notnull]

2.修改数据类型:
alter table 表名
alter column 属性 数据类型

3.删除列属性:
alter table 表
drop column 属性

修改列名:
exec sp_rename '表名.列名','新列名'

修改表名:
	exec sp_rename '原表名','新表名'


-- 为学生表添加一个son列
alter table 学生表
add sno varchar(14)  not null

alter table 学生表
ADD age int  


-- 修改表中姓名数据类型
alter table 学生表
alter column 姓名 varchar(20)

-- 删除列
alter table 学生表
drop column sno



-- 修改列名
exec sp_rename '学生表.姓名','name'

-- 修改学生表为student
exec sp_rename '学生表','student'


约束:
1.主键约束:primary key 唯一确定表中每一条记录的标识符

2.外键约束 foreing key  用于建立和加强两个表数据主键的连接

3.唯一约束:unique(可以为空)
	指定一个列或多个列的值具有唯一性

4.检查约束:check
	设置基础条件,以限制输入值

5.默认约束Default
插入操作中没有提供输入值时系统会自动加上指定值



创建和删除约束:
1.创建约束的语法:

alter table 表名
add constraint 约束名 约束类型 具体的约束说明


2.删除约束:
alter table 表名
drop constraint 约束名
 
举例:
-- 对学号添加主键约束primary KEY
alter table student
add constraint PK_学号 primary key (学号)


-- 注意:一个表中只能有一个主键约束 如果多了就会报错

-- 为空的列不能创建主键约束

-- 检查约束
alter table student
add constraint CH_age check (年龄>18)

-- 对姓名添加一个唯一约束
alter table DISTRIBUTEDadd constraint UN_name UNIQUE (name)


-- 给性别添加默认约束为男
alter table student
add constraint DF_性别 default '男' for 性别

对员工信息表添加如下约束:
alter table 员工信息表
add constraint CK_年龄 check (年龄>18 and 年龄 <25)



2.
alter table 员工信息表
add constraint CK_部门 check(单位部门='软件测试' or 单位部门='前端')



外键约束:加强两个表之间的联系

例如 student表和employee表
create table 成绩表
(

学号 varchar(10) not null,
成绩 int 
)

-- 给成绩表的学号创建一个外键约束,参考学生表和成绩表之间的关联


alter table 成绩表
add constraint FK_学号 foreign key (学号)
references student(学号)


create table 成绩表
(

学号 varchar(10) not null,
成绩 int 
)

-- 给成绩表的学号创建一个外键约束,参考学生表和成绩表之间的关联


alter table 成绩表
add constraint FK_学号 foreign key (学号)
references student(学号)


注意:外键的长度一定要相同,不然就报错
        如果要创建外键约束,你们就要保证参与外键约束的列的数据类型要一致
        有用的列必须是主键约束或者唯一约束
		两个表的列名尽量保持一致
		
		
	删除约束:alter table 表名
		drop constraint 约束名
例如:
-- 删除默认约束
alter table student
drop constraint DF_性别

注意:要删除约束:如果被引用,要删除则必须处理这些问题


3.5创建表的同时创建约束

举例:-- 创建三个表

create table tsg1(
-- 这个就是在创建表的时候就声明主键
书号 char(20) primary key,
书名 char(20),
出版社 char(25),
类别 char(20),
作者 char(10),
出版时间 datetime,
价格 int check (价格>0)  --检查约束的语法
)



-- 创建第二个表
create table dz
(
编号  char(20) primary key,
姓名 char(20),
单位 char(20) default '计算机科学与技术学院', --默认约束的写法
性别 char(15) check (性别='男' or 性别='女') unique --唯一约束
)

-- 创建第三个表
create table jy
(

书号 char(20) foreign key REFERENCES tsg1(书号),--书号设置为外键约束  外键约束的声明
编号 char(20) foreign key references dz(编号),
借阅日期 datetime,
还书日期 datetime,
还书标识 char(2),

primary key(书号,编号)--联合主键的声明
)

第四章:T-SQL语言

基本概念:
1.标识符:数据库对象的名称即为其标识符
2.标识符的种类:SQLserver中标识符可以分为以下两种类型:

		1.常规标识符:符合标识符的格式标识
		2,分隔标识符包含在双引号或者中括号内
		
	常规标识符规则:第一个字符必须是下列字符之一:
	英文大小写字母 下划线或者数字数字符号
	注意:
	后续字符可以包括@符号,美元符号,数字符号,下划线
	标识符不能是保留字  不允许嵌入空格或其他特殊字符

批处理:批处理是一个包含一个或多个T-SQL语句的组,从应用程序一次性地地发送到SQLserver进行执行,SQLserver将批处理的语句编译为一个执行单元,称为执行计划。执行计划中的语句每次执行一条



注释:是程序代码中不被执行的文本字符串也称为备注
单行注释多行注释

1.常量:也称为文字值或标量值,是在程序允许过程中值保持不变的量,他是来表示一个特定数值的符号

2.字符串常量:括在单引号内并包含数字,字符
3.Unicode字符串:与普通字符串相似,但是前面有个N标识符
3.二进制常量:具有前缀0x并且是十六进制数字字符串
不使用引号引起
4.bit常量:使用数字0和1表示


变量是指在程序运行过程中可以改变的量
局部变量是用户自定义的变量,他用declare语句声明的,注意范围在程序内部,局部变量的名称是自己定义的,以@开头


局部变量语法如下:
declare @变量名字  变量类型
	...
	
	举例:-- 声明两个变量:
declare @name varchar(10) ,@age int

-- 声明局部变量,后要给局部变量赋值,可以使用set或select语句,赋值语法格式如下:

set @name=10	--set一次只能赋值一次,select一次可以赋值多个



-- 赋值:
set @name='张三'
set @age=18


-- SELECT
select @name='李四', @age=19

输出语句:print
向客户端发挥一个用户自定义信息,即显示一个字符串,局部变量,全局变量的内容
语法:




-- 声明两个变量:
declare @name varchar(10),@age int

-- 声明局部变量,后要给局部变量赋值,可以使用set或select语句,赋值语法格式如下:

set @name=10	--set一次只能赋值一次,select一次可以赋值多个



-- 赋值:
set @name='李白',
set @age=18


-- SELECT
select @name='李四', @age=19


-- 输出:
print @name
print @age


全局变量:是SQLserver系统内部事先定义号变量,不允许用户参与定义修改

用户也不能建立全局变量
全局变量的名字以@@开头
常见的全局变量可以查询文档
print @@version


运算符:+ - * / %取模运算

分析:
-- 算数运算符
declare @a int, @b int ,@z int
set @a=10 
set @b=4

-- 加减乘除
set @z=@a+@b
print @z




2.赋值运算符
3.位运算:是在两个表达之间执行为操作,这两个表达可以是任意两个整数类型的表达式


& 位与逻辑运算符
| 位或逻辑运算符
^ 位或运算
运算规则与数学逻辑一样

4.比较运算符

5.逻辑运算符。其运算结构发挥的是布尔类型的值即FALSE或TRUE 两个结果
between:如果操作数在某个范围内,那么结果为TRUE

in:如果操作数对于表达式列表中的一个,那么结果就为TRUE
like 如果曹组偶数与某种模式相匹配,那么结果为TRUE
not :对任何其他布尔运算符的结果取反
or:如果两个布尔值表达式中如何的一个为TRUE 那么结果为TRUE

加号:是字符串连接运算符,可以用他将字符串连接起来:
举例如下:
declare @name varchar(10)
set @name='你好!'
print '计算机科学与技术学院'+@name


一元运算符:+数值为正 -数值为负 ~逻辑飞 为反

8.运算符的优先级
1.一元运算符
2.乘除 取模 
3.+ 加 字符串连接运算符 -
4.比较运算符
5.逻辑运算符
6.赋值运算符

说明:若表达式中含有相同优先级的运算符,则从左向右一次处理。还可以使用括号来提供运算符的优先级,在括号里面的优先级最高




流程控制语句:语法如下
当流程控制语句必须执行一个包含两条或链条以上的语句块时,使用begin ...end语句
BEGIN

{
-- 这里面是代码块
-- 说明begin和end语句必须车队使用。如何一条语句均不能单独使用

-- 例如交换两个数字

DECLARE @x int,@y int @t int
set @x=1
set @y=2

set @z=@x
set @x=@y
set @y=@z
}
END

PRINT @x
PRINT @y


-- if ...else  如果条件为真,则执行条件表达式后面的T-SQL语句,当条件为假时,可以使用else关键字指定的SQL语句 语法如下:
declare @m int
set @m=12
if @m>0
	PRINT 'TRUE'
ELSE 
	PRINT 'FALSE'

-- 判断两个数的大小
declare @m int @n int
set @m=3
set @n=7
if @m>@n
	PRINT '成立'
ELSE
	PRINT '不成立'


-- where:当条件为正的时候可以重复执行循环语句,如果想循环执行的元祖命令,则需要配合begin...end 一起使用
-- 语法如下:求1
到1-10之间的整数和

DECLARE @x int,@y int
set @x=1
set @y=0
while @x	<10
		BEGIN
		set @y=@y +@x
		set @x=@x+1

		END
PRINT @y

循环结构while自居可以使用continue和Break命令控制循环中语句的执行,语法举例:


case语句:工具表达式的真假来确定是否返回某个值,可在允许使用表达式的如何位置使用这个关键字 case语句进行多个分支的选择
DECLARE @grade int ,@msg VARCHAR(10)
set @msg=
CASE 
	WHEN  @grade >=90 and @grade <=100 THEN   '优秀'
	WHEN @grade >=70 and @grade <90 then  '良好'
	WHEN @grade >=60 and @grade <70 then  '及格'
	WHEN @grade <60 THEN '不及格'
	ELSE '错误'
END
PRINT @msg


WAITFOR延迟语句,可以将他后面的语句在英国指定的时间间隔之后执行,或在未来的某一个指定的时间执行


第五章:DML语句

1.查询数据,添加数据,修改数据源

所谓查询,就是对已经存在于数据库中的数据按照特定的组合,条件或进行检索。初心功能是数据库有最基本也是最重要的功能

查询语句: select ...from...
	-- 查询语句的语法如下:
SELECT 学号
FROM 成绩表

SELECT 成绩
FROM 成绩表


-- 查询三列的情况
SELECT 学号,name,性别
FROM student

如果用户希望在初心返回结果中删除重复行,就可以在select自居中石油DISTINCT关键字
语法:
select DISTINCT 列名称 from 表名称

例如:
-- 去除重复的信息
SELECT DISTINCT 学号
FROM * from 学生信息表

top语句英语规定要返回的记录的数目
语法如下:

select top *(列名) from table
top n用于指定初心结果返回的行数
	
SELECT top 3
FROM 学生信息表
-- 这个语句读作查询前三行的信息


-- 结合去重复的语句的使用
-- 去掉重复的数据,后面的数据会往前补
SELECT distinct top 3 学号
FROM 学生信息表



使用别名查询:使用select语句初心数据时,可使用别名的方法工具需要对数据显示的标题进行修改
	1.在列的表达式中给出别名
	
	-- 例如:
SELECT 学号 'sno',成绩 'score'
FROM student

	2.使用=表达式

-- 使用=号
SELECT 'score'=成绩 FROM student

	3.使用as关键字来连接列表达式和指定的别名
	-- 使用as关键字来指定
SELECT 学号 AS 'score',成绩 AS 'score'
FROM student

计算列:在进行数据查询时,经常需要对查询到的数进再次计算

例如:
	
SELECT 学号,课程编号,成绩,'调整前的成绩'=成绩,
'调整后的成绩'=成绩-10
FROM student

选择查询:一般查询都不是针对全表石油行的查询,只是从这个表中选出满足指定条件的内容,这就要用到where字句
语法如下:
select 要查询的列
from 要查询的表 where 要查询的条件

1.比较搜索条件:
	例如:查询学号为2的学生信息
	select name
	from student where 学号=1
	
	例如:查询成绩及格的学生信息
    select name,成绩,班级
    from student where score>=60
    
   
 2.逻辑运算搜索条件:
 	and 两边要同时满足
 	or 两边条件满足其中一个即可
 	
 	例如:查询学生住址为北京,成绩合格的学生
 	select name,地址,成绩
 	from student
 	where 住址='北京' and 成绩>=60
 	
 	例如:查询学生住址为北京,成绩合格的学生
 	select name,地址,成绩
 	from student
 	where 住址='北京' or 成绩>=60
    
    
   3.范围叟座条件:范围搜索返回介于两个指定值之间的所有值,可范围包括范围和排他范围两种类型,用between,not between
   	例如:查询成绩在60到70之间的学生信息
   	select name,学号,班级
   	from student where 成绩 between 60 and 70
   	
   	4.列表搜索条件:in关键字使用户可以选择与列表中的任意值匹配的行
   	例如:查询学生地址在北京,云南的学生
   		select name,地址,学号
   		from student where 地址 in('北京','云南')
        
        
        
     5.搜索条件中的字符匹配符:like关键字搜索与指定模式匹配的字符串,日期或时间值。模式包含要搜索的字符串,字符串中可以包含4种通配符
     
     % 替换0个或多个字符
     - 代替一个字符
     [] 代替指定范围内的单个字符,[]中可以是单个字符
     [^] 代表不在指定范围内的单个字符,[ ^]中可以是单个字符
     
     
     例如:
     where 姓名 like 'W%'
     where 姓名 like '_W%'
     where 姓名 like [a-A]
     
     -- 查询姓王的学生
SELECT name 
FROM student WHERE name LIKE '王%'

-- 查询出姓名是两个字的学生
SELECT name
FROM student WHERE name LIKE '王_'

     
   	
    
    空值(null) 在数据库表示不确定的值 
    判断取值为空的语句格式为 
    where	列名: is	null
    	
    	
    判断取值部位空的语句格式为:
    where is not null
    
   -- 查询成绩为null的学生有哪些
SELECT *
FROM 学生成绩表
WHERE score IS NULL




-- 查询成绩不为空的信息情况
SELECT
*FROM 学生成绩表 WHERE score is not NULL

5.聚合函数:对异种族执行计算,并返回单个值。在SQLserver中有如下聚合函数
sum():计算列值的总和
avg():计算列的平均值
max():计算列的最大值
min():计算列值最小值
count(*):统计表值元祖的个数
count():统计本列值的个数,上数函数除了count(*)外,其他函数在计算过程中均忽略null值

语法如下:select 聚合函数 from 表名
    
    一次聚合函数存放位置只能在select字句后面,
    
    
    
-- 查询成绩不为空的信息情况
SELECT
*FROM 学生成绩表 WHERE score is not NULL




-- 求成绩的总和:
SELECT sum(score) as '总成绩'
FROM 学生信息表


-- 查询成绩的平均值
SELECT AVG(score) as '平均值'
FROM 学生信息表



-- 求成绩的最大值
SELECT MAX(score) as '最高成绩'
FROM 学生信息表


-- 求成绩的最低值
SELECT MIN(score) as '最小值'
FROM 学生信息表

-- 统计学生总人数
SELECT COUNT(name) as '总人数'
FROM 学生信息表

    
    
    
    
    
    
-- 	查询有成绩的学生的总人数
SELECT COUNT(DISTINCT name)
FROM 学生信息表



数据的分组:使用group by 语句用于结合合计函数,工具一个或多个列的结果集进行分组
语法格式:
	select 列名1,列名2....from 表名  group by 要根据那个列来分组的列名
	
	举例:查询每个年级的总人数和班级数量
	
	
	select 年级,sum(人数) as 年级总人数,count(班级编号) as 班级数量
	from 班级信息
	group by 年级
	
	
-- 例如:查询每门课的最高分和最低分
SELECT  name,成绩,MAX(成绩) as '最高分' ,MIN(成绩) AS '最小值'
FROM		成绩表
GROUP BY 成绩


having通常与group by字句一起使用,相当于一个用于组的where字句,制定组的搜索条件,having字句可以包含聚合函数,但是where不可以


举例:
select 学号,sum(成绩) from 成绩表
group by 学号
having sum(成绩) <600  这个语句读作查询按照学号进行分组当总成绩小于600的学生信息

order by语句用于对指定的结果集进行排序
order by语句默认升序
降序排序可以使用desc关键字
select *from 成绩表 order by 成绩[desc]

举例:
	-- 查看成绩表(升序 降序)
SELECT *
FROM 成绩表
ORDER BY 成绩

-- 按照降序排列
SELECT *
FROM 成绩表
ORDER BY 成绩 DESC



where字句可以使用的一些条件:比较运算符,逻辑运算符,范围运算符,列表运算符,字符匹配符

select... from ...where... group by ... having ..order by


表连接:在实际查询应用中,用户所需要的数据并不全在一张表中,可能存在多个表中,这个时候就需要使用多表初心
在数据库应用中,经常需要从多个相关的表中查询数,这就需要继续表连接

使用内部连接:内部连接是比较常用的一种数据连接查询方式

内部连接有一下两种语法形式:
方式一:
                                                    
	



-- 1.多表查询:初心学生的学号,姓名,性别,以及所在的班级名称和年级
SELECT 学生信息.姓名,学生信息.学号,学生信息.性别
班级信息.班级名称,班级信息.年级
FROM	学生信息,班级信息
WHERE	学生信息.班级编号=班级信息.班级编号




方式二:

-- 方式二:
SELECT	学生信息.姓名,学号,性别
班级信息.班级信息,年级
FROM		学生信息 inner join 班级信息
ON	学生信息.班级编号=班级信息.班级编号



多表查询首先要在各个表之间之间进行连接。用户在进行基本连接操作时,可以遵循以下基本原则

表连接:inner join连接
	一般用inner join 或join关键字指定内连接,又可分为等值连接,非等值连接
	
	1。等值连接:是在连接条件中石油比较运算符等于号来标胶连接的列值。其查询结果列称被连接表中的所有列
	2.非等值连接:是在连接条件中石油了除了单号外的其他比较运算符,来比较连接列的列值
	
	
	

-- 案例:查询成绩大于40的学生个人情况,并按照成绩降序排列
SELECT G.name,年龄,班级 , s.name,性别
FROM 成绩表 G innner join 学生信息表 s
ON G.学号=s.学号
AND G.成绩>40
ORDER BY G.成绩 DESC

内连接:只有匹配到相同的数据才会做输出
	
使用外部连接:外部连接会返回from字句中提到的至少一个表或视图中的所有行
		外部连接分为左外部连接,右外连接和全外连接
		
	
	
	左外连接对连接条件左边的表不加限制,右外部连接对连接条件中右边的表不加限制,全外连接对两个表都不加限制,所有两个表中的行都会包括在结果集	注意:先书写的是左表后书写的是右表
	
	左外连接:使用left outer join 关键字对两个表进行连接,左外连接的初心结果中包含指定左表的所有行,而不仅仅是连接列所匹配的行,如果左表的某行在有表中没有找到匹配的行,则结果集中的右表的相对应的位置为null
	
	举例:查询出所有学生的学号,姓名,课程编号,成绩
		-- 查询出所有学生的学号,姓名,课程编号,成绩
        SELECT	学生信息.学号,姓名,成绩表.课程编号,成绩
        FROM	学生信息表  left OUTER JOIN 成绩表
        ON 学生信息.学号=成绩表.学号


    
    右外连接:right outer join 关键字对两个表进行连接,右外连接是左外连接的反向连接
    
    
    
    
    完全连接:使用full outer join 关键字对两个表进行连接。这种连接方式返回左表和右表中所有的行,当某行在一个表中没有匹配的行时,则另一个表与之对应的相应列的值为null,如果表之间有匹配的行,则这个结果集合包含表的数据值
    
    案例:查询出每个班的所有情况:
    		select  班级信息.班级名称,年级,人数,
    		课程信息.班主任,课程名称,开课系列
    		from 班级信息 full outer join 课程信息
    		on 班级信息.班级编号=课程信息.班级编号
    
子查询在其他查询结果的基础上提供了一种有效的份上来表示where字句的条件
子查询是可以嵌套在	select insert update delete 语句中

子查询的select查询总是使用圆括号括起来的

子查询的分类:嵌套子查询 相关子查询

1.嵌套子查询:在SQLserver中子查询是可以嵌套使用的,并且可以在一个查询中嵌套任意多个子查询,即一个子查询中还可以包含另一个子查询,这种查询方式称为嵌套子查询

	例:查询计算机系学生选修那些课程
	解:select  *from sc
	where sno in(
			select 学号
			from student
			where sdept='计算机系'
	)
where字句后的条件要什么,子查询就查什么




例:查询了修了'c02'课程且成绩高于此课程的平均成绩的学生的学号和成绩
select sno,grade
from sc
where cno='c02' and grade>(
	select avg(grade)
	from sc
	where cno='c02'
)

例:查询选修了高等数学课程的学生的学号,成绩
	select sno,grade
	from sc
	where	cno in(
	select cno
	from course
	where cname='高等数学'
	)


相关子查询:这样的子查询只返回一个值,然后将一列值与查询返回的值进行比较

例:查询和ff在同一个班的学生的系
		先查询出ff学生所在的班级
		select S.学号,姓名,性别,C.班级名称,年级
		from	学生信息 as S ,班级信息 as C
		where S.班级编号=C.班级编号
		and S.班级编号 in(
		select 班级编号
	from 学生信息
	where 姓名='ff'
		)
	
    在查询基础创建新表:
    使用select....into 语句可以在查询的基础上创建新表
    语法为:select 选择列表
    		into 新表名
    		from 表名
    		
    		
    例:		在查询的基础上创建新的表
    		select *
    		into	学生信息2
    		from	学生信息
	这个语句读作在学生信息的基础上创建学生信息2这个表
	
	
	5.添加数据:在SQLserver中可以在表里面插入数据
			1.使用insert 和values插入行
			语法如下:insert into 表 values(字段1,字段2,字段3.....字段n)
            
            
            例子:在学生表中插入一个新的学生信息
                insert into student(学号,姓名,班级,性别,系别)
                values('12222','吴邪','计算机1班','男','计算机科学与技术学院')

            insert into student(学号,姓名,班级,性别,系别)
            values('1122','解雨臣','计算机2班','男','计算机科学与技术学院')
            
            多条数据插入:
            INSERT into 成绩表(学号,成绩)
VALUES('002','120'),
('003','120'),
('004','120'),
('005','120')

SELECT *FROM 成绩表


2.使用insert和select插入行
	在insert语句中使用select字句可以将一个或多个表或视图中的值添加到另一个表中。使用select字句还可以同时插入多行
	通过select语句生成的结果集,在结合insert语句,可以把结果集插入到指定的表中,这种方法用于插入的数据不确定
	
	语法如下:
		
		
		例如:
		create table 新学生信息(
		学号 varchar(50),
		班级编号 varchar(50),
		姓名 varchar(50)
		)
		insert into 新学生信息
		select 学号,班级编号,姓名 from 学生信息
		这个语句读作把查询到的信息数据放入新学生信息这个表中
		注意:新表中的所有列都要与原来表中相对于列的数据类型相同,一次可以直接从目的表中获取插入的数据到新表中
		
		使用where字句指定条件的insert select语句,将这些数据批量添加到目录
		
		例子:将成绩表中成绩大于70并且课程编号是1003的数据插入到成绩表2中
		create table 新成绩表
		(
		学号 varchar(50),
		课程编号 varchar(50),
		成绩 int
		)
		
		select *from 成绩表
		
		
		insert into 新成绩表
		select *from 成绩表
		where 成绩>70 and 课程编号='1003'
		
		
		修改数据:在SQLserver中可以进行表数据的修改
		
		
		语句:使用update 表名 set 列名=表达式
		set字句指定要更改的列和这些列的新值
		
		1.使用简单的update语句:
		例:update 成绩表
		set 成绩=90
		
		update 成绩表
		set 成绩=成绩+5
		
		带where字句的update语句
		例:假设将成绩为95并且在1002到1003之间课程编号的所有学生调动到学号是3的里面
		update 成绩表
		set 学号='3'
		whwer 成绩='95' and 课程编号 between '1002' and '1003'
		
	更新多列:使用逗号隔开即可
	例:在stu数据库中对成绩表进行重组和调整,原来编号在1003的课程1编号名称变为“晚上1003” 成绩为98
	
	update 成绩表
	set 课程编号='我是1003',成绩=98
	where 课程编号='1003'
	
	如果:条件不统一更改的值也不一样那么就分开来写
	例:更新课程编号为10001的行时,同时关系课程编号为1002的行,这个时候就要使用多个update语句
	
	update 成绩表
	set 成绩='89'
	where 课程编号='1001'
	
	update 成绩表
	set 成绩='88'
	where 课程编号='1002'
	
	
	例:将计算机系的全体学生的成绩加5分
	update sc
	set grade=grade+5
	where sno in(
	select sno
    from student 
    where sdept='计算机系'
	)
	
	
	
	删除数据:在SQLserver中使用delete语句删除数据
	可以删除一行或多行
	
	语法如下:delete from 表名 where 选择条件
	
例:从成绩表中删除成绩大于90分的记录
    delete from 成绩表2
    where 成绩>70
注意:如果不书写where那么这个表里面的数据就会被全部删除



删除固定行数据
例如:delete top(20) percent from 学生信息 这个语句读作删除前5行

	

第六章:视图


1.视图是基于某个查询结果的虚表,在SQLserver中可以创建标准视图,索引视图,分区视图
2.标准视图组合了一个或多个表中的数据,可以获得使用视图的大多数好处,包括将重点放在特点数据上及简化数据操作

3.索引视图是被具体化了的视图。即他已经经过计算并存储,索引视图尤其适合于聚合许多行的查询,但是他们不太适用经常更新的基本数据库集

4.分区视图在阳台或多台服务器水平连接一组成员表中的分区


视图优点:着重于特点数据,简化数据操作,自定义数据,导入和导出数据,跨服务器组合分区数据


使用create view语句来成绩视图,对应的语法如下
	
	例:成绩stu数据库中的表'班级信息'中所有记录的视图View班级信息
	create view 班级信息
	as select * from 班级信息
查看视图内容:
select *from 班级信息

视图T-sql语句重命名视图
1.使用sp_rename修改视图的名称
例:
Exec_rename 'View_班级信息','View_班级信息2'

修改列:
exec sp_rename 'View_班级信息2.人数','总人数' 这个语句读作把视图View_班级信息2下的人数列改为总人数

注意:对于表的所有操作,在表中同样可以使用

创建视图方式2:使用图形化工具创建:略

管理视图:向视图中插入记录

例:
insert into View_学生信息
values('2','12','aa','w','云南')
注意:在视图中的数据更改,原表中的数据夜壶随着更改


修改视图中的数据:使用视图可以修改数据
1.修改视图:
语法: alter view 视图名
as 
select statement

例:alter view 创建表
as
select 学号,成绩 from 成绩表

注意:alter既能修改数据也能修改内容



视图中不符合要求1的数据或是错误的数据,可以使用update语句进行修改


例:修改视图view_班级信息2中的人数80的班级编号改为80

update View_班级信息2
set 班级编号 ='28'
where 总人数=80


删除视图:
drop View  视图名称

删除多个视图
drop view 视图1,视图2,视图3...视图n

带有条件的删除
例:delete from view_班级信息2 where 人数=80

在创建视图后,如果不需要该视图,或想清楚视图定义以及相关联的权限,可以删除该视图

第七章:索引

1.索引:索引是对数据库表中一个或多个列的值进行排序的结果,索引有助于更快的获取信息,是用来定位的

对表中的列是否创建索引,以及创建何种索引,对于查询的响应速度会有很大的差别,创建索引的列就是立即响应,而不创建索引的列则需要很长时间去访问

在数据库系统中创建索引主要有以下作用:加快数据检索,保证数据的一致性,实现表与表之间的参照完整性,在使用group by order by字句进行查询时,利用索引可以减少排序和分组的时间

索引是否必须:创建索引需要占用数据空间并花费一定的时间
建立使用会减慢数据修改速度

创建索引要消耗一定的系统性能,因此要考察对某列创建索引的必要性

选择创建索引的数据列:定义有主键和外键的列
在指定范围中快速或频繁查询的列
连接中频繁使用的列
需要按排序顺序快速或频繁检索的列


索引的类型:按照索引的组织方式的不同,可以将索引分为聚集索引和非聚集索引
1.聚集索引:聚集索引确定表中数据的物理顺序,当以某列作为关键字举例聚集索引时,表中数据以该字段作为排序工具,即索引的顺序决定了表中行的存储顺序,因此每个表只能有一个聚集索引




2.非聚集索引:非聚集索引并不在物理上排列数据,即索引中的逻辑顺序并不等同于表中行的物理顺序,索引仅仅记录指向表中行的位置的指针,执行指针本身就是有序的,通过这些指针可以在表中快速定位数据


设计索引,应该考虑以下数据库准则
:1.应该表如果建有大量索引,会影响insert update delete语句的性能

2.避免对经常更新的表进行过多的所有,并且索引应该保持较窄
3.使用多个使用可以提高更新而数据量大的查询性能
对小表进行使用索引可能不会产生优化效果

若创建了主键约束或唯一约束时,系统将字段的为建有这些约束的列创建聚集索引
当删除主键约束或唯一约束时,这些列上创建的聚集索引也会被字段删除
若不指定索引类型,SQLserver将使用非聚集索引作为默认的索引类型



当同一个表中距离聚集索引和非聚集索引时,应先建立聚集索引
若先建立非聚集索引,在建立聚集索引时,系统会字段将非聚集索引删除,然后重新建立非聚集索引


创建索引:
方式一:在图形管理工具建立索引:略



方式二:SQL语句创建索引
语法:create 
.....index 索引名 on 表名 

unique 为表创建唯一索引
clustered:表示创建聚集索引,聚集的逻辑顺序决定表中对应行的物理顺序
nonclustered:创建非聚集索引
column:索引所基于的列


例:为student表建立非聚集索引
create nonclustered index index_人工
on student(学号)


聚集索引;
create unique clustered index index_单位部门
on student(学号)



删除索引:drop index 表名.索引名
例如:drop index student.sno

例:删除员工信息表的索引
drop index 员工信息表.index_单位部门
drop index 员工信息表.index_性别

你可能感兴趣的:(数据库,sqlserver,服务器)