From 1e4a609fdc23acff44d49699f97fa421a0836037 Mon Sep 17 00:00:00 2001 From: dshendler Date: Tue, 26 Dec 2023 22:04:01 +0000 Subject: [PATCH 1/6] Just messing around, practicing Commits --- 01_restaurant/challenges/01_01_invitations_ch.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/01_restaurant/challenges/01_01_invitations_ch.sql b/01_restaurant/challenges/01_01_invitations_ch.sql index c83188eb..e270045c 100644 --- a/01_restaurant/challenges/01_01_invitations_ch.sql +++ b/01_restaurant/challenges/01_01_invitations_ch.sql @@ -1,4 +1,4 @@ --- Generate a list of customer information. +-- Generate a list -- yes a list!--of customer information. -- Show their first name, last name, and email address. -- Sort the list of results by last name. \ No newline at end of file From d75c6ffd0866a0f7a2a4a3fa674817133298b598 Mon Sep 17 00:00:00 2001 From: dshendler Date: Wed, 27 Dec 2023 02:33:01 +0000 Subject: [PATCH 2/6] Entered my solutions for the first 6 challenges. --- .vscode/settings.json | 5 +- .../challenges/01_01_invitations_ch.sql | 17 +++++- .../challenges/01_03_printmenus_ch.sql | 16 +++++- .../challenges/01_04_newcustomer_ch.sql | 16 +++++- .../challenges/01_05_updateinfo_ch.sql | 23 +++++++- .../challenges/01_06_removeinfo_ch.sql | 49 +++++++++++++++++- 01_restaurant/restaurant.db | Bin 274432 -> 274432 bytes 7 files changed, 118 insertions(+), 8 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 23698105..e44b35fc 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,7 +3,7 @@ "editor.cursorBlinking": "solid", "editor.fontFamily": "ui-monospace, Menlo, Monaco, 'Cascadia Mono', 'Segoe UI Mono', 'Roboto Mono', 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro', 'Fira Mono', 'Droid Sans Mono', 'Courier New', monospace", "editor.fontLigatures": false, - "editor.fontSize": 22, + "editor.fontSize": 16, "editor.formatOnPaste": true, "editor.formatOnSave": true, "editor.lineNumbers": "on", @@ -17,8 +17,7 @@ "files.autoSave": "afterDelay", "screencastMode.onlyKeyboardShortcuts": true, "terminal.integrated.fontSize": 18, - "workbench.activityBar.visible": true, "workbench.colorTheme": "Visual Studio Dark", "workbench.fontAliasing": "antialiased", "workbench.statusBar.visible": true -} +} \ No newline at end of file diff --git a/01_restaurant/challenges/01_01_invitations_ch.sql b/01_restaurant/challenges/01_01_invitations_ch.sql index e270045c..13e82c22 100644 --- a/01_restaurant/challenges/01_01_invitations_ch.sql +++ b/01_restaurant/challenges/01_01_invitations_ch.sql @@ -1,4 +1,19 @@ -- Generate a list -- yes a list!--of customer information. -- Show their first name, last name, and email address. --- Sort the list of results by last name. \ No newline at end of file +-- Sort the list of results by last name. +SELECT + FirstName, + LastName, + Email + +FROM + Customers + + ORDER BY + LastName + +CREATE TABLE AnniversaryPartyAttendess ) + CustomerID INTEGER, + PartySize INTEGER + ); \ No newline at end of file diff --git a/01_restaurant/challenges/01_03_printmenus_ch.sql b/01_restaurant/challenges/01_03_printmenus_ch.sql index cd202d34..0be0017a 100644 --- a/01_restaurant/challenges/01_03_printmenus_ch.sql +++ b/01_restaurant/challenges/01_03_printmenus_ch.sql @@ -2,4 +2,18 @@ -- Create a report with all the items sorted by price (lowest to highest). -- Create a report showing appetizers and beverages. --- Create a report with all items except beverages. \ No newline at end of file +-- Create a report with all items except beverages. + +/*Types: Appetizer, Main, Dessert, Beverage +*/ + +SELECT + Name, + Type, + Price +FROM + Dishes +WHERE + Type IN ('Appetizer', 'Beverage'); +ORDER BY + Type; \ No newline at end of file diff --git a/01_restaurant/challenges/01_04_newcustomer_ch.sql b/01_restaurant/challenges/01_04_newcustomer_ch.sql index f47fb847..ac5f557c 100644 --- a/01_restaurant/challenges/01_04_newcustomer_ch.sql +++ b/01_restaurant/challenges/01_04_newcustomer_ch.sql @@ -3,4 +3,18 @@ -- Use the following information to create a record: -- Anna Smith (asmith@samoca.org) -- 479 Lapis Dr., Memphis, TN --- Phone: (555) 555-1212; Birthday: July 21, 1973 \ No newline at end of file +-- Phone: (555) 555-1212; Birthday: July 21, 1973 + +INSERT INTO +Customers (FirstName, LastName, Email, Address, City, State, Phone, Birthday) +VALUES + ('Anna', 'Smith', 'asmith@samoca.org', '479 Lapis Dr.', 'Memphis', 'TN', '(555) 555-1212', + '1973-07-21'); + + SELECT * FROM Customers ORDER BY CustomerID DESC; + +DELETE +FROM + Customers +WHERE + CustomerID = 101; \ No newline at end of file diff --git a/01_restaurant/challenges/01_05_updateinfo_ch.sql b/01_restaurant/challenges/01_05_updateinfo_ch.sql index ad034f88..2f7ddbf0 100644 --- a/01_restaurant/challenges/01_05_updateinfo_ch.sql +++ b/01_restaurant/challenges/01_05_updateinfo_ch.sql @@ -1,4 +1,25 @@ -- Update a customer's contact information. -- Taylor Jenkins, of 27170 6th Ave., Washington, DC, --- has moved to 74 Pine St., New York, NY. \ No newline at end of file +-- has moved to 74 Pine St., New York, NY. + +SELECT + CustomerID, + FirstName, + LastName, + Address +FROM + Customers +WHERE + FirstName = 'Taylor' +AND + LastName = 'Jenkins'; + +UPDATE + Customers +SET + Address = '74 Pine St.', City = 'New York', State = 'NY' +WHERE + CustomerID = 26; + +Select * FROM Customers WHERE CustomerID = 26; \ No newline at end of file diff --git a/01_restaurant/challenges/01_06_removeinfo_ch.sql b/01_restaurant/challenges/01_06_removeinfo_ch.sql index 56d912f9..3b4c32a9 100644 --- a/01_restaurant/challenges/01_06_removeinfo_ch.sql +++ b/01_restaurant/challenges/01_06_removeinfo_ch.sql @@ -2,4 +2,51 @@ -- A customer named Norby has notified us he won't -- be able to keep his Friday reservation. --- Today is July 24, 2022. \ No newline at end of file +-- Today is July 24, 2022. + +-- Find his customer ID, +-- locate the date, get Reservation ID +-- remove the for where Reserveration ID = blahblahblah + +SELECT + LastName, + FirstName, + CustomerID +FROM + Customers +WHERE + LastName = 'Norby' + OR + FirstName = 'Norby'; + +SELECT + ReservationID, + Date(Date) as Day + +FROM + Reservations +WHERE + CustomerID = 64 + AND + Day > '2022-07-24'; + +SELECT + * +FROM + Reservations r +INNER JOIN + Customers c +ON + c.CustomerID = r.CustomerID +WHERE + (c.LastName = 'Norby' + OR + c.FirstName = 'Norby') +AND + r.Date > '2022-07-22'; + +DELETE +FROM + Reservations +WHERE + ReservationID = 2000; \ No newline at end of file diff --git a/01_restaurant/restaurant.db b/01_restaurant/restaurant.db index 07e2cd1a69167065232fa31ffb8568df60683bc4..35f9e85b3fc950da30d0981964a92a95ee9c8170 100644 GIT binary patch delta 233 zcmZp8AkgqYV1hKG^h6nFR%r&kv{#KOttpJHDNI{anCJTQvmRqmXJ}>SpUQ8-cZM%v zx_|?-Hsk5-HUZ3Ctb7a%46F<>QrrxZ(zeR7)6a)8Yl@niCU1PWz1nu2w@rv02v!SDVNJd10EVPFl1$OX=iROV{dITH!(LbAU1Sp nAVGFzF1H3o1MmsA_Fn@I5CazmnwJM~123_GWCpjIb^~U)$8jdC From 98fad2d0e4ba9403d69290abc69eb76272381344 Mon Sep 17 00:00:00 2001 From: dshendler Date: Wed, 27 Dec 2023 19:35:48 +0000 Subject: [PATCH 3/6] Added AnniversaryParty table --- .../challenges/01_02_anniversary_ch.sql | 5 ++++- 01_restaurant/restaurant.db | Bin 274432 -> 274432 bytes 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/01_restaurant/challenges/01_02_anniversary_ch.sql b/01_restaurant/challenges/01_02_anniversary_ch.sql index d68138bb..80ff6213 100644 --- a/01_restaurant/challenges/01_02_anniversary_ch.sql +++ b/01_restaurant/challenges/01_02_anniversary_ch.sql @@ -4,4 +4,7 @@ -- Associate a customer's ID number with the number of people -- they plan to bring in their party. --- Hint: SQLite offers the INTEGER and REAL datatypes \ No newline at end of file +-- Hint: SQLite offers the INTEGER and REAL datatypes +CREATE TABLE AnniversaryParty ( + CustomerID INTEGER, + Party INTEGER); diff --git a/01_restaurant/restaurant.db b/01_restaurant/restaurant.db index 35f9e85b3fc950da30d0981964a92a95ee9c8170..87a0216c7779df2caf402aa6fa46c24c61bb451a 100644 GIT binary patch delta 269 zcmZp8AkgqYV1l%u3JmBh8R85`qE5*s;$*~KL#85^@p z5|eULUCUDQN{U^JMcKu5br~Ba!Gex?d6{LYMa79ll>v!GC6(xWCg&hm#}HSA5Jx8; zR|Rxg1r06*1?SS@lKkA%B2O0uPrndX5qH-h9iTASIIsv%V6z#|CFbqQ2N>t_Pn?j% YDA>%Q(9WU22*gZ4%)FgLf#nB304Xz02LJ#7 delta 545 zcmZp8AkgqYV1l%uGy?;JGY~Tau`m$pOw=(}lxEONd&SGOgMounk%4m!pB0Ze?`%#* zt{?nvJl{DYIU+U-3fy4d9Kn&oWG=3%%Gl^zl9-f}>R*(ST2$V)P#6}Kbc5z8b#>Q;0L9S(~c_qaVl46*XdD&_(iTxqPx1u?{qgK5X)4;C_9 zrJNv%T4O~{ki;dR82jXRmZDt29PEthP2R?;9Mk2vnAT6;Z6(X)&CbrK-=u4-%|7{| z)e$ahHV{|bSdne|0d6LZ$=9rVxU5;BVyqCc$u>YS7N{5tL@dCzhs%^1B*t#6$_x@) z$7RX{K|#=eCE7~3Eq)XbsK&Y{2v#7scUyq!aV Date: Thu, 28 Dec 2023 01:53:54 +0000 Subject: [PATCH 4/6] Finished the "Restaurant" challenges. The last one was the easiest! --- .../challenges/01_07_attendevent_ch.sql | 16 +- .../challenges/01_08_findreservation_ch.sql | 21 ++- .../challenges/01_09_createreservation_ch.sql | 157 +++++++++++++++++- .../challenges/01_10_takeorder_ch.sql | 74 ++++++++- .../challenges/01_11_trackfavorites_ch.sql | 24 ++- .../challenges/01_12_bestcustomers_ch.sql | 19 ++- 01_restaurant/restaurant.db | Bin 274432 -> 274432 bytes 7 files changed, 305 insertions(+), 6 deletions(-) diff --git a/01_restaurant/challenges/01_07_attendevent_ch.sql b/01_restaurant/challenges/01_07_attendevent_ch.sql index 11a66a24..4fb87c3d 100644 --- a/01_restaurant/challenges/01_07_attendevent_ch.sql +++ b/01_restaurant/challenges/01_07_attendevent_ch.sql @@ -1,4 +1,18 @@ -- Register a customer for our Anniversary event. -- The customer 'atapley2j@kinetecoinc.com' will be in --- attendance, and will bring 3 friends. \ No newline at end of file +-- attendance, and will bring 3 friends. + +INSERT INTO + AnniversaryParty (CustomerID, Party) +VALUES ( + (SELECT + c.CustomerID + FROM + Customers c + WHERE + c.Email = 'atapley2j@kinetecoinc.com'), + 8); +Select * FROM AnniversaryParty; + + \ No newline at end of file diff --git a/01_restaurant/challenges/01_08_findreservation_ch.sql b/01_restaurant/challenges/01_08_findreservation_ch.sql index 13f598ab..8b6f767f 100644 --- a/01_restaurant/challenges/01_08_findreservation_ch.sql +++ b/01_restaurant/challenges/01_08_findreservation_ch.sql @@ -4,4 +4,23 @@ -- Variations of the name include: -- Stevensen, Stephensen, Stevenson, Stephenson, Stuyvesant --- There are four people in the party. Today is June 14th. \ No newline at end of file +-- There are four people in the party. Today is June 14th. + +SELECT + r.ReservationID, + c.FirstName||' '||c.LastName as [Reservation Name], + r.PartySize, + r.Date + +FROM + Reservations r +INNER JOIN + Customers c +ON + r.CustomerID = c.CustomerID + +WHERE + c.LastName LIKE 'St%' +AND + r.Date LIKE '%06-14%' +; \ No newline at end of file diff --git a/01_restaurant/challenges/01_09_createreservation_ch.sql b/01_restaurant/challenges/01_09_createreservation_ch.sql index 49ee4666..c94b061c 100644 --- a/01_restaurant/challenges/01_09_createreservation_ch.sql +++ b/01_restaurant/challenges/01_09_createreservation_ch.sql @@ -3,4 +3,159 @@ -- Use the following information: -- Sam McAdams (smac@kinetecoinc.com), for 5 people --- on August 12, 2022 at 6PM (18:00) \ No newline at end of file +-- on August 12, 2022 at 6PM (18:00) + + +/* +Holy fuck stick. I tried over and over to get this going in one statement, but could never get it to work. +The instructor did it in 3 separate statements, which was SO MUCH EASIER!! I could have done that. + +Here: +*/ + +SELECT + CustomerID +FROM + Customers +WHERE + Email = 'smac@kinetecoinc.com'; +/* no answer, because it doesn't exist yet. +So add him to Customers */ + +INSERT INTO + Customers (FirstName, LastName, Email) + VALUES ('Sam', 'McAdams', 'smac@kinetecoinc.com'); + +SELECT * +FROM Customers +ORDER BY CustomerID Desc +LIMIT 5; +/* Now customer exists. ID 102... +So add his reservation */ + +INSERT INTO + Reservations (CustomerID, Date, PartySize) +VALUES (102, '2022-08-12 18:00:00',5); + +SELECT * +FROM + Reservations +ORDER BY + ReservationID DESC LIMIT 5; + +-- ----------------------------- + +INSERT INTO + Customers (FirstName, LastName, Email) + Values ('Sam', 'McAdams', 'smac@kinetecoinc.com') +-- test for not existing: +WHERE NOT EXISTS ( + SELECT 1 + FROM + Customers + WHERE + Email = 'smac@kinetecoinc.com' +) +INSERT INTO + Reservations (CustomerID, Date, PartySize) + VALUES( + (SELECT + c.CustomerID + FROM + Customers c + WHERE + c.Email = 'smac@kinetecoinc.com'), '2022-08-12 18:00:00',5); + +SELECT * FROM Customers ORDER BY CustomerID DESC LIMIT 10; + +SELECT * From Reservations ORDER BY Date Desc Limit 10; + + + +-- ------------------------------- +IF EXISTS + (SELECT 1 + FROM + Customers c + INNER JOIN + Reservations r + ON + c.CustomerID = r.CustomerID + WHERE + c.Email = 'smac@kinetecoinc.com'); + + +-- --------------------------------------------------- + + +IF EXISTS + (SELECT + c.CustomerID + FROM + Customers c + INNER JOIN + Reservations r + ON + c.CustomerID = r.CustomerID + WHERE + c.Email = 'smac@kinetecoinc.com') +BEGIN +-- if customer already exists, add them to the reservations + INSERT INTO + Reservations (CustomerID, Date, PartySize) + VALUES (c.CustomerID, '2022-08-12 18:00:00',5) +END +ELSE +-- If customer does not exist, create customer, then add reservation + INSERT INTO + Customers (FirstName, LastName, Email) + VALUES ('Sam','McAdams','smac@kinetecoinc.com') +-- now add reservation for new customer + BEGIN + INSERT INTO + Reservations (CustomerID, Date, PartySize) + + VALUES( + (SELECT + c.CustomerID + FROM + Customers c + INNER JOIN + Reservations r + ON + c.CustomerID = r.CustomerID + WHERE + c.Email = 'smac@kinetecoinc.com'), + '2022-08-12 18:00:00',5) + END; + +SELECT * FROM Customers ORDER BY CustomerID DESC LIMIT 10; + +SELECT * From Reservations ORDER BY Date Desc Limit 10; + + + (SELECT + c.CustomerID + FROM + Customers c + WHERE + c.Email = 'smac@kinetecoinc.com') + + +INSERT INTO + Reservations (CustomerID, Date, PartySize) + +VALUES( +(SELECT + c.CustomerID +FROM + Customers c +INNER JOIN + Reservations r +ON + c.CustomerID = r.CustomerID +WHERE + c.Email = 'smac@kinetecoinc.com'), + '2022-08-12 18:00:00',5); + +Select * FROM Reservations ORDER BY Date DESC; \ No newline at end of file diff --git a/01_restaurant/challenges/01_10_takeorder_ch.sql b/01_restaurant/challenges/01_10_takeorder_ch.sql index 54ed21e3..89c901e0 100644 --- a/01_restaurant/challenges/01_10_takeorder_ch.sql +++ b/01_restaurant/challenges/01_10_takeorder_ch.sql @@ -6,4 +6,76 @@ -- Items: 1 House Salad, 1 Mini Cheeseburgers, and -- 1 Tropical Blue Smoothie -- Delivery date and time: September 20, 2022 @ 2PM (14:00) --- There are no taxes or other fees. \ No newline at end of file +-- There are no taxes or other fees. + +/* +Find the customer - search in Customers, get ID +Create order record - add CustomerID and Order Date ('2022-09-22 14:00:00') to Orders table + - Get Order ID +From the Dishes table - Get Dish IDs +Add items to order - Add OrderID (multiple time) and DishIDs to OrdersDishes +Find total cost - sum the Prices from the Dishes table +*/ + +SELECT + CustomerID +FROM Customers +WHERE + FirstName = 'Loretta' + AND LastName = 'Hundey'; + +INSERT INTO + Orders (CustomerID, OrderDate) + VALUES ( + (SELECT + CustomerID +FROM Customers +WHERE + FirstName = 'Loretta' + AND LastName = 'Hundey'), '2022-09-22 14:00:00'); + +SELECT * FROM Orders ORDER BY OrderID DESC; +-- Success! OrderID is 1001 + +-- Items: 1 House Salad, 1 Mini Cheeseburgers, and +-- 1 Tropical Blue Smoothie +SELECT + DishID +FROM + Dishes +WHERE + Name = 'House Salad' OR -- 4 + Name = 'Mini Cheeseburgers' OR -- 7 + Name = 'Tropical Blue Smoothie'; -- 20 + +INSERT INTO + OrdersDishes (OrderID, DishID) +VALUES(1001,4),(1001,7),(1001,20); + +-- ------- ** integrated way to combine the above 2 statements -------------- +INSERT INTO + OrdersDishes (OrderID, DishID) +VALUES +(1001, (SELECT DishID FROM Dishes WHERE Name = 'House Salad')), +(1001, (SELECT DishID FROM Dishes WHERE Name = 'Mini Cheeseburgers')), +(1001, (SELECT DishID FROM Dishes WHERE Name = 'Tropical Blue Smoothie')); + +-- -------- ** end integration ---------------------------------------------- + + +SELECT * FROM OrdersDishes ORDER BY OrdersDishesID Desc LIMIT 5; +-- Cool! orders added successfully to order +-- now get the cost + +SELECT + SUM (d.Price) +FROM + Dishes d +INNER JOIN + OrdersDishes od +ON + d.DishID = od.DishID +WHERE + od.OrderID = 1001; + +-- total cost is $21.00 \ No newline at end of file diff --git a/01_restaurant/challenges/01_11_trackfavorites_ch.sql b/01_restaurant/challenges/01_11_trackfavorites_ch.sql index 149d18a7..244f036f 100644 --- a/01_restaurant/challenges/01_11_trackfavorites_ch.sql +++ b/01_restaurant/challenges/01_11_trackfavorites_ch.sql @@ -1,4 +1,26 @@ -- Update information in the database. -- Set Cleo Goldwater's favorite dish to --- the Quinoa Salmon Salad. \ No newline at end of file +-- the Quinoa Salmon Salad. + +-- Experiment: +SELECT + CustomerID +FROM + Customers c +WHERE + c.FistName = Cleo AND + c.LastName = Goldwater; +-- she is customerID 42 + + +-- My trial: +UPDATE + Customers +SET + FavoriteDish = (SELECT DishID FROM Dishes WHERE Name = 'Quinoa Salmon Salad') +WHERE + CustomerID = (SELECT CustomerID FROM Customers c WHERE c.FirstName = 'Cleo' AND c.LastName = 'Goldwater'); + +-- confirm: +SELECT * FROM Customers WHERE CustomerID = 42; \ No newline at end of file diff --git a/01_restaurant/challenges/01_12_bestcustomers_ch.sql b/01_restaurant/challenges/01_12_bestcustomers_ch.sql index 7325900b..3cf4feda 100644 --- a/01_restaurant/challenges/01_12_bestcustomers_ch.sql +++ b/01_restaurant/challenges/01_12_bestcustomers_ch.sql @@ -1,3 +1,20 @@ -- Identify a few customers who have ordered delivery -- from the restaurant the most often, so we can send --- them a promotional coupon. \ No newline at end of file +-- them a promotional coupon. + +SELECT + o.CustomerID, + c.FirstName||' '||c.LastName as [Customer Name], + c.Email, + Count(o.OrderID) AS [Number of Orders] +FROM + Orders o +INNER JOIN + Customers c +ON + o.CustomerID = c.CustomerID +GROUP BY + o.CustomerID +ORDER BY + [Number of Orders] DESC +LIMIT 10; \ No newline at end of file diff --git a/01_restaurant/restaurant.db b/01_restaurant/restaurant.db index 87a0216c7779df2caf402aa6fa46c24c61bb451a..c3b18ad3fdf8d51bac4010311c970fcb41f10823 100644 GIT binary patch delta 410 zcmZp8AkgqYV1hKG_Cy(HM(vFWOZYh$`F}F-|K$I)Sy135KQ}uA0|P4~Gb3XROOwJj z1xCgO7S`R2A=_COFbXkEmt4d+bNhxxjNHszKy@Gt1nozcGHyS*lquyTBjZ2ZqM-L{nZuC`_xH-oUWDMVjzVy9vO{)e zUTR5da(-rBvR-n2?snHQ=KY>h+uFc>ppliO~r$8wet037gW5C8xG delta 201 zcmV;)05<=C;1Gb|5Re-I9FZJD0UWVlqz?iB5VH{wE0+$zJ0WOzAq5*BUvZ4VA0}2O+X#@ZQ0Ra6JhsC74?_3l6t4E(Fa1 DH<>(O From b3c4ede5a58ae124d13a727c7cbd0383e9a2bbc9 Mon Sep 17 00:00:00 2001 From: dshendler Date: Thu, 28 Dec 2023 16:55:05 +0000 Subject: [PATCH 5/6] Saving my halfway point. First 4 of Library done. --- .../challenges/02_01_checkavailability_ch.sql | 43 +++++++++++++++++- 02_library/challenges/02_02_addbook_ch.sql | 23 +++++++++- 02_library/challenges/02_03_checkout_ch.sql | 34 +++++++++++++- 02_library/challenges/02_04_booksdue_ch.sql | 25 +++++++++- 02_library/library.db | Bin 225280 -> 225280 bytes 5 files changed, 121 insertions(+), 4 deletions(-) diff --git a/02_library/challenges/02_01_checkavailability_ch.sql b/02_library/challenges/02_01_checkavailability_ch.sql index 8af48cca..a9554ec1 100644 --- a/02_library/challenges/02_01_checkavailability_ch.sql +++ b/02_library/challenges/02_01_checkavailability_ch.sql @@ -1,2 +1,43 @@ -- Determine how many copies of the book 'Dracula' --- are available for library patrons to borrow. \ No newline at end of file +-- are available for library patrons to borrow. + +SELECT + BookID +FROM + Books +WHERE + Title = 'Dracula'; +-- IDs are 12, 60, 73 + +-- ---------- ** First trial ----------- +SELECT * +FROM + Loans +WHERE + BookID IN (12, 60, 73) +ORDER BY + BookID + ; +-- ------- ** My completed steps ---------- +SELECT + LoanID, + b.BookID, + b.Title, + b.Author, + PatronID, + MAX(LoanDate) [Loan Date], + DueDate, + ReturnedDate +FROM + Loans l +INNER JOIN + Books b +ON + b.BookID = l.BookID +WHERE + l.BookID IN (SELECT BookID FROM Books WHERE Title = 'The Scarlet Letter') +GROUP BY + l.BookID; + + + diff --git a/02_library/challenges/02_02_addbook_ch.sql b/02_library/challenges/02_02_addbook_ch.sql index 9c0334d8..3868fbfe 100644 --- a/02_library/challenges/02_02_addbook_ch.sql +++ b/02_library/challenges/02_02_addbook_ch.sql @@ -8,4 +8,25 @@ -- Title: Gulliver’s Travels into Several Remote Nations of the World -- Author: Jonathan Swift -- Published: 1729 --- ID Number: 4899254401 \ No newline at end of file +-- ID Number: 4899254401 + +SELECT + BookID, + Title, + Author, + Barcode +FROM + Books +WHERE + Title = 'Dracula' OR + Title = 'Gulliver''s Travels into Several Remote Nations of the World' +Order BY + Title ASC; + +INSERT INTO + Books (Title, Author, Published, Barcode) + VALUES + ('Dracula', 'Bram Stoker', 1897, 4819277482), + ('Gulliver''s Travels into Several Remote Nations of the World', 'Jonathan Swift', 1729, 4899254401) + ; + \ No newline at end of file diff --git a/02_library/challenges/02_03_checkout_ch.sql b/02_library/challenges/02_03_checkout_ch.sql index ca5efe93..03c144cf 100644 --- a/02_library/challenges/02_03_checkout_ch.sql +++ b/02_library/challenges/02_03_checkout_ch.sql @@ -2,4 +2,36 @@ -- Book 1: The Picture of Dorian Gray, 2855934983 -- Book 2: Great Expectations, 4043822646 -- The checkout date is August 25, 2022 and the --- due date is September 8, 2022. \ No newline at end of file +-- due date is September 8, 2022. + +-- First, the simple code -------- +SELECT + BookID, + Title +FROM + Books +WHERE + Barcode = 2855934983 OR + Barcode = 4043822646; + +SELECT PatronID FROM Patrons WHERE Email = 'jvaan@wisdompets.com'; + +-- ---------------- ** My integrated code ------------------ +INSERT INTO + Loans (BookID, PatronID, LoanDate, DueDate) + VALUES ( + (SELECT BookID FROM Books WHERE Barcode = 2855934983), + (SELECT PatronID FROM Patrons WHERE Email = 'jvaan@wisdompets.com'), + '2022-08-25', '2022-09-08' + ), + ( + (SELECT BookID FROM Books WHERE Barcode = 4043822646), + (SELECT PatronID FROM Patrons WHERE Email = 'jvaan@wisdompets.com'), + '2022-08-25', '2022-09-08' + ) + +-- -------------- Code for checking ----------------- +SELECT * +FROM Loans +ORDER BY LoanID DESC +LIMIT 5; diff --git a/02_library/challenges/02_04_booksdue_ch.sql b/02_library/challenges/02_04_booksdue_ch.sql index df5bdcb3..4063456f 100644 --- a/02_library/challenges/02_04_booksdue_ch.sql +++ b/02_library/challenges/02_04_booksdue_ch.sql @@ -1,4 +1,27 @@ -- Prepare a report of books due to be returned -- to the library on July 13, 2022. -- Provide the due date, the book title, and --- the borrower's first name and email address. \ No newline at end of file +-- the borrower's first name and email address. + +-- --------------** Did this integrated solution in one fell swoop this time ---------------- +SELECT + l.LoanID, + l.LoanDate, + l.DueDate, + l.ReturnedDate, + b.Title, + p.FirstName||' '||p.LastName as [Patron Name], + p.Email +FROM + Loans l +INNER JOIN + Books b +ON + l.BookID = b.BookID +INNER JOIN + Patrons p +ON + l.PatronID = p.PatronID +WHERE + DueDate < '2022-07-13' -- I changed the operator to '<' from '=' to see ALL overdue books. + AND ReturnedDate IS NULL; \ No newline at end of file diff --git a/02_library/library.db b/02_library/library.db index 8af83972bd9cc97ae2268e6c2b34b5a712545799..ffe4cfbca5998383d06866d36c189de151dbb2df 100644 GIT binary patch delta 178 zcmZp8z}xVEcY-t{=R_H2R!#=Jv{#KOTT>Vp%xAV>v6#-jfH9YaWipG!#>NB8%n^-V zlN&t)xehWgs<3QmRA}^^?B^@PF7FVwN~6(Za-4@s``sms+wU%6Qs2$&%({0vdjfMa z3+r9hy&D_#Ssi5igV-4u85I>7VvURpjEr;*EOd=bAuLN>154TdK&U)7HhGKfe^Z&6 Fxd0yLF<<}y delta 59 zcmV-B0L1@*;0=J_4UiiF2ay~@1qT2wOOb(OwPXRHpQi*c0uYA;umPt8umZ3HK?VJn R2Vet(v4L|1xBX=U0}4pN6QuwE From bf48784f25a66f308d6261cda7a133b2d7f3b009 Mon Sep 17 00:00:00 2001 From: dshendler Date: Thu, 28 Dec 2023 19:19:37 +0000 Subject: [PATCH 6/6] Last bit of the Library challenges Done! --- 02_library/challenges/02_04_booksdue_ch.sql | 6 +- .../challenges/02_05_returnbooks_ch.sql | 38 +++++++++- .../challenges/02_06_visitreminder_ch.sql | 21 +++++- .../challenges/02_07_featurebooks_ch.sql | 35 +++++++++- 02_library/challenges/02_08_bookstats_ch.sql | 65 +++++++++++++++++- 02_library/library.db | Bin 225280 -> 225280 bytes 6 files changed, 159 insertions(+), 6 deletions(-) diff --git a/02_library/challenges/02_04_booksdue_ch.sql b/02_library/challenges/02_04_booksdue_ch.sql index 4063456f..9a3923fd 100644 --- a/02_library/challenges/02_04_booksdue_ch.sql +++ b/02_library/challenges/02_04_booksdue_ch.sql @@ -23,5 +23,7 @@ INNER JOIN ON l.PatronID = p.PatronID WHERE - DueDate < '2022-07-13' -- I changed the operator to '<' from '=' to see ALL overdue books. - AND ReturnedDate IS NULL; \ No newline at end of file + DueDate <= '2022-07-13' -- I changed the operator to '<=' from '=' to see ALL overdue books. + AND ReturnedDate IS NULL +ORDER BY + l.LoanDate ASC; \ No newline at end of file diff --git a/02_library/challenges/02_05_returnbooks_ch.sql b/02_library/challenges/02_05_returnbooks_ch.sql index 8279e71c..79aba3f5 100644 --- a/02_library/challenges/02_05_returnbooks_ch.sql +++ b/02_library/challenges/02_05_returnbooks_ch.sql @@ -3,4 +3,40 @@ -- Return date: July 5, 2022 -- Book 1: 6435968624 -- Book 2: 5677520613 --- Book 3: 8730298424 \ No newline at end of file +-- Book 3: 8730298424 + +-- ---------------First is the dead simple look-up code ---- +SELECT + l.LoanID, + b.Title, + MAX(l.LoanDate), + l.DueDate, + l.ReturnedDate +FROM Loans l +INNER JOIN Books b +ON l.BookID = b.BookID +WHERE + b.Barcode = 6435968624 + OR b.Barcode = 5677520613 + OR b.Barcode = 8730298424 +GROUP BY + l.BookID +; +-- ------------------ 1-liner code for integration ------------ +-- this is the over-engineered part: +SELECT l.LoanID FROM Loans l INNER JOIN Books b ON l.BookID = b.BookID WHERE b.Barcode = 6435968624 GROUP BY l.BookID + +-- --------------------** my integrated code ------------------------ +-- ------------------ I initially over-engineered it. I just needed to find the "is null" returned dates +UPDATE + Loans +SET + ReturnedDate = '2022-07-05' +FROM + Loans l +WHERE + ((SELECT BookID FROM Books WHERE Barcode = 6435968624) AND l.ReturnedDate IS NULL) + OR ((SELECT BookID FROM Books WHERE Barcode = 5677520613) AND l.ReturnedDate IS NULL) + OR ((SELECT BookID FROM Books WHERE Barcode = 8730298424) AND l.ReturnedDate IS NULL) +; + diff --git a/02_library/challenges/02_06_visitreminder_ch.sql b/02_library/challenges/02_06_visitreminder_ch.sql index 867d15d4..a74cf9b2 100644 --- a/02_library/challenges/02_06_visitreminder_ch.sql +++ b/02_library/challenges/02_06_visitreminder_ch.sql @@ -1,2 +1,21 @@ -- Prepare a report of the library patrons --- who have checked out the fewest books. \ No newline at end of file +-- who have checked out the fewest books. + +-- ------------ This time, the dead-simple code did it on the first go ------------- +SELECT + p.FirstName||' ' ||p.LastName as [Patron Name], + p.Email, + l.PatronID, + Count(l.LoanID) as [Number of Loans] +FROM + Loans l +INNER JOIN + Patrons p +ON + p.PatronID = l.PatronID +GROUP BY + l.PatronID +ORDER BY + [Number of Loans] ASC +LIMIT + 20; diff --git a/02_library/challenges/02_07_featurebooks_ch.sql b/02_library/challenges/02_07_featurebooks_ch.sql index 541d39a4..7b68064a 100644 --- a/02_library/challenges/02_07_featurebooks_ch.sql +++ b/02_library/challenges/02_07_featurebooks_ch.sql @@ -1,4 +1,37 @@ -- Create a list of books to feature in an exhibit. -- Make a pick list of books published from 1890-1899 --- which are not currently checked out. \ No newline at end of file +-- which are not currently checked out. + +SELECT + BookID, + Title, + Author, + Published +FROM + Books +WHERE + Published BETWEEN 1890 AND 1899 +ORDER BY + Title ASC +-- -------------------------- +SELECT BookID FROM Books WHERE Published BETWEEN 1890 AND 1899 +-- -------------------------- +SELECT + l.BookID, + b.Title, + b.Author, + b.Published +FROM + Loans l +INNER JOIN + Books b +ON + l.BookID = b.BookID +WHERE + l.BookID in (SELECT BookID FROM Books WHERE Published BETWEEN 1890 AND 1899) AND + l.ReturnedDate NOT NULL +GROUP BY + Title +ORDER BY + Title ASC; \ No newline at end of file diff --git a/02_library/challenges/02_08_bookstats_ch.sql b/02_library/challenges/02_08_bookstats_ch.sql index 2e473f5d..cbbc60fe 100644 --- a/02_library/challenges/02_08_bookstats_ch.sql +++ b/02_library/challenges/02_08_bookstats_ch.sql @@ -4,4 +4,67 @@ -- in each year. -- Report 2: Show the five books that have been --- checked out the most. \ No newline at end of file +-- checked out the most. + +-- # of books published in each year: +SELECT + Count(DISTINCT Title) as [Number of Books], + Published +FROM + Books +--WHERE +-- (SELECT DISTINCT Published FROM Books) +GROUP BY + Published +Order BY + [Number of Books] DESC; + +-- top five most-checked out books +-- This ended up only accounting for individual copies, not multiple copies of same book. See "integrated code" for total answer +SELECT + Count(l.BookID) as [How Many Times], + l.BookID, + b.Title, + b.Author +FROM + Loans l +INNER JOIN + Books b +ON + l.BookID = b.BookID +GROUP BY + l.BookID +ORDER BY + [How Many Times] DESC +LIMIT 5; + +-- --- Top 5 checked out books -- My integrated code wh/accounts for multiple copies ---- +SELECT + b.Title, + b.Author, + COUNT (DISTINCT l.LoanID) AS [Total Checkouts] +FROM + Loans l +INNER JOIN + Books b +ON + l.BookID = b.BookID +--WHERE -- *** I was breaking my head to get this part, but in the end, we did not need it. +-- b.Title IN (Select DISTINCT(Title) FROM Books) +GROUP BY + b.Title +ORDER BY + [Total Checkouts] DESC +LIMIT 5 +; + +-- Simple code : This gets all the book IDs --- +SELECT +BookID +--Title +FROM +Books +WHERE +Title IN (Select DISTINCT(Title) FROM Books) +ORDER BY +Title \ No newline at end of file diff --git a/02_library/library.db b/02_library/library.db index ffe4cfbca5998383d06866d36c189de151dbb2df..5cf4fb3adcc8283f0ad58c80eecaba90eb884c44 100644 GIT binary patch delta 29330 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