The system assumes the following:
- Each student belongs to exactly one department.
- Each department can offer multiple courses.
- Each instructor works for one department and can teach multiple courses.
- Students can enroll in multiple courses.
- Students may have an assigned academic advisor (Instructor).
- Students make payments to the institution.
- All data is stored in a relational model with properly defined primary keys, foreign keys, integrity constraints, and relationships.
erDiagram
STUDENT {
int Student_ID PK
string S_Name
string S_Surname
int S_Age
string S_Email
int Registration_Year
string Grade
int Department_No FK
}
DEPARTMENT {
int Department_No PK
string Department_Name
}
INSTRUCTOR {
int Instructor_ID PK
string I_Name
string I_Surname
int Salary
int I_Age
string I_Mail
int Department_No FK
}
COURSE {
int Course_ID PK
string Course_Name
int Credit
int Instructor_ID FK
int Semester
int Department_No FK
}
ENROLLMENT {
int Enrollment_ID PK
int Student_ID FK
int Course_ID FK
string Grade
date Enrollment_Date
int Semester
}
PAYMENTS {
int Payment_ID PK
string Payment_Status
int Student_ID FK
string Payment_Method
date Payment_Date
decimal Payment_Amount
}
%% Relationships
STUDENT ||--o{ ENROLLMENT : "Enrolled_In"
COURSE ||--o{ ENROLLMENT : "Has_Enrollment"
DEPARTMENT ||--o{ STUDENT : "Belongs_To"
DEPARTMENT ||--o{ COURSE : "Offers"
DEPARTMENT ||--o{ INSTRUCTOR : "Employs"
INSTRUCTOR ||--o{ COURSE : "Teaches"
INSTRUCTOR ||--o{ STUDENT : "Advises"
STUDENT ||--o{ PAYMENTS : "Pays"
CREATE TABLE Department (
Department_No INT PRIMARY KEY,
Department_Name VARCHAR(100) NOT NULL UNIQUE
);CREATE TABLE Student (
Student_ID INT PRIMARY KEY,
S_Name VARCHAR(100) NOT NULL,
S_Surname VARCHAR(100) NOT NULL,
S_Age INT CHECK (S_Age > 15),
S_Email VARCHAR(150) UNIQUE,
Registration_Year INT CHECK (Registration_Year >= 2000),
Grade VARCHAR(5),
Department_No INT NOT NULL,
FOREIGN KEY (Department_No) REFERENCES Department(Department_No)
);CREATE TABLE Instructor (
Instructor_ID INT PRIMARY KEY,
I_Name VARCHAR(100) NOT NULL,
I_Surname VARCHAR(100) NOT NULL,
Salary INT CHECK (Salary >= 0),
I_Age INT CHECK (I_Age > 20),
I_Mail VARCHAR(150) UNIQUE,
Department_No INT NOT NULL,
FOREIGN KEY (Department_No) REFERENCES Department(Department_No)
);CREATE TABLE Course (
Course_ID INT PRIMARY KEY,
Course_Name VARCHAR(100) NOT NULL,
Credit INT CHECK (Credit BETWEEN 1 AND 10),
Instructor_ID INT NOT NULL,
Semester INT CHECK (Semester BETWEEN 1 AND 8),
Department_No INT NOT NULL,
FOREIGN KEY (Instructor_ID) REFERENCES Instructor(Instructor_ID),
FOREIGN KEY (Department_No) REFERENCES Department(Department_No)
);CREATE TABLE Enrollment (
Enrollment_ID INT PRIMARY KEY,
Student_ID INT NOT NULL,
Course_ID INT NOT NULL,
Grade VARCHAR(5),
Enrollment_Date DATE DEFAULT CURRENT_DATE,
Semester INT CHECK (Semester BETWEEN 1 AND 8),
FOREIGN KEY (Student_ID) REFERENCES Student(Student_ID),
FOREIGN KEY (Course_ID) REFERENCES Course(Course_ID)
);CREATE TABLE Payments (
Payment_ID INT PRIMARY KEY,
Payment_Status VARCHAR(20) CHECK (Payment_Status IN ('Paid', 'Pending', 'Cancelled')),
Student_ID INT NOT NULL,
Payment_Method VARCHAR(50),
Payment_Date DATE DEFAULT CURRENT_DATE,
Payment_Amount DECIMAL(10,2) CHECK (Payment_Amount >= 0),
FOREIGN KEY (Student_ID) REFERENCES Student(Student_ID)
);(Includes JOINs, Subqueries, Character Functions, Date Functions, Numeric Functions, Aggregations, and Advanced SQL Operations)
SELECT Course_Name, Credit
FROM Course
ORDER BY Credit DESC
LIMIT 5;SELECT s.S_Name, s.S_Surname, COUNT(e.Enrollment_ID) AS Total_Courses
FROM Student s
LEFT JOIN Enrollment e ON s.Student_ID = e.Student_ID
GROUP BY s.Student_ID;SELECT d.Department_Name, COUNT(s.Student_ID) AS Student_Count
FROM Department d
LEFT JOIN Student s ON d.Department_No = s.Department_No
GROUP BY d.Department_No;SELECT s.S_Name, s.S_Surname, SUM(p.Payment_Amount) AS Total_Paid
FROM Student s
JOIN Payments p ON s.Student_ID = p.Student_ID
GROUP BY s.Student_ID;SELECT Course_Name, Credit
FROM Course
WHERE Credit > (SELECT AVG(Credit) FROM Course);SELECT c.Course_Name, COUNT(e.Enrollment_ID) AS Total_Enrollments
FROM Course c
JOIN Enrollment e ON c.Course_ID = e.Course_ID
GROUP BY c.Course_ID
ORDER BY Total_Enrollments DESC
LIMIT 1;SELECT p.Payment_ID, s.S_Name, s.S_Surname, p.Payment_Date, p.Payment_Amount
FROM Payments p
JOIN Student s ON p.Student_ID = s.Student_ID
WHERE p.Payment_Date >= CURRENT_DATE - INTERVAL '30 days';SELECT c.Course_Name, AVG(NULLIF(TRY_CAST(e.Grade AS INT), 0)) AS Average_Grade
FROM Course c
JOIN Enrollment e ON c.Course_ID = e.Course_ID
GROUP BY c.Course_ID;SELECT *
FROM Student
WHERE LOWER(S_Surname) LIKE '%son';SELECT c.Course_Name, COUNT(e.Student_ID) AS Student_Count, AVG(e.Semester) AS Avg_Semester
FROM Course c
JOIN Enrollment e ON c.Course_ID = e.Course_ID
GROUP BY c.Course_ID;SELECT S_Name, S_Surname
FROM Student
WHERE Student_ID NOT IN (SELECT Student_ID FROM Enrollment);SELECT I_Name, I_Surname, Salary
FROM Instructor
ORDER BY Salary DESC
LIMIT 1;SELECT d.Department_Name, AVG(i.Salary) AS Average_Salary
FROM Department d
JOIN Instructor i ON d.Department_No = i.Department_No
GROUP BY d.Department_No;SELECT s.S_Name, s.S_Surname, SUM(p.Payment_Amount) AS Total_Payment
FROM Student s
JOIN Payments p ON s.Student_ID = p.Student_ID
GROUP BY s.Student_ID
HAVING SUM(p.Payment_Amount) > 5000;SELECT s.S_Name, s.S_Surname,
TO_CHAR(e.Enrollment_Date, 'DD Mon YYYY') AS Formatted_Date
FROM Student s
JOIN Enrollment e ON s.Student_ID = e.Student_ID;