diff --git a/import_script.py b/import_script.py new file mode 100644 index 000000000..d96040ba8 --- /dev/null +++ b/import_script.py @@ -0,0 +1,59 @@ +import pandas as pd +import mysql.connector +from mysql.connector import Error + +path = 'path/to/data' + +cart_data = 'cart_data.csv' +cart_item_data = 'cart_item_data.csv' +category_data = 'category_data.csv' +order_data = 'order_data.csv' +order_items_data = 'order_items_data.csv' +payment_data = 'payment_data.csv' +product_data = 'product_data.csv' +review_data = 'review_data.csv' +shipping_data = 'shipping_data.csv' +user_data = 'user_data.csv' + +insert_order = [ + (path + category_data, 'Categories'), + (path + product_data, 'Products'), + (path + user_data, 'Users'), + (path + order_data, 'Orders'), + (path + order_items_data, 'Order_Items'), + (path + review_data, 'Reviews'), + (path + cart_data, 'Cart'), + (path + cart_item_data, 'Cart_Items'), + (path + payment_data, 'Payments'), + (path + shipping_data, 'Shipping'), +] + + +def import_csv_to_mysql(csv_file, table_name, db_connection): + cursor = db_connection.cursor() + + df = pd.read_csv(csv_file) + + for i, row in df.iterrows(): + sql = f"INSERT INTO {table_name} ({', '.join(df.columns)}) VALUES ({', '.join(['%s'] * len(df.columns))})" + try: + cursor.execute(sql, tuple(row)) + db_connection.commit() + except Error as e: + print(f"Row {i} wasn't added: {e}") + + +db_config = { + 'host': 'localhost', + 'database': 'db', + 'user': 'root', + 'password': 'password' +} + +connection = mysql.connector.connect(**db_config) + +for data, table in insert_order: + import_csv_to_mysql(data, table, connection) + +if connection.is_connected(): + connection.close() diff --git a/sql/task1.sql b/sql/task1.sql index 90de336ca..521d069ce 100644 --- a/sql/task1.sql +++ b/sql/task1.sql @@ -1,14 +1,50 @@ +-- TASK 1 + -- Problem 1: Retrieve all products in the Sports category -- Write an SQL query to retrieve all products in a specific category. +-- COMMENT: Assumed there might be several sport categories, using pattern to match all of them + +SELECT * +FROM Products +WHERE category_id = (SELECT category_id + FROM Categories + WHERE category_name like '%Sports%'); + + -- Problem 2: Retrieve the total number of orders for each user -- Write an SQL query to retrieve the total number of orders for each user. -- The result should include the user ID, username, and the total number of orders. +-- COMMENT: left join because we need every user's data + +SELECT u.user_id, u.username, COUNT(o.order_id) AS total_orders +FROM Users u +LEFT JOIN Orders o ON u.user_id = o.user_id +GROUP BY u.user_id, u.username; + + -- Problem 3: Retrieve the average rating for each product -- Write an SQL query to retrieve the average rating for each product. -- The result should include the product ID, product name, and the average rating. +-- COMMENT: left join because we need every product's data + +SELECT p.product_id, p.product_name, AVG(r.rating) AS avg_rating +FROM Products p +LEFT JOIN Reviews r ON p.product_id = r.product_id +GROUP BY p.product_id, p.product_name; + + -- Problem 4: Retrieve the top 5 users with the highest total amount spent on orders -- Write an SQL query to retrieve the top 5 users with the highest total amount spent on orders. -- The result should include the user ID, username, and the total amount spent. + +-- COMMENT: used left join for the case when user with 0 orders makes it into top 5 + +SELECT u.user_id, u.username, SUM(o.total_amount) AS total_amount_spent +FROM Users u +LEFT JOIN Orders o ON u.user_id = o.user_id +GROUP BY u.user_id, u.username +ORDER BY total_amount_spent DESC +LIMIT 5; \ No newline at end of file diff --git a/sql/task2.sql b/sql/task2.sql index ad2596731..ab533abc8 100644 --- a/sql/task2.sql +++ b/sql/task2.sql @@ -1,19 +1,66 @@ +-- TASK 2 + -- Problem 5: Retrieve the products with the highest average rating -- Write an SQL query to retrieve the products with the highest average rating. -- The result should include the product ID, product name, and the average rating. -- Hint: You may need to use subqueries or common table expressions (CTEs) to solve this problem. +-- COMMENT: comparing every product avg to max avg + +SELECT p.product_id, p.product_name, AVG(r.rating) AS avg_rating +FROM Products p +LEFT JOIN Reviews r ON p.product_id = r.product_id +GROUP BY p.product_id, p.product_name +HAVING avg_rating = (SELECT MAX(avg_rating1) + FROM (SELECT AVG(rating) AS avg_rating1 + FROM Reviews + GROUP BY product_id) AS product_avg_ratings); + + -- Problem 6: Retrieve the users who have made at least one order in each category -- Write an SQL query to retrieve the users who have made at least one order in each category. -- The result should include the user ID and username. -- Hint: You may need to use subqueries or joins to solve this problem. +-- COMMENT: comparing user's categories count to total categories count + +SELECT Users.user_id, Users.username +FROM Users +WHERE Users.user_id IN (SELECT DISTINCT u.user_id + FROM Users u + JOIN Orders o ON u.user_id = o.user_id + JOIN Order_Items oi ON o.order_id = oi.order_id + JOIN Products p ON oi.product_id = p.product_id + GROUP BY u.user_id, p.category_id + HAVING COUNT(DISTINCT p.category_id) = (SELECT COUNT(*) FROM Categories) +); + -- Problem 7: Retrieve the products that have not received any reviews -- Write an SQL query to retrieve the products that have not received any reviews. -- The result should include the product ID and product name. -- Hint: You may need to use subqueries or left joins to solve this problem. +SELECT p.product_id, p.product_name +FROM Products p +LEFT JOIN Reviews r ON p.product_id = r.product_id +WHERE r.review_id IS NULL; + + -- Problem 8: Retrieve the users who have made consecutive orders on consecutive days -- Write an SQL query to retrieve the users who have made consecutive orders on consecutive days. -- The result should include the user ID and username. --- Hint: You may need to use subqueries or window functions to solve this problem. \ No newline at end of file +-- Hint: You may need to use subqueries or window functions to solve this problem. + +-- COMMENT: comparing consecutive rows order dates because looking for consecutive orders + +With ConsecutiveOrders AS ( +SELECT user_id, + order_date, + LEAD(order_date, 1) OVER (ORDER BY order_id) as next_order_date, + LEAD(user_id, 1) OVER (ORDER BY order_id) as next_user_id +FROM Orders +) +SELECT DISTINCT u.user_id, u.username +FROM Users u +JOIN ConsecutiveOrders co ON u.user_id = co.user_id +WHERE co.user_id = co.next_user_id AND co.next_order_date = DATE_ADD(co.order_date, INTERVAL 1 DAY); \ No newline at end of file diff --git a/sql/task3.sql b/sql/task3.sql index f078a9439..2495fd471 100644 --- a/sql/task3.sql +++ b/sql/task3.sql @@ -1,19 +1,68 @@ +-- TASK 3 + -- Problem 9: Retrieve the top 3 categories with the highest total sales amount -- Write an SQL query to retrieve the top 3 categories with the highest total sales amount. -- The result should include the category ID, category name, and the total sales amount. -- Hint: You may need to use subqueries, joins, and aggregate functions to solve this problem. +-- COMMENT: here assumed unit price is an actual price for 1 item + +SELECT c.category_id, c.category_name, SUM(oi.unit_price * oi.quantity) AS total_sales_amount +FROM Categories c +LEFT JOIN Products p ON c.category_id = p.category_id +LEFT JOIN Order_Items oi ON p.product_id = oi.product_id +GROUP BY c.category_id, c.category_name +ORDER BY total_sales_amount DESC +LIMIT 3; + + -- Problem 10: Retrieve the users who have placed orders for all products in the Toys & Games -- Write an SQL query to retrieve the users who have placed orders for all products in the Toys & Games -- The result should include the user ID and username. -- Hint: You may need to use subqueries, joins, and aggregate functions to solve this problem. +-- COMMENT: checking disctinct product_id count for each user for the Toys & Games category + +SELECT u.user_id, u.username +FROM Users u +JOIN Orders o ON u.user_id = o.user_id +JOIN Order_Items oi ON o.order_id = oi.order_id +JOIN Products p ON oi.product_id = p.product_id +JOIN Categories c ON p.category_id = c.category_id +WHERE c.category_name = 'Toys & Games' +GROUP BY u.user_id, u.username +HAVING COUNT(DISTINCT p.product_id) = (SELECT COUNT(*) + FROM Products + WHERE category_id = (SELECT category_id + FROM Categories + WHERE category_name = 'Toys & Games')); + + -- Problem 11: Retrieve the products that have the highest price within each category -- Write an SQL query to retrieve the products that have the highest price within each category. -- The result should include the product ID, product name, category ID, and price. -- Hint: You may need to use subqueries, joins, and window functions to solve this problem. +-- COMMENT: taking row 1 from products ordered descending by price for each category + +SELECT product_id, product_name, category_id, price +FROM (SELECT p.product_id, p.product_name, p.category_id, p.price, + ROW_NUMBER() OVER (PARTITION BY p.category_id ORDER BY p.price DESC) AS row_num + FROM Products p) AS ranked_products +WHERE row_num = 1; + -- Problem 12: Retrieve the users who have placed orders on consecutive days for at least 3 days -- Write an SQL query to retrieve the users who have placed orders on consecutive days for at least 3 days. -- The result should include the user ID and username. -- Hint: You may need to use subqueries, joins, and window functions to solve this problem. + +-- COMMENT: considering all combinations of 3 orders of the same user + +SELECT DISTINCT u.user_id, u.username +FROM Users u +JOIN Orders o1 ON u.user_id = o1.user_id +JOIN Orders o2 ON u.user_id = o2.user_id +JOIN Orders o3 ON u.user_id = o3.user_id +WHERE o1.order_date = o2.order_date - INTERVAL 1 DAY + AND o2.order_date = o3.order_date - INTERVAL 1 DAY; + \ No newline at end of file diff --git a/test_data/cart_data.csv b/test_data/cart_data.csv new file mode 100644 index 000000000..9a3e422b4 --- /dev/null +++ b/test_data/cart_data.csv @@ -0,0 +1,31 @@ +cart_id,user_id +1,1 +2,2 +3,3 +4,4 +5,5 +6,6 +7,7 +8,8 +9,9 +10,10 +11,11 +12,12 +13,13 +14,14 +15,15 +16,16 +17,17 +18,18 +19,19 +20,20 +21,21 +22,22 +23,23 +24,24 +25,25 +26,26 +27,27 +28,28 +29,29 +30,30 \ No newline at end of file diff --git a/test_data/cart_item_data.csv b/test_data/cart_item_data.csv new file mode 100644 index 000000000..ea679b66f --- /dev/null +++ b/test_data/cart_item_data.csv @@ -0,0 +1,37 @@ +cart_item_id,cart_id,product_id,quantity +1,1,1,1 +2,1,2,2 +3,2,3,1 +4,2,4,3 +5,3,5,2 +6,3,6,1 +7,4,7,3 +8,4,8,1 +9,5,9,2 +10,5,10,1 +11,6,11,3 +12,6,12,1 +13,7,13,2 +14,7,14,1 +15,8,15,3 +16,8,16,1 +17,9,17,2 +18,9,18,1 +19,10,19,3 +20,10,20,1 +21,11,21,2 +22,11,22,1 +23,12,23,3 +24,12,24,1 +25,13,25,2 +26,13,26,1 +27,14,27,3 +28,14,28,1 +29,15,29,2 +30,15,30,1 +31,16,31,3 +32,16,32,1 +33,17,33,2 +34,17,34,1 +35,18,35,3 +36,18,36,1 \ No newline at end of file diff --git a/test_data/category_data.csv b/test_data/category_data.csv new file mode 100644 index 000000000..263e642a1 --- /dev/null +++ b/test_data/category_data.csv @@ -0,0 +1,51 @@ +category_id,category_name +1,Electronics +2,Books +3,Clothing +4,Home & Kitchen +5,Toys & Games +6,Beauty & Personal Care +7,Health & Household +8,Sports & Outdoors +9,Automotive +10,Tools & Home Improvement +11,Grocery & Gourmet Food +12,Pet Supplies +13,Office Products +14,Music +15,Movies & TV +16,Arts +17,Industrial & Scientific +18,Electronics Accessories +19,Cell Phones & Accessories +20,Video Games +21,Computers +22,Appliances +23,Software +24,Kindle Store +25,Home Audio & Theater +26,Camera & Photo +27,Shoes +28,Jewelry +29,Handmade +30,CDs & Vinyl +31,Baby +32,Collectibles & Fine Art +33,Instrument Accessories +34,Power & Hand Tools +35,Outdoor Recreation +36,Home Décor +37,Kitchen & Dining +38,Health Care +39,Office & School Supplies +40,Industrial Electrical +41,Industrial Hardware +42,Industrial Power & Hand Tools +43,Industrial Scientific +44,Lab & Scientific Products +45,Janitorial & Sanitation Supplies +46,Test +47,Occupational Health & Safety Products +48,Science Education +49,Raw Materials +50,Food Service Equipment & Supplies \ No newline at end of file diff --git a/test_data/data.csv b/test_data/data.csv new file mode 100644 index 000000000..b6a20b498 --- /dev/null +++ b/test_data/data.csv @@ -0,0 +1,42 @@ +user_id,username,email,password,address,phone_number +1,johndoe,johndoe@example.com,pass123,123 Main St,123-456-7890 +2,janesmith,janesmith@example.com,pass456,456 Elm St,987-654-3210 + +order_id,user_id,order_date,total_amount +1,1,2021-01-01,100.00 +2,2,2021-02-01,200.00 + +order_item_id,order_id,product_id,quantity,unit_price +1,1,1,2,50.00 +2,1,2,1,25.00 +3,2,3,3,30.00 + +product_id,product_name,description,price,category_id +1,Product A,Description A,50.00,1 +2,Product B,Description B,25.00,1 +3,Product C,Description C,30.00,2 + +category_id,category_name +1,Category 1 +2,Category 2 + +review_id,user_id,product_id,rating,review_text,review_date +1,1,1,5,"Great product!",2021-01-05 +2,2,2,4,"Good product.",2021-02-10 + +cart_id,user_id +1,1 +2,2 + +cart_item_id,cart_id,product_id,quantity +1,1,1,1 +2,1,2,2 +3,2,3,1 + +payment_id,order_id,payment_date,payment_method,amount +1,1,2021-01-02,Credit Card,100.00 +2,2,2021-02-02,PayPal,200.00 + +shipping_id,order_id,shipping_date,shipping_address,tracking_number +1,1,2021-01-03,123 Main St,ABC123 +2,2,2021-02-03,456 Elm St,XYZ789 \ No newline at end of file diff --git a/test_data/order_data.csv b/test_data/order_data.csv new file mode 100644 index 000000000..510f54989 --- /dev/null +++ b/test_data/order_data.csv @@ -0,0 +1,34 @@ +order_id,user_id,order_date,total_amount +1,1,2021-01-05,100.00 +2,2,2021-02-10,75.00 +3,3,2021-03-15,120.00 +4,4,2021-04-20,155.00 +5,5,2021-05-25,90.00 +6,6,2021-06-30,80.00 +7,7,2021-07-05,125.00 +8,8,2021-08-10,150.00 +9,9,2021-09-15,95.00 +10,10,2021-10-20,70.00 +11,11,2021-11-25,115.00 +12,12,2021-12-30,160.00 +13,13,2022-01-05,85.00 +14,14,2022-02-10,130.00 +15,15,2022-03-15,75.00 +16,16,2022-04-20,110.00 +17,17,2022-05-25,145.00 +18,18,2022-06-30,100.00 +19,19,2022-07-05,65.00 +20,20,2022-08-10,140.00 +21,21,2022-09-15,105.00 +22,22,2022-10-20,80.00 +23,23,2022-11-25,115.00 +24,24,2022-12-30,150.00 +25,25,2023-01-05,95.00 +26,26,2023-02-10,130.00 +27,27,2023-03-15,75.00 +28,28,2023-04-20,110.00 +29,29,2023-05-25,145.00 +30,30,2023-06-30,100.00 +31,2,2021-07-25,300.00 +32,2,2021-07-26,333.00 +33,2,2023-07-27,335.00 \ No newline at end of file diff --git a/test_data/order_items_data.csv b/test_data/order_items_data.csv new file mode 100644 index 000000000..2a75cd610 --- /dev/null +++ b/test_data/order_items_data.csv @@ -0,0 +1,31 @@ +order_item_id,order_id,product_id,quantity,unit_price +1,1,1,2,50.00 +2,1,2,1,25.00 +3,2,3,3,30.00 +4,2,4,1,15.00 +5,3,5,2,20.00 +6,3,6,1,10.00 +7,4,7,3,35.00 +8,4,8,1,40.00 +9,5,9,2,30.00 +10,5,10,1,25.00 +11,6,11,3,20.00 +12,6,12,1,15.00 +13,7,13,2,25.00 +14,7,14,1,30.00 +15,8,15,3,40.00 +16,8,16,1,35.00 +17,9,17,2,15.00 +18,9,18,1,10.00 +19,10,19,3,30.00 +20,10,20,1,25.00 +21,11,21,2,20.00 +22,11,22,1,15.00 +23,12,23,3,25.00 +24,12,24,1,30.00 +25,13,25,2,40.00 +26,13,26,1,35.00 +27,14,27,3,15.00 +28,14,28,1,10.00 +29,15,29,2,30.00 +30,15,30,1,25.00 \ No newline at end of file diff --git a/test_data/payment_data.csv b/test_data/payment_data.csv new file mode 100644 index 000000000..9fafdfadc --- /dev/null +++ b/test_data/payment_data.csv @@ -0,0 +1,19 @@ +payment_id,order_id,payment_date,payment_method,amount +1,1,2021-01-02,Credit Card,100.00 +2,2,2021-02-02,PayPal,200.00 +3,3,2021-03-02,Credit Card,150.00 +4,4,2021-04-02,PayPal,175.00 +5,5,2021-05-02,Credit Card,120.00 +6,6,2021-06-02,PayPal,90.00 +7,7,2021-07-02,Credit Card,135.00 +8,8,2021-08-02,PayPal,160.00 +9,9,2021-09-02,Credit Card,105.00 +10,10,2021-10-02,PayPal,140.00 +11,11,2021-11-02,Credit Card,125.00 +12,12,2021-12-02,PayPal,180.00 +13,13,2022-01-02,Credit Card,95.00 +14,14,2022-02-02,PayPal,130.00 +15,15,2022-03-02,Credit Card,145.00 +16,16,2022-04-02,PayPal,170.00 +17,17,2022-05-02,Credit Card,115.00 +18,18,2022-06-02,PayPal,150.00 \ No newline at end of file diff --git a/test_data/product_data.csv b/test_data/product_data.csv new file mode 100644 index 000000000..ff3e6b7eb --- /dev/null +++ b/test_data/product_data.csv @@ -0,0 +1,18 @@ +product_id,product_name,description,price,category_id +1,Smartphone X,The Smartphone X is a powerful and feature-rich device that offers a seamless user experience. It comes with a high-resolution display,500.00,1 +2,Wireless Headphones,Experience the freedom of wireless audio with these high-quality headphones. They offer crystal-clear sound and a comfortable fit,150.00,1 +3,Laptop Pro,The Laptop Pro is a sleek and powerful device that is perfect for both work and play. It features a high-performance processor,1200.00,2 +4,Smart TV,Transform your living room into an entertainment hub with this Smart TV.,800.00,2 +5,Running Shoes,Get ready to hit the road with these lightweight and comfortable running shoes.,100.00,3 +6,Designer Dress,Make a statement with this elegant designer dress,300.00,3 +7,Coffee Maker,Start your day with a perfect cup of coffee brewed with this advanced coffee maker.,80.00,4 +8,Toaster Oven,Upgrade your kitchen with this versatile toaster oven. It allows you to toast,70.00,4 +9,Action Camera,Capture your adventures in stunning detail with this action camera.,200.00,5 +10,Board Game Collection,Enjoy hours of fun with this diverse collection of board games.,50.00,5 +11,Yoga Mat,Enhance your yoga practice with this premium yoga mat.,30.00,6 +12,Skincare Set,Pamper your skin with this luxurious skincare set.,150.00,6 +13,Vitamin C Supplement,Boost your immune system and promote overall health with this vitamin C supplement.,20.00,7 +14,Weighted Blanket,Experience deep relaxation and improved sleep with this weighted blanket.,100.00,7 +15,Mountain Bike,Conquer the trails with this high-performance mountain bike.,1000.00,8 +16,Tennis Racket,Take your tennis game to the next level with this professional-grade racket.,54.00,8 +17,AirPods,Wireless headphones.,500.00,1 \ No newline at end of file diff --git a/test_data/review_data.csv b/test_data/review_data.csv new file mode 100644 index 000000000..650c6bba3 --- /dev/null +++ b/test_data/review_data.csv @@ -0,0 +1,32 @@ +review_id,user_id,product_id,rating,review_text,review_date +1,1,1,5,"Great product!",2021-01-05 +2,2,2,4,"Good product.",2021-02-10 +3,3,3,3,"Average product.",2021-03-15 +4,4,4,5,"Excellent product!",2021-04-20 +5,5,5,2,"Disappointing product.",2021-05-25 +6,6,6,4,"Good value for money.",2021-06-30 +7,7,7,5,"Highly recommended!",2021-07-05 +8,8,8,3,"Could be better.",2021-08-10 +9,9,9,4,"Satisfied with the purchase.",2021-09-15 +10,10,10,1,"Worst product ever.",2021-10-20 +11,11,11,5,"Amazing quality!",2021-11-25 +12,12,12,4,"Impressed with the features.",2021-12-30 +13,13,13,2,"Not worth the price.",2022-01-05 +14,14,14,3,"Decent product.",2022-02-10 +15,15,15,5,"Absolutely love it!",2022-03-15 +16,16,16,4,"Great customer service.",2022-04-20 +17,17,17,3,"Average performance.",2022-05-25 +18,18,18,5,"Best purchase ever!",2022-06-30 +19,19,19,2,"Regret buying it.",2022-07-05 +20,20,20,4,"Good overall experience.",2022-08-10 +21,21,21,5,"Exceeded my expectations!",2022-09-15 +22,22,22,3,"Just okay.",2022-10-20 +23,23,23,4,"Happy with the product.",2022-11-25 +24,24,24,1,"Terrible quality.",2022-12-30 +25,25,25,5,"Highly satisfied!",2023-01-05 +26,26,26,4,"Good value for money.",2023-02-10 +27,27,27,2,"Not recommended.",2023-03-15 +28,28,28,3,"Average product.",2023-04-20 +29,29,29,5,"Impressed with the features.",2023-05-25 +30,30,30,4,"Great customer service.",2023-06-30 +31,1,1,2,"So bad.",2023-07-15 \ No newline at end of file diff --git a/test_data/shipping_data.csv b/test_data/shipping_data.csv new file mode 100644 index 000000000..43ae5547a --- /dev/null +++ b/test_data/shipping_data.csv @@ -0,0 +1,19 @@ +shipping_id,order_id,shipping_date,shipping_address,tracking_number +1,1,2021-01-03,123 Main St,ABC123 +2,2,2021-02-03,456 Elm St,XYZ789 +3,3,2021-03-03,789 Oak St,DEF456 +4,4,2021-04-03,321 Pine St,GHI789 +5,5,2021-05-03,654 Maple St,JKL012 +6,6,2021-06-03,987 Cedar St,MNO345 +7,7,2021-07-03,210 Birch St,PQR678 +8,8,2021-08-03,543 Walnut St,STU901 +9,9,2021-09-03,876 Oak St,VWX234 +10,10,2021-10-03,109 Pine St,YZ0123 +11,11,2021-11-03,432 Maple St,ABC345 +12,12,2021-12-03,765 Cedar St,DEF678 +13,13,2022-01-03,098 Birch St,GHI901 +14,14,2022-02-03,321 Walnut St,JKL234 +15,15,2022-03-03,654 Oak St,MNO567 +16,16,2022-04-03,987 Pine St,PQR890 +17,17,2022-05-03,210 Maple St,STU123 +18,18,2022-06-03,543 Cedar St,VWX456 \ No newline at end of file diff --git a/test_data/user_data.csv b/test_data/user_data.csv new file mode 100644 index 000000000..c35fe6e9d --- /dev/null +++ b/test_data/user_data.csv @@ -0,0 +1,31 @@ +user_id,username,email,password,address,phone_number +1,johndoe,johndoe@example.com,pass123,123 Main St,123-456-7890 +2,janesmith,janesmith@example.com,pass456,456 Elm St,987-654-3210 +3,maryjones,maryjones@example.com,pass789,789 Oak St,555-123-4567 +4,robertbrown,robertbrown@example.com,passabc,321 Pine St,111-222-3333 +5,sarahwilson,sarahwilson@example.com,passxyz,567 Maple St,444-555-6666 +6,michaellee,michaellee@example.com,pass456,890 Cedar St,777-888-9999 +7,lisawilliams,lisawilliams@example.com,pass789,432 Birch St,222-333-4444 +8,chrisharris,chrisharris@example.com,pass123,876 Walnut St,666-777-8888 +9,emilythompson,emilythompson@example.com,passabc,543 Oak St,999-000-1111 +10,davidmartinez,davidmartinez@example.com,passxyz,987 Elm St,333-444-5555 +11,amandajohnson,amandajohnson@example.com,pass123,654 Pine St,888-999-0000 +12,jasonrodriguez,jasonrodriguez@example.com,pass456,321 Maple St,111-222-3333 +13,ashleytaylor,ashleytaylor@example.com,pass789,789 Cedar St,444-555-6666 +14,matthewthomas,matthewthomas@example.com,passabc,234 Birch St,777-888-9999 +15,sophiawalker,sophiawalker@example.com,pass123,876 Walnut St,222-333-4444 +16,jacobanderson,jacobanderson@example.com,passxyz,543 Oak St,666-777-8888 +17,olivialopez,olivialopez@example.com,pass456,987 Elm St,999-000-1111 +18,ethanmiller,ethanmiller@example.com,pass789,654 Pine St,333-444-5555 +19,emilygonzalez,emilygonzalez@example.com,pass123,321 Maple St,888-999-0000 +20,williamhernandez,williamhernandez@example.com,pass456,234 Birch St,111-222-3333 +21,sophiawright,sophiawright@example.com,pass789,789 Cedar St,444-555-6666 +22,alexanderhill,alexanderhill@example.com,passabc,876 Walnut St,777-888-9999 +23,madisonmoore,madisonmoore@example.com,pass123,543 Oak St,222-333-4444 +24,jamesrogers,jamesrogers@example.com,passxyz,987 Elm St,666-777-8888 +25,emilyward,emilyward@example.com,pass456,654 Pine St,999-000-1111 +26,benjamincarter,benjamincarter@example.com,pass123,321 Maple St,333-444-5555 +27,gracestewart,gracestewart@example.com,pass789,234 Birch St,888-999-0000 +28,danielturner,danielturner@example.com,passabc,789 Cedar St,111-222-3333 +29,elliecollins,elliecollins@example.com,pass123,876 Walnut St,444-555-6666 +30,williamwood,williamwood@example.com,pass456,543 Oak St,777-888-9999 \ No newline at end of file