函数的行为
选项值 USERENV(option)的行为
''OSDBA'' 如果当前会话将OSDBA角色的设置打开了,则返回''TRUE'',否则返回''FALSE'',注意返 回值是VARCHAR2类型,而不是BOOLEAN类型。
''LABEL'' 仅对TRUSTED ORACLE 中有效,返回当前会话标志。
''LANGUAGE'' 返回当前会话所使用的语言和地域,以及数据库字符集,这是NLS参数,返回形式是
LANGUAGE_TERRITORY.CHARACTERSET.
''TERMINAL'' 返回当前会话所使用终端的操作系统标识符。对于分布式的SQL语句,返回的是本地 会话的标识符。
''SESSIONID'' 如果初始化参数AUDIT_TRAIL被设置为TRUE,那么将返回审计会话标识符。在分布 式SQL语句中,USERENV(''SESSIONID'')是无效的。
''ENTRYID'' 如果初始化参数AUDIT_TRAIL被设置为TRUE,那么将返回可用的审计项标识符。在 分布式SQL语句中USERENV(''ENTRYID'')是无效的。
''LANG'' 返回语言名称的ISO缩写符号。它的格式比USERENV(''LANGUAGE'')要短。
例:
select USERENV(''TERMINAL''),USERENV(''LANGUAGE'') from dual;
USERENV(''TERMINA USERENV(''LANGUAGE'')
---------------- ----------------------------------------------------
WNJ SIMPLIFIED CHINESE_CHINA.ZHS16GBK
条件表达式:
CASE表达式(简单CASE)
语法:
CASE 表达式 WHEN 条件1 THEN 返回值1
WHEN 条件2 THEN 返回值2
.
.
.
WHEN 条件n THEN 返回值n
ELSE 返回值
END
DECODE函数
语法:
DECODE(
条件,比较值1,返回值1
比较值2,返回值2
.
.
.
比较值n,返回值n
返回值(不满足条件时)
)
select last_name,salary,
decode( trunc(salary/2000,0),//条件
0, 0.00,//比较值1,返回值1
1, 0.09,
2, 0.20,
3, 0.30,
4, 0.40,
5, 0.42,
6, 0.44,
0.45
) TAX_RATE
from employees
where department_id=80;
从多表中显示数据:
SQL(老版本的)
等值查询
SELECT TABLE1.COLUMN,TABLE2.COLUMN FROM TABLE1,TABLE2 WHERE TABLE1.COLUMN1=TABLE2.COLUMN2;//自然连接
使用AND操作符增加查询条件
使用表的别名来简化查询。
提高查询功能。
SELECT E.ID,D.ID FROM EMPL E,DEP D WHERE E.NAME=D.NAME;
~~ ~
表别名
多表等值连接查询
为了连接N个表,至少需要N-1个连接条件。
非等值查询
使用 BETWEEN AND 查询近似值作为连接条件的多表结果。
WHERE E.SALARY BETWEEN J.LOW AND J.HIGH
外连接查询
SELECT T1.COL,T2.COL FROM WHERE T1.COL(+)=T2.COL;左外连接
所有T2的T1信息。
SELECT T1.COL,T2.COL FROM WHERE T1.COL=T2.COL(+);右外连接
所有T1的T2信息。
为了看到与连接条件不匹配的数据,就必须得用外连接。
自连接
通过表的别名来创建虚拟逻辑表,进行自连接查询。
select worker.last_name || ''work for'' || manager.last_name
from employees worker,employees manager
where worker.manager_id=manager.employee_id;
9I适应性连接:
select t1.col,t2.col
from table
cross join t2 //交叉连接
natural join t2//自然连接:把两表中所有等值的字段都作为连接条件(但这些连接条件不用写)。
从两个表中选出连接列的值相等的所有行。
如果两个列的名称相同,但数据类型不同;或是类型相同,意义不同都会出错。
join t2 using (column_name);基于自然连接,只有在USING中出现的,才作为连接条件(在USING中列名前一定不能加前缀)。
join t2 on (t1.col=t2.col);基于ON的自然连接。等值、非等值或自连接都可以实现。
left|right|full outer join t2 on(t1.col=t2.col);
select e.last_name,d.department_name,l.city
from employees e
left outer join departments d on e.department_id=d.department_id
right outer join locations l on d.location_id=l.location_id;
*&* 可以连续做左连接或右连接的操作。
full outer join 忽略连接条件,把要查询的列的所有行全显示出来。
笛卡尔乘积(多表查询容易产生的错误)形成原因:
*、忽略连接条件;
*、连接条件不正确;
*、笛卡尔乘积是由第一个表的所有行和第二个表的所有行联合形成的;
*、为了避免笛卡尔乘积的产生,一定要在WHERE条件中正确写出连接条件。
set linesize 160;设置显示行的行数。
用字函数产生的总计
对多行的计算产生单行的结果。
组函数用语对每个组的行集进行运算,每个组产生一个结果。
AVG([DISTINCT/ALL]col)只能用与数字。只能对多行的数据进行运算,不能在这个函数中做单行的数学运算。
CORR(x1,x2)
返回表达式X1和X2组成的集合的相关系数。在保证所有行中的X1和X2都不为NULL之后结果通过
COVAR_POP(x1,x2)/(STDDEV_POP(x1)*STDDEV_POP(x2))得到。
COUNT([DISTINCT/ALL]col)所有非空字段的行数。
COVAR_POP(x1,x2)返回表达式x1和x2组成的集合的人口协方差结果通过(SUM(x1*x2)-SUM(x2)*SUM(x1)/n)/n得到,n是没有 NULL项的集合的数目。
COVAR_SAMP(x1,x2)返回表达式X1和X2组成的集合的相同协方差。
CUME_DIST 返回一组值中一个值的累积分布。
DENSE_RANK返回有序分组的行中一行的秩,秩是从1开始的连续的整数。
GROUP_ID()返回一个唯一数字值用于在GROUP BY 字句中辨别组。
GROUPING_ID返回一个数字对应于一行的GROUPING位矢量。
MAX([DISTINCT/ALL]col)可以用于任何类型,当用于日期类型时代表最晚。忽略空值。字符类型时候,比较字符串首字母的 ASCLL值。
MIN([DISTINCT/ALL]col)可以用于任何类型,当用于日期类型时代表最早。忽略空值。字符类型时候,比较字符串首字母的 ASCLL值。
PERCENTILE_CONT这个函数是一个反分布函数,它假设了一个连续分布模式。
PERCENTILE_DISC一个反分布函数,它假设了一个离散分布模式。
RANK 返回给定行的秩。秩不必是连续的,因为相同的行有相同的秩。
REGR这些函数(REGR_SLOPE,REGR_INTERCEPT,REGR_COUNT,REGR_R2,REGR_AVGX,
REGR_AVGY,REGR_SXX
REGR_SYY,REGR_SXY)得到了双集合的普通最小衰减线。
SUM([DISTINCT/ALL]col)返回选择列表项目的总和,只能用于数字。
STDDEV([DISTINCT/ALL]col) 标准方差
STDDEV_POP(col)计算人口标准差并返回人口方差的平方根。
STDDEV_SAMP(col)计算累计标准差并返回例子方差的平方根。
VAR_POP(x)返回提系列数字在去除了NULL值之后的人口不同。由(SUM(x*x)-SUM(x)*SUM(X)/COUNT(x))/COUNT(x)得到。
VAR_SAMP(x)返回一系列数字在去NULL值之后的范例不同。由(SUM(x*x)-SUM(x)*SUM(X)/COUNT(x))/(COUNT(x)-1)得到。
VARIANCE([DISTINCT/ALL]col)偏移方差,返回COL的方差。
语法:
select col,group function(col) from table where 条件 group by col;
GROUP BY
必须:出现在查询列表中的一个字段,但没有出现在函数中,那么这个字段必须要出现在GROUP BY 中。
可以:出现在GROUP BY 子句中的字段可以不出现在查询列表中。
先排列,再运算。
WHERE 子句中不能使用 group function。
限制组必须使用 HAVING 子句。
语法:
select col,group function from table
where 条件//可以没有条件限制
group by col
having group_condition //组过滤,在过滤以后,再进行分组计算。
order by col;
组函数嵌套最多只能有两层。
select max(avg(salary))
from employees
group by employee_id;
select * from tab;查询一个用户中的所有表。