服务器 频道

PL/SQL学习笔记之六

  函数的行为

  选项值    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;查询一个用户中的所有表。
  

0
相关文章