SQL server学习(一)数据库的基本知识、基本操作和基本语法
在软件测试中,数据库是必备知识,假期闲里偷忙,整理了一点学习笔记,共同探讨。
阅读目录
基本知识
数据库到底是有什么作用?看下图应该就明白了。
就是应用程序发送请求操作时,到服务器数据库中查询数据,然后再返回给应用程序。
数据库起到的作用是存储数据、检索数据、生成新的数据,相对应的要求是:统一、安全、性能。
数据库可以存储大量数据,方便检索和访问,能保持数据信息的一致、完整,共享和安全,通过组合分析,产生新的有用信息。
数据库发展史
万物生长,如今使用的数据库也不是一蹴而就,也是慢慢发展而来。可分为四个阶段:
①萌芽阶段—文件系统,只是使用磁盘文件来存储数据
②初级阶段—第一代数据库Access,是网状模型和层次模型数据库
③中级阶段—第二代数据库SQL server、Mysql,是关系型数据库和结构化查询语言
④高级阶段—新一代数据库Oracle,是“关系-对象”型数据库
当下最流行的数据库是Oracle、SQL server、DB2
Oracle是“关系-对象”型数据库,它的特点是产品免费、服务收费
SQL server是关系型数据库,多版本,易用性好
DB2支持多操作系统、多种类型的硬件和设备
数据库名词
DBA—–数据库管理人员
DB——-数据库
DBMS–数据库管理系统
系统数据库:master、model、tempdb、msdb,不能随意更改
数据文件为.mdf或.ndf
日志文件为.ldf
数据的默认路径为:C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data
SQL组成
DML(数据操作语言)
——查询、插入、删除和修改数据库中的数据;
——SELECT、INSERT、 UPDATE 、DELETE等;
DCL(数据控制语言)
——用来控制存取许可、存取权限等;
——GRANT、REVOKE 等;
DDL(数据定义语言)
——用来建立数据库、数据库对象和定义其列
——CREATE TABLE 、DROP TABLE 等
TCL (事务控制语句)
变量说明、流程控制、功能函数
——定义变量、判断、分支、循环结构等
——日期函数、数学函数、字符函数、系统函数等
数据库基本操作
登录数据库
在安装成功后,在开始菜单中会看到如下所示文件夹:
点击SQL server management studio,即可出现如下登录界面:
数据库远程连接设置
第一步,打开外围配置器设置
第二步,进行相应设置
第三步,进行连接操作
数据库的分离操作
分离是指默认情况下数据库在联机状态下我们不能对数据库文件进行任何复制删除等操作,如果将数据库分离的话就可以对数据文件进行复制、剪切、删除等操作了。一般想直接备份数据文件,就先分离数据库,之后把数据文件复制到别的地方,再把数据文件附加回去就可以了。
操作如下所示:
先将数据库进行分离操作:
完成上述操作,数据库便分离成功,然后就可以做相应的复制等操作了。
分离也可以使用代码实现,如下
sp_detach_db demo
再将分离的数据库附加到工作面板:
附加也可以使用代码实现,如下:
sp_attach_db demo
数据库的脱机、联机操作
脱机与联机是相对操作,先要有脱机才能执行联机操作,与分离不同的是,脱机后的数据库只是不能被访问了,但还在工作面板中,但分离后的数据库,是不存在工作面板中的。当要再想使用该数据库,脱机状态的数据库只需要联机即可,分离的数据库需要附加才可以。
脱机操作如下:
脱机也可使用代码实现,代码如下:
alter database demo set offline
联机操作如下:
联机也可使用代码实现,代码如下:
alter database demo set online
数据库收缩操作
收缩是把数据库以及日志的内存收缩
操作如下
收缩数据库操作:
收缩日志文件操作:
收缩文件也可使用如下命令:
DBCC ShrinkFile(\'数据库名\', targetsize); /* 收缩数据库文件 */ DBCC ShrinkFile(\'数据库名_log\', targetsize); /* 收缩日志文件 */
需要注意的是:
Targetsize:单位为兆,必须为整数,DBCC SHRINKFILE 尝试将文件收缩到指定大小。
DBCC SHRINKFILE 不会将文件收缩到小于“实际使用的空间”大小,例如“分配空间”为10M,“实际使用空间”为6M,当制定targetsize为1时,则将该文件收缩到6M,不会将文件收缩到1M。
收缩数据库可使用如下命令:
DBCC SHRINKDATABASE(数据库名,百分比)
此处的百分比:即“收缩后文件中的最大可用空间”,取值范围“大于等于0, 小于100%”,实际使用中设为0即可。
数据库的备份、还原操作
备份操作是为了保证数据的完整性以及避免异常操作而导致数据无法挽回的操作,个人觉得是非常非常有必要的。
数据库的备份分为如下几种:
完全备份: 备份全部选中的文件夹,并不依赖文件的存档属性来确定备份那些文件。(在备份过程中,任何现有的标记都被清除,每个文件都被标记为已备份,换言之,清除存档属性)。完全备份也叫完整备份。
差异备份: 差异备份是针对完全备份:备份上一次的完全备份后发生变化的所有文件。(差异备份过程中,只备份有标记的那些选中的文件和文件夹。它不清除标记,即:备份后不标记为已备份文件,换言之,不清除存档属性)。
事务日志备份: 在特定事务日志备份之前执行的完整数据库备份和上次差异备份(如果有)。在完整数据库备份之后执行的所有事务日志备份或在特定事务日志备份之前执行的差异备份(如果您还原了差异备份)。如果你设置了恢复模式为【简单】,你将无法使用【事务日志】备份。SQL Server 2000 和 SQL Server 2005: 创建事务日志备份,您必须使用完整恢复或大容量日志记录恢复模型。
备份操作如下,此处选择的是完整备份:
还原数据库操作
权限设置
权限设置就是设置登录名和用户名操作。
登录名与用户名的区别:
1.登录名是指可以使用新建的登录名和密码登录数据库这个程序软件,但不能打开或展开用户自己创建的数据库;
2.用户名是在登录名基础上,为用户自己创建的数据库新加的可查看用户,但要进行增查改删操作仍然需要为该用户添加使用权限。用户名可以与登录名相同,也可以不同。一个数据库可以拥有多个用户,一个用户也可以访问多个数据库。
先以sa为登录名登录做如下操作:
创建登录名:
使用刚创建的登录名登录,去使用由sa用户创建的数据库,发现不可用:
创建用户,分配权限
添加好后就可以对sa创建的数据库进行操作了
基本语法
说了这么多,再来看数据库语法怎么操作,数据库四大操作,就是增删改查。在做这些操作的时候,首先得要有个数据库,有张表,这样才可以操作。把问题简单化,想成平时的档案室。数据库就是档案室,可以存放很多档案,表就是档案袋中的文件。
创建数据库
建数据库和建表操作可手动创建,也可以使用代码创建,先看手动创建:
手动创建数据库操作如下:
完成上述两步就已经创建好一个数据库了。
在使用代码操作的时候,需要先做如下所示操作,并连接:
使用代码创建数据库,实现如下:
create database demo
use demo
还有一种创建数据库语法,就是指定数据库文件参数和日志文件参数,语法如下:
create database 数据库名 on [primary] ( <数据文件参数> [,…n] [<文件组参数>] ) [log on] ( <日志文件参数> [,…n] )
举例如下:
CREATE DATABASE stuDB ON PRIMARY --默认就属于PRIMARY主文件组,可省略 ( NAME=\'stuDB_data\', --主数据文件的逻辑名 FILENAME=\'D:\project\stuDB_data.mdf\', --主数据文件的物理名 SIZE=5mb, --主数据文件初始大小 MAXSIZE=100mb, --主数据文件增长的最大值 FILEGROWTH=15% --主数据文件的增长率 ) LOG ON ( NAME=\'stuDB_log\', FILENAME=\'D:\project\stuDB_log.ldf\', SIZE=2mb, FILEGROWTH=1MB ) GO
若一次性要创建多个数据库或多个日志文件,在小括号外加个,号即可
创建表
手动创建表,操作如下:
保存输入表名即可
使用代码创建表如下:
代码为:
create table demo ( nname nchar(10), age tinyint, sex int )
数据库和表已经创建好了
首先来看增
1、插入一条数据:
方法一:安照列名依次给出数据值,不能交换顺序,数据类型不能出错
insert into demo
values
(\'zhang\',25,1)
方法二:
insert into demo
(nname,age,sex)
values
(\'san\',18,0)
方法三:交换顺序,数值按照列名给就行
insert into demo
(nname,sex,age)
values
(\'san\',1,22)
方法四:没给数值的列显示null
insert into demo
(nname)
values
(\'li\')
2、插入多条数据:
使用select,union是指连接的意思
insert into demo(nname,age,sex)若不写列名,则默认插入所有列数据 select \'wang\',28,0 union select \'wu\',30,1
3、插入一列
alter table demo add sex int
4、复制demo表中数据到demo1表中:
insert into demo1(nname,nage,asex)
select nname,age,sex
from demo
注意事项
1:每次插入一行数据,不可能只插入半行或者几列数据,因此,插入的数据是否有效将按照整行的完整性的要求来检验;
2:每个数据值的数据类型、精度和小数位数必须与相应的列匹配;
3:不能为标识列指定值,因为它的数字是自动增长的;
4:如果在设计表的时候就指定了某列不允许为空,则必须插入数据;
5:插入的数据项,要求符合检查约束的要求
6:具有缺省值的列,可以使用default(缺省)关键字来代替插入的数值
其次来看删
删除某一行:
delete from demo
where nname=\'li\'
删除某一列:
alter table demo
drop column sex
删除整张表:
delete from demo --不加where条件就是删除整个表
清空整张表:
truncate table demo
注意:删除整张表操作和清空整张表操作对比
删除是删除了所有,包括表结构
清空只是清空了表中数据,但表结构还在,清空速度快些
删除数据库
drop database new
还可以先查询是否有该数据库,再做删除操作,代码如下:
if exists(select * from sys.databases where name=\'new\') drop database new
做了一个if判断,sys.databases是指整个系统数据库,删除数据库的前提条件是,要删除的这个数据库没有被使用
然后来看改
update demo set age=\'28\' where nname=\'zhang\'
set是设置要改的数据
改多列数据:
update demo set nname=\'zhao\', age=\'13\', sex=\'0\' where nname=\'li\'
最后就是查询
查询表中所有数据,*代表所有列:
select *
from demo
查询表中某一行所有数据:
select *
from demo
where nname=\'li\'
查询表中某一行某一列的数据:
select age
from demo
where nname=\'li\'
查询出来的结果列用as取别名:
select age as \'年龄\'
from demo
where nname=\'li\'
查询出来的结果列用=取别名:
select wname = nname
from demo
注意:wname是新列名,nname是表中已存在的列名
添加约束
约束目的:保证数据的完整性和有效性
约束分为如下几种:
1.主键约束:唯一非空(特点) primary key PK_
一个表里面只能存在一个主键
允许存在把两列作为一个主键
2.默认约束:默认值 default key DK_
当不填数据时默认采用设定好的值
3.唯一约束:数据不重复,允许一行数据为空 Unique Key 唯一允许一个为空
4.检查约束:用来检查填入的数据是否满足要求 Check Key
5.非空约束:不能为空 not null
6.外键约束:外键指的是,表A中的id为主键,但在表B中id不是主键,表A的id就是表B的id外键。
外键语法:
alter table 表名 add constraint FK_字段名--"FK"为外键的缩写 foreign key (字段名) references 关联的表名(关联的字段名) --注意\'关联的表名\'和\'关联的字段名\'
添加约束有三种方式,分别是建表中(在列名中添加和不在列名中添加),建表后
方法一:建表中在列名中添约束,语法为:列名 数据类型 约束条件,代码如下:
create table dome5 ( sid smallint primary key, sname nchar(10) not null default \'zhangsan\', saddre nvarchar(20), sage tinyint unique key, semail char(20) check (semail like \'%@%.%\'), createtime datetime default getdate() )
方法二:建表中不在列名中添加约束,语法为:constraint 约束名 约束语法,代码如下:
create table stdent2 ( sid int, sname nchar(15) not null default \'zhangsan\', saddress nvarchar(30), sage tinyint, semail char(20), stime datetime default getdate(), constraint PK_sid primary key(sid), constraint CK_sage check (sage>10), constraint CK_semail check (semail like \'%@%.%\') )
需要注意的是:默认约束只能在 列名 数据类型 后面添加,意思就是默认约束要使用在方法一添加
方法三:建完表后再添加约束,代码如下:
alter table stu
add constraint ck_ssex check (ssex=0 or ssex=1)
alter是修改表结构
数据类型
数据类型如下表所示:
分类 |
备注和说明 |
数据类型 |
说明 |
二进制数据类型 |
存储非字符和文本的数据 |
Image |
可用来存储图像 |
文本数据类型 |
字符数据包括任意字母、符号或数字字符的组合 |
Char |
固定长度的非 Unicode 字符数据,效率高 |
Varchar |
可变长度非 Unicode 数据,节省空间 |
||
Nchar |
固定长度的 Unicode 数据 |
||
Nvarchar |
可变长度 Unicode 数据 |
||
Text |
存储长文本信息 |
||
Ntext |
存储可变长度的长文本 |
||
日期和时间 |
日期和时间在单引号内输入 |
Datetime |
日期和时间 |
数字数据 |
该数据仅包含数字,包括正数、负数以及分数 |
Bigint、int、smallint、tinyint |
整数 |
float、real |
数字 |
||
货币数据类型 |
用于十进制货币值 |
Money |
|
数值类型 |
例:stuid numeric(18,0),代表18位数字,小数位数为0,属于浮点类型 |
numeric (18,0) |
|
标识列 |
identity(起始值,递增量) |
identity(1,1) |
自动递增 |
Bit数据类型 |
表示是/否的数据 |
Bit |
存储布尔数据类型 |