SQL Server数据库第三课3:使用SQL语句创建完整版数据库、SQL语句修改表结构(新增字段,删除字段,修改字段)、删除表

版权声明:王迪 https://blog.csdn.net/dnruanjian/article/details/89358159

知识点:使用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;

=======================这里是结束分割线=======================

猜你喜欢

转载自blog.csdn.net/dnruanjian/article/details/89358159