如何查找复杂的 SQL 查询

Posted

技术标签:

【中文标题】如何查找复杂的 SQL 查询【英文标题】:how to find complex SQL query 【发布时间】:2018-07-21 09:42:44 【问题描述】:

我有一张这样的桌子:

表:员工

   EmpId:  INTEGER NOT NULL
   DeptId: INTEGER NOT NULL
   Name:   Char(40) NOT NULL
   Age:    INTEGER NOT NULL
   Salary: INTEGER NOT NULL

表:部门

   DeptId: INTEGER NOT NULL
   Name:   Char(40) NOT NULL
   Rank:   INTEGER NULL

我需要找到的查询是:-

a) 按该部门所有员工的平均年龄降序排列所有部门,然后相应地更新排名列。因此,平均员工年龄最高的部门应该排名第一,平均员工年龄第二高的部门应该排名第二,以此类推。

如果多个部门的员工平均年龄相同,那么他们应该按照唯一的DeptId进行排名,没有员工的部门的排名不应该更新。

b) 列出部门的名称以及部门的总预算。总预算简单定义为该部门员工工资的总和。如果该部门没有任何员工,那么他们的总和应该是0。

c) SQL查询输出所有部门的名称,使得该部门的平均工资大于10,00,000

【问题讨论】:

SQL server 还是 mysql?您可以通过包含示例数据和预期输出来改进这个问题。并且你应该展示你尝试过的东西,否则愤世嫉俗的人可能会怀疑你想让他们为你做你的工作。 见meta.***.com/questions/333952/…,安抚那些愤世嫉俗的人 您是否查看了用于排名函数的 SQL 命令 AVG(获取平均年龄和工资)、RANK、DENSE_RANK 或 ROW_NUMBER?对我来说,它看起来很像家庭作业...... 这并不比做意大利面复杂。请不要将简单连接称为复杂 - 等到您的 sql 语句跨越 2-3 页后再将它们称为复杂。 【参考方案1】:

我已经为运行查询创建了临时表和数据

CREATE TABLE #Employee(
EmpId  INTEGER NOT NULL,
DeptId INTEGER NOT NULL,
Name   Char(40) NOT NULL,
Age    INTEGER NOT NULL,
Salary INTEGER NOT NULL
);

CREATE TABLE #Department(
DeptId INTEGER NOT NULL,
Name   Char(40) NOT NULL,
Rank   INTEGER NULL
);

INSERT INTO #Employee VALUES(1,1,'A',34,9000000),
                            (2,2,'B',25,450000),
                            (3,1,'C',45,600000),
                            (4,1,'D',23,340000),
                            (5,2,'E',21,580000),
                            (6,3,'F',26,7500000),
                            (7,1,'G',27,650000),
                            (8,2,'H',28,410000),
                            (9,1,'I',29,120000),
                            (10,2,'J',54,150000),
                            (11,3,'I',65,1500000);

INSERT INTO #Department (DeptId,Name) VALUES(1,'Dept 1'),
                                            (2,'Dept 2'),
                                            (3,'Dept 3');

以下是满足您要求的查询

一)

   UPDATE #Department SET RANK=a.Rank
   FROM (SELECT DeptId,AVG(Age) AS 'AvgAge',ROW_NUMBER() OVER (ORDER BY AVG(AGE)DESC,DeptId ASC) AS 'Rank' 
         FROM #Employee GROUP BY DeptId)a 
   WHERE #Department.DeptId=a.DeptId

b)

   SELECT d.Name,SUM(e.Salary) AS 'Total Budget' 
   FROM #Employee e JOIN #Department d 
   ON e.DeptId=d.DeptId 
   GROUP BY d.Name

c)

   SELECT d.Name,AVG(e.Salary) AS 'Avg Sal > 1000000' 
   FROM #Employee e JOIN #Department d 
   ON e.DeptId=d.DeptId
   GROUP BY d.Name HAVING AVG(e.Salary)>1000000

【讨论】:

这应该是什么版本的 SQL? 这是 SQL Server。

以上是关于如何查找复杂的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

复杂的 SQL 查询——查找匹配多个不同外键的项目

如何查找MySQL中查询慢的SQL语句

如何查找MySQL中查询慢的SQL语句

如何编写 SQL 查询以查找表中的重复项

如何查找MySQL中查询慢的SQL语句

如何使用 SQL 在查询语句中查找最长匹配?