Oracle通用函数,分组函数,子查询

Oracle通用函数,分组函数,子查询,第1张

 注意 )Oracle中的字符串是严格区分大小写的 日期和字符只能在单引号中出现

  )把列与列 列与字符连接在一起用 || 符号

  )列的别名 紧跟列名 也可以在列名和别名之间加入关键字 AS 以便在别名中包含空格或特殊的字符并区分大小写 使用双引号

 例子

 SELECT    last_name  ||  is a   ||  job_id   AS  Employee Details

 FROM    employees

 where    first_name  like  %s_ ;

 通用函数

 空值是无效的 未指定的 未知的或不可预知的值 空值不是空格或者 包含空值的数学表达式的值都为空值

 这些函数适用于任何数据类型 同时也适用于空值

 NVL (expr expr )

 NVL (expr expr expr )

 NULLIF (expr expr )

 COALESCE (expr expr exprn)

 ( )NVL (expr expr ) >expr 为NULL 返回expr 不为NULL 返回expr 注意两者的类型要一致

 ( )NVL (expr expr expr ) >expr 不为NULL 返回expr 为NULL 返回expr expr 和expr 类型不同的话 expr 会转换为expr 的类型

 ( )NULLIF (expr expr ) >相等返回NULL 不等返回expr

 ( )COALESCE(expr expr exprn) >列表中第一个非空的表达式是函数的返回值 如果所有的表达式都是空值 最终将返回一个空值

 条件表达式在SQL语句中使用IF THEN ELSE 逻辑 可以使用两种方法:–CASE表达式    CASE  expr  WHEN  parison_expr   THEN  return_expr                     [WHEN  parison_expr   THEN  return_expr                      WHEN  parison_exprn  THEN  return_exprn                     ELSE  else_expr]    END

 –DECODE函数    DECODE ( col | expression   search   result                 [ search result ]                [ default] )

 分组函数

 分组函数作用于一组数据 并对一组数据返回一个值

 组函数语法

 SELECT [column ] group_function(column)

 FROM table

 [WHERE condition]

 [GROUP BY column]

 [ORDER BY column];

 注意 在SELECT列表中所有未包含在组函数中的列都应该包含在GROUP BY子句

 (所用包含于SELECT列表中 而未包含于组函数中的列都必须包含于GROUPBY子句中)

 但包含在GROUP BY 子句中的列不必包含在SELECT列表中

 且可以在在GROUP BY子句中包含多个列

 不能在WHERE子句中使用组函数 但可以在HAVING子句中使用组函数

 使用HAVING过滤分组

  行已经被分组

  使用了组函数

  满足HAVING子句中条件的分组将被显示

 SELECT column group_function

 FROM table

 [WHERE condition]

 [GROUP BY group_by_expression]

 [HAVING group_condition]

 [ORDER BY column];

 子查询

 语法

 SELECT select_list

 FROM table

 WHERE expr operator

 (SELECT select_list

 FROM table);

 注意 子查询(内查询) 在主查询之前一次执行完成

 子查询的结果被主查询使用(外查询)

 子查询要包含在括号内

 将子查询放在比较条件的右侧

 除非进行Top N 分析 否则不要在子查询中使用ORDER BY子句

 单行 *** 作符对应单行子查询 多行 *** 作符对应多行子查询

 单行 *** 作符operator                                                     多行 *** 作符operator

 =    等于                                                                            IN     等于列表中的任何一个

 >    大于                                                                            ANY  和子查询返回的任意一个值比较

 >=  大于等于                                                                    ALL   和子查询返回的所有值比较

 <    小于                                                                            EXISTS  功能等价于IN

 <=  小于等于

 <>  不等于

 DECODE和CASE SELECT中除GROUP BY 子句以外的所有子句中 都可以使用单行子查询

 在子查询中使用HAVING子句

 SELECT select_list

 FROM table

 [GROUP BY group_by_expression]

 [HAVING group_condition] expr operator

 (SELECT select_list

 FROM table);

 在FROM子句中使用子查询 例子

 SELECT a last_name a salary a department_id b salavg

 FROM employees a (SELECT department_id AVG(salary) salavg

 FROM employees

 GROUP BY department_id) b

 WHERE a department_id = b department_id

 AND   a salary > b salavg;

 有两个简单例子 以说明 exists 和 in 的效率问题

  ) select from T where exists(select from T where T a=T a) ;

 T 数据量小而T 数据量非常大时 T <<T 时 ) 的查询效率高

  ) select from T where T a in (select T a from T ) ;

 T 数据量非常大而T 数据量小时 T >>T 时 ) 的查询效率高

 exists 用法

 请注意 )句中的有颜色字体的部分 理解其含义

 其中 select from T where T a=T a 相当于一个关联表查询 相当于

  select from T T      where T a=T a

 但是 如果你当当执行 ) 句括号里的语句 是会报语法错误的 这也是使用exists需要注意的地方

  exists(xxx) 就表示括号里的语句能不能查出记录 它要查的记录是否存在

 因此 select 这里的 其实是无关紧要的 换成 也没问题 它只在乎括号里的数据能不能查找出来 是否存在这样的记录 如果存在 这 ) 句的where 条件成立

 in 的用法

 继续引用上面的例子

  ) select from T where T a in (select T a from T )

 这里的 in 后面括号里的语句搜索出来的字段的内容一定要相对应 一般来说 T 和T 这两个表的a字段表达的意义应该是一样的 否则这样查没什么意义

 打个比方 T T 表都有一个字段 表示工单号 但是T 表示工单号的字段名叫 ticketid T 则为 id 但是其表达的意义是一样的 而且数据格式也是一样的 这时 用 )的写法就可以这样

  select from T where T ticketid in (select T id from T )

 EXISTS *** 作符

 EXISTS *** 作符检查在子查询中是否存在满足条件的行

  如果在子查询中存在满足条件的行

 – 不在子查询中继续查找

 – 条件返回TRUE

  如果在子查询中不存在满足条件的行

 – 条件返回FALSE

 – 继续在子查询中查找

 相关子查询

 相关子查询按照一行接一行的顺序执行 主查询的每一行都执行一次子查询 子查询使用了主查询中的列

 SELECT  column column

 FROM  table outer

 WHERE columnk operator (SELECT  colum colum

 FROM  table

 WHERE expr= outer expr);

 相关更新

 使用相关子查询依据一个表中的数据更新另一个表的数据

 UPDATE  table alias

 SET  column = (SELECT  expression

 FROM  table   alias

 WHERE  lumn = lumn);

 相关删除

 使用相关子查询依据一个表中的数据删除另一个表的数据

 DELETE FROM  table alias

 WHERE  column operator (SELECT  expression

 FROM  table alias

 WHERE lumn = lumn);

 WITH子句

  使用WITH子句 可以避免在SELECT语句中重复书写相同的语句块

  WITH子句将该子句中的语句块执行一次 并存储到用户的临时表空间中

  使用WITH子句可以提高查询效率

 我们可以使用WITH  Clause来定义一个query   block 然后在SELECT   statement的其它地方使用这个query   block 如果在一个很复杂的 Query 里 我们必须重复地使用某个 subquery 那么使用WITH   Clause可以降低Query的复杂度以及提高 performance 因为WITH   Clause 所读出的资料会暂存在User的temporary   tablespace中

 WITH子句应用举例

 WITH

 dept_costs AS (SELECT  d department_name SUM(e salary) AS dept_total

 FROM  employees e departments d

 WHERE  e department_id = d department_id

 GROUP BY  d department_name)

 avg_cost  AS (SELECT  SUM(dept_total)/COUNT() AS dept_avg

 FROM  dept_costs)

 SELECT 

 FROM  dept_costs

 WHERE  dept_total > (SELECT  dept_avg

 FROM  avg_cost)

 ORDER BY  department_name;

 GROUP BY 扩展

 带有ROLLUP和CUBE *** 作的GROUP BY子句

  使用带有ROLLUP和CUBE *** 作的GROUP BY子句产生多种分组结果

  ROLLUP产生n + 种分组结果 其是对GROUP BY子句的扩展

  CUBE产生 的n次方种分组结果 其是对GROUP BY子句的扩展

 注 其中的n指的是group_by_expression的数目

 ROLLUP *** 作符 ROLLUP产生n + 种分组结果 顺序是从右向左

 SELECT  [column ] group_function(column)

 FROM  table

 [WHERE condition]

 [GROUP BY [ROLLUP] group_by_expression]

 [HAVING having_expression]

 [ORDER BY column];

 CUBE *** 作符 CUBE会产生类似于笛卡尔集的分组结果

 SELECT  [column ] group_function(column)

 FROM  table

 [WHERE condition]

 [GROUP BY [CUBE] group_by_expression]

 [HAVING having_expression]

 [ORDER BY column];

 GROUPING函数 能够实现更加直观的分组结果显示提示

 SELECT  [column ] group_function(column) [GROUPING(group_by_expression)]

 FROM  table

 [WHERE condition]

 [GROUP BY  [ROLLUP] [CUBE] group_by_expression]

 [HAVING having_expression]

 [ORDER BY column];

  GROUPING函数可以和CUBE或ROLLUP结合使用

  使用GROUPING函数 可以找到哪些列在该行中参加了分组

  使用GROUPING函数 可以区分空值产生的原因

  GROUPING函数返回 或

 GROUPING SETS

  GROUPING SETS是对GROUP BY子句的进一步扩充

  使用GROUPING SETS可以实现在同一个查询中定义多个分组集

  Oracle 对GROUPING SETS子句指定的分组集进行分组后用UNION ALL *** 作将各分组结果结合起来

  Grouping set 的优点

 – 只进行一次分组即可

 – 不必书写复杂的UNION语句

 – GROUPING SETS中包含的分组项越多性能越好

 以下例子实现了对department_id job_id分组 对job_id manager_id分组 最终形成两个分组

 SELECT  department_id job_id manager_id avg(salary)

 FROM  employees

 GROUP BY GROUPING SETS ((department_id job_id) (job_id manager_id));

 复合列

  复合列是被作为整体处理的一组列的集合

  使用括号将若干列组成复合列在ROLLUP或CUBE中作为整体进行 *** 作

  在ROLLUP或CUBE中 复合列可以避免产生不必要的分组结果

 例如 GROUP BY ROLLUP( department_id (job_id manager_id)); //小括号实现复合列

 连接分组集

  连接分组集可以产生有用的对分组项的结合

  将各分组集 ROLLUP 和CUBE用逗号连接 Oracle自动在GROUP BY子句中将各分组集进行连接

  连接的结果是对各分组生成笛卡尔集

 例如 GROUP BY GROUPING SETS(a b) GROUPING SETS(c d);

