SQL练习——day01
力扣——SQL练习总结
DENSE_RANK()
窗口函数
-
这是排名函数的一种,它在处理相同值时,会给相同的值分配相同的排名,并且后续的排名不会跳过。比如有三个分数并列第一,那么它们的排名都是 1,接下来的分数排名就是 2,不会出现排名 3。
-
select S.score,dense_rank() over (order by s.score desc) as 'rank' from Scores S;
DISTINCT
是一个关键字,用于从查询结果中去除重复的行,确保返回的每一行数据都是唯一的
-
SELECT DISTINCT name, age FROM Students;
ROW_NUMBER()
是 SQL 中的窗口函数,用于为结果集中的每一行生成唯一的序号。
-
ROW_NUMBER() OVER ([PARTITION BY 分组字段]ORDER BY 排序字段 [ASC|DESC] ) AS 别名
SIGNED
是 MySQL 特有的数据类型关键字,表示 “有符号整数”(即可以存储正数、负数和零)
分组查询
-
#错误示范!!!!!! select 姓名 from 学生表 group by 姓名 where count(姓名) > 1;#聚合函数(count),where字句无法与聚合函数一起使用#正确写法 select 姓名 from 学生表 group by 姓名 having count(姓名) > 1;
sql连接
多表查询
-
select a.name as Customers from Customers a left join Orders b on a.id = b.customerID --------------------------------#在表里的数据 where b.customerID is null; --------------------------------#不在表里的数据
部门工资最高员工
-
# Write your MySQL query statement below select b.name as department, a.name as Employee, a.salary from Employee a left join Department b on a.departmentId = b.id where (a.departmentId,salary) in (select departmentId,max(salary)from Employeegroup by departmentId );
WHERE 3 > (子查询)
是一种条件筛选语法
- 它的核心逻辑是:如果子查询返回的值小于 3,则当前行符合条件,会被保留在结果中
练习题
统计某公司中,不同部门中的的工资最高的三个人
#Employee 表:
+----+-------+--------+--------------+
| 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 |
+----+-------+
#输出:
+------------+----------+--------+
| Department | Employee | Salary |
+------------+----------+--------+
| IT | Max | 90000 |
| IT | Joe | 85000 |
| IT | Randy | 85000 |
| IT | Will | 70000 |
| Sales | Henry | 80000 |
| Sales | Sam | 60000 |
+------------+----------+--------+
#解释:
在IT部门:
- Max的工资最高
- 兰迪和乔都赚取第二高的独特的薪水
- 威尔的薪水是第三高的#在销售部:
- 亨利的工资最高
- 山姆的薪水第二高
- 没有第三高的工资,因为只有两名员工
拆解
-
公司里前 3 高的薪水意味着有不超过 3 个工资比这些值大
-
select e1.Name as 'Employee', e1.Salary from Employee e1 where 3 > (select count(distinct e2.Salary)from Employee e2where e2.Salary > e1.Salary ); -------------------------------------------------------------- #在这个代码里,我们统计了有多少人的工资比 e1.Salary 高,所以样例的输出应该如下所示 | Employee | Salary | |----------|--------| | Henry | 80000 | | Max | 90000 | | Randy | 85000 |
-
然后,我们需要把表 Employee 和表 Department 连接来获得部门信息
-
SELECTd.Name AS 'Department', e1.Name AS 'Employee', e1.Salary FROMEmployee e1JOINDepartment d ON e1.DepartmentId = d.Id WHERE3 > (SELECTCOUNT(DISTINCT e2.Salary)FROMEmployee e2WHEREe2.Salary > e1.SalaryAND e1.DepartmentId = e2.DepartmentId) ; --------------------------------------------------------- | Department | Employee | Salary | |------------|----------|--------| | IT | Joe | 70000 | | Sales | Henry | 80000 | | Sales | Sam | 60000 | | IT | Max | 90000 | | IT | Randy | 85000 |
-