Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
173 changes: 173 additions & 0 deletions AI/benchenina_souhaib/tp1_solution.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@

-- use the command "cat AI/benchenina_souhaib/tp1_solution.sql | ./sqlite3 dbtp.db" in the terminal to creat the tables of the first exercice

-- making the skema first


CREATE TABLE Professors (
professor_id INTEGER PRIMARY KEY AUTOINCREMENT,
first_name TEXT NOT NULL,
last_name TEXT NOT NULL,
department TEXT
);


CREATE TABLE Students (
student_id INTEGER PRIMARY KEY AUTOINCREMENT,
first_name TEXT NOT NULL,
last_name TEXT NOT NULL,
email TEXT UNIQUE,
enrollment_date DATE DEFAULT CURRENT_DATE
);


CREATE TABLE Courses (
course_id INTEGER PRIMARY KEY AUTOINCREMENT,
course_name TEXT NOT NULL,
credits INTEGER CHECK (credits > 0),
professor_id INTEGER,
FOREIGN KEY (professor_id) REFERENCES Professors(professor_id)
);


CREATE TABLE Enrollments (
enrollment_id INTEGER PRIMARY KEY AUTOINCREMENT,
student_id INTEGER,
course_id INTEGER,
FOREIGN KEY (student_id) REFERENCES Students(student_id),
FOREIGN KEY (course_id) REFERENCES Courses(course_id)
);


CREATE TABLE Grades (
grade_id INTEGER PRIMARY KEY AUTOINCREMENT,
enrollment_id INTEGER,
score REAL CHECK (score >= 0 AND score <= 20),
term TEXT,
FOREIGN KEY (enrollment_id) REFERENCES Enrollments(enrollment_id)
);


-- putting in all the people now


-- insterting the 6 techers
INSERT INTO Professors (first_name, last_name, department) VALUES
('Ahmed', 'Mansour', 'Computer Science'),
('Fatima', 'Zahra', 'Mathematics'),
('Omar', 'Al-Fayed', 'Physics'),
('Layla', 'Hassan', 'Computer Science'),
('Youssef', 'Berrada', 'Engineering'),
('Amira', 'Said', 'Mathematics');


-- adding the 8 stundents
INSERT INTO Students (first_name, last_name, email) VALUES
('Yassine', 'Idrissi', '[email protected]'),
('Khadija', 'Amrani', '[email protected]'),
('Mustafa', 'Alami', '[email protected]'),
('Sanaa', 'Tazi', '[email protected]'),
('Hamza', 'Bennis', '[email protected]'),
('Zineb', 'Toumi', '[email protected]'),
('Walid', 'Kabbaj', '[email protected]'),
('Meryem', 'Fassi', '[email protected]');



-- the 7 lessons
INSERT INTO Courses (course_name, credits, professor_id) VALUES
('Database Systems', 4, 1),
('Calculus I', 3, 2),
('Quantum Physics', 4, 3),
('Software Engineering', 4, 4),
('Data Structures', 4, 1),
('Linear Algebra', 3, 6),
('Thermodynamics', 3, 5);


-- the 15 signs ups
INSERT INTO Enrollments (student_id, course_id) VALUES
(1,1), (1,2), (2,1), (2,4), (3,1), (3,5), (4,2), (4,3), (5,4), (5,5), (6,6), (6,7), (7,1), (8,2), (8,7);


-- lastly the 12 marks
INSERT INTO Grades (enrollment_id, score, term) VALUES
(1, 18.5, 'Fall'), (2, 14.0, 'Fall'), (3, 16.0, 'Fall'), (4, 12.5, 'Fall'),
(5, 19.0, 'Fall'), (6, 15.5, 'Fall'), (7, 13.0, 'Fall'), (8, 17.5, 'Fall'),
(9, 11.0, 'Fall'), (10, 14.5, 'Fall'), (11, 16.5, 'Fall'), (12, 18.0, 'Fall');



-- here are the 30 quaries


-- just basic ones first
SELECT * FROM Students;

SELECT first_name, last_name FROM Professors;

