首页 > 数据库 > Oracle > sql函数整理及sql执行顺序
1.union子句用法
union子句
union操作符将两个查询结果合并为一个结果集。为连接查询合并两个表时:列的数日和顺序在查中必须一致;数据类型兼容
语法:
select
union
select
注意:
1 .union运算从最终结果集中删除重复记录,如想不删除重复记录使用all关键字
2 .第一个select语句中不能用order by或compute子句,只能是最后一个select语名后用
select
union ;
select
order
2.WHERE子句可包括各种条件运算符:
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!<
范围运算符(表达式值是否在指定的范围):BETWEEN…AND…
NOT BETWEEN…AND…
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……)
NOT IN (项1,项2……)
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND
age<=30
2、列表运算符例:country IN ('Germany','China')
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、varchar、text、ntext、datetime和smalldatetime等类型查询。
可使用以下通配字符:
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。[^]:其取值也[]
相同,但它要求所匹配对象为指定字符以外的任一个字符。
例如:
限制以Publishing结尾,使用LIKE '%Publishing'
限制以A开头:LIKE '[A]%'
限制以A开头外:LIKE '[^A]%'
3.in和exists
in 是把外表和内表作hash
连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。
如果查询的两个表大小相当,那么用in和exists差别不大。
如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:
例如:表A(小表),表B(大表)1:select * from A where cc in (select cc from
B)
效率低,用到了A表上cc列的索引;select * from A where exists(select cc from B
where cc=A.cc)
效率高,用到了B表上cc列的索引。
相反的2:select * from B where cc in (select cc from
A)效率高,用到了B表上cc列的索引;select * from B where exists(select cc from A
where cc=B.cc)效率低,用到了A表上cc列的索引。
not in 和not exists如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts
的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。
in 与 =的区别
select name from student where name in
('zhang','wang','li','zhao');
与
select name from student where name='zhang' or name='li' or
name='wang' or name='zhao'
的结果是相同的。
4.Casewhenthen与DECODE用法
decode语法:
decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值)
该函数的含义如下:
IF 条件=值1 THEN
RETURN(翻译值1)
ELSIF 条件=值2 THEN
RETURN(翻译值2)
ELSIF 条件=值n THEN
RETURN(翻译值n)
ELSE
RETURN(缺省值)
END IF
decode(字段或字段的运算,值1,值2,值3)
使用方法:
1.比较大小
select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值
sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1
例如:
变量1=10,变量2=20
则sign(变量1-变量2)返回-1,decode解码结果为“变量1”,达到了取较小值的目的。
2.统计合格率
select sum(DECODE(C810000125,'是',1,0))/COUNT(1) 合格率 FROM t581
这句的含义是如果C810000125字段的值为“是”则标记其为1,为其他则标记其为0,最后统计总的该字段为“是”的个数,再除以总条数则是合格率的值。
还可以这样写:
select sum(case when C810000125 = '是' then 1 else 0 end)/COUNT(1)
合格率 FROM t581
5.Case..when用法
WHEN
WHEN
WHEN
ELSE
END
FROM table1
注意点:
1、以CASE开头,以END结尾
2、分支中WHEN 后跟条件,THEN为显示结果
3、ELSE 为除此之外的默认情况,类似于高级语言程序中switch case的default,可以不加
4、END 后跟别名
2.Sql函数
2.1字符串函数
2.1.1 LOWER()和UPPER()
LOWER()将字符串全部转为小写;UPPER()将字符串全部转为大写。
2.1.2数据类型转换为字符串类型STR()
把数值型数据转换为字符型数据。
STR (
length 指定返回的字符串的长度,decimal 指定返回的小数位数。如果没有指定长度,缺省的
length 值为10, decimal 缺省值为0。
当length 或者decimal 为负值时,返回NULL;
当length 小于小数点左边(包括符号位)的位数时,返回length 个*;
先服从length ,再取decimal ;
当返回的字符串位数小于length ,左边补足空格。
2.1.3去空格函数LTRIM()与RTRIM()
1、LTRIM() 把字符串头部的空格去掉。
2、RTRIM() 把字符串尾部的空格去掉。
2.1.4取子串函数
1、left()
LEFT (
返回character_expression 左起 integer_expression 个字符。
2、RIGHT()
RIGHT (
返回character_expression 右起 integer_expression 个字符。
3、SUBSTRING()
SUBSTRING (
返回从字符串左边第starting_ position 个字符起length个字符的部分。
2.1.5字符串比较函数
1、CHARINDEX()
返回字符串中某个指定的子串出现的开始位置。
CHARINDEX (<’substring_expression’>,
其中substring _expression 是所要查找的字符表达式,expression
可为字符串也可为列名表达式。如
果没有发现子串,则返回0 值。
此函数不能用于TEXT 和IMAGE 数据类型。
2、PATINDEX()
返回字符串中某个指定的子串出现的开始位置。
PATINDEX (<’%substring
_expression%’>,
“%”否则返回值为0。
与CHARINDEX 函数不同的是,PATINDEX函数的子串中可以使用通配符,且此函数可用于
CHAR、 VARCHAR 和TEXT 数据类型。
2.2日期函数
2.2.1. 日期和字符转换函数用法(to_date,to_char)
select to_char(sysdate,'yyyy-mm-dd hh24miss') as nowTime from
dual;
select to_char(sysdate,'yyyy') as
nowYear
select
to_char(sysdate,'mm')
select
to_char(sysdate,'dd')
select to_char(sysdate,'hh24') as
nowHour
select
to_char(sysdate,'mi')
select
to_char(sysdate,'ss')
2.2.2.求某天是星期几
2.2.3.
两个日期间的天数
2.2.4.
时间为null的用法
2.2.5.月份差
2.2.6.
日期格式冲突问题