lishixinzhi/Article/program/Oracle/201311/18505

1、系统信息函数

系统信息函数用来查询MySQL数据库的系统信息。

函数代码:

SELECT VERSION()

->5067-community-nt

CONNECTION_ID() 返回服务器的连接数

DATABASE()、SCHEMA 返回当前数据库名

USER()、SYSTEM_USER()返回当前用户

2、日期时间函数

MySQL的日期和时间函数主要用于处理日期时间。

函数代码:

CURDATE(),CURRENT_DATE() curdate() 返回当前日期

SELECT CURDATE()

->2014-12-17

CURTIME(),CURRENT_TIME curtime()

返回当前时间

SELECT CURTIME()

->15:59:02

3、字符串函数

函数代码:

CHAR_LENGTH(s) char_length()返回字符串s的字符数

SELECT CHAR_LENGTH('你好123') -- 5

CONCAT(s1,s2,) concat(s1,s2)

将字符串s1,s2等多个字符串合并为一个字符串

4、加密函数

加密函数是MySQL用来对数据进行加密的函数。

函数代码:

PASSWORD(str)

该函数可以对字符串str进行加密,一般情况下,PASSWORD(str)用于给用户的密码加密。

SELECT PASSWORD('123')

->23AE809DDACAF96AF0FD78ED04B6A265E05AA257

