知识点:使用SQL语句创建完整版数据库、使用SQL语句创建表、数据库表创建好以后新增加字段、修改字段、删除字段的方法。删除数据库表和数据库的方法。
需要掌握的知识:
SQL Server数据库第一课:常用数据库介绍、数据库基本概念了解、登录SQL Server数据库的方法
SQL Server数据库第二课:创建数据库表、完善数据库表的设计、建立数据库表之间的关系
SQL Server数据库第三课2:使用create语句新建数据库、数据库表
部分英语单词代表的意思:
database:数据库 | table:表 | column:列 | create:创建 | use:使用 |
primary:主要的 | unique:唯一的 | check:检查 | default:默认 | identity:标识列 |
not null:非空(不允许为空) | alter:修改 | add:增加 | drop:删除 | constraint:约束 |
foreign:外键 | references:参考(引用) | key:键 |
1、使用SQL语句创建完整版数据库
1.1 回顾:在图形界面创建数据库时,我们所进行的一些设置
分析:数据库名称,我们自己起的。系统会根据数据库名称,默认有两个文件(主数据文件和日志文件),我们还可以设置这两个文件的初始大小、自动增长/最大大小、保存路径。
1.2 使用SQL语句创建数据库(完整版)
第一步:在SSMS的工具栏点击【新建查询】。
第二步:编写SQL语句
注意:
- --(两个短横线)是SQL语句的单行注释(绿色文字部分)
- 创建数据库时,分别设置主数据文件和日志文件的相关内容(文件名、文件物理路径、文件初始大小、最大值、增量)
- 不同项之间用英文逗号隔开
- 文件增量,可以直接指定数字+mb,也可以用百分比表示,如10%、20%等
--创建数据库StudentDB
create database StudentDB --创建数据库
--创建主数据文件的SQL语句
on primary( --主数据文件默认属于primary文件组,因此可以省略primary
name='StudenDB', --主数据文件的逻辑名称(数据库名称)
filename='D:\wangdi\StudentDB.mdf', --主数据文件的物理名称
size=8mb, --主数据文件的初始大小,是8mb
maxsize=100mb, --主数据文件增长的最大值,是100mb
filegrowth=10% --主数据文件自动增量,是10%
)
--创建主数据文件的SQL语句
log on(
name='StudenDB_log', --日志文件的逻辑名称(数据库名称_log)
filename='D:\wangdi\StudentDB_log.ldf', --日志文件的物理名称
size=1mb,
maxsize=unlimited,
filegrowth=64mb
) --以上语句都写完以后,再执行
验证:在对象资源管理器中刷新,可以看到新创建的数据,在数据库StudentDB上单击右键查看属性,可以看到该数据的相关信息。
2、使用SQL 语句创建数据库表(包含主键、标识列、默认值、check约束的设置)
2.1 回顾在图形界面创建数据库表
分析:数据库表在设计时主要考虑到列名、数据类型、列属性(是否为空、是否有默认值、是否是标识列)、主键、check约束、是否有外键(两个表之间的关系)。
2.2 使用SQL语句创建数据库表(完整版)
注意:
- 想在某个数据库里创建表,首先要use该数据库,否则可能将表创建在其他数据库里 。
- 创建数据库表的语法:create table 表名(); 将每一列的设置写在括号里,不同列之间用英文逗号隔开。
- 每一列的设置:列名 数据类型 属性设置1 属性设置2 属性设置n ……
- 设置某一列为主键,直接写primary key即可
- 设置某一列为标识列:首先数据类型必须是数字类型,直接写identity(标识种子,标识增量)
- 设置某一列不允许为空:直接写not null即可
- 设置某一列有check约束:直接写 check(约束条件) 即可
- 设置某一列有默认值:直接写default(默认值)即可
- 设置某一列是唯一键:直接写unique即可。unique约束的字段中不能包含重复值,如电话、身份证、学号等不允许出现重复。唯一键一般和not null配合使用,确保每一行数据在该列的取值都是唯一的,一般电话号码、身份证号可以设置唯一键。一个表里只能有一个主键,但是可以有多个唯一键。主键不允许为空,唯一键允许为空(但是一个表里如果唯一键允许为空,那也只能有一行数据该列取值为空,否则认为空也是重复的,不允许插入)
--使用数据库StudentDB
use StudentDB; --想在某个数据库里创建表,首先要use该数据库,否则可能将表创建在其他数据库里
--创建数据库表StudentInfo
create table StudentInfo(
StudentNo int primary key identity(1831301,1), --学生编号列,整数类型,主键,是标识列,标识种子1831301,标识增量1
Names nvarchar(20) not null, --学生姓名列,字符类型,可变长度20字节,不允许为空
Gender char(2) check(Gender='男' or Gender='女' ) not null, --学生性别列,字符类型,固定长度2字节,只允许填写男或女,不允许为空
GradeId int not null, --学生年级列,整数类型,不允许为空
BornDate datetime, --出生日期列,日期类型,允许为空
Phone nvarchar(20) unique not null, --学生电话列,字符类型,可变长度20字节,唯一键,不允许为空
Addres nvarchar(50) default('湖北武汉') --学生地址列,字符类型,可变长度50字节,默认值“湖北武汉”,允许为空
);
3、使用SQL 语句修改数据库表(新增加字段、删除字段、修改字段)
常见问题:新创建了表,并且执行以后,发现需要修改表的内容,很多人直接在原来的表上修改(如果不执行不会有任何作用),如果点击执行,会报错。
举例:将上面创建的表,出生日期列,设置为不允许为空,再次点击执行时,系统提示“消息 1801,级别 16,状态 3,第 2 行
数据库 'StudentDB' 已存在。请选择其他数据库名称。”
:
错误原因:在同一个数据库中,不允许出现同名的表。
解决办法:
- 给表换一个名称再执行(最简单最直接,但是会新创建一个表,后期管理比较麻烦)
- 使用SQL语句,修改表的结构(推荐使用)。
3.1 使用SQL 语句给数据库表中新增加一个字段(列)
举例: 给StudentInfo表中新增加一列,用来存放学生的年龄信息
语法:alet table 表名 add 列名 数据类型 …… ;
--给StudentInfo表中新增加一列,用来存放学生的年龄信息
--语法:alet table 表名 add 列名 数据类型 …… ;
alter table StudentInfo add Age int check(Age>=18 and Age<=30);
执行以后可以在左侧对象资源管理器中,验证结果。
3.2 使用SQL 语句删除数据库表中的某个字段(列)
语法:alter table 表名 drop column 列名;
3.2.1 删除表中已有的列(普通列)
--删除StudentInfo表中的GradeId列
alter table StudentInfo drop column GradeId;
3.2.2 使用SQL语句删除表中的已有的列(带有check约束的字段)
上文中新添加的Age列,带有CHECK约束,这里尝试删除Age列时,提示错误:
“消息 5074,级别 16,状态 1,第 42 行
对象'CK__StudentInfo__Age__4F7CD00D' 依赖于 列'Age'。
消息 4922,级别 16,状态 9,第 42 行
由于一个或多个对象访问此 列,ALTER TABLE DROP COLUMN Age 失败。”
分析:表中带有CHECK约束的列,要先删除CHECK约束,再删除列。
1、删除check约束的前提是已经知道该check约束的名字。
2、Age列的check约束是我们增加列的时候设置的,并没有给check约束起名字,是系统自动生成了一个约束名。
3、所以我们要先查到这个约束名→再删除check约束→最后删除列
第一步:查找约束名。语法:exec sp_helpconstraint @objname=表名;
第二步:删除check约束。将查询结果里的约束名,单击鼠标右键选择【复制】。删除check约束的语法:Alter table 表名 drop constraint 约束名;
第三步:删除列。语法:alter table 表名 drop column 列名;
--删除StudentInfo表中的Age列(删除带有check约束的列)
/*
分析:
1、删除check约束的前提,是已经知道该check约束的名字
2、Age列的check约束是我们增加列的时候设置的,并没有给check约束起名字,是系统自动生成了一个约束名
3、所以我们要查到这个约束名
*/
--第一步:查找约束名
exec sp_helpconstraint @objname=StudentInfo;
--第二步:删除check约束
Alter table StudentInfo drop constraint CK__StudentInfo__Age__4F7CD00D;
--第三步:删除列
alter table StudentInfo drop column Age;
思考:
- 删除StudentInfo表中的Addres列(使用SQL语句删除带有default默认值的列)怎么操作?
- 删除StudentInfo表中的Phone列(使用SQL语句删除有唯一键的列)怎么操作?
- 删除StudentInfo表中的StudentNo列(使用SQL语句删除表中的主键列)怎么操作?
试着完成它。
3.3 使用SQL 语句修改数据库表中的某个字段(列)
准备事项:给表中新增加几个字段
3.3.1 使用SQL语句修改表StudentInfo中的GradeId列,不允许为空
需求:sql语句怎么把允许为空的属性修改为不允许为空??
语法:alter table 表名 alter column 列名 数据类型 not null;
执行完毕后,可以在对象资源管理器中刷新表,查看列的属性。也可以使用SQL语句sp_help 表名;来查询表的结构,以验证结果。
3.3.2 使用SQL语句修改表StudentInfo中的Phone列,允许为空
需求:sql语句怎么把不允许为空的属性修改为允许为空??
语法:alter table 表名 alter column 列名 数据类型 null;
3.3.3 使用SQL语句修改表StudentInfo中的Age列,增加默认值
需求:sql语句怎么给表中的某一列增加默认值?
语法:alter table 表名 add constraint 约束名字 default 默认值 for 字段名称 ;
验证结果:SQL语句sp_help 表名;来查询表的结构,可以看到Age列的default值已经添加。
3.3.4 使用SQL语句修改表StudentInfo中的Addres列,修改表中原有的默认值
需求:sql语句怎么修改表中的某一列的默认值?
方法:先删除该列的默认值约束,然后再添加新的默认值
错误演示:直接增加default值,提示错误“消息 1781,级别 16,状态 1,第 78 行
已在列上绑定了 DEFAULT。
消息 1750,级别 16,状态 0,第 78 行
无法创建约束或索引。请参阅前面的错误。”
正确操作:先删除Addres列原有的默认值约束,再增加新的默认值
--修改表StudentInfo中的Addres列,增加默认值为“湖北省武汉市”
--先删除Addres列原有的默认值约束
Alter table StudentInfo drop constraint DF__StudentIn__Addre__4BAC3F29;
--再增加新的默认值
alter table StudentInfo add constraint DF_StudentInfo_Addres default '湖北省武汉市' for Addres;
3.3.4 使用SQL语句修改表StudentInfo中的Addres列,增加check约束
需求:sql语句怎么修改表中的某一列,给列增加check约束?
语法:alter table 表名 add constraint 约束名 check (约束字段);
--修改表StudentInfo中的Email列,增加check约束“数据中必须包含@”
alter table StudentInfo add constraint CK_StudentInfo_Email check(Email like '%@%');
思考:使用SQL语句更改列的check约束怎么操作?
3.3.5 使用SQL语句修改表Grade中的GradeId列,设置为主键
需求:sql语句怎么修改表中的某一列,将列设置为主键?
语法:alter table 表名 add constraint 约束名 primary key (字段名);
前期准备:新创建一个表
使用SQL语句修改表Grade中的GradeId列,设置为主键
注意:使用alter语句设置表中某一列为主键时,该列必须为非空。
思考:怎样使用sql语句修改表的主键?(原表中已经有主键了,需要更换另外一列作为主键)
提示:先删除主键,然后再重新设置主键。
语法:
alter table Grade drop PK_Grade;--删除原有的主键
alter table Grade add constraint PK_Grade1 primary key (GradeName); --使用sql语句重新设置主键
3.3.6 使用SQL语句设置两个表之间的关系,设置外键
需求:sql语句怎么设置表中的某一列为外键,引用另一个表中的主键?
语法:alter table 外键表名 add constraint 外键约束名 foreign key(外键列名) references 主键表名(主键列名)
--修改表StudentInfo中的GradeId列是外键,引用Grade表中的主键GradeId
alter table StudentInfo add constraint FK_StudentInfo_GradeId
foreign key(GradeId)
references Grade(GradeId);
注意:如果自己起约束名,一般根据约束的类型来起名字加上表名、列名、数字编号等,
比如:主键约束起名:PK_表名_列名、外键约束起名:FK_表名_列名、check约束起名:CK_表名_列名
当一个表中有多种同类型约束时,可以再加以数字编号区分。
4、使用SQL语句删除数据库表、数据库
需求:sql语句怎么删除一个数据库表?
语法:drop table 表名称;
举例:删除一个数据库表Grade
点击执行时,报错“消息 3726,级别 16,状态 1,第 119 行
无法删除对象 'Grade',因为该对象正由一个 FOREIGN KEY 约束引用。”
注意:当两个表之间存在引用关系时,要先删除外键表,再删除主键表。
--使用SQL语句删除数据库表Grade
--由于Grade表被StudentInfo表引用,因此要先删除StudentInfo表
drop table StudentInfo;
drop table Grade;
需求:sql语句怎么删除一个数据库?
语法:drop database 数据库名称;
举例:删除一个数据库表StudentDB
删除数据库时,报错“消息 3702,级别 16,状态 3,第 124 行
无法删除数据库 "StudentDB",因为该数据库当前正在使用。”
--删除数据库StudentDB
--由于“我们不能删除当前正在使用的数据库。”
--所以,先使用一下其他数据,比如系统数据库master,然后再删除
use master;
drop database StudentDB;
5、总结关键SQL语句:
1. 添加字段
alter table 表名 add 字段 类型;
2. 修改字段类型
alter table 表名 alter column 字段名 类型;
3. 删除字段
alter table 表名 drop column 字段名;
4. 删除外键/主键 约束
alter table 表名 drop constraint 外键/主键约束名;
5. 添加外键约束
alter table 外键表名 add constraint 外键约束名 foreign key(外键列名) references 主键表(主键列名);
6. 添加主键约束
alter 表名 add constraint 主键约束名 primary key(列名);
本案例完整SQL语句:
--创建数据库StudentDB
create database StudentDB --创建数据库
--创建主数据文件的SQL语句
on primary( --主数据文件默认属于primary文件组,因此可以省略primary
name='StudenDB', --主数据文件的逻辑名称(数据库名称)
filename='D:\wangdi\StudentDB.mdf', --主数据文件的物理名称
size=8mb, --主数据文件的初始大小,是8mb
maxsize=100mb, --主数据文件增长的最大值,是100mb
filegrowth=10% --主数据文件自动增量,是10%
)
--创建主数据文件的SQL语句
log on(
name='StudenDB_log', --日志文件的逻辑名称(数据库名称_log)
filename='D:\wangdi\StudentDB_log.ldf', --日志文件的物理名称
size=1mb,
maxsize=unlimited,
filegrowth=64mb
) --以上语句都写完以后,再执行
--使用数据库StudentDB
use StudentDB; --想在某个数据库里创建表,首先要use该数据库,否则可能将表创建在其他数据库里
--创建数据库表StudentInfo
create table StudentInfo(
StudentNo int primary key identity(1831301,1), --学生编号列,整数类型,主键,是标识列,标识种子1831301,标识增量1
Names nvarchar(20) not null, --学生姓名列,字符类型,可变长度20字节,不允许为空
Gender char(2) check(Gender='男' or Gender='女' ) not null, --学生性别列,字符类型,固定长度2字节,只允许填写男或女,不允许为空
GradeId int not null, --学生年级列,整数类型,不允许为空
BornDate datetime, --出生日期列,日期类型,允许为空
Phone nvarchar(20) unique not null, --学生电话列,字符类型,可变长度20字节,唯一键,不允许为空
Addres nvarchar(50) default('湖北武汉') --学生地址列,字符类型,可变长度50字节,默认值“湖北武汉”,允许为空
);
--给StudentInfo表中新增加一列,用来存放学生的年龄信息
--语法:alet table 表名 add 列名 数据类型 …… ;
alter table StudentInfo add Age int check(Age>=18 and Age<=30);
--删除StudentInfo表中的GradeId列
alter table StudentInfo drop column GradeId;
--删除StudentInfo表中的Age列(删除带有check约束的列)
/*
分析:
1、删除check约束的前提,是已经知道该check约束的名字
2、Age列的check约束是我们增加列的时候设置的,并没有给check约束起名字,是系统自动生成了一个约束名
3、所以我们要查到这个约束名
*/
--第一步:查找约束名
exec sp_helpconstraint @objname=StudentInfo;
--第二步:删除check约束
Alter table StudentInfo drop constraint CK__StudentInfo__Age__4F7CD00D;
--第三步:删除列
alter table StudentInfo drop column Age;
--为了演示效果,给表StudentInfo新增加两列
alter table StudentInfo add Age int check(Age>=18 and Age<=30);
alter table StudentInfo add GradeId int;
alter table StudentInfo add Email varchar(20) not null;
--修改表StudentInfo中的GradeId列,不允许为空
alter table StudentInfo alter column GradeId int not null;
--查询表结构,验证对列的修改是否起作用(忽视报错,直接执行即可)
sp_help StudentInfo;
--修改表StudentInfo中的Phone列,允许为空
alter table StudentInfo alter column Phone nvarchar(20) null;
--修改表StudentInfo中的Age列,增加默认值为18
alter table StudentInfo add constraint DF_StudentInfo_Age default 18 for Age;
--修改表StudentInfo中的Addres列,增加默认值为“湖北省武汉市”
--先删除Addres列原有的默认值约束
Alter table StudentInfo drop constraint DF__StudentIn__Addre__4BAC3F29;
--再增加新的默认值
alter table StudentInfo add constraint DF_StudentInfo_Addres default '湖北省武汉市' for Addres;
--修改表StudentInfo中的Email列,增加check约束“数据中必须包含@”
alter table StudentInfo add constraint CK_StudentInfo_Email check(Email like '%@%');
--创建数据库表Grade
create table Grade(
GradeId int not null , --年级编号列,整数类型,不允许为空
GradeName nvarchar(5) not null --年级名称列,字符类型,可变长度5字节,不允许为空
);
--使用SQL语句修改表Grade中的GradeId列,设置为主键
alter table Grade add constraint PK_Grade primary key (GradeId);
/*
思考:怎样使用sql语句修改表的主键?
(原表中已经有主键了,需要更换另外一列作为主键)
如将主键列设置为GradeName。两步操作:先删除原有主键,再新增加主键
alter table Grade drop PK_Grade1;
alter table Grade add constraint PK_Grade1 primary key (GradeName);
*/
--修改表StudentInfo中的GradeId列是外键,引用Grade表中的主键GradeId
alter table StudentInfo add constraint FK_StudentInfo_GradeId
foreign key(GradeId)
references Grade(GradeId);
--使用SQL语句删除数据库表Grade
--由于Grade表被StudentInfo表引用,因此要先删除StudentInfo表
drop table StudentInfo;
drop table Grade;
--删除数据库StudentDB
--由于“我们不能删除当前正在使用的数据库。”
--所以,先使用一下其他数据,比如系统数据库master,然后再删除
use master;
drop database StudentDB;
=======================这里是结束分割线=======================