数据库的恢复是指当数据库系统发生故障时,通过一些技术, 使数据库从被破坏、不正确的状态恢复到最近一个正确的状态。
恢复的基本原则就是冗余,即数据的重复存储。恢复的常用方法有: (1)定期对整个数据库进行复制或转储; (2)建立日志文件; (3)恢复。用REDO或UNDO处理。
6.8 数据库的并发操作会带来哪些问题?如何解决?
数据库的并发操作会带来三类问题:
(1)丢失更新问题;(具体内容见教材P158) (2)不一致分析问题 (3)“脏数据”的读出。
解决的办法通常是采用“封锁”技术。
6.9 有哪些“丢失更新”问题?如何处理?
(1)并发调度引起的“丢失更新”问题。在并发调度中,如两个事务同时对某数据库进行更新操作, 在操作中丢失了其中某个事务对某数据的更新操作。处理的办法就是对并发操作采用X封锁技术。 (2)由恢复引起的更新丢失现象。采用X封锁以后,先执行事务T1,再执行事务T2,此时, 如果T2做ROLLBACK操作,就把事务T2的更新丢失了。 处理方式是采用PXC协议,不允许事务T1执行解锁操作直到事务执行到终点(COMMIT或ROLLBACK)。
6.10 为什么DML只提供解除S封锁的操作,而不提供解除X封锁的操作?
为了防止由恢复引起的更新丢失现象,PXC协议规定:X封锁必须保留到事务终点(COMMIT或ROLLBACK)。 因此在DML中,COMMIT或ROLLBACK的语义中包含了X封锁的解除,不用提供解除X封锁的操作。
而对于S封锁而言,它是一种共享型的封锁(读取但不能修改),其数据不可能是未提交的修改, 封锁不必等提交后才能解除,因此可以由事务用UNLOCK解除各自对数据的封锁。
6.11 为什么有些封锁需保留到事务终点,而有些封锁可随时解除?
因为有的封锁需要更新数据,保留到终点才能确认是否提交或回退以避免脏数据的读出, 所以这些封锁需要保留到事务终点。
而有些事务全部或部分操作只是读取数据,不涉及更新数据操作, 因此这一部分操作的封锁可以随时解除。
6.12 死锁的发生是坏事还是好事?试说明理由。如何解除死锁状态?
死锁的发生即是坏事又是好事。
(1)使并发事务不能继续执行下去,造成时间开销却不产生结果。 (2)在某些时候我们要利用它来解决更新操作导致的数据库不一致状态。
解除死锁状态:抽出某个事务作为牺牲品,把它撤消,做回退操作,解除它的所有封锁,并恢复到初始状态。
6.13 试叙述\"串行调度\"与\"可串行化调度\"的区别。
串行调度是多个事务按照一定的次序依次执行;在某一时刻只有一个事务在执行。
而可串行化调度是并发调度中的一个概念。在并发调度中,某一时刻有多个事务同时被处理。 如果某事务集的一个并发调度的结果与某个串行调度等价, 则称此并发调度是是可串行化调度。
(以上几题具体可参照书上p20-21)
6.14 什么是数据库的完整性? DBMS的完整性子系统的功能是什么?
数据库的完整性是指数据的正确性和相容性。DBMS完整性子系统的功能是: (1)监督事务的执行,并测试是否违反完整性规则;
(2)如有违反,则采取恰当的操作,如拒绝、报告违反情况,改正错误等方法进行处理。
6.15 完整性规则由哪几个部分组成?关系数据库的完整性规则有哪几类?
完整性规则由三部分组成:
触发条件:即什么时候使用规则进行检查; 约束条件:即要检查什么样的错误; ELSE子句:即查出错误后该如何处理。
完整性规则有以下三类:
域完整性规则,用于定义属性的取值范围;
域联系的规则,定义一个或多个关系中,属性值间的联系、影响和约束。 关系完整性规则,定义更新操作对数据库中值的影响和。
6.16 试详述SQL中的完整性约束机制?
SQL中的完整性约束规则有主键约束、外键约束、属性值约束和全局约束等多种形式。
△主键约束。它是数据中最重要的一种约束。在关系中主键值不允许空,也不允许出现重复, 体现了关系要满足实体完整性规则。主键可用主键子句或主键短语进行定义。
△外键约束。根据参照完整性规则,依赖关系中外键或者为空值, 或者是基本关系(参照关系)中的该键的某个值。外键用外键关系子句定义, 并考虑删除基本关系元组或修改基本关系的主键值的影响,依赖关系可按需要采用RESTRICT、SET NULL、CASCADE方式。
△属性值约束。当要求某个属性的值不允许空值时,那么可以在属性定义后加上关键字:NOT NULL , 这是非空值约束。还可以用CHECK子句对一个属性值加以以及使用域约束子句CREAT DOMAIN 定义新域并加以属性值检查。
△全局约束。在关系定义时,可以说明一些比较复杂的完整性约束,这些约束涉及到多个属性间的联系 或不同关系间的联系,称为全局约束。主要有基于元组的检查子句和断言。 前者是对单个关系的元组值加以约束,后者则可对多个关系或聚合操作有关的完整性约束进行定义。
6.17 参照完整性规则在SQL可以用哪几种方式实现?删除基本关系的元组时, 依赖关系可以采取的做法有哪三种?修改基本关系的主键值时,依赖关系可以采取的做法有哪三种?
参照完整性规则要求\"不引用不存在的实体\",参照完整性规则在SQL可用以下几种方式实现: (1)在SQL中采用外键子句定义外键,并考虑删除基本关系元组或修改基本关系的主键值, 对依赖关系产生的影响;
(2)在属性值上进行约束如基于属性的检查; (3)全局约束中的基于元组的检查子句等。
删除基本关系元组或修改基本关系的主键值时,依赖关系可以采用的做法有:
△RESTRICT方式:只有当依赖关系中没有一个外键值与基本关系中要删除/修改的主键值相对应时, 系统才能执行删除/修改操作,否则拒绝删除或修改。 △SET NULL方式:删除基本元组时,将依赖关系中所有与基本关系中被删除主键值相对应的外键值置为空值。 修改基本关系的主键值时,将依赖关系中所有与基本关系中被修改主键值相对应的外键值置为空值。 △CASCADE方式:若删除则将依赖关系中所有外键值与基本关系中要删除的主键值相对应的元组一并删除, 若修改则将依赖关系中所有与基本关系中要修改的主键值相对应的外键值一并修改为新值。 6.18 试对SQL2中的基于属性的检查约束、基于元组的检查约束和断言 三种完整性约束进行比较:各说明什么对象?何时激活?能保证数据库的一致性吗? 约束形式 说明对象 激活条件 是否保证一致性 基于属性的检查 只对一个属性值加以约束 插入或修改属性值时 不一定 基于元组的检查 对单个关系的元组值加以约束 在插入或修改元组时 不一定 断言 6.19 设教学数据库的模式如下: S(S#,SNAME,AGE,SEX) SC(S#,C#,GRADE) C(C#,CNAME,TEACHER) 试用多种方式定义下列完整性约束: (1)在关系S中插入学生年龄值应在16~25岁之间 (2)在关系SC中插入元组时,其S#值和C#值必须分别在S和C中出现。 (3)在关系SC中修改GRADE值时,必须仍在0~100之间。 (4)在删除关系C中一个元组时,首先要把关系SC中具有同样C#的元组全部删去。 (5)在关系S中把某个S#值修改为新值时,必须同时把关系SC中那些同样的S#值也修改为新值。 (1)定义S时采用检查子句: CREAT TABLE S( S# CHAR(4), SNAME char (10) NOT NULL , AGE SMALLINT , PRIMARY key(S#), CHECK (AGE>=16 and AGE<=25) ) (2)采用外键子句约束 CREAT TABLE SC( S# CHAR(4), C# CHAR(4), GRADE SMALLINT, FOREIGN key(S#) REFERENCE S(S#), FOREIGN key(C#) REFERENCE C(C#) 多个关系或聚合操作 任何变动 保证 )
(3)采用元组检查
CREAT TABLE SC( S# CHAR(4), C# CHAR(4), GRADE SMALLINT,
FOREIGN key(S#) REFERENCE S(S#), FOREIGN key(C#) REFERENCE C(C#), CHECK (GRADE>=0 and AGE<=100) )
(4)采用外键约束
CREAT TABLE SC( S# CHAR(4), C# CHAR(4), GRADE SMALLINT,
FOREIGN key(S#) REFERENCE S(S#), FOREIGN key(C#) REFERENCE C(C#) )
若改为:在删除关系C中一个元组时,同时把关系SC中具有同样C#的元组全部删去,则为: ......
FOREIGN key(C#) REFERENCE C(C#) ON DELETE CASCADE ......
(5)采用外键约束
CREAT TABLE SC( S# CHAR(4), C# CHAR(4), GRADE SMALLINT,
FOREIGN key(S#) REFERENCE S(S#) ON UPDATE CASCADE , FOREIGN key(C#) REFERENCE C(C#) )
6.20 在教学数据库的关系S、SC、C中,试用SQL2的断言机制定义下列两个完整性约束: (1)学生必须在选修Maths课后,才能选修其他课程。 (2)每个男学生最多选修20门课程
(1)
CREAT ASSERTION ASSE1 CHECK ( NOT EXISTS
( SELECT S FROM SC WHERE C# IN (SELECT C# FROM C
WHERE CNAME<>'MATHS') AND S# NOT IN
(SELECT S# FROM SC WHERE C# IN (SELECT C# FROM C
WHERE CNAME='MATHS'))); (2)
CREAT ASSERTION ASSE2 CHECK ( ALL(SELECT COUNT (SC.C#) FROM S,SC
WHERE S.S#=SC.S AND SEX='M' GROUP BY S#)<=20);
6.21 什么是数据库的安全性?有哪些安全措施?
数据库的安全性是指保护数据库防止不合法的使用,以免数据的泄漏、非法更改和破坏。 可以从以下方面设置数据库的安全措施:环境级、职员级、OS级、网络级和数据库系统级。 (具体可参见教材P173)
6.22 对银行的数据库系统应采取哪些安全措施?分别属于哪一级?
答案基本同上一题。
6.23 什么是\"权限\"?用户访问数据库可以有哪些权限?对数据库模式有哪些修改权限?
用户使用数据库的方式称为权限。
用户访问数库的权限有:读权限、插入权限、修改权限、删除权限。 用户修改数据库模式的权限有索引权限、资源权限、修改权限、撤销权限。
6.24 试解释权限的转授与回收。
在数据库系统中,为了保证数据的安全性,用户对数据的操作必须首先从DBA处获得权限,才能进行对数据的操作。 同时数据库系统也允许用户将获得的权限转授给其他用户,也允许把已授给其他用户的权限再回收上来。 但应保证转授出去的权限能收得回来。
6.25 SQL 语言中的视图机制有哪些优点?
视图机制使系统具有三个优点:数据安全性、数据性和操作简便性。
6.26 SQL2中用户权限有哪几类?并作必要的解释。
SQL2中定义了六类用户权限,分别是:
(1)SELECT :允许用户对关系或视图执行SELECT操作。
(2)INSERT :允许用户对关系或视图执行INSERT操作,如果还说明了一个属性表, 那么表示只能插入这些属性的值,关系中其他属性值将置为缺省值或为空值。 (3)DELETE:允许用户对关系或视图执行DELETE操作。
(4)UPDATE:允许用户对关系或视图执行UPDATE操作,如果还说明了一个属性表, 那么表示只能修改这些属性的值,否则表示可以修改关系中任一属性值。
(5)REFERENCES:允许用户定义新关系时,引用其他关系的主键作为外键。 (6)USAGE:允许用户使用定义的域。
6.27 数据加密法有些什么优点?如何实现?
数据加密可以更好地保证数据的完全性。加密采用一定的加密算法给把源文变为密文来实现。 常用的加密算法有\"替换方法\"和明键加密法。 创建数据库
创建之前判断该数据库是否存在 if exists (select * from sysdatabases where name='databaseName') drop database 'databaseName' go Create DATABASE database-name 删除数据库
drop database dbname 备份sql server
--- 创建 备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:\\mssql7backup\\MyNwind_1.dat' --- 开始 备份 BACKUP DATABASE pubs TO testBack 创建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) 根据已有的表创建新表: A:create table tab_new like tab_old (使用旧表创建新表) B:create table tab_new as select col1,col2… from tab_old definition only 删除新表
drop table tabname 增加一个列
Alter table tabname add column col type 注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 添加主键
Alter table tabname add primary key(col) 说明:删除主键: Alter table tabname drop primary key(col) 创建索引
create [unique] index idxname on tabname(col….) 删除索引:drop index idxname on tabname 注:索引是不可更改的,想更改必须删除重新建。 创建视图
create view viewname as select statement 删除视图:drop view viewname 几个简单的基本的sql语句
选择:select * from table1 where 范围 插入:insert into table1(field1,field2)
values(value1,value2) 删除:delete from table1 where 范围 更新:update table1 set field1=value1 where 范围 查找:select * from table1 where field1 like ‟%value1%‟ (所有包含„value1‟这个模式的字符串)---like的语法很精妙,查资料! 排序:select * from table1 order by field1,field2 [desc] 总数:select count(*) as totalcount from table1 求和:select sum(field1) as sumvalue from table1 平均:select avg(field1) as avgvalue from table1 最大:select max(field1) as maxvalue from table1 最小:select min(field1) as minvalue from table1[separator] 几个高级查询运算词
A: UNION 运算符 UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 B: EXCEPT
运算符 EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 C: INTERSECT 运算符 INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 注:使用运算词的几个查询结果行必须是一致的。 使用外连接
A、left outer join: 左外连接(左连接):结果集既包括连接表的匹配行,也包括左连接表的所有行。 SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c B:right outer join: 右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 C:full outer join: 全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。 [编辑本段]提升 复制表
(只复制结构,源表名:a 新表名:b) (Access可用) 法一:select * into b from a where 1<>1 法二:select top 0 * into b from a 拷贝表
(拷贝数据,源表名:a 目标表名:b) (Access可用) insert into b(a, b, c) select d,e,f from b; 跨数据库之间表的拷贝
(具体数据使用绝对路径) (Access可用) insert into b(a, b, c) select d,e,f from b in „具体数据库‟ where 条件 例子:..from b in '\"&Server.MapPath(\".\"&\"\\data.mdb\" &\"' where.. 子查询
(表名1:a 表名2:b) select a,b,c from a where a IN (select d from b 或者: select a,b,c from a where a IN (1,2,3)
显示文章、提交人和最后回复时间
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b 外连接查询
(表名1:a 表名2:b) select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c 在线视图查询
(表名1:a select * from (Select a,b,c FROM a) T where t.a > 1; between的用法
between查询数据范围时包括了边界值,not between不包括 select * from table1 where time between time1 and time2 select a,b,c, from table1 where a not between 数值1 and 数值2 in 的使用方法
select * from table1 where a [not] in („值1‟,‟值2‟,‟值4‟,‟值6‟) 删除主表中已经在副表中没有的信息
两张关联表delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 四表联查问题
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....
日程安排提前五分钟提醒
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 一条sql 语句搞定数据库分页
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 前10条记录
select top 10 * form table1 where 范围 选择排名
选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b) 派生结果表
包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表 (select a from tableA except (select a from tableB) except (select a from tableC) 随机取出10条数据
select top 10 * from tablename order by newid() 随机选择记录 select newid() 删除重复记录
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...) 列出数据库里所有的表名
select name from sysobjects where type='U' 列出表里的所有的
select name from syscolumns where id=object_id('TableName') 列示排列
列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。 select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type 显示结果: type vender pcs 电脑 A 1 电脑 A 1 光盘 B 2 光盘 A 2 手机 B 3 手机 C 3 初始化表table1
TRUNCATE TABLE table1 选择从10到15的记录
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc 数据类型转换
declare @numid int declare @id varchar(50) set @numid=2005 set
@id=convert(varchar,@numid) 通过上述语句完成数据类型Int转换成varchar,其他转换类似,可参看convert函数 [编辑本段]技巧 1=1,1=2的使用
在SQL语句组合时用的较多 “where 1=1” 是表示选择全部 “where 1=2”全部不选, 如: if @strWhere !=' begin set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere end else begin set @strSQL = 'select count(*) as Total from [' + @tblName + ']' end 我们可以直接写成 set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere 收缩数据库
--重建索引 DBCC REINDEX DBCC INDEXDEFRAG --收缩数据和日志 DBCC SHRINKDB DBCC SHRINKFILE 压缩数据库
dbcc shrinkdatabase(dbname) 转移数据库给新用户以已存在用户权限 exec sp_change_users_login 'update_one','newname','oldname' go 检查备份集
RESTORE VERIFYONLY from disk='E:\\dvbbs.bak' 修复数据库
Alter DATABASE [dvbbs] SET SINGLE_USER GO DBCC
CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK GO Alter DATABASE [dvbbs] SET MULTI_USER GO 日志清除
SET NOCOUNT ON DECLARE @LogicalFileName sysname, @MaxMinutes INT, @NewSize INT USE tablename -- 要操作的数据库名 Select @LogicalFileName = 'tablename_log', -- 日志文件名 @MaxMinutes = 10, -- Limit on time allowed to wrap log. @NewSize = 1 -- 你想设定的日志文件的大小(M) -- Setup / initialize DECLARE @OriginalSize int Select @OriginalSize = size FROM sysfiles Where name = @LogicalFileName Select 'Original Size of ' + db_name() + ' LOG is ' + CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' +
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB' FROM sysfiles Where name = @LogicalFileName Create TABLE DummyTrans (DummyColumn char (8000) not null) DECLARE @Counter INT, @StartTime DATETIME, @TruncLog VARCHAR(255) Select @StartTime = GETDATE(), @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY' DBCC SHRINKFILE (@LogicalFileName, @NewSize) EXEC (@TruncLog) -- Wrap the log if necessary. WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired AND @OriginalSize = (Select size FROM sysfiles Where name = @LogicalFileName) AND (@OriginalSize * 8 /1024) > @NewSize BEGIN -- Outer loop. Select @Counter = 0 WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000)) BEGIN -- update Insert DummyTrans VALUES ('Fill Log') Delete DummyTrans Select @Counter = @Counter + 1 END EXEC (@TruncLog) END Select 'Final Size of ' + db_name() + ' LOG is ' + CONVERT(VARCHAR(30),size) + ' 8K pages or ' + CONVERT(VARCHAR(30),(size*8/1024)) + 'MB' FROM sysfiles Where name = @LogicalFileName Drop TABLE DummyTrans SET NOCOUNT OFF 更改某个表
exec sp_changeobjectowner 'tablename','dbo' 存储更改全部表
Create PROCEDURE dbo.User_ChangeObjectOwnerBatch @OldOwner as NVARCHAR(128), @NewOwner as NVARCHAR(128) AS DECLARE @Name as NVARCHAR(128) DECLARE @Owner as NVARCHAR(128) DECLARE @OwnerName as NVARCHAR(128) DECLARE curObject CURSOR FOR select 'Name' = name, 'Owner' = user_name(uid) from sysobjects where user_name(uid)=@OldOwner order by name OPEN curObject FETCH NEXT FROM curObject INTO @Name, @Owner WHILE(@@FETCH_STATUS=0) BEGIN if @Owner=@OldOwner begin set
@OwnerName = @OldOwner + '.' + rtrim(@Name) exec sp_changeobjectowner @OwnerName,
@NewOwner end -- select @name,@NewOwner,@OldOwner FETCH NEXT FROM curObject INTO @Name, @Owner END close curObject deallocate curObject GO SQL SERVER中直接循环写入数据
declare @i int set @i=1 while @i<30 begin insert into test (userid) values(@i) set @i=@i+1 end
-语 句 功 能 --数据操作
SELECT --从数据库表中检索数据行和列 INSERT --向数据库表添加新数据行 DELETE --从数据库表中删除数据行 UPDATE --更新数据库表中的数据 --数据定义
CREATE TABLE --创建一个数据库表 DROP TABLE --从数据库中删除表 ALTER TABLE --修改数据库表结构 CREATE VIEW --创建一个视图 DROP VIEW --从数据库中删除视图 CREATE INDEX --为数据库表创建一个索引 DROP INDEX --从数据库中删除索引 CREATE PROCEDURE --创建一个存储过程 DROP PROCEDURE --从数据库中删除存储过程 CREATE TRIGGER --创建一个触发器 DROP TRIGGER --从数据库中删除触发器 CREATE SCHEMA --向数据库添加一个新模式 DROP SCHEMA --从数据库中删除一个模式 CREATE DOMAIN --创建一个数据值域 ALTER DOMAIN --改变域定义
DROP DOMAIN --从数据库中删除一个域 --数据控制
GRANT --授予用户访问权限 DENY --拒绝用户访问 REVOKE --解除用户访问权限 --事务控制
COMMIT --结束当前事务 ROLLBACK --中止当前事务
SET TRANSACTION --定义当前事务数据访问特征 --程序化SQL
DECLARE --为查询设定游标 EXPLAN --为查询描述数据访问计划
OPEN --检索查询结果打开一个游标 FETCH --检索一行查询结果 CLOSE --关闭游标
PREPARE --为动态执行准备SQL 语句 EXECUTE --动态地执行SQL 语句 DESCRIBE --描述准备好的查询 ---局部变量
declare @id char(10) --set @id = 10010001 select @id = 10010001 ---全局变量 ---必须以@@开头 --IF ELSE
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 --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
--WHILE CONTINUE BREAK 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 --WAITFOR
--例 等待1 小时2 分零3 秒后才执行SELECT 语句 waitfor delay ‟01:02:03‟ select * from employee
--例 等到晚上11 点零8 分后才执行SELECT 语句 waitfor time ‟23:08:00‟ select * from employee ***SELECT***
select *(列名) from table_name(表名) where column_name operator value ex:(宿主)
select * from stock_information where stockid = str(nid) stockname = str_name stockname like % find this %
stockname like [a-zA-Z]% --------- ([]指定值的范围) stockname like [^F-M]% --------- (^排除指定范围)
--------- 只能在使用like关键字的where子句中使用通配符) or stockpath = stock_path or stocknumber < 1000 and stockindex = 24 not stock*** = man
stocknumber between 20 and 100 stocknumber in(10,20,30)
order by stockid desc(asc) --------- 排序,desc-降序,asc-升序 order by 1,2 --------- by列号
stockname = (select stockname from stock_information where stockid = 4) --------- 子查询
--------- 除非能确保内层select只返回一个行的值, --------- 否则应在外层where子句中用一个in限定符 select distinct column_name form table_name --------- distinct指定检索独有的列值,不重复
select stocknumber ,\"stocknumber + 10\" = stocknumber + 10 from table_name
select stockname , \"stocknumber\" = count(*) from table_name group by stockname
--------- group by 将表按行分组,指定列中有相同的值 having count(*) = 2 --------- having选定指定的组
select *
from table1, table2
where table1.id *= table2.id --------
左外部连接,table1中有的而table2中没有得以null表示 table1.id =* table2.id -------- 右外部连接 select stockname from table1
union [all] ----- union合并查询结果集,all-保留重复行 select stockname from table2 ***insert***
insert into table_name (Stock_name,Stock_number) value (\"xxx\
value (select Stockname , Stocknumber from Stock_table2)---value为select语句 ***update***
update table_name set Stockname = \"xxx\" [where Stockid = 3] Stockname = default Stockname = null
Stocknumber = Stockname + 4 ***delete***
delete from table_name where Stockid = 3
truncate table_name ----------- 删除表中所有行,仍保持表的完整性 drop table table_name --------------- 完全删除表 ***alter table*** --- 修改数据库表结构
alter table database.owner.table_name add column_name char(2) null .....
sp_help table_name ---- 显示表已有特征
create table table_name (name char(20), age smallint, lname varchar(30))
insert into table_name select ......... ----- 实现删除列的方法(创建新表) alter table table_name drop constraint Stockname_default ---- 删除Stockname的default约束 ***function(/*常用函数*/)*** ----统计函数---- AVG --求平均值 COUNT --统计数目 MAX --求最大值
MIN --求最小值 SUM --求和 --AVG use pangu
select avg(e_wage) as dept_avgWage from employee group by dept_id --MAX
--求工资最高的员工姓名 use pangu select e_name from employee where e_wage = (select max(e_wage) from employee) --STDEV()
--STDEV()函数返回表达式中所有数据的标准差 --STDEVP()
--STDEVP()函数返回总体标准差 --VAR()
--VAR()函数返回表达式中所有值的统计变异数 --VARP()
--VARP()函数返回总体变异数 ----算术函数---- /***三角函数***/
SIN(float_expression) --返回以弧度表示的角的正弦 COS(float_expression) --返回以弧度表示的角的余弦 TAN(float_expression) --返回以弧度表示的角的正切 COT(float_expression) --返回以弧度表示的角的余切 /***反三角函数***/
ASIN(float_expression) --返回正弦是FLOAT 值的以弧度表示的角 ACOS(float_expression) --返回余弦是FLOAT 值的以弧度表示的角 ATAN(float_expression) --返回正切是FLOAT 值的以弧度表示的角 ATAN2(float_expression1,float_expression2)
--返回正切是float_expression1 /float_expres-sion2的以弧度表示的角 DEGREES(numeric_expression)
--把弧度转换为角度返回与表达式相同的数据类型可为 --INTEGER/MONEY/REAL/FLOAT 类型
RADIANS(numeric_expression) --把角度转换为弧度返回与表达式相同的数据类型可为 --INTEGER/MONEY/REAL/FLOAT 类型 EXP(float_expression) --返回表达式的指数值 LOG(float_expression) --返回表达式的自然对数值
LOG10(float_expression)--返回表达式的以10 为底的对数值 SQRT(float_expression) --返回表达式的平方根 /***取近似值函数***/
CEILING(numeric_expression) --返回>=表达式的最小整数返回的数据类型与表达式相同可为 --INTEGER/MONEY/REAL/FLOAT 类型
FLOOR(numeric_expression) --返回<=表达式的最小整数返回的数据类型与表达式相同可为 --INTEGER/MONEY/REAL/FLOAT 类型
ROUND(numeric_expression) --返回以integer_expression 为精度的四舍五入值返回的数据
--类型与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型
ABS(numeric_expression) --返回表达式的绝对值返回的数据类型与表达式相同可为 --INTEGER/MONEY/REAL/FLOAT 类型
SIGN(numeric_expression) --测试参数的正负号返回0 零值1 正数或-1 负数返回的数据类型 --与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型 PI() --返回值为π 即3.14159265357936
RAND([integer_expression]) --用任选的[integer_expression]做种子值得出0-1 间的随机浮点数
----字符串函数----
ASCII() --函数返回字符表达式最左端字符的ASCII 码值 CHAR() --函数用于将ASCII 码转换为字符
--如果没有输入0 ~ 255 之间的ASCII 码值CHAR 函数会返回一个NULL 值 LOWER() --函数把字符串全部转换为小写 UPPER() --函数把字符串全部转换为大写 STR() --函数把数值型数据转换为字符型数据 LTRIM() --函数把字符串头部的空格去掉 RTRIM() --函数把字符串尾部的空格去掉
LEFT(),RIGHT(),SUBSTRING() --函数返回部分字符串
CHARINDEX(),PATINDEX() --函数返回字符串中某个指定的子串出现的开始位置 SOUNDEX() --函数返回一个四位字符码
--SOUNDEX函数可用来查找声音相似的字符串但SOUNDEX函数对数字和汉字均只返回0 值 DIFFERENCE() --函数返回由SOUNDEX 函数返回的两个字符表达式的值的差异 --0 两个SOUNDEX 函数返回值的第一个字符不同 --1 两个SOUNDEX 函数返回值的第一个字符相同 --2 两个SOUNDEX 函数返回值的第一二个字符相同 --3 两个SOUNDEX 函数返回值的第一二三个字符相同 --4 两个SOUNDEX 函数返回值完全相同
QUOTENAME() --函数返回被特定字符括起来的字符串
/*select quotename(abc, {) quotename(abc) 运行结果如下
----------------------------------{ {abc} [abc]*/
REPLICATE() --函数返回一个重复character_expression 指定次数的字符串 /*select replicate(abc, 3) replicate( abc, -2) 运行结果如下 ----------- ----------- abcabcabc NULL*/
REVERSE() --函数将指定的字符串的字符排列顺序颠倒 REPLACE() --函数返回被替换了指定子串的字符串 /*select replace(abc123g, 123, def) 运行结果如下 ----------- ----------- abcdefg*/
SPACE() --函数返回一个有指定长度的空白字符串 STUFF() --函数用另一子串替换字符串指定位置长度的子串 ----数据类型转换函数---- CAST() 函数语法如下
CAST() ( CONVERT() ( ------------------------------ ------------ 199 Jan 15 2000 ----日期函数---- DAY() --函数返回date_expression 中的日期值 MONTH() --函数返回date_expression 中的月份值 YEAR() --函数返回date_expression 中的年份值 DATEADD( --函数返回指定日期date 加上指定的额外日期间隔number 产生的新日期 DATEDIFF( DATENAME( APP_NAME() --函数返回当前执行的应用程序的名称 COALESCE() --函数返回众多表达式中第一个非NULL 表达式的值 COL_LENGTH( IDENTITY( --IDENTITY() 函数只在SELECT INTO 语句中使用用于插入一个identity column列到新表中 /*select identity(int, 1, 1) as column_name into newtable from oldtable*/ ISDATE() --函数判断所给定的表达式是否为合理日期 ISNULL( ISNUMERIC() --函数判断所给定的表达式是否为合理的数值 NEWID() --函数返回一个UNIQUEIDENTIFIER 类型的数值 NULLIF( --NULLIF 函数在expression1 与expression2 相等时返回NULL 值若不相等时则返回expression1 的值 sql中的保留字 action add aggregate all alter after and as asc avg avg_row_length auto_increment between bigint bit binary blob bool both by cascade case char character change check checksum column columns comment constraint create cross current_date current_time current_timestamp data database databases date datetime day day_hour day_minute day_second dayofmonth dayofweek dayofyear dec decimal default delayed delay_key_write delete desc describe distinct distinctrow double drop end else escape escaped enclosed enum explain exists fields file first float float4 float8 flush foreign from for full function global grant grants group having heap high_priority hour hour_minute hour_second hosts identified ignore in index infile inner insert insert_id int integer interval int1 int2 int3 int4 int8 into if is isam join key keys kill last_insert_id leading left length like lines limit load local lock logs long longblob longtext low_priority max max_rows match mediumblob mediumtext mediumint middleint min_rows minute minute_second modify month monthname myisam natural numeric no not null on optimize option optionally or order outer outfile pack_keys partial password precision primary procedure process processlist privileges read real references reload regexp rename replace restrict returns revoke rlike row rows second select set show shutdown smallint soname sql_big_tables sql_big_selects sql_low_priority_updates sql_log_off sql_log_update sql_select_limit sql_small_result sql_big_result sql_warnings straight_join starting status string table tables temporary terminated text then time timestamp tinyblob tinytext tinyint trailing to type use using unique unlock unsigned update usage values varchar variables varying varbinary with write when where year year_month zerofill --WAITFOR --例 等待1 小时2 分零3 秒后才执行SELECT 语句 waitfor delay ‟01:02:03‟ select * from employee --例 等到晚上11 点零8 分后才执行SELECT 语句 waitfor time ‟23:08:00‟ select * from employee ***SELECT*** select *(列名) from table_name(表名) where column_name operator value ex:(宿主) select * from stock_information where stockid = str(nid) stockname = str_name stockname like % find this % stockname like [a-zA-Z]% --------- ([]指定值的范围) stockname like [^F-M]% --------- (^排除指定范围) --------- 只能在使用like关键字的where子句中使用通配符) or stockpath = stock_path or stocknumber < 1000 and stockindex = 24 not stock*** = man stocknumber between 20 and 100 stocknumber in(10,20,30) order by stockid desc(asc) --------- 排序,desc-降序,asc-升序 order by 1,2 --------- by列号 stockname = (select stockname from stock_information where stockid = 4) --------- 子查询 --------- 除非能确保内层select只返回一个行的值, --------- 否则应在外层where子句中用一个in限定符 select distinct column_name form table_name --------- distinct指定检索独有的列值,不重复 select stocknumber ,\"stocknumber + 10\" = stocknumber + 10 from table_name select stockname , \"stocknumber\" = count(*) from table_name group by stockname --------- group by 将表按行分组,指定列中有相同的值 having count(*) = 2 --------- having选定指定的组 select * from table1, table2 where table1.id *= table2.id -------- 左外部连接,table1中有的而table2中没有得以null表示 table1.id =* table2.id -------- 右外部连接 select stockname from table1 union [all] ----- union合并查询结果集,all-保留重复行 select stockname from table2 ***insert*** insert into table_name (Stock_name,Stock_number) value (\"xxx\ value (select Stockname , Stocknumber from Stock_table2)---value为select语句 ***update*** update table_name set Stockname = \"xxx\" [where Stockid = 3] Stockname = default Stockname = null Stocknumber = Stockname + 4 ***delete*** delete from table_name where Stockid = 3 truncate table_name ----------- 删除表中所有行,仍保持表的完整性 drop table table_name --------------- 完全删除表 ***alter table*** --- 修改数据库表结构 alter table database.owner.table_name add column_name char(2) null ..... sp_help table_name ---- 显示表已有特征 create table table_name (name char(20), age smallint, lname varchar(30)) insert into table_name select ......... ----- 实现删除列的方法(创建新表) alter table table_name drop constraint Stockname_default ---- 删除Stockname的default约束 ***function(/*常用函数*/)*** ----统计函数---- AVG --求平均值 COUNT --统计数目 MAX --求最大值 MIN --求最小值 SUM --求和 --AVG use pangu select avg(e_wage) as dept_avgWage from employee group by dept_id --MAX --求工资最高的员工姓名 use pangu select e_name from employee where e_wage = (select max(e_wage) from employee) --STDEV() --STDEV()函数返回表达式中所有数据的标准差 --STDEVP() --STDEVP()函数返回总体标准差 --VAR() --VAR()函数返回表达式中所有值的统计变异数 --VARP() --VARP()函数返回总体变异数 ----算术函数---- /***三角函数***/ SIN(float_expression) --返回以弧度表示的角的正弦 COS(float_expression) --返回以弧度表示的角的余弦 TAN(float_expression) --返回以弧度表示的角的正切 COT(float_expression) --返回以弧度表示的角的余切 /***反三角函数***/ ASIN(float_expression) --返回正弦是FLOAT 值的以弧度表示的角 ACOS(float_expression) --返回余弦是FLOAT 值的以弧度表示的角 ATAN(float_expression) --返回正切是FLOAT 值的以弧度表示的角 ATAN2(float_expression1,float_expression2) --返回正切是float_expression1 /float_expres-sion2的以弧度表示的角 DEGREES(numeric_expression) --把弧度转换为角度返回与表达式相同的数据类型可为 --INTEGER/MONEY/REAL/FLOAT 类型 RADIANS(numeric_expression) --把角度转换为弧度返回与表达式相同的数据类型可为 --INTEGER/MONEY/REAL/FLOAT 类型 EXP(float_expression) --返回表达式的指数值 LOG(float_expression) --返回表达式的自然对数值 LOG10(float_expression)--返回表达式的以10 为底的对数值 SQRT(float_expression) --返回表达式的平方根 /***取近似值函数***/ CEILING(numeric_expression) --返回>=表达式的最小整数返回的数据类型与表达式相同可为 --INTEGER/MONEY/REAL/FLOAT 类型 FLOOR(numeric_expression) --返回<=表达式的最小整数返回的数据类型与表达式相同可为 --INTEGER/MONEY/REAL/FLOAT 类型 ROUND(numeric_expression) --返回以integer_expression 为精度的四舍五入值返回的数据 --类型与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型 ABS(numeric_expression) --返回表达式的绝对值返回的数据类型与表达式相同可为 --INTEGER/MONEY/REAL/FLOAT 类型 SIGN(numeric_expression) --测试参数的正负号返回0 零值1 正数或-1 负数返回的数据类型 --与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型 PI() --返回值为π 即3.14159265357936 RAND([integer_expression]) --用任选的[integer_expression]做种子值得出0-1 间的随机浮点数 ----字符串函数---- ASCII() --函数返回字符表达式最左端字符的ASCII 码值 CHAR() --函数用于将ASCII 码转换为字符 --如果没有输入0 ~ 255 之间的ASCII 码值CHAR 函数会返回一个NULL 值 LOWER() --函数把字符串全部转换为小写 UPPER() --函数把字符串全部转换为大写 STR() --函数把数值型数据转换为字符型数据 LTRIM() --函数把字符串头部的空格去掉 RTRIM() --函数把字符串尾部的空格去掉 LEFT(),RIGHT(),SUBSTRING() --函数返回部分字符串 CHARINDEX(),PATINDEX() --函数返回字符串中某个指定的子串出现的开始位置 SOUNDEX() --函数返回一个四位字符码 --SOUNDEX函数可用来查找声音相似的字符串但SOUNDEX函数对数字和汉字均只返回0 值 DIFFERENCE() --函数返回由SOUNDEX 函数返回的两个字符表达式的值的差异 --0 两个SOUNDEX 函数返回值的第一个字符不同 --1 两个SOUNDEX 函数返回值的第一个字符相同 --2 两个SOUNDEX 函数返回值的第一二个字符相同 --3 两个SOUNDEX 函数返回值的第一二三个字符相同 --4 两个SOUNDEX 函数返回值完全相同 QUOTENAME() --函数返回被特定字符括起来的字符串 /*select quotename(abc, {) quotename(abc) 运行结果如下 ----------------------------------{ {abc} [abc]*/ REPLICATE() --函数返回一个重复character_expression 指定次数的字符串 /*select replicate(abc, 3) replicate( abc, -2) 运行结果如下 ----------- ----------- abcabcabc NULL*/ REVERSE() --函数将指定的字符串的字符排列顺序颠倒 REPLACE() --函数返回被替换了指定子串的字符串 /*select replace(abc123g, 123, def) 运行结果如下 ----------- ----------- abcdefg*/ SPACE() --函数返回一个有指定长度的空白字符串 STUFF() --函数用另一子串替换字符串指定位置长度的子串 ----数据类型转换函数---- CAST() 函数语法如下 CAST() ( CONVERT() ( ------------------------------ ------------ 199 Jan 15 2000 ----日期函数---- DAY() --函数返回date_expression 中的日期值 MONTH() --函数返回date_expression 中的月份值 YEAR() --函数返回date_expression 中的年份值 DATEADD( --函数返回指定日期date 加上指定的额外日期间隔number 产生的新日期 DATEDIFF( DATENAME( APP_NAME() --函数返回当前执行的应用程序的名称 COALESCE() --函数返回众多表达式中第一个非NULL 表达式的值 COL_LENGTH( IDENTITY( --IDENTITY() 函数只在SELECT INTO 语句中使用用于插入一个identity column列到新表中 /*select identity(int, 1, 1) as column_name into newtable from oldtable*/ ISDATE() --函数判断所给定的表达式是否为合理日期 ISNULL( ISNUMERIC() --函数判断所给定的表达式是否为合理的数值 NEWID() --函数返回一个UNIQUEIDENTIFIER 类型的数值 NULLIF( --NULLIF 函数在expression1 与expression2 相等时返回NULL 值若不相等时则返回expression1 的值 sql中的保留字 action add aggregate all alter after and as asc avg avg_row_length auto_increment between bigint bit binary blob bool both by cascade case char character change check checksum column columns comment constraint create cross current_date current_time current_timestamp data database databases date datetime day day_hour day_minute day_second dayofmonth dayofweek dayofyear dec decimal default delayed delay_key_write delete desc describe distinct distinctrow double drop end else escape escaped enclosed enum explain exists fields file first float float4 float8 flush foreign from for full function global grant grants group having heap high_priority hour hour_minute hour_second hosts identified ignore in index infile inner insert insert_id int integer interval int1 int2 int3 int4 int8 into if is isam join key keys kill last_insert_id leading left length like lines limit load local lock logs long longblob longtext low_priority max max_rows match mediumblob mediumtext mediumint middleint min_rows minute minute_second modify month monthname myisam natural numeric no not null on optimize option optionally or order outer outfile pack_keys partial password precision primary procedure process processlist privileges read real references reload regexp rename replace restrict returns revoke rlike row rows second select set show shutdown smallint soname sql_big_tables sql_big_selects sql_low_priority_updates sql_log_off sql_log_update sql_select_limit sql_small_result sql_big_result sql_warnings straight_join starting status string table tables temporary terminated text then time timestamp tinyblob tinytext tinyint trailing to type use using unique unlock unsigned update usage values varchar variables varying varbinary with write when where year year_month zerofill 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- fupindai.com 版权所有 赣ICP备2024042792号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务