SELECT course_name, credits FROM Courses WHERE credits > 3;

SELECT * FROM Students WHERE enrollment_date > '2024-01-01';

SELECT DISTINCT department FROM Professors;



-- joining tables together
SELECT s.first_name, c.course_name FROM Students s JOIN Enrollments e ON s.student_id = e.student_id JOIN Courses c ON e.course_id = c.course_id;

SELECT c.course_name, p.last_name FROM Courses c JOIN Professors p ON c.professor_id = p.professor_id;

SELECT s.first_name, g.score FROM Students s JOIN Enrollments e ON s.student_id = e.student_id JOIN Grades g ON e.enrollment_id = g.enrollment_id;

SELECT p.first_name, c.course_name FROM Professors p LEFT JOIN Courses c ON p.professor_id = c.professor_id;

SELECT s.first_name, s.last_name, c.course_name, g.score FROM Students s JOIN Enrollments e ON s.student_id = e.student_id JOIN Courses c ON e.course_id = c.course_id JOIN Grades g ON e.enrollment_id = g.enrollment_id;



-- maths and counting
SELECT AVG(score) FROM Grades;

SELECT COUNT(*) FROM Students;
SELECT department, COUNT(*) FROM Professors GROUP BY department;

SELECT course_id, COUNT(*) FROM Enrollments GROUP BY course_id;

SELECT MAX(score) FROM Grades;


-- sorting and filters
SELECT * FROM Students ORDER BY last_name ASC;

SELECT * FROM Courses WHERE credits BETWEEN 3 AND 4;

SELECT * FROM Students WHERE email LIKE '%@univ.ma';

SELECT * FROM Grades WHERE score >= 10;
SELECT student_id, COUNT(*) FROM Enrollments GROUP BY student_id HAVING COUNT(*) > 1;



-- fancy subquaries
SELECT * FROM Students WHERE student_id IN (SELECT student_id FROM Enrollments WHERE course_id = 1);

SELECT * FROM Courses WHERE professor_id = (SELECT professor_id FROM Professors WHERE last_name = 'Mansour');

SELECT first_name FROM Students WHERE student_id IN (SELECT student_id FROM Enrollments JOIN Grades USING(enrollment_id) WHERE score > 16);

SELECT * FROM Professors WHERE professor_id NOT IN (SELECT professor_id FROM Courses);

SELECT course_name FROM Courses WHERE credits = (SELECT MAX(credits) FROM Courses);


-- bits and bobs at the end
UPDATE Grades SET score = 20 WHERE score > 19;
SELECT s.first_name, AVG(g.score) FROM Students s JOIN Enrollments e ON s.student_id = e.student_id JOIN Grades g ON e.enrollment_id = g.enrollment_id GROUP BY s.student_id;

SELECT term, COUNT(*) FROM Grades GROUP BY term;

SELECT * FROM Students WHERE student_id NOT IN (SELECT student_id FROM Enrollments);

SELECT department FROM Professors GROUP BY department HAVING COUNT(*) > 1;
194 changes: 194 additions & 0 deletions AI/benchenina_souhaib/tp2_solution.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,194 @@
-- use the command "cat AI/benchenina_souhaib/tp2_solution.sql | ./sqlite3 dbtp.db" in the terminal to creat the tables of the first exercice
-- making the hospital tables now

CREATE TABLE Doctors (
doctor_id INTEGER PRIMARY KEY AUTOINCREMENT,
first_name TEXT NOT NULL,
last_name TEXT NOT NULL,
specialization TEXT,
department TEXT,
phone TEXT
);


CREATE TABLE Patients (
patient_id INTEGER PRIMARY KEY AUTOINCREMENT,
first_name TEXT NOT NULL,
last_name TEXT NOT NULL,
date_of_birth DATE,
gender TEXT,
address TEXT,
phone TEXT
);


CREATE TABLE Appointments (
appointment_id INTEGER PRIMARY KEY AUTOINCREMENT,
patient_id INTEGER,
doctor_id INTEGER,
appointment_date DATETIME NOT NULL,
reason TEXT,
status TEXT DEFAULT 'Scheduled',
FOREIGN KEY (patient_id) REFERENCES Patients(patient_id),
FOREIGN KEY (doctor_id) REFERENCES Doctors(doctor_id)
);


