本文共 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/