簡體   English   中英

SQL 中 group by 的基本功能是什么?

[英]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

輸出是:

  • 所有行中 no_of_employees 為 14 的所有部門名稱

為什么會這樣,因為 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM