oracle學習筆記——查詢篇

1、單表查詢

        1、基本SELECT語句

                1)查看錶結構用desc

                    desc dual;sql

                2)、空表dual,最經常使用的空表

                    select2 * 4from dual;函數

                    selectsysdatefrom dual;性能

                3)、在使用中咱們能夠將取到的字段起別名

                  Selectsysdate日期from dual;spa

                  雙引號能保持格式翻譯

                  如:selectsysdate 「toDay 」 from dual;code

                4)、查看錶所屬用戶

                select owner from dba_tables where table_name='表名';排序

                注:system.tb_booktype tb_booktype屬於system用戶ci

                爲了後續咱們使用,咱們如今建立圖書類型表—tb_booktype」圖書信息表—        tb_bookinfo」字符串

                 

        2、比較運算符

                1)、 =<>>=<=<> !=

                  在圖書類別表查看到ID等於2的數據get

                  selectfrom  tb_booktype t where t.id='2'

                  在圖書類別表查看到ID大於2的數據

                  selectfrom  tb_booktype t where t.id >'2'

                  在圖書類別表查看到ID小於2的的數據

                  selectfrom  tb_booktype t where t.id<'2'

                 

                  在圖書類別表查看到ID小於等於2的數據

                  selectfrom  tb_booktype t where t.id<='2'

                  在圖書類別表查看到ID大於等於2的數據

                  selectfrom  tb_booktype t where t.id>='2'

                  在圖書類別表查看到ID不等於等於2的數據

                    selectfrom  tb_booktype t where t.id<>'2'

                  selectfrom  tb_booktype t where t.id!='2'

                2)、innot in

                in(是知足一個字段的多個值)

                在圖書類別表查看類別名稱等於天然和人文的數據

                selectfrom  tb_booktype t where t .typename in ('天然','人文')

                在圖書類別表查看類別名稱等於天然和人文的數據且;而且類別ID等於12

                selectfrom  tb_booktype t where t .typename in ('天然','人文')and t.id notin ('1','2')

                   

                3)、like not like

                like模糊

                在圖書類別表查看類別名稱包含的數據

                selectfrom  tb_booktype t where t.typename  like'%'

                注意:百分號的位置不一樣查出的數據也不相同!

                selectfrom  tb_booktype t where t.typename  like'%'

                selectfrom  tb_booktype t where t.typename  like'%%'

                4)、is nullis not null

                在圖書類別表查看類別名稱爲空的數據

                selectfrom  tb_booktype t where t.typename  isnull

        3、邏輯運算符

                1and

                and(就是和的意思,必須同時知足條件)

                在圖書類別表查看到ID大於2的且小於45的數據

                selectfrom  tb_booktype t where t.id>'2'and t.id<'45'

                2)or

                or(是或者的意思,兩個或者多個條件知足一個就能夠)

                在圖書類別表查看到ID大於2的或類別名稱等於天然的數據

                selectfrom  tb_booktype t where t.id>'2'or t.typename='天然'

                4order by 子句

                orderbyasc(升序)desc(降序)

                在圖書類別查看數據,按降序排序

                selectfrom  tb_booktype t orderby t.id desc

 

2、多表查詢

        1、子查詢

                    求部門分組後工資最高的員工信息

                    select emp.ename, emp.sal, emp.deptno from emp, (selectmax(sal) max_sal, deptno from emp groupby deptno) t where emp.sal = t.max_sal and emp.deptno = t.deptno;

                    求部門平均工資等級

                    select s.grade, t.deptno, t.avg_sal from scott.salgrade s, (select deptno, avg(sal) avg_sal from emp groupby deptno) t where t.avg_sal > s.losal and t.avg_sal < s.hisal;between

        2、鏈接查詢

                innerjoin(等值鏈接只返回兩個表中聯結字段相等的行

                leftjoin(左聯接返回包括左表中的全部記錄和右表中聯結字段相等的記錄

                rightjoin(右聯接返回包括右表中的全部記錄和左表中聯結字段相等的記錄

                fulljoin()取到的除了左右兩邊都匹配上的記錄數,對於左邊表與右邊表沒有匹配的,用null補上做爲右邊表匹配的數據;右邊表與左邊表沒有匹配的,用null補上做爲左邊表匹配的數據。總記錄數=左邊未匹配記錄數+右邊未匹配記錄數+左右都匹配上的記錄數

                查詢出圖書類型,和圖書名稱

                select t.typename,tb.bookname from tb_booktype t, tb_bookinfo tb where t.id = tb.typeid

                1inner join(等值鏈接)

                select t.typename,tb.bookname from tb_booktype t

                innerjoin tb_bookinfo tb on t.id=tb.typeid

                2left join(左聯接)

                select t.typename,tb.bookname from tb_booktype t leftjoin tb_bookinfo tb on t.id=tb.typeid

                3right join(右聯接)

                select t.typename,tb.bookname from tb_booktype t rightjoin tb_bookinfo tb on t.id=tb.typeid

                4full join

                select t.typename,tb.bookname from tb_booktype t fulljoin tb_bookinfo tb  on t.id=tb.typeid

        3、交集、並集、割集查詢

                1union

                --並集:不帶重複數據

                select t.id from tb_booktype t

                union

                select tb.typeid from tb_bookinfo tb;   

                2union all

                --並集:帶重複數據

                select t.id from tb_booktype t

                unionall

                select tb.typeid from tb_bookinfo tb;

                3minus   

                    --割集,顯示不一樣部分(指令是運用在兩個 SQL 語句上。它先找出第一個 SQL 語句所產生的結果,而後看這些結果有沒有在第二個 SQL 語句的結果中。若是有的話,那這一筆資料就被去除,而不會在最後的結果中出現。若是第二個 SQL 語句所產生的結果並無存在於第一個 SQL 語句所產生的結果內,那這筆資料就被拋棄)

                select t.id from tb_booktype t

                minus

                select tb.typeid from tb_bookinfo tb;

                4intersect

                --交集。

                select t.id from tb_booktype t

                intersect

                select tb.typeid from tb_bookinfo tb;

                 

        4、條件表達式——decode 函數和CASE表達式

                1)、decode 函數用法

                含義解釋:

                decode(條件,1,返回值1,2,返回值2,...n,返回值n,缺省值)

                該函數的含義以下:

                IF條件=THEN

                RETURN(翻譯值1)

                ELSIF條件=THEN

                RETURN(翻譯值2)

                ......

                ELSIF條件=THEN

                RETURN(翻譯值n)

                ELSE

                RETURN(缺省值)

                ENDIF

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

                 這個函數運行的結果是,當字段或字段的運算的值等於值1時,該函數返回值2,不然返回值3

                固然值1,值2,值3也能夠是表達式,這個函數使得某些sql語句簡單了許多

                例子:在圖書類型表中查詢,當圖書類型等於人文的時候那麼它屬於百科類,期他圖說類型屬於其餘類

                select decode(t.typename,'人文','百科類','其餘類') , t.typename name

                from tb_booktype t

                2)、select case when的一些用法

                概述:

                sql語句中的case語句與高級語言中的switch語句,是標準sql的語法,適用於一個條件判斷有多種值的狀況下分別執行不一樣的操做。

                首先,讓咱們看一下CASE的語法。在通常的SELECT中,其語法格式以下:

                SELECT <myColumnSpec> =

                CASE <單值表達式>

                       when <表達式值then <SQL語句或者返回值>

                       when <表達式值then <SQL語句或者返回值>

                       ...

                       when <表達式值then <SQL語句或者返回值>

                END

                應用CASE語句可讓SQL變得簡潔高效,從而大大提升了執行效率。並且,CASE的使用通常不會引發性能(相比沒有用CASE的語句)低下,反而增長了操做的靈活性

                有一張表,裏面有3個字段:語文,數學,英語。其中有3條記錄分別表示語文70分,數學80分,英語58分,請用一條sql語句查詢出這三條記錄並按如下條件顯示出來(並寫出您的思路):

                   大於或等於80表示優秀,大於或等於60表示及格,小於60分表示不及格。

                       顯示格式:

                       語文              數學                英語

                       及格              優秀                不及格   

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

                select

                (casewhen語文>=80then'優秀'

                        when語文>=60then'及格'

                else'不及格'as語文,

                (casewhen數學>=80then'優秀'

                        when數學>=60then'及格'

                else'不及格'as數學,

                (casewhen英語>=80then'優秀'

                        when英語>=60then'及格'

                else'不及格'as英語,

                fromtable

3、函數

            1、大小寫控制函數lowerupper

                    select lower(‘abcABC’) from dual;

                    select upper(‘abcABC’) from dual;

                    substr(target, startIndex, length)

                    select substr(‘abcABC’, 13from dual;

            2、數字函數truncroundsubstr

                    1TRUNC

                    語法:  TRUNC(x[,y])

                    功能:  計算截尾到y位小數的x. y缺省爲0,結果變爲一個整數值.若是y是一個負數,那麼就截尾到小數點左邊對應的位上.TRUNC()函數截取時不進行四捨五入,通常用於日期的截取上

                    select trunc(123.458from dual --123

                    select trunc(123.458,0from dual --123

                    select trunc(123.458,1from dual --123.4

                    select trunc(123.458,-1from dual --120

                    select trunc(123.458,-4from dual --0

                    select trunc(123.458,4from dual  --123.458

                    select trunc(123from dual  --123

                    select trunc(123,1from dual --123

                    select trunc(123,-1from dual --120

                    用在日期類型上,就是截取到日或時間

                    SELECT TRUNC(SYSDATEFROM DUAL;

                    默認是截取系統日期到日,獲得2012-12-19

                    好比值爲"2012-12-19 14:30:50"的日期變量

                    TRUNC(SYSDATE)獲得2012-12-19 , TRUNC(SYSDATE,'DD')同樣

                    TRUNC(SYSDATE,'YYYY'),獲得2012-1-1

                    TRUNC(SYSDATE,'MM'),獲得2012-12-1

                    TRUNC(SYSDATE,'DD'),獲得2012-12-19

                    TRUNC(SYSDATE,'HH')HH24,獲得2012-12-1914:00:00

                    TRUNC(SYSDATE,'MI'),獲得2012-12-1914:30:00

                    TRUNC(SYSDATE,'SS'),是會報錯的,直接用SYSDATE不用TRUNC

                    另外說明一下,截取後獲得的仍爲date數據類型

                    2Round 函數

                    (四捨五入)

                    描述 : 傳回一個數值,該數值是按照指定的小數位元數進行四捨五入運算的結果。

                    SELECT ROUND( number, [ decimal_places ] ) FROM DUAL

                    參數:

                    number : 欲處理之數值

                    decimal_places : 四捨五入 , 小數取幾位 ( 預設爲0 )

                    例:select round(123.4560from dual;          獲得:123

                    3Substr

                    取得字符串中指定起始位置和長度的字符串,  

                     格式:substr( string, start_position, [ length ] )

                     參數:start_position---正數從左邊開始,負數從右邊開始

                           length -----取得的位數

                     : substr('This is a test'62)     獲得'is'

                         substr('This is a test'6)     獲得'is a test'

                         substr('TechOnTheNet', -33)     獲得'Net'

                         substr('TechOnTheNet', -63)     獲得'The'

                     例:select substr('Thisisatest', -42valuefrom dual

                         --獲得當前的那年那月

                         select substr(sysdate,1,6valuefrom dual

            3、通用函數——nul

                    nvl能夠將某個字段的空值轉換成指定的值

                    nvl(字段名,0),就是當你選出來的時候,這個字段雖然爲空,可是顯示的是0,固然這個0也能夠換成其餘東西,如:123……

                    在圖書類別表查看數據類別名稱爲空的補零

                    select nvl(t.typename,0),t.id from tb_booktype t

            4、組函數—minmaxavgsumcount

                    1)max

                    在圖書信息表查看最高的價格

                    selectmax(tb.price) from tb_bookinfo tb

                    2)min

                      在圖書信息表查看最低的價格

                      selectmin(tb.price) from tb_bookinfo tb

                    3)avg

                      在圖書信息表查看平均的價格

                         selectavg(tb.price) from tb_bookinfo tb

                    4)sum

                      在圖書信息表算出表中全部價格的和

                         selectsum(tb.price) from tb_bookinfo tb

                    5)count

                      在圖書信息表中價格不爲空的數據條數

                         selectcount (tb.price) from tb_bookinfo tb

                      在圖書信息表中價格不相同的數據條數

                         selectcount(distinct tb.price) from tb_bookinfo tb

                    6)distinct 關鍵字

                    去掉重複數據distinct

                        在圖書類別表中查出有幾類圖書,可是表中有重複如何查詢呢?,

                    這裏咱們用到了 distinct去掉重複數據

                    selectdistinct(t.typename) from tb_booktype t

            拓展:

            Oracle比較一列的最大值或者最小值,咱們會用MAXMIN函數,可是對於比較一行的最大值或最小值呢?是否是平常用的少,不少人都不知道有ORACLE也有內置函數實現這個功能:COALESCE / GREATEST /LEAST

             1COALESCE返回該表達式列表的第一個非空value

                格式:COALESCE(value1, value2, value3, ...)

                含義:返回value列表第一個非空的值。

                           value列表必須是相同類型,也能夠是一個表的同一行、不一樣列的值進行比較。

                EXAMPLE: selectcoalesce (1null2 ) from dual ; -- 返回1

                                 selectcoalesce ( null21 ) from dual ; -- 返回2

                                 selectcoalesce (t.empno, t.mgr ) from  scott.emp t ; -- 效果相似 NVL( t.empno, t.mgr )

            2. GREATEST 返回值列表中最大值

                格式: GREATEST(value1, value2, value3, ...)

                含義:返回value列表最大的值。

                           value列表必須是相同類型,也能夠是一個表的同一行、不一樣列的值進行比較。

                           value值列表中有一個爲NULL,則返回NULL值。

                EXAMPLE: select greatest (132 ) from dual ; -- 返回3

                          select greatest ( 'A''B''C' ) from dual ; -- 返回C

                          select greatest (null'B''C' ) from dual ; -- 返回null

              select greatest (t.empno, t.mgr ) from  scott.emp t ; -- 返回empnomgr 較大值

            3. LEAST 返回值列表中最小值

                格式: LEAST(value1, value2, value3, ...)

                含義:返回value列表最小的值。

                           value列表必須是相同類型,也能夠是一個表的同一行、不一樣列的值進行比較。

                           value值列表中有一個爲NULL,則返回NULL值。

                EXAMPLE: select least (132 ) from dual ; -- 返回1

                           select least ( 'A''B''C' ) from dual ; -- 返回A

                           select least (null'B''C' ) from dual ; -- 返回null

                           select least (t.empno, t.mgr ) from  scott.emp t ; -- 返回empnomgr 較小值

            5、數據分組

                    1)group by 分組

                        查詢圖書信息表中的圖書數量圖書類型id」進行分組;

                        select tb.typeid,count(tb.bookname) from tb_bookinfo tb

                    groupby tb.typeid;

                     

                    2)having 對分組數據進行過濾

                      having用法

                    groupby後面是要跟着的select中全部不是聚合函數的字段。

                    註釋:聚合函數:聚合函數對一組值執行計算並返回單一的值。聚合函數忽略空值。聚合函數常常與SELECT語句的GROUPBY子句一同使用

                    1:  selectcount(*) from emp;        

                    //只是查詢總總數 emp這張表裏一共有多少條記錄因此不用group by

                    2:  selectcount(*) , deptno from emp groupby deptno; 

                    // 根據deptno 分組,查到的數據就是  列出不一樣部門記錄總數 

                    selectcount(*) ,  deptno ,  comm from emp groupby deptno , comm;

                     // 根據deptno  comm 分組  以此類推

                     groupby後面是要跟着的select中全部不是聚合函數的字段   不然會報錯。

                    having至關於wherewhere的惟一區別是當查詢語句中有聚合函數的時候就不能用where了只能用having

                    求圖書平均工資大於30的數據:

                        select * from(

                    selectavg(tb.price) price,tb.typeid

                    from tb_bookinfo tb

                    groupby tb.typeid

                    )

                    where price>40

                    selectavg(tb.price) price,tb.typeid

                    from tb_bookinfo tb

                    groupby tb.typeid

                    havingavg(tb.price)>40

                     

                    6、日期型函數

                    經常使用日期數據格式(該段爲摘抄)

                    YYYYYY 年的最後一位,兩位或三位Select to_char(sysdate,’YYY’) from dual002表示2002

                    SYEARYEAR SYEAR使公元前的年份前加一負號Select to_char(sysdate,’SYEAR’) from dual -1112表示公元前111 2

                    季度,13月爲第一季度Select to_char(sysdate,’Q’) from dual2表示第二季度

                    MM 月份數Select to_char(sysdate,’MM’) from dual12表示12

                    RM 月份的羅馬錶示Select to_char(sysdate,’RM’) from dual IV表示4

                    Month9個字符長度表示的月份名Select to_char(sysdate,’Month’) from dual May後跟6個空格表示5

                    WW 當年第幾周Select to_char(sysdate,’WW’) from dual24表示2002613日爲第24

                    本月第幾周Select to_char(sysdate,’W’) from dual2002101日爲第1

                    DDD 當年第幾11日爲00121日爲032 Select to_char(sysdate,’DDD’) from dual363200229日爲第363

                    DD 當月第幾天Select to_char(sysdate,’DD’) from dual04104日爲第4

                    周內第幾天Select to_char(sysdate,’D’) from dual52002314日爲星期一

                    DY 周內第幾天縮寫Select to_char(sysdate,’DY’) from dual SUN 2002324日爲星期天

                    HHHH12 12進制小時數Select to_char(sysdate,’HH’) from dual02午夜2點過8分爲02

                    HH24 24小時制Select to_char(sysdate,’HH24’) from dual14下午208分爲14

                    MI 分鐘數(059Select to_char(sysdate,’MI’) from dual17下午417

                    SS 秒數(059Select to_char(sysdate,’SS’) from dual2211322

                    提示注意不要將MM格式用於分鐘(分鐘應該使用MI)MM是用於月份的格式,將它用於分鐘也能工做,但結果是錯誤的。

                    1)Sysdate 當前日期和時間

                    SQLSelectsysdatefrom dual;

                    2)Last_day 本月最後一天

                    SQLSelect last_day(sysdatefrom dual;

                    3)Add_months(d,n) 當前日期d後推n個月

                    用於從一個日期值增長或減小一些月份

                    date_value:=add_months(date_value,number_of_months)

                    函數能夠獲得某一時間以前或以後n個月的時間

                    select add_months(sysdate,-6from dual;

                    該查詢的結果是當前時間半年前的時間

                    select add_months(sysdate,6from dual;

                    該查詢的結果是當前時間半年後的時間

                    SQLSelect add_months(sysdate,2from dual;

                    4)Months_between(f,s) 日期fs間相差月數

                    SQLselect months_between(sysdate,to_date('2005-11-12','yyyy-mm-dd'))from dual;

                    5)NEXT_DAY(date,char)

                    date參數爲日期型,

                    char:1~7Monday/Mon~Sunday/

                    指定時間的下一個星期幾(由char指定)所在的日期,

                    char也可用17替代,1表示星期日,2表明星期一。。。。

                    還能夠是星期1、星期二。。。星期日

                    Sql代碼 

                    select next_day(sysdate,'星期日'from dual; 

                    返回由"char "命名的,在變量"date "指定的日期以後的第一個工做日的日期。參數"char "必須爲該星期中的某一天。

                    SQLSELECT next_day(to_date('20050620','YYYYMMDD'),1FROM dual;

相關文章
相關標籤/搜索