下面是小编为大家精心整理的创建数据库表格(SQL) 创建\\文章,供大家阅读参考。
创建数据库表格
create database zhangwei on
primary
(name=scoredata3,filename="d:\zhangwei\zhangwei.mdf", size=10mb,maxsize=50mb,
filegrowth=5mb)
log on
(name=scorelog1,filename="d:\zhangwei\zhangwei.ldf", size=3mb,maxsize=unlimited,
filegrowth=2)
go
更改文件属性
ALTER DATABASE studentscore
MODIFY FILE
(NAME = sss_data,
SIZE = 20MB,
MAXSIZE=60
)
GO
更改逻辑文件名
ALTER DATABASE studentscore
MODIFY FILE
(NAME=sss_data,
NEWNAME = scoredata1
)
删除数据库文件
alter DATABASE StudentScore
remove file
ScoreData4
主键约束
格式:[CONSTRAINT 约束名] PRIMARY KEY [(列名)]。
如:CONSTRAINT Pk_课程表 PRIMARY KEY (课程号)
惟一键约束:
格式:[CONSTRAINT 约束名] UNIQUE KEY [(列名)]
如:CONSTRAINT Uk_专业表 UNIQUE (专业名)
外键(FOREIGN KEY)约束:
格式:[CONSTRAINT 约束名] FOREIGEN KEY [(外键列)] REFERENCES 引
用表名(引用列)
如:CONSTRAINT Fk_CourseId FOREIGN KEY (课程号) REFERENTCES 成
绩表(课程号),
检查(CHECK)约束:
CHECK约束通过限制可输入或修改的一列或多列的值来强制实现域完整性,
它作用于插入(INSERT)和修改(UPDATE)语句。
格式:[CONSTRAINT 约束名] CHECK (检查表达式)
如:CONSTRAINT Ck_成绩表 CHECK (成绩>=0)
默认值(DEFAULT)约束:
格式:[CONSTRAINT 约束名] DEFAULT 默认值
如:CONSTRAINT De_bScore DEFAULT(0)
创建规则
创建规则的语法是:
CREATE RULE rule_name AS condition_expression
例:create rule eee as @kk>=60 and @kk<=100
规则捆绑
格式:sp_bindrule rule_name, ‘object_name’
例:sp_bindrule eee,"成绩表.成绩"
解除由sp_bindrule建立的规则与列或用户定义数据类型的绑定
sp_unbindrule object_name[,futureonly]
例:sp_unbindrule "成绩表.成绩"
删除规则
例:drop rule eee
用户自定义函数分为三种:
(1)创建标量函数
例:创建名为“Func_自己的姓名”(如“Func_张亮”)的标量函数,计算某个(如学号为:200009001)学生各科成绩之和,函数的参数变量名为@sn,类型为char(12),函数返回类型为float。函数最后要求能显示调用结果信息(如:该生的各科成绩总和为:189 分)
create function dbo.Func_张巍(@sn char(12))
returns float
as
begin
declare @sum1 float
select @sum1=sum(成绩)from成绩表where学号=@sn
return @sum1
end
select dbo.Func_张巍(200009001)
例:在StudentScore数据库中创建一个自定义函数,按出生日期计算年龄,然后从“学生表”中检索出含有年龄的学生信息(包括学号、姓名、性别和年龄)。
CREATE FUNCTION dbo.年龄(@出生日期Datetime, @当前日期Datetime) RETURNS Int
AS
BEGIN
RETURN Year(@当前日期)-Year(@出生日期)
END
go
SELECT学号,姓名, dbo.年龄(出生日期,getdate())AS年龄
FROM学生表
(2)内嵌(单语句)的返回表的自定义函数
例:创建名为func_stu的函数,参数名为@stuno,参数类型为int。要求输入某个学号后,可以查看与该学号对应的学生信息,输出结果包括学号、姓名、性别和出生日期
create function dbo.func_stu (@stuno int)
returns table
as
return(select学号,姓名,性别,出生日期from学生表where学号=@stuno) select*from func_stu(200206008)
例:定义内嵌表值函数coursegrade,要求能够查询某一课程所有学生成绩列表。
CREATE FUNCTION coursegrade(@course varchar(30))
Returns table
As
return(select 学生表.学号,学生表.姓名,成绩表.成绩 From 学生表,成绩表 where 学生表.学号=成绩表.学号 and 成绩表.课程号=@course) 函数执行:
select * from coursegrade("aa")
(3)多语句的返回表的自定义函数
例:定义多语句表值查询函数course_grade,要求能够查询某一(aa)课程所有学生成绩列表,并将其成绩加100。
create function course_grade9 (@course varchar(30))
returns @score table
(s_no char(10), s_name char(30), grade smallint)
as
begin
insert @score
select 学生表.学号,学生表.姓名,成绩表.成绩 from 学生表,成绩表where 学生表.学号=成绩表.学号 and 成绩表.课程号=@course
update @score
set grade=grade+100
return
end
go
select * from course_grade9("aa")
创建索引
格式:CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED] INDEX index_name ON table_name
UNIQUE:指定创建的索引是唯一索引
CLUSTERED | NONCLUSTERED:指定被创建索引的类型。使用CLUSTERED来创建聚簇索引(一个表只可创建一个聚簇索引);使用NONCLUSTERED来创建非聚簇索引。这两个关键字中只能选用一个。
. index_name:为新创建的索引指定的名字。
. table_name:创建索引的表的名字。
例:学生表中创建一个以“学号”索引。
create clustered index IX_学号
on 学生表(学号)
例:
create clustered index IX_学号
on 学生表(学号)
with drop_existing
例:创建复合索引
create clustered index IX_学号 on 学生表(学号,姓名)
删除索引的语法:
例:删除“学生表”上的“IX_学生表”索引
drop index 学生表.IX_学号,学生表.ix_姓名
创建存储过程
格式:
Create procedure procedue_name
[@parameter data_type][output]
[with]{recompile|encryption}
as
sql_statement
解释:
output:表示此参数是可传回的
with {recompile|encryption}
recompile:表示每次执行此存储过程时都重新编译一次
encryption:所创建的存储过程的内容会被加密
例:在StudentScore数据库中创建一个存储过程Major_Class,要求从专业信息表和班级信息表的连接中返回所有专业的班级信息,其中包括班级代号、班级名称、专业名称和学制。
USE StudentScore
GO
CREATE PROC Major_Class
AS
SELECT c.班级代号, c.班级名称,m.专业名称,学制
FROM 专业表 m JOIN 班级表 c
ON m.专业代号 = c.专业代号
Major_Class的调用语句为:
EXEC Major_Class
例:在StudentScore数据库中创建一个存储过程Class_Num_Sum,要求根据专业代号输出该专业的学生人数。
USE StudentScore
GO
CREATE PROCEDURE Class_Num_Sum
@MajorId Char(2)="%",
@Sum Int OUTPUT
AS
SELECT @Sum=SUM(班级人数) FROM 班级表
WHERE 专业代号 = @MajorId
调用:
DECLARE @n Int
EXEC Class_Num_Sum "11", @n OUTPUT
PRINT "该专业的学生人数为:"+convert(Char(4), @n)
SELECT语句的语法格式
SELECT语句的基本语法格式如下:
SELECT [all|distinct] 列名的列表
[INTO 新表名]
[FROM 表名与视图名列表]
[WHERE 条件表达式]
[GROUP BY 列名的列表]
[HAVING 条件表达式]
[ORDER BY 列名1[ASC|DESC],列名2[ASC|DESC],...列名n[ASC|DESC]]
注:select语句中出现的字段列要不以聚合函数形式出现,要不该字段在分组中体现。基本的SELECT语句使用位置:
SELECT 选取的列
FROM 表的列表
WHERE 查询条件
使用INTO子句
语法格式:
SELECT 选取的列
INTO 新表名
FROM 表的列表
WHERE 查询条件
例:创建一个名为“新学生表”的表,表中的字段为姓名、籍贯、年龄。
SELECT 姓名, 籍贯, YEAR(GETDATE()) - YEAR(出生日期) AS 年龄
INTO 新学生表
FROM 学生表
例:查询性别为 "男"并且是2002年6月份入学的学生。
SELECT 姓名, 学号
FROM 学生表
WHERE (性别 = "男") AND (学号 LIKE "200206%")
ORDER BY 姓名 DESC
例:查询籍贯不是“上海”和“扬州”的学生
select * from 学生表
where 籍贯 not in("上海","扬州")
/* 在IN后面值的列表中,将出现最频繁的值放在最前面,出现得最少的放在最后面,减少判断的次数*/
例:查询年龄在20-21之间的学生
SELECT 姓名, 学号, 籍贯, 年龄
FROM 新学生表
WHERE (年龄 BETWEEN 20 AND 21)
或
SELECT 姓名, 学号, 籍贯, YEAR(GETDATE()) - YEAR(出生日期) AS 年龄FROM 学生表
WHERE (YEAR(GETDATE()) - YEAR(出生日期) BETWEEN 20 AND 21)
例:查找姓“刘”或“肖”的学生。
select * from 学生表 where 姓名 like "[刘肖]%"
例:查找班级代号为001-003的学生。
如:select * from 学生表 where 班级代号 like "00[1-3]"
例:查找姓名中含有“河”字的学生。
SELECT 姓名
FROM 学生表
WHERE (姓名LIKE "%河%")
例:查询学生“性别”和“籍贯”的信息
SELECT DISTINCT 性别, 籍贯
FROM 学生表
例:求平均数
SELECT AVG(成绩) AS 平均成绩
FROM 成绩表
例:统计班级中性别数
SELECT DISTINCT 班级代号, 性别, COUNT(性别) AS 性别个数
FROM 学生表
GROUP BY 班级代号, 性别
HAVING (NOT (班级代号 IS NULL))
ORDER BY 班级代号
例:从学生表中返回第3学期成绩总分超过200分的学生学号和成绩总分。
SELECT 学号, SUM(成绩) AS 总分
FROM 成绩表
WHERE (学期 = 3)
GROUP BY 学号
HAVING (SUM(成绩) > 200)
例:查找学生成绩大于学分为4的最低成绩的学生的学号、姓名、课程名称、成绩和学分。
SELECT dbo.学生表.学号, dbo.学生表.姓名, dbo.课程表.课程名称, dbo.成绩表.成绩, dbo.成绩表.学分
FROM dbo.成绩表 INNER JOIN
dbo.学生表 ON dbo.成绩表.学号 = dbo.学生表.学号 INNER JOIN dbo.课程表 ON dbo.成绩表.课程号 = dbo.课程表.课程号
WHERE (dbo.成绩表.成绩>= ANY
(SELECT 成绩
FROM 成绩表
WHERE 成绩表.学分=4))
例:钱河的成绩加100分。
UPDATE 成绩表
SET 成绩 = 成绩 + 100
WHERE (学号 IN
(SELECT 学号
FROM 学生表
WHERE 姓名 = "钱河"))
例:查询平均(每一门课)成绩大于80分学生的情况
SELECT 学生表.学号, 学生表.姓名, 学生表.性别
into student
FROM 学生表 INNER JOIN
成绩表 ON 学生表.学号 = 成绩表.学号
WHERE (成绩表.课程号 IN
(SELECT 成绩表.课程号
FROM 成绩表 INNER JOIN
学生表 ON 成绩表.学号 = 学生表.学号
GROUP BY 成绩表.课程号
HAVING (AVG(成绩表.成绩) > 80)))
视图
例:在“计算机系学生”视图上,列出年龄小于22的学生。
SELECT 姓名, 系部名称, 年龄
FROM dbo.计算机系学生
WHERE (年龄 < 22)
例:修改计算机系学生视图:要求去掉原视图中的系部名称,增加学生性别。
alter view dbo.计算机系学生(姓名,性别,年龄) as
SELECT dbo.学生表.姓名, dbo.学生表.性别, YEAR(GETDATE())
- YEAR(dbo.学生表.出生日期) AS 年龄
FROM dbo.学生表 INNER JOIN
dbo.班级表 ON dbo.学生表.班级代号 = dbo.班级表.班级代号INNER JOIN
dbo.专业表 ON dbo.班级表.专业代号 = dbo.专业表.专业代号
WHERE (dbo.专业表.系部名称 = "计算机")
例:以“学生表”和“成绩表”为数据源新建一个视图,命名为VIEW2,查询出参加补考的学生的姓名、学分和补考成绩。
CREATE VIEW dbo.VIEW2
AS
SELECT dbo.学生表.学号, dbo.学生表.姓名, dbo.成绩表.学分, dbo.成绩表.补考成绩
FROM dbo.成绩表 INNER JOIN
dbo.学生表 ON dbo.成绩表.学号 = dbo.学生表.学号
WHERE (NOT (dbo.成绩表.补考成绩 IS NULL))
例:通过修改视图VIEW2来更新表的数据。当学生补考成绩大于等于60分时,其对应的学分增加2分。
UPDATE VIEW2
SET 学分 = 学分 + 2
WHERE (补考成绩 >= 60)
删除视图:
drop view view_name
局部变量
例:声明局部变量Studno、Studname,并用SET语句为其赋值。
DECLARE @Studno Char(10),@Studname Char(8)
SET @Studno ="200009001"
SET @Studname ="葛文"
例:从成绩表中查询学号为“200009001”学生的成绩总分,并将其赋给变量Sumscore。
DECLARE @Sumscore Float
SELECT @sumscore = SUM(成绩)
FROM 成绩表
WHERE 学号 = "200009001"
全局变量
例:演示全局变量@@rowcount和@@error的使用。
select * from 学生表
where 性别="女"
select @@rowcount 处理记录数
select @@error error的值为:
CAST
功能:将某种数据类型的表达式显式转换为另一种数据类型。CAST 和 CONVERT 提供相似的功能。
例:将学生表中的姓名属性的类型转换为char(50)
select cast( 姓名 as char(50)),学号 from 学生表
或:
select convert(char(50),姓名),学号 from 学生表BEGIN...END
功能:当需要将一个以上的S Q L语句作为一组对待时,可以使用BEGIN 和END将它们括起来形成一个SQL语句块。
例:如果课程aa的平均成绩低于60,那么显示“不及格”,如果高于80,显示“优秀”,其他为“合格”。
declare @score numeric
if (select avg(成绩)
from 成绩表
where 课程号="aa" )<60
begin
select @score= avg(成绩)
from 成绩表
where 课程号="aa"
print "平均成绩为:"+convert(varchar(30),@score)+space(5)+"此科目不及格"
end
else
if (select avg(成绩)
from 成绩表
where 课程号="aa" )>=80
begin
select @score= avg(成绩)
from 成绩表
where 课程号="aa"
print "平均成绩为:"+convert(varchar(10),@score)+space(5)+"此科目优秀"
end
else
begin
select @score= avg(成绩)
from 成绩表
where 课程号="aa"
print "平均成绩为:"+convert(varchar(10),@score)+space(5)+"此科目合格"
end
用户自定义数据类型
(1)用户定义数据类型使用系统存储过程sp_addtype来定义(增加一个用户定义数据类型)。
语法如下:
sp_addtype
type_name,phystype
type_name是用户定义数据类型的名字
例如:
exec sp_addtype typ_ch_pid,"char(4)"
(2)查看用户定义数据类型
例如: exec sp_help typ_ch_tid
(3)删除用户定义数据类型。
例如: exec sp_droptype typ_ch_pid
WAITFOR
例:
waitfor delay "00:00:05"
insert into 学生表(学号,姓名)
values(200206008,"许晴")
CASE
CASE表达式可以根据多个选择确定执行的内容。
语法为:
CASE expression
{WHEN EXPRESSION THEN RESULT} [,...N]
[ELSE RESULT]
END
例:将成绩统计等级,并将结果保存在等级表中。
select 学号,等级=
case
when 成绩<60 then " 不及格"
when 成绩>90 then " 优秀 "
else "合格"
end ,
成绩 into 等级表
from 成绩表
where 成绩 is not null
创建触发器
例:在StudentScore数据库中创建一个删除触发器,实现当删除“学生表”中
的某个学生记录时同时删除“成绩表”中与之对应的成绩记录。
USE StudentScore
GO
CREATE TRIGGER Student_Delete ON 学生表
AFTER DELETE
AS
DELETE FROM 成绩表
WHERE 学号 In (SELECT 学号 FROM Deleted)
例:创建触发器Student_Delete,如果删除、修改、插入“学生表”中任何数据,则将提示一条信息:不得对数据表进行修改!
USE StudentScore
if exists(select name from sysobjects
where name="Student_Delete" and type="tr")
drop trigger Student_Delete
GO
CREATE TRIGGER Student_Delete ON 学生表
AFTER DELETE,insert,update
AS
BEGIN
raiserror("不得对数据表进行修改! ",16,1)
end
推荐访问: 创建 表格 创建 标签