一、 count、distinct、group by的用法:
1.count()函数是用来统计表中记录的一个函数,返回匹配条件的行数,不去重。
2.count()语法:
(1)count(*)—包括所有列,返回表中的记录数,相当于统计表的行数,在统计结果的时候,包含NULL的记录,且不去重。
(2)count(1)—第一列,1表示一个固定值,也可以用count(2)、count(3)代替,在统计结果的时候,包含NULL的记录。
(3)count(列名)—只包括列名指定列,返回指定列的非空的记录数,在统计结果的时候,不包含为NULL的记录。
(4)count(distinct 列名)—只包括列名指定列,返回指定列的不同值的记录数,即会去重,且不包含列值为NULL的记录。
- SELECT count(*) FROM 表名 WHERE 条件 // 这样查出来的是总记录条
SELECT id count(*)FROM 表名 WHERE 条件 GROUP BY id //这样统计的会是每组的记录条数,统计出来的是相同id值的计数情况。
SELECT id count(*) FROM 表名 WHERE 条件. 是错误的写法。
一般来说,一条select语句的执行顺序如下:**from子句→where→group by(having)→select→order by→limit,因为聚集函数是在select中的,所以是在执行完group by之后再执行count()函数
**Employee 表包含所有员工信息,每个员工有其对应的工号 Id,姓名 Name,工资 Salary 和部门编号 DepartmentId 。
| Id | Name | Salary | DepartmentId |
| 1 | Joe | 85000 | 1 |
| 2 | Henry | 80000 | 2 |
| 3 | Sam | 60000 | 2 |
| 4 | Max | 90000 | 1 |
| 5 | Janet | 69000 | 1 |
| 6 | Randy | 85000 | 1 |
| 7 | Will | 70000 | 1 |
Department 表包含公司所有部门的信息。
| Id | Name |
| 1 | IT |
| 2 | Sales |
编写一个 SQL 查询,找出每个部门获得前三高工资的所有员工。例如,根据上述给定的表,查询结果应返回:
| Department | Employee | Salary |
| IT | Max | 90000 |
| IT | Randy | 85000 |
| IT | Joe | 85000 |
| IT | Will | 70000 |
| Sales | Henry | 80000 |
| Sales | Sam | 60000 |
SELECT P2.Name AS Department,P3.Name AS Employee,P3.Salary AS Salary
FROM Employee AS P3
INNER JOIN Department AS P2
ON P2.Id = P3.DepartmentId
WHERE (
SELECT COUNT(DISTINCT Salary)
FROM Employee AS P4
WHERE P3.DepartmentId = P4.DepartmentId
AND P4.Salary >= P3.Salary
) <= 3
ORDER BY DepartmentId,Salary DESC