PL/SQL中SELECT總結


一、SELECT 語句的各個關鍵詞的順序及作用簡解(這個我簡略點寫~)

1.SELECT

2.FROM

3.WHERE

4.GROUP BY ---對結果集進行分組,通常與聚合函數一起使用

5.HAVING

6.ORDER BY

舉個例子如下:

select item_name,count(item_name) from lab_item_dict  where price='25'  group by item_name  having count(item_name)>1 order by count(item_name);

注意這個順序。

二、SELECT語句基本執行過程詳解

當執行SELECT語句時,DBMS的執行步驟可以表示如下:

  step1:首先執行FROM子句,組裝來自不同數據源的數據,及根據FROM子句中的一個或多個表創建工作表。如果在FROM子句中有兩個或多個表,DBMS將執行 CROSS JOIN運算對表進行交叉連接,作為工作表。

  step2:若果有WHERE子句,實現基於制定的條件對記錄進行篩選,即DBMS將WHERE子句列出的搜索條件作用於step1中生成的工作表。DBMS將保留哪些滿座搜索條件的行,刪除那些不滿足條件的行。

  step3:若果有GROUP BY子句,它講把數據划分為多個分組。DBMS將step2生成的結果表中的行分成多個組,每個組中有行的group_by_expression字段具有相同的值。接着,DBMS將每組減少到單行,而后將其添加到新的結果表中,用以代替step1的工作表。

  step4:如果有HAVING子句,他將篩選分組。DBMS將HAVING子句列出的搜索條件作用於step3生成的“組合”表中的每一行。DBMS將保留哪些滿足搜索條件的行,刪除那些不滿足條件的行。

  step5:將SELECT子句作用於結果表,刪除表中不包含再select_list中的列。如果SELECT子句包含DISTINCT關鍵詞,DBMS將從結果中刪除重復的行。

  step6:如果有ORDER BY子句,則按指定的排序規則對結果進行排序。

  step7:對於交互式的SELECT語句,在屏幕上出現結果;對於嵌入式的SQL,使用游標將結果傳遞給宿主程序。

以上就是SELECT語句的基本執行過程。理解它對於提高SQL查詢的效率將有幫助。

3、PL/SQL中的rownum在查詢中用法舉例

主要是最近項目遇到,很實用的一些功能,給大家分享:

有表如下:

 (1)查詢表中價格最大的葯品記錄

select distinct * from LAB_ITEM_DICT t where price in (select max(price) from lab_item_dict);

(2)查詢表中的前5行記錄

select * from lab_item_dict where rownum<=5;
select * from lab_item_dict where lnnvl(rownum>5);
select * from CLINIC_MASTER where rownum!=6;

注意第二條:lnnvl 排除指定條件;第三條:理解關鍵點為rownum是偽列,先計算結果集,然后在結果集上加上rowmun列。

上面3條語句,等價。

(3)查詢表中第6-10行數據

select * from lab_item_dict where item_code not in (select item_code from lab_item_dict where rownum<=5) and rownum<=5

 或者:

select * from lab_item_dict where lnnvl(item_code in (select item_code from lab_item_dict where rownum<=5)) and rownum<=5;

(4)查詢表中價格前5大的數據

select distinct * from lab_item_dict where price in(select distinct price from (select distinct price from lab_item_dict order by price desc) where rownum<=5)and rownum<=5 order by price desc;

(5)查詢另一張表中,就診序號分別為‘1’和‘4’的兩個病人日期最近的各前5條數據(這個是百度上面有人提問的一道淘寶網的面試題,類似的意思~

select * from (select * from OUTP_PRESC t where visit_no='1' order by visit_date desc ) where rownum<=5
union all
select * from (select * from OUTP_PRESC t where visit_no='4' order by visit_date desc ) where rownum<=5

暫時,想到常用的這么多~有空續。。。

請點擊下面的“綠色通道”--“關注DebugLZQ”,共同交流進步~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM