Heim  >  Artikel  >  Datenbank  >  PL/SQL中SELECT总结

PL/SQL中SELECT总结

WBOY
WBOYOriginal
2016-06-07 17:35:23968Durchsuche

一、SELECT 语句的各个关键词的顺序及作用简解(这个我简略点写~) 1.SELECT 2.FROM 3.WHERE 4.GROUP BY ---对结果集进行分组,通

一、SELECT 语句的各个关键词的顺序及作用简解(这个我简略点写~)

1.SELECT

2.FROM

3.WHERE

4.GROUP BY ---对结果集进行分组,通常与聚合函数一起使用

5.HAVING

6.ORDER BY

举个例子如下:

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 rownum5;

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 rownum5) and rownum5

或者:

select * from lab_item_dict where lnnvl(item_code in (select item_code from lab_item_dict where rownum5)) and rownum5;

(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 rownum5)and rownum5 order by price desc;

(5)查询另一张表中,就诊序号分别为‘1’和‘4’的两个病人日期最近的各前5条数据(这个是百度上面有人提问的一道淘宝网的面试题,类似的意思~)

order by visit_date desc ) where rownum5 union all order by visit_date desc ) where rownum5

暂时,想到常用的这么多~有空续。。。

请点击下面的“绿色通道”--“关注DebugLZQ”,共同交流进步~

相关阅读:

rlwrap - 解决Linux下SQLPLUS退格、上翻键乱码问题

SQLPLUS spool 到动态日志文件名

Oracle SQLPLUS提示符设置

通过设置SQLPLUS ARRAYSIZE(行预取)加快SQL返回速度

linux

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn