SQL Query Interview Questions and Answers
SQL Query Interview Questions and Answers
What is SQL?
SQL stands for Structured Query Language
SQL lets you access and manipulate databases
SQL is an ANSI (American National Standards Institute) standard
SubLanguages of SQL
DDL: This is a set of command is used to design the structure in
Database.CREATE,ALTER and DROP are some of the following DDL Commands.
DML: This is a set of command is used to manipulate the data in database
manipulation of data include insertion ,updation and deletion of record from the
table.SELECT,INSERT,UPDATE and DELETE are some of the following DML
commands.
DCL: This is a set of command is used to control the data in database .SQL used
GRANT statement to give permission or REVOKE is used to take back permission.
TCL : Any changes make by DML Command is not make permanent to confirm this
changes SQL uses COMMIT statement or the other hand ROLLBACK is used to
get back to the state it was in before the changes were made.
SYNTAX
CRATE COMMAND:
CREATE TABLE Persons
(
PersonID int primary key,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
ALTER COMMAND:
To add column
ALTER TABLE table_name
ADD column_name datatype
To DROP Column
ALTER TABLE table_name
DROP COLUMN column_name
DROP COMMAND:
DROP TABLE TABLENAME
Insert command :
Suppose the table have following fields :rollno,name,course,phno in we want to store the value in all
fields :
If table have four field but we have to store the value only in two or three field IN this case query is
Update command :
Delete command :
Select Command:
select MAX(Salary) from Employee WHERE Salary NOT IN (select MAX(Salary) from Employee );
This questions become more interesting if Interviewer will ask you to print department name
instead of department id, in that case you need to join Employee table with Department using
foreign key DeptID, make sure you do LEFT or RIGHT OUTER JOIN to include
departments without any employee as well. Here is the query
In this query we have use RIGHT OUTER JOIN because we need name of department from
Department table which is on right side of JOIN clause, even if there is no reference of
dept_id on Employee table.
Question 4: Write an SQL Query to check whether date passed to Query is date of given
format or not.
Answer : SQL has IsDate() function which is used to check passed value is date or not of
specified format ,it returns 1(true) or 0(false) accordingly. Remember ISDATE() is
a MSSQL function and it may not work on Oracle, MySQL or any other database but there
would be something similar.
Question 5: Write a SQL Query to print the name of distinct employee whose DOB is
between 01/01/1960 to 31/12/1975.
Answer : This SQL query is tricky but you can use BETWEEN clause to get all records
whose date fall between two dates.
SELECT DISTINCT EmpName FROM Employees WHERE DOB BETWEEN
‘01/01/1960’ AND ‘31/12/1975’;
Question 6: Write an SQL Query find number of employees according to gender whose
DOB is between 01/01/1960 to 31/12/1975.
Answer :
SELECT COUNT(*), sex from Employees WHERE DOB BETWEEN '01/01/1960' AND
'31/12/1975' GROUP BY sex;
Question 7: Write an SQL Query to find employee whose Salary is equal or greater
than 10000.
Answer :
Question 8: Write an SQL Query to find name of employee whose name Start with ‘M’
Answer :
Question 9: find all Employee records containing the word "Joe", regardless of whether
it was stored as JOE, Joe, or joe.
Question 11 : Write SQL Query to find duplicate rows in a database? and then write
SQL query to delete them?
Answer : You can use following query to select distinct records :
SELECT * FROM emp a WHERE rowid = (SELECT MAX(rowid) FROM EMP b WHERE
a.empno=b.empno)
to Delete:
DELETE FROM emp a WHERE rowid != (SELECT MAX(rowid) FROM emp b WHERE
a.empno=b.empno);
Question 12 : There is a table which contains two column Student and Marks, you need
to find all the students, whose marks are greater than average marks i.e. list of above
average students.
Answer : This query can be written using sub query as shown below :
SELECT student, marks from table where marks > SELECT AVG(marks) from
table)
Answer : You need to know about self join to solve this problem. In Self Join, you can join
two instances of same table to find out additional details as shown below
this will show employee name and manger name in two column e.g.
name manager_name
John David
One follow-up is to modify this query to include employees which doesn't have manager. To
solve that, instead of using inner join, just use left outer join, this will also include employees
without managers.
Question 14 : You have a composite index of three columns, and you only provide value
of two columns in WHERE clause of a select query? Will Index be used for this
operation? For example if Index is on EmpId, EmpFirstName and EmpSecondName
and you write query like
If the given two columns are secondary index column then index will not invoke, but if the
given 2 columns contain primary index(first col while creating index) then index will invoke.
In this case Index will be used because EmpId and EmpFirstName are primary columns.
Inner join is the most common type of Join which is used to combine the rows from two
tables and create a result set containing only such records that are present in both the tables
based on the joining condition (predicate).
Inner join returns rows when there is at least one match in both tables
If none of the record matches between two tables, then INNER JOIN will return a NULL set.
Below is an example of INNER JOIN and the resulting set.
Outer Join
Outer Join, on the other hand, will return matching rows from both tables as well as any
unmatched rows from one or both the tables (based on whether it is single outer or full outer
join respectively).
Notice in our record set that there is no employee in the department 5 (Logistics). Because of
this if we perform inner join, then Department 5 does not appear in the above result. However
in the below query we perform an outer join (dept left outer join emp), and we can see this
department.
The (+) sign on the emp side of the predicate indicates that emp is the outer table here. The
above SQL can be alternatively written as below (will yield the same result as above):
UNION operation allows us to add 2 similar data sets to create resulting data set that contains
all the data from the source data sets. Union does not require any condition for joining. For
example, if you have 2 employee tables with same structure, you can UNION them to create
one result set that will contain all the employees from both of the tables.
In the following example, I am choosing exactly the same employee from the emp table and
performing UNION and UNION ALL. Check the difference in the result.
4 Sales
5 Logistics
Next, suppose we want to see only those Departments where Average salary is greater than
80. Here the condition is associated with a non-static aggregated information which is
“average of salary”. We will need to use HAVING clause here:
Engineering 90
As you see above, there is only one department (Engineering) where average salary of
employees is greater than 80.
MINUS operator when used between 2 tables, gives us all the rows from the first table except
the rows which are present in the second table.
INTERSECT operator returns us only the matching or common rows between 2 result sets.
To understand these operators, let’s see some examples. We will use two different queries to
extract data from our emp table and then we will perform UNION, MINUS and INTERSECT
operations on these two sets of data.
UNION
SELECT * FROM EMPLOYEE WHERE ID = 5
UNION
SELECT * FROM EMPLOYEE WHERE ID = 6
I MGR_ID DEPT_ID NAME SAL DOJ
D
5 2 2.0 Anno 80.0 01-Feb-2012
6 2 2.0 Darl 80.0 11-Feb-2012
MINUS
SELECT * FROM EMPLOYEE
MINUS
INTERSECT
SELECT * FROM EMPLOYEE WHERE ID IN (2, 3, 5)
INTERSECT
SELECT * FROM EMPLOYEE WHERE ID IN (1, 2, 4, 5)
I MGR_ID DEPT_I NAME SAL DOJ
D D
5 2 2 Anno 80.0 01-Feb-2012
2 1 2 Robo 100.0 01-Jan-2012
Self Join is often very useful to convert a hierarchical structure into a flat structure
In our employee table example above, we have kept the manager ID of each employee in the
same row as that of the employee. This is an example of how a hierarchy (in this case
employee-manager hierarchy) is stored in the RDBMS table. Now, suppose if we need to
print out the names of the manager of each employee right beside the employee, we can use
self join. See the example below:
The only reason we have performed a left outer join here (instead of INNER JOIN) is we
have one employee in this table without a manager (employee ID = 1). If we perform inner
join, this employee will not show-up.
SELECT name, sal, (SELECT COUNT(*) FROM EMPLOYEE i WHERE o.name >= i.name)
row_num
FROM EMPLOYEE o
order by row_num
NAME SAL ROW_NUM
Anno 80 1
Bhuti 60 2
Darl 80 3
Hash 100 4
Inno 50 5
Mem 60 6
e
Pete 70 7
Privy 50 8
Robo 100 9
Tomiti 70 10
The column that is used in the row number generation logic is called “sort key”. Here sort
key is “name” column. For this technique to work, the sort key needs to be unique. We have
chosen the column “name” because this column happened to be unique in our Employee
table. If it was not unique but some other collection of columns was, then we could have used
those columns as our sort key (by concatenating those columns to form a single sort key).
Also notice how the rows are sorted in the result set. We have done an explicit sorting on the
row_num column, which gives us all the row numbers in the sorted order. But notice that
name column is also sorted (which is probably the reason why this column is referred as sort-
key). If you want to change the order of the sorting from ascending to descending, you will
need to change “>=” sign to “<=” in the query.
As I said before, this method is not very generic. This is why many databases already
implement other methods to achieve this. For example, in Oracle database, every SQL result
set contains a hidden column called ROWNUM. We can just explicitly select ROWNUM to
get sequence numbers.
In Oracle,
SELECT *
FROM EMP
WHERE ROWNUM <= 5;
In SQL Server,
Generic solution,
I believe a generic solution can be devised for this problem if and only if there exists at least
one distinct column in the table. For example, in our EMP table ID is distinct. We can use
that distinct column in the below way to come up with a generic solution of this question that
does not require database specific functions such as ROWNUM, TOP etc.
SELECT name
FROM EMPLOYEE o
WHERE (SELECT count(*) FROM EMPLOYEE i WHERE i.name < o.name) < 5
name
Inno
Anno
Darl
Meme
Bhuti
I have taken “name” column in the above example since “name” is happened to be unique in
this table. I could very well take ID column as well.
In this example, if the chosen column was not distinct, we would have got more than 5
records returned in our output.
Do you have a better solution to this problem? If yes, post your solution in the comment.
RANK does not assign unique numbers—nor does it assign contiguous numbers. If two
records tie for second place, no record will be assigned the 3rd rank as no one came in third,
according to RANK. See below:
DENSE_RANK, like RANK, does not assign unique numbers, but it does assign contiguous
numbers. Even though two records tied for second place, there is a third-place record. See
below:
Stored Procedure:
Stored Procedure in SQL Server can be defined as the set of logical group of SQL statements
which are grouped to perform a specific task. There are many benefits of using a stored
procedure. The main benefit of using a stored procedure is that it increases the performance
of the database.The other benefits of using the Stored Procedure are given below.