Oracle lesson 2 SQL 查询和 SQL 函数(中)

来源:互联网 发布:淘宝二手网叫什么 编辑:程序博客网 时间:2024/04/30 22:02

Oracle lesson 2

SQL 查询和 SQL 函数(中)

 

操作符和函数部分

 

操作符

Oracle 支持的 SQL 操作符分类如下:

算术操作符

算术操作符用于执行数值计算

可以在SQL语句中使用算术表达式,算术表达式由数值数据类型的列名、数值常量和连接它们的算术操作符组成

算术操作符包括加(+)、减(-)、乘(*)、除(/)

例:

SQL> SELECT itemdesc, max_level - qty_hand avble_limit

     FROM itemfile WHERE p_category='spares';

SQL > SELECT itemdesc, itemrate*(max_level - qty_hand)

      FROM itemfile

      WHERE p_category='spares';

 

 

比较操作符

比较操作符用于比较两个表达式的值

比较操作符包括 =!=<><=>=BETWEEN…ANDINLIKE IS NULL

例:

SQL> SELECT itemdesc, re_level

     FROM  itemfile

     WHERE qty_hand < max_level/2;

SQL> SELECT orderno FROM order_master

     WHERE del_date IN (‘06-1-05’,‘05-2-05');

SQL> SELECT vencode,venname,tel_no

     FROM vendor_master

     WHERE venname LIKE 'j___s';

 

 

逻辑操作符

逻辑操作符用于组合多个计较运算的结果以生成一个或真或假的结果。

逻辑操作符包括与(AND)、或(OR)和非(NOT)

例:

SQL> SELECT * FROM order_master

     WHERE odate > ‘10-5-05'

     AND del_date < ‘26-5-05’

 

 

显示:2005-5-10 2005-5-26的订单信息

 

集合操作符

集合操作符将两个查询的结果组合成一个结果

如图集合操作符主要包括:

SQL> SELECT orderno FROM order_master

     MINUS

     SELECT orderno FROM order_detail;

MINUS 操作符返回从第一个查询结果中排除第二个查

询中出现的行。

 

链接操作符

连接操作符用于将多个字符串或数据值合并成一个字符串

例:通过使用连接操作符可以将表中

SQL> SELECT (venname|| ' 的地址是 '

     ||venadd1||' '||venadd2 ||' '||venadd3) address

     FROM vendor_master WHERE vencode='V001';

 

的多个列合并成逻辑上的一行列

操作符的优先级

SQL 操作符的优先级从高到低的顺序是:

算术操作符           --------最高优先级

连接操作符

比较操作符

NOT 逻辑操作符

AND 逻辑操作符

OR   逻辑操作符   --------最低优先级

 

 

 

函数

Oracle 提供一系列用于执行特定操作的函数

SQL 函数带有一个或多个参数并返回一个值

以下是SQL函数的分类:

单行函数分类

单行函数分为日期函数,字符函数,数字函数,转换函数和其他函数。

日期函数

日期函数对日期值进行运算,并生成日期数据类型或数值类型的结果

日期函数包括

ADD_MONTHS

MONTHS_BETWEEN

LAST_DAY

ROUND

NEXT_DAY

TRUNC

EXTRACT

日期函数举例源代码:

SQL> ----日期函数

SQL> select sysdate from dual;

 

SYSDATE                                                                        

--------------                                                                 

21-2 -08                                                                     

 

SQL> select current_date from dual;

 

CURRENT_DATE                                                                   

--------------                                                                  

21-2 -08                                                                     

 

SQL> select systimestamp from dual;

 

SYSTIMESTAMP                                                                   

---------------------------------------------------------------------------    

21-2 -08 02.48.43.734000 下午 +08:00                                         

 

SQL> ----两个日期的差

SQL> select (sysdate-to_date('2005-2-21','yyyy-mm-dd'))cha from dual;

 

       CHA                                                                      

----------                                                                     

1095.61819                                                                     

 

SQL> ----增加月份

SQL> select add_months(sysdate,5) s from dual;

 

S                                                                              

--------------                                                                 

21-7 -08                                                                     

 

SQL> ---较少月份

SQL> select add_months(sysdate,-1)s from dual;

 

S                                                                              

--------------                                                                 

21-1 -08                                                                      

 

SQL> select add_months(sysdate,-12)s from dual;

 

S                                                                              

--------------                                                                 

21-2 -07                                                                     

 

SQL> ---least,greatest

SQL> ---least 选择日期列表里最前面的日期

SQL> select least('1-5-2007','1-8-2007') l from dual;

 

L                                                                               

----------                                                                     

1-5-2007                                                                     

 

SQL> select least(2-5-2007','1-8-2007') l from dual;

ERROR:

ORA-01756: 引号内的字符串没有正确结束

 

 

SQL> select least('2-5-2007','1-8-2007') l from dual;

 

L                                                                              

----------                                                                     

1-8-2007                                                                      

 

SQL> select least(to_date('2007-5-2','yyyy-mm-dd'),to_date('2007-8-1','yyyy-mm-dd'))l from dual;

 

L                                                                              

--------------                                                                  

02-5 -07                                                                     

 

SQL> -----last_day

SQL> select last_day(sysdate) l from dual;

 

L                                                                              

--------------                                                                  

29-2 -08                                                                     

 

SQL> -----next_day

SQL> select next_day(sysdate,'星期四')l from dual;

 

L                                                                               

--------------                                                                 

28-2 -08                                                                     

 

SQL> ----months_between

SQL> select months_between(sysdate,to_date('2008-8-8','yyyy-mm-dd'))l from dual;

 

         L                                                                     

----------                                                                     

-5.5602681                                                                      

 

SQL> ----round

SQL> ----to_date,to_char

SQL> select to_char(sysdate,'yyyy-mm-dd hh:mm:ss') ch from dual;

 

CH                                                                             

-------------------                                                            

2008-02-21 03:02:23                                                            

 

SQL> ---extract

SQL> select extract(month from sysdate)m from dual;

 

         M                                                                      

----------                                                                     

         2                                                                     

 

SQL> select extract(year from sysdate)m from dual;

 

         M                                                                     

----------                                                                     

      2008                                                                      

 

SQL> select extract(day from sysdate)m from dual;

 

         M                                                                     

----------                                                                     

        21         

 

字符函数 1

字符函数接受字符输入并返回字符或数值!

如下所示:(部分)

示例代码:

SQL> -----字符函数

SQL> ----连接符||

SQL> select 'hello'||'world' str from dual;

 

STR                                                                            

----------                                                                     

helloworld                                                                     

 

SQL> ----rpadlpad   左右填充

SQL> select rpad('Hello',15',*') r from dual;

select rpad('Hello',15',*') r from dual

                      *

 

 

SQL> select rpad('Hello',15,'*') r from dual;

 

R                                                                              

---------------                                                                

Hello**********                                                                

 

SQL> select lpad('Hello',15,'*') r from dual;

 

R                                                                              

---------------                                                                 

**********Hello                                                                

 

SQL> ----ltrim,rtrim,trim   去除空格

SQL> select ltrim('   zhang    ') name from dual;

 

NAME                                                                            

-----------                                                                    

shangyt                                                                        

 

SQL> select rtrim(' zh a ng   ') name from dual;

 

NAME                                                                            

--------                                                                       

 zh a ng                                                                       

 

SQL> select trim('   z  h ang   ') name from dual;

 

NAME                                                                           

--------                                                                       

h ang                                                                       

 

SQL> -----lower,upper,initcap  大小写转化

SQL> select lower('ADSFADSF')   s from dual;

 

S                                                                              

--------                                                                       

adsfadsf                                                                        

 

SQL> select upper('zhangxu') s from dual;

 

S                                                                              

-------                                                                         

ZHANGXU                                                                       

 

SQL> select initcap('zhang') s from dual;

 

S                                                                              

-----                                                                           

Zhang                                                                          

 

SQL> -----length  长度

SQL> select length('zhang') length from dual;

 

    LENGTH                                                                      

----------                                                                     

         5                                                 

 

SQL> ---substr  链接

SQL> select substr('hello world',2,4) str from dual;

 

STR                                                                            

----                                                                           

ello                                                                           

 

SQL> ----instr

SQL> select instr('hello','o') instr from dual;

 

     INSTR                                                                     

----------                                                                     

         5 

 

字符函数 2

以下是一些其它的字符函数:

CHRASCII

LPADRPAD

TRIM

LENGTH

DECODE

例:

SQL> SELECT LENGTH('frances') FROM dual;

SQL> SELECT vencode,

     DECODE(venname,'frances','Francis') name

     FROM vendor_master WHERE vencode='v001';

 

数字函数

数字函数接受字符输入并返回字符或数值!

如图所示:(部分)

转换函数

转换函数将值从一种数据类型转换为另一种数据类型

常用的转换函数有:

TO_CHAR

TO_DATE

TO_NUMBER

示例:

SELECT TO_DATE(‘2005-12-06’ , ‘yyyy-mm-dd’)

FROM dual;

SELECT TO_CHAR(sysdate,'YYYY""fmMM""fmDD"" HH24:MI:SS')

FROM dual; 

SELECT TO_CHAR(sysdate,'YYYY""fmMM""fmDD"" HH24:MI:SS')

FROM dual; 

 

其它函数

 

以下是几个用来转换空值的函数:

NVL

NVL2

NULLIF

示例:

SELECT itemdesc, NVL(re_level,0) FROM itemfile;

SELECT itemdesc, NVL2(re_level,re_level,max_level)

FROM itemfile;

SELECT itemdesc, NULLIF(re_level,max_level)

FROM itemfile;

 

 

 

分组函数

分组函数基于一组行来返回结果

为每一组行返回一个值

如图:

示例:

SELECT COUNT(*) FROM itemfile;

SELECT AVG(re_level) FROM  itemfile

WHERE p_category='accessories';

SELECT COUNT(itemrate) FROM itemfile;

SELECT MAX(max_level) FROM  itemfile;

SELECT COUNT(DISTINCT qty_hand) FROM itemfile;

SELECT SUM(itemrate*max_level) FROM itemfile;

 

分析函数(1 

 

分析函数根据一组行来计算聚合值

用于计算完成聚集的累计排名、移动平均数等

分析函数为每组记录返回多个行

如图:

分析函数(2

以下三个分析函数用于计算一个行在一组有序行中的排位,序号从1开始

ROW_NUMBER 返回连续的排位,不论值是否相等

RANK 具有相等值的行排位相同,序数随后跳跃

DENSE_RANK 具有相等值的行排位相同,序号是连续的

示例:

SELECT d.dname, e.ename, e.sal, DENSE_RANK()

  OVER (PARTITION BY e.deptno ORDER BY e.sal DESC)

  AS DENRANK

FROM emp e, dept d WHERE e.deptno = d.deptno;

 

GROUP BYHAVING子句

GROUP BY子句

用于将信息划分为更小的组

每一组行返回针对该组的单个结果

HAVING子句

用于指定 GROUP BY 子句检索行的条件

示例:

SELECT p_category, MAX(itemrate) FROM itemfile GROUP BY p_category;

SELECT p_category, MAX(itemrate) FROM itemfile

GROUP BY p_category

HAVING p_category NOT IN ('accessories');

 

 
未完待续
 

 
 

 

        

                                                             

;