2016-04-29 3 views
0

У меня есть таблицы attendance, employee, payrollПочему 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 L запрос, я получаю только 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/en/group-by- handling.html) – xQbert

+1

Посещение результирующего набора.Clockin содержит null. – jarlh

+0

Вы выбираете из таблицы 'payroll'. Где это?Показать контент –

ответ

1

SQL FIDDLE

выше скрипка имеет 3 различных запросов; Я распространил ваш 1-й запрос, чтобы показать, что происходит в 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 one? – 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

Смежные вопросы