<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Dict.CN 在線詞典, 英語學習, 在線翻譯

    都市淘沙者

    荔枝FM Everyone can be host

    統計

    留言簿(23)

    積分與排名

    優秀學習網站

    友情連接

    閱讀排行榜

    評論排行榜

    查詢之order by,group by和having的使用 (轉)

    (1)order by

     ORDER BY子句的語法為:

    SELECT column1, SUM(column2) FROM "list-of-tables"

    ORDER BY "column-list" [ASC | DESC];

    [ ] = optional

    ORDER BY是一個可選的子句,它允許你根據指定要order by的列來以上升或者下降的順序來顯示查詢的結果。例如:

    ASC = Ascending Order – 這個是缺省的

    DESC = Descending Order

    下面舉個例子:

    SELECT employee_id, dept, name, age, salary

    FROM employee_info

    WHERE dept = 'Sales'

    ORDER BY salary;

    這條SQL語句將從employee_info表中列dept等于'Sales'選擇employee_id,、dept、 name、 age和 salary,并且根據他們的salary按升序的順序來列出檢索結果。

    如果你想對多列排序的話,那么在列與列之間要加上逗號,比如 :

    SELECT employee_id, dept, name, age, salary

    FROM employee_info

    WHERE dept = 'Sales'

    ORDER BY salary, age DESC;

    (2)group by

    一、首先講講GROUP BY 子句語法:

    SELECT column1, SUM(column2) FROM "list-of-tables"

    GROUP BY "column-list";

    這個GROUP BY子句將集中所有的行在一起,它包含了指定列的數據以及允許合計函數來計算一個或者多個列。當然最好解釋的方法是給出一個例子啦:

    假設我們將從employee表中搜索工資最高的列,可以使用以下的SQL語句:

    SELECT max(salary), dept

    FROM employee

    GROUP BY dept;

    這條語句將在每一個單獨的部門中選擇工資最高的工資。結果他們的salary和dept將被返回。

    二、group by 從英文里理解就是分組。必須有“聚合函數”來配合才能使用,使用時至少需要一個分組標志字段。
     
    什么是“聚合函數”?
      像sum()、count()、avg()等都是“聚合函數”
      使用group by 的目的就是要將數據分類匯總。

      一般如:
        select 單位名稱,count(職工id),sum(職工工資) form [某表]
        group by 單位名稱
        這樣的運行結果就是以“單位名稱”為分類標志統計各單位的職工人數和工資總額。

      在sql命令格式使用的先后順序上,group by 先于 order by。
     
      select 命令的標準格式如下:
     
       SELECT select_list
       [ INTO new_table ]
       FROM table_source
       [ WHERE search_condition ]
       [ GROUP BY group_by_expression ]
       [ HAVING search_condition ]
       [ ORDER BY order_expression [ ASC | DESC ] ]

    三、理解group by:

    表1:

     type

     udate

     mp3

     2006-3-2

     flash

     2006-1-2

     mp3

     2006-2-2

     
    在表1中,假設要取出最后更新的某一類型(type)產品的日期
    那么就要使用group by type的方式
    select type from 表1 group by type
    但這樣就無法讀到udate
     
    再來
    select type,udate from 表1 group by type
    這種寫法是錯誤的。
    原因是type和udate 不是一對一的關系。就是說一種type有幾個udate
    所以
    selct ** group by ** 之后沒辦法組織形成新的表,不知道要取哪個udate
     
    再來
    select type,max(udate) from 表1 group by type
    這樣就正確了。
    取的是最大的udate ,一對一成立。

    四、GROUP BY... 被附加于SQL 是因為聚會函數 (如 SUM) 每次都返回所有列值的合計,沒有GROUP BY函數是不可能找到列值的單個分組的合計數。

    語法

    SELECT column,SUM(column) FROM table GROUP BY column

    -----------------------------------------------

    GROUP BY 示例

    這個 "Sales" 表:

    Company Amount
    W3Schools 5500
    IBM 4500
    W3Schools 7100

    和這個SQL語句:

    SELECT Company, SUM(Amount) FROM Sales

    返回這個結果:

    Company SUM(Amount)
    W3Schools 17100
    IBM 17100
    W3Schools 17100

    上面的代碼是不正確的,因為被返回的列不是部分合計。GROUP BY 子句將解決這個問題。

    SELECT Company,SUM(Amount) FROM Sales            GROUP BY Company

    返回結果:

    Company SUM(Amount)
    W3Schools 12600
    IBM 4500

    五、
    SQL Group by 學習 及相關應注意的地方
     
        在select 語句中可以使用group by 子句將行劃分成較小的組,然后,使用聚組函數返回每一個組的匯總信息,另外,可以使用having子句限制返回的結果集。group by 子句可以將查詢結果分組,并返回行的匯總信息Oracle 按照group by 子句中指定的表達式的值分組查詢結果。

       在帶有group by 子句的查詢語句中,在select 列表中指定的列要么是group by 子句中指定的列,要么包含聚組函數

       select max(sal),job emp group by job;
       (注意max(sal),job的job并非一定要出現,但有意義)

       查詢語句的select 和group by ,having 子句是聚組函數唯一出現的地方,在where 子句中不能使用聚組函數。

      select deptno,sum(sal) from emp where sal>1200 group by deptno having sum(sal)>8500 order by deptno;

      當在gropu by 子句中使用having 子句時,查詢結果中只返回滿足having條件的組。在一個sql語句中可以有where子句和having子句。having 與where 子句類似,均用于設置限定條件
     
      where 子句的作用是在對查詢結果進行分組前,將不符合where條件的行去掉,即在分組之前過濾數據,條件中不能包含聚組函數,使用where條件顯示特定的行。
      having 子句的作用是篩選滿足條件的組,即在分組之后過濾數據,條件中經常包含聚組函數,使用having 條件顯示特定的組,也可以使用多個分組標準進行分組。

      查詢每個部門的每種職位的雇員數
      select deptno,job,count(*) from emp group by deptno,job;

    注意:

            group by 不能對別名進行分組排序.舉例如下:

    錯誤SQL:

    SELECT to_char(BASICROLL.ROLLDATE,'yyyy-mm') AS YEARDATE,

       DEPTDICT.CNNAME DEPTNAME,
        COUNT(BASICROLL.ID) AS PROJCOUNT

    FROM BASICROLL LEFT JOIN DEPTDICT ON BASICROLL.ARRDEPTDICTID=DEPTDICT.ID

    WHERE DEPTDICT.CNNAME <> '無'

    GROUP BY YEARDATE, DEPTDICT.CNNAME                      1
    ORDER BY YEARDATE DESC                                                  2

     作者原意是將記錄按年月,部門進行分組.并倒序排序.但上面的GROUP BY因為用了別名,所以會提示SQL語法錯誤.如果將上面1,2二句改成:
       

    GROUP BY BASICROLL.ROLLDATE, DEPTDICT.CNNAME                      3

    ORDER BY BASICROLL.ROLLDATE  DESC                                                4

    如上3,4二句,又會不合原意,因為BASICROLL.ROLLDATE  包括了年月日.這樣分組得出的是按年月日來分組,而不是單純的年月了.所以正確的SQL應該是這樣的.

    正確的SQL

    SELECT to_char(BASICROLL.ROLLDATE,'yyyy-mm') AS YEARDATE,

       DEPTDICT.CNNAME DEPTNAME,
        COUNT(BASICROLL.ID) AS PROJCOUNT

    FROM BASICROLL LEFT JOIN DEPTDICT ON BASICROLL.ARRDEPTDICTID=DEPTDICT.ID

    WHERE DEPTDICT.CNNAME <> '無'

    GROUP BY to_char(BASICROLL.ROLLDATE,'yyyy-mm'), DEPTDICT.CNNAME                     

    ORDER BY to_char(BASICROLL.ROLLDATE,'yyyy-mm') DESC                                                 
    以上的注意部分為本人在項目開發過程中經驗所得.

    來自:http://gyapollo.yculblog.com/post.1116750.html

    六、例子

    1> select * from bank_info
    2> go
     bankno acctround
     ------ ---------
     123456 1        
     123456 2        


     

    (2 rows affected)
    1> select * from bank_info where acctround='1' group by bankno order by bankno
    2> go
     bankno acctround
     ------ ---------
     123456 1        
     123456 2        


     

    (2 rows affected)
    1> select * from bank_info where acctround='1' order by bankno
    2> go
     bankno acctround
     ------ ---------
     123456 1        


     

    (1 row affected)
    1> select * from bank_info
    2> go
     bankno acctround
     ------ ---------
     123456 1        
     123456 2        


     

    (2 rows affected)
    1> select * from bank_info where acctround='1' group by bankno,acctround order by bankno
    2> go
     bankno acctround
     ------ ---------
     123456 1        


     

    (1 row affected)


    group by bankno,acctround的意思是找出bankno,acctround兩列完全相同的不同行作為一組.那上面的數據就分成兩組了,因為acctround不同,而結果需要acctround='1'的組.所以只有一行結果.如果是group by bankno,那么兩行會合成一行.它并沒有先通過where分析出只有一行符合結果集,再group就只有一行結果了.這里的問題是where和group誰先誰后分析的問題?在這個問題的上下文中,本來的group by bankno就沒有任何意義.其實是這樣的: 

    或者是: 

    select bankno,sum(money) from bankdiff group by bankno; 

    又或者是: 

    select bankno,acctround,sum(money) from bankdiff where acctround='1' group by bankno,acctround;
     

    不可能指定acctround又不把它放在groub by中的.

     

    1> select * from bank_info group by bankno
    2> go
     bankno acctround
     ------ ---------
     123456 1        
     123456 2 


     

    可見這個group by沒有意義.因為它有select *,而acctround不一樣,就不能只顯示一行出來.把select * 改成 select bankno就只有一行結果了.


     

    總結:使用group by必需明確你分組的意義,是否有必要這一個列或幾個列來確定一個有意義的組,而需要顯示的結果行的列是否和group by子句中的列名相沖突.一般不在group by子句中的列名都不會直接在select中顯示出來.因為它們要分成一組來或者做些運算再顯示.如sum(money)等.

    (3)having

    一、下面先給出HAVING子句的語法:

    SELECT column1, SUM(column2) FROM "list-of-tables"

    GROUP BY "column-list"

    HAVING "condition";

    這個HAVING子句允許你為每一個組指定條件,換句話說,可以根據你指定的條件來選擇行。如果你想使用HAVING子句的話,它應該處再GROUP BY子句之后。

    下面將以一個例子來解釋HAVING子句。假設我們的employee表中包含雇員的name、departmen、salary和age。如果你想為每個部門中每個雇員選擇平均工資的話,你可以使用下面的SQL語句:

    SELECT dept, avg(salary)

    FROM employee

    GROUP BY dept;

    當然,如果你還想只計算和顯示salary大于20000的平均工資的話,你還可以加上HAVING子句:

    SELECT dept, avg(salary)

    FROM employee

    GROUP BY dept

    HAVING avg(salary) > 20000;

    二、HAVING... 被附加到SQL語句是因為WHER關鍵字不能被用于聚會函數 (如 SUM),并且沒有HAVING...它將不可能測試結果條件。

    語法:

    SELECT column,SUM(column) FROM table            GROUP BY column            HAVING SUM(column) condition value

    這個 "Sales" 表:

    Company Amount
    W3Schools 5500
    IBM 4500
    W3Schools 7100

    和這個SQL語句:

    SELECT Company,SUM(Amount) FROM Sales            GROUP BY Company            HAVING SUM(Amount)>10000

    返回這個結果

    Company SUM(Amount)
    W3Schools 12600

     

    posted on 2007-09-10 09:42 都市淘沙者 閱讀(857) 評論(0)  編輯  收藏 所屬分類: Oracle/Mysql/Postgres/

    主站蜘蛛池模板: 免费久久人人爽人人爽av| 亚洲va无码专区国产乱码| 1000部禁片黄的免费看| 一边摸一边桶一边脱免费视频| 亚洲自国产拍揄拍| 久久久久久亚洲精品成人| 中文字幕在亚洲第一在线| 国产jizzjizz视频免费看| 成人免费一级毛片在线播放视频| 成在人线av无码免费高潮喷水| 老妇激情毛片免费| 亚洲精品GV天堂无码男同| 亚洲另类古典武侠| 亚洲精品不卡视频| 亚洲午夜视频在线观看| 亚洲精品无码专区久久久| 亚洲精品偷拍视频免费观看 | 大香人蕉免费视频75| 久久免费看黄a级毛片| 免费无码成人AV在线播放不卡 | 国产精品亚洲综合专区片高清久久久| 国内外成人免费视频| 久久WWW色情成人免费观看| h在线观看视频免费网站| 免费无码中文字幕A级毛片| 免费无码一区二区三区| 67194成手机免费观看| 最近中文字幕高清免费中文字幕mv | a级毛片高清免费视频就| 成年女人A毛片免费视频| 久久久久久久久久久免费精品| 成人福利在线观看免费视频| 免费国产在线精品一区| 特级毛片在线大全免费播放| 一级A毛片免费观看久久精品| 色www免费视频| 国产免费久久精品丫丫| 三级毛片在线免费观看| 国产高清不卡免费视频| 91香蕉国产线在线观看免费 | 亚洲粉嫩美白在线|