CREATE TABLE Medications (
medication_id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
dosage TEXT,
description TEXT
);


CREATE TABLE Prescriptions (
prescription_id INTEGER PRIMARY KEY AUTOINCREMENT,
appointment_id INTEGER,
medication_id INTEGER,
instructions TEXT,
FOREIGN KEY (appointment_id) REFERENCES Appointments(appointment_id),
FOREIGN KEY (medication_id) REFERENCES Medications(medication_id)
);


-- putting in the data... hope I didnt miss anyone


-- adding the 6 docctors
INSERT INTO Doctors (first_name, last_name, specialization, department, phone) VALUES
('Hicham', 'El-Guerrouj', 'Cardiology', 'Internal Medicine', '0611223344'),
('Nawal', 'El-Moutawakel', 'Pediatrics', 'Children Unit', '0622334455'),
('Said', 'Aouita', 'Neurology', 'Neurological Sciences', '0633445566'),
('Nesrine', 'Slama', 'General Medicine', 'Emergency', '0644556677'),
('Mehdi', 'Benatia', 'Orthopedics', 'Surgery', '0655667788'),
('Hakim', 'Ziyech', 'Dermatology', 'Outpatient', '0666778899');



-- adding the 8 patiennts
INSERT INTO Patients (first_name, last_name, date_of_birth, gender, address, phone) VALUES
('Soufiane', 'Rahimi', '1996-06-02', 'Male', 'Casablanca', '0701020304'),

('Brahim', 'Diaz', '1999-08-03', 'Male', 'Tangier', '0702030405'),
('Salma', 'Amani', '1992-04-15', 'Female', 'Rabat', '0703040506'),
('Fatima', 'Tagnaout', '1999-01-20', 'Female', 'Agadir', '0704050607'),
('Achraf', 'Hakimi', '1998-11-04', 'Male', 'Madrid', '0705060708'),

('Youssef', 'En-Nesyri', '1997-06-01', 'Male', 'Fes', '0706070809'),

('Sofyan', 'Amrabat', '1996-08-21', 'Male', 'Florence', '0707080910'),
('Romain', 'Saïss', '1990-03-26', 'Male', 'Istanbul', '0708091011');


-- setting up the 15 meets
INSERT INTO Appointments (patient_id, doctor_id, appointment_date, reason, status) VALUES
(1, 1, '2026-02-20 09:00:00', 'Chest pain', 'Completed'),
(2, 4, '2026-02-21 10:30:00', 'Flu symptoms', 'Scheduled'),
(3, 2, '2026-02-21 14:00:00', 'Child checkup', 'Scheduled'),
(4, 6, '2026-02-22 11:00:00', 'Skin rash', 'Scheduled'),
(5, 1, '2026-02-23 08:45:00', 'Heart follow-up', 'Scheduled'),
(6, 5, '2026-02-24 13:00:00', 'Knee injury', 'Completed'),
(7, 3, '2026-02-25 15:30:00', 'Headache', 'Scheduled'),
(8, 5, '2026-02-26 10:00:00', 'Back pain', 'Scheduled'),
(1, 4, '2026-02-27 09:15:00', 'General fatigue', 'Scheduled'),
(2, 1, '2026-02-28 11:30:00', 'Artery check', 'Scheduled'),

(3, 2, '2026-03-01 14:45:00', 'Fever', 'Scheduled'),
(5, 5, '2026-03-02 16:00:00', 'Ankle sprain', 'Scheduled'),
(6, 6, '2026-03-03 09:00:00', 'Acne treatment', 'Scheduled'),
(7, 3, '2026-03-04 11:00:00', 'Nerve test', 'Scheduled'),
(8, 1, '2026-03-05 10:30:00', 'Blood pressure', 'Scheduled');