5、数学函数

数学函数主要用于处理数字,包括整型、浮点数等。

函数代码:

ABS(x) abs(x)返回x的绝对值  

SELECT ABS(-1) -- 返回1

CEIL(x),CEILING(x) cell(x),celling(x)

返回大于或等于x的最小整数  

SELECT CEIL(15) -- 返回2

你好。这个应该是语句问题。<dlclass='code'<dtSQLcode</dt<dd<pre

<div

CodehighlightingproducedbyActiproCodeHighlighter(freeware)

http://wwwCodeHighlightercom/

<spanstyle="color:#000000;"

</span<spanstyle="color:#0000FF;"select</span<spanstyle="color:#000000;"aServiceType,</span<spanstyle="color:#FF00FF;"sum</span<spanstyle="color:#000000;"(arecordcount)合计

</span<spanstyle="color:#0000FF;"from</span<spanstyle="color:#000000;"mt_as_msg_alla

</span<spanstyle="color:#0000FF;"where</span<spanstyle="color:#000000;"aCOMMITTI</span<spanstyle="color:#808080;"between</span<spanstyle="color:#000000;"to_date(</span<spanstyle="color:#FF0000;"'</span<spanstyle="color:#FF0000;"2007-05-280:00:00</span<spanstyle="color:#FF0000;"'</span<spanstyle="color:#000000;",

</span<spanstyle="color:#FF0000;"'</span<spanstyle="color:#FF0000;"YYYY-MM-DDHH24:MIS</span<spanstyle="color:#FF0000;"'</span<spanstyle="color:#000000;")</span<spanstyle="color:#808080;"and</span<spanstyle="color:#000000;"to_date(</span<spanstyle="color:#FF0000;"'</span<spanstyle="color:#FF0000;"2007-06-1823:59:59</span<spanstyle="color:#FF0000;"'</span<spanstyle="color:#000000;",</span<spanstyle="color:#FF0000;"'</span<spanstyle="color:#FF0000;"YYYY-MM-DDHH24:MIS</span<spanstyle="color:#FF0000;"'</span<spanstyle="color:#000000;")

