作者:empty 出版社:empty |
SQL SERVER基础知识
1、概述(对比oracle)
随着信息技术的飞速发展,数据处理不仅在数量上要求越来越大,而且在质量上也要求越来越高。Oracle数据库在大多数企业中受到广泛使用,而SQL Server数据库也因为和Windows的联系,在企业中的使用也是非常广泛。
操作系统的稳定对数据库来说是十分紧要的,在数据库可操作平台上,Oracle可在所有主流平台上运行,Oracle数据库采用开放的策略目标,它使得客户可以选择一种最适合他们特定需要的解决方案。客户可以利用很多种第三方应用程序、工具。对开发商来说是很大的支持。而SQL Server却只能在Windows上运行了,这个就显得比较单调了,但SQL Sever在Window平台上的表现,和Windows操作系统的整体结合程度,使用方便性,和Microsoft开发平台的整合性都比Oracle强的很多。但Windows操作系统的稳定性及可靠性大家是有目共睹的,再说Microsoft公司的策略目标是将客户都锁定到Windows平台的环境当中,只有随着Windows性能的改善,SQL Server才能进一步提高。从操作平台这点上Oracle是完全优胜于SQL Server的了。
从资料上可以看到,Oracle的安全认证获得最高认证级别的ISO标准认证,而SQL Server并没有获得什么安全认证。这方面证明了Oracle的安全性是高于SQL Server的。
购买一个产品,首先考虑的当然是产品的性能了,当考虑性能的同时当然少不了究竟要花多少钱在这产品也是个很关键的问题。要建立并运行一个数据库系统。不仅仅包含最初购置软件、硬件的费用,还包含了培训及以后维护的费用。Orcale数据库的价格是远比SQL Server数据库要高,为什么Oracle数据库比SQL Server数据库价格上要高出那么多,一方面Oracle的初始花费相对较高,特别是在考虑工具软件的时候,Oracle很多工具软件需要另外购买,与Microsoft提供免费的SQL Server工具软件相比,Oracle更显价格的不菲。但由于SQL Server只能在Windows下运行的原因,普遍认为SQL Server数据库的可靠性是比较差的。Oracle的性能优势体现在他的多用户上,而SQL Server的性能优势在多用户上就显得力不从心了。
操作上SQL Server明显要比Orcale简单,如果你用过Java和DOTNET的开发平台,区别的基本就是Oracle和SQL Server不同,Oracle的界面基本是基于Java的,大部分的工具是Dos界面的,甚至SQLPlus也是, SQL Server是跟VB一样,全图形界面,很少见到DOS窗口。SQL Server中的企业管理器给用户提供一个全图形界面的集成管理控制台来集中管理多个服务器。Oracle也有自己的企业管理器,而且它的性能在某些方面甚至超过了SQL Server的企业管理器,但它安装较为困难。
Orcale数据库和SQL Server数据库那个更快?其实是一个很难答的问题,因为存在许多不定因素,包括处理类型、数据分布以及硬件基础设施等。
SQL Server 2000是一个具备完全Web支持的数据库产品,提供了可扩展标记语言核心支持以及Internet上和防火墙外进行查询的能力,具有可伸缩性、灵活性、扩充性好,而且价格便宜等特点,而Oracle则有着可靠安全性,速度比SQL Server快上百倍,但其价格在实施中却比SQL Server它高出了几百倍。
其实各行业考虑选择那种数据库,是由数据库的特点以及根据自己的业务需求和基础设施综合考虑来决定的。
2、常用sql
SQL分类:
DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)
DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)
DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)
首先,简要介绍基础语句:
1、说明:创建数据库
CREATE DATABASE database-name
2、说明:删除数据库
drop database dbname
3、说明:备份sql server
--- 创建 备份数据的 device
USE master
EXEC sp_addumpdevice 'disk', 'testBack', 'c: mssql7backup MyNwind_1.dat';
--- 开始 备份
BACKUP DATABASE pubs TO testBack
4、说明:创建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
SQL Server 为 SQL-92 兼容性提供了数据类型同义词。有关更多信息,请参见数据类型同义词。
精确数字
整数
bigint
从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字)。
int
从 -2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整型数据(所有数字)。
smallint
从 -2^15 (-32,768) 到 2^15 - 1 (32,767) 的整数数据。
tinyint
从 0 到 255 的整数数据。
bit
bit
1 或 0 的整数数据。
decimal 和 numeric
decimal
从 -10^38 +1 到 10^38 –1 的固定精度和小数位的数字数据。
numeric
功能上等同于 decimal。
money 和 smallmoney
money
货币数据值介于 -2^63 (-922,337,203,685,477.5808) 与 2^63 - 1 (+922,337,203,685,477.5807) 之间,精确到货币单位的千分之十。
smallmoney
货币数据值介于 -214,748.3648 与 +214,748.3647 之间,精确到货币单位的千分之十。
近似数字
float
从 -1.79E + 308 到 1.79E + 308 的浮点精度数字。
real
从 -3.40E + 38 到 3.40E + 38 的浮点精度数字。
datetime 和 smalldatetime
datetime
从 1753 年 1 月 1 日到 9999 年 12 月 31 日的日期和时间数据,精确到百分之三秒(或 3.33 毫秒)。
smalldatetime
从 1900 年 1 月 1 日到 2079 年 6 月 6 日的日期和时间数据,精确到分钟。
字符串
char
固定长度的非 Unicode 字符数据,最大长度为 8,000 个字符。
varchar
可变长度的非 Unicode 数据,最长为 8,000 个字符。
text
可变长度的非 Unicode 数据,最大长度为 2^31 - 1 (2,147,483,647) 个字符。
Unicode 字符串
nchar
固定长度的 Unicode 数据,最大长度为 4,000 个字符。
nvarchar
可变长度 Unicode 数据,其最大长度为 4,000 字符。sysname 是系统提供用户定义的数据类型,在功能上等同于 nvarchar(128),用于引用数据库对象名。
ntext
可变长度 Unicode 数据,其最大长度为 2^30 - 1 (1,073,741,823) 个字符。
二进制字符串
binary
固定长度的二进制数据,其最大长度为 8,000 个字节。
varbinary
可变长度的二进制数据,其最大长度为 8,000 个字节。
image
可变长度的二进制数据,其最大长度为 2^31 - 1 (2,147,483,647) 个字节。
其它数据类型
cursor
游标的引用。
sql_variant
一种存储 SQL Server 支持的各种数据类型(text、ntext、timestamp 和 sql_variant 除外)值的数据类型。
table
一种特殊的数据类型,存储供以后处理的结果集。
timestamp
数据库范围的唯一数字,每次更新行时也进行更新。
uniqueidentifier
根据已有的表创建新表:
A:create table tab_new like tab_old (使用旧表创建新表)
B:create table tab_new as select col1,col2… from tab_old definition only
5、说明:
删除表:drop table tabname
6、说明:
增加一个列:Alter table tabname add column col type
删除一个列、修改一个列
7、说明:
添加主键:Alter table tabname add primary key(col)
说明:
删除主键:Alter table tabname drop primary key(col)
8、说明:
创建索引:create [unique] index idxname on tabname(col….)
删除索引:drop index idxname
注:索引是不可更改的,想更改必须删除重新建。
9、说明:
创建视图:create view viewname as select statement
删除视图:drop view viewname
10、说明:几个简单的基本的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%’ ---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
11、说明:几个高级查询运算词
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),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。
12、说明:使用外连接
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:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
其次,大家来看一些不错的sql语句
1、说明:复制表(只复制结构,源表名:a 新表名:b)
法一:select * into b from a where 1 >1
法二:select top 0 * into b from a
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b)
insert into b(a, b, c) select d,e,f from b;
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径)
insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
例子:..from b in ' &Server.MapPath( . )& data.mdb & ' where..
4、说明:子查询(表名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)
5、说明:显示文章、提交人和最后回复时间
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
6、说明:外连接查询(表名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
7、说明:在线视图查询(表名1:a )
select * from (SELECT a,b,c FROM a) T where t.a > 1;
8、说明: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
9、说明:in 的使用方法
select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)
10、说明:两张关联表,删除主表中已经在副表中没有的信息
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )
3、SQLServer2000常用管理SQL语句
1. 查看数据库的版本
select @@version
常见的几种SQL SERVER打补丁后的版本号:
8.00.194 Microsoft SQL Server 2000
8.00.384 Microsoft SQL Server 2000 SP1
8.00.532 Microsoft SQL Server 2000 SP2
8.00.760 Microsoft SQL Server 2000 SP3
8.00.818 Microsoft SQL Server 2000 SP3 w/ Cumulative Patch MS03-031
8.00.2039 Microsoft SQL Server 2000 SP4
2. 查看数据库所在机器操作系统参数
exec master..xp_msver
3. 查看数据库启动的参数
sp_configure
4. 查看数据库启动时间
select convert(varchar(30),login_time,120) from master..sysprocesses where spid=1
查看数据库服务器名和实例名
print 'Server Name...............: ' + convert(varchar(30),@@SERVERNAME)
print 'Instance..................: ' + convert(varchar(30),@@SERVICENAME)
5. 查看所有数据库名称及大小
sp_helpdb
重命名数据库用的SQL
sp_renamedb 'old_dbname', 'new_dbname'
6. 查看所有数据库用户登录信息
sp_helplogins
查看所有数据库用户所属的角色信息
sp_helpsrvrolemember
修复迁移服务器时孤立用户时,可以用的fix_orphan_user脚本或者LoneUser过程
更改某个数据对象的用户属主
sp_changeobjectowner [@objectname =] 'object', [@newowner =] 'owner'
注意: 更改对象名的任一部分都可能破坏脚本和存储过程。
把一台服务器上的数据库用户登录信息备份出来可以用add_login_to_aserver脚本
查看某数据库下,对象级用户权限
sp_helprotect
7. 查看链接服务器
sp_helplinkedsrvlogin
查看远端数据库用户登录信息
sp_helpremotelogin
8.查看某数据库下某个数据对象的大小
sp_spaceused @objname
还可以用sp_toptables过程看最大的N(默认为50)个表,查看某数据库下某个数据对象的索引信息: sp_helpindex @objname
还可以用SP_NChelpindex过程查看更详细的索引情况
SP_NChelpindex @objname
clustered索引是把记录按物理顺序排列的,索引占的空间比较少。
对键值DML操作十分频繁的表我建议用非clustered索引和约束,fillfactor参数都用默认值。
查看某数据库下某个数据对象的的约束信息
sp_helpconstraint @objname
9.查看数据库里所有的存储过程和函数
use @database_name
sp_stored_procedures
查看存储过程和函数的源代码
sp_helptext '@procedure_name'
查看包含某个字符串@str的数据对象名称
select distinct object_name(id) from syscomments where text like '%@str%'
创建加密的存储过程或函数在AS前面加WITH ENCRYPTION参数,解密加密过的存储过程和函数可以用sp_decrypt过程。
10.查看数据库里用户和进程的信息
sp_who
查看SQL Server数据库里的活动用户和进程的信息
sp_who 'active'
查看SQL Server数据库里的锁的情况
sp_lock
进程号1--50是SQL Server系统内部用的,进程号大于50的才是用户的连接进程。spid是进程编号,dbid是数据库编号,objid是数据对象编号。查看进程正在执行的SQL语句:
dbcc inputbuffer ()
推荐大家用经过改进后的sp_who3过程可以直接看到进程运行的SQL语句。
sp_who3
检查死锁用sp_who_lock过程
sp_who_lock
11.查看和收缩数据库日志文件的方法
查看所有数据库日志文件大小
dbcc sqlperf(logspace)
如果某些日志文件较大,收缩简单恢复模式数据库日志,收缩后@database_name_log的大小单位为M
backup log @database_name with no_log
dbcc shrinkfile (@database_name_log, 5)
12.分析SQL Server SQL 语句的方法:
set statistics time {on | off}
set statistics io {on | off}
图形方式显示查询执行计划 ,在查询分析器->查询->显示估计的评估计划(D)-Ctrl-L 或者点击工具栏里的图形,文本方式显示查询执行计划。
set showplan_all {on | off}
set showplan_text { on | off }
set statistics profile { on | off }
13.出现不一致错误时,NT事件查看器里出3624号错误,修复数据库的方法
先注释掉应用程序里引用的出现不一致性错误的表,然后在备份或其它机器上先恢复然后做修复操作
alter database [@error_database_name] set single_user
修复出现不一致错误的表
dbcc checktable('@error_table_name',repair_allow_data_loss)
或者可惜选择修复出现不一致错误的小型数据库名:
dbcc checkdb('@error_database_name',repair_allow_data_loss)
alter database [@error_database_name] set multi_user
CHECKDB 有3个参数:
repair_allow_data_loss 包括对行和页进行分配和取消分配以改正分配错误、结构行或页的错误,
以及删除已损坏的文本对象,这些修复可能会导致一些数据丢失。修复操作可以在用户事务下完成以允许用户回滚所做的更改。如果回滚修复,则数据库仍会含有错误,应该从备份进行恢复。如果由于所提供修复等级的缘故遗漏某个错误的修复,则将遗漏任何取决于该修复的修复。 修复完成后,请备份数据库。
repair_fast 进行小的、不耗时的修复操作,如修复非聚集索引中的附加键。这些修复可以很快完成,并且不会有丢失数据的危险。
repair_rebuild 执行由 repair_fast 完成的所有修复,包括需要较长时间的修复(如重建索引)。
执行这些修复时不会有丢失数据的危险。
4、常用函数与ORACL对比
数学函数
1.绝对值
S:select abs(-1) value
O:select abs(-1) value from dual
2.取整(大)
S:select ceiling(-1.001) value
O:select ceil(-1.001) value from dual
3.取整(小)
S:select floor(-1.001) value
O:select floor(-1.001) value from dual
4.取整(截取)
S:select cast(-1.002 as int) value
O:select trunc(-1.002) value from dual
5.四舍五入
S:select round(1.23456,4) value 1.23460
O:select round(1.23456,4) value from dual 1.2346
6.e为底的幂
S:select Exp(1) value 2.7182818284590451
O:select Exp(1) value from dual 2.71828182
7.取e为底的对数
S:select log(2.7182818284590451) value 1
O:select ln(2.7182818284590451) value from dual; 1
8.取10为底对数
S:select log10(10) value 1
O:select log(10,10) value from dual; 1
9.取平方
S:select SQUARE(4) value 16
O:select power(4,2) value from dual 16
10.取平方根
S:select SQRT(4) value 2
O:select SQRT(4) value from dual 2
11.求任意数为底的幂
S:select power(3,4) value 81
O:select power(3,4) value from dual 81
12.取随机数
S:select rand() value
O:select sys.dbms_random.value(0,1) value from dual;
13.取符号
S:select sign(-8) value -1
O:select sign(-8) value from dual -1
14.圆周率
S:SELECT PI() value 3.1415926535897931
O:不知道
15.sin,cos,tan 参数都以弧度为单位
例如:select sin(PI()/2) value 得到1(SQLServer)
16.Asin,Acos,Atan,Atan2 返回弧度
17.弧度角度互换(SQLServer,Oracle不知道)
DEGREES:弧度-〉角度
RADIANS:角度-〉弧度
数值间比较
18. 求集合最大值
S:select max(value) value from
(select 1 value
union
select -2 value
union
select 4 value
union
select 3 value)a
O:select greatest(1,-2,4,3) value from dual
19. 求集合最小值
S:select min(value) value from
(select 1 value
union
select -2 value
union
select 4 value
union
select 3 value)a
O:select least(1,-2,4,3) value from dual
20.如何处理null值(F2中的null以10代替)
S:select F1,IsNull(F2,10) value from Tbl
O:select F1,nvl(F2,10) value from Tbl
21.求字符序号
S:select ascii('a') value
O:select ascii('a') value from dual
22.从序号求字符
S:select char(97) value
O:select chr(97) value from dual
23.连接
S:select '11'+'22'+'33' value
O:select CONCAT('11','22') 33 value from dual
23.子串位置 --返回3
S:select CHARINDEX('s','sdsq',2) value
O:select INSTR('sdsq','s',2) value from dual
23.模糊子串的位置 --返回2,参数去掉中间%则返回7
S:select patindex('%d%q%','sdsfasdqe') value
O:oracle没发现,但是instr可以通过第四个参数控制出现次数
select INSTR('sdsfasdqe','sd',1,2) value from dual 返回6
24.求子串
S:select substring('abcd',2,2) value
O:select substr('abcd',2,2) value from dual
25.子串代替 返回aijklmnef
S:SELECT STUFF('abcdef', 2, 3, 'ijklmn') value
O:SELECT Replace('abcdef', 'bcd', 'ijklmn') value from dual
26.子串全部替换
S:没发现
O:select Translate('fasdbfasegas','fa','我' ) value from dual
27.长度
S:len,datalength
O:length
www.knowsky.com
28.大小写转换 lower,upper
29.单词首字母大写
S:没发现
O:select INITCAP('abcd dsaf df') value from dual
30.左补空格(LPAD的第一个参数为空格则同space函数)
S:select space(10)+'abcd' value
O:select LPAD('abcd',14,) value from dual
31.右补空格(RPAD的第一个参数为空格则同space函数)
S:select 'abcd'+space(10) value
O:select RPAD('abcd',14) value from dual
32.删除空格
S:ltrim,rtrim
O:ltrim,rtrim,trim
33. 重复字符串
S:select REPLICATE('abcd',2) value
O:没发现
34.发音相似性比较(这两个单词返回值一样,发音相同)
S:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe')
O:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe') from dual
SQLServer中用SELECT DIFFERENCE('Smithers', 'Smythers') 比较soundex的差
返回0-4,4为同音,1最高
日期函数
35.系统时间
S:select getdate() value
O:select sysdate value from dual
36.前后几日
直接与整数相加减
37.求日期
S:select convert(char(10),getdate(),20) value
O:select trunc(sysdate) value from dual
select to_char(sysdate,'yyyy-mm-dd') value from dual
38.求时间
S:select convert(char(8),getdate(),108) value
O:select to_char(sysdate,'hh24:mm:ss') value from dual
39.取日期时间的其他部分
S:DATEPART 和 DATENAME 函数 (第一个参数决定)
O:to_char函数 第二个参数决定
参数---------------------------------下表需要补充
year yy, yyyy
quarter qq, q (季度)
month mm, m (m O无效)
dayofyear dy, y (O表星期)
day dd, d (d O无效)
week wk, ww (wk O无效)
weekday dw (O不清楚)
Hour hh,hh12,hh24 (hh12,hh24 S无效)
minute mi, n (n O无效)
second ss, s (s O无效)
millisecond ms (O无效)
----------------------------------------------
40.当月最后一天
S:不知道
O:select LAST_DAY(sysdate) value from dual
41.本星期的某一天(比如星期日)
S:不知道
O:SELECT Next_day(sysdate,7) vaule FROM DUAL;
42.字符串转时间
S:可以直接转或者select cast('2004-09-08'as datetime) value
O:SELECT To_date('2004-01-05 22:09:38','yyyy-mm-dd hh24-mi-ss') vaule FROM DUAL;
43.求两日期某一部分的差(比如秒)
S:select datediff(ss,getdate(),getdate()+12.3) value
O:直接用两个日期相减(比如d1-d2=12.3)
SELECT (d1-d2)*24*60*60 vaule FROM DUAL;
44.根据差值求新的日期(比如分钟)
S:select dateadd(mi,8,getdate()) value
O:SELECT sysdate+8/60/24 vaule FROM DUAL;
45.求不同时区时间
S:不知道
O:SELECT New_time(sysdate,'ydt','gmt' ) vaule FROM DUAL;
-----时区参数,北京在东8区应该是Ydt-------
AST ADT 大西洋标准时间
BST BDT 白令海标准时间
CST CDT 中部标准时间
EST EDT 东部标准时间
GMT 格林尼治标准时间
HST HDT 阿拉斯加?夏威夷标准时间
MST MDT 山区标准时间
NST 纽芬兰标准时间
PST PDT 太平洋标准时间
YST YDT YUKON标准时间
常用函数
(1)ISNULL
使用指定的替换值替换 NULL。
语法
ISNULL ( check_expression , replacement_value )
参数
check_expression
将被检查是否为 NULL的表达式。check_expression 可以是任何类型的。
replacement_value
在 check_expression 为 NULL时将返回的表达式。replacement_value 必须与 check_expresssion 具有相同的类型。
返回类型
返回与 check_expression 相同的类型。
注释
如果 check_expression 不为 NULL,那么返回该表达式的值;否则返回 replacement_value。
如果一个书名的价格是 NULL,那么在结果集中显示的价格为 0.00,而不是NULL的返回原值
ISNULL(price, 0.00)
(2)
LTRIM ( character_expression )删除字符变量中的起始空格
RTRIM ( character_expression ) 删除字符变量中的尾随空格
(3)
SUBSTRING ( expression , start , length )
参数
expression
是字符串、二进制字符串、text、image、列或包含列的表达式。不要使用包含聚合函数的表达式。
start
是一个整数,指定子串的开始位置。
length
是一个整数,指定子串的长度(要返回的字符数或字节数)。
SELECT x = SUBSTRING('abcdef', 2, 3)
下面是结果集:
x ---------- bcd
(4)
LEFT ( character_expression , integer_expression )
最左边的 5 个字符。
RIGHT ( character_expression , integer_expression )
参数
最右边的五个字符
(5)
UPPER ( character_expression )
返回将小写字符数据转换为大写的字符表达式
LOWER ( character_expression )
将大写字符数据转换为小写字符数据后返回字符表达式。
(6)
REVERSE ( character_expression )
返回字符表达式的反转。
(7)
CAST ( expression AS data_type )
将某种数据类型的表达式显式转换为另一种数据类型
declare @a int
cast(@a as varchar(10))--从而连接动态语句
(8)
ISNUMERIC ( expression )
当输入表达式得数为一个有效的整数、浮点数、money 或 decimal 类型,那么 ISNUMERIC 返回 1;否则返回 0。返回值为 1 确保可以将 expression 转换为上述数字类型中的一种。
注意判断后返回的是0和1
与它具有相同用法的就是ISDATE ( expression )
如:case when ISNUMERIC(字段)=1 then '数字' else '字符' end
1.字符串函数
长度与分析用
datalength(Char_expr) 返回字符串包含字符数,但不包含后面的空格
substring(expression,start,length) 不多说了,取子串
right(char_expr,int_expr) 返回字符串右边int_expr个字符
字符操作类
upper(char_expr) 转为大写
lower(char_expr) 转为小写
space(int_expr) 生成int_expr个空格
replicate(char_expr,int_expr)复制字符串int_expr次
reverse(char_expr) 反转字符串
stuff(char_expr1,start,length,char_expr2) 将字符串char_expr1中的从
start开始的length个字符用char_expr2代替
ltrim(char_expr) rtrim(char_expr) 取掉空格
ascii(char) char(ascii) 两函数对应,取ascii码,根据ascii吗取字符
字符串查找
charindex(char_expr,expression) 返回char_expr的起始位置
patindex( %pattern% ,expression) 返回指定模式的起始位置,否则为0
2.数学函数
abs(numeric_expr) 求绝对值
ceiling(numeric_expr) 取大于等于指定值的最小整数
exp(float_expr) 取指数
floor(numeric_expr) 小于等于指定值得最大整数
pi() 3.1415926.........
power(numeric_expr,power) 返回power次方
rand([int_expr]) 随机数产生器
round(numeric_expr,int_expr) 安int_expr规定的精度四舍五入
sign(int_expr) 根据正数,0,负数,,返回+1,0,-1
sqrt(float_expr) 平方根
3.日期函数
getdate() 返回日期
datename(datepart,date_expr) 返回名称如 June
datepart(datepart,date_expr) 取日期一部份
datediff(datepart,date_expr1.dateexpr2) 日期差
dateadd(datepart,number,date_expr) 返回日期加上 number
上述函数中datepart的
写法 取值和意义
yy 1753-9999 年份
qq 1-4 刻
mm 1-12 月
dy 1-366 日
dd 1-31 日
wk 1-54 周
dw 1-7 周几
hh 0-23 小时
mi 0-59 分钟
ss 0-59 秒
ms 0-999 毫秒
日期转换
convert()
4.系统函数
suser_name() 用户登录名
user_name() 用户在数据库中的名字
user 用户在数据库中的名字
show_role() 对当前用户起作用的规则
db_name() 数据库名
object_name(obj_id) 数据库对象名
col_name(obj_id,col_id) 列名
col_length(objname,colname) 列长度
valid_name(char_expr) 是否是有效标识符
5、典型问题:
1、sequence
auto-increment
SQL Server 2000里有个uniqueidentifier类型,每次插入数据时,需调用newid(),系统自动产生唯一的数据
CREATE TABLE[PERSON](
[USERID] [numeric](19, 0) IDENTITY(1,1) NOT NULL,
[NAME] varchar(2000)
PRIMARY KEY USERID)
(2、SQLServer数据库的角色与用户问题
2006-10-15 10:34
SQLServer的数据库管理说起来还是蛮麻烦的,有登陆名、用户名、角色等,登录数据库时又有windows验证模式、数据库验证模式和混合验证模式。比如,用java连接数据库时,你用sa登录了数据库,可是这并不意味着你有使用数据库中各种表的权限,到底是怎么回事呢?原来你用sa登录数据库,建立的表等的使用权限并不属于sa,这些权限都属于一个叫dbo的用户,所以当你想使用一个SQL数据库中用sa登录名建立的表时,可以通过下面几步:
1,新建一个用户,比如叫new_user,如果你以前没有新建过登录,那还需要新建一个登录来对应这个用户,当然也可以使用以前的登录,但是不能使用sa登录。还要注意一个登录在一个数据库中只能对应一个用户,另外,出于数据库的安全考虑,推荐为每个用户使用一个新的登陆名。
2,为新建这个用户分配权限,这一步可以使用以前的角色,也可以新建一个角色,然后把要分配给该用户的权限分给该角色,最后让用户属于该角色即可。
这样就可以使用数据库了。下面给一个例子:
1,假如现在有一个叫bbs的数据库,使用sa登录数据库系统以后,进入bbs数据库,选择“用户”选项,右击,选择“新建数据库用户”,会弹出2个窗口,前面的一个是新建数据库登陆的,为了记忆方便,不妨叫new_user,下面选择“数据库密码验证”,数据库选bbs,点击确定,会提示说该登录没有获得访问bbs的权限,不用去管它,直接确定即可。
2,然后是新建用户的窗口,这个很简单,使用默认用户名new_user,直接确定吧。
3,右击“角色”选项,选择新建数据库角色,填好名称,比如new_actor,然后点击下面的“添加”,选中new_user用户,这样new_user就可以使用new_actor的权限了。
4,最后是为new_actor分配权限,双击new_actor角色,点击“权限”,然后选中你要分配给该角色的权限就可以了。
通过以上几步,就可以在java,jsp中使用new_user来操作bbs数据库了。
3、SQLSERVER2000 备份
Job备份
declare @filename nvarchar(100) set @filename='F: AddIn 备份 data'+convert(char(10),getdate(),112) print @filename BACKUP DATABASE [addin] TO DISK = @filename WITH NOINIT , NOUNLOAD , NAME = N'addin 备份', NOSKIP , STATS = 10, NOFORMAT
Osql备份
osql [-U login id] [-P password]
[-S server] [-H hostname] [-E trusted connection]
[-d use database name] [-l login timeout] [-t query timeout]
[-h headers] [-s colseparator] [-w columnwidth]
[-a packetsize] [-e echo input] [-I Enable Quoted Identifiers]
[-L list servers] [-c cmdend] [-D ODBC DSN name]
[-q cmdline query ] [-Q cmdline query and exit]
[-n remove numbering] [-m errorlevel]
[-r msgs to stderr] [-V severitylevel]
[-i inputfile] [-o outputfile]
[-p print statistics] [-b On error batch abort]
[-O use Old ISQL behavior disables the following]
osql -U sa -P dwserver506 -d Planning_05_13 -Q exit(BACKUP DATABASE Planning_05_13 to DISK='E: sqldatabak %bak_webFile%”
例1:(备份)
1 use master
2 declare @path='c: aa zy.bak'
3 backup database zy to
4 disk=@path with noinit
说明:
1 使用系统库
2 设置备份的路径及文件名,注意是用单引号引用.
3 需备份的数据库
4 设置备份的驱动器,将路径设给驱动器,再设定备份的方式(重写或覆盖)
例2:(压缩备份的数据库文件)
use master
exec xp_makecab 'c: m.cab',mszip,1,'c: aa zy.bak'
exec xp_cmdshell 'copy c: 123.cab', 'd: 123.cab'
说明:
'c: m.cab' 压缩备份的名称
mszip 压缩方式
'c: aa zy.bak' 被压缩文件的路径
copy到另一个目录保存
4、oracle中的序列蛮好用的,但是在sqlserver中却没有,您也许会说我可以用IDENTITY来代替啊!当然可以,但是一个表中只能有一个IDENTITY字段!我要是想在一个表里使用多个类似IDENTITY的字段呢?如是oracle,用序列就可以实现,只要给该字段指定一个序列就可以了!在SQLSERVER中如何实现呢?SQL2000可以有自定义函数,我们可以自定义一个函数,来产生一个序列,然后在给需要使用该序列的字段指定该函数即可!下面是一个例子:
假设:
存在表
CREATE TABLE tmp
(
identityID INT identity(1,1) PRIMARY KEY,
iID INT,
sName CHAR(2)
)
GO
其中identityID是一个IDENTITY字段,
我们创建以下函数:
CREATE FUNCTION sqlSequence()
RETURNS INT
AS
BEGIN
DECLARE @MINNUM INT
DECLARE @MAXNUM INT
SET @MINNUM=2
SET @MAXNUM=99
/*
您可以设置该函数允许的最大(99)、小(2)值,代表从取2-99,超过此最大值返回0(您可以加上自己的处理),
仿oracle的sequence中的设置
*/
RETURN( SELECT CASE
WHEN ISNULL(MAX(iID),@MINNUM-1)+1 >@MAXNUM THEN 0
ELSE ISNULL(MAX(iID),@MINNUM-1)+1
END
FROM TMP)
END
GO
然后给表tmp的字段iID的默认值指定为dbo.sqlSequence(),
然后再插入时使用如下语句即可
insert into tmp(sname) values('1');
插入一些记录后看看效果吧!
其实还可以给该函数加上更多的功能,如可以返回一个降序的序列,
也可以返回一个字符串的序列。。。
心理和谐:社会和谐的重要内容
2007-08-25 20:19
构建社会主义和谐社会是一个多种要素相互配合相互统一的系统工程。从社会心理角度来说,人们的心理状况对于和谐社会的构建有着重要的影响。保持人们的心理和谐是构建和谐社会的重要内容。
人的心理和谐是心理健康的重要体现。它首先表现为个体内部心理和谐,即个体内部心理成分(认知、情感、意志、个性等)的协调统一;其次表现为人事心理和谐,即人在处理事情时的冷静、适度和乐观,善于“息事”;第三表现为人际心理和谐,即人与人交流上的默契和融洽,善于“宁人”。心理和谐的人善于调节自己的心理,坦诚地看待外部世界和自我内心世界,能够愉快地接纳自我,承认现实,欣赏美好的事物,而且能够大度平静地生活和接受生活中的各种挑战。总之,对内协调和对外适应是心理和谐的集中表现。
人是社会的产物,人的心理必然体现社会和文化属性。无论是和谐的心理状态,还是不和谐的心理状态,归根结底都是主体对社会客观现实的反映。尽管在同样的现实事件面前,不同的主观加工,可能导致不同质的心态,但以下三个规律是存在的:第一,客观刺激事件导致主观心理反应。客观刺激事件是因,主观心理反应是果,尽管面对同样的刺激事件,不同的人由于主观加工各异,在反应的性质和程度上会有所不同,但只要他感官正常,对刺激事件予以应有的注意,就决不可能没有反应。任何心理无论是和谐的,抑或是不和谐的,归根结底应有客观上的原因。第二,负性刺激事件导致负性心理反应。负性刺激事件泛指人们欲极力避免给人们带来精神痛苦、使人情绪低落的各种事件。国内外学者关于主观幸福感的研究均表明:个体体验到负性生活事件愈多,则愈感到不幸福。第三,良性刺激事件导致良性心理。良性刺激事件泛指那些人们渴望得到、能够给人带来精神愉悦,使人欢欣鼓舞的事件。人逢喜事精神爽。心理健康的人在面对成功、喜事等良性刺激时,总会有适度的欢喜之情。有的幸福论者认为,幸福就等于各个快乐事件的简单相加。这种说法尽管有失偏颇,但人的主观幸福感作为一种心理状态,一般来说是和良性刺激事件呈正比关系的。人的主观幸福感越强,遇到的良性刺激事件就越多。
社会的不和谐使人心理压力增加,心理问题、心理疾病蔓延。犯罪、毒品、家庭破裂被认为是西方社会的三大公害。三大公害加上其他社会问题,诸如失业、恐怖袭击等造成西方社会的严重不和谐,致使西方人心理和谐水平的整体下降,心理健康问题和心理疾病检出率居高不下。
改革开放和市场经济在给我国经济社会带来巨大发展、综合国力大大提高的同时,也不可避免地带来诸如社会竞争加剧、升学压力增大、就业形势严峻、贫富分化和城乡差距拉大等社会问题。这些不和谐是造成人们心理不和谐的重要原因。
由于心理不和谐、不健康给社会和他人造成伤害,从而影响社会和谐,这种影响力有时会带来十分严重的后果。为什么心理不和谐、不健康会给社会带来麻烦进而影响社会和谐?美国心理学家多拉德等人所提出的挫折-攻击假说为我们提供了理论上的注脚。多拉德认为,攻击是受挫的继发行为。人类的攻击行为是由挫折引起的,挫折总是引起攻击行为。所谓挫折,就是某种正在进行的有目的的行为受到阻扰。挫折并不会直接引发攻击行为,而是诱发出某种导致攻击行为的刺激(一种攻击驱力),然后这种刺激会促使或加速攻击行为的出现。一个遭受挫折的人,容易做出某种攻击行为。由于该理论的简单化和绝对化,一经面世,即遭到批评。多拉德等人后来对自己的观点进行了某种程度的修正,提出了影响攻击行为产生的四种因素:遭受挫折的驱力的强弱,遭受挫折的驱力的范围,以前遭受挫折的频率,攻击反应可能受到惩罚的程度。此外,多拉德等人进一步指出,由挫折引起的攻击主要指向三个方面:一是直接制造挫折的人;二是与挫折的形成没有直接关系的人,迁怒于人,找出气筒便是如此;三是受挫者本人,自杀是其极端表现形式。这种假说曾经对早期的社会心理学和发展心理学关于攻击行为的研究产生了相当大的影响,是美国犯罪心理学的重要理论基础。在这里,多拉德等人所说的挫折指的是行为挫折,而由此诱发的和导致攻击行为的刺激(一种攻击驱力)显然是心理上的不和谐状态,是一种心理挫折。这种心理上的不和谐或心理挫折,尽管在一定条件下未必产生攻击性行为,但它毕竟是产生攻击行为的原因之一,是造成社会不和谐的心理因素。事实上,社会上许多故意伤害他人和危害社会的攻击性事件就常常是由心理挫折这种心理不和谐状态所引起的。这种情况从反面启示我们,在社会有机体正常运转的过程中,社会心理并非是一个机械的、被动性的因素,而是一个相当活跃的、能够主动地向社会释放能量的能动因素。和谐的社会心理向社会释放的是向心力,不和谐的社会心理带给社会的是离心力。从这个意义上说,和谐社会说到底在于人与人之间的和谐,而人与人之间的和谐在一定程度上依赖心理上的和谐。社会的和谐与社会每个成员的心理和谐有着密切关系,心理和谐是构建和谐社会的基础。和谐社会是以人为本的社会,心理和谐是社会成员的美好追求。以人为本就不能不重视社会成员的心理和谐问题。
要实现和保持社会成员的心理和谐,一方面要一如既往地尽可能减少改革阵痛,减少社会负性事件发生的几率,进一步增强社会和谐的程度和水平;与此同时又要积极推动人的心理和谐建设,努力探索在新的条件下有效提高人们心理承受力的方式方法,自觉地在教育、心理医疗以及各级各部门的思想政治工作等几个重要环节之间建立起良性互动的应对机制,从而为构建社会主义和谐社会创造一个和谐、健康的心理环境。
人的心理和谐,是指人的认知、情感、意志等内心活动处于平衡自然、协调统一的状态,并对外界事物抱有平静适度、热情友善的态度。《决定》提出,要塑造自尊自信、理性平和、积极向上的社会心态。这种社会心态,是人们在处理利益关系特别是表达个人利益诉求时、在对待自己的生活学习工作时、在看待西方文明成果特别是发达国家的经济发展和先进科技水平时所应有的心理状态,是心理和谐在特定条件下的具体体现。保持心理和谐,是一个人身体健康的重要标志,是充分发挥个人潜力的重要条件,也是在服务社会中实现人生价值的重要基础。和谐的心理状态,对于促进人与人、人与社会、人与自然和谐相处,形成人人促进和谐的局面,具有重要作用。
和谐社会从心开始。心平才能气和,内和才能外顺。和谐的心理向社会释放的是向心力、亲和力;不和谐的心理向社会释放的是离心力、破坏力。心理和谐的人越多,社会的和谐程度就越高。现代社会,工作和生活节奏加快,竞争加剧,社会矛盾增多,人们的精神压力也随之加大,容易产生急功近利、心浮气躁的心态。特别是当事不遂意时,更容易产生焦躁、郁闷、激愤甚至仇恨等情绪,如果调整不好,于己于人于社会都会产生不利影响。可以说,今天的人们随时随地都面临着调节自己的心态、不断促进心理和谐的现实需要。那么,怎样才能促进人的心理和谐呢?
就国家和社会而言,应深化改革、加快发展,着力解决影响社会和谐的突出矛盾,着力解决人民群众最关心、最直接、最现实的利益问题,加紧建设对保障社会公平正义具有重大作用的制度,最大限度地减少引发人们心理失衡、失调的外部诱因;建设和谐文化,倡导和谐理念,培育和谐精神,加强思想道德建设,在全社会形成知荣辱、讲正气、促和谐的风尚,形成男女平等、尊老爱幼、扶贫济困、礼让宽容的人际关系,为促进心理和谐营造良好的社会氛围;健全心理咨询网络,把人文关怀和心理疏导贯穿、渗透、体现于思想政治工作、学校教育、家庭教育、舆论引导、文化消费、志愿服务、专业咨询等各个方面,帮助人们在潜移默化中达到心理和谐。
就个人来说,则需要加强修养,进行经常性的心理调节,按照客观事物的本来面目观察世界,用平和宁静的心态思考问题,以乐观豁达的情怀对待生活,用理性引导偏激,让冷静战胜浮躁,以恬淡取代痴迷。具体来讲,就是正确对待自己、他人和社会,正确对待困难、挫折和荣誉。对待自己,坚持自省、保持清醒。对自己的能力、水平和潜质应有自知之明,既不妄自菲薄,也不盲目自信,根据自己的实际情况确定志向和目标。对待他人,与人为善、见贤思齐。常怀博爱之心、友善之心,多看别人的优点,多学别人的长处,在别人需要帮助时真诚伸出援助之手。对待社会,宽容大度、尽职尽责。用发展的眼光看待现实中存在的问题,以包容的心态面对新生事物,以积极的姿态紧跟时代步伐,常怀感恩之心、责任之心,为社会的发展进步作出自己的贡献。对待困难,坚韧不拔,知难而进;对待挫折,百折不挠、决不言败;对待荣誉,欣喜有度、不骄不躁。
随机数
cast(rand(checksum(newid()))*100