1. 程式人生 > >having子句詳解&執行順序

having子句詳解&執行順序

1. Having 子句用於對查詢表結構進行處理,可用於分組之後,多和group by一起使用,放在group by之後,可包含聚合函式。
2. Having子句可用於group by之後,語法類似於where子句,where子句用於group by 之前。
3. having子句種的欄位必須是上層結果表中有的。
4. having子句中可以使用聚合函式,where語句中不可以使用聚合函式
5. Having子句執行順序:where語句>group by>聚合函式>Having
6. Mysql中group by之後會自動對分組的資料進行聚合處理,選取每組的第一個。(Mysql語法不嚴謹,Hive中未被分組的欄位就必須採用聚合處理。)

SQL中各字句執行順序

select col_name from table
where col_name > xxx
group by col_name
having ...
order by ... desc

如下將通過例項對Having子句進行理解

1.建立資料表

/*
Navicat MySQL Data Transfer

Source Server         : arvin
Source Server Version : 50624
Source Host           : localhost:3306
Source Database       : blog

Target Server Type    : MYSQL
Target Server Version : 50624
File Encoding         : 65001

Date: 2017-11-07 10:02:24
*/
SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for test -- ---------------------------- DROP TABLE IF EXISTS `test`; CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `score` varchar(255) DEFAULT NULL, `num` varchar(255
) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
-- ---------------------------- -- Records of test -- ---------------------------- INSERT INTO `test` VALUES ('1', 'zhangsan', '80', 'Math'); INSERT INTO `test` VALUES ('2', 'zhangsan', '80', 'English'); INSERT INTO `test` VALUES ('3', 'zhangsan', '90', 'Code'); INSERT INTO `test` VALUES ('4', 'lisi', '70', 'Math'); INSERT INTO `test` VALUES ('5', 'lisi', '80', 'English'); INSERT INTO `test` VALUES ('6', 'lisi', '100', 'Code'); INSERT INTO `test` VALUES ('7', 'wangwu', '80', 'Math'); INSERT INTO `test` VALUES ('8', 'wangwu', '80', 'English'); INSERT INTO `test` VALUES ('9', 'wangwu', '90', 'Code');

這裡寫圖片描述

在不使用group by的情況下,使用having子句

SELECT t.*
from test t
HAVING t.score>75
;

結果:
這裡寫圖片描述

結論:在不搭配group by 的情況下,使用having子句僅僅對結果進行限制,等價於where條件。

having子句理解

  • 題目1:找出每一門科目(num)均大於75分的學生(score)。

因為having可以對group by的結果進行處理,有如下語句:

SELECT t.*
from test t
GROUP BY t.`name`
HAVING t.score>75
;

結果:
這裡寫圖片描述

看似並沒有問題,那麼我們把資料改一下,把圖中兩個資料改一下:
這裡寫圖片描述
再次執行,發現結果不對了,
這裡寫圖片描述

正確結果應該仍然是zhangsan、lisi,這是為什麼呢?
原因很簡單:參考第六點關於Mysql中group by函式的不嚴謹性。
having子句是對之前的結果表進行處理,而我們只執行having之前的結果,即group by的結果,就會發現如下:
這裡寫圖片描述
而having子句對這個結果進行判斷,在他看來只有三條記錄,而每個記錄都是大於75的,因而會出現剛才錯誤的結果。
所以正確的演算法就是取得最小的成績大於75即可。

SELECT `name`,MIN(score) as score
from test t
GROUP BY t.`name`
HAVING score>75
;

如下圖:
這裡寫圖片描述
注:having子句的欄位必須是結果表中有的。

having子句與聚合函式使用

題目2:算出平均分>80的學生。

SELECT `name`, score
from test t
GROUP BY t.`name`
HAVING AVG(score)>80
;

這裡我們可以發現:
聚合函式AVG的執行順序實在Having之前。

題目3:計算平均分>80且總分大於250的。

SELECT `name`, score
from test t
GROUP BY t.`name`
HAVING AVG(score)>80
AND SUM(score)>250
;

相關推薦

having子句&執行順序

1. Having 子句用於對查詢表結構進行處理,可用於分組之後,多和group by一起使用,放在group by之後,可包含聚合函式。 2. Having子句可用於group by之後,語法類似於where子句,where子句用於group by 之前。

Java基礎:由JVM記憶體模型執行緒安全

1.前言 最近在研究JVM記憶體模型和Java基礎知識。主要講的是執行緒共享變數與執行緒私有變數以及如何寫出執行緒安全的程式碼。這裡列出一條規則,“類中的成員變數,也叫例項變數,也叫全域性變數,它是非執行緒安全,是所有執行緒共享的變數,定義在方法中的私有變數是執行緒安全的,是每個執行緒私

SQL查詢語句where,group by,having,order by的執行順序和編寫順序

當一個查詢語句同時出現了where,group by,having,order by的時候,執行順序和編寫順序。 一、使用count(列名)當某列出現null值的時候,count(*)仍然會計算,但是count(列名)不會。 二、資料分組(group by ): sel

支付寶整合過程——執行DEMO

前言,夢想是需要堅持的,在路上,一路前行。加油。這兩天軟體需要整合支付寶了,第一次整合,過程還是挺簡單的,不過由於支付寶官方文件寫的不夠清晰,也是走了一些彎路,下面把過程寫出來分享給大家一、申請移動支付許可權首先登入【支付寶開放平臺】http://open.alipay.co

