Îð´«ÍøÉÏ£¡ÑϽûıÀû£¡ Oracleѧϰ±Ê¼Ç
³£Ñ岩
? ¶ÔÄÚÁ¬½Óand¡¢whereÓÃ˶¼ÐУ¬µ«ÍâÁ¬½ÓÔòÓÐÑϸñµÄʹÓÃλÖᣠ? ¹ýÂËÇý¶¯±íÒ»¶¨ÓÃwhere×Ӿ䡣
13.6·ÇµÈÖµÁ¬½Ó
²»Í¬±íûÓй²Í¬ÊôÐÔµÄÁУ¬µ«Á½ÕűíµÄÁпÉÒÔд³ÉÒ»¸öSQLÌõ¼þ±í´ïʽ¡£ eg1£ºÏÔʾ¿Í»§µÄÄêÁä¶Î select t1.real_name,round((sysdate-t1.birthdate)/365) age,t2.name from account t1 join age_segment t2 on round((sysdate-t1.birthdate)/365) between t2.lowage and t2.hiage; eg2£ºÏÔʾ¿Í»§huangrongµÄÄêÁä¶Î select t1.real_name,round((sysdate-t1.birthdate)/365) age,t2.name from account t1 join age_segment t2 on round((sysdate-t1.birthdate)/365) between t2.lowage and t2.hiage and real_name='huangrong'; eg3£ºÏÔʾÇàÄêÄêÁä¶ÎÖеĿͻ§Êý select t1.real_name,round((sysdate-t1.birthdate)/365) age,t2.name from account t1 join age_segment t2 on round((sysdate-t1.birthdate)/365) between t2.lowage and t2.hiage and t2.name like'ÇàÄê%'; eg4£ºÏÔʾ¸÷¸öÄêÁä¶ÎµÄ¿Í»§Êý£¨Ã»Óпͻ§µÄÄêÁä¶ÎµÄ¿Í»§ÊýΪ0£© select max(t2.name),count(t1.id) from account t1 right join age_segment t2 on round((sysdate-t1.birthdate)/365) between t2.lowage and t2.hiage group by t2.id;¸ãÇå³þΪºÎÓÃt1.idͳ¼Æ£¨Ë¼¿¼Á¬½Ó¹ý³Ì£©£» ÈôûÓпͻ§µÄÄêÁä¶Î²»ÓóöÏÖÔÚ½á¹û¼¯ÖÐÔò²ÉÓÃÄÚÁ¬½Ó¡£ 13.7±íÁ¬½Ó×ܽá 1£©ÄÚÁ¬½Ó£¬½â¾öÆ¥ÅäÎÊÌâ ¢ÙµÈÖµÁ¬½Ó£ºon×Ó¾äºóÓеÈÖµÌõ¼þ¡£ ¢Ú·ÇµÈÖµÁ¬½Ó£º²»Í¬±íûÓй²Í¬ÊôÐÔµÄÁУ¬µ«Á½ÕűíµÄÁпÉÒÔд³ÉÒ»¸öSQLÌõ¼þ±í´ïʽ¡£ ¢Û×ÔÁ¬½Ó£ºÍ¬Ò»ÕÅ±í£¬Í¨¹ýÆð±ðÃû£¬±í´ïÁÐÖ®¼äµÄ¹ØÏµ¡£ 2£©ÍâÁ¬½Ó£¬½â¾ö²»Æ¥ÅäÎÊÌâºÍ±íÖÐËùÓмǼ³öÏÖÔÚ½á¹û¼¯ ¢ÙµÈÖµÁ¬½Ó£ºon×Ó¾äºóÓеÈÖµÌõ¼þ¡£ ¢Ú·ÇµÈÖµÁ¬½Ó£º²»Í¬±íûÓй²Í¬ÊôÐÔµÄÁУ¬µ«Á½ÕűíµÄÁпÉÒÔд³ÉÒ»¸öSQLÌõ¼þ±í´ïʽ¡£
¢Û×ÔÁ¬½Ó£ºÍ¬Ò»ÕÅ±í£¬Í¨¹ýÆð±ðÃû£¬±í´ïÁÐÖ®¼äµÄ¹ØÏµ¡£ 3£©½»²æÁ¬½Ó£¬µÑ¿¨¶û»ý
27
Îð´«ÍøÉÏ£¡ÑϽûıÀû£¡ Oracleѧϰ±Ê¼Ç
³£Ñ岩
Ê®ËÄ¡¢¼¯ºÏ
14.1±íÁ¬½ÓÖ÷Òª½â¾öµÄÎÊÌâ
1£©Á½Õűí¼Ç¼֮¼äµÄÆ¥ÅäÎÊÌâ¡£ 2£©Á½Õűí¼Ç¼֮¼äµÄ²»Æ¥ÅäÎÊÌâ¡£ 3£©Æ¥ÅäÎÊÌâ+²»Æ¥ÅäÎÊÌâ¡£
14.2¼¯ºÏÔËËã
1£©Èô½«Á½ÕÅ±í¿´³É¼¯ºÏ£¬Æ¥ÅäÎÊÌâ¾ÍÊǼ¯ºÏÔËËãÖеĽ»¼¯¡£ 2£©Èô½«Á½ÕÅ±í¿´³É¼¯ºÏ£¬²»Æ¥ÅäÎÊÌâ¾ÍÊǼ¯ºÏÔËËãÖеIJ 3£©Æ¥ÅäÎÊÌâ+²»Æ¥ÅäÎÊÌâ¾ÍÊǼ¯ºÏÔËËãÖеIJ¢¼¯¡£ 14.3¼¯ºÏÔËËã·û 1£©union£º½á¹û¼¯ÎªÁ½¸ö²éѯ½á¹ûµÄ²¢¼¯£¬ÊÇÈ¥µôÖØ¸´ÖµµÄ£¬×îºóÓÐ×Ô¶¯ÉýÐò¡£ 2£©union all£º½á¹û¼¯ÎªÁ½¸ö²éѯ½á¹ûµÄ²¢¼¯£¬Êǰüº¬Öظ´ÖµµÄ£¬Êä³öЧ¹ûΪ¼Ç¼ÉýÐò¡£ 3£©tersect£º½á¹û¼¯ÎªÁ½¸ö²éѯ½á¹ûµÄ½»¼¯£¬²»°üº¬Öظ´Öµ¡£ 4£©minus£º½á¹û¼¯ÎªÊôÓÚµÚÒ»¸ö²éѯµÄ½á¹û¼¯£¬µ«²»ÊôÓÚµÚ¶þ¸ö²éѯµÄ½á¹û¼¯£¬¼´´ÓµÚÒ»¸ö²éѯµÄ½á¹û¼¯ÖмõÈ¥ËûÃǵĽ»¼¯£¬²»°üº¬Öظ´Öµ£»A-B=C£¬AΪ±»¼õÊý£¬BΪ¼õÊý£¬CΪ²î£»´ÓAÖмõÈ¥ºÍBÖÐÏàͬµÄ²¿·Ö¡£ ? ×¢ÒâÊÂÏ¼¯ºÏÔËËãÒªÇóÁ½¸öselectÓï¾äÊÇͬ¹¹µÄ£¬¼´ÁеĸöÊýºÍÊý¾ÝÀàÐͱØÐëÒ»Ö¡£ eg1£ºµ±Ô°üÔÚÏßʱ³¤Îª20Сʱ£¬µ¥Î»·ÑÓÃÕÇ5·Ö£¬Îª40СʱÕÇ3·Ö£¬ÆäËû²»±ä£¨ÓÃunion allʵÏÖ£© select base_duration,unit_cost+0.05 from cost where base_duration=20 union all select base_duration,unit_cost+0.03 from cost where base_duration=40 union all select base_duration,unit_cost from cost where base_duration not in(20,40) or base_duration is null;ЧÂʵͣ¬»»³Écase when½ÏºÃ eg2£ºÁгö¿Í»§ÐÕÃûÒÔ¼°ËûµÄÍÆ¼öÈË select t2.real_name,t1.real_name from account t1 join account t2 on t1.id=t2.recommender_id union all select real_name,'No recommender' from account where recommender_id is null; eg3£ºsun280ºÍsun-serverÉϵÄÔ¶³ÌµÇ¼ҵÎñʹÓÃÁËÄÄЩÏàͬµÄ×ʷѱê×¼ ·½Ê½Ò»£ºselect name from cost where id in( select cost_id from host h join service s on h.id=s.unix_host and h.name='sun280' intersect select cost_id from host h join service s on h.id=s.unix_host and h.name='sun-server'); ·½Ê½¶þ£ºselect name from cost where id in( select cost_id 28
Îð´«ÍøÉÏ£¡ÑϽûıÀû£¡ Oracleѧϰ±Ê¼Ç
³£Ñ岩
from service s where s.unix_host in ( select id from host where name='sun280') intersect select cost_id from host h join service s on h.id=s.unix_host and h.name='sun-server'); eg4£ºÄĄ̈UNIX·þÎñÆ÷ÉÏûÓпªÍ¨Ô¶³ÌµÇ¼ҵÎñ select id from host minus select unix_host from servce; 14.4×Ó²éѯ¡¢Á¬½Ó¡¢¼¯ºÏ×ܽá
1£©Æ¥ÅäÎÊÌ⣺in¡¢exists¡¢inner join¡¢intersect
2£©²»Æ¥ÅäÎÊÌ⣺not in¡¢not exists¡¢(outer join+whereÆ¥Åä±í·Ç¿ÕÁÐ is null)¡¢minus 3£©Æ¥Åä+²»Æ¥ÅäÎÊÌ⣺outer join¡¢union¡¢union all
29
Îð´«ÍøÉÏ£¡ÑϽûıÀû£¡ Oracleѧϰ±Ê¼Ç
³£Ñ岩
Ê®Îå¡¢ÅÅÃû·ÖÒ³ÎÊÌâ
15.1ʲôÊÇrownum
rownumÊÇÒ»¸öαÁУ¬¶Ô²éѯ·µ»ØµÄÐбàºÅ¼´Ðкţ¬ÓÉ1¿ªÊ¼ÒÀ´ÎµÝÔö¡£
? ×¢ÒâÊÂÏ¹Ø¼üµã£ºOracleµÄrownumÊýÖµÊÇÔÚ»ñȡÿÐÐÖ®ºó²Å¸³ÓèµÄ£¡
15.2 where rownum<=5µÄÖ´Ðйý³Ì
1£©Oracle»ñÈ¡µÚÒ»¸ö·ûºÏÌõ¼þµÄ1ÐУ¬½«Ëü½Ð×öµÚÒ»ÐС£
2£©ÓÐ5ÐÐÁËÂð£¿Èç¹ûûÓУ¬Oracle¾ÍÔÙ·µ»ØÐУ¬ÒòΪËüÒªÂú×ãÐкÅСÓÚµÈÓÚ5µÄÌõ¼þ¡£Èç¹ûµ½ÁË5ÐУ¬ÄÇôOracle¾Í²»ÔÙ·µ»ØÐС£ 3£©Oracle»ñÈ¡ÏÂÒ»ÐУ¬²¢µÝÔöÐкţ¨´Ó2µ½3ÔÙµ½4ÔÙµ½5?£©¡£ 4£©·µ»Øµ½µÚ2²½¡£ 15.3 where rownum=5µÄÖ´Ðйý³Ì 1£©ÓÉÓÚOracleûÓлñÈ¡µ½µÚÒ»¸ö·ûºÏÌõ¼þµÄ1ÐУ¬¼´µÚÒ»ÐС£ 2£©ËùÒÔOracleÎÞ·¨»ñÈ¡ÏÂÒ»ÐУ¬¼´ÎÞ·¨´Ó±àºÅΪ1µÄµÚÒ»ÐпªÊ¼µÝÔöÐкţ¨´Ó2µ½3ÔÙµ½4ÔÙµ½5?£©¡£ 3£©×îÖÕ½á¹ûΪ¿Õ¡£ eg1£ºÕÒ³öÕÊÎñÐÅÏ¢±íµÄǰÈýÌõ¼Ç¼ select rownum,id,real_name,create_date from account where rownum <= 3; eg2£ºÕÒ³öÕÊÎñÐÅÏ¢±íµÄµÚËÄÌõµ½µÚÁùÌõ¼Ç¼£¿ select rn,real_name from (select rownum rn,real_name from account where rownum<=6) where rn>=4; ? ×¢ÒâÊÂÏ´Ëʱrownum±ØÐëÓбðÃû£¬·ñÔò½á¹û½«°´ÕÕ×Ó²éѯºóµÄ±í½øÐÐαÁвéÕÒ£¬½á¹û¾ÍΪ¿ÕÁË¡£ eg3£º×îÍí¿ªÍ¨ÏµÍ³µÄǰÈý¸ö¿Í»§£¿ select rownum,real_name,create_date from (select real_name,create_date from account order by create_date desc) where rownum<=3; ? ×¢ÒâÊÂÏҪÏÈÅÅÐòºó¹ýÂË£¬×¢Òâwhere¡¢order byµÄÖ´ÐÐ˳Ðò¡£ eg4£º×îÍí¿ªÍ¨ÏµÍ³µÄµÚËĵ½µÚÁùÃû¿Í»§£¿ select rn,real_name,create_date from (select rownum rn,real_name,create_date from (select real_name,create_date from account order by create_date desc) where rownum<=6) where rn>=4; 30
Ïà¹ØÍÆ¼ö£º