-- some pills and stuff
INSERT INTO Medications (name, dosage, description) VALUES
('Aspirin', '100mg', 'Blood thinner'),
('Paracetamol', '500mg', 'Pain reliever'),
('Amoxicillin', '250mg', 'Antibiotic'),
('Loratadine', '10mg', 'Antihistamine');


INSERT INTO Prescriptions (appointment_id, medication_id, instructions) VALUES
(1, 1, 'Once daily after breakfast'),
(2, 2, 'Every 6 hours if fever'),
(6, 2, 'Twice daily for pain'),
(4, 4, 'Before bed');



-- the big list of quaries for the hospital


-- easy ones to start with
SELECT * FROM Patients;

SELECT first_name, last_name FROM Doctors WHERE specialization = 'Cardiology';

SELECT * FROM Appointments WHERE status = 'Scheduled';

SELECT name FROM Medications ORDER BY name ASC;

SELECT DISTINCT department FROM Doctors;



-- looking across different tables
SELECT p.first_name, d.last_name, a.appointment_date FROM Patients p JOIN Appointments a ON p.patient_id = a.patient_id JOIN Doctors d ON a.doctor_id = d.doctor_id;

SELECT a.appointment_id, m.name, pr.instructions FROM Appointments a JOIN Prescriptions pr ON a.appointment_id = pr.appointment_id JOIN Medications m ON pr.medication_id = m.medication_id;

SELECT d.first_name, a.reason FROM Doctors d LEFT JOIN Appointments a ON d.doctor_id = a.doctor_id;

SELECT p.first_name, a.status FROM Patients p JOIN Appointments a ON p.patient_id = a.patient_id WHERE a.doctor_id = 5;

SELECT d.last_name, p.last_name FROM Doctors d JOIN Appointments a ON d.doctor_id = a.doctor_id JOIN Patients p ON a.patient_id = p.patient_id WHERE a.status = 'Completed';



-- counting and stuff
SELECT COUNT(*) FROM Patients;

SELECT department, COUNT(*) FROM Doctors GROUP BY department;

SELECT status, COUNT(*) FROM Appointments GROUP BY status;

SELECT doctor_id, COUNT(*) FROM Appointments GROUP BY doctor_id HAVING COUNT(*) > 2;

SELECT patient_id, COUNT(*) FROM Appointments GROUP BY patient_id;
SELECT AVG(strftime('%Y', 'now') - strftime('%Y', date_of_birth)) AS avg_age FROM Patients;

SELECT MAX(appointment_date) FROM Appointments;

SELECT specialization, COUNT(*) FROM Doctors GROUP BY specialization;

SELECT COUNT(DISTINCT patient_id) FROM Appointments;
SELECT MIN(appointment_date) FROM Appointments WHERE status = 'Scheduled';



-- bit more complext ones
SELECT * FROM Patients WHERE patient_id IN (SELECT patient_id FROM Appointments WHERE doctor_id = 1);

SELECT * FROM Doctors WHERE doctor_id NOT IN (SELECT doctor_id FROM Appointments);

SELECT first_name FROM Patients WHERE patient_id IN (SELECT patient_id FROM Appointments WHERE reason LIKE '%pain%');

SELECT * FROM Medications WHERE medication_id IN (SELECT medication_id FROM Prescriptions);
SELECT * FROM Patients WHERE strftime('%Y', date_of_birth) > '1995';



-- final lot of quaries


SELECT * FROM Appointments WHERE appointment_date BETWEEN '2026-02-20' AND '2026-02-25';

UPDATE Appointments SET status = 'Completed' WHERE appointment_id = 2;
SELECT p.first_name, d.first_name, a.appointment_date FROM Patients p JOIN Appointments a ON p.patient_id = a.patient_id JOIN Doctors d ON a.doctor_id = d.doctor_id WHERE d.department = 'Internal Medicine';

SELECT * FROM Patients WHERE address = 'Casablanca' OR address = 'Tangier';


SELECT d.first_name, COUNT(a.appointment_id) AS total FROM Doctors d JOIN Appointments a ON d.doctor_id = a.doctor_id GROUP BY d.doctor_id ORDER BY total DESC;
Binary file added sqlite3.exe
Binary file not shown.
Loading