SQL


SQL and Relational Database Management Systems (RDBMS)

Overview

Information may be the most valuable commodity in the modern world. It can take many different forms — accounting and payroll information, information about customers and orders, scientific and statistical data, graphics–to mention just a few. We are virtually swamped with data. And we cannot — or at least we'd like to think about it this way — afford to lose it, but these days we simply have too much data to keep storing it in file cabinets or cardboard boxes. The need to safely store large collections of persistent data, efficiently "slice and dice" it from different angles by multiple users and update it easily when necessary is critical for every enterprise. That need mandates the existence of databases, which accomplish all the tasks listed above, and then some. To put it simply, a database is just an organized collection of information — with emphasis on organized.
A more specific definition often used as a synonym for "database" is database management system (DBMS). That term is wider and, in addition to the stored information, includes some methods to work with data and tools to maintain it.
Note 
DBMS can be defined as a collection of interrelated data plus a set of programs to access, modify, and maintain the data. More about DBMS later in this chapter.

Desirable database characteristics

There are many ideas about what a database is and what it should do. However, all modern databases should have at least the following characteristics.

Sufficient capacity

A database's primary function is to store large amounts of information. For example, an order management system for a medium-sized company can easily grow into gigabytes of data; the bigger the company, the more data it needs to store and rely upon. A company that wants to keep historical (archival) data will require even more storage space. The need for storage capacity is growing rapidly, and databases provide for structured storage.

Adequate security

As was noted previously, enterprise data is valuable and must be stored safely. That means protection of the stored data not only from malicious or careless human activities, such as unauthorized logins, accidental information deletions/modifications, and so on, but also from hardware failures and natural disasters.

Multiuser environment

It's also important to note that in order to be useful, the information stored in a database must be accessible to many users simultaneously at different levels of security, and, no matter what, the data must stay consistent. For example, if two users try to change the same piece of information at the same time, the result can be unpredictable (e.g., data corruption), so situations like that have to be handled appropriately by internal database mechanisms. Also, certain groups of users may be allowed to modify several pieces of information, browse other parts of it, and be prevented from even viewing yet another part. (Some company data can be strictly confidential with a very restricted access.)

Effectiveness

Users need quick access to the data they want. It is very important not only to be able to store data, but also to have efficient algorithms to work with it. For example, it would be unacceptable for users to have to scroll through each and every record to find just one order among millions stored in the database; the response to someone's querying the database must be fast, preferably instantaneous.
Note 
As an analogy, suppose you wanted to find all the occurrences of the word "object" in a book. You could physically browse through the entire book page by page until you reach the end. Or you could use the index and determine that the word is used on pages 245, 246, and 348. This situation is comparable to using bad or good programming algorithms.

Scalability

Databases must be flexible and easily adaptable to changing business needs. That primarily means that the internal structure of database objects should be easily modified with minimum impact on other objects and processes; for example, to add a field in a legacy database you would have to bring the whole dataset offline, that is, make it inaccessible to users, modify it, change and recompile related programs, and so on. We'll talk more about that in the "Database Legacy" section of this chapter.
Another scalability aspect is that data typically lives longer than the hardware and software used to access and manipulate it, so it would not be very convenient to have to redesign the entire database to accommodate the current "flavor-of-the-month" development environment; for example, in case of a takeover or when company management suddenly decides to switch production environment from Java to C#.

User-friendliness

Databases are not just for programmers and technical personnel (some would say not for programmers — period). Nontechnical users constitute the majority of all database users nowadays. Accountants, managers, salespeople, doctors and nurses, librarians, scientists, technicians, customer service representatives — for all these and many more people, interaction with databases is an integral part of their work. That means data must be easy to manipulate. Of course, most users will access it through a graphical user interface with a predefined set of screens and limited functionality, but ad-hoc database queries and reports become more and more popular, especially among sophisticated, computer-literate users.
Note
Consider this. An order management application has a screen to view all orders and another window to browse customers. It can also generate a number of reports, including one to analyze orders grouped by customer. But accountant Jerry is working on a report for his boss and needs to find the ten customers with the highest debt. He can request a new report from the IT department, but it will take days (or even weeks) because of bureaucratic routine, programmers' busyness, or something else. The knowledge of SQL can help Jerry to create his own ad-hoc query, get the data, and finish his report.

SQL Data Types

Overview

