📜  使用 COUNT 和 HAVING 子句的 SQL 查询

📅  最后修改于: 2021-09-09 10:46:58             🧑  作者: Mango

考虑具有以下模式的表 STUDENT:

STUDENT (Student_id, Student_Name, Address, Marks) 

Student_id 是 STUDENT 表的主列。

让我们首先使用 SQL 中的 CREATE 命令创建表结构:

CREATE TABLE STUDENT 
(STUDENT_ID NUMBER (4), 
STUDENT_NAME VARCHAR2 (20), 
ADDRESS VARCHAR2 (20), 
MARKS NUMBER (3), 
PRIMARY KEY (STUDENT_ID));

现在,使用 SQL 中的 INSERT INTO 命令将值插入表中:

INSERT INTO STUDENT 
VALUES (100, ‘PUJA’, ’NOIDA’, 10); 

INSERT INTO STUDENT 
VALUES (101, ‘SUDO’, ’PUNE’, 30); 

INSERT INTO STUDENT 
VALUES (102, ‘BHALU’, ’NASHIK’, 40); 

INSERT INTO STUDENT 
VALUES (103, ‘CHETENA’, ’NOIDA’, 20); 

INSERT INTO STUDENT 
VALUES (104, ‘MOMO’, ’NOIDA’, 40);

现在显示 STUDENT 表的内容:

SELECT * 
FROM STUDENT;
Student_id    Student_Name    Address    Marks
------------------------------------------------
100            PUJA            NOIDA      10
101            SUDO            PUNE       30
102            BHALU           NASHIK     40
103            CHETENA         NOIDA      20
104            MOMO            NOIDA      40

查询 1:
打印分数和分数高于 NOIDA 市学生平均分数的学生人数。

解释:
为了获得 NOIDA 城市学生的平均分数,我们使用以下查询:

SELECT AVG(MARKS) 
FROM STUDENT 
WHERE ADDRESS =’NOIDA’ 

我们使用 GROUP BY 和 HAVING 子句使用上面的子查询:

SELECT MARKS, COUNT (DISTINCT STUDENT_ID) 
FROM STUDENT 
GROUP BY MARKS 
HAVING MARKS > (SELECT AVG(MARKS) 
                   FROM STUDENT 
                   WHERE ADDRESS = ’NOIDA’ ); 

在上面的查询中,我们使用 GROUP BY MARKS 意味着它聚集具有相同标记的行,我们还使用 SELECT MARKS, COUNT(DISTINCT STUDENT_ID) 打印每个簇的标记和各个簇的行数,即,

MARKS    COUNT
10           1
20           1
30           1
40           2 

之后我们使用 HAVING MARKS > (SELECT AVG(MARKS) FROM STUDENT WHERE ADDRESS =’NOIDA’),用于过滤结果,条件是分数必须大于诺伊达市学生的平均分数,即大于

(10+20+40) / 3 
= 23.3 

输出:

MARKS       COUNT (DISTINCT STUDENT_ID)
30             1
40             2 

查询 2:
显示姓名第二个字母为 U 的学生的姓名和地址。

解释:
用于匹配STUDENT_NAME场的图案,我们使用LIKE字符串比较运算符具有两个保留字符%和_。 % 替换任意数量的字符,而 ‘_’ 替换单个任意字符。
在这里,我们需要比较 STUDENT_NAME 的第二个字母,因此我们使用模式“_U%”。

SELECT Student_Name, Address 
FROM STUDENT 
WHERE STUDENT_NAME LIKE ‘_U%’ 

输出:

STUDENT_NAME  ADDRESS
PUJA            NOIDA
SUDO            PUNE 

查询 3:
打印获得最高分的学生的详细信息(如果有超过一名学生获得最高分,则最高将根据其姓名的字母顺序排列)。

解释:
为了从 MARKS 字段中获得最高分,我们使用 MAX 命令,即,

SELECT MAX(MARKS) 
FROM STUDENT; 

我们使用上面返回“40”的子查询,它将与 WHERE 命令一起使用。为了按照 STUDENT_NAME 字段的字母顺序排列,我们使用了 ORDER BY 子句,为了获取顶行,将使用 LIMIT 1。结合所有这些:

SELECT * 
FROM STUDENT 
WHERE MARKS = (SELECT MAX (MARKS) 
               FROM STUDENT) 
ORDER BY STUDENT_NAME LIMIT 1;  

输出:

Student_id    Student_Name    Address     Marks
102            BHALU            NASHIK     40 

查询 4:
将 ID 103 的学生姓名和地址分别更改为 RITA 和 DELHI。

解释:
要更改任何属性的值,我们将使用带有 SET 子句的 UPDATE 命令来指定它们的新值。

UPDATE STUDENT 
SET STUDENT_NAME = ’RITA’, ADDRESS=’DELHI’ 
WHERE STUDENT_ID=103 ; 

输出:

1 row updated 

要查看我们将使用的更改,

SELECT * 
FROM STUDENT; 

输出:

Student_id    Student_Name    Address      Marks
100            PUJA               NOIDA       10
101            SUDO               PUNE        30
102            BHALU              NASHIK      40
103            RITA               DELHI       20
104            MOMO               NOIDA       40 

查询 5:
从 STUDENT 表中删除那些得分最低的细节。

解释:
为了找到我们将使用的最低标记,

SELECT MIN(MARKS) 
FROM STUDENT; 

它将返回“10”作为最低分。

要删除行,我们将使用 DELETE 命令和 WHERE 命令来指定条件。

DELETE FROM STUDENT 
WHERE MARKS = (SELECT MIN(MARKS) 
               FROM STUDENT); 

输出:

1 row affected 

要查看我们将使用的更改,

SELECT * 
FROM STUDENT; 

输出:

Student_id    Student_Name    Address      Marks
101            SUDO               PUNE        30
102            BHALU              NASHIK      40
103            RITA               DELHI       20
104            MOMO               NOIDA       40