SQL-DDL-[SYBASE/MSSQL版本]
测试通过环境:微软数据库sql server2000
author:chinayaosir
blog: http://blog.csdn.net/chinayaosir/
QQ: 44633197
------------------------------------------
符号约定:
[]:可有可无
():必须包含()
<>:必须出现
|:或者
DDL目录
1.数据库
1.1数据库建立
1.2数据库删除
2.表
2.1表(建立/删除)
2.2列(建立/删除/修改)
2.3索引(建立/删除)
3.完整性约束和事务
3.1检查约束(建立/删除)
3.2唯一约束(建立/删除)
3.3主键约束(建立/删除)
3.4外键约束(建立/删除)
3.5事务(COMMIT/ROLLBACK)
4.视图(建立/删除)
4.1视图(建立)
4.2视图(删除)
5.数据库用户与权限
5.0登录用户,角色,组别
5.1GRANT --授予权限
5.2REVOKE --解除权限
6.存储过程(建立/删除)
6.1建立存储过程
6.2删除存储过程
6.3游标应用
7.触发器(建立/删除)
7.1建立触发器
7.2删除触发器
8.函数(建立/删除)
8.1建立函数
8.2删除函数
9.变量,赋值,控制语句(存储过程,触发器,函数应用)
9.1局部/全局变量定义
9.2赋值语句set/select
9.3条件语句(if/case)
9.4循环语句(while)
9.5定时执行(waitfor)
10.标准SQL字符串函数
-----------------------------------------------------------
主要内容
1.数据库(建立/删除)
1.1建立数据库
语法:create database <数据库名> [其它参数]
代码:
//建立数据库 hr
create database hr
1.2删除数据库。
语法:drop database <数据库名>
代码:
//删除数据库hr
drop database hr
-----------------------------------------------------------
2.表
2.1表(建立/删除)
2.1.1建立表
语法:
create table <表名>
(
<列名> <数据类型> [长度] <,>
<列名...>
)
代码:
//建立公司部门表
use hr
create table tb_basic_dept
(
id int not null,
name varchar(20) ,
chair varchar(20)
)
2.1.2删除表
语法:drop table <表名>
代码:
//删除部门表
drop table tb_basic_dept
-----------------------------------------------------------
2.2列(建立/删除/修改)
2.2.1添加列
语法:alter table <表名> add
<列名> <数据类型> [长度] <,>
<列名...>
代码:
//tb_basic_dept表添加一列remark1
alter table tb_basic_dept add
remark varchar(50)
//tb_basic_dept表添加多列remark1
alter table tb_basic_dept add
remark1 varchar(50),
remark2 varchar(50),
remark3 varchar(50)
2.2.2删除列
语法:alter table <表名> drop column <列名>
代码:
//删除列remark
alter table tb_basic_dept drop column remark
//删除多列remark1,remark2,remark3
alter table tb_basic_dept drop column remark1,remark2,remark3
2.2.3修改列
语法:alter table <表名> alter column
<列名> <数据类型> [长度] [null | not null]
代码:
//修改工资列为dec(8,2)
alter table tb_hr_gz
alter column gz dec(8,2) null
//修改工资列为real
alter table tb_hr_gz
alter column gz real null
-----------------------------------------------------------
2.3索引(建立/删除)
3.1建立索引
语法:
create index <索引名>
on <表名> <列名清表>
代码:
create index tb_hr_personl_info_ix
on tb_hr_personl_info (userid)
3.2删除索引
语法:
drop index <表名><.><索引名>
代码:
//删除索引名tb_hr_personl_info_ix
drop index tb_hr_personl_info.tb_hr_personl_info_ix
-----------------------------------------------------------
3.约束
3.1检查约束(建立/删除)
3.2唯一约束(建立/删除)
3.3主键约束(建立/删除)
3.4外键约束(建立/删除)
以下面两个表为例进行演示
create table tb_hr_bm
(
bm varchar(20) not null ,
remark varchar(100) default ''
)
create table tb_hr_gz
(
id int not null,
name varchar(30) not null,
hrid char(18) null,
workage int null ,
bm varchar(20) null,
gz real null,
remark varchar(100) null
)
hrid=身份证号码
workage=工作年数
gz=工资金额
-----------------------------------------------------------
3.1检查约束(建立/删除)
检查约束建立(2种方法)
语法:
alter table name
add constraint <检查约束名> check<取值范围表达式>
代码:
//工资添加取值范围0 ~ 10000000000
方法1:
create table tb_hr_gz
(
...
gz real default 0.0 check(gz >=0 and gz <=10000000000),
...
)
方法2:
alter table tb_hr_gz
add constraint tb_hr_gz_ck check(gz >=0 and gz <=10000000000)
检查约束删除
语法:
alter table name
drop constraint <检查约束名>
代码:
//删除工资的检查约束
alter table tb_hr_gz
drop constraint tb_hr_gz_ck
-----------------------------------------------------------
3.2唯一约束(建立/删除)
添加唯一约束
语法:
alter table name
add constraint <唯一约束名> unique<列名>
代码:
//列如身份证号码是唯一的!
alter table tb_hr_gz
Add constraint tb_hr_gz_uk unique(hrid)
删除唯一约束
语法:
alter table name
drop constraint <唯一约束名>
代码:
alter table tb_hr_gz drop constraint tb_hr_gz_uk
-----------------------------------------------------------
3.2主键约束
添加主键
语法:
alter table table_name
add constraint <主键名称> Primary Key <列名>
代码:
create table tb_hr_bm
(
bm varchar(20) not null ,
remark varchar(100) default ''
)
alter table tb_hr_bm
add constraint tb_hr_bm_pk Primary Key (bm)
删除主键
语法:
alter table table_name
drop constraint <主键名称>
代码
alter table table_name
drop constraint tb_hr_bm_pk
-----------------------------------------------------------
3.3外键约束
在现有表的基础之上,再加上外键约束!
外键约束名可定制,建议使用此方法,方便维护
3.3.1外键约束添加
语法:
alter table <表名>
add constraint <外键名>
foreign key(列名)
references <参考表名><列名>
<更新策略方式>
ON UPDATE|ON DELETE|CASCADE
//ON UPDATE CASCADE=级联更新
//ON DELETE CASCADE=级联删除
代码:
建立外键的主要代码
alter table tb_hr_personl_info
add constraint tb_hr_personl_info__bm_fk
foreign key(bm)
references tb_hr_bm (bm)
on update cascade
on delete cascade
//建立参考表部门
create table tb_hr_bm
(
bm varchar(20) not null ,
remark varchar(100) default ''
)
alter table tb_hr_bm
add constraint tb_hr_bm_pk Primary Key (bm)
//建立个人信息表
use hr
create table tb_hr_personl_info
(
userid int not null ,
username varchar(20) null,
bm varchar(20) null
)
/*为此表添加主键约束*/
alter table tb_hr_personl_info
add constraint tb_hr_personl_info_pk Primary Key (userid)
/*为个人信息表添加外键约束*/
alter table tb_hr_personl_info
add constraint tb_hr_personl_info__bm_fk
foreign key(bm)
references tb_hr_bm (bm)
on update cascade
on delete cascade
3.3.2外键约束删除
语法:
alter table <表名>
drop constraint <外键名>
代码:
//删除tb_hr_personl_info表的外键
alter table tb_hr_personl_info drop constraint tb_hr_personl_info__bm_fk;
-------------------------------------------------------------------------------------
3.5事务(COMMIT/ROLLBACK)
SET TRANSACTION --定义当前事务数据访问特征
COMMIT --提交当前事务
ROLLBACK --取消当前事务
-------------------------------------------------------------------------------------
4.视图(建立/删除)
4.1视图(建立)
语法:
create view <视图名> as <查询语句>
/*查询语句包括:简单查询,聚集函数查询,多表查询,连接查询,分组查询,子查询*/
代码:
//建立个人信息表的视图v_hr_personl_info
create view v_hr_personl_info
as
select *
from tb_hr_personl_info
4.2视图(删除)
语法:
drop view <视图名>
代码:
//建立个人信息表的视图v_hr_personl_info
drop view v_hr_personl_info
-------------------------------------------------------------------------------------
5.数据库用户与权限
5.0登录用户,角色,组别
添加登陆用户语法:
sp_addlogin [ @loginame = ] 'login'
[ , [ @passwd = ] 'password' ]
[ , [ @defdb = ] 'database' ]
[ , [ @deflanguage = ] 'language' ]
[ , [ @sid = ] sid ]
[ , [ @encryptopt= ] 'encryption_option' ]
执行代码:
在数据库testdb上面添加一个登陆用户test,密码为tt
EXEC sp_addlogin 'test', 'tt', 'testdb', 'us_english'
5.1GRANT --授予权限
GRANT : 赋予一个用户/组或所有用户访问权限
grant语法:
GRANT privilege [, ...] ON object [, ...]
TO { PUBLIC | GROUP group | username }
privilege取值范围如下:
SELECT
访问声明的表/视图的所有列/字段.
INSERT
向声明的表中插入所有列字段.
UPDATE
更新声明的表所有列/字段.
DELETE
从声明的表中删除所有行.
RULE
在表/视图上定义规则 (参见 CREATE RULE 语句).
ALL
赋予所有权限.
object取值范围如下:
table
view
sequence
PUBLIC
代表是所有用户的简写.
GROUP
将要赋予权限的组 group .
username
将要赋予权限的用户名.PUBLIC 是代表所有用户的简写.
如果成功,返回输出CHANGE信息.
---------------------------------------------------------------------------
5.2REVOKE --解除权限
REVOKE { ALL | statement [ ,...n ] }
FROM security_account [ ,...n ]
ALL:
指定将删除所有适用的权限。
对于语句权限,只有 sysadmin 固定服务器角色成员可以使用 ALL。
对于对象权限,sysadmin 固定服务器角色成员、db_owne 固定数据库角色成员和数据库对象所有者都可以使用 ALL。
statement:
是要删除其权限的授权语句。语句列表可以包括:
* CREATE DATABASE
* CREATE DEFAULT
* CREATE FUNCTION
* CREATE PROCEDURE
* CREATE RULE
* CREATE TABLE
* CREATE VIEW
* BACKUP DATABASE
* BACKUP LOG
FROM:
指定安全帐户列表。
security_account:
是当前数据库内将要被删除权限的安全帐户。
安全帐户可以是:SQL Server用户,SQL Server角色。
-------------------------------------------------------------------------------------
6.存储过程(建立/删除)
6.1建立存储过程
语法:
create procedure <存储过程名>
(
[输入参数列表],[返回参数列表 output]
)
as
[局部变量定义]
begin
{语句体}
end
按子查询删除数据
/*应用存储过程*/
代码0:
create procedure p_update_name_tb_hr_gz
(@id int,
@newname varchar(30)
)
as
begin
if (exists(select * from tb_hr_gz where id=@id))
begin
update tb_hr_gz set name=@newname where id=@id
end
end
/*测试存储过程*/
EXEC dbo.p_update_name_tb_hr_gz '112','chenglei'
代码1:
create delete_o_itemlcoaso
as
begin
delete o_itemlcoaso
from o_itemlcoaso,o_itemallrow
where
o_itemlcoaso.oc_number+o_itemlcoaso.itemnumber not in(
select oc_number+itemnumber
from o_itemallrow
)
end
按传入的4个参数删除数据
代码2:
create procedure p_oa_change_shippdate
(
@oc_number char(8),
@itemnumber char(14),
@old_shippdate datetime,
@new_shippdate datetime
)
as
begin
update o_factory
set o_factory.shipp_date=@new_shippdate
where
(o_factory.oc_number=@oc_number)
and (o_factory.itemnumber=@itemnumber)
and (o_factory.shipp_date=@old_shippdate)
update o_factory_maker
set o_factory_maker.shipp_date=@new_shippdate
where (o_factory_maker.oc_number=@oc_number)
and (o_factory_maker.itemnumber=@itemnumber)
and (o_factory_maker.shipp_date=@old_shippdate)
end
6.2删除存储过程
语法:
drop procedure <存储过程名>
删除
代码:
drop procedure p_oa_change_shippdate
--------------------------------------
6.3游标应用
每一个游标必须有四个组成部分这四个关键部分必须符合下面的顺序;
1.DECLARE --为查询设定游标
2.OPEN --检索查询结果打开一个游标
3.FETCH --检索一行查询结果
4.CLOSE / DEALLOCATE--关闭游标或者重新分配游标
语法::
DECLARE cursor_name [INSENSITIVE] [SCROLL] CURSOR
FOR select_statement
语法框架:
DECLARE <游标名称> CURSOR FOR(select sql)
OPEN <游标名称>
while @@fetch_status = 0
begin
FETCH NEXT FROM <游标名称> INTO <变量名清单>
{其它代码处理}
end
CLOSE <游标名称>
/*带游标的存储过程*/
代码1:
create procedure p_fill_remark_tb_hr_gz
as
declare @id1 int
declare @name1 varchar(30)
declare @bm1 varchar(20)
begin
declare cursor1 cursor for select id,name,bm from tb_hr_gz
open cursor1
fetch next from cursor1 into @id1,@name1,@bm1
while @@fetch_status = 0
begin
update tb_hr_gz
set remark=@name1+'-'+@bm1
where id=@id1
fetch next from cursor1 into @id1,@name1,@bm1
end
close cursor1
end
/*测试带游标的存储过程*/
EXEC dbo.p_fill_remark_tb_hr_gz
代码2:
declare @code int,@name varchar(20)
delcare cursor1 cursor for
select code,pkname from tablename
open cursor1
fetch next from cursor1 into @code,@name
while @@fetch_status <> 0
begin
--do some things
fetch next from cursor1 into @code,@name
end
close cursor1
-----------------------------------------------------------------
7.触发器(建立/删除)
7.1建立触发器
语法:
create trigger <触发器名称> on <表名>
[for insert | update | delete]
as
[定义变量]
begin
{代码块...}
end
代码0:
create trigger tg_tb_hr_bm
on tb_hr_bm
for insert,update,delete
as
declare @bm_d varchar(20)
declare @bm_i varchar(20)
begin
set @bm_d=(select bm from deleted)
set @bm_i=(select bm from inserted)
if exists(select * from tb_hr_gz ,deleted where(tb_hr_gz.bm =deleted.bm ))
begin
update tb_hr_gz set bm='' where bm =@bm_d
end
if update(bm)
begin
update tb_hr_gz set bm=@bm_i where bm =@bm_i
end
end
代码1:
create trigger dbo.tg_w_house_center on dbo.w_house_center
for insert,update,delete
as
declare @mtrlid varchar(18)
declare @factqty decimal(10,2)
declare @delmtrlid varchar(18)
begin
select @mtrlid =(select mtrlid from inserted)
select @factqty =(select factqty from inserted)
select @delmtrlid =(select mtrlid from deleted)
begin
--如果新建立一个物料编号的库存量,则更新物料编号的库存
if exists(select * from b_basic_mtrl ,inserted where(b_basic_mtrl.mtrlid =inserted.mtrlid ))
begin
update b_basic_mtrl
set b_basic_mtrl.factqty=@factqty
from b_basic_mtrl,inserted
where b_basic_mtrl.mtrlid =inserted.mtrlid
end
--如果修改库存数量,则直接更改物料编号的库存量
if update(factqty)
begin
update b_basic_mtrl
set b_basic_mtrl.factqty=@factqty
from b_basic_mtrl,inserted
where b_basic_mtrl.mtrlid =inserted.mtrlid
end
--如果删除此物料编号,更新库存数量为0
if (not(@delmtrlid is null))
begin
if exists(select * from b_basic_mtrl ,deleted where(b_basic_mtrl.mtrlid =deleted.mtrlid ))
begin
update b_basic_mtrl
set b_basic_mtrl.factqty=0
from b_basic_mtrl,deleted
where b_basic_mtrl.mtrlid =deleted.mtrlid
end
end
end
7.2删除触发器
语法:
drop trigger <触发器名称>
-------------------------------
代码:
drop trigger tg_w_house_center
-------------------------------------------------------------------------------------
8.函数(建立/删除)
8.1建立函数
语法:
CREATE FUNCTION <函数名>(参数变量列表)
[返回值RETURNS 数据类型] [WITH ENCRYPTION]
AS
BEGIN
{函数代码体....}
END
函数f_amt_to_eng()功能:数字金额转换为英文字母金额
代码:
CREATE FUNCTION f_amt_to_eng(@num numeric(15,2))
RETURNS varchar(400) WITH ENCRYPTION
AS
BEGIN
DECLARE @i int,@hundreds int,@tenth int,@one int
DECLARE @thousand int,@million int,@billion int
DECLARE @numbers varchar(400),@s varchar(15),@result varchar(400)
SET @numbers='one two three four five '
+'six seven eight nine ten '
+'eleven twelve thirteen fourteen fifteen '
+'sixteen seventeen eighteen nineteen '
+'twenty thirty forty fifty '
+'sixty seventy eighty ninety '
SET @s=RIGHT('000000000000000'+CAST(@num AS varchar(15)),15)
SET @billion=CAST(SUBSTRING(@s,1,3) AS int)--将12位整数分成4段:十亿、百万、千、百十个
SET @million=CAST(SUBSTRING(@s,4,3) AS int)
SET @thousand=CAST(SUBSTRING(@s,7,3) AS int)
SET @result=''
SET @i=0
WHILE @i<=3
BEGIN
SET @hundreds=CAST(SUBSTRING(@s,@i*3+1,1) AS int)--百位0-9
SET @tenth=CAST(SUBSTRING(@s,@i*3+2,1) AS int)
SET @one=(CASE @tenth WHEN 1 THEN 10 ELSE 0 END)+CAST(SUBSTRING(@s,@i*3+3,1) AS int)--个位0-19
SET @tenth=(CASE WHEN @tenth<=1 THEN 0 ELSE @tenth END)--十位0、2-9
IF (@i=1 and @billion>0 and (@million>0 or @thousand>0 or @hundreds>0)) or
(@i=2 and (@billion>0 or @million>0) and (@thousand>0 or @hundreds>0)) or
(@i=3 and (@billion>0 or @million>0 or @thousand>0) and (@hundreds>0))
SET @result=@result+', '--百位不是0则每段之间加连接符,
IF (@i=3 and (@billion>0 or @million>0 or @thousand>0) and (@hundreds=0 and (@tenth>0 or @one>0)))
SET @result=@result+' and '--百位是0则加连接符AND
IF @hundreds>0
SET @result=@result+RTRIM(SUBSTRING(@numbers,@hundreds*10-9,10))+' hundred'
IF @tenth>=2 and @tenth<=9
BEGIN
IF @hundreds>0
SET @result=@result+' and '
SET @result=@result+RTRIM(SUBSTRING(@numbers,@tenth*10+171,10))
END
IF @one>=1 and @one<=19
BEGIN
IF @tenth>0
SET @result=@result+'-'
ELSE
IF @hundreds>0
SET @result=@result+' and '
SET @result=@result+RTRIM(SUBSTRING(@numbers,@one*10-9,10))
END
IF @i=0 and @billion>0
SET @result=@result+' billion'
IF @i=1 and @million>0
SET @result=@result+' million'
IF @i=2 and @thousand>0
SET @result=@result+' thousand'
SET @i=@i+1
END
IF SUBSTRING(@s,14,2)<>'00'
BEGIN
SET @result=@result+' AND '
IF SUBSTRING(@s,14,1)='0'
SET @result=@result+'zero'
ELSE
SET @result=@result+RTRIM(SUBSTRING(@numbers,CAST(SUBSTRING(@s,14,1) AS int)*10-9,10))
IF SUBSTRING(@s,15,1)<>'0'
SET @result=@result+' '+RTRIM(SUBSTRING(@numbers,CAST(SUBSTRING(@s,15,1) AS int)*10-9,10))
END
RETURN(@result)
END
------------------------------------------------------------------------------------------------
CREATE FUNCTION f_amt_to_chn (@num numeric(14,2))
RETURNS varchar(100) WITH ENCRYPTION
AS
BEGIN
DECLARE @n_data VARCHAR(20),@c_data VARCHAR(100),@n_str VARCHAR(10),@i int
SET @n_data=RIGHT(SPACE(14)+CAST(CAST(ABS(@num*100) AS bigint) AS varchar(20)),14)
SET @c_data=''
SET @i=1
WHILE @i<=14
BEGIN
SET @n_str=SUBSTRING(@n_data,@i,1)
IF @n_str<>' '
BEGIN
IF not ((SUBSTRING(@n_data,@i,2)='00') or ((@n_str='0') and ((@i=4) or (@i=8) or (@i=12) or (@i=14))))
SET @c_data=@c_data+SUBSTRING('零壹贰叁肆伍陆柒捌玖',CAST(@n_str AS int)+1,1)
IF not ((@n_str='0') and (@i<>4) and (@i<>8) and (@i<>12))
SET @c_data=@c_data+SUBSTRING('仟佰拾亿仟佰拾万仟佰拾元角分',@i,1)
IF SUBSTRING(@c_data,LEN(@c_data)-1,2)='亿万'
SET @c_data=SUBSTRING(@c_data,1,LEN(@c_data)-1)
END
SET @i=@i+1
END
IF @num<0
SET @c_data='负'+@c_data
IF @num=0
SET @c_data='零元'
IF @n_str='0'
SET @c_data=@c_data+'整'
RETURN(@c_data)
END
测试上面两个函数的效果
select
name as 姓名,
gz as 实发工资,
dbo.f_amt_to_chn(gz) as 中文金额,
dbo.f_amt_to_eng(gz) as 英文金额
运行结果:
from tb_hr_gz
8.2删除函数
语法:
drop function <函数名称>
代码:
drop function f_num_to_eng
------------------------------------------------------------------------------------------------
9.变量,赋值,控制语句(存储过程,触发器,函数应用)
9.1局部/全局变量定义
局部变量 (以@开头)
格式:declare @变量名 数据类型
代码:declare @x int
全局变量 (必须以@@开头)
格式:declare @@变量名 类型
代码:select @@id = '10010001'
9.2赋值语句set/select
set @id = '10010001'
select @id = '10010001'
9.3条件语句(if/case)
9.3.1 语句if
declare @x int @y int @z int
select @x = 1 @y = 2 @z=3
if @x > @y
print 'x > y' --打印字符串'x > y'
else if @y > @z
print 'y > z'
else print 'z > y'
9.3.2 语句CASE
--CASE
use pangu
update employee
set e_wage =
case
when job_level = ’1’ then e_wage*1.08
when job_level = ’2’ then e_wage*1.07
when job_level = ’3’ then e_wage*1.06
else e_wage*1.05
end
9.4循环语句(while)
--WHILE
declare @x int @y int @c int
select @x = 1 @y=1
while @x < 3
begin
print @x --打印变量x 的值
while @y < 3
begin
select @c = 100*@x + @y
print @c --打印变量c 的值
select @y = @y + 1
end
select @x = @x + 1
select @y = 1
end
9.5定时执行(waitfor)
--WAITFOR
--例 等待1 小时2 分零3 秒后才执行SELECT 语句
waitfor delay ’01:02:03’
select * from employee
--例 等到晚上11 点零8 分后才执行SELECT 语句
waitfor time ’23:08:00’
select * from employee
---------------------------------------------------------------------
10.标准SQL字符串函数
ASCII() --函数返回字符表达式最左端字符的ASCII 码值
CHAR() --函数用于将ASCII 码转换为字符--如果没有输入0 ~ 255 之间的ASCII 码值CHAR 函数会返回一个NULL
LOWER() --函数把字符串全部转换为小写
UPPER() --函数把字符串全部转换为大写
STR() --函数把数值型数据转换为字符型数据
LTRIM() --函数把字符串头部的空格去掉
RTRIM() --函数把字符串尾部的空格去掉
LEFT(),RIGHT(),SUBSTRING() --函数返回部分字符串
CHARINDEX(),PATINDEX() --函数返回字符串中某个指定的子串出现的开始位置
REPLICATE() --函数返回一个重复character_expression 指定次数的字符串
select replicate('abc', 3) replicate( 'abc', -2)运行结果如下abcabcabc NULL
REVERSE() --函数将指定的字符串的字符排列顺序颠倒
REPLACE() --函数返回被替换了指定子串的字符串
select replace('abc123g', '123', 'def')运行结果如下abcdefg
SPACE() --函数返回一个有指定长度的空白字符串
STUFF() --函数用另一子串替换字符串指定位置长度的子串