-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathUserStory_SQLScripts.sql
More file actions
363 lines (264 loc) · 11.6 KB
/
UserStory_SQLScripts.sql
File metadata and controls
363 lines (264 loc) · 11.6 KB
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
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
## USER STORY - SQL SCRIPTS ##
#UserStory 1 As a customer I want to borrow a couple of books per month so that I can read for pleasure
UPDATE copy
SET copy.IsAvailable = 0
where copy.BookID = '000000001';
INSERT into loan (`LibraryCardID`, `BookID`, `DateOut`, `DateReturned`)
VALUES ('2', '000000001', '2019/03/31', '2019/04/30')
#UserStory 2 As a customer I want to find books by genre so that I can plan for lessons
SELECT Title, concat(Author.FirstName,' ', Author.LastName) as 'Author', Genre.GenreName
FROM Book
Inner join Genre
ON Genre.GenreCode = Book.Genre
Inner Join BookISBN_AuthorID
ON Book.BookISBN = BookISBN_AuthorID.BookISBN
INNER JOIN Author
ON bookisbn_authorid.AuthorID = Author.AuthorID
WHERE Genre.GenreName = 'Biographical'
#UserStory 3 As a customer I want to find books by age range so that my child has suitable reading material
SELECT Title, concat(Author.FirstName,' ', Author.LastName) as 'Author', Agerange.AgeRange
FROM Book
Inner join agerange
ON Agerange.ageID = Book.AgeID
Inner Join BookISBN_AuthorID
ON Book.BookISBN = BookISBN_AuthorID.BookISBN
INNER JOIN Author
ON bookisbn_authorid.AuthorID = Author.AuthorID
WHERE Agerange.AgeRange = 'Under 3'
#UserStory 4 As a student I want to reserve books out on loan so that I can borrow them by a specified date
Need to create a reservation table
#UserStory 5 As a university professor I want to see a list of previously borrowed books in my account area so I can borrow them by a specified date
Similar to user story 9.
#UserStory6 As a customer I want to search for books by title so that I can quickly find what I am looking for
SELECT concat(Author.FirstName,' ', Author.LastName) as 'Author', Book.*, Copy.IsAvailable, LibraryBranch.LibraryBranch
FROM bookisbn_authorid
INNER JOIN Book
ON bookisbn_authorid.BookISBN=Book.BookISBN
INNER JOIN Author
ON bookisbn_authorid.AuthorID = Author.AuthorID
INNER JOIN copy
ON bookisbn_authorid.BookISBN = copy.BookISBN
INNER JOIN LibraryBranch
ON Copy.BranchID = LibraryBranch.BranchID
Where Book.Title= 'The Subtle Art of Not Giving a F*ck' AND Copy.IsAvailable = 1;
#UserStory7 As a customer I want to search for books by author so that I can see everything they have published
SELECT concat(Author.FirstName,' ', Author.LastName) as 'Author', Book.*, Copy.IsAvailable, LibraryBranch.LibraryBranch
FROM bookisbn_authorid
INNER JOIN Book
ON bookisbn_authorid.BookISBN=Book.BookISBN
INNER JOIN Author
ON bookisbn_authorid.AuthorID = Author.AuthorID
INNER JOIN copy
ON bookisbn_authorid.BookISBN = copy.BookISBN
INNER JOIN LibraryBranch
ON Copy.BranchID = LibraryBranch.BranchID
Where Author.FirstName = 'Gary' AND Author.LastName = 'Chapman' AND copy.IsAvailable = 1;
#UserStory8 As a customer I want to search for books by ISBN so that I can quickly find what I am looking for
SELECT concat(Author.FirstName,' ', Author.LastName) as 'Author', Book.*, copy.IsAvailable, LibraryBranch.LibraryBranch
FROM bookisbn_authorid
INNER JOIN Book
ON bookisbn_authorid.BookISBN=Book.BookISBN
INNER JOIN Author
ON bookisbn_authorid.AuthorID = Author.AuthorID
INNER JOIN copy
ON bookisbn_authorid.BookISBN = copy.BookISBN
INNER JOIN LibraryBranch
ON copy.BranchID= LibraryBranch.BranchID
Where Book.BookISBN = '978-0062457714' AND copy.IsAvailable = 1;
#UserStory9 As a customer I want to see all my loan activity so I have it for my records
-- Need Loan table to be created. Book needs BookLoanHistory field, LibraryCardHolder also needs CustomerLoanHistory
SELECT DISTINCT
concat(librarycardholder.FirstName, ' ', librarycardholder.SecondName) as 'Customer name',
Book.Title,
concat(Author.FirstName,' ', Author.LastName) as 'Author',
Loan.DateOut,
Loan.DateReturned,
DATE_ADD(DateOut, INTERVAL 1 MONTH) as 'Due back'
FROM Loan
INNER JOIN LibraryCardHolder
ON LibraryCardHolder.LibraryCardID = Loan.LibraryCardID
INNER JOIN copy
ON copy.BookID=loan.BookID
INNER JOIN bookisbn_authorid
ON copy.BookISBN=bookisbn_authorid.BookISBN
INNER JOIN book
ON book.BookISBN=bookisbn_authorid.BookISBN
INNER JOIN Author
ON bookisbn_authorid.AuthorID = Author.AuthorID
WHERE Loan.LibraryCardID = '6'
#UserStory10 As a customer I want to see just my current loans so I know which books I have to return and when.
SELECT DISTINCT
concat(librarycardholder.FirstName, ' ', librarycardholder.LastName) as 'Customer name',
Book.Title,
concat(Author.FirstName,' ', Author.LastName) as 'Author',
Loan.DateOut,
Loan.DateReturned,
DATE_ADD(DateOut, INTERVAL 1 MONTH) as 'Due back'
FROM Loan
INNER JOIN LibraryCardHolder
ON LibraryCardHolder.LibraryCardID = Loan.LibraryCardID
INNER JOIN copy
ON copy.BookID=loan.BookID
INNER JOIN bookisbn_authorid
ON copy.BookISBN=bookisbn_authorid.BookISBN
INNER JOIN book
ON book.BookISBN=bookisbn_authorid.BookISBN
INNER JOIN Author
ON bookisbn_authorid.AuthorID = Author.AuthorID
WHERE Loan.LibraryCardID = '6'
AND DateReturned IS NULL
#UserStory11 As a customer I want to be able to update my name and address information
-- name update--
UPDATE librarycardholder
SET librarycardholder.FirstName = 'Ell'
WHERE librarycardholder.librarycardid = 1
--address update--
UPDATE Address, Road, City, Postcode
SET Address.AddressNumber = '15',
Road.RoadName = 'High Street',
City.CityName = 'Bath',
Postcode.Postcode = 'BA2 0AA'
Where Address.AddressID = 000000001
#User story 12 As a customer I want to be able to change my password
UPDATE librarycardholder
SET librarycardholder.Password = '745845'
WHERE librarycardholder.librarycardid = 1
#User story 13 As a library website administrator I want to search for user accounts
SELECT * FROM librarycardholder
WHERE LibraryCardID = 1
#User story 14 As a library website administrator I want add new book titles to the database as they become available
INSERT INTO book(BookISBN, Title, YearPublished, AgeID, GenreID)
VALUES ('978-1405288508', 'Tall tales', '2017', '2', '4');
INSERT INTO author(FirstName, LastName)
VALUES ('Janet', 'Blogs');
INSERT INTO bookisbn_authorID(BookISBN, AuthorID)
VALUES ('978-1405288508', 000000019);
INSERT INTO copy(BookISBN, IsAvailable, BranchID)
VALUES ('978-1405288508', '1', '3');
#User story 15 As a library website administrator I want to set a control on the maximum number of books a user can borrow
We need a loans table for this but think it could look something like this. Out of scope for now
SELECT LibraryCardID
FROM librarycardholder
WHERE LibraryCardID = ANY (SELECT FROM Loan WHERE LoanQuantity = <=5);
#UserStory16 - select overdue books (have kept simple for now but could also add LCHolder details to it too)
SELECT
C.BookID
,B.Title
,concat (A.FirstName, ' ', A.LastName) as 'Author'
,L.LibraryCardID
,L.DateOut
,DATE_ADD(DateOut, INTERVAL 30 DAY) as 'Expected_Return'
FROM Book AS B
INNER JOIN bookisbn_authorid as AB
ON AB.BookISBN=B.BookISBN
INNER JOIN Author AS A
ON AB.AuthorID = A.AuthorID
INNER JOIN copy as C
ON AB.BookISBN = C.BookISBN
INNER JOIN Loan as L
ON C.BookID=L.BookID
AND L.DateReturned IS NULL
WHERE CURRENT_DATE > DATE_ADD(DateOut, INTERVAL 30 DAY) #this function adds 30 days to the date in the DateOut column
#UserStory17 - get contact details of a library card holder
SELECT LCH.FirstName
,LCH.LastName
,LCH.ContactNumber
,COALESCE(LCH.Email,'No email provided')
,A.AddressNumber
,R.RoadName
,C.CityName
,P.Postcode
#joining all the address tables
FROM LibraryCardHolder as LCH
INNER JOIN Address as A
ON LCH.AddressID = A.AddressID
INNER JOIN Road as R
ON A.RoadID = R.RoadID
INNER JOIN City as C
ON A.CityID = C.CityID
INNER JOIN Postcode as P
ON A.PostcodeID = P.PostcodeID
WHERE LibraryCardID = '1' #can be changed as necessary
;
#UserStory18 - see what books are available in our branch
SELECT
B.BookISBN
,B.Title
,concat(A.FirstName,' ', A.LastName) as 'Author'
,B.YearPublished
,LB.LibraryBranch
,Count(DISTINCT C.BookID) as 'CopiesAvailable' #Distinct needed to prevent counting the same book twice (in case that a book has been returned multiple times)
FROM Book AS B
INNER JOIN bookisbn_authorid as AB
ON AB.BookISBN=B.BookISBN
INNER JOIN Author AS A
ON AB.AuthorID = A.AuthorID
INNER JOIN copy as C
ON AB.BookISBN = C.BookISBN
INNER JOIN librarybranch as LB
ON LB.BranchID = C.BranchID
INNER JOIN Loan as L
ON C.BookID=L.BookID
WHERE DateReturned IS NOT NULL #means only pulls back books that are not checked out
AND C.BranchID=1 #can be changed
GROUP BY B.BookISBN, B.Title,concat(A.FirstName,' ', A.LastName),B.YearPublished, C.BranchID
#group statement necessary for count function to work
#UserStory19 - securely store details of staff on payroll
#Havent done this yet as we have not yet created a HR table (on could have list)
#User story 20- see what books are available across branches
#NB this is very similar to user story 18, have just removed the where filter for branchID so thatnow pulling all branches
SELECT
B.BookISBN
,B.Title
,concat(A.FirstName,' ', A.LastName) as 'Author'
,B.YearPublished
,LB.LibraryBranch
,Count(DISTINCT C.BookID) as 'CopiesAvailable' #Distinct needed to prevent counting the same book twice (in case that a book has been returned multiple times)
FROM Book AS B
INNER JOIN bookisbn_authorid as AB
ON AB.BookISBN=B.BookISBN
INNER JOIN Author AS A
ON AB.AuthorID = A.AuthorID
INNER JOIN copy as C
ON AB.BookISBN = C.BookISBN
INNER JOIN librarybranch as LB
ON LB.BranchID = C.BranchID
INNER JOIN Loan as L
ON C.BookID=L.BookID
WHERE DateReturned IS NOT NULL #means only pulls back books that are not checked out
GROUP BY B.BookISBN, B.Title,concat(A.FirstName,' ', A.LastName),B.YearPublished, C.BranchID
#group statement necessary for count function to work
#USER STORY 20
I want to be able to see stock levels of books across the city
SELECT concat(Author.FirstName,' ', Author.LastName) as 'Author', Book.*, copy.IsAvailable, LibraryBranch.LibraryBranch
FROM bookisbn_authorid
INNER JOIN Book
ON bookisbn_authorid.BookISBN=Book.BookISBN
INNER JOIN Author
ON bookisbn_authorid.AuthorID = Author.AuthorID
INNER JOIN copy
ON bookisbn_authorid.BookISBN = copy.BookISBN
INNER JOIN LibraryBranch
ON copy.BranchCode = LibraryBranch.BranchCode
WHERE copy.IsAvailable = 1;
#USER STORY 21 ######## to be changed - we have a loans table!
#21 As I customer I want to check out a book
UPDATE Book
SET IsAvailable = 0
where Book.BookID = 000000001;
#USER STORY 22 ######## to be changed - we have a loans table!
#As a customer I want to check in a book
UPDATE Book
SET IsAvailable = 1
where Book.BookID = 000000001;
#USER STORY 23
# As a library staff member I want to check the return date of a loaned book from the branch I work at so I know when to expect it back
SELECT concat(LibraryCardHolder.Forename, ' ', LibraryCardHolder.Surname) as 'Customer Name',
Book.*,
LibraryBranch.LibraryBranch,
GETDATE() > DATEADD(day, 30, DateOut) as 'Due Back'
WHERE LibraryBranch.LibraryBranch = 'Walworth'
#USER STORY 24
# As a library staff member I want to loan out a book so the customer can take the book
INSERT into loan (`LibraryCardID`, `BookID`, `DateOut`, `DateReturned`)
VALUES ((SELECT LibraryCardID from librarycardholder WHERE librarycardholder.LibraryCardID = 000000001), (SELECT BookID from copy WHERE copy.BookID = 000000016), '2019/03/31', '2019/04/30')