乾貨分享:執行緒的開始和建立

C#多執行緒之旅目錄: C#多執行緒之旅(5)——同步機制介紹 C#多執行緒之旅(6)——詳解多執行緒中的鎖 更多文章正在更新中,敬請期待...... C#多執行緒之旅(2)——建立和開始執行緒 程式碼下載 第一篇~第三篇的程式碼示例: 一、執行緒的建立和開始

執行——執行緒基本概念

0. 簡介 這個系列開始來講解 Java 多執行緒的知識,這節就先講解多執行緒的基本知識。 1. 程序與執行緒 1.1 什麼是程序? 程序就是在執行過程中的程式,就好像手機執行中的微信,QQ,這些就叫做程序。 1.2 什麼是執行緒? 執行緒就是程序的執行單元,就好像一個音樂軟體可以聽音樂,下載音樂,這些任務

執行緒池的作用及Java中如何使用執行緒池

![](https://img2020.cnblogs.com/other/1815316/202101/1815316-20210114083352253-122112091.png) 服務端應用程式(如資料庫和 Web 伺服器)需要處理來自客戶端的高併發、耗時較短的請求任務,所以頻繁的建立處理這些請求的所

js 程序執行順序實現

操作系統 def back 變量 line 順序實現 down strong 瀏覽器 函數的聲明和調用 JavaScript是一種描述型腳本語言,由瀏覽器進行動態的解析與執行。函數的定義方式大體有以下兩種,瀏覽器對於不同的方式有不同的解析順序。 代碼如下: //“定義式”

javascript運行機制之執行順序

onload 預編譯 c# step 而且 () 我們 術語 aaa JavaScript是一種描述型腳本語言,它不同於java或C#等編譯性語言,它不需要進行編譯成中間語言,而是由瀏覽器進行動態地解析與執行。那麽JavaScript是怎麽來進行解析的嗎?它的執行順序又是如

Java Web專案啟動執行順序

一、web.xml配置節點簡介 (1) context-param 格式定義 <context-param> <param-name>contextConfigLocation</param-name> <param-value>c

DQL中的執行順序

引言 這不是一個什麼多深的技術問題,多麼牛叉的程式設計能力。這跟一個人的開發能力也沒有非常必然的直接關係,但是知道這些會對你的SQL編寫,排憂及優化上會有很大的幫助。它不是一個複雜的知識點,但是一個非常基礎的SQL根基。不瞭解這些,你一直用普通水泥蓋

js 程式執行順序實現

轉自:http://www.jb51.net/article/36755.htm 函式的宣告和呼叫 JavaScript是一種描述型指令碼語言,由瀏覽器進行動態的解析與執行。函式的定義方式大體有以下兩種,瀏覽器對於不同的方式有不同的解析順序。 程式碼如下: 複製程式碼 程式碼如下

Java異常機制--try catch finally 執行順序

引言 關於try catch finally 執行順序的筆試面試題目非常的多,我曾經在牛客網刷題的時候不止一次的碰到過,而且不止一次的做錯過,這裡面需要涉及的細節如果不弄清楚每次做題就會產生似是而非的感覺。這次查閱了很多相關資料,關於try catch fin

【原創】Junit4二:Junit4 Runner以及test case執行順序和原始碼理解

1 package com.citi.risk.services.credit.facility.impl; 2 3 import java.io.Closeable; 4 import java.io.IOException; 5 6 import org.juni

Java技術_基礎技術(0003)_類執行順序+例項(阿里面試題)+詳細講解+流程圖

基礎技術: 對於java類各個成員的執行順序,現拿出阿里的面試題作為樣例(例子非常好,是用心出的題),在這裡重新說明一下java類執行順序的原則。 原始碼下載(包含題、結果、分析過程)

java中finally與return的執行順序

一些準備知識:     首先為了說明白java中finally與return的執行順序是怎樣的這個問題,我們需要做一點準備工作。     java方法是在棧幀中執行,棧幀是執行緒私有棧的單位,執行方法的執行緒會為每一個方法分配一小塊棧空間來作為該方法執行時的記憶體空間,棧幀

java類的執行順序、語句執行順序

本文講解Java中類的執行順序 順序應該是這樣的:父類Static->子類static->父類預設{}->父類建構函式->子類預設{}->子類建構函式 所以上面的例子列印順序應該是這樣的: parent static block 父類Stati

JS中的async/await的執行順序

雖然大家知道async/await,但是很多人對這個方法中內部怎麼執行的還不是很瞭解,本文是我看了一遍技術部落格理解 JavaScript 的 async/await(如果對async/await不熟悉可以先看下http://es6.ruanyifeng.com/#docs/async)後拓展了一下,我理了一

JavaScript的任務、微任務、佇列以及程式碼執行順序

摘要: 理解JS的執行順序。 作者:前端小智 原文:詳解JavaScript的任務、微任務、佇列以及程式碼執行順序 思考下面

netty中Pipeline的ChannelHandler執行順序案例

一、netty的Pipeline模型 netty的Pipeline模型用的是責任鏈設計模式,當boss執行緒監控到繫結埠上有accept事件,此時會為該socket連線例項化Pipeline,並將InboundHandler和OutboundHandler按序載入到Pipeline中,然後將該socket連