diff --git a/Advanced DB Task #1.pdf b/Advanced DB Task #1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8dc27613c487f3d3c9e9c78d82b8bd38eb5898d6 Binary files /dev/null and b/Advanced DB Task #1.pdf differ diff --git a/Advanced DB Task #2.pdf b/Advanced DB Task #2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5e99c5a1b582043a360e3a431e2ef1d77134c9dc Binary files /dev/null and b/Advanced DB Task #2.pdf differ diff --git a/Advanced DB Task #3.pdf b/Advanced DB Task #3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..220ab09669378acc1f20c715b704e49f874c4873 Binary files /dev/null and b/Advanced DB Task #3.pdf differ diff --git a/Task 1/Cities Avg Persons.sql b/Task 1/Cities Avg Persons.sql new file mode 100644 index 0000000000000000000000000000000000000000..04ff3ad8ecc5416f7e496a7df807964f8905c363 --- /dev/null +++ b/Task 1/Cities Avg Persons.sql @@ -0,0 +1,5 @@ +SELECT City, COUNT(*) AS TotalPeople +FROM Address +GROUP BY City +ORDER BY TotalPeople ASC; + diff --git a/Task 1/ER.mwb b/Task 1/ER.mwb new file mode 100644 index 0000000000000000000000000000000000000000..72a8a3a7fe415c375229f14ce7e01d26ba96df4f Binary files /dev/null and b/Task 1/ER.mwb differ diff --git a/Task 1/ER.mwb.bak b/Task 1/ER.mwb.bak new file mode 100644 index 0000000000000000000000000000000000000000..81353d4453ec6055f747deadfbea904d370b113d Binary files /dev/null and b/Task 1/ER.mwb.bak differ diff --git a/Task 1/FavDrink&AvgAge.sql b/Task 1/FavDrink&AvgAge.sql new file mode 100644 index 0000000000000000000000000000000000000000..0fdfd3a862d2b669d11430027292fe2bf3c365cb --- /dev/null +++ b/Task 1/FavDrink&AvgAge.sql @@ -0,0 +1,7 @@ +USE PeopleDB; + +SELECT f.FavoriteDrink, AVG(TIMESTAMPDIFF(YEAR, p.DOB, CURDATE())) AS AvgAge +FROM Person p +JOIN favorites f ON p.PersonID = f.PersonID +GROUP BY f.FavoriteDrink; + diff --git a/Task 1/Hiking&AvgAge.sql b/Task 1/Hiking&AvgAge.sql new file mode 100644 index 0000000000000000000000000000000000000000..3c27f5e1f6d767b7b6983bc5fb50510dc5d1b1cd --- /dev/null +++ b/Task 1/Hiking&AvgAge.sql @@ -0,0 +1,5 @@ +SELECT AVG(TIMESTAMPDIFF(YEAR, p.DOB, CURDATE())) AS AvgAge +FROM Person p +JOIN favorites f ON p.PersonID = f.PersonID +WHERE f.FavoriteActivity = 'Hiking'; + diff --git a/Task 1/Neighbour C.sql b/Task 1/Neighbour C.sql new file mode 100644 index 0000000000000000000000000000000000000000..addc2c7d9dd5b0910ff1d097fbaeb7a36e461a70 --- /dev/null +++ b/Task 1/Neighbour C.sql @@ -0,0 +1,5 @@ +SELECT p.Name +FROM Person p +JOIN Neighbour n ON p.PersonID = n.PersonID +WHERE n.NeighbourName = 'Neighbor C'; + diff --git a/Task 1/Person&Age.sql b/Task 1/Person&Age.sql new file mode 100644 index 0000000000000000000000000000000000000000..4806cff4b4f4f29e6d900925d43734b018f089a8 --- /dev/null +++ b/Task 1/Person&Age.sql @@ -0,0 +1,2 @@ +USE PeopleDB; +SELECT Name, TIMESTAMPDIFF(YEAR, DOB, CURDATE()) AS Age FROM Person; diff --git a/Task 1/Table_setup.sql b/Task 1/Table_setup.sql new file mode 100644 index 0000000000000000000000000000000000000000..ce9c9f0ff940a87f4931ed28833ecca4f6703040 --- /dev/null +++ b/Task 1/Table_setup.sql @@ -0,0 +1,33 @@ +CREATE TABLE person ( + PersonID INT PRIMARY KEY, + Name VARCHAR(255) NOT NULL, + Email VARCHAR(255) UNIQUE NOT NULL, + DOB DATE NOT NULL +); + +CREATE TABLE address ( + AddressID INT PRIMARY KEY, + PersonID INT, + Street VARCHAR(255) NOT NULL, + City VARCHAR(100) NOT NULL, + Country VARCHAR(100) NOT NULL, + ZipCode VARCHAR(20) NOT NULL, + FOREIGN KEY (PersonID) REFERENCES person(PersonID) ON DELETE CASCADE +); + +CREATE TABLE favorites ( + FavoriteID INT PRIMARY KEY, + PersonID INT, + FavoriteBook VARCHAR(255), + FavoriteDrink VARCHAR(255), + FavoriteActivity VARCHAR(255), + FOREIGN KEY (PersonID) REFERENCES person(PersonID) ON DELETE CASCADE +); + +CREATE TABLE neighbour ( + NeighbourID INT PRIMARY KEY, + PersonID INT, + NeighbourName VARCHAR(255), + NeighbourEmail VARCHAR(255), + FOREIGN KEY (PersonID) REFERENCES person(PersonID) ON DELETE CASCADE +); diff --git a/Task 1/adress_import.sql b/Task 1/adress_import.sql new file mode 100644 index 0000000000000000000000000000000000000000..59d861e0da8da3b7706ec972a56be22997f02947 --- /dev/null +++ b/Task 1/adress_import.sql @@ -0,0 +1,12 @@ +LOAD DATA INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/Assessment2425DataCaseScenario.csv' +INTO TABLE Address +FIELDS TERMINATED BY ',' +LINES TERMINATED BY '\r\n' +IGNORE 1 ROWS +(@dummy1, @dummy2, @dummy3, @Street, @City, @Country, @ZipCode, @dummy4, @dummy5, @dummy6, @dummy7, @dummy8, @dummy9, @dummy10) +SET + PersonID = (SELECT PersonID FROM Person WHERE Email = @dummy2), + Street = @Street, + City = @City, + Country = @Country, + ZipCode = @ZipCode; diff --git a/Task 1/favourite_import.sql b/Task 1/favourite_import.sql new file mode 100644 index 0000000000000000000000000000000000000000..dea045ba135238fe708136757dacd998a0fd5d33 --- /dev/null +++ b/Task 1/favourite_import.sql @@ -0,0 +1,11 @@ +LOAD DATA INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/Assessment2425DataCaseScenario.csv' +INTO TABLE Favorites +FIELDS TERMINATED BY ',' +LINES TERMINATED BY '\r\n' +IGNORE 1 ROWS +(@dummy1, @dummy2, @dummy3, @dummy4, @dummy5, @dummy6, @dummy7, @FavoriteBook, @FavoriteDrink, @FavoriteActivity, @dummy8, @dummy9, @dummy10, @dummy11) +SET + PersonID = (SELECT PersonID FROM Person WHERE Email = @dummy2), + FavoriteBook = @FavoriteBook, + FavoriteDrink = @FavoriteDrink, + FavoriteActivity = @FavoriteActivity; diff --git a/Task 1/initial_setup.sql b/Task 1/initial_setup.sql new file mode 100644 index 0000000000000000000000000000000000000000..999b87f8152d508c10ed6e818a0982b08b130c1e --- /dev/null +++ b/Task 1/initial_setup.sql @@ -0,0 +1,2 @@ +CREATE DATABASE PeopleDB; +USE PeopleDB; \ No newline at end of file diff --git a/Task 1/neighbour2_import.sql b/Task 1/neighbour2_import.sql new file mode 100644 index 0000000000000000000000000000000000000000..6573c29d4070366fcd73d63612671ed75eff8739 --- /dev/null +++ b/Task 1/neighbour2_import.sql @@ -0,0 +1,11 @@ +LOAD DATA INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/Assessment2425DataCaseScenario.csv' +INTO TABLE Neighbour +FIELDS TERMINATED BY ',' +LINES TERMINATED BY '\r\n' +IGNORE 1 ROWS +(@dummy1, @dummy2, @dummy3, @du +mmy4, @dummy5, @dummy6, @dummy7, @dummy8, @dummy9, @dummy10, @Neighbour1, @Neighbour1Email, @Neighbour2, @Neighbour2Email) +SET + PersonID = (SELECT PersonID FROM Person WHERE Email = @dummy2), + NeighbourName = @Neighbour2, + NeighbourEmail = @Neighbour2Email; diff --git a/Task 1/neighbour_import.sql b/Task 1/neighbour_import.sql new file mode 100644 index 0000000000000000000000000000000000000000..a2732929fba2009803252dc4f7672ba1112d0922 --- /dev/null +++ b/Task 1/neighbour_import.sql @@ -0,0 +1,10 @@ +LOAD DATA INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/Assessment2425DataCaseScenario.csv' +INTO TABLE Neighbour +FIELDS TERMINATED BY ',' +LINES TERMINATED BY '\r\n' +IGNORE 1 ROWS +(@dummy1, @dummy2, @dummy3, @dummy4, @dummy5, @dummy6, @dummy7, @dummy8, @dummy9, @dummy10, @Neighbour1, @Neighbour1Email, @Neighbour2, @Neighbour2Email) +SET + PersonID = (SELECT PersonID FROM Person WHERE Email = @dummy2), + NeighbourName = @Neighbour1, + NeighbourEmail = @Neighbour1Email; diff --git a/Task 1/person_import.sql b/Task 1/person_import.sql new file mode 100644 index 0000000000000000000000000000000000000000..cc861cc1b167bfd12561c26264d8980aaa9ea2a5 --- /dev/null +++ b/Task 1/person_import.sql @@ -0,0 +1,9 @@ +LOAD DATA INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/Assessment2425DataCaseScenario.csv' +INTO TABLE Person +FIELDS TERMINATED BY ',' +LINES TERMINATED BY '\r\n' +IGNORE 1 ROWS +(@Name, Email, @DOB, @dummy1, @dummy2, @dummy3, @dummy4, @dummy5, @dummy6, @dummy7, @dummy8, @dummy9, @dummy10, @dummy11) +SET + PersonID = CAST(SUBSTRING_INDEX(@Name, ' ', -1) AS UNSIGNED), -- Extracts numeric ID + DOB = STR_TO_DATE(@DOB, '%m/%d/%Y'); diff --git a/Task 2/Assessment2425DataCaseScenario.xlsx b/Task 2/Assessment2425DataCaseScenario.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..3d4158b5d78aa101245c944834bc0fd1132e611a Binary files /dev/null and b/Task 2/Assessment2425DataCaseScenario.xlsx differ diff --git a/Task 2/__pycache__/setup.cpython-313.pyc b/Task 2/__pycache__/setup.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..698b696980b8f39444177f9a50c8761b70b92c85 Binary files /dev/null and b/Task 2/__pycache__/setup.cpython-313.pyc differ diff --git a/Task 2/insert_data.py b/Task 2/insert_data.py new file mode 100644 index 0000000000000000000000000000000000000000..0b139e66199bdb57cfb1991519bd9a569b808194 --- /dev/null +++ b/Task 2/insert_data.py @@ -0,0 +1,36 @@ +import pandas as pd +from setup import collection + +file_path = "Assessment2425DataCaseScenario.xlsx" +df = pd.read_excel(file_path) + +# Convert Excel data to a format suitable for MongoDB +persons_data = [] +for _, row in df.iterrows(): + person = { + "name": row["Name"], + "email": row["Email"], + "dob": row["DOB"], + "address": { + "street": row["Street"], + "city": row["City"], + "country": row["Country"], + "zip_code": str(row["Zip Code"]) # Convert zip code to string + }, + "favourites": { + "book": row["Favorite Book"], + "drink": row["Favorite Drink"], + "activity": row["Favorite Activity"] + }, + "neighbours": [ + {"name": row["Neighbour 1"], "email": row["Neighbour1Email"]} if pd.notna(row["Neighbour 1"]) else None, + {"name": row["Neighbour 2"], "email": row["Neighbour2Email"]} if pd.notna(row["Neighbour 2"]) else None + ] + } + + person["neighbours"] = [n for n in person["neighbours"] if n is not None] + + persons_data.append(person) + +collection.insert_many(persons_data) +print("Excel data inserted into MongoDB successfully!") diff --git a/Task 2/queries.py b/Task 2/queries.py new file mode 100644 index 0000000000000000000000000000000000000000..c9814893a8bf3089b6e12b06c1f61a42eaff5dd0 --- /dev/null +++ b/Task 2/queries.py @@ -0,0 +1,61 @@ +from setup import collection +from datetime import datetime + +# Function to calculate age from DOB +def calculate_age(dob): + if isinstance(dob, str): + dob = datetime.strptime(dob, "%Y-%m-%d") + + birth_year = dob.year # Extract year directly + current_year = datetime.now().year + return current_year - birth_year + +# Display Person's Name and Age +print("\n--- Persons and Their Age ---") +for person in collection.find({}, {"name": 1, "dob": 1}): + age = calculate_age(person["dob"]) + print(f"Name: {person['name']}, Age: {age}") + +# Group Persons by Their Favourite Drink and Return Average Age +print("\n--- Average Age by Favourite Drink ---") +pipeline = [ + { + "$group": { + "_id": "$favourites.drink", + "average_age": {"$avg": {"$subtract": [datetime.now().year, {"$toInt": {"$substr": ["$dob", 0, 4]}}]}} + } + } +] +results = collection.aggregate(pipeline) +for res in results: + print(f"Drink: {res['_id']}, Average Age: {res['average_age']}") + +# Display Average Age of People Who Like Hiking +print("\n--- Average Age of People Who Like Hiking ---") +pipeline = [ + {"$match": {"favourites.activity": "Hiking"}}, + { + "$group": { + "_id": None, + "average_age": {"$avg": {"$subtract": [datetime.now().year, {"$toInt": {"$substr": ["$dob", 0, 4]}}]}} + } + } +] +result = list(collection.aggregate(pipeline)) +print(f"Average age of people who like Hiking: {result[0]['average_age']}") + +# Display Total Number of People from Each City +print("\n--- Total Number of People per City ---") +pipeline = [ + {"$group": {"_id": "$address.city", "total_people": {"$sum": 1}}}, + {"$sort": {"total_people": 1}} +] +results = collection.aggregate(pipeline) +for res in results: + print(f"City: {res['_id']}, Total People: {res['total_people']}") + +# Display Name of Person(s) Whose Neighbour is 'Neighbour C' +print("\n--- People Whose Neighbour is 'Neighbour C' ---") +results = collection.find({"neighbours.name": "Neighbor C"}, {"name": 1, "_id": 0}) +for person in results: + print(person["name"]) diff --git a/Task 2/setup.py b/Task 2/setup.py new file mode 100644 index 0000000000000000000000000000000000000000..3fedda2731729577e67b2e18192aeb921db22944 --- /dev/null +++ b/Task 2/setup.py @@ -0,0 +1,10 @@ +from pymongo import MongoClient + +# Connect to MongoDB +client = MongoClient("mongodb://localhost:27017/") + +# Create the database and collection +db = client["task2_nosql"] +collection = db["persons"] + +print("MongoDB connection successful!") diff --git a/Task 2/test.py b/Task 2/test.py new file mode 100644 index 0000000000000000000000000000000000000000..212e25f77b0c68b4a6e47ac19f7e38e1400b9a65 --- /dev/null +++ b/Task 2/test.py @@ -0,0 +1,9 @@ +from setup import collection +from datetime import datetime + +print("\n--- People Whose Neighbour is 'Neighbour C' ---") +results = collection.find({"neighbours.name": "Neighbor C"}, + {"name": 1, "_id": 0}) +for person in results: + print(person["name"]) +