一、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”,共同交流進步~