Oracle 檢索數據(查詢數據、select語句)

  用戶對錶或視圖最常進行的操做就是檢索數據,檢索數據能夠經過 select 語句來實現,該語句由多個子句組成,經過這些子句完成篩選、投影和鏈接等各類數據操做,最終獲得想要的結果。算法

語法:express

  select { [ distinct | all ]  columns | * }函數

  [ into table_name ]測試

  from { tables | views | other select }spa

  [ where  conditions]code

  [ group by columns ]orm

  [ having conditions ]排序

  [ order by columns ]開發

  •  select子句 :用於選擇數據表、視圖中的列
  •  into 子句:用於將原表的結構和數據插入新表中
  •  from 子句:用於指定數據來源,包括表,視圖和其餘select 語句。
  •  where 子句:用於檢索的數據進行篩選
  •  group by 子句:用於檢索結果進行分組顯示
  •  having 子句:用於從使用group by子句分組後的查詢結果中篩選數據行
  •  order by 子句:用來對結果集進行排序(包括升序和降序)

1、簡單查詢

  只包含select 子句和 from 子句的查詢就是簡單查詢,同時也是select語句的必選項。字符串

  select 子句用於選擇想要在查詢結果中顯示的列,這些列能夠用列名來表示,也可使用星號(*)來表示。查詢數據時,數據將按照select 子句後面指定的列名順序來顯示;若是使用星號,則表示查詢全部的列,這時候按照表結構的天然順序來顯示。

  一、檢索全部的列

  若是想要檢索知道數據表的全部列,在select 子句後面加星號來實現。

  語法 select *  from  table_name;              

    注意:a、檢索數據表須要注意是否屬於該模式,若是是模式內部檢索數據,直接使用表名;

         b、若是不在指定表所屬的模式內部檢索數據,不只要查看當前模式是否具備查詢的權限,並且還要在表名前面駕駛所屬的模式名稱

        c、 form 後面能夠跟多個表名,每一個表名直接用逗號隔開便可

  二、檢索指定的列

  若是想要顯示指定的列而不是所有的列,而且被指定列的順序不受限制,指定部分列也稱爲投影操做。須要把所顯示的列緊跟在select 關鍵字後面,每一個列名用逗號隔開。

  語法:select  column_name1,column_name2,column_name3...  from  table_name;            

  三、帶有表達式的select 子句

  在使用select 語句時,對於數字數據和日期數據均可以使用算數表達式,可使用算數運算法,包括加、減、乘、除和括號操做。不只能夠執行單獨數學運算,還能夠執行單獨的日期運算以及與列名關聯的運算。

  語法select salary*(1+0.1,sal  from  emp;                                      

  四、爲列指定列名

  爲了方便查看查詢結果,能夠爲須要的列名指定別名。在 Oracle 系統中,可使用as 關鍵字來指定別名,也能夠什麼也不用直接指定。

  語法 select empno  as  "員工編號",ename   "員工名稱"    from  emp;                 

  五、顯示不重複記錄

  在默認狀況下,結果集中包含全部符合查詢條件的數據行,這樣就可能出現重複的數據。在實際應用中,重複的數據可能不會帶來太多的價值,須要去掉重複的記錄,保留惟一記錄便可。使用 distinct 便可實現。

  語法 select distince  job  from  emp;                               

2、篩選查詢

  在 select 語句中使用where 子句能夠實現對數據行的篩選操做,只有知足where 子句中的判斷條件纔會顯示在結果集中。

  語法:

  select columns_list  from  table_name  where  conditional_expression;            

  •  columns_list:字段列表
  •    table_name:表名
  •    conditional_expression:篩選條件表達式

  經常使用的集中篩選狀況:

  一、比較篩選

     能夠在 where 子句中使用比較運算符來篩選數據,這樣只有知足條件的數據行纔會被查詢到,主要由下面6中狀況:

    a、A=B : 比較 A 與 B 是否相等

    b、A!B 或 A <>B : 比較 A 與 B 是否不相等

    c、A > B : 比較 A 是否大於 B

    d、A < B :比較 A 是否小於 B

    e、A >= B : 比較 A 是否大於或等於 B

    f、A  <= B : 比較 A 是否小於或等於 B

    除了上面的6種,還有兩個特殊的「比較篩選」操做

    g、A { operator }ANY (B) :表示 A 與 B 中的任何一個元素進行operator 運算符的比較,只要有一個比較值爲true,就返回數據行

    h、A { operator } ALL (B):表示 A 與 B 中的全部元素都進行 operator 運算符的比較,只有與全部元素比較值都爲 true,才返回數據行

    下面看一個例子:

    SQL > select  empno,ename,sal  from  emp  where  sal <> all (3000,950,800);               

    表示從emp 表中使用 all 關鍵字過濾工資(sal) 同時不等於300、950和800的數據行。

  二、使用特殊關鍵字篩選

    SQL 語言提供了 like、in、between 和 isnull 等關鍵字來篩選匹配的數據,下面一項項來看:

    (1)Like 關鍵字

      在 where 子句中使用 like 關鍵字查詢數據的方式也稱爲字符串模式匹配或字符串模糊查詢。like 關鍵字須要使用通配符在字符串內查找指定的模式,經常使用的通配符有下劃線 「_」,表明任意一個字符;百分號 「%」,表明任                    意數量的字符。

      EG: SQL> select   name,job   from  emp  where  name  like  "S%"  and  job like "K_";     

      表示從emp表中查詢 名字以 「S」 開頭且任意長度的字符串,而且 job 是以 「K」 開頭長度爲 2 的字符串

      注意:能夠在 like 關鍵字前面加上 not,表示否認的判斷,固然也能夠在 in ,between ,isnull 和 isNAN  等關鍵字前面加上 not  來表示否認的判斷。

    (2)IN 關鍵字

      當測試一個數據值是否匹配一組目標中的一個時,一般用 IN 關鍵字來指定列表搜索條件。

      格式: value  in (value1,value2,value3......)

      EG : SQL > select  name  from  job  where  name  in ("Tom", "Emma","Tony");          

      表示從emp 表中查詢 名字在列表中的數據行 。

    (3)Between 關鍵字

      須要返回某一個數據值是否位於兩個給定的值之間,可使用範圍條件進行查詢。一般使用 between... and  和 not  between...and  來指定範圍條件。

      使用 between ....and  的條件時,指定的第一個值必須小於第二個值。其實等價於比較運算符(>= ... <=).

      EG: SQL > select  sal   from  emp  where  sal  between  2000   and  3000;               

      表示從emp 表中查詢工資大於等於2000而且小於等於3000的數據行。

    (4)ISNULL關鍵字

      空值(NUll)從技術上來講就是位置的、不肯定的值,但空值與空字符串不一樣,空值是不存在的值,而空字符串是長度爲 0 的字符串。

      空值表明的是未知的值,可是並不能用空值來互相比較,這點須要特別注意。

      EG: SQL > select  address  from  student   where  address  is  null;                          

      表示從 student 表中查詢住址目前爲空值的數據行      

 

  三、邏輯篩選

    使用邏輯運算符 AND、OR、NOT能夠進行邏輯篩選,能夠把多個篩選條件組合起來,這樣便於獲取更加準確的數據記錄。

    AND 表示兩個表達式之間 「邏輯與」 的關係,須要知足多個兩個或者多個表達式才能成立。

    OR 表示兩個表達式「邏輯或」 的關係,兩個表達式中有一個爲 true,則這個邏輯表達式的值就爲 true。

    NOt 表示對錶達式執行「邏輯非」 的運算。

3、分組查詢

  數據分組的目的是用來彙總數據或爲整個分組顯示單行的彙總信息,一般在查詢結果集中使用 group by 子句對記錄進行分組。

  語法:

  select  columns_list  from  table_name  [ where  conditional_expression  ]   group  by   columns_list  [  having  contion_expression] ;

  •   column_list:字段列表,在 group by 子句中也能夠指定多個列分組。
  •   table_name:表名
  •   condition_expression: 篩選條件表達式。
  •   having:該子句是對分組的再次篩選,只能用於group by 以後,並且可使用經常使用的聚合函數

  group by 子句能夠基於指定某一列的值講數據集合劃分爲多個分組,同一組內全部記錄在分組屬性上具備相同值,也能夠基於指定多列的值將數據集合劃分爲多個分組。

  EG:SQL > select  deptno,job  from  emp  group  by  deptno,job  order by  deptno;

  表示按照部門編號(deptno) 和職務(job)列進行分組。

  group by子句常常和聚合函數一塊兒使用。

  EG:SQL > select  deptno  as  部門編號,avg(sal)  as  平均工資  from  emp   group  by deptno;

  表示按照部門進行分類,而後計算每個部門的平均工資。

  having子句能夠進行再次篩選

  EG:SQL > select  deptno  as  部門編號,avg(sal)  as  平均工資  from  emp  group  by  deptno  having  avg(sal) > 200;

  表示按照部門進行分組查詢,而後經過having子句直接過濾出平均工資大於200的部門信息。

4、排序查詢

  查詢數據時,查詢結果將按照默認的順序排列,每每並不能知足咱們的需求。咱們可使用order  by 子句對檢索的結果進行排序。

  語法:

  select  columns_list   from   table_name   [ where  conditional_expression  ]  [ group by columns_list ] [ order by { order_by_expression [ ASC| DESC ] } ]  [,...n]

  •    columms_list: 字段列表,能夠經過group by 子句指定多個列分組。
  •    table_name :表名
  •    condition_expression: 篩選條件表達式
  •    order_by-expression:  表示要排序的列名或者表達式。關鍵字 ASC 表示升序排列,默認的排序方式;DESC 表示降序排列。

   order by  子句能夠根據查詢結果中的一個列或多個列對查詢結果進行排序,而且第一個排序項是最主要的排序依據,剩下的是次要的排序依據。

  EG:SQL > select  deptno,empno  from  emp  order by  deptno ,empno;

  表示先按照部門編號進行升序排序,若是有相同項,按照員工編號進行升序排序。

5、多表關聯查詢

  在實際應用中查詢數據可能會涉及多個數據表,每一個表不是獨立存在的,而是若干個表之間的信息存在必定的關係,當查詢一個表的信息時,極可能須要查詢關聯數據表的信息,這就是多表關聯查詢。

  一、表別名

    在進行多表查詢時,若是多個表之間存在同名的列,則必須使用表名來限定列的引用。SQL 語言提供了設定表別名的機制,使用簡短的表別名就能夠替代原有較長的表名稱,能夠大大縮短語句的長度。

    EG:SQL > select  e.empno  as  員工編號,e.ename  as  員工名稱, d.dname  as  部門  from  emp e,dept  d  where  e.deptno = d.deptno  and  e.job ="Manager";

    表示經過部門號(deptno)來管理emp表和dept表,並查詢這兩個表中相關字段的信息。

    注意:一旦在from 子句中爲表指定了列名,則必須在剩餘的子句中都使用表別名。  

  二、內鏈接

    內鏈接是經常使用的多表關聯查詢,使用關鍵字inner join來實現,其中,inner 關鍵字能夠省略,使用 join 即表明內聯接。使用內聯接查詢多個表時,必須在 from  子句以後定義一個 on 子句,用來指定兩個表實現內聯接的「鏈接           條件」。

    使用內聯接進行多表查詢時,返回的查詢結果是隻包含查詢條件和鏈接條件的行,消除了與另外一個表中任何行不匹配的行。

    注意:在內聯接的查詢結果中,全部記錄行都是知足鏈接條件的。

    語法:

    select column_list

    from  table_name1  [ innter ] join table_name2

    on  join_condition;

  •  columns_list : 字段列表
  •  table_name1 和 table_name2 :兩個要實現內鏈接的表。
  •     join_condition: 實現內鏈接的條件表達式。

  EG: SQL > select  e.empno  as  員工編號, e.ename as  員工名稱,d.dname as  部門   from  emp e  inner  join  dept  d  on  e.deptno = d.deptno;   

  表示經過 deptno 字段來鏈接emp 表和 dept表,並查詢兩個表中相關的字段。

  三、外鏈接

    多表之間進行外鏈接時,除了返回全部匹配的行外,還會返回一部分或所有不匹配的行,這主要取決於外鏈接的種類,主要由如下3種:

    (1)、左外鏈接:關鍵字爲left Outer join  或 left  join

    左外聯接的結果集包括  LEFT OUTER子句中指定的左表的全部行,而不只僅是聯接列所匹配的行。若是左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的全部選擇列表列均爲空值。 

    EG:select  e.empon,e.ename,e.job,d.deptno,d.dname    from   emp  e  left  join dept  d  on  e.deptno = d.deptno;                                          

    表示從員工表(emp)表中查詢出來全部的記錄並查詢部門表(dept)中兩個deptno值相等的記錄,若是沒有相匹配的行,均爲空值。

    (2)右外鏈接:關鍵字爲 right outer  join  或  right join

    右向外聯接是左向外聯接的反向聯接。將返回右表的全部行。若是右表的某行在左表中沒有匹配行,則將爲左表返回空值。   

    EG:select  e.empno,e.ename,e.job,d.deptno,d.name  from  emp e right  join dept d  on  e.deptno = d.deptno;                                                                    

    表示從部門表(dept)中查詢出來全部的記錄,並查詢員工表(emp)表中與之deptno 對應的記錄,若是沒有匹配的行,均爲空值。

    (3) 徹底外鏈接:關鍵字爲 full outer join 或 full  join 

    完整外部聯接返回左表和右表中的全部行。當某行在另外一個表中沒有匹配行時,則另外一個表的選擇列表列包含空值。若是表之間有匹配行,則整個結果集行包含基表的數據值。

    EG:select  e.empno,e.ename,e.job,d.deptno,d.dname    from  emp  e   full join  dept  d  on   e.deptno = d.deptno;                                          

    表示查詢兩個表中全部的deptno的記錄,若是對方的表中沒有匹配的行,置爲空值。

  四、天然鏈接

    天然鏈接是指在查詢多個表時,Oracle 會將第一個表中的列與第二表中具備相同名稱的列進行自動鏈接。天然鏈接中,用戶不須要指定進行連續的列,這個任務由 Oracle 系統西段完成,天然鏈接使用「Natural  join」關鍵字。

    EG: select  empno,ename,job,dname    from   emp  natural  join  dept  where  sal > 200;                                                                                           

    表示在emp表中查詢工資(sal)大於2000的記錄,並實現emp表與dept 表的天然鏈接。

    注意:天然鏈接強制要求表之間必須具備相同的列名稱,可是在實際開發中不多用到。在使用天然鏈接時,不能爲列指定限定詞(即表名或表的別名),不然Oracle 會報錯。

  五、自鏈接

    在開發中,用戶可能會擁有「自引用式」的外鍵,是指表中的一個列能夠是該表主鍵的一個外鍵。

    EG:

  六、交叉鏈接

    交叉鏈接實際上就是不須要任何鏈接條件的鏈接,它使用 cross join 關鍵字來實現。

    語法: select   colums_list  from  table_name1  cross join  table_name2;

  •  colums_list : 字段列表
  •    table_name: 兩個實現交叉鏈接的表名。

    交叉鏈接的執行結果是一個笛卡爾積,這種查詢很是冗餘,但能夠經過where 子句來過濾出有用的記錄。

 

  圖解:

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

      表A      Id         name                          表B      ID      job     p_id

          1         張三                                        1        25       1

                                    2         李四                                        2        36       2

                                    3         王五                                        3        36       4                                                                               

                     a.id與b.p_id存在關係                               

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

  (1)內鏈接

    SQL > select  a.*,b.*  from   a   inner   join   b    where   a.id=b.p_id;

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

      a.Id       a. name        b.id     b.job    b.p_id

      1                張三            1         25          1

                      2               李四             2         36          2

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

 (2)左外鏈接

    SQL >  select  a.*,b.*   from   a   left   join   b   where   a.id=b.p_id;

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

 

      a.Id       a. name        b.id     b.job    b.p_id

 

      1                張三            1         25          1

 

                      2               李四             2         36          2

      3               王五           null       null        null     

 

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

 

 (3)右外鏈接

    SQL >  select  a.*,b.*   from   a   right   join   b   where   a.id=b.p_id;

 

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

 

      a.Id       a. name        b.id     b.job    b.p_id

 

      1                張三            1         25          1

 

                      2               李四             2         36          2

 

      null             null             3         36          4     

 

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

 

 (4)徹底鏈接

    SQL >  select   a.*,b.*   from   a   full   join   b     on   a.id=b.p_id   

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

 

      a.Id       a. name        b.id     b.job    b.p_id

 

      1                張三            1         25          1

 

                      2               李四             2         36          2

 

      null             null             3         36          4     

      3                王五          null       null       null

 

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

相關文章
相關標籤/搜索