Previously we defined database as an organized collection of information. Not only does that mean that data have to be organized according to a company's business rules, but also the database organization should reflect the nature of the information. Databases can store dollar amounts, quantities, names, date and time values, binary files, and more. These can be further classified by type, which reflects the "nature" of the data: numbers, characters, dates, etc.
Note 
Data type is a characteristic of a database table column that determines what kind of data it can hold.
One can ask: why do we need data types at all? Wouldn't it be easier simply have one uniform data type and store everything, let's say, in the form of character strings?
There are many reasons why we don't do that. Some of them are historical. For example, when relational databases were born in the late twentieth century, hard disk space and memory storage were at premium, so the idea was to store everything as efficiently as possible. Already existing programming languages had some built-in rules for how to store different types of data. For example, any English character (plus special characters and digits) could be represented using its ASCII equivalent and the necessary storage for it was one byte (more about ASCII later in this chapter). Numbers are traditionally stored in the form of binary strings (native to computer architecture). To represent a number from negative 32,768 to positive 32,767, two bytes (or sixteen bits) of storage are sufficient (216). But if we used ASCII characters to represent numbers, we would need six bytes to store any integer greater than 9,999 (five bytes for digits, and one for the plus or minus sign), five bytes for whole numbers greater than 999 (four bytes for digits, one byte for the sign), and so on. Now imagine — if we have a million of records, we could save four million bytes (about 4M). Sounds like almost nothing today, but back in the 1970s that was incredibly large storage space. The principle of effectiveness is still in place, of course, but now we are talking different scales.
Note 
One byte consists of eight bits. Each bit is a binary number that can either be 0 or 1. All information is stored in memory or on the hard disk in form of ones and zeroes, representing the only two states computers understand: zero means no signal, and one indicates the presence of the signal.
Another reason is logical consistency. Every data type has its own rules, sort order, relations with other data types, implicit conversion rules, and so on. It is definitely easier to work with sets of like values, say dates, rather than with a mixture of dates, numbers, and character strings. Try comparing library shelves where all materials are sorted and classified (fiction is in one room, kids' literature in another, audio books in their special area, videotapes somewhere else) with a pile of chaotically mixed books, tapes, white papers, and CDs and think what would you prefer for finding information.
And the last thing to mention — some modern data types (particularly movie files) are too large and too complicated to store them in a traditional way. Now we are going to discuss existing SQL data types in more details






Queries based on the above tables:

Simple Queries:

1. List all the employee details
2. List all the department details
3. List all job details
4. List all the locations
5. List out first name,last name,salary, commission for all employees
6. List out employee_id,last name,department id for all employees and rename
employee id as “ID of the employee”, last name as “Name of the employee”,
department id as “department ID”
7. List out the employees anuual salary with their names only.

Where Conditions:

8. List the details about “SMITH”
9. List out the employees who are working in department 20
10. List out the employees who are earning salary between 3000 and 4500
11. List out the employees who are working in department 10 or 20
12. Find out the employees who are not working in department 10 or 30
13. List out the employees whose name starts with “S”
14. List out the employees whose name start with “S” and end with “H”
15. List out the employees whose name length is 4 and start with “S”
16. List out the employees who are working in department 10 and draw the
salaries more than 3500
17. list out the employees who are not receiving commission.
Order By Clause:
18. List out the employee id, last name in ascending order based on the employee
id.
19. List out the employee id, name in descending order based on salary column
20. list out the employee details according to their last_name in ascending order
and salaries in descending order
21. list out the employee details according to their last_name in ascending order
and then on department_id in descending order.
Group By & Having Clause:
22.How many employees who are working in different departments wise in the
organization
23. List out the department wise maximum salary, minimum salary, average
salary of the employees
24. List out the job wise maximum salary, minimum salary, average salaries of
the employees.
25. List out the no.of employees joined in every month in ascending order.
26. List out the no.of employees for each month and year, in the ascending order
based on the year, month.
27. List out the department id having atleast four employees.
28.How many employees in January month.
29.How many employees who are joined in January or September month.
30.How many employees who are joined in 1985.
31.How many employees joined each month in 1985.
32.How many employees who are joined in March 1985.
33.Which is the department id, having greater than or equal to 3 employees
joined in April 1985.

Sub-Queries

34. Display the employee who got the maximum salary.
35. Display the employees who are working in Sales department
36. Display the employees who are working as “Clerk”.
37. Display the employees who are working in “New York”
38. Find out no.of employees working in “Sales” department.
39.Update the employees salaries, who are working as Clerk on the basis of
10%.
40.Delete the employees who are working in accounting department.
41. Display the second highest salary drawing employee details.
42. Display the Nth highest salary drawing employee details
Sub-Query operators: (ALL,ANY,SOME,EXISTS)
43. List out the employees who earn more than every employee in department
30.

44. List out the employees who earn more than the lowest salary in department
30.

45. Find out whose department has not employees.
46. Find out which department does not have any employees.
Co-Related Sub Queries:
47.Find out the employees who earn greater than the average salary for their department.

Joins

Simple join

48.List our employees with their department names
49.Display employees with their designations (jobs)
50.Display the employees with their department name and regional groups.
51.How many employees who are working in different departments and display with
department name.
52.How many employees who are working in sales department.
53.Which is the department having greater than or equal to 5 employees and display the
department names in ascending order.
54.How many jobs in the organization with designations.
55.How many employees working in “New York”.
Non – Equi Join:
56.Display employee details with salary grades.
57.List out the no. of employees on grade wise.
58.Display the employ salary grades and no. of employees between 2000 to 5000 range
of salary.
Self Join:
59.Display the employee details with their manager names.
60.Display the employee details who earn more than their managers salaries.
61.Show the no. of employees working under every manager.
Outer Join:
61.Display employee details with all departments.
62.Display all employees in sales or operation departments.
Set Operators:
63.List out the distinct jobs in Sales and Accounting Departments.
64.List out the ALL jobs in Sales and Accounting Departments.
65.List out the common jobs in Research and Accounting Departments in ascending
order.

Answers


1. SQL > Select * from employee;

2. SQL > Select * from department;

3. SQL > Select * from job;

4. SQL > Select * from loc;

5. SQL > Select first_name, last_name, salary, commission from employee;

6. SQL > Select employee_id “id of the employee”, last_name “name",

department id as “department id” from employee;

7. SQL > Select last_name, salary*12 “annual salary” from employee

8. SQL > Select * from employee where last_name=’SMITH’;

9. SQL > Select * from employee where department_id=20

10.SQL > Select * from employee where salary between 3000 and 4500

11.SQL > Select * from employee where department_id in (20,30)

12.SQL > Select last_name, salary, commission, department_id from employee
where department_id not in (10,30)

13.SQL > Select * from employee where last_name like ‘S%’

14.SQL > Select * from employee where last_name like ‘S%H’

15.SQL > Select * from employee where last_name like ‘S___’

16.SQL > Select * from employee where department_id=10 and salary>3500

17.SQL > Select * from employee where commission is Null

18.SQL > Select employee_id, last_name from employee order by employee_id

19.SQL > Select employee_id, last_name, salary from employee order by salary

desc

20.SQL > Select employee_id, last_name, salary from employee order by

last_name, salary desc

21.SQL > Select employee_id, last_name, salary from employee order by

last_name, department_id desc

22.SQL > Select department_id, count(*), from employee group by

department_id

23.SQL > Select department_id, count(*), max(salary), min(salary), avg(salary)

from employee group by department_id

24.SQL > Select job_id, count(*), max(salary), min(salary), avg(salary) from

employee group by job_id

25.SQL > Select to_char(hire_date,’month’)month, count(*) from employee

group by to_char(hire_date,’month’) order by month

26.SQL > Select to_char(hire_date,’yyyy’) Year, to_char(hire_date,’mon’) Month,

count(*) “No. of employees” from employee group by

to_char(hire_date,’yyyy’), to_char(hire_date,’mon’)

27.SQL > Select department_id, count(*) from employee group by

department_id having count(*)>=4

28.SQL > Select to_char(hire_date,’mon’) month, count(*) from employee group

by to_char(hire_date,’mon’) having to_char(hire_date,’mon’)=’jan’

29.SQL > Select to_char(hire_date,’mon’) month, count(*) from employee group

by to_char(hire_date,’mon’) having to_char(hire_date,’mon’) in (‘jan’,’sep’)

30.SQL > Select to_char(hire_date,’yyyy’) Year, count(*) from employee group

by to_char(hire_date,’yyyy’) having to_char(hire_date,’yyyy’)=1985

31.SQL > Select to_char(hire_date,’yyyy’)Year, to_char(hire_date,’mon’) Month,

count(*) “No. of employees” from employee where

to_char(hire_date,’yyyy’)=1985 group by

to_char(hire_date,’yyyy’),to_char(hire_date,’mon’)

32.SQL > Select to_char(hire_date,’yyyy’)Year, to_char(hire_date,’mon’) Month,

count(*) “No. of employees” from employee where

to_char(hire_date,’yyyy’)=1985 and to_char(hire_date,’mon’)=’mar’ group by

to_char(hire_date,’yyyy’),to_char(hire_date,’mon’)

33.SQL > Select department_id, count(*) “No. of employees” from employee

where to_char(hire_date,’yyyy’)=1985 and to_char(hire_date,’mon’)=’apr’

group by to_char(hire_date,’yyyy’), to_char(hire_date,’mon’), department_id

having count(*)>=3

34.SQL > Select * from employee where salary=(select max(salary) from

employee)

35.SQL > Select * from employee where department_id IN (select

department_id from department where name=’SALES’)

36.SQL > Select * from employee where job_id in (select job_id from job where

function=’CLERK’

37.SQL > Select * from employee where department_id=(select department_id

from department where location_id=(select location_id from location where

regional_group=’New York’))

38.SQL > Select * from employee where department_id=(select department_id

from department where name=’SALES’ group by department_id)

39.SQL > Update employee set salary=salary*10/100 wehre job_id=(select

job_id from job where function=’CLERK’)

40.SQL > delete from employee where department_id=(select department_id

from department where name=’ACCOUNTING’)

41.SQL > Select * from employee where salary=(select max(salary) from

employee where salary <(select max(salary) from employee))

42.SQL > Select distinct e.salary from employee where & no-1=(select

count(distinct salary) from employee where sal>e.salary)

43.SQL > Select * from employee where salary > all (Select salary from

employee where department_id=30)

44.SQL > Select * from employee where salary > any (Select salary from

employee where department_id=30)

45.SQL > Select employee_id, last_name, department_id from employee e

where not exists (select department_id from department d where

d.department_id=e.department_id)

46.SQL > Select name from department d where not exists (select last_name

from employee e where d.department_id=e.department_id)

47.SQL > Select employee_id, last_name, salary, department_id from employee

e where salary > (select avg(salary) from employee where

department_id=e.department_id)

48.SQL > Select employee_id, last_name, name from employee e, department d

where e.department_id=d.department_id

49.SQL > Select employee_id, last_name, function from employee e, job j where

e.job_id=j.job_id

50.SQL > Select employee_id, last_name, name, regional_group from employee

e, department d, location l where e.department_id=d.department_id and

d.location_id=l.location_id

51.SQL > Select name, count(*) from employee e, department d where

d.department_id=e.department_id group by name

52.SQL > Select name, count(*) from employee e, department d where

d.department_id=e.department_id group by name having name=’SALES’

53.SQL > Select name, count(*) from employee e, department d where

d.department_id=e.department_id group by name having count (*)>=5 order

by name

54.SQL > Select function, count(*) from employee e, job j where

j.job_id=e.job_id group by function

55.SQL > Select regional_group, count(*) from employee e, department d,

location l where e.department_id=d.department_id and

d.location_id=l.location_id and regional_group=’NEW YORK’ group by

regional_group

56.SQL > Select employee_id, last_name, grade_id from employee e,

salary_grade s where salary between lower_bound and upper_bound order by

last_name

57.SQL > Select grade_id, count(*) from employee e, salary_grade s where

salary between lower_bound and upper_bound group by grade_id order by

grade_id desc

58.SQL > Select grade_id, count(*) from employee e, salary_grade s where

salary between lower_bound and upper_bound and lower_bound>=2000 and

lower_bound<=5000 group by grade_id order by grade_id desc

59.SQL > Select e.last_name emp_name, m.last_name, mgr_name from

employee e, employee m where e.manager_id=m.employee_id

60.SQL > Select e.last_name emp_name, e.salary emp_salary, m.last_name,

mgr_name, m.salary mgr_salary from employee e, employee m where

e.manager_id=m.employee_id and m.salary

61.SQL > Select m.manager_id, count(*) from employee e, employee m where

e.employee_id=m.manager_id group by m.manager_id

62.SQL > Select last_name, d.department_id, d.name from employee e,

department d where e.department_id(+)=d.department_id

63.SQL > Select last_name, d.department_id, d.name from employee e,

department d where e.department_id(+)=d.department_id and

d.department_idin (select department_id from department where name IN

(‘SALES’,’OPERATIONS’))

64.SQL > Select function from job where job_id in (Select job_id from employee

where department_id=(select department_id from department where

name=’SALES’)) union Select function from job where job_id in (Select job_id

from employee where department_id=(select department_id from department

where name=’ACCOUNTING’))

65.SQL > Select function from job where job_id in (Select job_id from employee

where department_id=(select department_id from department where

name=’SALES’)) union all Select function from job where job_id in (Select

job_id from employee where department_id=(select department_id from

department where name=’ACCOUNTING’))

66.SQL > Select function from job where job_id in (Select job_id from employee

where department_id=(select department_id from department where

name=’RESEARCH’)) intersect Select function from job where job_id in

(Select job_id from employee where department_id=(select department_id

from department where name=’ACCOUNTING’)) order by function