1. 程式人生 > >Oracle笛卡爾積,分組,多表連線

Oracle笛卡爾積,分組,多表連線

一  oracle的單行函式 

      轉換函式 

      to_date(日期字串,日期格式)  字串的格式必須由第二個引數來判斷 

                         日期格式 : 

                         年 yyyy,月mm,日dd,小時(hh12小時制,hh24 24小時制) 分鐘 mi 秒 ss 

          舉例 :select to_date('2015/03/09','yyyy/mm/dd') from dual 

      to_char(數字) 將數字轉換成char型別 

      to_char(日期,日期格式)  將日期轉換成char型別  日期格式 可以任意 輸出的內容 根據日期的格式而定 

             舉例   select to_char(sysdate,'hh24')  輸出24小時制的當前時間的hour 

      to_number(字串數字) 將字串的數字轉換成number型別 

                       舉例    to_number('123')輸出數字 123        

   聚合函式 

        組函式會忽略空值。 
 
                  組函式可以用於任何有效的表示式。 

       如:可以對數字、字串和日期使用COUNT、MAX、MIN。 

       組函式會忽略空值。 

       避免使用 COUNT(*) ,而使用 COUNT(ROWID) 

       count(*|1|列名|rowid) 統計總行數  

       sum(列名) 求總和 

       max(列名) 求最大值 

       avg(列名) 求平均值 

       min(列名) 求最小值 

   分組(group by)      

         語法: 

   SELECT [DISTINCT] *|[列名 別名,…]  

    FROM 表名 

   [WHERE 條件] 

    [GROUP BY 分組條件] 

    [ORDER BY 列名 [ASC]|[DESC], ...]; 

    注意: 

   如果查詢中包含一個聚合函式,而所選擇的列不在聚合函式中,那麼這些列就必須出現在GROUP BY子句中。 

   聚合函式不能出現在WHERE子句中。 

    舉例 

    id,name,dept,sal 

     1  test  10  100 

     2  test1 10  200 

     3  test2 20  300 

     4  test3 30  1000 

     如果按照部門分組  相同的值被分為一組  分組的結果為三組:10,20,30 

     分組的組的數量 也就是最終輸出的結果的數量 最終的結果   
 
     dept max(sal)     其他的列 如果需要使用 必須使用聚合函式 聚合為一條記錄 
 
      10   200                          分組聚合 也就是找出組中 最大或者最小或者平均值 輸出 最終聚合的結果只有一條記錄 
 
      20   300 

     30   1000 
 
     select deptno,count(*) from emp group by deptno having count(*)>3; 
 
     將分組後的結果 在進行條件過濾 having中的條件必須是在列中能夠出現 
 
    where 是在分組之前對資料進行過濾輸出後  在分組 輸出 
 
    having條件 是在分組之後 對分組的結果進行過濾輸出 
 
  表關聯 
 
    笛卡爾方式的連線 
 
    select e.ename,d.dname  
 
    from emp e,dept d 
 
     where e.deptno=d.deptno and ename='SMITH' order by ename; 
     
  內連線 
 
    語法: 
 
   SELECT [DISTINCT] *|[列名 別名,…]  
 
    FROM 主表名 別名 
 
   [INNER] JOIN 從表名 別名 ON 連線條件 
 
   [WHERE 條件]; 

    列出所有連線表中與連線條件相匹配的資料行。 
 
   使用表別名,可以簡化語句。 
 
   內連線分類 
 
   等值連線:在連線條件中使用等號(=)運算子來比較被連線列的列值 
 
   連線條件的列名相同時,可以使用USING (列名)來簡化。 
 
   非等值連線:在連線條件中使用除等號運算子以外的其它比較運算子來比較被連線的列的列值。 

   !=、>、>=、<、<=、LIKE、BETWEEN AND、 
 
   內連線 是主表和從表的資料都匹配之後 輸出 不匹配拋棄 
 
   A                           B 
 
    id name   deptno              deptno  name 
 
    1  test            1                    1                 研發部 
 
    2  jiaozi          2                   2                測試部 
 
    3  cherry        2                 
 
    4  qian          3             
 
    select * from A a inner join B b on a.deptno=b.deptno         
 
        輸出結果為 
 
       1  test   1    研發部 
 
       2  jiaozi  2 測試部 
 
       3  cherry  2測試部 
 
       4的記錄因為在從表B中找不到所以被拋棄  
 
    select * from A a left join B b on a.deptno=b.deptno          
 
        1  test   1    研發部 

       2  jiaozi  2 測試部 
 
       3  cherry  2測試部 
 
       4  qian    3 (空) 

       4 的記錄因為在從表B中找不到   所以只有主表的記錄被輸出