数据库作为一个整体存放在外存的物理文件中。物理文件有两种:
一个数据库可以有多个物理文件,可以将一个或若干个物理文件设置为一个逻辑设备;一个数据库可以有多个逻辑设备,必须在定义数据库时进行定义。定义数据库对象时只需要指明该对象存放在哪个逻辑设备上,而不必关心更多的物理细节;由逻辑设备与物理文件进行联系,从而实现数据库的逻辑模式与存储模式的独立。
USE master;
GO
--在创建 ScoreDB 数据库之前删除名为 ScoreDB 的数据库(如果它存在)。
IF DB_ID (N'ScoreDB') IS NOT NULL
DROP DATABASE ScoreDB;
GO
--以下示例会创建数据库 ScoreDB。 由于未使用关键字 PRIMARY,因此第一个文件 (ScoreDB_data) 将成为主文件。
--因为在 ScoreDB_data 文件的 SIZE 参数中没有指定 MB 或 KB,将使用 MB 并按 MB 分配。
--ScoreDB_log 文件以 MB 为单位进行分配,因为 SIZE 参数中显式声明了 MB 后缀。
CREATE DATABASE ScoreDB
ON --定义数据文件
( NAME=ScoreDB_data, --逻辑文件名
--物理文件名
FILENAME='G:\ProgramFiles\MSSQL14.SQLEXPRESS01\MSSQL\DATA\ScoreDB_data.mdf' ,
SIZE=10, --文件初始大小为5MB
MAXSIZE=200, --文件最大为200MB
FILEGROWTH=5 --增量为5MB
)
LOG ON --定义日志文件
( NAME=ScoreDB_log, --逻辑文件名
FILENAME='G:\ProgramFiles\MSSQL14.SQLEXPRESS01\MSSQL\DATA\ScoreDB_log.ldf' ,
--物理文件名
SIZE=10MB, --文件初始大小为5MB
MAXSIZE=200MB, --文件最大为200MB
FILEGROWTH=5MB --增量为5MB
)
GO
创建了数据库后,就可以在数据库中建立基本表。通过将基本表与逻辑设备相关联,使得一个基本表可以放在一个数据文件上,也可以放在多个数据文件上。
SQL 中的基本数据类型是:
其中:image为存储图像的数据类型,text 存放大文本数据。
当创建了一个基本表,与该基本表相关的描述信息会存入到数据库系统表中。创建基本表操作的语法为:
CREATE TABIE
(
[DEFAULT ][NULL | NOT NULL] [,
[DEFAULT ][NULL | NOT NULL]…]
[, CONSTRAINT ]
{UNIQUE | PRIMARY KEY} ( [, …])[,…n]
]
[, CONSTRAINT ]
FOREIGN KEY (< columName1> [, < columiName2>…])
REFERENCE [.owner.] ( [, …])[,…n]
]
)[ON ]
其中:
建议:最好不要将用户数据库对象(如基本表、索引等)建立在主逻辑设备上,因为主 逻辑设备存放了数据库的系统管理信息。
DROP TABLE IF EXISTS [dbo].[Student]
GO
CREATE TABLE Student
(
studentNo char(7) NOT NULL --学号
CHECK (studentNo LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9]'),
studentName varchar(20) NOT NULL, --姓名
sex char(2) NULL, --性别
birthday datetime NULL, --出生日期
native varchar(20) NULL, --籍贯
nation varchar(30) DEFAULT '汉族' NULL, --民族
classNo char(6) NULL, --所属班级
CONSTRAINT StudentPK PRIMARY KEY (studentNo),
CONSTRAINT StudentFK FOREIGN KEY (classNo) REFERENCES Class(classNo)
);
GO
可以通过 ALTER TABLE 命令来修改基本表的结构,如扩充列等。
修改基本表操作的语法为:
ALTER TABLE
ADD
ALTER TABLE
ADD CONSTRAINT
ALTER TABLE
DROP
ALTER TABLE
ALTER COLUMN
其中,
DROP TABLE [RESTRICT | CASCADE]
注意:SQL Server不支持 [RESTRICT | CASCADE]选项
INSERT INTO [( [, …])]
VALUES( [, …])
INSERT INTO [( [, …])]
例如:
CREATE TABLE StudentNation (
studentNo char(7) NOT NULL, --学号
courseNo char(3) NOT NULL, --课程号
termNo char(3) NOT NULL, --学期号
score numeric(5,1) DEFAULT 0 NOT NULL --成绩
CHECK (score BETWEEN O.O AND 100.0),
CONSTRAINT studentNationPK PRIMARY KEY (studentNo, courseNo, termNo)
)
--执行如下插入语句:
INSERT INTO StudentNation
SELECT *
FROM Score
WHERE studentNo IN(SELECT studentNo FROM Student WHERE nation<>'汉族')
INSERT INTO StudentNation (studentNo, courseNo, termNo)
SELECT studentNo, courseNo, termNo
FROM Score
WHERE studentNo IN (SELECT studentNo EROM Student WHERE nation='汉族')
DELETE FROM [WHERE ]
例如:
DELETE FROM SCORE
WHERE studentNo='1600001'
UPDATE
SET = [, =…]
[FROM { | | } [[AS] ]
[,{ | | } [[AS] ] … ]
]
[WHERE ]
其中:
例如:
UPDATE Class SET classNum=sCount
FROM Class a, ( SELECT classNo, count(*) sCount
FROM Student
GROUP BY calssNo) b
WHERE a.classNo=b.classNo
视图是虚表,是从一个或几个基本表(或视图)中导出的表,在数据库系统表中仅存放了视图的定义,不存放视图对应的数据。当基本表中的数据发生变化时,从视图中查询出的数据也随之改变。
视图实现了数据库管理系统三级模式中的外模式,基于视图的操作包括:查询、删除、受限更新和定义基于该视图的新视图,视图的主要作用是:
使用视图前必须先定义视图:
CREATE VIEW [( [, …])]
AS
[WITH CHECK OPTION]
例如:
CREATE VIEW StudentView1999
AS
SELECT *
FROM Student
WHERE year(birthday)=1999
CREATE VIEW ScoreView (courseNo, courseName, courseCount, courseAvg)
AS
SELECT a.courseNo, courseName, count(*), avg (score)
FROM Course a, Score b
WHERE a.courseNo=b.courseNo
GROUP BY a.courseNo, courseName
--或
CREATE VIEW ScoreView1
AS
SELECT a.courseNo, courseName, count(*) courseCount, avg (Score) courseAvg
FROM Course a, Score b
WHERE a.courseNo=b.courseNo
GROUP BY a.courseNo, courseName
查询是对视图进行的最主要的操作。从用户的角度来看,查询视图与查询基本表的方式是完全一样的,从系统的角度来看,查询视图的过程是:
SELECT *
FROM StudentView1999
WHERE classNo='CS1601'
--该视图转化为如下查询:
SELECT *
FROM Student
WHERE year(birthday)=1999 AND classNo='CS1601'
视图更新指通过视图来插入、删除和修改基本表中的数据。由于视图是一个虚表,不实际存放数据,对视图的更新,最终要转换为对基本表的更新,因此,如果视图的定义中包含了表达式,或聚合运算,或消除重复值运算,则不能对视图进行更新操作。
对视图进行更新操作,其限制条件比较多,建立视图的作用不是利用视图来更新数据库中的数据,而是简化用户的查询,以及达到一定程度的安全性保护,因此尽量不要对视图执行更新操作。
DROP VIEW [CASCADE]