本文共 2773 字,大约阅读时间需要 9 分钟。
SELECT
用于从数据库中检取数据,是最基本的查询语句。
SELECT column_name1, column_name2 FROM table_name;
column_name1, column_name2
:指定需要查询的字段。table_name
:指定查询的表名。WHERE
用于对结果集进行过滤,仅返回符合条件的记录。
SELECT ename, job FROM emp WHERE hiredate BETWEEN '1980-01-01' AND '1990-12-31';
BETWEEN
用于指定一个范围。AND
、OR
用于逻辑连接。GROUP BY
用于将结果集按照指定的字段进行分组。
SELECT job, COUNT(*) FROM emp GROUP BY job;
COUNT(*)
:统计每个分组的记录数。HAVING
用于对分组后的结果集进行过滤。
SELECT job, MAX(sal) FROM emp GROUP BY job HAVING MAX(sal) > 1000;
MAX(sal)
:计算每个分组的最大值。HAVING
适用于 GROUP BY
之后。如果需要对多个字段进行分组,可以将它们放在 GROUP BY
列表中。
SELECT deptno, job, MAX(sal) FROM emp GROUP BY deptno, job;
deptno
和 job
两个字段分组显示最大薪资。想要找出每个部门不同工作岗位的最高薪资,首先需要列出数据:
SELECT deptno, job, sal FROM emp ORDER BY deptno;
执行后结果如下:
deptno | job | sal |
---|---|---|
10 | MANAGER | 2450.00 |
10 | PRESIDENT | 5000.00 |
10 | CLERK | 1300.00 |
20 | CLERK | 800.00 |
20 | MANAGER | 2975.00 |
20 | ANALYST | 3000.00 |
20 | CLERK | 1100.00 |
30 | SALESMAN | 1600.00 |
30 | SALESMAN | 1250.00 |
30 | SALESMAN | 1250.00 |
30 | MANAGER | 2850.00 |
30 | CLERK | 950.00 |
30 | SALESMAN | 1500.00 |
接着进行分组查询:
SELECT deptno, job, MAX(sal) FROM emp GROUP BY deptno, job;
执行后结果如下:
deptno | job | MAX(sal) |
---|---|---|
10 | MANAGER | 5000.00 |
10 | PRESIDENT | 5000.00 |
10 | CLERK | 1300.00 |
20 | CLERK | 800.00 |
20 | MANAGER | 2975.00 |
20 | ANALYST | 3000.00 |
20 | CLERK | 1100.00 |
30 | SALESMAN | 1500.00 |
30 | MANAGER | 2850.00 |
想要找出每个部门的最高薪资且薪资大于2900的数据,可以先查出每个部门的最高薪资:
SELECT deptno, MAX(sal) FROM emp GROUP BY deptno;
执行后结果如下:
deptno | MAX(sal) |
---|---|
10 | 5000.00 |
20 | 3000.00 |
30 | 2850.00 |
然后对结果进行过滤:
SELECT deptno, MAX(sal) FROM emp GROUP BY deptno HAVING MAX(sal) > 2900;
执行后结果如下:
deptno | MAX(sal) |
---|---|
10 | 5000.00 |
想要找出每个部门的平均薪资且薪资大于2000的数据,首先计算平均值:
SELECT deptno, AVG(sal) FROM emp GROUP BY deptno;
执行后结果如下:
deptno | AVG(sal) |
---|---|
10 | 2916.67 |
20 | 2175.00 |
30 | 2758.33 |
然后对结果进行过滤:
SELECT deptno, AVG(sal) FROM emp GROUP BY deptno HAVING AVG(sal) > 2000;
执行后结果如下:
deptno | AVG(sal) |
---|---|
10 | 2916.67 |
使用 DISTINCT
去重字段。
SELECT DISTINCT job FROM emp;
执行后结果如下:
job |
---|
CLERK |
SALESMAN |
MANAGER |
ANALYST |
PRESIDENT |
想要统计不同岗位的数量,可以使用 COUNT(DISTINCT)
。
SELECT COUNT(DISTINCT job) FROM emp;
执行后结果如下:
COUNT(DISTINCT job) |
---|
5 |
完整的DQL语句结构如下:
SELECT [字段列表] FROM [表名] WHERE [条件] GROUP BY [分组字段] HAVING [过滤条件] ORDER BY [排序字段];
SELECT
:指定要返回的字段。FROM
:指定数据来源。WHERE
:对数据进行过滤。GROUP BY
:对数据进行分组。HAVING
:对分组后的数据进行过滤。ORDER BY
:对结果进行排序。想要找出每个部门的不同工作岗位的最高薪资,并按薪资降序排列,可以使用以下语句:
SELECT deptno, job, MAX(sal) FROM emp GROUP BY deptno, job ORDER BY MAX(sal) DESC;
执行后结果如下:
deptno | job | MAX(sal) |
---|---|---|
10 | PRESIDENT | 5000.00 |
10 | MANAGER | 2450.00 |
10 | CLERK | 1300.00 |
20 | ANALYST | 3000.00 |
20 | MANAGER | 2975.00 |
20 | CLERK | 800.00 |
30 | MANAGER | 2850.00 |
30 | SALESMAN | 1500.00 |
30 | CLERK | 950.00 |
30 | SALESMAN | 1250.00 |
通过以上步骤,您可以逐步掌握如何使用 GROUP BY
和 HAVING
对数据进行分组和过滤,以及如何使用 DISTINCT
去重字段。这些知识将帮助您高效地完成复杂的数据查询任务。
转载地址:http://xrbfk.baihongyu.com/