第5章主要讲解SQL语言
SQL语言可以分为:
1,DDL-- 数据定义语言 :create,alter ,rename ,truncate,grant,revoke,audit,noaduit,comment语句。
2,DML-- 数据操纵语言:insert,update,delete,merge,explain paln,lock table的语句。
3,TC -- 事务控制语言: commit,rollback,savepoint ,set transaction语句。
在select 关键字后面指定 distinct 便可消除重复数据。
Where 字句中使用数字值时,可以用单引号,也可不用。但是使用字符值,日期的是后必须使用单引号。因为区分大小写,和日期格式。
字符串常量的两边只能用单引号。
默认的日期格式是DD-MON-YY,由参数NLS_DATE_FORMAT设置,可以用alter session 进行设置。
Like 通配符进行模糊查询:其中”%”表示0个或多个字符。”_”表示一个字符。
如果实际的值有% 和_ ,一般使用\作为转义字符。
可以在查询的列中使用(+ - * /)算术运算,|| 连接字符串,系统函数等。
在select 语句中同时有多个字句(where,group by,having by)时,order by 必须放在最后。
这个和union 后,order by 必须在整个结果集的最后类似。
使用了distinct 关键字后,用于排序的列必须是查询的列。不然会报错。
常用的分组函数
MIN,avg,sum,count,variance,stddev。
除了count(*) 之外,其他的分组函数,包括count(column_name)都会忽略null值。
例如count(text) 得出的数值是不包含空值的,要处理空值,必须先用nvl 函数进行转换后在用count函数统计。
查询的列 和表达式都必须出现在group by 中(除了组函数 不用,其他的都必须group by)
分组函数也能用distinct 消除重复 ,例如 AVG (distinct sal)
Rollup 用于生成横向的统计结果,cube 用于生成横,纵向结果。
Group by 语句可以单独使用,但having by 只能与 group by 一起使用。
Where 在进行组合处理之前过滤数据行,而having则 是在组合处理之后过滤数据组。
应该尽量避免出现笛卡尔积的情况,也就是 from中有n个表时,where 字句中至少要有n-1个连接条件。
集合运算:
Union all 返回两个结果集的所有行,即并。--除了这个,都会进行默认的升序排序(默认加order by 1)
Union 并,并且去掉重复行。
Minus 返回第一个结果集中有第二个结果集中没有的行 即差(去重)
Intersect 返回2结果集中都有的行--交
当在相同查询中出现多个集合运算时,他们会从上到下,左到右运算。不会受到括号而影响优先级。
列的个数和数据类型要匹配。最后结果集的列名采用第一个结果集中的列名。
Order by 只能有一个,而且只能出现在最后面,并且只能使用第一个select语句中查询的列的列名或别名(如果与第二个查询中的语句列重复。就只能使用别名)。
子查询最多嵌套255层。
子查询分相关子查询 和不相关子查询。
内外不相关的子查询:由里向外逐层处理。
相关的子查询:首先取外层查询中表的一个记录,根据与内层查询相关的列值进行内查询的处理。处理为真,则记录结果。重复这个过程,知道外层查询中表的记录全部处理完。
例如:
Select deptno,
(select max(sal) from emp b where b.deptno = a.deptno ) maxsal
From emp a
Order by deptno;
多行子查询 使用成对的比较 或者in 关键字来处理。
使用exists 运算符产生是否存在的逻辑值 true 或 false,使得子查询可以用一个列没有实际意义而被忽略==序列名“x”,“*”:
Select ename,deptno,sal,job from emp
Where exists
(select ‘x’ from dept
Where dept.deptno = emp.deptno and dept.loc = ‘new york’
);
在 create table 中使用子查询。可以创建新表并复制数据:
Create table dept 1(a,b,c)as select a,b,c dept,创建所有列 可以用* 简化
此种方法只能复制数据,不能传递依赖,约束,索引。
物化视图创建方法与这类似。
具体介绍了单行函数的用法:
单行数字函数
abs(x),返回x的绝对值:
round(x,[,y]):四舍五入计算。如果省略y,则四舍五入到整数位;y是负数,则 到小数点前y位;y是正数,则到小数点后y位
trunc(x,[y]) 执行截取数字。如果省略y是负数,则截取到小数点前Y位;如果y是正数,则截取到小数点后y位。
单行字符函数:
ASCII(<c1>):c1是字符串,返回c1第一个字母的ASCII码,逆函数式CHR(i)。其中i是数字chr(39),就是' 符号,在一些场合可以直接 使用chr(39) 连接使用。
CONCAT(1,2)将1连接到2后面。如果2个值都为空,就返回空值。其中任意一个是空,就返回另一个值。
nvl(x,value):如果x为空,则返回valuenvl2(x,value1,value2):如果x为空就返货v1,否则返回v2--这2个是常用的空值处理函数。用于处理某个字段为空的情况replace(c1,c2 [,c3]):把c1中出现的c2都替换成c3,然后返回剩余的字符串。c3默认是null,如果c2为null,则返回c1,如果c1为null,则返回null。
在oracle中,时间和日期是一起存储的,数据类型是date或者 timestamp(或timestamp with local time zone).timestamp 类型比date类型 好在可以存储带有小数位的秒,和时区。
常用的日期时间转换函数:
to_cahr(x [,fmt]) :将x 按fmt格式转换成字符串。x是日期或数字,fmt是一种格式字符串
to_date(c [,fmt]):
将符合fmt指定的特定日期格式的字符串c转换成date类型的数据
日期时间运算函数:
add_months(d,n) :返回日期时间d加n月后所对应的日期时间
n为负数就是之前的月,n为小数会自动忽略小数部分。
current_date:返回当前会话时区所对应的日期
current_timestamp([p]):
返回当前会话时区所对应的日期时间。p为精度,默认是6(可以是0-9)
localtimestamp([p]):和current_timestamp一样,但是再返回值得数据类型上有区别:
dbtimezone:返回数据库所在的时区
extract(c,from d):
返回日期时间d中指定的部分c。c的取值为year,month,day,min,second,timezone_hour,
timezone__minute,timezone_region,timezone_abbr.c必须在d中存在。
last_dya(d):返回日期d所在月份的最后一天
months_between(d1,d2):
返回日期d1和d2之间相差的月数。如果d1小于d2,返回负数。如果d1等于d2,或者都是月底,返回整数。否则以每月31天来计算小数部分。
next_day(d,c) :
返回日期d后的下一个c。c是一个字符串(星期名称)
--注意此处c可以是数字,1代表周日,7是周六(最后一天)。和linux 系统中0表示周日区分开。
其实都是表示第一天
round(d [,fmt]):
返回日期时间d的四舍五入结果。如果fmt是year,则以7月1日为分界。month 以16日为分界。day以中午12:00为分界。
sessiontimezone : 返回当前session时区偏(alter session的偏移量),有可能与dbtimezone相同
---并未用alter session修改时区。
sys_extract_utc(ts):
返回时间标记ts所对应的GMT时间。其中ts是一个timestamp with time zone类型的日期时间。
systimestamp 返回当前数据库的一个timestamp with time zone类型的日期时间
trunc(d [,fmt]):--截断的精度要注意
返回fmt指定精度截断后的日期d。如果fmt是year,则为本年的1月1日。如果fmt是month,则为本月的1日。如果fmt是day,则天的个位被置为0(只有个位时不变) 也就是说截断DD的话
TZ_OFFSET(tz):返回时区名tz指定的时区与UTC相比的时区偏差
单行转换函数:
任何number 或date的数据都可以转换为char,varchar2的数据
仅包含数字,小数点,左边负号的情况下,char,varchar2的数据可以转换为number
char,varchar2 的数据符合日期时间的默认格式时,可以转换为date数据。
bin_to_num(n1,n2,n3...):将每位由n1,n2,n3组成的二进制转换为十进制
cast(c as t):将表达式c转换成数据类型t。t可以是内建数据类型,也可以使是程序员自定义的数据类型。
numtodsinterval(n,c):把数字n换成c指定的interval day to second 类型的数据。c的取值为day,hour,minute,second。c的大小写无关。
to_dsinterval(c):将符合特定格式的字符串c换成interval day to second 类型的数据
numtoyminterval: 把数字n换成c指定的interval year to month 类型的数据。c的取值为day,hour,minute,second。c的大小写无关。
to_yminterval(c):将符合特定格式的字符串C 换成 interval year to month类型的数据。
to_number(c [,fmt]):
将符合fmt指定的数字格式的字符串c转换成数字类型。
select to_number('$1234.56','L9999D99'),
to_number('1234.56') + 56 from dual;
to_timestamp(c):将字符串c转为timestamp数据类型
to_timestamp_tz(c [,fmt]):将符合fmt指定的特定日期格式的字符串c转换为timestamp with time zone 类型。
select to_timestamp_tz('2003-04-05','YYYY-MM-DD'),
to_timestamp('2003-04-05','YYYY-MM-DD') from dual;
unistr(c): 返回字符串c对应的unicode字符
select unistr('\00D6'),unistr('ca\00D6on') from dual;
greatest(e1,e2,e3....):找出其中最大的数返回,比较是按e1的数据类型为准。
least(e1,e2,e3....):找出其中最小的数返回,比较是按e1的数据类型为准。
字符串是按每个字符的ASCII码大小排序比较的
select greatest(10,'101',9),least(10,'101',9) from dual;
oracle 其中函数还有很多很多,这里只是介绍了常用的一小部分,例如case语句,decode等。这些函数都需要在工作的使用环境中多多运用才能更加的熟悉。
