資料庫having用法
㈠ 資料庫中where與having區別~~~
1.類型:
「Where」是一個約束聲明,在查詢資料庫的結果返回之前對資料庫中的查詢條件進行約束,即在結果返回之前起作用,且where後面不能使用「聚合函數」;
「Having」是一個過濾聲明,所謂過濾是在查詢資料庫的結果返回之後進行過濾,即在結果返回之後起作用,並且having後面可以使用「聚合函數」。
2.使用的角度:
where後面之所以不能使用聚合函數是因為where的執行順序在聚合函數之前。
(1)資料庫having用法擴展閱讀
處理系統:
資料庫是一個單位或是一個應用領域的通用數據處理系統,它存儲的是屬於企業和事業部門、團體和個人的有關數據的集合。資料庫中的數據是從全局觀點出發建立的,按一定的數據模型進行組織、描述和存儲。
其結構基於數據間的自然聯系,從而可提供一切必要的存取路徑,且數據不再針對某一應用,而是面向全組織,具有整體的結構化特徵。
資料庫中的數據是為眾多用戶所共享其信息而建立的,已經擺脫了具體程序的限制和制約。不同的用戶可以按各自的用法使用資料庫中的數據。
多個用戶可以同時共享資料庫中的數據資源,即不同的用戶可以同時存取資料庫中的同一個數據。數據共享性不僅滿足了各用戶對信息內容的要求,同時也滿足了各用戶之間信息通信的要求。
主要特點:
1、實現數據共享
數據共享包含所有用戶可同時存取資料庫中的數據,也包括用戶可以用各種方式通過介面使用資料庫,並提供數據共享。
2、減少數據的冗餘度
同文件系統相比,由於資料庫實現了數據共享,從而避免了用戶各自建立應用文件。減少了大量重復數據,減少了數據冗餘,維護了數據的一致性。
3、數據的獨立性
數據的獨立性包括邏輯獨立性(資料庫中資料庫的邏輯結構和應用程序相互獨立)和物理獨立性(數據物理結構的變化不影響數據的邏輯結構)。
4、數據實現集中控制
文件管理方式中,數據處於一種分散的狀態,不同的用戶或同一用戶在不同處理中其文件之間毫無關系。利用資料庫可對數據進行集中控制和管理,並通過數據模型表示各種數據的組織以及數據間的聯系。
5、數據一致性和可維護性,以確保數據的安全性和可靠性
主要包括:①安全性控制:以防止數據丟失、錯誤更新和越權使用;②完整性控制:保證數據的正確性、有效性和相容性;③並發控制:使在同一時間周期內,允許對數據實現多路存取,又能防止用戶之間的不正常交互作用。
6、故障恢復
由資料庫管理系統提供一套方法,可及時發現故障和修復故障,從而防止數據被破壞。資料庫系統能盡快恢復資料庫系統運行時出現的故障,可能是物理上或是邏輯上的錯誤。比如對系統的誤操作造成的數據錯誤等。
㈡ Having 和子查詢的比較
首先這個跟with as 沒什麼關系啊,就是一個group by 與 having 合用
你用的是oracle資料庫吧,看樣子是,我把你數據復制過來,運行是有結果的
現在我只要SUM (y)小於200的,當然可以用嵌套查詢,比如
select a.* from
(SELECT x, SUM (y) total_y
FROM t
GROUP BY x) a
where a.total_y<200
然後資料庫引用了having 最後如果
SELECT x, SUM (y) total_y
FROM t
GROUP BY x having SUM(y)<200
也是可以的
這個having 必須要配合group by 使用,否則無效,當然了,這個sum也可以使用其他聚合函數,比如max,min,avg,count 等等,不懂再追問吧
㈢ 在oracle中where 子句和having子句中的區別
在oracle中where 子句和having子句中的區別
1.where 不能放在GROUP BY 後面
2.HAVING 是跟GROUP BY 連在一起用的,放在GROUP BY 後面,此時的作用相當於WHERE
3.WHERE 後面的條件中不能有聚集函數,比如SUM(),AVG()等,而HAVING 可以
Where和Having都是對查詢結果的一種篩選,說的書面點就是設定條件的語句。下面分別說明其用法和異同點。註:本文使用欄位為oracle資料庫中默認用戶scott下面的emp表,sal代表員工工資,deptno代表部門編號。
一、聚合函數
說明前我們先了解下聚合函數:聚合函數有時候也叫統計函數,它們的作用通常是對一組數據的統計,比如說求最大值,最小值,總數,平均值(
MAX,MIN,COUNT, AVG)等。這些函數和其它函數的根本區別就是它們一般作用在多條記錄上。簡單舉個例子:SELECT SUM(sal) FROM emp,這里的SUM作用是統計emp表中sal(工資)欄位的總和,結果就是該查詢只返回一個結果,即工資總和。通過使用GROUP BY 子句,可以讓SUM 和 COUNT 這些函數對屬於一組的數據起作用。
二、where子句
where自居僅僅用於從from子句中返回的值,from子句返回的每一行數據都會用where子句中的條件進行判斷篩選。where子句中允許使用比較運算符(>,<,>=,<=,<>,!=|等)和邏輯運算符(and,or,not)。由於大家對where子句都比較熟悉,在此不在贅述。
三、having子句
having子句通常是與order by 子句一起使用的。因為having的作用是對使用group by進行分組統計後的結果進行進一步的篩選。舉個例子:現在需要找到部門工資總和大於10000的部門編號?
第一步:
select deptno,sum(sal) from emp group by deptno;
篩選結果如下:
DEPTNO SUM(SAL)
------ ----------
30 9400
20 10875
10 8750
可以看出我們想要的結果了。不過現在我們如果想要部門工資總和大於10000的呢?那麼想到了對分組統計結果進行篩選的having來幫我們完成。
第二步:
select deptno,sum(sal) from emp group by deptno having sum(sal)>10000;
篩選結果如下:
DEPTNO SUM(SAL)
------ ----------
20 10875
當然這個結果正是我們想要的。
四、下面我們通過where子句和having子句的對比,更進一步的理解它們。
在查詢過程中聚合語句(sum,min,max,avg,count)要比having子句優先執行,簡單的理解為只有有了統計結果後我才能執行篩選啊。where子句在查詢過程中執行優先順序別優先於聚合語句(sum,min,max,avg,count),因為它是一句一句篩選的。HAVING子句可以讓我們篩選成組後的對各組數據篩選。,而WHERE子句在聚合前先篩選記錄。如:現在我們想要部門號不等於10的部門並且工資總和大於8000的部門編號?
我們這樣分析:通過where子句篩選出部門編號不為10的部門,然後在對部門工資進行統計,然後再使用having子句對統計結果進行篩選。
select deptno,sum(sal) from emp
where deptno!='10' group by deptno
having sum(sal)>8000;
篩選結果如下:
DEPTNO SUM(SAL)
------ ----------
30 9400
20 10875
不做太多解釋了,這個簡單的小例子能夠很好的說明where和having的作用。
五、異同點
它們的相似之處就是定義搜索條件,不同之處是where子句為單個篩選而having子句與組有關,而不是與單個的行有關。
最後:理解having子句和where子句最好的方法就是基礎select語句中的那些句子的處理次序:where子句只能接收from子句輸出的數據,而having子句則可以接受來自group by,where或者from子句的輸入。
㈣ 資料庫的group 和group by 的用法
Group By語句從英文的字面意義上理解就是「根據(by)一定的規則進行分組(Group)」。
它的作用是通過一定的規則將一個數據集劃分成若干個小的區域,然後針對若干個小區域進行數據處理。注意:group by 是先排序後分組。
舉例子說明:如果要用到group by 一般用到的就是「每這個字」 例如說明現在有一個這樣的表:每個部門有多少人,就要用到分組的技術
selectDepartmentIDas「部門名稱」。
COUNT(*) as「個數」 from BasicDepartment group by DepartmentID
這個就是使用了group by +欄位進行了分組,其中我們就可以理解為我們按照了部門的名稱ID
DepartmentID將數據集進行了分組;然後再進行各個組的統計數據分別有多少;
如果不用count(*)而用類似下面的語法
selectDepartmentID,
將會出現錯誤
消息8120,級別16,狀態1,第1行
選擇列表中的列「BasicDepartment。DepartmentName」無效,因為該列沒有包含在聚合函數或 GROUP BY 子句中。
(4)資料庫having用法擴展閱讀
結構化查詢語言(Structured Query Language)簡稱sql(發音:/ˈes kjuː ˈel/ "S-Q-L"),是一種特殊目的的編程語言,是一種資料庫查詢和程序設計語言,用於存取數據以及查詢、更新和管理關系資料庫系統;同時也是資料庫腳本文件的擴展名。
結構化查詢語言是高級的非過程化編程語言,允許用戶在高層數據結構上工作。它不要求用戶指定對數據的存放方法,也不需要用戶了解具體的數據存放方式。
所以具有完全不同底層結構的不同資料庫系統, 可以使用相同的結構化查詢語言作為數據輸入與管理的介面。結構化查詢語言語句可以嵌套,這使它具有極大的靈活性和強大的功能。
㈤ SQL中Having和where的用法
這個是用在聚合函數的用法。當我們在用聚合函數的時候,一般都要用到groupby先進行分組,然後再進行聚合函數的運算。運算完後就要用到having的用法了,就是進行判斷了,例如說判斷聚合函數的值是否大於某一個值等等。
selectcustomer_name,sum(balance)
frombalance
groupbycustomer_name
havingbalance>200;
這個是銀行資料庫的例子
㈥ sql中「having」的用法是什麼
這個是用在聚合函數的用法。當我們在用聚合函數的時候,一般都要用到GROUP BY 先進行分組,然後再進行聚合函數的運算。運算完後就要用到HAVING 的用法了,就是進行判斷了。
㈦ sql中having用法
HAVING語句通常與GROUP BY語句聯合使用,用來過濾由GROUP BY語句返回的記錄集。
HAVING語句的存在彌補了WHERE關鍵字不能與聚合函數聯合使用的不足。
語法:
SELECT column1, column2, ... column_n, aggregate_function (expression)
FROM tables
WHERE predicates
GROUP BY column1, column2, ... column_n
HAVING condition1 ... condition_n;
同樣使用本文中的學生表格,如果想查詢平均分高於80分的學生記錄可以這樣寫:
SELECT id, COUNT(course) as numcourse, AVG(score) as avgscore
FROM student
GROUP BY id
HAVING AVG(score)>=80;
在這里,如果用WHERE代替HAVING就會出錯。
數據操縱
數據操縱語言是完成數據操作的命令,一般分為兩種類型的數據操縱。
1、數據檢索(常稱為查詢):尋找所需的具體數據。
2、數據修改:插入、刪除和更新數據。
數據操縱語言一般由 INSERT(插入)、 DELETE(刪除)、 UPDATE(更新)、 SELECT(檢索,又稱查詢)等組成。由於 SELECT經常使用,所以一般將它稱為查詢(檢索)語言並單獨出現。
㈧ GROUP BY,WHERE,HAVING之間的區別和用法
having子句與where有相似之處但也有區別,都是設定條件的語句。
在查詢過程中聚合語句(sum,min,max,avg,count)要比having子句優先執行.而where子句在查詢過程中執行優先順序別優先於聚合語句(sum,min,max,avg,count)。
簡單說來:
where子句:
select sum(num) as rmb from order where id>10
//只有先查詢出id大於10的記錄才能進行聚合語句
having子句:
select reportsto as manager, count(*) as reports from employees
group by reportsto having count(*) > 4
以northwind庫為例.having條件表達示為聚合語句。肯定的說having子句查詢過程執行優先順序別低於聚合語句。
再換句說話說把上面的having換成where則會出錯。統計分組數據時用到聚合語句。
對分組數據再次判斷時要用having。如果不用這些關系就不存在使用having。直接使用where就行了。
having就是來彌補where在分組數據判斷時的不足。因為where執行優先順序別要快於聚合語句。
聚合函數,這是必需先講的一種特殊的函數:
例如SUM, COUNT, MAX, AVG等。這些函數和其它函數的根本區別就是它們一般作用在多條記錄上。
SELECT SUM(population) FROM tablename
這里的SUM作用在所有返回記錄的population欄位上,結果就是該查詢只返回一個結果,即所有
國家的總人口數。 通過使用GROUP BY 子句,可以讓SUM 和 COUNT 這些函數對屬於一組的數據起作用。
當你指定 GROUP BY region 時, 屬於同一個region(地區)的一組數據將只能返回一行值.
也就是說,表中所有除region(地區)外的欄位,只能通過 SUM, COUNT等聚合函數運算後返回一個值.
HAVING子句可以讓我們篩選成組後的各組數據.
HAVING子句在聚合後對組記錄進行篩選
而WHERE子句在聚合前先篩選記錄.也就是說作用在GROUP BY 子句和HAVING子句前
看下面這幾個例子吧:
一、顯示每個地區的總人口數和總面積.
SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
先以region把返回記錄分成多個組,這就是GROUP BY的字面含義。分完組後,然後用聚合函數對每組中的不同欄位(一或多條記錄)作運算。
二、 顯示每個地區的總人口數和總面積.僅顯示那些面積超過1000000的地區。
SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
HAVING SUM(area)>1000000
在這里,我們不能用where來篩選超過1000000的地區,因為表中不存在這樣一條記錄。
相反,HAVING子句可以讓我們篩選成組後的各組數據.
以下示例使用的資料庫是MySQL 5。
數據表:student
表結構:
Field Name DataType Len
id int 20
name varchar 25
major varchar 25
score int 20
sex varchar 20
表數據:
編號/姓名/專業/學分/性別
id name major score sex
1 jak Chinese 40 f
2 rain Math 89 m
3 leo Phy 78 f
4 jak Math 76 f
5 rain Chinese 56 m
6 leo Math 97 f
7 jak Phy 45 f
8 jak Draw 87 f
9 leo Chinese 45 f
現在我們要得到一個視圖:
要求查詢性別為男生,並且列出每個學生的總成績:
SQL:
select s.*,sum(s.score) from student s where sex='f' group by s.name
Result:
id name major score sex sum(s.score)
1 jak Chinese 40 f 248
3 leo Phy 78 f 220
可以看到總共查到有兩組,兩組的學生分別是jak和leo,每一組都是同一個學生,這樣我們就可以使用聚合函數了。
只有使用了group by語句,才能使用如:count()、sum()之類的聚合函數。
下面我們再對上面的結果做進一步的篩選,只顯示總分數大於230的學生:
SQL:
select s.*,sum(s.score) from student s where sex='f' group by s.name having sum(s.score)>230
Result:
id name major score sex sum(s.score)
1 jak Chinese 40 f 248
可見having於where的功能差不多。
結論:
1.WHERE 子句用來篩選 FROM 子句中指定的操作所產生的行。
2.GROUP BY 子句用來分組 WHERE 子句的輸出。
3.HAVING 子句用來從分組的結果中篩選行。