pl/sql 的内置函数good

来源:互联网 发布:程序员如何接私活 编辑:程序博客网 时间:2024/06/11 16:25

这些函数全都接收的是字符族类型的参数(CHR除外)并且返回字符值.除了特别说明的之外,这些函数大部分返回VARCHAR2类型的数值.字符函数的返回类型所受的限制和基本数据库类型所受的限制是相同的,比如: VARCHAR2数值被限制为2000字符(ORACLE 8中为4000字符),而CHAR数值被限制为255字符(在ORACLE8中是2000).当在过程性语句中使用时,它们可以被赋值给VARCHAR2或者CHAR类型的PL/SQL变量.
ASCII
语法:ascii(char c)
功能:返回一个字符串的第一个字符的ASCII码,他的逆函数是CHR()
使用位置:过程性语句和SQL语句。
select ascii('罗') from dual;
select chr(49886) from dual;
CHR
语法: chr(x)
功能:返回在数据库字符集中与X拥有等价数值的字符。CHR和ASCII是一对反函数。经过CHR转换后的字符再经过ASCII转换又得到了原来的字符。
使用位置:过程性语句和SQL语句。
CONCAT
语法: CONCAT(c1,c2)
功能: c1,c2均为字符串,函数将c2连接到c1的后面,如果c1为null,将返回c2.如果c2为null,则返回c1,如果c1、c2都为null,则返回null,他和操作符||返回的结果相同.
使用位置:过程性语句和SQL语句。
INITCAP
语法:INITCAP(string)
功能:返回字符串的每个单词的第一个字母大写而单词中的其他字母小写的string。单词是用.空格或给字母数字字符由空格,控制字符,标点符号进行分隔。不是字母的字符不变动。      
使用位置:过程性语句和SQL语句。
select INITCAP('luo,jia,you')from dual;
select INITCAP('luo jia you')from dual;
LTRIM
语法:LTRIM(string1,string2)
功能:返回删除从左边算起出现在string2中的字符的string1。String2被缺省设置为单个的空格。数据库将扫描string1,从最左边开始。当遇到不在string2中的第一个字符,结果就被返回了。LTRIM的行为方式与RTRIM很相似。
使用位置:过程性语句和SQL语句。
LOWER
语法:LOWER(string)
功能:返回字符串,并将所有的字符小写
使用位置:过程性语句和SQL语句。
NLS_INITCAP
语法:NLS_INITCAP(string[,nlsparams]
功能:返回字符串每个单词第一个字母大写而单词中的其他字母小写的string,nlsparams
指定了不同于该会话缺省值的不同排序序列。如果不指定参数,则功能和INITCAP相同。Nlsparams可以使用的形式是:
‘NLS_SORT=sort’
这里sort制订了一个语言排序序列。
使用位置:过程性语句和SQL语句。
NLS_LOWER
语法:NLS_LOWER(string[,nlsparams]
功能:返回字符串中的所有字母都是小写形式的string。不是字母的字符不变。
      Nlsparams参数的形式与用途和NLS_INITCAP中的nlsparams参数是相同的。如果nlsparams没有被包含,那么NLS_LOWER所作的处理和LOWER相同。
使用位置;过程性语句和SQL语句。
NLS_UPPER
语法:nls_upper(string[,nlsparams]
功能:返回字符串中的所有字母都是大写的形式的string。不是字母的字符不变。nlsparams参数的形式与用途和NLS_INITCAP中的相同。如果没有设定参数,则NLS_UPPER功能和UPPER相同。
使用位置:过程性语句和SQL语句。
REPLACE
语法:REPLACEstring,search_str[,replace_str]
功能:把string中的所有的子字符串search_str用可选的replace_str替换,如果没有指定replace_str,所有的string中的子字符串search_str都将被删除。REPLACETRANSLATE所提供的功能的一个子集。
使用位置:过程性语句和SQL语句。
RPAD
语法:RPAD(string1,x[,string2]
功能:返回在X字符长度的位置上插入一个string2中的字符的string1。如果string2的长度要比X字符少,就按照需要进行复制。如果string2多于X字符,则仅string1前面的X各字符被使用。如果没有指定string2,那么使用空格进行填充。X是使用显示长度可以比字符串的实际长度要长。RPAD的行为方式与LPAD很相似,除了它是在右边而不是在左边进行填充。
使用位置:过程性语句和SQL语句。
LPAD
语法:LPAD(string1,x[,string2]
功能:返回在X字符长度的位置上插入一个string2中的字符的string1。如果string2的长度要比X字符少,就按照需要进行复制。如果string2多于X字符,则仅string1前面的X各字符被使用。如果没有指定string2,那么使用空格进行填充。X是使用显示长度可以比字符串的实际长度要长。RPAD的行为方式与LPAD很相似,除了它是在右边而不是在左边进行填充。
String1,string2均为字符串,x为整数。在string1的左侧用string2字符串补足致长度x,可多次重复,如果x小于string1的长度,那么只返回string1中左侧x个字符长的字符串,其他的将被截去。String2的缺省值为单空格
使用位置:过程性语句和SQL语句。
select LPAD('123',8,'0') from dual;   -- 00000123
select LPAD('123456789',8,'0') from dual;         --12345678
RTRIM
语法: RTRIM(string1,[,string2]
功能: 返回删除从右边算起出现在string1中出现的字符string2. string2被缺省设置为单个的空格.数据库将扫描string1,从右边开始.当遇到不在string2中的第一个字符,结果就被返回了RTRIM的行为方式与LTRIM很相似.
使用位置:过程性语句和SQL语句。
SOUNDEX
语法: SOUNDEX(string
功能: 返回string的声音表示形式.这对于比较两个拼写不同但是发音类似的单词而言很有帮助. 返回与string发音相似的词
使用位置:过程性语句和SQL语句。
SUBSTR
语法: SUBSTR(string,a[,b]
功能: 返回从字母为值a开始b个字符长的string的一个子字符串.如果a是0,那么它就被认为从第一个字符开始.如果是正数,返回字符是从左边向右边进行计算的.如果b是负数,那么返回的字符是从string的末尾开始从右向左进行计算的.如果b不存在,那么它将缺省的设置为整个字符串.如果b小于1,那么将返回NULL.如果a或b使用了浮点数,那么该数值将在处理进行以前首先被却为一个整数.
使用位置:过程性语句和SQL语句。
SUBSTRB
语法: SUBSTRB(string,a[,b]
功能: 与SUBSTR大致相同,只是a,b是以字节计算
使用位置:过程性语句和SQL语句。
TRANSLATE
   语法: TRANSLATE(string,from_str,to_str)
   功能: 返回将所出现的from_str中的每个字符替换为to_str中的相应字符以后的string. TRANSLATE是REPLACE所提供的功能的一个超集.如果from_str比to_str长,那么在from_str中而不在to_str中而外的字符将从string中被删除,因为它们没有相应的替换字符. to_str不能为空.Oracle把空字符串认为是NULL,并且如果TRANSLATE中的任何参数为NULL,那么结果也是NULL.
使用位置:过程性语句和SQL语句。
select TRANSLATE('fumble','umf','abc') test from dual; --cabble
select TRANSLATE(
'fumble','fu','abcdd') test from dual; --abmble
TRIM
   语法: TRIM(string)
   功能: 删除string字符串前后的空格
使用位置:过程性语句和SQL语句。
UPPER
语法: UPPER(string
功能: 返回大写的string.不是字母的字符不变.如果string是CHAR数据类型的,那么结果也是CHAR类型的.如果string是VARCHAR2类型的,那么结果也是VARCHAR2类型的.

使用位置: 过程性语句和SQL语句。

这些函数接受字符参数回数字结果.参数可以是CHAR或者是VARCHAR2类型的.尽管实际下许多结果都是整数值,但是返回结果都是简单的NUMBER类型的,没有定义任何的精度或刻度范围.
ASCII
语法: ASCII(string
功能: 数据库字符集返回string的第一个字节的十进制表示.请注意该函数仍然称作为ASCII.尽管许多字符集不是7位ASCII.CHR和ASCII是互为相反的函数.CHR得到给定字符编码的响应字符. ASCII得到给定字符的字符编码.
使用位置: 过程性语句和SQL语句。
INSTR
语法: INSTR(string1, string2[a,b]
功能: 得到在string1中包含string2的位置. string1时从左边开始检查的,开始的位置为a,如果a是一个负数,那么string1是从右边开始进行扫描的.第b次出现的位置将被返回. a和b都缺省设置为1,这将会返回在string1中第一次出现string2的位置.如果string2在a和b的规定下没有找到,那么返回0.位置的计算是相对于string1的开始位置的,不管a和b的取值是多少.
使用位置: 过程性语句和SQL语句。
INSTRB
语法: INSTRB(string1, string2[a,[b]]
功能: 和INSTR相同,只是操作的对参数字符使用的位置的是字节.
使用位置: 过程性语句和SQL语句。
LENGTH
语法: LENGTH(string
功能: 返回string的字节单位的长度.CHAR数值是填充空格类型的,如果string由数据类型CHAR,它的结尾的空格都被计算到字符串长度中间.如果string是NULL,返回结果是NULL,而不是0.
使用位置: 过程性语句和SQL语句。
LENGTHB
语法: LENGTHB(string
功能: 返回以字节为单位的string的长度.对于单字节字符集LENGTHB和LENGTH是一样的.
使用位置: 过程性语句和SQL语句。
NLSSORT
语法: NLSSORT(string[,nlsparams]
功能: 得到用于排序string的字符串字节.所有的数值都被转换为字节字符串,这样在不同数据库之间就保持了一致性. Nlsparams的作用和NLS_INITCAP中的相同.如果忽略参数,会话使用缺省排序.

使用位置:过程性语句和SQL语句。

函数接受NUMBER类型的参数并返回NUMBER类型的数值.超越函数和三角函数的返回值精确到36位.ACOS、ASIN、ATAN、ATAN2的结果精确到36位.
ABS
语法:   ABS(x)
功能:   得到x的绝对值.
使用位置: 过程性语言和SQL语句。
ACOS
语法: ACOS(x)
功能: 返回x的反余弦值. x应该从0到1之间的数,结果在0到pi之间,以弧度为单位.
使用位置: 过程性语言和SQL语句。
ASIN
语法: ASIN(x)
功能: 计算x的反正弦值. X的范围应该是-1到1之间,返回的结果在-pi/2到pi/2之间,以弧度为单位.
使用位置: 过程性语言和SQL语句。
ATAN
语法: ATAN(x)
功能: 计算x的反正切值.返回值在-pi/2到pi/2之间,单位是弧度.
使用位置: 过程性语言和SQL语句。
ATAN2
语法: ATAN2(x,y)
功能: 计算x和y的反正切值.结果在负的pi/2到正的pi/2之间,单位是弧度.
使用位置: 过程性语言和SQL语句。
CEIL
语法: CEIL(x)
功能: 计算大于或等于x的最小整数值.
使用位置: 过程性语言和SQL语句。
COS
语法: COS(x)
功能: 返回x的余弦值. X的单位是弧度.
使用位置: 过程性语言和SQL语句。
COSH
语法: COSH(x)
功能: 计算x的双曲余弦值.
EXP
语法: EXP(x)
功能: 计算e的x次幂. e为自然对数,约等于2.71828.
使用位置: 过程性语言和SQL语句。
FLOOR
语法: FLOOR(x)
功能: 返回小于等于x的最大整数值.
使用位置: 过程性语言和SQL语句。
LN
语法: LN(x)
功能: 返回x的自然对数. x必须是正数,并且大于0
使用位置: 过程性语言和SQL语句。
LOG
语法: LOG(x,y)
功能: 计算以x为底的y的对数 .x必须大于0而且不等于1, y为任意正数.
使用位置: 过程性语言和SQL语句。
MOD
语法: MOD(x,y)
功能: 返回x除以y的余数.如果y是0,则返回x
使用位置: 过程性语言和SQL语句。
(456)
POWER
语法: POWER(x,y)
功能: 计算x的y次幂.
使用位置: 过程性语言和SQL语句。
ROUND
: ROUND(x[,y])
功能: 计算保留到小数点右边y位的x值. y缺省设置为0,这会将x保留为最接近的整数.如果y小于0,保留到小数点左边相应的位. Y必须是整数.进行四舍五入。
使用位置: 过程性语言和SQL语句。
SIGN
语法: SIGN(x)
功能: 获得x的符号位标志.如果x<0返回-1.如果x=0返回0.如果x>0返回1.
使用位置: 过程性语言和SQL语句。
SIN
语法:SIN(x)
功能:计算x的正弦值. X是一个以弧度表示的角度.
使用位置: 过程性语言和SQL语句。
SINH
语法:SINH(x)
功能:返回x的双曲正弦值.
使用位置: 过程性语言和SQL语句。
SQRT
语法: SQRT(x)
功能: 返回x的平方根. x必须是正数.
使用位置: 过程性语言和SQL语句。
TAN
语法: TAN(x)
功能: 计算x的正切值, x是一个以弧度位单位的角度.
使用位置: 过程性语言和SQL语句。
TANH
语法: TANH(x)
功能: 计算x的双曲正切值.
使用位置: 过程性语言和SQL语句。
TRUNC
语法: TRUNC(x[,y])
功能: 计算截尾到y位小数的x值. y缺省为0,结果变为一个整数值.如果y是一个负数,那么就截尾到小数点左边对应的位上. 只是该函数不对指定小数前或后的部分做相应舍入选择处理,而统统截去。

使用位置: 过程性语言和SQL语句。

日期函数接受DATE类型的参数.除了MONTHS_BETWEEN函数返回的是NUMBER类型的结果,所有其他的日期函数返回的都是DATE类型的数值.
ADD_MONTHS
语法: ADD_MONTHS(d,x)
功能: 返回日期d加上x个月后的月份。x可以是任意整数。如果结果日期中的月份所包含的天数比d日期中的“日”分量要少。(即相加后的结果日期中的日分量信息已经超过该月的最后一天,例如,8月31日加上一个月之后得到9月31日,而9月只能有30天)返回结果月份的最后一天。
使用位置: 过程性语言和SQL语句。
LAST_DAY
语法:LAST_DAY(d)
功能:计算包含日期的d的月份最后一天的日期.这个函数可以用来计算当月中剩余天数.
使用位置: 过程性语言和SQL语句。
MONTHS_BETWEEN
语法: MONTHS_BETWEEN(date 1,date2)
功能: 计算date 1和date2之间月数.如果date 1,date2这两个日期中日分量信息是相同的,或者这两个日期都分别是所在月的最后一天,那么返回的结果是一个整数,否则包括一个小数,小数为富余天数除以31.
使用位置: 过程性语言和SQL语句。
NEW_TIME
语法: NEW_TIME(d,zone1,zone2)
功能: 计算当时区zone1中的日期和时间是s时候,返回时区zone2中的日期和时间. zone1和zone2是字符串.
使用位置: 过程性语言和SQL语句。
NEXT_DAY
语法: NEXT_DAY(d,string)
功能: 计算在日期d后满足由string给出的条件的第一天. String使用位置;当前会话的语言指定了一周中的某一天.返回值的时间分量与d的时间分量是相同的. String的内容可以忽略大小写.
使用位置: 过程性语言和SQL语句。
ROUND
语法: ROUND(d[,format])
功能: 将日期d按照由format指定的格式进行处理.如果没有给format则使用缺省设置`DD`.
使用位置: 过程性语言和SQL语句。
SYSDATE
语法: SYSDATE
功能: 取得当前的日期和时间,类型是DATE.它没有参数.但在分布式SQL语句中使用时,SYSDATE返回本地数据库的日期和时间.
使用位置: 过程性语言和SQL语句。
TRUNC
语法: TRUNC(d,format)
功能: 计算截尾到由format指定单位的日期d.可以使用位置:格式和效果.缺省参数同ROUNG.

使用位置: 过程性语言和SQL语句。

转换函数用于在PL/SQL数据类型之间进行转换.PL/SQL尽可能地自动进行转换,也就是采用隐含方式转换.隐含转换无法转换格式信息,并且有些类型的数据之间不支持隐含转换,所以对这些可以采用显示转换.使用显示转换也是一种好的编程习惯
.
CHARTOROWID
语法: CHARTOROWID(string)
功能: 把包含外部格式的ROWID的CHAR或VARCHAR2数值转换为内部的二进制格式.参数string必须是包含外部格式的ROWID的18字符的字符串.oracle7和 oracle8中的外部格式是不同的.CHARTOROWID是ROWIDTOCHAR的反函数.
使用位置: 过程性语言和SQL语句。
CONVERT
语法: CONVERT(string,dest_set[,source_set])
功能: 将字符串string从source_set所表示的字符集转换为由dest_set所表示的字符集.如果source_set没有被指定,它缺省的被设置为数据库的字符集.
使用位置: 过程性语言和SQL语句。
HEXTORAW
语法: HEXTORAW(string)
功能: 将由string表示的二进制数值转换为一个RAW数值. String应该包含一个十六进制的数值. String中的每两个字符表示了结果RAW中的一个字节..HEXTORAW和RAWTOHEX为相反的两个函数.
使用位置: 过程性语言和SQL语句。
RAWTOHEX
语法: RAWTOHEX(rawvalue)
功能: 将RAW类数值rawvalue转换为一个相应的十六进制表示的字符串. rawvalue中的每个字节都被转换为一个双字节的字符串. RAWTOHEX和HEXTORAW是两个相反的函数.
使用位置: 过程性语言和SQL语句。
ROWIDTOCHAR
语法: ROWIDTOCHAR(rowid)
功能: 将ROWID类型的数值rowid转换为其外部的18字符的字符串表示,在oracle7和oracle8之间有些不一样的地方. ROWIDTOCHAR和CHARTOROWID是两个相反的函数.
使用位置: 过程性语言和SQL语句。
TO_CHAR(dates)
语法: TO_CHAR(d [,format[,nlsparams]])
功能: 将日期d转换为一个VARCHAR2类型的字符串.如果指定了format,那么就使用位置:它控制结果的方式.格式字符串是由格式元素构成的.第一个元素返回日期数值一个部份,例如日子.如果没有给定format,使用的就是该会话的缺省日期格式.如果指定了nlsparams,它就控制着返回字符串的月份和日分量信息所使用的语言. nlsparams的格式是:
“NLS_DATE_LANGUAGE”
使用位置: 过程性语言和SQL语句。
TO_CHAR(labels)
语法: TO_CHAR(labels[,format])
功能: 将MISLABEL的LABEL转换为一个VARCHAR2类型的变量.
使用位置: 在trusted数据库的过程性语句和SQL语句。
TO_CHAR(numbers)
语法: TO_CHAR(num[,format[,nlsparams]])
功能: 将NUMBER类型的参数num转换为一个VARCHAR2类型的变量.如果指定了format,那么它会控制这个转换处理.表5-5列除了可以使用的数字格式.如果没有指定format,它会控制这个转换过程.下面列出了可以使用的数字格式.如果没有指定format,那么结果字符串将包含和num中有效位的个数相同的字符. nlsparams用来指定小数点和千分位分隔符和货币符号.可以使用的格式:
`NLS_NUMERIC_CHARS=”dg”NLS_CURRENCY=”string”
d和g分别表示列小数点和千分位分隔符. String表示了货币的符号.例如,在美国小数点分隔符通常是一个句点(.),分组分隔符通常是一个逗号(,),而千分位符号通常是一个$.
使用位置: 过程性语言和SQL语句。
TO_DATE
语法: TO_DATE(String[,format[,nlsparams]])
功能: 把CHAR或者VARCHAR2类型的String转换为一个DATE类型的变量. format是一个日期格式字符串.当不指定format的时候,使用该会话的缺省日期格式.
使用位置: 过程性语言和SQL语句。
TO­_LABEL
语法: TO_LABEL(String[,format])
功能: 将String转换为一个MLSLABEL类型的变量. String可以是VARCHAR2或者CHAR类型的参数.如果指定了format,那么它就会被用在转换中.如果没有指定format,那么使用缺省的转换格式.
使用位置: 过程性语言和SQL语句。
TO_MULTI_BYTE
语法: TO_MULTI_BYTE(String)
功能: 计算所有单字节字符都替位换位等价的多字节字符的String.该函数只有当数据库字符集同时包含多字节和单字节的字符的时候有效.否则, String不会进行任何处理. TO_MULTI_BYTE和TO_SINGLE_BYTE是相反的两个函数.
使用位置: 过程性语言和SQL语句。
TO_NUMBER
语法: TO_NUMBER(String[,format[,nlsparams]])
功能: 将CHAR或者VARCHAR2类型的String转换为一个NUMBER类型的数值.如果指定了format,那么String应该遵循相应的数字格式. Nlsparams的行为方式和TO_CHAR中的完全相同.TO_NUMBER和TO_CHAR是两个相反的函数.
使用位置: 过程性语言和SQL语句。
TO_SINGLE_BYTE
语法: TO_SINGLE_BYTE(String )
功能: 计算String中所有多字节字符都替换为等价的单字节字符.该函数只有当数据库字符集同时包含多字节和单字节的字符的时候有效.否则, String不会进行任何处理.
TO_MULTI_BYTE和TO_SINGLE_BYTE是相反的两个函数.

使用位置: 过程性语言和SQL语句。

分组函数返回基于多个行的单一结果,这和单行函数正好形成对比,后者是对单行返回一个结果.这些函数仅仅对于查询的选择列表和GROUP BY子句有效.
    这些函数大都可以接受对参数的修饰符.可以使用位置:的修饰符有DISTINCT和ALL.如果使用位置:了DISTINCT修饰符,那么在处理中仅仅会考虑由查询返回的不同的取值.ALL修饰符会使得该函数考虑由查询返回的所有数值.如果没有指定任何修饰符,那么缺省使用位置:的是ALL修饰符.
AVG
语法: AVG([DISTINCT| ALL]col)
功能: 返回一列数据的平均值.
使用位置: 查询列表和GROUP BY子句.
COUNT
语法: COUNT(*| [DISTINCT| ALL] col)
功能: 得到查询中行的数目.如果使用了*获得行的总数.如果在参数中传递的是选择列表,那么计算的是非空数值.
GLB
获得由label界定的最大下界.函数仅用于trusted oracle.GLB
语法: GLB ([DISTINCT| ALL]label)
功能: 获得由label界定的最大下界.函数仅用于trusted oracle.
使用位置:trusted数据库的选择列表和GROUP BY子句.
LUB
语法: LUB ([DISTINCT| ALL]label)
功能: 获得由label界定的最小上界.用于trusted oracle.数据库.
使用位置: trusted数据库的选择列表和GROUP BY子句.
过程性语言和SQL语句。
MAX
语法: MAX([DISTINCT| ALL]col)
功能: 获得选择列表项目的最大值.
使用位置: 仅用于查询选择和GROUP BY子句.
MIN
语法: MIN([DISTINCT| ALL]col)
功能: 获得选择列表的最小值.
使用位置: 仅用于查询选择和GROUP BY子句.
STDDEV
语法: STDDEV([DISTINCT| ALL]col)
功能: 获得选择列表的标准差.标准差为方差的平方根.
使用位置: 仅用于查询选择和GROUP BY子句.
SUM
语法:SUM([DISTINCT| ALL]col)
功能:返回选择的数值和总和
使用位置: 仅用于查询选择和GROUP BY子句.
VARIANCE
语法: VARIANCE([DISTINCT| ALL]col)
功能:返回选择列表项目的统计方差.

使用位置: 仅用于查询选择和GROUP BY子句.

BFILENAME
语法: BFILENAME(directory,file_name)
功能: 获得操作系统中与物理文件file_name相关的BFILE位置指示符. directory必须是数据字典中的DIRECTORY类型的对象.
使用位置: 过程性语言和SQL语句。
DECODE
语法:
DECODE(base_expr,comparel,valuel,
Compare2,value2,
default)
功能: 把base_expr与后面的每个compare (n) 进行比较,如果匹配返回相应的value (n) .如果没有发生匹配,则返回default
使用位置: 过程性语言和SQL语句。
DUMP
语法:DUMP(expr[,number_format[,start_position][,length]])
功能:获得有关expr的内部表示信息的VARCHAR2类型的数值. number_format指定了按照下面返回数值的基数(base):
    number_format   结果
8                     八进制表示
10         十进制表示
16                  十六进制表示
17                  单字符
默认的值是十进制.
如果指定了start_position和length,那么返回从start_position开始的长为length的字节.缺省返回全部.
数据类型按照下面规定的内部数据类型的编码作为一个数字进行返回.
         代码             数据类型
1                                                     VARCHAR2
2                                                     NUMBER
8                                                     LONG
12              DATE
23                                                  RAW
69                                                  ROWID
96                                                  CHAR
106                                              MLSLABEL
使用位置: SQL语句.
EMPTY_CLOB/EMPTY_BLOB
语法: EMPTY_CLOB
       EMPTY_BLOB
功能: 获得一个空的LOB提示符 (locator) .EMOTY_CLOB返回一个字符指示符,而 EMPTY_BLOB返回一个二进制指示符.
使用位置: 过程性语言和SQL语句.
GREATEST
语法: GREATEST(expr1[,expr2]…)
功能: 计算参数中最大的表达式.所有表达式的比较类型以expr1为准.
       返回一组表达式中的最大值,即比较字符的编码大小.
使用位置: 过程性语言和SQL语句.
          select greatest(’AA’,’AB’,’AC’) from dual;
select greatest(1,2,5) from dual;
GREATEST_LB
语法: GREATEST_LB(label1[,label2]…)
功能: 返回标签(label)列表中最大的下界.每个标签必须拥有数据类型MLSLABEL、RAWMLSLABEL或者是一个表因字符串文字.函数只能用于truested oracle库.
使用位置: 过程性语言和SQL语句.
LEAST
语法: LEAST(expr1[,:expr2]…)
功能: 获得参数中最小的表达式.
使用位置: 过程性语言和SQL语句.
select least(’啊’,’安’,’天’) from dual;
select least(1,5,9) from dual;
LEAST_UB
语法: LEAST_UB(label1[,label2]…)
功能: 与GREATEST_UB函数相似,本函数返回标签列表的最小上界.
使用位置: 过程性语言和SQL语句.
NVL
语法: NVL (expr1, expr2)
功能: 如果expr1是NULL,那么返回expr2,否则返回expr1.
如果expr1不是字符串,那么返回值的数据类型和expr1是相同的,否则,返回值的数据类型是VARCHAR2.此函数对于检查并确定查询的活动集不包含NULL值十分有用.
使用位置: 过程性语言和SQL语句.
UID
语法:
功能: 获得当前数据库用的惟一标识,标识是一个整数.
使用位置: 过程性语言和SQL语句.
USER
语法:
功能: 取得当前oracle用户的名字,返回的结果是一个VARCHAR2型字符串.
使用位置: 过程性语言和SQL语句.
USERENV
语法: USERENV(option)
功能: 根据参数option,取得一个有关当前会话信息的VARCHAR2数值.
使用位置: 过程性语言和SQL语句.
VSIZE
语法: VSIZE(value)
功能: 获得value的内部表示的字节数.如果value是NULL,结果是NULL.
使用位置: 过程性语言和SQL语句.

(sql/oracl)

SQL和Oracle语法 收藏
view plaincopy to clipboardprint?
select to_char(sysdate,'hh24MISS') from dual --Oracle中查询系统时间的小时、分、秒的语句  
 
 
 
declare @a char 
 
select a=left(replace(convert(varchar,getdate(),108),':',''),4) from hd_timeslot   
 
--SQL中查询系统时间的小时和分钟的语句  
 
 
 
select * from xh_user where convert(varchar,regtime,120) > '20070328' order by regtime  
 
--SQL中查询日期时间字段的值在什么范围之间  
 
 
 
 
 
select * from hd_ontime where rownum < 2; --表示从hd_ontime表中查询第一条所有的记录,相当于                       --SQL中的TOP  
 
 
 
--Oracle从表中取随机的任意一行  
 
select content from (select * from Con_Aqml order by trunc(dbms_random.value(0,100)))where rownum=1 --从Con_Aqml表里查询随机任意一行,(0,100)表示行数的最大范围为100  
 
select *from (select *from Con_Lxxh order by dbms_random.value) where rownum=1  
 
----从Con_Lxxh表里查询随机任意一行,order by dbms_random.value必须要是关键字  
 
 
 
create sequence sequence_add_one1    
 
minvalue 1   
 
maxvalue 100   
 
start with 1   
 
increment by 1   
 
cache 20  --创建一个自动加一的sequence,值的范围为从一开始到100结束  
 
 
 
insert into Con_LXXH(Autoid) values(sequence_add_one1.nextval) --将sequence生成的值插入到字段Autoid里面去  
 
 
 
建立一个可以自动加一的字段,相当于SQL中的IDENTIFY  
 
create sequence order_ids start with 1 increment by 1 nomaxvalue;  --order_ids为sequence名称   
 
使用:     
 
insert into items(id) values(order_ids.nextval);  --items为表名,id为字段名   
 
 
 
 
 
select to_char(sysdate,'D') from dual --取出系统时间是当月中的星期几(星期日是1)  
 
日期格式参数 含义说明   
 
D 一周中的星期几   
 
DAY 天的名字,使用空格填充到9个字符   
 
DD 月中的第几天   
 
DDD 年中的第几天   
 
DY 天的简写名   
 
IW ISO标准的年中的第几周   
 
IYYY ISO标准的四位年份   
 
YYYY 四位年份   
 
YYY,YY,Y 年份的最后三位,两位,一位   
 
HH 小时,按12小时计   
 
HH24 小时,按24小时计   
 
MI 分   
 
SS 秒   
 
MM 月   
 
Mon 月份的简写   
 
Month 月份的全名   
 
W 该月的第几个星期   
 
WW 年中的第几个星期   
 
 
 
 
 
instr(str1,str2,[start_pos[,occurrence]])  
 
 
 
str1 被检索的字符串  
 
str2 再str1内要找的子字符串  
 
start_pos 查找的起始位置  
 
occurrence出现次数  
 
 
 
returns 返回字符串位置或0  
 
 
 
substr:取数据(从什么开始到什么结束)  
 
instr:取整数  
 
upper:将小写字母转换成大写字母  
 
 
 
 
 
 delete   a   where   id   in(select   id   from   b)  --SQL删除表a中所有的数据当表a中的id等于表b中的id  
 
 
 
--使用透明网关从Oracle查SQL数据库中的表,查询随机一条  
 
select * from (select * from
table_name@ivrnet_sql order by dbms_random.value) where rownum<2  
 
 
 
 
 
--SQL数据库中随机取一条数据的语法  
 
 select top 1 * from table_name order by newid()  
 
 
 
--判断表testtable1 中的数据不在表testtable2中  
 
select a1 from testtable1 where a1 not in 
 
   (select   distinct   a2   from   testtable2)   
 
 
 
 
 
Oracle数据导出:  
 
  1 将数据库TEST完全导出,用户名system 密码manager 导出到D:/daochu.dmp中  
 
  exp
system/manager@TEST file=d:/daochu.dmp full=y  
 
  2 将数据库中system用户与sys用户的表导出  
 
  exp
system/manager@TEST file=d:/daochu.dmp owner=(system,sys)  
 
  3 将数据库中的表table1 、table2导出  
 
  exp
system/manager@TEST file=d:/daochu.dmp tables=(table1,table2)   
 
  4 将数据库中的表table1中的字段filed1以"00"打头的数据导出  
 
  exp
system/manager@TEST file=d:/daochu.dmp tables=(table1) query=/" where filed1 like '00%'/" 
 
    
 
  上面是常用的导出,对于压缩我不太在意,用winzip把dmp文件可以很好的压缩。  
 
  不过在上面命令后面 加上 compress=y  就可以了  
 
 
 
Oracle数据的导入  
 
  1 将D:/daochu.dmp 中的数据导入 TEST数据库中。  
 
  imp
system/manager@TEST  file=d:/daochu.dmp  
 
  上面可能有点问题,因为有的表已经存在,然后它就报错,对该表就不进行导入。  
 
  在后面加上 ignore=y 就可以了。  
 
  2 将d:/daochu.dmp中的表table1 导入  
 
  imp
system/manager@TEST  file=d:/daochu.dmp  tables=(table1)  
 
 
 
Oracle中取表中任意一个字段的数据语句  
 
select * from xhth where rownum = 1 and scrphone not in 
 
(select * from xhth where rownum<2)  
 
 
 
SQL在现有的表中增加一个字段  
 
alter table 表名 add 列名 varchar(20) null 
 
 
 
SQL 删除现有表中的一个字段  
 
alter table 表名 drop column 列名  
 
 
 
SQL修改表中字段的名称  
 
sp_rename '表名.老的字段名称','新的字段名称','column' 
 
 
 
SQL查寻表中字段相同的记录  
 
select * from 表名 group by 列名 having count(*) > 1   
 
 
 
SQL查询两表中相同的记录  
 
Select   表1.*   From   表1,表2   Where   表1.列1   =   表2.列1  
 
或  Select   表1.*   From   表1   Inner   Join   表2   On   表1.列1   =   表2.列1  
 
 
 
SQL中删除相同的记录  
 
select   distinct   *   into   #temp   from   Utable     
 
drop   table   Utable     
 
insert   into   Utable   select   *   from   #temp  
 
 
 
SQL两个表(T1,T2)中有相同的记录,删除T1表中T2表有的列  
 
 delete T1 where exists(select *  from T2 where C1=T1.C1 and C2=T2.C2)   
 
 或:  
 
 delete   T1   from   T2   where   T1.c1=T2.c1   and   T1.C2=T2.C2  
 
 
 
 
 
Oracle查询表中字段相同的记录  
 
select phone from wz_user group by phone having count(*) > 1 --tableb为创建的新表,phone为需要查的字段,如果要多查几个字段的话                                                             --group by后面也要接查的字段名  
 
(不懂可以上此网站查
http://wangnewton.blogdriver.com/wangnewton/1075153.html)  
 
 
 
查询A(ID,Name)表中第31至40条记录,ID作为主键可能不是连续增长的列  
 
select top 10 * from A where id not in (select top 30 id from A)  
 
或者  
 
select top 10 * from A where id > (select max(id) from (select top 30 id from A)as b)  
 
 
 
查询表中ID重复三次以上的记录  
 
Select * from table where id in (Select id  from   table   group   by   id   having   count(id)> =3)   
 
 
 
 
 
SQL访问SQL  
 
exec sp_addlinkedserver  '61.187.98.146' 
 
 
 
sp_addlinkedsrvlogin '61.187.98.146',false, NULL,'sa','t9i8m7e6'   
 
 
 
select * from [61.187.98.146].ivr.dbo.xh_phone  
 
 
 
在已有的Oracle表中添加字段  
 
alter table 表名 add(字段名 字段类型)  
 
 
 
将SQL自动生成的ID重0开始  
 
truncate   table   表名  
 
 
 
SQL去掉字段一些内容的sql语句  
 
select replace(字段名称,'abc/','') as 字段名称 from table --abc/为需要去掉的内容,去掉的内容被替换成空内容  
 
或者  
 
select 字段名称= stuff(字段名称,1,4) from table  
 
 
 
sql server数据库定时自动备份  
 
1、进入企业管理器中->管理->sql server代理->作业;  
 
2、新建作业,作业名称随便取,例如:data备份,所有者选择sa,当然你也可以选择其他用户,前提是该用户有执行作业的权限;  
 
3、点击步骤标签,进入步骤面板。新建步骤,步骤名可以随便填写,如步骤1,类型和数据库默认,不需要修改。命令中写入以下语句:  
 
BACKUP DATABASE [数据库名] TO  DISK = N'F:/data/数据库备份' WITH  NOINIT ,  NOUNLOAD ,  NAME = N'数据库 备份',  NOSKIP ,  STATS = 10,  NOFORMAT  
 
注意:需要修改的地方,数据库名,DISK=(这里需要填写路径和你的数据库备份的名称)后面的Name=可以随便填写。  
 
4、点击调度标签,进入调度面板,新建调度,名称随便填写,选择反复出现,点更改可以选择你想要执行任务的随意调度。如每天,每2天,每星期,每月等。根据需要自己设置;   
 
5、确定后,不要忘记一件事情,在你刚才建立的工作上点右键,启动工作,如果你的工作没有问题,将会提示执行成功,并有相对应的备份文件在你的磁盘上出现;   
 
6、还有一个重要的问题就是你的sql server agent服务器已经启动。  
 
 
 
如果我们需要根据每天的日期来生成一个新的备份,以便我们区别备份文件。这时,我们需要修改一下刚才的sql语句。参考实例: 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   
 
 
 
 
 
清除SQL日志:   
 
DECLARE @LogicalFileName sysname,  
 
        @MaxMinutes INT,  
 
        @NewSize INT  
 
USE     szwzcheck             -- 要操作的数据库名  
 
SELECT  @LogicalFileName = 'szwzcheck_Log',  -- 日志文件名  
 
@MaxMinutes = 10,               -- Limit on time allowed to wrap log.  
 
        @NewSize = 20                  -- 你想设定的日志文件的大小(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   
 
      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   
 
把szwzcheck换成你数据库的名字即可,在查询分析器里面运行。   
 
有全角的空格(为了显示好看),你自己把他换一下.   
 
 
 
收缩日志:  
 
企业管理器--所有任务--收缩数据库--文件--选日志文件收缩  
 
 
 
 
 
SQLServer2000同步复制技术实现步骤    
 
一、   预备工作   
 
1.发布服务器,订阅服务器都创建一个同名的windows用户,并设置相同的密码,做为发布快照文件夹的有效访问用户   
 
--管理工具   
 
--计算机管理   
 
--用户和组   
 
--右键用户   
 
--新建用户   
 
--建立一个隶属于administrator组的登陆windows的用户(DBUser)  
 
2. 发布服务器,订阅服务器都创建一个同名的SQL登陆用户或使用sa用户,并设置相同的密码,密码不同不行  
 
企业管理器   
 
--右键SQL实例  
 
--安全性  
 
--登陆   
 
--新建登陆  
 
--常规--名称(remote)--sqlserver身份验证 密码(timesonserver) --更改默认的数据库  
 
--服务器角色 --System Administrators  
 
--数据库访问(每个数据库都要单独的许可,只是需要的数据库才需要设置,数据库角色中允许选择publice和db_owner)  
 
3.在发布服务器上,新建一个共享目录,做为发布的快照文件的存放目录,操作:   
 
我的电脑--D:/   新建一个目录,名为:   PUB   
 
--右键这个新建的目录   
 
--属性--共享   
 
--选择"共享该文件夹"   
 
--通过"权限"按纽来设置具体的用户权限,保证第一步中创建的用户(DBUser)   具有对该文件夹的所有权限   
 
--确定   
 
4.设置SQL代理(SQLSERVERAGENT)服务的启动用户(发布/订阅服务器均做此设置)   
 
开始--程序--管理工具--服务   
 
--右键SQLSERVERAGENT   
 
--属性--登陆--选择"此账户"   
 
--输入或者选择第一步中创建的windows登录用户名(DBUser)   
 
--"密码"中输入该用户的密码   
 
5.设置SQL   Server身份验证模式,解决连接时的权限问题(发布/订阅服务器均做此设置)   
 
企业管理器   
 
--右键SQL实例--属性   
 
--安全性--身份验证   
 
--选择"SQL   Server   和   Windows"   
 
--确定   
 
6.(在连接端配置,比如,在订阅服务器上配置的话,服务器名称中输入的是发布服务器的IP 发布/订阅服务器均做此设置)   
 
开始--程序--Microsoft   SQL   Server--客户端网络实用工具   
 
--别名--添加   
 
--网络库选择"tcp/ip"--服务器别名输入SQL服务器名   
 
--连接参数--服务器名称中输入SQL服务器ip地址   
 
--如果你修改了SQL的端口,取消选择"动态决定端口",并输入对应的端口号   
 
7.在发布服务器和订阅服务器上互相注册   
 
企业管理器   
 
--右键SQL   Server组   
 
--新建SQL   Server注册...   
 
--下一步--可用的服务器中,输入你要注册的远程服务器名(此写远程服务器的机器名不写IP地址)   --添加   
 
--下一步--连接使用,选择第二个"SQL   Server身份验证"   
 
--下一步--输入用户名和密码(用户名:remote 密码:timesonserver)   
 
--下一步--选择SQL   Server组,也可以创建一个新组   
 
--下一步--完成   
 
二、   正式配置   
 
1、配置发布服务器   
 
打开企业管理器,在发布服务器上执行以下步骤:   
 
(1)   从[发布服务器 ]下拉菜单的[复制]子菜单[发布内容]中选择[配置发布、订阅服务器和分发]出现配置发布和分发向导     
 
(2)   [下一步]   选择分发服务器   可以选择把发布服务器自己作为分发服务器或者其他sql的服务器(选择自己)   
 
(3)   [下一步]   设置快照文件夹     
 
采用默认
//servername/Pub (推荐使用默认的设置,如://ALEX/C$/Program Files/Microsoft SQL Server/MSSQL/ReplData)  
 
(4)   [下一步]   自定义配置     
 
可以选择:是,让我设置分发数据库属性启用发布服务器或设置发布设置 (推荐)  
 
否,使用下列默认设置   
 
(5)   [下一步]   设置分发数据库名称和位置   采用默认值   
 
(6)   [下一步]   启用发布服务器   选择作为发布的服务器(点击分发数据库的右边的筐--常规--使用         sqlserver身份验证,输入用户名:remote密码:timesonserver)   
 
(7)   [下一步]   选择需要发布的数据库和发布类型 (只要选择合并,事务不要选)  
 
(8)   [下一步]   选择注册订阅服务器   
 
(9)   [下一步]   完成配置   
 
(10)从[发布服务器 ]下拉菜单的[复制]子菜单[发布内容]中选择[新建发布]  
 
(11)[选择发布数据库]如IVR  
 
(12)[选择发布类型]中选择合并发布  
 
(13)[指定项目]中选择需要合并的表和存储过程  
 
(14)[自定义发布的属性]中选择:是,我将定义数据筛选  
 
(15)[允许匿名订阅]中选择:是,允许匿名订阅  
 
(16)[设置快照代理程序调度]中设置调度的时间和发生的频率  
 
(17)完成配置  
 
*注:如果发布服务器和订阅服务器相互不能访问共享文件夹就只能将第三步中生成的快照文件夹,如:repldata 拷贝到订阅服务器上在配置订阅服务器  
 
中的第七步时选择快照文件选择刚拷贝来的文件  
 
2、配置订阅服务器  
 
(1)从[订阅服务器]菜单的[复制]子菜单中选择[订阅]--新建请求订阅  
 
(2)选择发布中选择已发布的服务器,如ALEX--IVRSYNC:IVR   
 
(3)[指定同步代理程序登陆]选择SQL身份验证(此用户名和密码是发布和订阅服务器上新建的用户名和密码)   
 
(4)[选择目的数据库]如IVR  
 
(5)[允许匿名订阅]中选择:是,生成匿名订阅  
 
(6)[初始化订阅]中选择:是,初始化架构和数据并将复选框中的启动合并代理程序来立即初始化订阅  
 
(7)[快照传送]中选择使用下列文件夹中的快照文件(发布服务器上的共享文件,如
//Alex/repldata)  
 
(8)[设置合并代理程序调度]中选择连续地  
 
(9)完成配置(注:如果订阅服务器生成不成功就查看错误提示是什么或者看系统工具中事件查看器中的应用程序日志)  
 
 
 
 
 
表a、b。字段都为name、count。其中通过name一一对应,现在需要更新表b,使其所有的count值都增加对应a表中的相应值:  
 
update b set b.count = b.count + a.count from a join b on a.name = b.name  
 
 
 
SQL Server中文版的默认的日期字段datetime格式是yyyy-mm-dd Thh:mm:ss.mmm  
 
  例如:  
 
  select getdate()  
 
  2004-09-12 11:06:08.177  
 
 
 
  整理了一下SQL Server里面可能经常会用到的日期格式转换方法:  
 
  举例如下:  
 
  select CONVERT(varchar, getdate(), 120 )  
 
  2004-09-12 11:06:08  
 
 
 
  select replace(replace(replace(CONVERT(varchar, getdate(), 120 ),'-',''),' ',''),':','')  
 
  20040912110608  
 
 
 
  select CONVERT(varchar(12) , getdate(), 111 )  
 
  2004/09/12  
 
 
 
  select CONVERT(varchar(12) , getdate(), 112 )  
 
  20040912  
 
 
 
  select CONVERT(varchar(12) , getdate(), 102 )  
 
  2004.09.12  
 
 
 
  select CONVERT(varchar(12) , getdate(), 101 )  
 
  09/12/2004  
 
 
 
  select CONVERT(varchar(12) , getdate(), 103 )  
 
  12/09/2004  
 
 
 
  select CONVERT(varchar(12) , getdate(), 104 )  
 
  12.09.2004  
 
 
 
  select CONVERT(varchar(12) , getdate(), 105 )  
 
  12-09-2004  
 
 
 
  select CONVERT(varchar(12) , getdate(), 106 )  
 
  12 09 2004  
 
 
 
  select CONVERT(varchar(12) , getdate(), 107 )  
 
  09 12, 2004  
 
 
 
  select CONVERT(varchar(12) , getdate(), 108 )  
 
  11:06:08  
 
 
 
  select CONVERT(varchar(12) , getdate(), 109 )  
 
  09 12 2004 1  
 
 
 
  select CONVERT(varchar(12) , getdate(), 110 )  
 
  09-12-2004  
 
 
 
  select CONVERT(varchar(12) , getdate(), 113 )  
 
  12 09 2004 1  
 
 
 
  select CONVERT(varchar(12) , getdate(), 114 )  
 
  11:06:08.177  
 
 
 
Orcale创建表xh_comuser,表结构为通过透明网关从SQL数据库中查出来得表xh_comuser  
 
create table xh_comuser as (select * from
xh_comuser@czxh_sql)  
 
 
 
通过SQL访问Oracle数据库增、删、改、查的连接方法  
 
如:select * from openquery(ora,'select * from smsrun.tailor_user_info'),此语句中tailor_user_info为Oracle数据库中的表,ora为链接服务器的名称。  
 
update   openquery(ora,'select   *   from   aaa   where   column1=???') set   column2=???     
 
delete   openquery(ora,'select   *   from   aaa   where   column1=???')     
 
insert   into   openquery(ora,'select   *   from   aaa   where   column1=???')     
 
values(...,...,...,...)   
 
 
 
Oracle 创建临时表的语句:  
 
create  global temporary table tableName as select * from table1   
 
或  
 
create   global   temporary   table   tableName   
 
(  
 
字段名 varchar(20)  
 
)  
 
 
 
将表test2中的字段fprefix的值的前三位由130改成156  
 
update test2 set fprefix = '156'||substr(fprefix,4,7)  
 
 
 
比如现在有一人员表  (表名:peosons)  
 
若想将姓名、身份证号、住址这三个字段完全相同的记录查询出来   
 
select   p1.*   from   persons   p1,persons   p2   where   p1.id<>p2.id   and   p1.cardid   =   p2.cardid   and   p1.pname   =   p2.pname   and   p1.address   =   p2.address   
 
 
 
可以实现上述效果.   
 
 
 
几个删除重复记录的SQL语句  
 
    
 
 
 
1.用rowid方法   
 
 
 
 
 
2.用group by方法   
 
 
 
3.用distinct方法 网页教学网   
 
 
 
    
 
 
 
 
 
1。用rowid方法   
 
 
 
 
 
据据oracle带的rowid属性,进行判断,是否存在重复,语句如下:  
 
查数据:  
 
     select * from table1 a where rowid !=(select   max(rowid)    
 
     from table1 b where a.name1=b.name1 and a.name2=b.name2......)  
 
删数据:  
 
    delete   from table1 a where rowid !=(select   max(rowid)    
 
     from table1 b where a.name1=b.name1 and a.name2=b.name2......)   
 
 
 
2.group by方法   
 
 
 
查数据:  
 
  select count(num), max(name) from student --列出重复的记录数,并列出他的name属性   
 
  group by num   
 
  having count(num) >1 --按num分组后找出表中num列重复,即出现次数大于一次   
 
删数据:  
 
  delete from student   
 
  group by num   
 
  having count(num) >1  
 
  这样的话就把所有重复的都删除了。   
 
 
 
网页教学网  
 
 
 
 
 
3.用distinct方法 -对于小的表比较有用   
 
 
 
网页教学网  
 
 
 
 
 
create table table_new as   select distinct *   from table1 minux   
 
truncate table table1;  
 
insert into table1 select * from table_new;  
 
 
 
Webjx.Com   
 
 
 
查询及删除重复记录的方法大全  
 
 
 
1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断  
 
select * from people  
 
where peopleId in (select  peopleId  from  people  group  by  peopleId  having  count(peopleId) > 1)  
 
 
 
 
 
2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录  
 
delete from people   
 
where peopleId  in (select  peopleId  from people  group  by  peopleId   having  count(peopleId) > 1)  
 
and rowid not in (select min(rowid) from  people  group by peopleId  having count(peopleId )>1)  
 
 
 
 
 
3、查找表中多余的重复记录(多个字段)   
 
select * from vitae a  
 
where (a.peopleId,a.seq) in  (select peopleId,seq from vitae group by peopleId,seq  having count(*) > 1)  
 
 
 
 
 
4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录   
 
delete from vitae a  
 
where (a.peopleId,a.seq) in  (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)  
 
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)  
 
 
 
 
 
5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录  
 
select * from vitae a  
 
where (a.peopleId,a.seq) in  (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)  
 
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)  
 
 
 
 
 
(二)  
 
比方说  
 
在A表中存在一个字段“name”,  
 
而且不同记录之间的“name”值有可能会相同,  
 
现在就是需要查询出在该表中的各记录之间,“name”值存在重复的项;  
 
Select Name,Count(*) From A Group By Name Having Count(*) > 1  
 
如果还查性别也相同大则如下:  
 
Select Name,sex,Count(*) From A Group By Name,sex Having Count(*) > 1   
 
网页教学网  
 
 
 
 
 
 
 
(三)  
 
方法一  
 
declare @max integer,@id integer  
 
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) >; 1  
 
open cur_rows  
 
fetch cur_rows into @id,@max  
 
while @@fetch_status=0  
 
begin  
 
select @max = @max -1  
 
set rowcount @max  
 
delete from 表名 where 主字段 = @id  
 
fetch cur_rows into @id,@max  
 
end  
 
close cur_rows  
 
set rowcount 0  
 
 
 
 
 
方法二  
 
"重复记录"有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。 网页教学网   
 
 
 
 
 
  1、对于第一种重复,比较容易解决,使用  
 
select distinct * from tableName  
 
  就可以得到无重复记录的结果集。  
 
  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除  
 
select distinct * into #Tmp from tableName  
 
drop table tableName  
 
select * into tableName from #Tmp  
 
drop table #Tmp  
 
  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。  
 
 
 
 
 
  2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下  
 
  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集  
 
select identity(int,1,1) as autoID, * into #Tmp from tableName  
 
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID  
 
select * from #Tmp where autoID in(select autoID from #tmp2)  
 
  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)   
 
 
 
 
 
 
 
(四)  
 
查询重复  
 
select * from tablename where id in (  
 
select id from tablename   
 
group by id   
 
having count(id) > 1  
 
)  
 
 
 
本文来自:网页教学网(
www.webjx.com)原文链接:http://www.webjx.com/database/sqlserver/database_sqlserver_2007_11_28_1421.htm  
 
 
 
如果视图调用了表的话更改表结构之后需将视图也相对应的更新,语句如下:  
 
exec sp_recompile 'studentuser' 
 
exec sp_refreshview 'v_studentuser' 
 
 
 
CREATE proc editStuAttendance   
 
@schoolId int,             --学校编号  
 
@classId  varchar(4000)  --班级编号,假如传过来的参数值为1,2,3  
 
as 
 
declare @i int 
 
declare @startDate datetime  
 
--set @startDate=dateadd(dd,9-datepart(dw,getdate()),getdate())   
 
set @startDate=dateadd(dd,case datepart(dw,getdate()) when 1 then 1 else 9-(datepart(dw,getdate())) end,getdate()) --取单前时间的下个礼拜一的语句  
 
set @i=0  
 
select @n = 1  
 
while @i<7  
 
begin  
 
    set @n=1  
 
    while charindex(',',@classId,@n) > 0    
 
    begin  
 
        set @classIdTemp = cast(substring(@classId,@n,charindex(',',@classId,@n)-@n) as int) --去掉参数传过来无逗号的值并将之转换为整型,此时取的值为1,已下再对之循环  
 
        select @attendDate=convert(char(8),dateadd(dd,@i,@startDate),112)  
 
        select @amInStd=amInStd from classLessonState where
schoolId=@schoolId and classId=@classIdTemp  
 
        select @amOutStd=amOutStd from classLessonState where
schoolId=@schoolId and classId=@classIdTemp  
 
        select @pmInStd=pmInStd from classLessonState where
schoolId=@schoolId and classId=@classIdTemp  
 
        select @pmOutStd=pmOutStd from classLessonState where
schoolId=@schoolId and classId=@classIdTemp  
 
        select @amState=amState from classLessonState where
schoolId=@schoolId and classId=@classIdTemp  
 
        select @pmState=pmState from classLessonState where
schoolId=@schoolId and classId=@classIdTemp  
 
        insert into stuAttendance(schoolId,classId,attendDate,userId,cardId,amIn,amInStd,amOut,amOutStd,amStatus,pmIn,pmInStd,pmOut,pmOutStd,pmStatus)  
 
        select @schoolId,@classIdTemp,@attendDate,userId,cardId,null,@amInStd,null,@amOutStd,@amState,null,@pmInStd,null,@pmOutStd,@pmState  
 
        from studentuser where
schoolId=@schoolId and classId=@classIdTemp and studentstatus=1  
 
        select @n = charindex(',',@classId,@n)+1  
 
      end  
 
      set @i=@i+1  
 
end     
 
 
 
Oracle在当前系统时间上加一个小时:1是代表一天,1/24就是一小时,同理1/24/60就是一分钟  
 
如 select sysdate+1 from dual 表示:在当前时间上加一天  
 
     select sysdate+1/24 from dual 表示:在当前时间上加一小时  
 
     select sysdate+1/24/60 from dual 表示:在当前时间上加一分钟  
 
     select sysdate+1/24/60/2 from dual 表示:在当前时间上加半分钟  
 
 
 
在SQL Server中,如何实现类似Oracle的Rownum这样的伪列功能  
 
在Oracle中,可以这样写     
 
  select   rownum   序号,   CustName   姓名     
 
  from   CustInfo     
 
  可以得到如下结果:     
 
    序号       姓名     
 
  ---------------     
 
      1           张三     
 
      2           李四     
 
      3           王五     
 
      ..         ....     
 
  ---------------     
 
  其中的RowNum就是伪列,并不真正存在于db中。  
 
SQL中可以这么写  
 
select   ID=identity(int,1,1),*   into   #temp  from   tablename     
 
select   *   from   #temp    
 
 
 
exec   sp_pkeys   table1----得到表的主键     
 
exec   sp_fkeys   table1----得到表的外键

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/alexniit4/archive/2008/06/20/2568822.aspx