`

Oracle sql函数整理及sql执行顺序

阅读更多

1.sql关键字

查询中用到的关键词主要包含六个,并且他们的顺序依次为
select--from--where--group by--having--order by
其中select和from是必须的,其他关键词是可选的,这六个关键词的执行顺序
与sql语句的书写顺序并不是一样的,而是按照下面的顺序来执行
from--where--group by--having--select--order by,
from:需要从哪个数据表检索数据
where:过滤表中数据的条件
group by:如何将上面过滤出的数据分组
having:对上面已经分组的数据进行过滤的条件
select:查看结果集中的哪个列,或列的计算结果
order by :按照什么样的顺序来查看返回的数据
 
select关键字  www.2cto.com  
1、用*代替所有列
select * from emp;
2、指定需要返回的列
select ename,deptno ,job from emp;
3、为列取别名
select ename emloyee_name,job ,deptno from emp;
4、去除某列中的相同数据
select distinct deptno ,job from emp;
5、返回两个列进行运算后的数据
create table tab1(first_col number(3),second_col number(3));
insert into tab1 values(3,6);
insert into tab1 values(1,10);
select first_col,second_col,first_col+second_col from tab1;
返回结果如下
 FIRST_COL SECOND_COL FIRST_COL+SECOND_COL
---------- ---------- --------------------
         3          6                    9
         1         10                   11
 
6、对单列进行运算后返回
 select first_col,second_col,first_col*10 from tab1;
结果如下
 FIRST_COL SECOND_COL FIRST_COL*10
---------- ---------- ------------
         3          6           30
         1         10           10
 
7、select 1+2  from dept;
返回结果如下
  www.2cto.com  
      1+2
---------
        3
        3
        3
        3
这样的查询似乎看起来没有什么意义,出现四行是因为有四个部门,对每个部门
 
都要执行一次1+2并且返回。
假设建立一个表只有一条数据那么将只会返回一条数据,在oracle内部就存在这
 
样一个表dual,以前我们经常会看到这样的语句
select sysdate from dual;
SYSDATE
--------------
05-8月 -12
即返回系统日期
假如执行这样的语句,利用上面建立的表tab1
select sysdate from tab1;
看看结果会是什么
SYSDATE
-----------
05-8月 -12
05-8月 -12
返回了两个日期,因为表tab1中有两条数据,这也可以说明返回的数据只是一个
 
常量,并不是从dual表中取得的,
只是利用了dual表中有一条数据的特点,这个表完全可以自己建立,也会取得和
  www.2cto.com  
dual一样的效果
 
where关键字
一个简单的查询条件一般包含一个比较运算符(<  <=  >  >+   =   <>)
由比较运算符组成的语句能够判断为true和false,当为true时,则说明该行符
 
合条件,作为用户检索的数据返回给用户,例如
select * from emp where sal>4000;
 
order by关键字
如果想要检索返回的数据按照一定的顺序排列,就需要使用order by关键词,
select * from emp order by ename desc nulls last;
select * from emp order by ename asc nulls first;
其中asc是指按照指定的列按照升序排列,desc按降序排列,nulls first指将为
 
空的行显示在最前面,
nulls last是指将为空的数据所在行显示在最后,对于升序排列nulls last为默
 
认,如果按照降序排列nulls first 为默认
例如
select  * from emp order  by comm ;等价于
select  * from emp order  by comm asc nulls last;
select  * from emp order  by comm desc;等价于
select  * from emp order  by comm desc nulls first;
 
如果按照多个字段排序
select * from emp order by deptno asc,ename desc;
会先按照deptno进行升序排列,相同的deptno按照姓名的降序排列
 
运算符and  or   not
两个条件分别进行判断为true或者false
true or ...-->true
true and true-->true
false or false-->false
false and...-->false
例如
select 'true or false' from dual where (1=0) or (1=1);
返回结果为
'TRUEORFALSE'
-------------
true or false
 
select 'true or false' from dual where (1=0) and (1=1);
返回   no rows selected
 
对于not运算符可以放在任何一个条件面前,将true和和false反转
 
例如  www.2cto.com  
select * from emp where deptno>20;
select * from emp where not deptno>20;(注意not必须放在整个条件的前面)
 
运算符between   in  like
between运算符是用一个范围值对数据进行过滤,这个范围两边是闭区间的
例如
select * from emp where sal between 2850 and 4000;
between运算符
 
in运算符是让某个列的值或者通过表达式运算出的结果和几个单独的值列表进行
比较,例如
select * from emp where sal in (2850,3000,5000);
 
like运算符,like运算符后面的表达式可以有几种情况
'%ab' 列的值最后两个字母是ab
'%ab%'列的值中包含ab,注意ab是一体的
'ab%' 列的值最开始两个字母是ab
'_ab%'列的值第二三个字母是ab,其中_为占位符,一个_占一位
select * from emp where ename like '_MI%';
 
case表达式,简单的语法格式如下图
 
 
例如
select ename ,case deptno
when 10 then '10部门'
when 20 then '20部门'
when 30 then '30部门'
when 40 then '40部门'
else '没有该部门'
end
from emp;
 
case的第二种表达式如下图
 
 
select ename,deptno,sal,
case   www.2cto.com  
when sal between 1000 and 2000  then '工资比较低'
when sal >2000 and sal<3000 then '工资还可以'
when not sal <3000 then '工资比较高'
else '工资太低啦'
end as salary
from emp order by sal;
 
group by
group by 与不带group by的查询语句的区别在于:不带group by的
情况下我们select跟的表达式无论是什么,都只是对满足where条件一行数据进行操做,利用group by根据某列内容对数据进行分组后我们可以对该组进行一些数据的统计与查询,例如统计该组的总数,查询该组的最大值平均值等内容
 
利用group by是有限制的,即select后面跟的列只能是两种情况
一是按照该列分组,而是对该列使用了分组函数(count sum max min avg median stats_mode  stddev variance)
select count(*),avg(sal),deptno from emp group by deptno;
结果如下
  COUNT(*)   AVG(SAL)     DEPTNO
---------- ---------- ----------
         6 1566.66667         30
         5       2175         20
         3 2916.66667         10
having 
group by 将数据按照某列进行分组后,有的组并不是我们想要的,这个时候可以通过having对组进行过滤,例如想得到部门员工数大于5人的部门,则可以
select count(ename) ,deptno from emp group by deptno having count(ename)>5;
结果如下  www.2cto.com  
COUNT(ENAME)     DEPTNO
------------ ----------
           6         30
只显示了员工人数大于5的部门,having将人数小于等于5的部门过滤掉了
 
where与having的区别
虽然都是起着过滤的作用,但是where针对的是一行数据,having针对的是一组数据,where可以决定返回哪个行,having可以决定返回哪一组,同时在where子句中不允许使用分组函数,但是在having子句中可以使用非分组函数
 
select deptno ,count(*) from emp group by deptno having deptno>20;
但是这样的语句执行效率低于下面的写法
select count(*) ,deptno from emp where deptno>20 group by deptno;
1.union子句用法

union子句
union操作符将两个查询结果合并为一个结果集。为连接查询合并两个表时:列的数日和顺序在查中必须一致;数据类型兼容
语法:
select  语句
union   [ all ]
select  语句
注意:
1 .union运算从最终结果集中删除重复记录,如想不删除重复记录使用all关键字
2 .第一个select语句中不能用order by或compute子句,只能是最后一个select语名后用
 例:查询计算机系的学生式年龄不大于19岁的学习,按年龄倒排序
select   *   from  department  where  dept = ' computer ' ;
union ;
select  *   from  student  where  age <= 19
order   by  age  desc
2.WHERE子句可包括各种条件运算符:
  比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!<
  范围运算符(表达式值是否在指定的范围):BETWEEN…AND…
  NOT BETWEEN…AND…
  列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……)
  NOT IN (项1,项2……)
  模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE
  空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL
  逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30
2、列表运算符例:country IN ('Germany','China')
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、varchar、text、ntext、datetime和smalldatetime等类型查询。
可使用以下通配字符:
  百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。
  下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。
  方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。
  例如:
限制以Publishing结尾,使用LIKE '%Publishing'
限制以A开头:LIKE '[A]%'
限制以A开头外:LIKE '[^A]%'

3.in和exists
in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。
如果查询的两个表大小相当,那么用in和exists差别不大。
如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:
例如:表A(小表),表B(大表)1:select * from A where cc in (select cc from B)
效率低,用到了A表上cc列的索引;select * from A where exists(select cc from B where cc=A.cc)
效率高,用到了B表上cc列的索引。
相 反的2:select * from B where cc in (select cc from A)效率高,用到了B表上cc列的索引;select * from B where exists(select cc from A where cc=B.cc)效率低,用到了A表上cc列的索引。
not in 和not exists如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。
in 与 =的区别
select name from student where name in ('zhang','wang','li','zhao');

select name from student where name='zhang' or name='li' or name='wang' or name='zhao'
的结果是相同的。
4.Casewhenthen与DECODE用法
decode语法:
decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值)
该函数的含义如下:
IF 条件=值1 THEN
    RETURN(翻译值1)
ELSIF 条件=值2 THEN
    RETURN(翻译值2)
ELSIF 条件=值n THEN
    RETURN(翻译值n)
ELSE
    RETURN(缺省值)
END IF
decode(字段或字段的运算,值1,值2,值3)
       这个函数运行的结果是,当字段或字段的运算的值等于值1时,该函数返回值2,否则返回值3
 当然值1,值2,值3也可以是表达式,这个函数使得某些sql语句简单了许多
使用方法:
1.比较大小
select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值
sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1
例如:
变量1=10,变量2=20
则sign(变量1-变量2)返回-1,decode解码结果为“变量1”,达到了取较小值的目的。
2.统计合格率
select sum(DECODE(C810000125,'是',1,0))/COUNT(1) 合格率 FROM t581
这句的含义是如果C810000125字段的值为“是”则标记其为1,为其他则标记其为0,最后统计总的该字段为“是”的个数,再除以总条数则是合格率的值。
还可以这样写:
select sum(case when C810000125 = '是' then 1 else 0 end)/COUNT(1) 合格率 FROM t581
5.Case..when用法
  WHEN  col3 > 1  AND  col3 <2
    THEN '1'
  WHEN  col3 > 2  AND  col3 <3
    THEN '2'
  WHEN  col3 > 3  AND  col3 <4
    THEN '3'
  ELSE  '4'
  END  mylevel
  FROM table1
  注意点:
  1、以CASE开头,以END结尾
  2、分支中WHEN 后跟条件,THEN为显示结果
  3、ELSE 为除此之外的默认情况,类似于高级语言程序中switch case的default,可以不加
4、END 后跟别名

 

2.Sql函数
2.1字符串函数
2.1.1 LOWER()和UPPER()
LOWER()将字符串全部转为小写;UPPER()将字符串全部转为大写。
2.1.2数据类型转换为字符串类型STR()
把数值型数据转换为字符型数据。
STR (<float_expression>[,length[, <decimal>]])
length 指定返回的字符串的长度,decimal 指定返回的小数位数。如果没有指定长度,缺省的
length 值为10, decimal 缺省值为0。
当length 或者decimal 为负值时,返回NULL;
当length 小于小数点左边(包括符号位)的位数时,返回length 个*;
先服从length ,再取decimal ;
当返回的字符串位数小于length ,左边补足空格。
2.1.3去空格函数LTRIM()与RTRIM()
1、LTRIM() 把字符串头部的空格去掉。
2、RTRIM() 把字符串尾部的空格去掉。
2.1.4取子串函数
1、left()
LEFT (<character_expression>, <integer_expression>)
返回character_expression 左起 integer_expression 个字符。
2、RIGHT()
RIGHT (<character_expression>, <integer_expression>)
返回character_expression 右起 integer_expression 个字符。
3、SUBSTRING()
SUBSTRING (<expression>, <starting_ position>, length)
返回从字符串左边第starting_ position 个字符起length个字符的部分。
2.1.5字符串比较函数
1、CHARINDEX()
返回字符串中某个指定的子串出现的开始位置。
CHARINDEX (<’substring_expression’>, <expression>)
其中substring _expression 是所要查找的字符表达式,expression 可为字符串也可为列名表达式。如
果没有发现子串,则返回0 值。
此函数不能用于TEXT 和IMAGE 数据类型。
2、PATINDEX()
返回字符串中某个指定的子串出现的开始位置。
PATINDEX (<’%substring _expression%’>, <column_ name>)其中子串表达式前后必须有百分号
“%”否则返回值为0。
与CHARINDEX 函数不同的是,PATINDEX函数的子串中可以使用通配符,且此函数可用于
CHAR、 VARCHAR 和TEXT 数据类型。
2.2日期函数
2.2.1. 日期和字符转换函数用法(to_date,to_char)
select to_char(sysdate,'yyyy-mm-dd hh24miss') as nowTime from dual;   日期转化为字符串 
select to_char(sysdate,'yyyy') as nowYear   from dual;   获取时间的年 
select to_char(sysdate,'mm')    as nowMonth from dual;   获取时间的月 
select to_char(sysdate,'dd')    as nowDay    from dual;   获取时间的日 
select to_char(sysdate,'hh24') as nowHour   from dual;   获取时间的时 
select to_char(sysdate,'mi')    as nowMinute from dual;   获取时间的分 
select to_char(sysdate,'ss')    as nowSecond from dual;   获取时间的秒
2.2.2.求某天是星期几    
   select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from dual;    
   星期一    
   select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual;    
   monday    
   设置日期语言    
   ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';    
   也可以这样    
   TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American')   
2.2.3. 两个日期间的天数    
    select floor(sysdate - to_date('20020405','yyyymmdd')) from dual;   
2.2.4. 时间为null的用法    
   select id, active_date from table1    
   UNION    
   select 1, TO_DATE(null) from dual;    
   注意要用TO_DATE(null)   
2.2.5.月份差 
   a_date between to_date('20011201','yyyymmdd') and to_date('20011231','yyyymmdd')    
   那么12月31号中午12点之后和12月1号的12点之前是不包含在这个范围之内的。    
   所以,当时间需要精确的时候,觉得to_char还是必要的
    
2.2.6. 日期格式冲突问题    
    输入的格式要看你安装的ORACLE字符集的类型, 比如 US7ASCII, date格式的类型就是 '01-Jan-01'    
    alter system set NLS_DATE_LANGUAGE = American    
    alter session set NLS_DATE_LANGUAGE = American    
    或者在to_date中写    
    select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual;    
    注意我这只是举了NLS_DATE_LANGUAGE,当然还有很多,    
    可查看    
    select  from nls_session_parameters    
    select  from V$NLS_PARAMETERS   
2.2.7. 查找2002-02-28至2002-02-01间除星期一和七的天数
   select count()    
   from ( select rownum-1 rnum    
       from all_objects    
       where rownum = to_date('2002-02-28','yyyy-mm-dd') - to_date('2002-    
       02-01','yyyy-mm-dd')+1    
      )    
   where to_char( to_date('2002-02-01','yyyy-mm-dd')+rnum-1, 'D' )    
        not in ( '1', '7' )    
 
   查找2002-02-28至2002-02-01间除星期一和七的天数    
   在前后分别调用DBMS_UTILITY.GET_TIME, 让后将结果相减(得到的是1100秒, 而不是毫秒).   
2.2.8. 查找月份   
    select months_between(to_date('01-31-1999','MM-DD-YYYY'),to_date('12-31-1998','MM-DD-YYYY')) MONTHS FROM DUAL;    
    1    
   select months_between(to_date('02-01-1999','MM-DD-YYYY'),to_date('12-31-1998','MM-DD-YYYY')) MONTHS FROM DUAL;    
    1.03225806451613
     
2.2.9. Next_day的用法    
next_day函数      返回下个星期的日期,day为1-7或星期日-星期六,1表示星期日
   next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算起。    
   1 2 3 4 5 6 7    
   日 一 二 三 四 五六  
 
   ---------------------------------------------------------------
 
   select    (sysdate-to_date('2003-12-03 125545','yyyy-mm-dd hh24miss'))246060 from ddual
   日期 返回的是天 然后 转换为ss
2.2.10.一年的第几天    
   select TO_CHAR(SYSDATE,'DDD'),sysdate from dual
   310 2002-11-6 100351   

2.2.11.计算小时,分,秒,毫秒    
    select    
     Days,    
     A,    
     TRUNC(A24) Hours,    
     TRUNC(A2460 - 60TRUNC(A24)) Minutes,    
     TRUNC(A246060 - 60TRUNC(A2460)) Seconds,    
     TRUNC(A246060100 - 100TRUNC(A246060)) mSeconds    
    from    
    (    
     select    
     trunc(sysdate) Days,    
     sysdate - trunc(sysdate) A    
     from dual    
   )   


   select  from tabname    
   order by decode(mode,'FIFO',1,-1)to_char(rq,'yyyymmddhh24miss');    
 
       
   floor((date2-date1) 365) 作为年    
   floor((date2-date1, 365) 30) 作为月    
   d(mod(date2-date1, 365), 30)作为日.
   
2.2.12.round[舍入到最接近的日期](day舍入到最接近的星期日)
   select sysdate S1,
   round(sysdate) S2 ,
   round(sysdate,'year') YEAR,
   round(sysdate,'month') MONTH ,
   round(sysdate,'day') DAY from dual

2.2.13.trunc[截断到最接近的日期,单位为天] ,返回的是日期类型
   select sysdate S1,                   
     trunc(sysdate) S2,                 返回当前日期,无时分秒
     trunc(sysdate,'year') YEAR,        返回当前年的1月1日,无时分秒
     trunc(sysdate,'month') MONTH ,     返回当前月的1日,无时分秒
     trunc(sysdate,'day') DAY           返回当前星期的星期天,无时分秒
   from dual

2.2.14.计算时间差
     注oracle时间差是以天数为单位,所以换算成年月,日
   
      select floor(to_number(sysdate-to_date('2007-11-02 155503','yyyy-mm-dd hh24miss'))365) as spanYears from dual        时间差-年
      select ceil(moths_between(sysdate-to_date('2007-11-02 155503','yyyy-mm-dd hh24miss'))) as spanMonths from dual        时间差-月
      select floor(to_number(sysdate-to_date('2007-11-02 155503','yyyy-mm-dd hh24miss'))) as spanDays from dual             时间差-天
      select floor(to_number(sysdate-to_date('2007-11-02 155503','yyyy-mm-dd hh24miss'))24) as spanHours from dual         时间差-时
      select floor(to_number(sysdate-to_date('2007-11-02 155503','yyyy-mm-dd hh24miss'))2460) as spanMinutes from dual    时间差-分
      select floor(to_number(sysdate-to_date('2007-11-02 155503','yyyy-mm-dd hh24miss'))246060) as spanSeconds from dual 时间差-秒
2.2.15查找月的第一天,最后一天
     SELECT Trunc(Trunc(SYSDATE, 'MONTH') - 1, 'MONTH') First_Day_Last_Month,
       Trunc(SYSDATE, 'MONTH') - 1  86400 Last_Day_Last_Month,
       Trunc(SYSDATE, 'MONTH') First_Day_Cur_Month,
       LAST_DAY(Trunc(SYSDATE, 'MONTH')) + 1 - 1  86400 Last_Day_Cur_Month
   FROM dual;
2.2.16把当前时间以秒表示出来
把当前日期转换为以秒表示的形式
((sysdate -TO_DATE('19700101','yyyymmdd'))*86400 - TO_NUMBER(SUBSTR(TZ_OFFSET(sessiontimezone),1,3))*3600)
TZ_OFFSET函数显示出指定时区对UTC的偏移量。

----------------------------DECODE函数-------------------

Sql代码  收藏代码
  1. select sum(DECODE(C810000125,'是',1,0))/COUNT(1) 合格率 FROM t581  

 统计合格率,如果 C810000125这个字段为“是”结果1,不为是结果为0

还可以这样写:

Sql代码  收藏代码
  1. select sum(case when C810000125 = '是' then 1 else 0 end)/COUNT(1) 合格率 FROM t581  

含义解释:
decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值)

该函数的含义如下:
IF 条件=值1 THEN
    RETURN(翻译值1)
ELSIF 条件=值2 THEN
    RETURN(翻译值2)
    ......
ELSIF 条件=值n THEN
    RETURN(翻译值n)
ELSE
    RETURN(缺省值)
END IF

decode(字段或字段的运算,值1,值2,值3)

       这个函数运行的结果是,当字段或字段的运算的值等于值1时,该函数返回值2,否则返回值3
 当然值1,值2,值3也可以是表达式,这个函数使得某些sql语句简单了许多

使用方法:

1、比较大小
select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值
sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1
例如:
变量1=10,变量2=20
则sign(变量1-变量2)返回-1,decode解码结果为“变量1”,达到了取较小值的目的。

 

2、此函数用在SQL语句中,功能介绍如下:

 

 

 

Decode函 数与一系列嵌套的 IF-THEN-ELSE语句相似。base_exp与compare1,compare2等等依次进行比较。如果base_exp和 第i 个compare项匹配,就返回第i 个对应的value 。如果base_exp与任何的compare值都不匹配,则返回default。每个compare值顺次求值,如果发现一个匹配,则剩下的 compare值(如果还有的话)就都不再求值。一个为NULL的base_exp被认为和NULL compare值等价。如果需要的话,每一个compare值都被转换成和第一个compare 值相同的数据类型,这个数据类型也是返回值的类型。

 

 

 

Decode函数在实际开发中非常的有用

结合Lpad函数,如何使主键的值自动加1并在前面补0
select LPAD(decode(count(记录编号),0,1,max(to_number(记录编号)+1)),14,'0') 记录编号 from tetdmis

 

 

eg:

 

select decode(dir,1,0,1) from a1_interval

dir 的值是1变为0,是0则变为1

 

比如我要查询某班男生和女生的数量分别是多少?

 

通常我们这么写:

select count(*) from 表 where 性别 = 男;

select count(*) from 表 where 性别 = 女;

要想显示到一起还要union一下,太麻烦了

用decode呢,只需要一句话

select decode(性别,男,1,0),decode(性别,女,1,0) from 表


3.oracle中sql的执行顺序
1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义。
2) 语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限。
3)视图转换,将涉及视图的查询语句转换为相应的对基表查询语句。
4)表达式转换, 将复杂的 SQL 表达式转换为较简单的等效连接表达式。
5)选择优化器,不同的优化器一般产生不同的“执行计划”
6)选择连接方式, ORACLE 有三种连接方式,对多表连接 ORACLE 可选择适当的连接方式。
7)选择连接顺序, 对多表连接 ORACLE 选择哪一对表先连接,选择这两表中哪个表做为源数据表。
8)选择数据的搜索路径,根据以上条件选择合适的数据搜索路径,如是选用全表搜索还是利用索引或是其他的方式。
9)运行“执行计划”
3.2.oracle 共享原理:
        ORACLE将执行过的SQL语句存放在内存的共享池(shared buffer pool)中,可以被所有的数据库用户共享 当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同, ORACLE就能很快获得已经被解析的语句以及最好的 执行路径. 这个功能大大地提高了SQL的执行性能并节省了内存的使用
三、oracle 语句提高查询效率的方法:1: where column in(select * from ... where ...); 2:... where exists (select 'X' from ...where ...); 第二种格式要远比第一种格式的效率高。在Oracle中可以几乎将所有的IN操作符子查询改写为使用EXISTS的子查询 使用EXIST,Oracle系统会首先检查主查询,然后运行子查询直到它找到第一个匹配项,这就节省了时间 Oracle系统在执行IN子查询时,首先执行子查询,并将获得的结果列表存放在在一个加了索引的临时表中 避免使用having字句 避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销

3.3.SQL Select语句完整的执行顺序:
1、from子句组装来自不同数据源的数据;
2、where子句基于指定的条件对记录行进行筛选;
3、group by子句将数据划分为多个分组;
4、使用聚集函数进行计算;
5、使用having子句筛选分组;
6、计算所有的表达式;
7、使用order by对结果集进行排序;
8、执行select。
4.Sql的左连接,右连接与自连接
4.1.数据表的连接有:
1、内连接(自然连接): 只有两个表相匹配的行才能在结果集中出现
2、外连接: 包括
(1)左外连接(左边的表不加限制)
(2)右外连接(右边的表不加限制)
(3)全外连接(左右两表都不加限制)
3、自连接(连接发生在一张基表内)
4.2.左连接右连接自连接示例
select a.studentno, a.studentname, b.classname
  from students a, classes b
  where a.classid(+) = b.classid;
STUDENTNO STUDENTNAM CLASSNAME
---------- ---------- ------------------------------
    1 周虎     一年级一班
    2 周林     一年级二班
            一年级三班
以上语句是右连接:
即"(+)"所在位置的另一侧为连接的方向,右连接说明等号右侧的所有
记录均会被显示,无论其在左侧是否得到匹配。也就是说上例中,无
论会不会出现某个班级没有一个学生的情况,这个班级的名字都会在
查询结构中出现。
反之:
select a.studentno, a.studentname, b.classname
  from students a, classes b
  where a.classid = b.classid(+);
STUDENTNO STUDENTNAM CLASSNAME
---------- ---------- ------------------------------
    1 周虎     一年级一班
    2 周林     一年级二班
    3 钟林达
则是左连接,无论这个学生有没有一个能在一个班级中得到匹配的部门号,
这个学生的记录都会被显示。
select a.studentno, a.studentname, b.classname
  from students a, classes b
  where a.classid = b.classid;
这个则是通常用到的内连接,显示两表都符合条件的记录
总之,
左连接显示左边全部的和右边与左边相同的
右连接显示右边全部的和左边与右边相同的
内连接是只显示满足条件的!

 

转自:http://yuxuguang.iteye.com/blog/803066

           http://www.2cto.com/database/201208/146505.html

分享到:
评论

相关推荐

    Oracle SQL 内置函数大全

    Oracle SQL 内置函数大全 SQL中的单记录函数 给出整数,返回对应的字符 连接两个字符串 增加或减去月份 用于对查询到的结果进行排序输出

    Oracle sql 函数大全 比较常用的一些 函数 整理

    本文将对 Oracle SQL 函数大全进行分类和讲解,涵盖字符串函数、字符转换函数、去空格函数、取子串函数、字符串比较函数、字符串操作函数等多种函数。 一、字符转换函数 字符转换函数是将字符或字符串从一种形式...

    oracle/sql函数大全

    sql 函数 大全 oracle 基于oracle 的函数大全,很使用。

    Oracle_Sql_中常用字符串处理函数

    Oracle Sql 中常用字符串处理函数 Oracle Sql 中提供了多种字符串处理函数,用于对字符串进行各种操作,如大小写转换、截取、连接、查找、替换等。下面是 Oracle Sql 中常用的字符串处理函数: 1. 大小写转换函数 ...

    oracle中的sql函数

    oracle中的sql函数说明,详细描述函数的各个参数。

    Linux下定时自动执行Oracle_SQL

    在IT领域,尤其是在数据库管理和系统自动化操作中,利用Linux下的Crontab实现Oracle SQL的定时自动执行是一项极为实用且高效的技术。本文将深入探讨如何在Linux环境下设置Crontab来定期执行Oracle SQL脚本,这一过程...

    Oracle sql 函数

    oracle 数据库 sql 常用函数。

    oracle_sql_函数_语法_集合

    Oracle SQL函数和语法是数据库管理中的核心组成部分,尤其对于初学者而言,理解并掌握这些概念至关重要。本资源包包含了丰富的Oracle SQL相关知识,包括基本的SQL语句、函数以及一些实用案例,旨在帮助Oracle基础较...

    Oracle SQL 官方文档

    Oracle SQL 是一种强大的数据库查询和编程语言,广泛用于管理和操作Oracle数据库系统。11g第二版(11G2)是Oracle的一个重要版本,提供了许多增强功能和优化。本官方文档集包括四份重要的参考资料,涵盖了Oracle SQL...

    Oracle Sql语句转换成Mysql Sql语句

    在数据库管理领域,Oracle SQL和MySQL SQL是两种广泛使用的SQL方言,它们在语法和功能上存在一定的差异。当需要将一个基于Oracle SQL的应用程序迁移到MySQL环境时,就需要进行SQL语句的转换工作。本项目提供了一个...

    Oracle SQL高级编程

    2. 高级查询技术:使用Oracle SQL的高级特性,如分析函数、子查询、连接以及数据聚合等。 3. 事务处理:深入理解如何使用Oracle的事务控制语句,如COMMIT、ROLLBACK以及SAVEPOINT,进行有效的事务管理。 4. 锁机制:...

    oracle SQL查询和SQL函数手册 基本涵盖了常用的

    Oracle SQL查询和SQL函数是数据库管理员、开发人员以及数据分析者在处理Oracle数据库时不可或缺的工具。这份手册详尽地介绍了如何有效地使用SQL语言来查询、分析和操作数据,旨在提供全面且实用的知识点。 1. **SQL...

    SQLServer和Oracle常用函数对比

    本文将详细探讨在SQLServer与Oracle数据库系统中常用的数学函数及字符串处理函数之间的差异。对于数据分析师、数据库管理员以及软件开发者而言,掌握这两种数据库管理系统之间的不同之处至关重要,尤其是在进行跨...

    Oracle-Sql语句资料oracle+110个常用函数经典SQL语句大全.zip

    Oracle_Sql语句资料oracle+110个常用函数经典SQL语句大全,可供学习参考。

    oracle查看执行最慢与查询次数最多的sql语句

    在Oracle数据库管理中,了解SQL语句的执行性能和频率对于系统优化至关重要。本文将详细介绍如何查看Oracle数据库中执行最慢和查询次数最多的SQL语句,以帮助DBA(数据库管理员)识别潜在的性能瓶颈。 首先,我们来...

    Oracle Sql基础(beginning oracle sql中文版)

    Oracle SQL是数据库管理员和开发人员用来与Oracle数据库交互的语言,它是SQL标准的扩展,提供了许多特有的功能和优化。本资源“Oracle Sql基础(beginning oracle sql中文版)”旨在为初学者提供一个全面的Oracle ...

    Oracle_PL(SQL)单行函数和组函数及使用

    ### Oracle_PL(SQL)单行函数和组函数及使用 #### 一、概述 在Oracle数据库中,SQL 和 PL/SQL 提供了大量的内置函数,这些函数可以极大地提高开发效率和简化查询逻辑。根据处理数据的不同方式,这些函数可以分为...

    oracle内置SQL函数分类整理

    Oracle内置SQL函数-分类整理大全 F.1字符函数——返回字符值 F.2字符函数——返回数字 F.3数字函数 F.4日期函数 F.5转 换 函 数 F.6分 组 函 数 F.7其 他 函 数 F.8 SQLPLUS常用命令 F.9 oracle客户端连接的文件...

    ORACLE_SQLDeveloper使用教程

    - Oracle 提供了详尽的 SQL 参考手册,包含了所有的 SQL 语句和函数的文档。 - SQL Developer 通常会链接到这些手册,方便用户查阅。 #### 四、使用 SQL Developer 执行 SQL 语句 **如何使用 SQL Developer 执行...

    OracleSQLDeveloper

    在Oracle SQL Developer中,你可以执行以下关键操作: 1. **数据查询**:通过SQL编辑器,用户可以编写和运行SQL查询,查看结果集,进行数据筛选、排序和分组。它还支持PL/SQL代码的编写和调试,帮助开发者高效地...

Global site tag (gtag.js) - Google Analytics