第二篇
一、数据库回顾
##Microsoft SQLServer的每个数据库包含
1个主数据文件(.mdf)必须 / 任意多个次要数据文件(.ndf)
1个/多个事务日志文件( .ldf )必须。
1、文件组:
可将多个数据文件逻辑的分到一组
2、分离数据库:
在需要分离的数据库上(右键)----任务----分离
3、附加数据库:
在数据库节点上(右键)----附加
4、打开数据库之前,需打开数据库服务
##SQL语句入门(脚本、命令)
SQL(Structured Query Language)结构化查询语言
//print 输出文本 select 输入结果集
----‘字符串’用单引号 包含
---- 任何类型的值,都可以用‘单引号’包含
---- + 加号,首先是一个算数运算符,只有 + 两边都是字符串,才是一个连接符
(如果有一边是数值类型,系统会将另一个值做隐式的类型转换,如不可以转换即报错)
---- 不区分大小写(对关键字、值)
---- 赋值 和 逻辑相等 都使用 =
1、DML
Data Manipulation Language数据操作语言
(对数据进行增、删、改、查命令的操作)
select、insert、update、delete
2、DDL
Data Definition Language数据定义语言
(建库、建表、建约束,做结构)
create 创建、drop 删除、alter 修改…
3、DCL
Data Control Language数据库控制语言
(确保数据库 准确、安全,在默认sysadmin、dbcreator、db_owner有权力执行DCL)
grant授权、revoke收回权限…
二、代码 创建数据库
----使用 sql语句创建数据库和表,
(一)语法
create database 数据库名称
on primary ----on在哪个文件组上创建、默认在主文件组上创建 主数据文件 primary可省
( ----非可独立执行的SQL 命令,需在其结构中的这句后添加,逗号
name=‘逻辑名称_data’, ----逻辑名称后缀,数据文件_data、日志文件_log
size=初始大小, ----数值不包含在‘单引号’内
fileGrowth=增长方式, ----自增数值也不能用‘单引号’包含
maxsize=最大容量,
filename=‘全路径’ ----最后一句无,逗号、扩展名 .mdf
)
log on ----日志文件
(
name=‘日志名称_log’, ----日志文件后缀_log
size=初始大小,
fileGrowth=增长方式,
maxsize=最大容量,
filename=‘全路径’ ----扩展名 .ldf
)
(二)举例
【第一步:建库】
一、语法
【四、新建一个Test库】
create database Test
【五、主数据文件】
on primary ----primary可以省略
(
name=‘Test_data’,
size=3mb,
filegrowth=10%, ----每次增长10%
maxsize=100mb,
filename=‘D:TeresaTest_data.mdf’----主数据文件,全路径,逻辑名称_data.mdf
),
【六、设置文件组】数据放到不同文件组中
Filegroup userDe
【七、次数据文件】
(
name=‘Test_data1’,
filename=‘E:aaTest_data1.ndf’----次数据文件,逻辑名称_data.ndf
)
【六、日志文件(可多个)】
log on
(
name=‘Test_log’,
size=3mb,
filegrowth=10%,
---- maxsize=100mb, ----日志文件----般不限制最大容量
filename=‘D:TeresaTest_log.ldf’
)
二、创建数据库2补充
1、文件是否重复:判断依据是文件名是否重名//Test_data.mdf:后缀_data 拓展名.mdf
全路径:文件目录+文件名
2、 C 函数(在函数中写参数) 、 C# 对象.方法
三、使用代码启动xp_cmdshell
1、切换至当前数据库
use master -----master系统数据库,记录当前所有数据库
2、判断数据库是否存在
##判断数据库是否存在,存在即删除
----exists是判断(括号)中的语句是否具有返回值,有值返回true,否则false
if exisis (select * from sysdatabase where name=‘Test’)
3、删除数据库
drop database Test
go ----继续执行
4、代码创建文件夹
(1)通过代码true开启CmdShell
(右键)数据库----方面----外围应用配置器----XPCmdShellEnabled----True
----打开外部应用管理器
execute sp_configure
//master.sys.sp_configure存储过程
----开启高级选项
Execute sp_configure ‘show advanced options ’,1
//开启show advance options ,1开启 0关闭
//master.sys.sp_configure @configname varchar(35)=null, @configname int=null存储过程始终返回INT。
-运行RConFIGURE 语句进行安装
RECONFIGURE
----开启cmdshell,运行rconfigure安装
----将XPCmdShellEnabled打开true
Execute sp_configure ‘xp_cmdshell ’,1
RECONFIGURE
(2)调用存储过程xp_cmdshell,创建文件夹d:teresadatabase
execute xp_cmdshell ‘mkdir d:teresadatabase’
// xp:expansion扩充,master.sys.xp_cmdshell扩展存储过程
//执行 xp_cmdshell方法需要参数‘command_string’命令字符串 make
【第二步:建表】
一、手动创建数据表
1、选择某一个字段,设置列属性值
2、整数值才可以作为标识列
3、(右键)选择字段作为主键
二、使用代码创建数据表
1、语法:
----create table 表名
----(
----字段名称 字段类型 字段特征 (是否非空 标识列 默认值 主键 唯一键 check约束),
----字段名称 字段类型 字段特征 (是否非空 标识列 默认值 主键 唯一键 check约束)
----)
Eg:创建老师表Teacher Id、Name、Gender、Age、Salary、Birthday
2、选择 表
use Test
if exists(select * from sysobjects where name=’Teacher’)
drop table Teacher
go
3、建 表
create table Teacher
(
Id int identity(1,1) primary key, ----设置标识列identity(标识种子,标识增量),主键
Name nvarchar not null, ---- not null标记字段不能为null值。字符类型如果没有指定,默认长度为1.
Gender bit not null, ----1,0 男,女;其他方法:char[2]/nchar[1]-分配的空间以字节为单位
Age int check(age>0 and age<=100) not null, ----check约束,只能写notandor
Salsry money,----当一个字段可以为null的时候可以不写也可以写null
Birthday datetime not null default(‘2000-9-9’) –默认值default
)
三、数据完整性
(一)实体完整性
表的每一行数据称为一个实体,实体完整性是指 每一行记录时唯一的,不重复的。
1、标识列:系统自动生成,永不重复
2、主键:唯一 非空
3、唯一主键:唯一 但是可以为null,只能空一次。一个表的唯一键可以有多个
//(右键)表----设计----(右键)索引/键----添加----1.标识名称(eg:UQ_Test_Name)----2.类型(唯一键)----列(eg: Name(ASC))
Bit类型:视图 中 true、false;代码 中1、0
修改表后,需重启表才能执行
(二)域完整性
域是指字段,域完整性是为了保证字段的值 是合理和准确的。
非空,类型,check约束,默认值,关系(主外键约束)
//(右键)表----设计----(右键)CHECK约束----添加----1.标识名称CK_Test_Age----2.表达式(eg: age>0 and age<=100)
//(默认值在列属性中)表中选中值----列属性----默认值或绑定----(日期:默认值必须包含在‘单引号’内(‘2020-2-27’)// + - 默认为运算符)
(三)自定义完整性
用户自己定义的约束规则。
check约束 存储过程 触发器
//新建列必须允许为空,否则前面的数据无法执行
(四)引用完整性
一个一表的某个字段的值引用自另外一个表的某一个字段。被引用的表成为主表,引用表就是成为从表或者外键表。
//我teacher引用你classes,我就是引用表,你是被引用的表,你是主表,我是从表 也成为外键表(子类引用父类)
1.选择外键表去创建主外键关系
//teacher表----(右键)关系----添加----1.标识名称(FK_Teacher_Classes_Classid)----2.表和列规范(主表classes、外键表teacher)
2.建立主外键关系的字段类型和意义必须一致
//引用字段的类型是一致的
【添加新的约束(右键)外键关系----表和列的规范----创建或重新启动时检查现有数据----是/否--------破坏了数据的完整型】
3.建立关系的字段,主表中必须是主键或者唯一键
4.添加数据的时候先添加主表数据,再添加外键表
5.删除数据的时候先删除外键表数据再删主表数据
(五)关系建立的表的“级联“操作
//(右键)关系----insert和update规范----删除/更新规则----级联(删除主表,以及从表)/设置null(删除主表,从表对应设置为null,前提是该字段可以为空)
1.不执行任何操作:该报错就报错,能删除就删除
2.级联:删除主表记录,对应的从表记录也将被删除
3.set null:删除主表,从表对应记录的字段值=null,前提是这个字段可以设置为null
4.set default:删除主表,从表对应记录的字段值=设置的默认值,前提是这个字段已经设置默认值。
四、使用代码创建主外键
(一)代码创建约束
先用设计器创建约束、再用代码创建约束。数据库约束是为了保证数据的完整型(正确性)而实现的一套机制。
种类:
主键约束(PK) primary key constraint 唯一 且不为空
唯一约束(UQ) unique constraint 唯一 允许为空,只能出现一次
检查约束(CK) check constraint 范围以及格式限制
默认约束(DF) default constraint 默认值
外键约束(FK) foregin key constraint 表关系:保证外键值来源于主键
增加外键约束时,设置“级联“更新/删除:
[ON DELETE {NO ACTION | CASCADE | SET NULL | SET DEFAULT}]
[ON UPDATE {NO ACTION | CASCADE | SET NULL | SET DEFAULT}]
(二)创建约束语法
alter table 表名
add constraint 约束名称(以简写作为前缀_表_名称) 约束的类型 约束的说明(字段 表达式 值)
//check接表达式、键key接阶段、default接值
1.将id设置为主键
alter table Teacher
add constraint PK_Teacher_id primary key(Id)
2.设置name为唯一键
if exists (select * from sysobjects where name=’UQ_Teacher_Name’)
alter table teacher drop constraint UQ_Teacher_Name
alter table teacher
add constraint UQ_Teacher_Name unique(name)
3.设置年龄0~100之间
alter table teacher
add constraint CK_Teacher_Age check(age>0 and age<=100)
4.为birthday添加默认约束值
alter table teacher
add constraint DF_Teacher_Birthday default(‘2000-2-2’) for birthday
----for是说明为哪一个有字段添加默认值
5.为classid添加外键约束
alter table teacher ----从表的某一个字段引用主表的某一个字段
add constraint FK_Teacher_classid foreign key(classid) references classes(cid)
五、数据插入Insert
(一)insert语法
语法:方法调用(一一对应:顺序对应、数量对应、类型对应)
insert [into] 表名 (字段列表) values(值列表)
[中括号]表示可有可无,定义方法有默认值时
说明:标识列值不管什么时候都不可能插入值,同时插入的值需要满足表的所有完整性约束
(二)举例
1.为表的所有字段添加值,如不指定字段列表,那么默认需要为所有字段添加值
insert into Teacher vaules(‘aa’,1,1,20,5000,’2020-1-2’)
insert into Teacher vaules(‘张感动’,1,1,20,5000,’2020-1-2’)
//视图里面写true/false,代码里面写1/0
2.值不能违反表的约束
insert into Teacher vaules(‘张三’,1,5,200,5000,’2020-1-2’)
3.1.也可以指定为哪一些插入值 ----列名或所提供值得数目与表定义不匹配
insert into Teacher(Name,Gender,Classid,Birthday) vaules(‘张四’,1,6,’2020-1-2’)
3.2 INSERT 语句中列的数目大于VALUES子句中指定的值的数目。VALUES子句中值的数目必须与INSERT语句中指定的列的数目匹配
insert into Teacher(Name,Gender,Classid,Birthday) vaules(‘张四’,1,6)
//此处Birthday具有默认约束值,可不填
4.非空字段一定需要插入值,除非它有默认值
insert into Teacher(Name,ClassId) values(‘张五’,6)
5.如果一个字段可以为null或者有默认值,那么在插入的时候也可以:可以为空字段赋值null,默认值字段赋值default
insert into Teacher values(‘张6’,1,6,null,null,‘1990-8-15’)
insert into Teacher values(‘张7’,1,6,null,null,default)
6.所有值都可以使用’单引号‘包含,如字段的类型为数值,系统会自动类型转换。
insert into Teacher values(N’张8’,‘1’,‘6’,‘30’,‘3000’,‘1990-8-15’)
7.字符类型的字段值没有使用’单引号‘
(1)如果是非数值字符报错,如果纯数字字符串OK
insert into Teacher values(8,‘1’,‘6’,‘30’,‘3000’,‘1990-8-15’)
(2)如果是日期值没有使用’单引号‘包含,自动取值系统默认日期
insert into Teacher values(‘张9’,‘1’,‘6’,‘30’,‘3000’,1990-8-15)
六、数据更新(数据修改)Update
(一)知识点
1、更新一个列
update Student
set sex=‘男’
2、更新多个列
update Student
set sex=‘女’,age=‘18’,birthday=‘1990-12-21’
3、更新部分数据
update Student
set ClassId=4, where ClassId=1
//SQL中等于判断用单个=等号
4.Where中还可以使用复杂的逻辑判断
update Student set
Age= 30 where Name=‘张三’ or Age<25 ,
//or相当于C#中的 || 或者
5.所有学生的年龄加1
update Student set Age= Age + 1
6.Where中可以使用的其他逻辑运算符
or ( || )、and (&&)、not ( ! )、<、>、>=、<=、<>(不等)
7.增加、只能对于单表进行操作,查询是可多表的
8.数据库的操作一旦操作就不会被更改,除非做备份和删除
【+=】
Salary=salary+1000 ----- salary+=1000
【 a+=b & a=a+b 区别】
在Java语言中,主要的区别是在运算精度。-=、*=、/=,%=都是一个道理。
1、= 赋值运算符
编译器将右边的表达式计算结果后,和左边的变量类型比较精度,如=等号左边变量的精度<低于右边结果的精度,编译器会显式的报错,需强制转型。(若a精度类型弱于b,a = a + b出错,编译检查报错)最后将表达式的结果复制到变量所在的内存区。
2、+= (是一个)运算符
编译器自动隐式,向高精度进行数据类型转换。直接将+=运算符后面的操作数强制转换为前面变量的类型,在变量所在的内存区,根据右边的操作数修改左边变量内存存储的二进制数值,最后达到和赋值运算符相同的目的。由于后者是位操作,效率也较前者高。
3.总结
区别:+=可以数据类型的自动转换
(1)两操作同类型:运算结果无差别;(2)两操作不同类型:+=操作数据精度高。
【+=与=+的区别】
- += 是简写,a += 1就是a = a+1
- =+ 是对其赋值,±符号代表的是正负(可以省略不写),即a =+ b其实就是a = b。
(二)update语法
数据更新:更新后的数据不能违反 表的约束
语法:
update 表名
set 字段=值(表达式),字段=值
where 条件(一般能够做条件的是主键,唯一键,标识列)
(三)举例
1、修改张8 的班级为7
update Teacher set ClassId=7 where Name=‘张8’
2、修改张8 性别 修改为女,同时将年龄修改25 将工资加1000蚊
update Teacher
set Gender=0,Age=250,Salary+=1000
where Name=‘张8’
3、判断多条件 not and or ,修改性别是男同时是7班,将工资+500
update Teacher
set Salary+=500
where Gender=1 and ClassId=7
七、数据删除Delete
(一)知识点
1、删除表中全部数据
delete from Student
2、Delete只是删除数据,表还在,和Drop Table不同。
3、Delete 也可以带where子句来删除部分数据
delete from Student where Age > 20
4、truncate table Student 作用与delete from Student ----样,都是删除Student表中的全部数据,区别在于︰
(1)truncate语句,高效
truncate操作采用按最小方式来记录日志,所以效率非常高。
//对于数百万条数据使用truncate删除只要几秒钟,而使用delete则可能耗费几小时。
(2)truncate语句,表中自动编号重置为默认值。
(3)truncate语句,不触发delete触发器。
(二)delete语法
1、数据删除 不能删除某一列,因为删除是对记录而言
2、delete删除 是一条一条删除,每一次删除都会将操作写入到日志文件,效率低
3、标识列的值不会从种子重新计算
4、可以触发触发器
语法:
delete [from] 表 where 条件
(三)举例(delete/truncate)
1、delete
(1)删除姓名为8的人
delete from Teacher where Name=‘8’
(2)多条件删除
delete from Teacher where ClassId=6 and Gender=0 and Age>20
(3)删除所有数据
delete from Teacher
2、truncate
(1)一次性删除所有记录,日志文件以最小化的方式写入,效率高。
(2)标识列从种子值重新计算
(3)不可以触发触发器
语法:
truncate table 表 (不能添加条件,因为它不是一条一条删除,而是一次性删除所有记录,不关注删除的条数)
举例:
truncate table teacher
八、数据检索(初级)Select
Select总共6个关键字,每一个关键字只能出现一次,每一个关键字的顺序是不变的
(一)知识点
1、检索 表
SELECT FROM Student
2、检索 列
SELECt Name FROM Student
SELECt Name,Age FROM Student
3、列别名AS
SELECt Name AS姓名,Age AS年龄,Birthday AS出生日期FROM Student
4、where检索
SELECt Name FROM Student WHERe Sex= 女’。
5、检索不与任何表关联的数据
select 1+1 ;
select getdate() ;
(二)select语法
语法:
select 字段列表/ from 表列表 where 条件
(三)举例
1、查询所有信息 *
Select *
from Teacher,Classes
where Teacher.ClassId=Classes.CId
2、查询指定的列
select Id,Name,Salary from Teacher
3、指定查询的条件:查询女老师、年龄小于30
select * from Teacher where Gender=0 and Age<30
4、为列指定中文别名:只是结果集的显示,不会修改原始的表结构
select Id as 工号, Name 姓名, 工资=Salary, 公司=‘传智’
from Teacher
where Gender=0 and Age<30
//别名的三种方法:(1)as (2) (3)列名=值
//值为字符串时,用‘单引号’包含
5、select 可以输出,只不过输出是结果集–以表的形式显示
select 1+1,2,3,4,5
#数据库的分离和附加(以及脱机联机)



