SQL Query using MYSQL - mysql

Write a query to display Department_ID and maximum salary of all employees whose Department_ID is greater than 10 and having a maximum salary greater than 20000 for each department. Display the data in descending order with respect to Department_ID.
select Department_ID, max(Salary)
from employees
where Department_ID > 10
having max(Salary) >20000
order by Department_ID DESC;
This is my query but it only displays one result. Since the question asks for each department, I am sure my query is incorrect.

You need a group by clause to make your query a valid aggregation query (in many RDBMS, you would get a syntax error):
select department_id, max(salary) max_salary
from employees
where department_id > 10
group by department_id
having max(salary) > 20000

You are missing the group by
select Department_ID, max(Salary)
from employees
where Department_ID > 10
Group by Department_ID
having max(Salary) >20000
order by Department_ID DESC;

Related

SQL - Second highest

I am trying to solve below leet code problem.
https://leetcode.com/problems/second-highest-salary
What is wrong with this answer? Below answer is not accepted :(
select t.salary as SecondHighestSalary from
(
select salary
from employee
order by salary desc
limit 1 offset 1
) as t
Both the below answers are accepted
We can use subquery as shown below:
SELECT MAX(salary) AS secondhighestsalary
FROM employee
WHERE salary < (SELECT MAX(salary)
FROM employee);
or alternatively you can use temporary table:
with temp as
(
SELECT MAX(salary) as salary FROM employee
)
select max(salary) as secondhighestsalary from employee where salary <(select salary from temp);
This is Accepted.
select salary as SecondHighestSalary
from employee a
where 1 = (select count(1) from employee b where b.salary < a.salary )
Your query will not work if the lowest salary appears twice in the table.
Above query uses co-related subquery, means, for each row in outer table the subquery (or inner query) will be executed once.
Moreover, this will work for Nth highest salary. If 10th highest salary would have been asked then just replace the 1 in the above query with 9.

Trying to find third lowest salary in mysql

I am using a nested SQL query for finding the third lowest salary but the query doesn't show the correct name of the employee instead it shows gives the highest-paid employee name with the third-lowest salary. This is my query.
SELECT first_name, MIN(salary)
FROM employee
WHERE salary > (SELECT min(salary)
FROM employee
WHERE salary > (SELECT min(salary)
FROM employee)
);
You can use OFFSET/LIMIT to get the third lowest:
SELECT first_name, salary
FROM employee
WHERE salary
ORDER BY salary
LIMIT 1 OFFSET 2
The reason why your original query didn't work, is firstly, your select is:
SELECT first_name, MIN(salary)
which means that there is an implicit "group everything" here, and MySQL interprets the first_name as ANY(first_name).
Furthermore, it's extremely inefficient to do it that way.
SELECT firstname, salary
FROM employees
ORDER BY salary ASC
OFFSET 2 LIMIT 1;
select the data and order by salary ascending order. The minimum salary will be the first row, so limit the result to just one row, that is the person with the minimum salary!
SELECT first_name, salary
FROM employee
ORDER BY salery
LIMIT 1;

How to find second highest salary in mysql

How to find second highest salary in mysql.
All record find in second highest salary.
Table : Employee
ID salary emp_name
1 400 A
2 800 B
3 300 C
4 400 D
4 400 C
*** Mysql Query: ***
SELECT * FROM employee ORDER by salary DESC LIMIT 1,2
This return two record.I do not know how many record in second highest salary.
Try this:
SELECT emp_name,salary
FROM Employee
WHERE salary = (SELECT DISTINCT salary FROM Employee as emp1
WHERE (SELECT COUNT(DISTINCT salary)=2 FROM Employee as emp2
WHERE emp1.salary <= emp2.salary))
ORDER BY emp_name
SELECT sal
FROM emp
ORDER BY sal DESC
LIMIT 1, 1;
You will get only the second max salary.
And if you need any 3rd or 4th or Nth value you can increase the first value followed by LIMIT (n-1) ie. for 4th salary: LIMIT 3, 1;
1st one with limit-
SELECT SALARY FROM tbl_name ORDER BY SALARY DESC LIMIT 1,1
2nd one without limit-
SELECT MAX(SALARY) FROM tbl_name WHERE SALARY < (SELECT MAX(SALARY) FROM tbl_name)
SELECT * FROM employee GROUP BY salary ORDER BY salary DESC LIMIT 1, 1
Above query first grouped salary column (for distinct record) and display records in descending order then apply limit function (limit function accept two parameter first one is for index(which is start from 0) and second one is for how many record we want).
If you want third highest salary just change limit 2,1 and so on for next.
Use this to find 2nd highest salary.
SELECT * FROM tablename ORDER BY salary DESC LIMIT 1,1
first 1 in limit is to skipping the rows and second 1 in limit is to display the row.
For third highest skip two rows same scenario to find nth salaries of the employees.
SELECT * FROM tablename ORDER BY salary DESC LIMIT 2,1
select salary
from (
select salary
from Employee
order by desc
limit 2) as minimumTwoSalary
order by minimumTwoSalary.salary
limit 1;
Using GROUP BY with ORDER BY will give you the second highest salary even if there is two same salary
SELECT * FROM employee GROUP BY salary ORDER by salary DESC LIMIT 1,1
Try this:
SELECT MAX(SALARY)
FROM tbl_name
WHERE
SALARY NOT IN
(
SELECT MAX(SALARY)
FROM tbl_name
)
Use the below query to get the 2nd or nth highest salary. Basically, The DENSE_RANK()
assigns a rank to each row within a partition or result set with no gaps in ranking values.
The rank of a row is increased by one from the number of distinct rank values which come before the row.
SELECT salary as highest_salary FROM
(SELECT salary, DENSE_RANK() OVER( ORDER BY salary DESC) row_num FROM Employee) with_dense_rank
WHERE row_num = 2;
select max(salary) from Employee where salary != (select max(salary) from Employee)
Explanation: -
In the above query, we are using the max function of SQL to find the maximum salary then we are comparing max salary using where clause with the help of subquery to filter out the maximum salary from the salary column.
Another example of the same approach is below. I believe it is the easiest logical method but maybe not the fastest because the subquery makes the output a bit slower.
select max(salary) from Employee where salary < (select max(salary) from Employee)
So, I will go with #Renuka Kulkarni Approach, but just a little different in the query, because some employees can also have the same amount of salary. so we need to select Distinct, it is important to use distinct because maybe 2 and multiple employees can have the same amount of salary.
SELECT DISTINCT price
FROM Product
ORDER BY price DESC
LIMIT 1, 1;
We can find Second Highest Salary in many ways.
1.Normal Where Condition Using MAX() Function
SELECT MAX(salary) AS SecondHighestSalary
FROM Employee WHERE salary<(SELECT MAX(salary) FROM Employee);
2.Using LIMIT
SELECT salary AS SecondHighestSalary FROM Employee ORDER BY salary DESC
LIMIT 1,1;
3.Using Self JOIN
SELECT MAX(e2.salary) AS SecondHighestSalary
FROM Employee e1, Employee e2 WHERE e1.salary>e2.salary;
4.Using NOT IN Keyword
SELECT MAX(salary) AS SecondHighestSalary
FROM Employee
WHERE salary NOT IN (SELECT MAX(salary) FROM Employee);
SELECT * FROM employee ORDER by salary DESC LIMIT 1,1;

why query to find the 2nd highest salary of the employee is not working in mysql 5.1?

I am trying to find the salary of the second-highest paid employee.
My expected output is 9000 but it prints 14000. I am unable to find my mistake. Kindly help me
Try this query
select max(salary) from table_name
where salary< (select max(salary) from table_name)
Fiddle
You could use this query also ,
SELECT MAX(salary) FROM employees WHERE salary < (SELECT MAX(salary) FROM employees)
Simply use sub query to get max salary from the employees table and check against same to get second highest.
Select * from table order by salary desc limit 2,1

Find max and second max salary for a employee table MySQL

Suppose that you are given the following simple database table called Employee that has 2 columns named Employee ID and Salary:
Employee
Employee ID Salary
3 200
4 800
7 450
I wish to write a query select max(salary) as max_salary, 2nd_max_salary from employee
then it should return
max_salary 2nd_max_salary
800 450
i know how to find 2nd highest salary
SELECT MAX(Salary) FROM Employee
WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee )
or to find the nth
SELECT FROM Employee Emp1 WHERE (N-1) = ( SELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary)
but i am unable to figureout how to join these 2 results for the desired result
You can just run 2 queries as inner queries to return 2 columns:
select
(SELECT MAX(Salary) FROM Employee) maxsalary,
(SELECT MAX(Salary) FROM Employee
WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee )) as [2nd_max_salary]
SQL Fiddle Demo
Try like this
SELECT (select max(Salary) from Employee) as MAXinmum),(max(salary) FROM Employee WHERE salary NOT IN (SELECT max(salary)) FROM Employee);
(Or)
Try this, n would be the nth item you would want to return
SELECT DISTINCT(Salary) FROM table ORDER BY Salary DESC LIMIT n,1
In your case
SELECT DISTINCT(column_name) FROM table_name ORDER BY column_name DESC limit 2,1;
Simplest way to fetch second max salary & nth salary
select
DISTINCT(salary)
from employee
order by salary desc
limit 1,1
Note:
limit 0,1 - Top max salary
limit 1,1 - Second max salary
limit 2,1 - Third max salary
limit 3,1 - Fourth max salary
The Best & Easiest solution:-
SELECT
max(salary)
FROM
salary
WHERE
salary < (
SELECT
max(salary)
FROM
salary
);
You can write 2 subqueries like this example
SELECT (select max(Salary) from Employee) as max_id,
(select Salary from Employee order by Salary desc limit 1,1) as max_2nd
Select Distinct sal From emp Order By sal Desc Limit 1,1;
It will take all Distinct sal. And Limit 1,1 means: leaves top one record and print 1 record.
$q="select * from info order by salary desc limit 1,0"; // display highest 2 salary
or
$q="select * from info order by salary desc limit 1,0"; // display 2nd highest salary
I think, It is the simplest way to find MAX and second MAX Salary.You may try this way.
SELECT MAX(Salary) FROM Employee; -- For Maximum Salary.
SELECT MAX(Salary) FROM Employee WHERE Salary < (SELECT MAX(Salary) FROM Employee); -- For Second Maximum Salary
i think that the simple way in oracle is this:
SELECT Salary FROM
(SELECT DISTINCT Salary FROM Employee ORDER BY Salary desc)
WHERE ROWNUM <= 2;
`select max(salary) as first, (select salary from employee order by salary desc limit 1, 1) as second from employee limit 1`
For max salary simply we can use max function, but second max salary we should use sub query. in sub query we can use where condition to check second max salary or simply we can use limit.
You can write SQL query in any of your favorite database e.g. MySQL, Microsoft SQL Server or Oracle. You can also use database specific feature e.g. TOP, LIMIT or ROW_NUMBER to write SQL query, but you must also provide a generic solution which should work on all database. In fact, there are several ways to find second highest salary and you must know a couple of them e.g. in MySQL without using the LIMIT keyword, in SQL Server without using TOP and in Oracle without using RANK and ROWNUM.
Generic SQL query:
SELECT
MAX(salary)
FROM
Employee
WHERE
Salary NOT IN (
SELECT
Max(Salary)
FROM
Employee
);
Another solution which uses sub query instead of NOT IN clause. It uses < operator.
SELECT
MAX(Salary)
FROM
Employee
WHERE
Salary < (
SELECT
Max(Salary)
FROM
Employee
);
This solution will give all employee name and salary who have second highest salary
SELECT name, salary
FROM employee
WHERE salary = (
SELECT
salary
FROM employee AS emp
ORDER BY salary DESC
LIMIT 1,1
);
Find Max salary of an employee
SELECT MAX(Salary) FROM Employee
Find Second Highest Salary
SELECT MAX(Salary) FROM Employee
Where Salary Not In (Select MAX(Salary) FROM Employee)
OR
SELECT MAX(Salary) FROM Employee
WHERE Salary <> (SELECT MAX(Salary) FROM Employee )
This will be the simplest code format :
select max(salary) as 'max_salary',
(select salary from employee order by salary desc limit 1,1) as
'2nd_max_salary'
from employee;
For finding the nth highest salary, syntax is :
select max(salary) as 'max_salary',
(select salary from employee order by salary desc limit n-1,1) as
'nth_max_salary'
from employee;
Not really a nice query but :
SELECT * from (
SELECT max(Salary) from Employee
) as a
LEFT OUTER JOIN
(SELECT MAX(Salary) FROM Employee
WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee )) as b
ON 1=1
For unique salaries (i.e. first can't be same as second):
SELECT
MAX( s.salary ) AS max_salary,
(SELECT
MAX( salary )
FROM salaries
WHERE salary <> MAX( s.salary )
ORDER BY salary DESC
LIMIT 1
) AS 2nd_max_salary
FROM salaries s
And also because it's such an unnecessary way to go about solving this problem (Can anyone say 2 rows instead of 2 columns, LOL?)
Try
SELECT
SUBSTRING( GROUP_CONCAT( Salary ), 1 , LOCATE(",", GROUP_CONCAT( Salary ) ) -1 ) AS max_salary,
SUBSTRING( GROUP_CONCAT( Salary ), LOCATE(",", GROUP_CONCAT( Salary ) ) +1 ) AS second_max_salary
FROM
(
SELECT Salary FROM `Employee` ORDER BY Salary DESC LIMIT 0,2
) a
Demo here
For second highest salary, This one work for me:
SELECT salary
FROM employee
WHERE salary
NOT IN (
SELECT MAX( salary )
FROM employee
ORDER BY salary DESC
)
LIMIT 1
This is awesome Query to find the nth Maximum:
For example: -
You want to find salary 8th row Salary, Just Changed the indexed value to 8.
Suppose you have 100 rows with Salary. Now you want to find Max salary for 90th row. Just changed the Indexed Value to 90.
set #n:=0;
select * from (select *, (#n:=#n+1) as indexed from employee order by Salary desc)t where t.indexed = 1;
with Common table expression
With cte as (
SELECT
ROW_NUMBER() Over (Order By Salary Desc) RowNumber,
Max(Salary) Salary
FROM
Employee
Group By Salary
)
Select * from cte where RowNumber = 2
without nested query
select max(e.salary) as max_salary, max(e1.salary) as 2nd_max_salary
from employee as e
left join employee as e1 on e.salary != e1.salary
group by e.salary desc limit 1;
Here change n value according your requirement:
SELECT top 1 amount
FROM (
SELECT DISTINCT top n amount
FROM payment
ORDER BY amount DESC ) AS temp
ORDER BY amount
This should work same :
SELECT MAX(salary) max_salary,
(SELECT MAX(salary)
FROM Employee
WHERE salary NOT IN
(SELECT MAX(salary)
FROM Employee)) 2nd_max_salary
FROM Employee
If we want to find Employee that gets 3nd highest salary then execute this query
SELECT a.employeeid,
a.salary
FROM (SELECT employeeid,
salary,
Dense_rank()
OVER(
ORDER BY salary) AS n
FROM employee) AS a
WHERE n = 3
What do you want
This will work To find the nth maximum number
SELECT
TOP 1 * from (SELECT TOP nth_largest_no * FROM Products Order by price desc) ORDER BY price asc;
For Fifth Largest number
SELECT
TOP 1 * from (SELECT TOP 5 * FROM Products Order by price desc) ORDER BY price asc;
Here is another solution which uses sub query but instead of IN clause it uses < operator
SELECT MAX(Salary) From Employees WHERE Salary < ( SELECT Max(Salary) FROM Employees);
select * from emp where sal =(select max(sal) from emp where eno in(select eno from emp where sal <(select max(sal)from emp )));
try the above code ....
if you want the third max record then add another nested query "select max(sal)from emp" inside the bracket of the last query and give less than operator in front of it.
select * from
Employees where Sal >=
(SELECT
max(Sal)
FROM
Employees
WHERE
Sal < (
SELECT
max(Sal)
FROM
Employees;
));
Max Salary:
select max(salary) from tbl_employee <br><br>
Second Max Salary:
select max(salary) from tbl_employee where salary < ( select max(salary) from tbl_employee);
Try below Query, was working for me to find Nth highest number salary.
Just replace your number with nth_No
Select DISTINCT TOP 1 salary
from
(Select DISTINCT TOP *nth_No* salary
from Employee
ORDER BY Salary DESC)
Result
ORDER BY Salary