查詢之order by,group by和having的使用 (轉(zhuǎn))
(1)order by
ORDER BY子句的語法為:
SELECT column1, SUM(column2) FROM "list-of-tables"
ORDER BY "column-list" [ASC | DESC];
[ ] = optional
ORDER BY是一個可選的子句,它允許你根據(jù)指定要order by的列來以上升或者下降的順序來顯示查詢的結(jié)果。例如:
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,并且根據(jù)他們的salary按升序的順序來列出檢索結(jié)果。
如果你想對多列排序的話,那么在列與列之間要加上逗號,比如 :
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子句將集中所有的行在一起,它包含了指定列的數(shù)據(jù)以及允許合計函數(shù)來計算一個或者多個列。當然最好解釋的方法是給出一個例子啦:
假設(shè)我們將從employee表中搜索工資最高的列,可以使用以下的SQL語句:
SELECT max(salary), dept
FROM employee
GROUP BY dept;
這條語句將在每一個單獨的部門中選擇工資最高的工資。結(jié)果他們的salary和dept將被返回。
二、group by 從英文里理解就是分組。必須有“聚合函數(shù)”來配合才能使用,使用時至少需要一個分組標志字段。
什么是“聚合函數(shù)”?
像sum()、count()、avg()等都是“聚合函數(shù)”
使用group by 的目的就是要將數(shù)據(jù)分類匯總。
一般如:
select 單位名稱,count(職工id),sum(職工工資) form [某表]
group by 單位名稱
這樣的運行結(jié)果就是以“單位名稱”為分類標志統(tǒng)計各單位的職工人數(shù)和工資總額。
在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:
在表1中,假設(shè)要取出最后更新的某一類型(type)產(chǎn)品的日期
那么就要使用group by type的方式
select type from 表1 group by type
但這樣就無法讀到udate
再來
select type,udate from 表1 group by type
這種寫法是錯誤的。
原因是type和udate 不是一對一的關(guān)系。就是說一種type有幾個udate
所以
selct ** group by ** 之后沒辦法組織形成新的表,不知道要取哪個udate
再來
select type,max(udate) from 表1 group by type
這樣就正確了。
取的是最大的udate ,一對一成立。
|
四、GROUP BY... 被附加于SQL 是因為聚會函數(shù) (如 SUM) 每次都返回所有列值的合計,沒有GROUP BY函數(shù)是不可能找到列值的單個分組的合計數(shù)。
語法
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 |
返回這個結(jié)果:
Company | SUM(Amount) |
---|---|
W3Schools | 17100 |
IBM | 17100 |
W3Schools | 17100 |
上面的代碼是不正確的,因為被返回的列不是部分合計。GROUP BY 子句將解決這個問題。
SELECT Company,SUM(Amount) FROM Sales GROUP BY Company |
返回結(jié)果:
Company | SUM(Amount) |
---|---|
W3Schools | 12600 |
IBM | 4500 |
五、
六、例子
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兩列完全相同的不同行作為一組.那上面的數(shù)據(jù)就分成兩組了,因為acctround不同,而結(jié)果需要acctround='1'的組.所以只有一行結(jié)果.如果是group by bankno,那么兩行會合成一行.它并沒有先通過where分析出只有一行符合結(jié)果集,再group就只有一行結(jié)果了.這里的問題是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就只有一行結(jié)果了.
總結(jié):使用group by必需明確你分組的意義,是否有必要這一個列或幾個列來確定一個有意義的組,而需要顯示的結(jié)果行的列是否和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子句允許你為每一個組指定條件,換句話說,可以根據(jù)你指定的條件來選擇行。如果你想使用HAVING子句的話,它應(yīng)該處再GROUP BY子句之后。
下面將以一個例子來解釋HAVING子句。假設(shè)我們的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關(guān)鍵字不能被用于聚會函數(shù) (如 SUM),并且沒有HAVING...它將不可能測試結(jié)果條件。
語法:
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 |
返回這個結(jié)果
Company | SUM(Amount) |
---|---|
W3Schools | 12600 |
posted on 2007-09-10 09:42 都市淘沙者 閱讀(859) 評論(0) 編輯 收藏 所屬分類: Oracle/Mysql/Postgres/