2016-04-29 84 views
0

我有表attendanceemployeepayroll爲什麼SQL返回不同的結果,而使用和計數,*查詢

出席表:

Employee_ID Clockin Clockout 
--------------------------------- 
1   08:00:00 18:00:00 
2   08:00:00 18:00:00 
3   08:00:00 18:00:00 
4   08:00:00 18:00:00 

員工表:

Employee_ID Name  Employee_type 
--------------------------------- 
1   Mary   Full-time 
2   Peter  Full-time 
3   John   Full-time 
4   Henry  Full-time 

這是SQ大號查詢我只得到1行

SELECT *, COUNT(attendance.Clockin) 
    FROM payroll 
    LEFT JOIN attendance ON attendance.Employee_ID = payroll.Employee_ID 
    LEFT JOIN employee ON employee.Employee_ID = payroll.Employee_ID 
    WHERE employee.Employee_type = 'Full-time' 

這裏是SQL查詢,我得到更多的行返回

SELECT * 
    FROM payroll 
    LEFT JOIN attendance ON attendance.Employee_ID = payroll.Employee_ID 
    LEFT JOIN employee ON employee.Employee_ID = payroll.Employee_ID 
    WHERE employee.Employee_type = 'Full-time' 

什麼是這兩個查詢之間的區別?

+2

假設這是mysql,它使用擴展組。意思是,如果你沒有定義組,它將從每列中選擇一個值並返回。由於第一個聚合擴展組是有效的,因爲第二個select *沒有聚合,所以它只是返回每一行。 [服務器可以自由選擇每組中的任何值,因此除非它們相同,否則所選的值是不確定的。](https://dev.mysql.com/doc/refman/5.0/zh-CN/group-by- handling.html) – xQbert

+1

結果集的出席率.Clockin包含null。 – jarlh

+0

您正在從工資表中選擇。它在哪裏?顯示它的內容 –

回答

1

SQL FIDDLE

上述小提琴有3個不同的查詢;我擴展了你的第一個查詢,以顯示當你沒有一個組的時候在mysql中發生了什麼。

考慮:

--Yours without a group by, you get one row. This is due to mySQL "Extended" group by 
SELECT *, COUNT(attendance.Clockin) 
FROM payroll 
LEFT JOIN attendance 
ON attendance.Employee_ID = payroll.Employee_ID 
LEFT JOIN employee 
ON employee.Employee_ID = payroll.Employee_ID 
WHERE employee.Employee_type = 'Full-time'; 

--Mine, with a group by, you get multiple rows 
SELECT *, COUNT(attendance.Clockin) 
FROM payroll P 
LEFT JOIN attendance 
ON attendance.Employee_ID = P.Employee_ID 
LEFT JOIN employee 
ON employee.Employee_ID = P.Employee_ID 
WHERE employee.Employee_type = 'Full-time' 
GROUP BY P.Employee_ID, clockin, clockout, employee_Type; 

SELECT * 
FROM payroll 
LEFT JOIN attendance 
ON attendance.Employee_ID = payroll.Employee_ID 
LEFT JOIN employee 
ON employee.Employee_ID = payroll.Employee_ID 
WHERE employee.Employee_type = 'Full-time'; 

,如果你不通過MySQL數據庫引擎定義組將選擇從每一列的一個值,並返回它簡單地說。由於第一個SQL統計信息具有聚合,所以擴展分組是有效的;而第二個SQL沒有聚合,所以它只是返回每一行。 From mySQL docs: The server is free to choose any value from each group, so unless they are the same, the values chosen are indeterminate.

+0

非常感謝!這個對我有用!! – soneweng

+0

順便說一下,我想知道mySQL和其他sql如microsoft之間的查詢之間有什麼區別? – soneweng

+0

就我所知,MySQL是唯一一個默認情況下啓用了組的擴展使用的引擎。該功能可以禁用。 DB2/SQL Server,oracle,PostgreSQL我相信所有支持標準使用的GROUP BY都沒有擴展名。每個引擎都支持它自己的SQL「風味」。大多數的基本構造都是一樣的,但所有內置函數的使用都不相同。當談到什麼是有效的,哪些在每臺發動機中都不起作用時,沒有一顆銀彈。你的基本SELECT,FROM,WHERE都是我可以說的真正一致的。日期邏輯,子字符串,...組可能會有所不同 – xQbert

1

糟糕,那是MySQL,不是嗎?

隨着

COUNT(attendance.Clockin) 

您彙總數據。沒有GROUP BY子句,所以只返回一行。

至於:

SELECT *, COUNT(attendance.Clockin) 

,這不是通過標準SQL允許的,因爲你選擇不爲聚集唯一列。例如,有很多名字,那麼在一個返回的行中顯示什麼名字? MySQL已經解決了它,它會返回任意可用名稱之一。

隨着

SELECT * 
但是

,你是不是聚合你行。你將它們展現出來。

+0

謝謝你的迴應!我更多地瞭解它! – soneweng

相關問題