📜  SQL HAVING 子句与示例

📅  最后修改于: 2022-05-13 01:54:24.162000             🧑  作者: Mango

SQL HAVING 子句与示例

在 MSSQL 中,HAVING 子句用于根据指定条件对 GROUP BY 的结果应用过滤器。条件是布尔类型,即使用逻辑运算符(AND、OR)。这个子句包含在 SQL 中,因为当我们将它与聚合表达式一起使用时,WHERE 关键字失败。 Have 是 SQL 中非常常用的子句。与 WHERE 类似,它有助于应用条件,但 HAVING 适用于组。如果你想过滤一个组,HAVING 子句就会起作用。

一些要点:

  • Have 子句用于根据提供的条件过滤数据。
  • Have 子句一般用在大数据的报告中。
  • Have 子句仅与 SELECT 子句一起使用。
  • 语法中的表达式只能有常量。
  • 在查询中,ORDER BY 将放在 HAVING 子句之后(如果有)。
  • HAVING 子句在列操作中实现。
  • Have 子句一般用在 GROUP BY 之后。
  • GROUP BY 子句用于将所需数据分组。

句法:

SELECT col_1, function_name(col_2)
FROM tablename
WHERE condition
GROUP BY column1, column2
HAVING Condition
ORDER BY column1, column2;

这里,函数名是函数的使用,例如名称,SUM(),AVG()。

示例 1:



这里首先我们创建一个名为“Company”的数据库,然后我们将在数据库中创建一个名为“Employee”的表。创建表后,我们将执行查询。

第 1 步:创建数据库

CREATE DATABASE Company;

第 2 步:使用此数据库

USE Company;

第 3 步:创建表

CREATE TABLE Employee(
   EmployeeId int,
   Name Varchar(20),
   Gender Varchar(20),
   Salary int,
   Department Varchar(20),
   Experience Varchar(20)
);

将值添加到表中:

INSERT INTO Employee VALUES (1, 'Rachit', 'M', 50000, 'Engineering', '6 year')
INSERT INTO Employee VALUES (2, 'Shobit', 'M', 37000, 'HR', '3 year')
INSERT INTO Employee VALUES (3, 'Isha', 'F', 56000, 'Sales', '7 year')
INSERT INTO Employee VALUES (4, 'Devi', 'F', 43000, 'Management', '4 year')
INSERT INTO Employee VALUES (5, 'Akhil', 'M', 90000, 'Engineering', '15 year')

决赛桌如下:

SELECT * FROM Employee;

第 4 步:执行查询



此员工表将帮助我们理解 HAVING 子句。它包含员工 ID、姓名、性别、部门和工资。要知道工资总额,我们将编写查询:

SELECT Department, sum(Salary) as Salary
FROM employee
GROUP BY department;  

这是结果,

现在,如果我们需要显示工资总额为 50,000 或更多的部门。在这种情况下,我们将使用 HAVING 子句。

SELECT Department, sum(Salary) as Salary
FROM employee
GROUP BY department
HAVING SUM(Salary) >= 50000;  

示例 2:

假设,一位老师想要宣布班级中的佼佼者。为此,她决定奖励每一个得分超过 95% 的学生。我们需要按名称及其百分比对数据库进行分组,并找出当年得分超过 95% 的人。为此,我们首先创建一个名为“School”的数据库,然后在数据库中创建一个名为“Student”的表。创建表后,我们将执行查询。

第 1 步:创建数据库

CREATE DATABASE School;

第 2 步:使用此数据库

USE School;

第 3 步:创建表



CREATE TABLE Student(
   student Varchar(20),
   percentage int
);

将值添加到表中:

INSERT INTO Student VALUES ('Isha Patel', 98)
INSERT INTO Student VALUES ('Harsh Das', 94)
INSERT INTO Student VALUES ('Rachit Sha', 93)
INSERT INTO Student VALUES ('Sumedha', 98)
INSERT INTO Student VALUES ('Rahat Ali', 98)

决赛桌如下:

SELECT * FROM Student;

步骤 4:执行查询

SELECT student, percentage
FROM Student
GROUP BY student, percentage
HAVING percentage > 95;

在这里,名为 Isha、Sumedha、Rahat Ali 的三位学生的得分都超过了 95%。

    

此外,我们还可以使用 HAVING 子句过滤多个值的行。 HAVING 子句还允许使用多个聚合条件过滤行。

SELECT student  
FROM Student
WHERE percentage > 90
GROUP BY student, percentage
HAVING SUM(percentage) < 1000 AND AVG(percentage) > 95;

此查询返回百分比大于 95 且百分比总和小于 1000 的学生。