目录
第一关
相关知识
什么是表
如果说数据库是一个仓库,那么表就是存放物品的架子。
数据表是数据库中最基本的操作对象,通常把数据存放在数据库中,其实就是将数据存放在数据库中的一张表中,且一个数据库可以包含一个或多个表。
数据表中的数据,按照行和列的规则,来进行数据存储。每一行,为一条数据记录,一条数据记录是由多个字段的描述信息组成的,每一列就是一个字段。
例如:有一个记录了员工信息的 employee 表,每一列就是用来描述员工特定信息的字段,比如工号、姓名等等;每一行则用于描述某一员工的所有字段信息:工号、姓名、性别和学历等,这些信息的集合称之为一条记录,如下图所示。
操作数据表
SQL Server 提供了非常丰富的数据表操作方法,用户可以通过企业管理器和 T-SQL 语言进行操作。使用 T-SQL 操作数据表,具有灵活、快捷等特点,也是数据库管理人员使用最多的一种方式。
对于数据表的操作主要分为:
-
CREATE TABLE 创建数据表
-
ALTER TABLE 修改数据表结构
-
DROP TABLE 删除数据表
创建数据表
数据表的创建主要是对基本结构的构建。例如,列属性的设定,数据完整性的约束。创建数据表使用 CREATE TABLE 语句,基本语法格式如下:
sql
CREATE TABLE table_name
(
column_name1 data_type(size),
column_name2 data_type(size),
column_name3 data_type(size),
....
);
column_name :列名;
data_type :列的数据类型(例如 varchar 、 integer 、 decimal 、 date 等等);
size :列的最大长度。
例如,使用下面的 CREATE TABLE 语句,创建一个名为 Persons 的表,包含五列 PersonID 、 LastName 、 FirstName 、 Address 和 City :
sql
CREATE TABLE Persons
(
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
利用 select name, length, COLLATION from syscolumns where id=object_Id('Persons')
查看创建的 Persons 表结构:
插入数据
创建完表后,可用 INSERT INTO 语句向表中插入数据。其语法如下:
sql
INSERT INTO 表名称 VALUES (值1, 值2,....)
我们也可以指定所要插入数据的列,如下:
sql
INSERT INTO 表名称 (列1, 列2,...) VALUES (值1, 值2,....)
例如,向 Persons 表中,插入 Tom 的个人信息,可以使用下列的语句完成。
sql
INSERT INTO Persons VALUES('1001','Tom','Green','West Road','New York')
使用select * from Persons
语句查看插入结果。
修改表结构
在表已经创建好的前提下,可以使用 ALTER TABLE 语句,对表中的列进行增加、删除或修改数据类型等操作。
- 新增列
sql
ALTER TABLE table_name
ADD column_name datatype
使用如下语句,可以为数据表 Persons 添加一列 AddedCol :
sql
ALTER TABLE Persons
ADD AddedCol varchar(50)
新增列后的表结构如下图:
- 删除列
sql
ALTER TABLE table_name
DROP COLUMN column_name
例如,使用下列语句,可以删除数据表 Persons 中的列 City :
sql
ALTER TABLE Persons
DROP COLUMN City
删除 City 列后,表 Persons 的结构如下图:
- 修改列的数据类型
sql
ALTER TABLE table_name
ALTER COLUMN column_name datatype
下列语句把数据表 Persons 中 AddedCol 列的数据类型改为 int 类型:
sql
ALTER TABLE persons
ALTER COLUMN addedCol int
修改数据类型后的表结构如下:
删除数据表
删除数据表是对数据库中已建立的表进行删除,在删除表的同时,会对表中定义的数据、索引和视图进行清除。在做任何删除操作前,应做好备份工作。我们使用 DROP TABLE 语句,对数据库中的数据表进行删除,语法格式如下:
sql
DROP TABLE table_name
编程要求
本次编程任务是:
在右侧编辑区 create table 下的 Begin-End 区域补全代码,创建 Student 、 Course 和 Score 三个表;
在右侧编辑区 insert 下的 Begin-End 区域补全代码,向 Score 表中插入下面给出的数据;
在右侧编辑区 alt student table 下的 Begin-End 区域补全代码,修改 Student 表结构,新增一列 addr 用于描述地址信息,并设置数据类型以及长度为 varchar(256),;
在右侧编辑区 del score table 下的 Begin-End 区域补全代码,删除 Score 表。
Student 表结构如下:
字段名 | 数据类型 | 说明 |
---|---|---|
sno | varchar(50) | 学号 |
name | varchar(50) | 姓名 |
sex | varchar(10) | 性别 |
birthday | Date | 出生日期 |
discipline | varchar(50) | 专业 |
school | varchar(100) | 学院 |
Course 表结构如下:
字段名 | 数据类型 | 说明 |
---|---|---|
cno | varchar(50) | 课程号 |
cname | varchar(50) | 课程名称 |
description | varchar(256) | 课程说明 |
credit | float | 学分 |
cinstitution | varchar(128) | 开课单位 |
Score 表结构如下:
字段名 | 数据类型 | 说明 |
---|---|---|
sno | varchar(50) | 学号 |
cno | varchar(50) | 课程号 |
grade | float | 成绩 |
Score 表待插入的数据:
学号 | 课程号 | 成绩 |
---|---|---|
09011101 | 101 | 89 |
09011101 | 102 | 78 |
第一关实验代码:
sql
USE studentdb
go
SET NOCOUNT ON
go
--********** create table **********--
--********** Begin **********--
create table student(
sno varchar(50),
name varchar(50),
sex varchar(10),
birthday Date,
discipline varchar(50),
school varchar(100)
);
create table course(
cno varchar(50),
cname varchar(50),
description varchar(256),
credit float,
cinstitution varchar(128)
);
create table score(
sno varchar(50),
cno varchar(50),
grade float
);
--********** End **********--
go
select name, length, COLLATION from syscolumns where id=object_Id('student')
go
select name, length, COLLATION from syscolumns where id=object_Id('course')
go
select name, length, COLLATION from syscolumns where id=object_Id('score')
go
--********** insert **********--
--********** Begin **********--
insert into score values('09011101','101',89);
insert into score values('09011101','102',78);
--********** End **********--
select * from score
go
--********** alt student table **********--
--********** Begin **********--
ALTER TABLE Student
ADD addr VARCHAR(256);
--********** End **********--
go
select name, length, COLLATION from syscolumns where id=object_Id('student')
go
--********** del score table **********--
--********** Begin **********--
drop table score;
--********** End **********--
go
GO
IF NOT EXISTS(Select 1 From Sysobjects Where Name='score') --查询表是否存在
BEGIN
PRINT 'NOT EXISTS TABLE score'
END
GO
第二关
相关知识
视图是什么
视图是一个虚拟表,其结构和内容是通过 SQL 查询获得的。用户可以通过 SQL 查询语句,像其他普通关系表一样,对视图中的数据进行查询。视图同样支持表的相关操作,并可以直接修改、添加、删除数据库中的真实数据。
视图通常用来集中、简化和自定义不同用户对数据库的不同认识,如视图可用作安全机制。方法是只允许用户由视图访问数据,而不授予用户直接访问数据表的权限。视图还可以用于提供向后兼容接口,来模拟曾经存在,但其架构已更改的表。
视图的优缺点
视图的优点
-
安全保密。通过视图,用户只能查询和修改他们所能见到的数据,对于数据库中的其他数据,则既看不见也取不到。通过视图,用户可以被限制在数据的不同子集上。
-
查询简单。视图能够从几个不同的关系表中提取数据,并且用一个单表,表示出来。利用视图,将多表查询转换成视图的单表查询。
-
结构简单。视图能够给用户一个"个性化"的数据库结构外观,用一组用户感兴趣的可见表,来代表这个数据库的内容。
-
隔离变化。视图能够代表一个一致的、非变化的数据。即使是在作为视图基础的数据表(基表),被分割、重新构造或者重命名的情况下,也是如此。
-
逻辑数据独立。视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上。有了视图之后,程序可以建立在视图上,从而使程序独立于数据表。
视图的缺点
虽然视图存在上述优点,但在定义数据库对象时,不能不加选择地来定义视图,因为视图也存在一些缺点:
-
性能。 SQL Server 必须把视图查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询, SQL Server 也要把它变成一个复杂的结合体,需要花费一定的时间。
-
修改限制。当用户试图修改视图的某些信息时,数据库必须把它转化为对基本表的某些信息的修改,对于简单的视图来说,这是很方便的,但对于比较复杂的视图,可能是不可修改的。
操作视图
创建视图
使用 T-SQL 命令,创建视图的基本语法如下:
sql
--语法
CREATE VIEW view_name
AS
SELECT column_name(s) FROM table_name
WHERE condition
view_name :指定创建视图的名称; column_name :指定视图中列名称; table_name :视图的基础表名称; condition : select 的限定条件。
下面是一个创建视图的实例:
sql
--准备表和数据
create table studentTable(
id int identity(1,1) primary key,
name varchar(20),
gender char(2),
age int,
)
insert into studentTable (name,gender,age)
values
('刘备','男',28),
('张飞','男',24),
('关羽','男',26);
--删除已存在的视图student_view
if (exists (select * from sys.objects where name = 'student_view'))
drop view student_view
go
--创建视图student_view
create view student_view
as
select name,age from studentTable where age>24;
--查询视图
select * from student_view;
通过创建的视图查询的结果:
通过视图向基本表中插入数据
sql
--通过视图向基本表中插入数据
create view stu_insert_view(编号,姓名,性别,年龄)
as
select id,name,gender,age from studentTable;
go
select * from studentTable;
---插入一条数据
insert into stu_insert_view values('曹操2','男',40);
----查看插入记录之后表中的内容。
select * from studentTable;
插入数据之前表中的数据如下:
通过视图插入数据后,表中的数据如下:
通过视图修改基本表的数据
sql
--查看修改之前的数据
select * from studentTable;
--修改数据
update student_view set age=30 where name='刘备';
--查看修改后的数据
select * from studentTable;
修改视图之前表 studentTable 中的数据如下:
通过视图修改表 studentTable 中的数据后如下:
通过视图删除基本表的数据
通过视图删除基本表数据的语法如下:
sql
delete view_name where condition;
--查看表中源数据
select * from studentTable;
--删除记录
delete student_view where name ='关羽';
--通过视图删除之后的数据
select * from studentTable;
删除之前的数据:
删除之后的数据:
修改视图
可以使用 ALTER VIEW 语句来对已有的视图进行修改。
sql
ALTER VIEW view_name AS select_statement
语法说明如下:
view_name :指定视图的名称。该名称在数据库中必须是唯一的,不能与其他表或视图同名。
select_statement :指定创建视图的 SELECT 语句,可用于查询多个基表或源视图。
例如:
sql
--修改视图
alter view student_view
as
select name,age from studentTable where age>30;
此时再执行select * from student_view
会得到如下年龄大于 30 的记录:
删除视图
可以使用 drop view 语句删除视图:
sql
drop view view_name1,view_name2,......,view_nameN;
--该语句可以同时删除多个视图,只要在删除各视图名称之间用逗号分隔即可。
例如
sql
drop view student_view;
编程要求
本次编程任务是,在右侧编辑区 create score_view_cdept 下的 Begin-End 区域补全代码,创建学生的成绩单视图,包括学号 sno 、姓名 name 、课程名 cname 和成绩 grade 字段。
涉及到的数据库和表都已经建立好了,并插入了相应的数据,具体如下: Student 表结构如下:
sno | name | sex | birthday | discipline | school |
---|---|---|---|---|---|
s001 | Tom | male | 2019-06-01 | computer | information |
s002 | Bob | male | 2019-06-01 | software | information |
s003 | Alice | female | 2019-05-02 | computer | information |
Course 表结构如下: |
cno | cname | description | credit | cinstitution |
---|---|---|---|---|
c001 | network | computer network description | 2 | College Of Information Engineering |
c002 | Java | java description | 2 | College Of Information Engineering |
Score 表结构如下:
sno | cno | grade |
---|---|---|
s001 | c001 | 85 |
s002 | c001 | 90 |
测试说明
平台将对你补充的代码进行评测,输出结果正确才可通关。
预期输出:
第二关实验代码:
sql
USE studentdb
go
SET NOCOUNT ON
go
--********** create score_view_cdept **********--
--********** Begin **********--
create view score_view_cdept
as
select student.sno,student.name,cname,grade
from student,course,score
where student.sno=score.sno and score.cno=course.cno
--********** End **********--
go