MSSQL判断表是否存在及字段是否存在
判断表是否存在
IF EXISTS (SELECT * FROM sysobjects WHERE name = 't_dispatchBill_entry' AND xtype = 'U')
DROP TABLE t_dispatchBill_entry
GO
在ms sql中当我们需要修改表结构的时候,有时候因为添加或修改的表字段存在或不存在而导致后面的sql脚本执行失败。
这时我们需要一个语句来判断当前字段的有效性。然后再执行我们的sql脚本,这样就可以避免了。
--根据表名查询当前表的字段及其对应的表
select b.name tableName, a.name fieldName
from syscolumns a join sysobjects b on a.id = b.id
where b.xtype = 'u' and b.name = 'mm_sample';
go
/*
xtype 的表示参数类型,通常包括如下这些
C = CHECK 约束
D = 默认值或 DEFAULT 约束
F = FOREIGN KEY 约束
L = 日志
FN = 标量函数
IF = 内嵌表函数
P = 存储过程
PK = PRIMARY KEY 约束(类型是 K)
RF = 复制筛选存储过程
S = 系统表
TF = 表函数
TR = 触发器
U = 用户表
UQ = UNIQUE 约束(类型是 K)
V = 视图
X = 扩展存储过程
*/
--根据表名查询字段信息
select name from syscolumns where id in (
select id from sysobjects where name = 'mm_sample'
)
go
select table_Name, column_Name from information_schema.columns
where table_name = 'mm_sample'
go
select name, length from syscolumns
where id = object_id( 'mm_sample ')
and colid in (
select colid from sysindexkeys where id = object_id( 'mm_sample ')
)
go
--select object_id('mm_sample')
--select * from sysobjects where id = object_id('mm_sample')
select name, * from syscolumns where id = object_id('mm_sample')
go
--查看表信息
sp_help 'mm_sample'
go
if (exists (select name from syscolumns where id = object_id('mm_sample') and name = 'wt_id'))
print '该字段已经存在!';
else
print '该字段不存在';
go
多级数据修改上级编码的sql
update t_item set fnumber = stuff(fnumber,1,datalength('20.00.02.03'),'20.00.02.01') where fitemclassid=4 and fnumber like '20.00.02.03%'
例子:
-20
-20.00
-20.00.02
-20.00.02.03
-20.00.02.03.010101
-20.00.02.03.010102
-20.00.02.03.010103
修改红色的编码时下级所有的编码都需要修改
1、创建数据库:create database Flights; //Flights数据库名。
示例1:一个数据库文件和一个日志文件
CREATE DATABASE stuDB
(
/*数据文件的具体描述*/
NAME='stuDB_data', //主数据文件的逻辑名。
FILENAME='D:\project\stuDB_data.mdf', //主数据文件的物理名。
SIZE=5mb, //主数据文件的大小。
MAXSIZE=100mb, //主数据文件增长的最大值。
FILLEGROWTH=15%, //主数据文件的增长率。
)
LOG ON
(
/*日志文件的具体描述,各参数含义同上。*/
NAME='stuDB_log',
FILENAME='D:\project\stuDB_log.ldf',
SIZE=2mb,
FILEGROWTH=1mb,
)
GO //和后续的SQL语句分隔开。
/*------数据文件的组成:
主数据文件:*.mdf
次要数据文件:*.ndf
日志文件:*.ldf
------*/
2、删除数据库:drop database Flights;
3、配置数据库选项:
EXEC sp_dboption 'pubs','read only','true' //将pubs数据库设为只读。
——用EXECUTE(EXEC)命令配置SQL Server 2000数据库。参数sp_dboption为存储过程,可以显示或更改数据库选项。'master'和'tempdb'不能使用此存储过程。
EXEC sp_dboption 'pubs',autoshrink,true //自动周期性收缩'pubs'数据库文件。
——和sp_dboption一起使用的选项autoshrink。SQL Server 2000允许把数据库中的文件收缩,这样可以删除未使用页并建立更多空间。可以手动收缩或者设置为定期自动收缩数据库文件。收缩过程可以设置为后台运行,而其他的任务可以继续在前台进行。
EXEC sp_dboption 'pub','single user' //同一时间内只有一个用户可以访问这个数据库。
——分离数据库
EXEC sp_detach_db '数据库名'
——附加数据库
EXEC sp_attach_db '数据库名','数据库文件的物理位置'
——更改数据库名
EXEC sp_renamedb '旧数据库名','新数据库名'
——添加Windows登录帐户
EXEC sp_grantlogin 'windows域名\域帐户' //windows域名\域帐户:计算机名,在计算机管理器中添加。
——添加SQL登录帐户
EXEC sp_addlogin '帐户名','密码'
——创建数据库用户
EXEC sp_grantdbaccess '登录帐户','数据库用户' //"数据库用户"为可选项,默认为登录帐户,即数据库用户默认和登录帐户同名。
4、收缩数据库:
DBCC SHRINKDATABASE(PUBS,10) //用DBCC命令收缩数据库,减少'pubs'数据库中文件大小,并允许其有 10%的未用空间。
5、创建表:
creat table Airlines_Master(Aircode char(2),AirName varchar(15))
创建表Airlines_Master,表有两个字段Aircode和AirName,数据类型char和varchar,大小2,15。
6、SQL Server数据类型
7、数据完整:
(1)实体完整性:
“实体完整性”的规则规定,基表主键的任何部分都不可以接受空值。
主键:唯一地标识表中的记录的一个或一组列称为“主键”。
每个表都应有一个主键。
(2)域完整性:
指定输入到给定列的数据的合法性。
(3)引用完整性:
“引用完整性”的规则规定,所引用的外部数据必须存在。
DBMS负责确保外键的属性值有效,并且在该属性作为主键的表中能找到与之对应的匹配项。仅当在其他表中没有与之对应的外键时,主表中的记录才能删除。外键中不能引入新的值。
外键:是一个或一组列,其中列的值与另外一个表中的主键或唯一键匹配。
1、两个表是通过外键关联起来的。
2、在给定的表中,要将某一列设置为外键,那么该列应该对应另外一个表的主键或唯一键。
3、两个通过外键关系关联到一起的表,其相应字段的类型定义应该相同。
(4)用户定义完整性:
8、主键(PRIMARY KEY)约束
(1)主键(PRIMARY KEY):
——创建主键方法一:
create table table_name
(PNR_no int PRIMARY KEY) //在建table_name表时,为PNR_no列创建主键约束。
——创建主键方法二:(更改主键约束)
alter table table_name
add constraint PK_const
PRIMARY KEY(PNR_NO)
//为表table_name的PNR_NO列添加PK_const(约束名)主键约束。
(2)组合键:
(3)标识主键:
(4)唯一约束:
(5)标识属性:
——IDENTITY(自动增长)
creat table table_name
(PNR_no int IDENTITY(1,1))
//创建表table_name,PNR_no列名,IDENTITY属性,1:初始值。1:步长(可以是负值)。
9、修改数据库表:
ALTER TABLE table_name
[ALTER COLUMN column_name int] //指定要修改的列,int 指定将列修改为新的数据类型int。
|ADD column_name int //int要添加列的数据类型,ADD向表中加一列。
|DROP COLUMN column_name //DROP COLUMN 从表中删除一列
10、删除数据库中表:
drop table table_name
drop table不能删除有外键约束引用的表。
11、约束和约束对象
12、DEFAULT
13、外键约束:
14、添加和删除表的约束对象:
——在创建表时创建约束:
create table table_name
(column_first char(2) primary key,column_second varchar(15));
//创建table_name表,给column_first 列创建主键约束。
——在现有表中创建约束
alter table table_name add constraint check_name check(unityprice>=10)
//给表table_name添加check_name约束条件为unityprice>=10,add constraint 关键字。
——添加主键约束(stuNo作为主键)
ALTER TABLE stuInfo
ADD CONSTRAINT PK_stuNo PRIMARY KEY(stuNO)
——添加唯一约束(身份证号唯一,因为每人的身份证号是全国唯一的)
ALTER TABLE stuInfo
ADD CONSTRAINT UQ_stuID UNIQUE(stuID)
——添加默认约束(如地址不添,默认值为“地址不详”)
ALTER TABLE stuInfo
ADD CONSTRAINT DF_stuAddress DEFAULT('地址不详') FOR stuAddress
——添加检查check约束,要求年龄只能在15—40岁之间。
ALTER TABLE stuInfo
ADD CONSTRAINT CK_stuAge CHECK(stuAge BETWEEN 15 AND40)
——添加外键约束(主表stuInfo和从表stuMarks建立关系,关联字段为stuNo)
ALTER TABLE stuMarks
ADD CONSTRAINT FK_stuNo
FOREIGN KEY(stuNo) REFERENCES stuInfo(stuNo)
GO
——删除约束
ALTER TABLE stuInfo
DROP CONSTRAINT DF_stuAddress
15、T-SQL中的条件表达式和逻辑运算符:
(1)一元运算符:
(2)二元运算符:
(3)比较运算符:
(4)通配符:
(5)逻辑运算符:
16、插入语句:
INSERT INTO jobs VALUES('Graphic Artist',25,100) //插入一行。
17、将一个表中的数据添加到另一个表中:
CREATE TABLE author_details(au_id varchar(11),au_lname varchar(40),)
GO
INSERT author_details SELECT authors.au_id,authors.au_lname, FROM authors
//将authors表中的au_id和au_lname列的内容插入到author_details表中。
18、更新表中的数据
(1)更新一行
UPDATA table_name
SET price=price+(25/100*price)
WHERE table_id='TC7777'
//更新table_name表的列table_id的TC7777行的price列的值为price+(25/100*price)。
(2)更新多行
UPDATA table_name
SET column_first='aaa',column_second=1
//将table_name表的column_first和column_second的所有行更新为aaa和1.
(3)使用关联信息更新
——内联接
——外连接
——自链接
19、从表中删除数据
(1)删除一行数据
delete from pub_info where pub_id=9999 //删除pub_id值为9999的行
(2)删除多行数据
delete from stores where state='CA' // 删除state所有值为CA的行。
(3)删除表中的所有数据
truncate table sales //truncate table 用于删除表中所有行的命令。
不能用于有外键约束引用的表,这种情况下,需要使用不带WHERE子句的DELETE语句。
20、查询语句:
SELECT column_1,column_2 FROM table_name;
//列名用“,”分开,";"是可选的。
SELECT * FROM table_name //搜索table_name的所有列。
SELECT au_fname FROM authors WHERE state='CA'; //WHERE指定了查询条件
SELECT state FROM authors GROUP BY state //查询authors表的state列,并按不同内容的state列分组。
SELECT * FROM authors WHERE state='CA' ORDER BY au_fname
//查询authors表的所有符合state='CA' 条件的列,并按au_fname排序。参数未指定默认为升序。DESC是降序,ASC是升序。
21、在查询中使用常量:
当连接字符列时,为了获得正确的格式或可读性,可以使用字符串常量。常数一般不会在结果集中作为单独的列指定。通常在显示结果集时,使用应用程序将常数值合并到结果集中比通过服务器合并常数值效率更高。
SELECT title_id+':'+title+'->'+type FROM titles
//搜索titles表中的title_id列、title列、type列,并用###:ttt->xx的形式显示。
注意:在已选的表中使用加号(+)时,一定要注意列的数据类型。该列与其左右两边的列的数据类型应该一致。否则SQL Server会给出错误信息。
22、使用AS子句命名列:
SELECT PNR_no AS 'PNR NUMBER' FROM Reservation
//搜索Reservation表的PNR_no列,显示列名为“PNR NUMBER”
23、使用标识列:
SELECT IDENTITY(datatype,seed,increment) AS column_name
INTO Table2
FROM Table1
//检索表Table1,将检索到的内容放到表Table2中列名为column_name的列中,datatype为数据类型(Int或Decimal);seed为第一行的值,increment为递增的步长。
24、使用TOP子句限制查询返回行数。
SELECT TOP 3 * FROM table;
//显示table表的前三行。
SELECT TOP 40 PERCENT * FROM table;
//显示表table所有行中前40%的行。
25、分组查询
26、聚合函数
——SUM:返回表达式中所有数值的总和。
——AVG:返回表达式中所有数值的平均值。
——COUNT:返回提供的表达式中非空值的数目。
——MAX:返回表达式中最大的值。
——MIN:返回表达式中最小的值。
27、使用HAVING子句选择行
28、向数据库用户授权
USE database_name //数据库名、
GO
//为DBUser分配对表table_name的select,insert,updata 权限。
GRANT select,insert,updata ON table_name TO DBUser
//为DBUser2分配建表的权限。
GRANT create table TO DBUser2
29、使用变量
——局部变量
DECLARE @variable_naem DataType //@variable_naem 局部变量名称,DataType为数据类型。
——局部变量的付值
1、
SET @variable_name=value
2、
SELECT @variable_name=value
——全局变量
全局变量有系统定义和维护。
@@ERROR 最后一个T-SQL错误的错误号
@@IDENTITY 最后一个插入的标识值
@@LANGUAGE 当前使用语言的名称
@@MAX_CONNECTIONS 可以创建的同时链接的最大数目
@@ROWCOUNT 受上一个SQL语言影响的行数
@@SERVERNAME 本地服务器的名称
@@SERVICENAME 该计算机上的SQL服务的名称
@@TIMETICKS 当前计算机上每刻度的微秒数
@@TRANSCOUNT 当前连接打开的事务数
@@VERSION SQL Server的版本信息
30、输出语句
print '服务器的名称:'+@@SERVERNAME //本地服务器名称
SELECT @@ SERVERNAME AS '服务器名称'
示例:
//@@ERROR返回的是整型数值,用convert(varchar(5),@@ERROR)的方式将它转换为字符串。
INSERT INTO stuInfo(stuName,stuNo,stuSex,stuAge)VALUES('梅超风','s25318','女','23')
print '当前错误号'+convert(varchar(5),@@ERROR) //如果大于0,表示上一条语句执行有错误
print '刚才报名的学员,座位号为:' +convert(varchar(5),@@IDENTITY)
UPDATA stuinfo SET stuAge=85 WHERE stuName='李文才'
print 'SQL Server 的版本'+@@VERSION
GO
//输出结果为
当前错误号0
刚才报名的学员,座位号:12
服务器:消息547,级别16,状态1,行1
UPDATA 语句与COLUMN CHECK 约束’CK_stuAge‘冲突。该冲突发生于数据库'stuDB',表'stuInfo'
语句终止
当前错误号547
SQL Server的版本Microsoft SQL Server 2000-8.00.2039(Intel X86)
……
31、逻辑控制语句
IF-ELSE:
IF(条件)
BEGIN
语句1
语句2
END
ELSE
……
WHILE循环语句:
WHILE(条件)
BEGIN
语句或语句块
[BREAK]
END
CASE多分支语句:
CASE
WHEN 条件1 THEN 结果1
WHEN 条件2 THEN 结果2
[ELSE 其他结果]
END
32、批处理语句“GO”
"GO"就是批处理的标志,它是一条或多条SQL语句的集合,SQL Server将批处理语句编译成一个可执行单元,此单元成为执行计划。每个批处理可以编译成单个执行计划,从而提高执行效率。如果批处理包含多条SQL语句,执行这些语句所需的所有优化的步骤将编译在单个执行计划中。
批处理的主要好处就是简化数据库的管理。
批处理示例如下:
USE Master
GO
//GO关键字标志批处理结束。
另一个示例:
SELECT * FROM stuInfo
SELECT * FROM stuMarks
UPDATA stuMarks SET writtenExam=writtenExam+2
GO
//此时三条语句组成一个执行计划,然后再执行。
一般是将一些逻辑相关的业务操作语句,放置在同一批中,这完全由代码编写者决定。
但是,SQL Server规定:如果是建库、建表语句、以及我们后面学习的存储过程和视图等,则必须在语句末 尾加“GO”批处理标志。
33、简单子查询
方法一:采用T-SQL变量实现
DECLARE @age INT //定义变量,用于存放李斯文的年龄
SELECT @age=stuAge FROM stuInfo where stuName='李斯文' // 求出李斯文的年龄。
SELECT * FROM stuInfo WHERE stuAge>@age //筛选比李斯文年龄大的学员。
GO
方法二:采用子查询实现。
SELECT * FROM stuInfo
WHERE stuAge>(SELECT stuAge FROM stuIfo where stuName='李斯文')
GO
//必须保证子查询返回的值不能多于一个。
——将多表间数据组合在一起,替换连接查询。
方法一:采用表连接
SELECT stuName FROM stuInfo INNER JOIN stuMarks //INSERT JOIN 内连接
ON stuInfo.stuNo=stuMarks.stuNo WHERE writtenExam=60
GO
方法二:采用子查询
SELECT stuName FROM stuInfo
WHERE stuNo=(SELECT stuNo FROM stuMarks WHERE writtenExam=60)
go
一般来说,表连接都可以用子查询替换,但反过来说却不一定。有的子查询不能用表连接来替换。子查询比较灵活、方便,形式多样,适合于作为查询的筛选条件。而表连接更适合查多表的数据。
34、IN和NOT IN子查询
使用“=”、“>”等计较运算符号,要求子查询只能返回一条或空的记录。SQL Server中,当子查询跟随在=、!=、<、<=、>、>=之后,不允许子查询返回多条记录。
——采用IN子查询
//查询参见考试的学员名单
SELECT stuName FROM stuInfo
WHERE stuNo IN (SELECT stuNo FROM stuMarks)
go
——采用NOT IN子查询
//查询未参加考试学员的名单
SELECT stuName FROM stuInfo
WHERE stuNo NOT IN (SELECT stuNo FROM stuMarks)
GO
35、EXISTS和NOT EXISTS子查询
IF EXISTS(SELECT * FROM sysDatabase WHERE name='stuDB')
DROP DATABASE stuDB
CREATE DATABASE stuDB
……建库代码略
问题:检查本次考试,本班如果有人笔试成绩达到80分以上,则每人提2分。否则,每人允许提5分。
IF EXISTS(SELECT * FROM stuMarks WHERE writtenExam>80)
BEGIN
print '本班有人笔试成绩高于80分,每人只加2分,加分后的成绩为:'
UPDATE stuMarks SET writtenExam=writtenExam+2
SELECT * FROM stuMarks
END
GO
//EXISTS 和IN 一样,同样允许添加NOT取反,表示不存在。
问题:检查本次考试,本班如果没有一人通过考试(笔试和机试成绩都>60分),则实体偏难,每人加3分,否则,每人加1分。
IF NOT EXISTS(SELECT * FROM stuMarks WHERE writtenExam>60 AND labExam>60)
BEGIN
print '本班无人通过考试,考试题偏难,每人加3分,加分后的成绩为:'
UPDATE stuMarks SET writtenExam=writtenExam+3,labExam=labExam+3
SELECT * FROM stuMarks
END
ELSE
BEGIN
print '本班考试成绩一般,每人只加1分,加分后的成绩为:'
UPDATE stuMarks SET writtenExam=writtenExam+1,labExam=labExam+1
SELECT * FROM stuMarks
END
GO
36、T-SQL语句的综合应用
假定目前本次考试学员信息表(stuIfo)和学员成绩表(stuMarks)的原始数据为如下:
stuIfo表:
stuName stuNo stuSex stuAge stuSeat stuAddress
1 张秋丽 s25301 男 18 1 北京海淀
2 李文才 s25302 男 31 3 地址不详
3 李斯文 s25303 女 22 2 河南洛阳
4 欧阳俊雄 s25034 男 28 4 新疆威武哈
5 梅超风 s25318 女 23 5 地址不详
stuMarks表:
ExamNo stuNo writtenExam labExam
1 S271811 s25303 93 59
2 S271813 s25302 63 91
3 S271816 s25301 90 83
4 S271817 s25318 63 53
问题:
1、统计本次考试的缺考情况,结构如下:
应到人数 实到人数 缺考人数
1 5 4 1
2、提取学员的成绩信息并保存结果,包括学员姓名、学号、笔试成绩、机试成绩、是否通过。
3、比较笔试平均分和机试平均分,较低者进行循环提分,但提分后最高分不能超过97分。
4、提分后,统计学员的成绩和通过情况,如下:
姓名 学号 笔试成绩 机试成绩 是否通过
1 张秋丽 s25301 90 89 是
2 李文才 s25302 63 97 是
3 李斯文 s25303 93 65 是
4 欧阳俊雄 s25034 缺考 缺考 否
5 梅超风 s25318 63 59 否