[英]What is the basic functioning of group by in SQL?
group by
的行為是什么?
我有兩個表:
create table department
(
dep_id int primary key,
dep_id varchar(20),
dep_location varchar(20)
)
和
create table employees_dep
(
emp_id int primary key,
emp_name varchar(20),
job_name varchar(20),
manager_id int,
hire_date date,
salary decimal(10, 2),
commision decimal(7, 2),
dep_id int
foreign key references department(dep_id)
)
數據為:
insert into department values (1001, 'finance', 'sydney')
insert into department values (2001, 'audit', 'melbourne')
insert into department values (3001, 'marketing', 'perth')
insert into department values (4001, 'production', 'brisbane')
insert into employees_dep
values (68319, 'kayling', 'president', null, '11-18-1991', 6000, 0, 1001)
insert into employees_dep
values (66928, 'blaze', 'manager', 68319, '05-01-1991', 2750, 0, 3001)
insert into employees_dep
values (67832, 'clare', 'manager', 68319, '06-09-1991', 2550, 0, 1001)
insert into employees_dep
values (65646, 'jonas', 'manager', 68319, '04-02-1991', 2957, 0, 2001)
insert into employees_dep
values (67858, 'scarlet', 'analyst', 65646, '04-19-1991', 3100, 0, 2001)
insert into employees_dep
values (69062, 'frank', 'analyst', 65646, '12-03-1991', 3100, 0, 2001)
insert into employees_dep
values (63679, 'sandrine', 'clerk', 69062, '12-18-1991', 900, 0, 2001)
insert into employees_dep
values (64989, 'adelyn', 'salesman', 66928, '02-20-1991', 1700, 400, 3001)
insert into employees_dep
values (65271, 'wade', 'salesman', 66928, '02-22-1991', 1350, 600, 3001)
insert into employees_dep
values (66564, 'madden', 'salesman', 66928, '09-28-1991', 1350, 1500, 3001)
insert into employees_dep
values (68454, 'tucker', 'salesman', 66928, '09-08-1991', 1600, 0, 3001)
insert into employees_dep
values (68736, 'andres', 'clerk', 67858, '05-23-1997', 1200, 0, 2001)
insert into employees_dep
values (69000, 'julius', 'clerk', 66928, '12-03-1991', 1050, 0, 3001)
insert into employees_dep
values (69324, 'marker', 'clerk', 67832, '01-23-1992', 1400, 0, 1001)
問題:當我將查詢寫為:
select
d.dep_name,
count(d.dep_name) as no_of_employees
from
employees_dep e, department d
group by
d.dep_name
輸出是:
為什么會這樣,因為 group by 子句選擇一個數據並將其分組,因此它應該作為選擇第一個部門名稱,然后將員工表中具有相同部門 ID 的所有行分組,然后計算每個組中的行數當我將查詢寫為 -
select
d.dep_name,
count(d.dep_name) as no_of_employees
from
employees_dep e, department d
where
e.dep_id = d.dep_id
group by
d.dep_name
然后它返回正確的輸出以及表中每個部門的正確出現次數。
請解釋這種群體行為....
使用內連接。 希望這有幫助
select d.dep_name, count(d.dep_name) as no_of_employees from employee_dep e 內部加入部門 d on e.dep_id = d.dep_id group by d.dep_name
您在第一個查詢中經常使用連接條件。 否則它會做一個交叉連接。 使用正確的連接條件將為您提供正確的輸出。
select d.dep_name,count(1) as no_of_employees
from employees_dep e join department d
On e.dep_id=d.dep_id
group by d.dep_name
您正在使用隱式連接語法並創建笛卡爾連接(交叉連接),這意味着將計算 2 個表的每個可能組合。 因此,如果您有 14 個部門,那么每個員工看起來就好像在其中的 14 個部門中一樣。 研究如何在 SQL 中進行連接並使用顯式連接語法會有所幫助。 在這種情況下,其他人也指出 INNER JOIN 將是糾正問題的關鍵。
SELECT
d.dep_name
,count(emp_id) as no_of_employees
FROM
department d
INNER JOIN employees_dep e
ON e.dep_id = d.dep_id
GROUP BY
d.dep_name
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.