diff --git a/02_activities/assignments/DC_Cohort/Assignment1.md b/02_activities/assignments/DC_Cohort/Assignment1.md index f650c9752..093fdb253 100644 --- a/02_activities/assignments/DC_Cohort/Assignment1.md +++ b/02_activities/assignments/DC_Cohort/Assignment1.md @@ -209,5 +209,5 @@ Consider, for example, concepts of fariness, inequality, social structures, marg ``` -Your thoughts... +Databases might seem like just a technical tool for storing information, but after reading this article, I started to realize they actually reflect certain values and assumptions. For example, the system described in the article assumes that everyone fits into a traditional family structure, which is not true for many people. Because of this, some individuals were excluded or faced difficulties when the database could not recognize their situation. This made me think that databases can create unfairness, even if that is not the intention. In my everyday life, I also see similar situations, like when filling out forms that only allow limited options for gender or family background. These systems simplify people’s identities, but in doing so, they may ignore important differences and experiences. As someone new to this topic, I am beginning to understand that technology is not neutral, and the way databases are designed can shape how people are treated in society. ``` diff --git a/02_activities/assignments/DC_Cohort/ER_Yazhu Lin.png b/02_activities/assignments/DC_Cohort/ER_Yazhu Lin.png new file mode 100644 index 000000000..a0bef3ba9 Binary files /dev/null and b/02_activities/assignments/DC_Cohort/ER_Yazhu Lin.png differ diff --git a/02_activities/assignments/DC_Cohort/assignment1.sql b/02_activities/assignments/DC_Cohort/assignment1.sql index a6070558c..f483c41ba 100644 --- a/02_activities/assignments/DC_Cohort/assignment1.sql +++ b/02_activities/assignments/DC_Cohort/assignment1.sql @@ -6,28 +6,28 @@ --SELECT /* 1. Write a query that returns everything in the customer table. */ --QUERY 1 - - - - +SELECT * +FROM customer --END QUERY /* 2. Write a query that displays all of the columns and 10 rows from the customer table, sorted by customer_last_name, then customer_first_ name. */ --QUERY 2 - - - - +SELECT* +FROM customer +ORDER BY customer_last_name, customer_first_name +LIMIT 10; --END QUERY --WHERE /* 1. Write a query that returns all customer purchases of product IDs 4 and 9. Limit to 25 rows of output. */ - - +SELECT * +FROM customer_purchases +WHERE product_id IN (4,9) +LIMIT 25; /*2. Write a query that returns all customer purchases and a new calculated column 'price' (quantity * cost_to_customer_per_qty), filtered by customer IDs between 8 and 10 (inclusive) using either: @@ -36,10 +36,11 @@ filtered by customer IDs between 8 and 10 (inclusive) using either: Limit to 25 rows of output. */ --QUERY 3 - - - - +SELECT * +,quantity * cost_to_customer_per_qty AS price +FROM customer_purchases +WHERE customer_id BETWEEN 8 AND 10 +LIMIT 25; --END QUERY @@ -49,10 +50,14 @@ Using the product table, write a query that outputs the product_id and product_n columns and add a column called prod_qty_type_condensed that displays the word “unit” if the product_qty_type is “unit,” and otherwise displays the word “bulk.” */ --QUERY 4 - - - - +SELECT + product_id, + product_name, + CASE + WHEN product_qty_type = 'unit' THEN 'unit' + ELSE 'bulk' + END AS prod_qty_type_condensed +FROM product; --END QUERY @@ -60,36 +65,45 @@ if the product_qty_type is “unit,” and otherwise displays the word “bulk. add a column to the previous query called pepper_flag that outputs a 1 if the product_name contains the word “pepper” (regardless of capitalization), and otherwise outputs 0. */ --QUERY 5 - - - - +SELECT + product_id, + product_name, + CASE + WHEN product_qty_type = 'unit' THEN 'unit' + ELSE 'bulk' + END AS prod_qty_type_condensed, + CASE + WHEN LOWER(product_name) LIKE '%pepper%' THEN 1 + ELSE 0 + END AS pepper_flag +FROM product; --END QUERY - --JOIN /* 1. Write a query that INNER JOINs the vendor table to the vendor_booth_assignments table on the vendor_id field they both have in common, and sorts the result by market_date, then vendor_name. Limit to 24 rows of output. */ --QUERY 6 - - - - +SELECT * +FROM vendor v +INNER JOIN vendor_booth_assignments vba + ON v.vendor_id = vba.vendor_id +ORDER BY vba.market_date, v.vendor_name +LIMIT 24; --END QUERY - /* SECTION 3 */ -- AGGREGATE /* 1. Write a query that determines how many times each vendor has rented a booth at the farmer’s market by counting the vendor booth assignments per vendor_id. */ --QUERY 7 - - - - +SELECT + vendor_id, + COUNT(*) AS booth_count +FROM vendor_booth_assignments +GROUP BY vendor_id; --END QUERY @@ -99,13 +113,24 @@ of customers for them to give stickers to, sorted by last name, then first name. HINT: This query requires you to join two tables, use an aggregate function, and use the HAVING keyword. */ --QUERY 8 - - - - +SELECT + c.customer_id, + c.customer_first_name, + c.customer_last_name, + SUM(cp.quantity * cp.cost_to_customer_per_qty) AS total_spent +FROM customer c +INNER JOIN customer_purchases cp + ON c.customer_id = cp.customer_id +GROUP BY + c.customer_id, + c.customer_first_name, + c.customer_last_name +HAVING SUM(cp.quantity * cp.cost_to_customer_per_qty) > 2000 +ORDER BY c.customer_last_name, c.customer_first_name; --END QUERY + --Temp Table /* 1. Insert the original vendor table into a temp.new_vendor and then add a 10th vendor: Thomass Superfood Store, a Fresh Focused store, owned by Thomas Rosenthal @@ -118,10 +143,24 @@ When inserting the new vendor, you need to appropriately align the columns to be VALUES(col1,col2,col3,col4,col5) */ --QUERY 9 - - - - +CREATE TEMP TABLE new_vendor AS +SELECT * +FROM vendor; + +INSERT INTO new_vendor ( + vendor_id, + vendor_name, + vendor_type, + vendor_owner_first_name, + vendor_owner_last_name +) +VALUES ( + 10, + 'Thomass Superfood Store', + 'Fresh Focused', + 'Thomas', + 'Rosenthal' +); --END QUERY @@ -132,10 +171,12 @@ HINT: you might need to search for strfrtime modifers sqlite on the web to know and year are! Limit to 25 rows of output. */ --QUERY 10 - - - - +SELECT + customer_id, + STRFTIME('%m', market_date) AS month, + STRFTIME('%Y', market_date) AS year +FROM customer_purchases +LIMIT 25; --END QUERY @@ -146,8 +187,13 @@ HINTS: you will need to AGGREGATE, GROUP BY, and filter... but remember, STRFTIME returns a STRING for your WHERE statement... AND be sure you remove the LIMIT from the previous query before aggregating!! */ --QUERY 11 +SELECT + customer_id, + SUM(quantity * cost_to_customer_per_qty) AS total_spent +FROM customer_purchases +WHERE STRFTIME('%m', market_date) = '04' + AND STRFTIME('%Y', market_date) = '2022' +GROUP BY customer_id; +--END QUERY - - ---END QUERY diff --git a/04_this_cohort/Mar26_Live code.sql b/04_this_cohort/Mar26_Live code.sql new file mode 100644 index 000000000..31ebfa284 --- /dev/null +++ b/04_this_cohort/Mar26_Live code.sql @@ -0,0 +1,46 @@ +/* MODULE 2 */ +/* LEFT JOIN */ + + +/* 1. There are products that have been bought +... but are there products that have not been bought? +Use a LEFT JOIN to find out*/ +SELECT DISTINCT +p.product_id +,cp.product_id as [cp.product_id] +,product_name + +FROM product as p +LEFT JOIN customer_purchases as cp + ON p.product_id = cp.product_id + +/* 2. Directions of LEFT JOINs matter ...*/ + +FROM customer_purchases as cp +LEFT JOIN product as p + ON p.product_id = cp.product_id; + + +/* 3. As do which values you filter on ... */ +SELECT DISTINCT +p.product_id +,cp.product_id + + + +/* 4. Without using a RIGHT JOIN, make this query return the RIGHT JOIN result set +...**Hint, flip the order of the joins** ... + +SELECT * + +FROM product_category AS pc +LEFT JOIN product AS p + ON pc.product_category_id = p.product_category_id + ORDER by pc.product_category_id + +...Note how the row count changed from 24 to 23 +*/ + + + +-------------------------------------------------------------------------------------------------------------------------------------------- diff --git a/04_this_cohort/live_code/module_2/module_2.sqbpro b/04_this_cohort/live_code/module_2/module_2.sqbpro index 06850fe25..4508abf97 100644 --- a/04_this_cohort/live_code/module_2/module_2.sqbpro +++ b/04_this_cohort/live_code/module_2/module_2.sqbpro @@ -1,109 +1,143 @@ -
/* MODULE 2 */ +/* MODULE 2 */ /* SELECT */ /* 1. Select everything in the customer table */ -SELECT +SELECT * From customer; /* 2. Use sql as a calculator */ - +SELECT 1+1 AS addition, 10*5 as multiplication, pi() as pi; /* 3. Add order by and limit clauses */ - - +SELECT * +FROM customer +ORDER BY customer_first_name +LIMIT 10; /* 4. Select multiple specific columns */ - +SELECT customer_first_name, customer_last_name +FROM customer; /* 5. Add a static value in a column */ - +SELECT 2026 as this_year, 'March' as this_month, customer_id +FROM customer -------------------------------------------------------------------------------------------------------------------------------------------- -/* MODULE 2 */ +/* MODULE 2 */ /* WHERE */ /* 1. Select only customer 1 from the customer table */ SELECT * FROM customer -WHERE - +WHERE customer_id=1; /* 2. Differentiate between AND and OR */ - - +SELECT * +FROM customer +WHERE customer_id=1 +OR customer_id=2; -- OR is two rows, AND is 0 rows /* 3. IN */ - +SELECT * +FROM customer +WHERE customer_id IN (3,4,5,6); /* 4. LIKE */ - +SELECT* FROM product +WHERE product_name LIKE '%pepper%'; /* 5. Nulls and Blanks*/ - - +SELECT * +FROM product +WHERE product_size is NULL +OR product_size =''; /* 6. BETWEEN x AND y */ +SELECT * +FROM customer +WHERE customer_id BETWEEN 1 AND 20; + -------------------------------------------------------------------------------------------------------------------------------------------- -/* MODULE 2 */ +/* MODULE 2 */ /* CASE */ SELECT * /* 1. Add a CASE statement declaring which days vendors should come */ - +,CASE WHEN vendor_type = 'Fresh Focused' THEN 'Wednesday' + WHEN vendor_type='Eggs & Meats' THEN 'Thursday' + ELSE 'Saturday' + End as day_of_specialty /* 2. Add another CASE statement for Pie Day */ - +,CASE WHEN vendor_name = "Annie's Pies" + THEN 'Annie is the best' + End as pi_day /* 3. Add another CASE statement with an ELSE clause to handle rows evaluating to False */ - - - +,CASE WHEN vendor_name LIKE '%PIE%' + THEN 'Wednesday' + ELSE 'FRIDAY' + END AS another_pie_day + +FROM vendor; /* 4. Experiment with selecting a different column instead of just a string value */ +SELECT* +,CASE WHEN cost_to_customer_per_qty<1.00 +THEN cost_to_customer_per_qty*5 +ELSE cost_to_customer_per_qty + 2 +END AS inflation +FROM cutomer_purchases FROM vendor -------------------------------------------------------------------------------------------------------------------------------------------- -/* MODULE 2 */ +/* MODULE 2 */ /* DISTINCT */ /* 1. Compare how many customer_ids are the customer_purchases table, one select with distinct, one without */ -- 4221 rows -SELECT customer_id FROM customer_purchases - +SELECT customer_id FROM customer_purchases ; +SELECT DISTINCT customer_id FROM customer_purchases /* 2. Compare the difference between selecting market_day in market_date_info, with and without distinct: what do these difference mean?*/ - + SELECT market_day + FROM market_date_info; + + SELECT DISTINCT market_day + FROM market_date_info - /* 3. Which vendor has sold products to a customer */ - +SELECT DISTINCT vendor_id +FROM customer_purchases; /* 4. Which vendor has sold products to a customer ... and which product was it */ - +SELECT DISTINCT vendor_id, product_id +FROM customer_purchases; /* 5. Which vendor has sold products to a customer ... and which product was it? ... AND to whom was it sold*/ - +SELECT DISTINCT vendor_id, product_id, customer_id +FROM customer_purchases -------------------------------------------------------------------------------------------------------------------------------------------- -/* MODULE 2 */ +/* MODULE 2 */ /* INNER JOIN */ @@ -111,9 +145,16 @@ SELECT customer_id FROM customer_purchases ... use an INNER JOIN to see only products that have been purchased */ -- without table aliases +Select product_name, +vendor_id, +market_date, +customer_id, +customer_purchases.product_id, +product.product_id - - +From product +Inner join customer_purchases + ON customer_purchases.product_id=product.product_id; /* 2. Using the Query #4 from DISTINCT earlier (Which vendor has sold products to a customer AND which product was it AND to whom was it sold) @@ -121,46 +162,19 @@ SELECT customer_id FROM customer_purchases Add customers' first and last names with an INNER JOIN */ -- using table aliases +SELECT DISTINCT vendor_id, +product_id, +customer_id, +customer_first_name, +customer_last_name +FROM customer_purchases AS cp +INNER JOIN customer AS c + ON c.customer_id = cp.customer_id -------------------------------------------------------------------------------------------------------------------------------------------- -/* MODULE 2 */ -/* LEFT JOIN */ - - -/* 1. There are products that have been bought -... but are there products that have not been bought? -Use a LEFT JOIN to find out*/ - - -/* 2. Directions of LEFT JOINs matter ...*/ - - - - -/* 3. As do which values you filter on ... */ - - - - -/* 4. Without using a RIGHT JOIN, make this query return the RIGHT JOIN result set -...**Hint, flip the order of the joins** ... - -SELECT * - -FROM product_category AS pc -LEFT JOIN product AS p - ON pc.product_category_id = p.product_category_id - ORDER by pc.product_category_id - -...Note how the row count changed from 24 to 23 -*/ - - - --------------------------------------------------------------------------------------------------------------------------------------------- -/* MODULE 2 */ +-- Reference to file "/Users/eve/sql/04_this_cohort/Mar26_Live code.sql" (not supported by this version) --/* MODULE 2 */ /* Multiple Table JOINs */ @@ -176,4 +190,4 @@ LEFT JOIN product AS p Why do we have more rows now?*/ - +