Wednesday, August 12, 2009

Sql Queries most asked in job interviews

INTRODUCTION

SQL queries most asked in .NET/SQL Server job interviews. These tricky queries may be required in your day to day database usage.

BACKGROUND

This article demonstrates some commonly asked SQL queries in a job interview. I will be covering some of the common but tricky queries like:-

(i) Finding the nth highest salary of an employee.
(ii) Finding TOP X records from each group.
(iii) Deleting duplicate rows from a table.

NOTE : All the SQL mentioned in this article has been tested under SQL Server 2005.

(i) Finding the nth highest salary of an employee.

Create a table named Employee_Test and insert some test data as:-
Collapse
CREATE TABLE Employee_Test ( Emp_ID INT Identity, Emp_name Varchar(100), Emp_Sal Decimal (10,2) )  INSERT INTO Employee_Test VALUES ('Anees',1000); INSERT INTO Employee_Test VALUES ('Rick',1200); INSERT INTO Employee_Test VALUES ('John',1100); INSERT INTO Employee_Test VALUES ('Stephen',1300); INSERT INTO Employee_Test VALUES ('Maria',1400); 
It is very easy to find the highest salary as:-
Collapse
--Highest Salary select max(Emp_Sal) from Employee_Test 
Now, if you are asked to find the 3rd highest salary, then the query is as:-
Collapse
--3rd Highest Salary select min(Emp_Sal) from Employee_Test where Emp_Sal in (select distinct top 3 Emp_Sal from Employee_Test order by Emp_Sal desc) 
The result is as :- 1200
To find the nth highest salary, replace the top 3 with top n (n being an integer 1,2,3 etc.)
Collapse
--nth Highest Salary select min(Emp_Sal) from Employee_Test where Emp_Sal in (select distinct top n Emp_Sal from Employee_Test order by Emp_Sal desc) 

(ii) Finding TOP X records from each group

Create a table named photo_test and insert some test data as :-
Collapse
create table photo_test ( pgm_main_Category_id int, pgm_sub_category_id int, file_path varchar(MAX) )  insert into photo_test values (17,15,'photo/bb1.jpg');                                                        insert into photo_test values(17,16,'photo/cricket1.jpg');                                                     insert into photo_test values(17,17,'photo/base1.jpg');                                                        insert into photo_test values(18,18,'photo/forest1.jpg');                                                        insert into photo_test values(18,19,'photo/tree1.jpg');                                                            insert into photo_test values(18,20,'photo/flower1.jpg');                                                      insert into photo_test values(19,21,'photo/laptop1.jpg');                                                        insert into photo_test values(19,22,'photo/camer1.jpg');                                                   insert into photo_test values(19,23,'photo/cybermbl1.jpg');                                                     insert into photo_test values (17,24,'photo/F1.jpg'); 
There are three groups of pgm_main_category_id each with a value of 17 (group 17 has four records),18 (group 18 has three records) and 19 (group 19 has three records).
Now, if you want to select top 2 records from each group, the query is as follows:-
Collapse
select pgm_main_category_id,pgm_sub_category_id,file_path from ( select pgm_main_category_id,pgm_sub_category_id,file_path, rank() over (partition by pgm_main_category_id order by pgm_sub_category_id asc) as rankid from photo_test ) photo_test where rankid < 3 -- replace 3 by any number 2,3 etc for top2 or top3. order by pgm_main_category_id,pgm_sub_category_id 
The result is as:-
Collapse
pgm_main_category_id pgm_sub_category_id file_path 17                    15                    photo/bb1.jpg 17                    16                    photo/cricket1.jpg 18                    18                    photo/forest1.jpg 18                    19                    photo/tree1.jpg 19                    21                    photo/laptop1.jpg 19                    22                    photocamer1.jpg 

(iii) Deleting duplicate rows from a table

A table with a primary key doesn’t contain duplicates. But if due to some reason, the keys have to be disabled or when importing data from other sources, duplicates come up in the table data, it is often needed to get rid of such duplicates.
This can be achieved in tow ways :-
(a) Using a temporary table.
(b) Without using a temporary table.

(a) Using a temporary or staging table

Let the table employee_test1 contain some duplicate data like:-
Collapse
CREATE TABLE Employee_Test1 ( Emp_ID INT, Emp_name Varchar(100), Emp_Sal Decimal (10,2) )  INSERT INTO Employee_Test1 VALUES (1,'Anees',1000); INSERT INTO Employee_Test1 VALUES (2,'Rick',1200); INSERT INTO Employee_Test1 VALUES (3,'John',1100); INSERT INTO Employee_Test1 VALUES (4,'Stephen',1300); INSERT INTO Employee_Test1 VALUES (5,'Maria',1400); INSERT INTO Employee_Test1 VALUES (6,'Tim',1150); INSERT INTO Employee_Test1 VALUES (6,'Tim',1150); 
Step 1: Create a temporary table from the main table as:-
Collapse
select top 0* into employee_test1_temp from employee_test1 
Step2 : Insert the result of the GROUP BY query into the temporary table as:-
Collapse
insert into employee_test1_temp select Emp_ID,Emp_name,Emp_Sal from employee_test1 group by Emp_ID,Emp_name,Emp_Sal 
Step3: Truncate the original table as:-
Collapse
truncate table employee_test1 
Step4: Fill the original table with the rows of the temporary table as:-
Collapse
insert into employee_test1 select * from employee_test1_temp 
Now, the duplicate rows from the main table have been removed.
Collapse
select * from employee_test1 
gives the result as:-
Collapse
Emp_ID Emp_name   Emp_Sal 1 Anees    1000 2 Rick    1200 3 John    1100 4 Stephen    1300 5 Maria    1400 6 Tim    1150 

(b) Without using a temporary table

Collapse
;with T as (  select * , row_number() over (partition by Emp_ID order by Emp_ID) as rank  from employee_test1 )  delete from T where rank > 1  
The result is as:-
Collapse
Emp_ID Emp_name   Emp_Sal 1 Anees    1000 2 Rick    1200 3 John    1100 4 Stephen    1300 5 Maria    1400 6 Tim    1150  

CONCLUSION

I hope that these queries will help you for Interviews as well as in your day database activities.

1 comment:

  1. Finding the nth highest salary of an employee in Oracle

    select first_name, salary from (select rownum r, first_name, salary from employees order by salary desc) where r=n

    ex:-
    For 3rd highest sal
    select first_name, salary from (select rownum r, first_name, salary from employees order by salary desc) where r=3

    ReplyDelete