MySQL之一道關於GROUP BY的經典面試題

2021-07-31 11:59:30 字數 1240 閱讀 7615

六月的大師兄

2017-05-02 06:31

有一張shop表如下,有三個欄位article,author,price。選出每個author的price最高的記錄(要包含所有字段)。

乍一看,一下就想到了這不就是個group by語句和max聚合函式的應用麼。

所以,我當時寫下如下sql語句:

結果一執行,報錯如下:

"column 'article' must be in the group by list"

當然,這個問題並不是在所有版本的mysql server上都會出現,但畢竟這條sql語句是有可能會出錯的。mysql的官方文件 mysql handling of group by對這個問題講解的很清楚詳細。

為什麼不對呢,這就需要我們注意一點,在返回集字段中,這些字段要麼就要包含在group by語句的後面,作為分組的依據,要麼就要被包含在聚合函式中。我們可以將group by操作想象成如下的乙個過程,首先系統根據select語句得到乙個結果集,然後根據分組字段,將具有相同分組欄位的記錄歸併成了一條記錄。這個時候剩下的那些不存在與group by語句後面作為分組依據的字段就有可能出現多個值,但是目前一種分組情況只有一條記錄,乙個資料格是無法放入多個數值的,所以這裡就需要通過一定的處理將這些多值的列轉化成單值,然後將其放在對應的資料格中,那麼完成這個步驟的就是聚合函式,這也就是為什麼這些函式叫聚合函式了。

好了,我們知道了上述sql為什麼是錯的了,現在我們來說這道題正確的sql語句:

由於子查詢在有些時候,效率會很低,所以最後提供的方法是用left join語句。

上述left join(左連線)語句的原理是:

當 s1.price 是當前author的最大值時,就沒有 s2.price比它還要大,所以此時s2的rows的值都會是null。

一道一直沒弄明白的sql 有關group

我的答案 我的想法就是先把錶按照emp no給合併起來,然後對這個新錶t進行篩選最大的工資並且按照部門分組。select t.dept no,t.emp no,max t.salary as maxsalary from select d.dept no,d.emp no,s.salary from...

一道關於訊號的題

用fork建立兩個子程序,呼叫signal 讓父程序接收鍵盤上的中斷訊號 control c 捕捉到訊號後父程序用kill 向子程序傳送自定義訊號,子程序捕捉到訊號後分別輸出如下資訊後終止 child process 1 is killed by parent child process 2 is ...

360一道關於this的題目

原題目是這樣子的 window.val 1 var obj 說出下面的輸出結果 obj.dbl var func obj.dbl func this呢其實就是這樣,分清楚呼叫就好了。obj中的沒有指定呼叫。預設從函式中查詢。如果沒有則往上一級查詢。所以 上面的式子可以寫成這樣 window.val ...