-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDB-1-EX_Solutions.sql
168 lines (157 loc) · 3.83 KB
/
DB-1-EX_Solutions.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
--#########################################################################
--Day 1 Solutions
--#########################################################################
--### Queries on a single table #######
-- 1.1 a)
SELECT *
FROM dept;
-- 1.1 b)
SELECT empno FROM emp WHERE ename = 'MARTIN';
-- 1.1 c)
SELECT * FROM emp WHERE sal > 1500;
-- 1.1 d)
SELECT DISTINCT job FROM emp;
-- 1.1 e)
SELECT ename AS "Sales men with salary > 1300"
FROM emp
WHERE sal > 1300
AND job = 'SALESMAN';
-- 1.1 f)
SELECT ename "Non salesmen", job FROM emp WHERE job <> 'SALESMAN';
-- 1.1 g)
SELECT ename "Name",
sal AS "Salary",
sal*0.9 AS "Salary - 10%"
FROM emp
WHERE job = 'CLERK';
-- 1.1 h)
SELECT ename
FROM emp
WHERE hiredate < to_date('01-05-1981','DD MM YYYY');
--### Aggregate functions #######
-- 1.2 a)
SELECT COUNT(*) AS "Total employees"
FROM emp;
-- 1.2 b)
SELECT AVG(sal),
SUM(sal)/COUNT(*) AS "Just for fun"
FROM emp
WHERE deptno = 20;
-- 1.2 c)
SELECT COUNT(DISTINCT job) FROM emp;
-- 1.2 d)
SELECT deptno "Department number",
COUNT(*) "Total employees"
FROM emp
GROUP BY deptno;
-- 1.2 e)
SELECT MAX(sal),
deptno
FROM emp
GROUP BY deptno
ORDER BY deptno DESC;
--### Joining tables #######
-- 1.3 a) Using a where clause
SELECT loc "Allens location"
FROM dept,
emp
WHERE emp.deptno = dept.deptno
AND ename = 'ALLEN';
-- 1.3 a) Using a specific join clause (join = inner join)
SELECT d.loc
FROM dept d
JOIN emp e
ON e.deptno = d.deptno
WHERE ename ='ALLEN';
-- 1.3 b (Could also have been done using a where clause as in 1.3a, it will still be a join)
SELECT e.ename
FROM emp e
JOIN dept d
ON e.deptno = d.deptno
WHERE d.dname = 'SALES';
-- 1.3c (Could also have been done using a where clause as in 1.3a, it will still be a join)
SELECT MAX(sal)
FROM emp e
JOIN dept d
ON e.deptno = d.deptno
WHERE d.dname='SALES';
--### Subqueries (with alternatives) #######
-- 1.4 a)
-- 1) Strategy find the id of Smiths manager (the inner query)
---2) Use this id to find the manager
SELECT ename AS "Smith's manager"
FROM emp
WHERE empno =
( SELECT mgr FROM emp WHERE ename = 'SMITH'
);
--1.4 a) Alternative solution using a SELF join (The table is joined to with itself)
SELECT e1.ename AS "Smith's manager"
FROM emp e1
JOIN emp e2
ON e1.empno = e2.mgr
WHERE e2.ename= 'SMITH';
-- 1.4b) (Can also be solved using a self join as in 1.4 a )
SELECT ename AS "Managed by the president"
FROM emp
WHERE mgr =
( SELECT empno FROM emp WHERE job = 'PRESIDENT'
);
--1.4 c)
SELECT *
FROM emp
WHERE empno =
(SELECT mgr
FROM emp
WHERE --Smith's managers manager
empno =
( SELECT mgr FROM emp /*--Smiths manager*/
WHERE ename = 'SMITH'
)
);
--This was fun :-) So continue and find: who is the manager of Smiths managers, manager ?
SELECT ename "S.. managers managers manager"
FROM emp
WHERE empno =
(SELECT mgr
FROM emp
WHERE empno =
(SELECT mgr
FROM emp
WHERE --Smith's managers manager
empno =
( SELECT mgr FROM emp /*--Smiths manager*/
WHERE ename = 'SMITH'
)
)
);
--Let's continue :-) Who is the manager of Smiths managers, managers managers manager
SELECT ename, nvl(to_char(mgr),'Has no manager') "Smitms m's m's m's m"FROM emp
WHERE empno =
(SELECT mgr
FROM emp
WHERE empno =
(SELECT mgr
FROM emp
WHERE --Smith's managers manager
empno =
( SELECT mgr FROM emp /*--Smiths manager*/
WHERE ename = 'SMITH'
)
)
);
--1.4 d)
--Strategy (from inside out)
-- 1) Find all employees who are managers
-- 2) Use this info to find all mgr's from employees who are not managers
-- 3) Use this to find the details of the managers
SELECT * -- 3) Select managers of all non-managers
FROM emp
WHERE empno IN
(
SELECT mgr FROM emp -- 2) Select all NON-managers
WHERE empno NOT IN
(
SELECT e1.empno FROM emp e1 --1)Find all managers
JOIN emp e2 ON e1.empno = e2.mgr
)
);