</span<spanstyle="color:#0000FF;"GROUP</span<spanstyle="color:#000000;"</span<spanstyle="color:#0000FF;"BY</span<spanstyle="color:#000000;"aCOMMITTI

</span</div

</pre</dd</dl你想一次性的把ServiceType不同的数据统计出来放到一条记录里面,是比较麻烦的。

组(多行)函数

与单行函数相比,oracle提供了丰富的基于组的,多行的函数。这些函数可以在select或select的having子句中使用,当用于select子串时常常都和GROUP BY一起使用。

AVG([{DISYINCT|ALL}])

返回数值的平均值。缺省设置为ALL

SELECT AVG(sal),AVG(ALL sal),AVG(DISTINCT sal) FROM scottempAVG(SAL) AVG(ALL SAL) AVG(DISTINCT SAL)187794118 187794118 1916071413

COUNT({|DISTINCT|ALL} )

返回查询中行的数目,缺省设置是ALL,表示返回所有的行。

MAX([{DISTINCT|ALL}])

返回选择列表项目的最大值,如果x是字符串数据类型,他返回一个VARCHAR2数据类型,如果X是一个DATA数据类型,返回一个日期,如果X是numeric数据类型,返回一个数字。注意distinct和all不起作用,应为最大值与这两种设置是相同的。

MIN([{DISTINCT|ALL}])

返回选择列表项目的最小值。

STDDEV([{DISTINCT|ALL}])

返回选者的列表项目的标准差,所谓标准差是方差的平方根。

SUM([{DISTINCT|ALL}])

返回选择列表项目的数值的总和。

VARIANCE([{DISTINCT|ALL}])

返回选择列表项目的统计方差。

用GROUP BY给数据分组

正如题目暗示的那样组函数就是 *** 作那些已经分好组的数据,我们告诉数据库用GROUP BY怎样给数据分组或者分类,当我们在SELECT语句的SELECT子句中使用组函数时,我们必须把为分组或非常数列放置在GROUP BY子句中,如果没有用group by进行专门处理,那么缺省的分类是将整个结果设为一类。

select stat,counter() zip_count from zip_codes GROUP BY state;ST ZIP_COUNT-- ---------AK 360AL 1212AR 1309AZ 768CA 3982

在这个例子中,我们用state字段分类;如果我们要将结果按照zip_codes排序,可以用ORDER BY语句,ORDER BY子句可以使用列或组函数。

select stat,counter() zip_count from zip_codes GROUP BY state ORDER BY COUNT() DESC;ST COUNT()-- --------NY 4312PA 4297TX 4123CA 3982

用HAVING子句限制分组数据

现在你已经知道了在查询的SELECT语句和ORDER BY子句中使用主函数,组函数只能用于两个子串中,组函数不能用于WHERE子串中,例如下面的查询是错误的:

错误SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' AND SUM(sale_amount)>10000 GROUP BY sales_clerk

这个语句中数据库不知道SUM()是什么,当我们需要指示数据库对行分组,然后限制分组后的行的输出时,正确的方法是使用HAVING语句:

SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' GROUP BY sales_clerkHAVING SUM(sale_amount)>10000;

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/11677118.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存