-
Notifications
You must be signed in to change notification settings - Fork 0
/
BD_CW6_307354.sql
341 lines (297 loc) · 6.78 KB
/
BD_CW6_307354.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
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
/* Kamil Sztandur 307354 Grupa 2*/
-- WE Informatyka Stosowana (2 semestr)
-- Polecenia rozpoczynają się od 230 linijki. Do tego czasu tworzę i uzupełniam tabele rekordami --
/* Dodanie warunku na zrzucenie tabel w przypadku istnienia już takowych */
IF OBJECT_ID('dbo.WYPAS') IS NOT NULL
BEGIN
DROP TABLE dbo.WYPAS
END
GO
IF OBJECT_ID('dbo.AUTO') IS NOT NULL
BEGIN
DROP TABLE dbo.AUTO
END
GO
IF OBJECT_ID('dbo.WYP_AUTA') IS NOT NULL
BEGIN
DROP TABLE dbo.WYP_AUTA
END
GO
IF OBJECT_ID('dbo.SLOWNIK') IS NOT NULL
BEGIN
DROP TABLE dbo.SLOWNIK
END
GO
/* Utworzenie potrzebnych tabel */
CREATE TABLE dbo.AUTO
(
ID_AUTA int NOT NULL IDENTITY
CONSTRAINT PK_AUTA PRIMARY KEY
, MARKA nchar(16) NOT NULL
, MODEL nvarchar(16) NOT NULL
)
GO
CREATE TABLE dbo.SLOWNIK
(
DODATKI nchar(4) NOT NULL
)
GO
CREATE TABLE dbo.WYP_AUTA
(
WYP nchar(4) NOT NULL
CONSTRAINT PK_WYP_AUTA PRIMARY KEY
, OPIS nvarchar(40)
)
GO
CREATE TABLE dbo.WYPAS
(
ID_AUTA int NOT NULL
CONSTRAINT FK_AUTA__WYPAS Foreign Key
REFERENCES dbo.AUTO (ID_AUTA)
, WYP nchar(4) NOT NULL
CONSTRAINT FK_WYP_AUTA__WYPAS Foreign Key
REFERENCES dbo.WYP_AUTA (WYP)
)
/* Uzupełnienie istniejących tabel jakimiś przykładowymi rekordami */
-- dla dbo.SŁOWNIK
INSERT INTO dbo.SLOWNIK(DODATKI)
VALUES ('AC')
INSERT INTO dbo.SLOWNIK(DODATKI)
VALUES ('ABS')
INSERT INTO dbo.SLOWNIK(DODATKI)
VALUES ('NAVI')
INSERT INTO dbo.SLOWNIK(DODATKI)
VALUES ('4x4')
INSERT INTO dbo.SLOWNIK(DODATKI)
VALUES ('LETH')
INSERT INTO dbo.SLOWNIK(DODATKI)
VALUES ('HEAT')
INSERT INTO dbo.SLOWNIK(DODATKI)
VALUES ('CVT')
-- dla dbo.AUTO
INSERT INTO dbo.AUTO( MARKA, MODEL )
VALUES ('BMW', 'G4')
INSERT INTO dbo.AUTO( MARKA, MODEL )
VALUES ('Audi', 'A1')
INSERT INTO dbo.AUTO( MARKA, MODEL )
VALUES ('Citroen', 'C5')
INSERT INTO dbo.AUTO( MARKA, MODEL )
VALUES ('Toyota', 'Go')
INSERT INTO dbo.AUTO( MARKA, MODEL )
VALUES ('Tesla', 'S')
INSERT INTO dbo.AUTO( MARKA, MODEL )
VALUES ('Peugeot', 'Amecat')
INSERT INTO dbo.AUTO( MARKA, MODEL )
VALUES ('Passat', 'Najlepszy')
INSERT INTO dbo.AUTO( MARKA, MODEL )
VALUES ('BMW', 'G5')
INSERT INTO dbo.AUTO( MARKA, MODEL )
VALUES ('Audi', 'A6')
-- dla dbo.WYP_AUTA
INSERT INTO dbo.WYP_AUTA( WYP, OPIS )
VALUES ('AC', 'Ubezpieczenie samochodu')
INSERT INTO dbo.WYP_AUTA( WYP, OPIS )
VALUES ('ABS', 'Antyblokowanie kół podczas hamowania')
INSERT INTO dbo.WYP_AUTA( WYP, OPIS )
VALUES ('NAVI', 'Wbudowana nawigacja')
INSERT INTO dbo.WYP_AUTA( WYP, OPIS )
VALUES ('4x4', 'Napęd na 4 koła')
INSERT INTO dbo.WYP_AUTA( WYP, OPIS )
VALUES ('LETH', 'Tajemnicze wyposażenie')
INSERT INTO dbo.WYP_AUTA( WYP, OPIS )
VALUES ('HEAT', 'Ogrzewanie samochodu')
INSERT INTO dbo.WYP_AUTA( WYP, OPIS )
VALUES ('CVT', 'Automatyczna skrzynia biegów')
/* Teraz rozdajemy wyposażenia pośród nasze samochody */
INSERT INTO dbo.WYPAS( ID_AUTA, WYP )
VALUES ( 1, 'HEAT')
INSERT INTO dbo.WYPAS( ID_AUTA, WYP )
VALUES ( 1, 'ABS')
INSERT INTO dbo.WYPAS( ID_AUTA, WYP )
VALUES ( 2, '4x4')
INSERT INTO dbo.WYPAS( ID_AUTA, WYP )
VALUES ( 4, 'CVT')
INSERT INTO dbo.WYPAS( ID_AUTA, WYP )
VALUES ( 5, 'NAVI')
INSERT INTO dbo.WYPAS( ID_AUTA, WYP )
VALUES ( 5, 'AC')
INSERT INTO dbo.WYPAS( ID_AUTA, WYP )
VALUES ( 5, 'HEAT')
INSERT INTO dbo.WYPAS( ID_AUTA, WYP )
VALUES ( 5, 'ABS')
INSERT INTO dbo.WYPAS( ID_AUTA, WYP )
VALUES ( 6, 'LETH')
INSERT INTO dbo.WYPAS( ID_AUTA, WYP )
VALUES ( 6, 'AC')
INSERT INTO dbo.WYPAS( ID_AUTA, WYP )
VALUES ( 6, 'CVT')
INSERT INTO dbo.WYPAS( ID_AUTA, WYP )
VALUES ( 7, 'HEAT')
INSERT INTO dbo.WYPAS( ID_AUTA, WYP )
VALUES ( 7, 'NAVI')
INSERT INTO dbo.WYPAS( ID_AUTA, WYP )
VALUES ( 7, '4x4')
INSERT INTO dbo.WYPAS( ID_AUTA, WYP )
VALUES ( 7, 'CVT')
INSERT INTO dbo.WYPAS( ID_AUTA, WYP )
VALUES ( 8, 'ABS')
INSERT INTO dbo.WYPAS( ID_AUTA, WYP )
VALUES ( 9, 'NAVI')
--SELECT *
--FROM dbo.AUTO
/*
ID_AUTA MARKA MODEL
1 BMW G4
2 Audi A1
3 Citroen C5
4 Toyota Go
5 Tesla S
6 Peugeot Amecat
7 Passat Najlepszy
8 BMW G5
9 Audi A6
*/
--SELECT *
--FROM dbo.SLOWNIK
/*
DODATKI
AC
ABS
NAVI
4x4
LETH
HEAT
CVT
*/
--SELECT *
--FROM dbo.WYP_AUTA
/*
WYP OPIS
4x4 Napęd na 4 koła
ABS Antyblokowanie kół podczas hamowania
AC Ubezpieczenie samochodu
CVT Automatyczna skrzynia biegów
HEAT Ogrzewanie samochodu
LETH Tajemnicze wyposażenie
NAVI Wbudowana nawigacja
*/
--SELECT *
--FROM dbo.WYPAS
/*
ID_AUTA WYP
1 HEAT
1 ABS
2 4x4
4 CVT
5 NAVI
5 AC
5 HEAT
5 ABS
6 LETH
6 AC
6 CVT
7 HEAT
7 NAVI
7 4x4
7 CVT
8 ABS
9 NAVI
*/
/* Przejdźmy teraz do poleceń */
-- Polecenie 1)
SELECT a.ID_AUTA AS [ID Samochodu]
, CONVERT( nvarchar(33), a.MARKA + ' ' + a.MODEL ) AS [Samochód]
FROM dbo.AUTO a
WHERE NOT EXISTS (
SELECT 1
FROM dbo.WYPAS w
WHERE (w.ID_AUTA = a.ID_AUTA)
)
/* Wynik zapytania:
ID Samochodu Samochód
3 Citroen C5
*/
-- Polecenie 2)
SELECT a.ID_AUTA AS [ID Samochodu]
, CONVERT( nvarchar(33), a.MARKA + ' ' + a.MODEL ) AS [Samochód]
FROM dbo.AUTO a
WHERE NOT EXISTS (
SELECT 1
FROM dbo.WYPAS w
WHERE (w.ID_AUTA = a.ID_AUTA)
AND (w.WYP = 'AC')
)
ORDER BY 1
/* Wynik zapytania:
ID Samochodu Samochód
1 BMW G4
2 Audi A1
3 Citroen C5
4 Toyota Go
7 Passat Najlepszy
8 BMW G5
9 Audi A6
*/
-- Polecenie 3)
SELECT a.ID_AUTA AS [ID Samochodu]
, CONVERT( nvarchar(33), a.MARKA + ' ' + a.MODEL ) AS [Samochód]
FROM dbo.AUTO a
WHERE EXISTS (
SELECT 1
FROM dbo.WYPAS w
WHERE (a.ID_AUTA = w.ID_AUTA)
AND w.WYP = 'AC'
) AND EXISTS (
SELECT 1
FROM dbo.WYPAS w
WHERE (a.ID_AUTA = w.ID_AUTA)
AND w.WYP = 'ABS'
)
/* Wynik zapytania:
1 BMW G4
5 Tesla S
6 Peugeot Amecat
8 BMW G5
*/
-- Polecenie 4)
SELECT a.ID_AUTA AS [ID Samochodu]
, CONVERT( nvarchar(33), a.MARKA + ' ' + a.MODEL ) AS [Samochód]
FROM dbo.AUTO a
WHERE EXISTS (
SELECT 1
FROM dbo.WYPAS w
WHERE (a.ID_AUTA = w.ID_AUTA)
AND w.WYP IN ('AC', 'ABS')
)
-- Polecenie 5)
SELECT s.DODATKI AS [Wyposażenie]
, COUNT( w.WYP ) AS [Ilość użytkujących samochodów]
FROM dbo.SLOWNIK s
LEFT OUTER JOIN dbo.WYPAS w
ON (s.DODATKI = w.WYP)
GROUP BY s.DODATKI
/* Wynik zapytania:
Wyposażenie Ilość użytkujących samochodów
4x4 2
ABS 3
AC 2
CVT 3
HEAT 3
LETH 0 <--- Specjalnie na potrzeby polecenia wyzerowałem tę ilość, aby upewnić się, że polecenie zwróci także 0
NAVI 3
*/
-- Polecenie 6)
SELECT TOP 1 WITH TIES
a.ID_AUTA AS [ID najbardziej rozbudowanego Samochodu]
, COUNT( w.WYP ) AS [Ilość dodatków]
FROM dbo.AUTO a
JOIN dbo.WYPAS w
ON (w.ID_AUTA = a.ID_AUTA)
GROUP BY a.ID_AUTA
ORDER BY 2 DESC
/* Wynik zapytania:
ID Samochodu Ilość dodatków
5 4
7 4
Czyli obydwa samochody (5 i 6) mają największą ilość wyposażeń
*/