-
Notifications
You must be signed in to change notification settings - Fork 5
/
sql_IV.sql
240 lines (208 loc) · 4.35 KB
/
sql_IV.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
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
-- GROUP BY
create table grp(
emp varchar2(20),
sal int,
gname varchar2(20)
);
insert into grp values('emp1', 10, 'A');
insert into grp values('emp2', 20, 'A');
insert into grp values('emp3', 30, 'B');
insert into grp values('emp4', 40, 'B');
insert into grp values('emp5', 50, 'B');
select * from grp;
--emp1 10 A
--emp2 20 A
--emp3 30 B
--emp4 40 B
--emp5 50 B
select gname,count(gname) from grp group by gname;
--A 2
--B 3
--HAVING (prevailing condition on group by clause)
select count(gname) from grp
group by gname
having gname = 'A';
--2
select gname, sum(sal) from grp
group by gname
having sum(sal) > 50;
--B 120
/* SubQueries */
select emp from (select emp from grp where sal >=20);
--emp2
--emp3
--emp4
--emp5
select emp from grp
where sal in (select sal from grp);
--emp1
--emp2
--emp3
--emp4
--emp5
select emp,
(case when sal = 10 then 'good' else 'bad' end) "rating" from grp;
--emp1 good
--emp2 bad
--emp3 bad
--emp4 bad
--emp5 bad
select emp from grp g
where exists(select emp from grp where g.emp like '%1'); -- exits returns true/false
--emp1
-- above could also be achieved by -> select emp from grp where emp like '%1';
/* JOINS */
rename grp to grp1;
alter table grp1 add mng varchar(20);
update grp1 set mng = 'mng1' where emp = 'emp1';
update grp1 set mng = 'mng1' where emp = 'emp2';
update grp1 set mng = 'mng2' where emp = 'emp3';
update grp1 set mng = 'mng8' where emp = 'emp4';
update grp1 set mng = 'mng6' where emp = 'emp5';
select * from grp1;
--emp sal gname mng
--emp1 10 A mng1
--emp2 20 A mng1
--emp3 30 B mng2
--emp4 40 B mng8
--emp5 50 B mng6
create table grp2(
mng varchar2(20),
sal numeric(10),
mname varchar2(20)
);
insert into grp2 values('mng1', 100, 'A');
insert into grp2 values('mng2', 200, 'B');
insert into grp2 values('mng3', 300, 'B');
insert into grp2 values('mng4', 400, 'B');
insert into grp2 values('mng5', 500, 'A');
select * from grp2;
--mng sal mname
--mng1 100 A
--mng2 200 B
--mng3 300 B
--mng4 400 B
--mng5 500 A
-- INNER JOIN or EQUI JOIN
-- theta-style
select g1.emp, g2.mng
from grp1 g1, grp2 g2
where g1.mng = g2.mng;
--emp2 mng1
--emp1 mng1
--emp3 mng2
-- alternative way (ansi-style)
select g1.emp, g2.mng
from grp1 g1 inner join grp2 g2
on g1.mng = g2.mng;
--emp2 mng1
--emp1 mng1
--emp3 mng2
--LEFT JOIN
select g1.emp, g2.mng
from grp1 g1 left join grp2 g2
on g1.mng = g2.mng;
--emp2 mng1
--emp1 mng1
--emp3 mng2
--emp5 null
--emp4 null
-- theta style (+ will come opposite side of join name. E.g. for left join + is on right and vice-versa)
select g1.emp, g2.mng
from grp1 g1, grp2 g2
where g1.mng = g2.mng(+);
--RIGHT JOIN
select g1.emp, g2.mng
from grp1 g1 right join grp2 g2
on g1.mng = g2.mng;
--emp1 mng1
--emp2 mng1
--emp3 mng2
--null mng4
--null mng5
--null mng3
-- theta style with same results
select g1.emp, g2.mng
from grp1 g1, grp2 g2
where g1.mng(+) = g2.mng;
-- SELF JOIN
select g1.emp
from grp1 g1, grp1 g2
where g1.emp = g2.mng; -- none of the given employee is manager
--empty
select g1.emp
from grp1 g1, grp1 g2
where g1.emp <> g2.emp; -- on first iteration g1.emp1 is equal to g2.emp1, later g1.emp1 not equal to (<>) g2.emp2 and hence prints and so on
--emp1
--emp1
--emp1
--emp1
--emp2
--emp2
--emp2
--emp2
--emp3
--emp3
--emp3
--emp3
--emp4
--emp4
--emp4
--emp4
--emp5
--emp5
--emp5
--emp5
-- CROSS JOIN
select g1.emp, g2.mng
from grp1 g1 cross join grp2 g2;
--emp1 mng1
--emp1 mng2
--emp1 mng3
--emp1 mng4
--emp1 mng5
--emp2 mng1
--emp2 mng2
--emp2 mng3
--emp2 mng4
--emp2 mng5
--emp3 mng1
--emp3 mng2
--emp3 mng3
--emp3 mng4
--emp3 mng5
--emp4 mng1
--emp4 mng2
--emp4 mng3
--emp4 mng4
--emp4 mng5
--emp5 mng1
--emp5 mng2
--emp5 mng3
--emp5 mng4
--emp5 mng5
/* SET OPEARTIONS */
select emp as all_names from grp1
union
select mng from grp2;
--all_names
--emp1
--emp2
--emp3
--emp4
--emp5
--mng1
--mng2
--mng3
--mng4
--mng5
select mng from grp1
intersect
select mng from grp2;
--mng1
--mng2
select mng from grp1
minus
select mng from grp2;
--mng6
--mng8