├── datatypes.sql ├── intro.sql ├── prepare.sql ├── curd.sql ├── select.sql ├── table.sql ├── user.sql ├── insert.sql └── aggregation.sql /datatypes.sql: -------------------------------------------------------------------------------- 1 | -- data types 2 | BOOLEAN 3 | CHAR 4 | VARCHAR 5 | TEXT 6 | SMALLINT 7 | INT 8 | SERIAL 9 | FLOAT 10 | NUMERIC 11 | JSON 12 | UUID 13 | DATE 14 | TIME 15 | TIMESTAMP 16 | TIMESTAMP --Z 17 | TIMESTAMP --WITH TIME ZONE -------------------------------------------------------------------------------- /intro.sql: -------------------------------------------------------------------------------- 1 | Active: 1750260753519@@127.0.0.1@5432@postgres 2 | 3 | create database 4 | CREATE DATABASE practice; 5 | 6 | switch database 7 | USE practice; 8 | 9 | rename database 10 | ALTER DATABASE practice RENAME TO practice_renamed; -------------------------------------------------------------------------------- /prepare.sql: -------------------------------------------------------------------------------- 1 | PREPARE my_query (int, text) AS 2 | SELECT * FROM users WHERE id = $1 AND name = $2; 3 | EXECUTE my_query(1, 'Alice'); 4 | 5 | 6 | -- Step 1: Prepare a statement 7 | PREPARE get_user_by_email (text) AS 8 | SELECT id, name FROM users WHERE email = $1; 9 | 10 | -- Step 2: Execute with different bindings 11 | EXECUTE get_user_by_email('alice@example.com'); 12 | EXECUTE get_user_by_email('bob@example.com'); 13 | -------------------------------------------------------------------------------- /curd.sql: -------------------------------------------------------------------------------- 1 | INSERT INTO "Department"(name) VALUES ('Engineering'); 2 | 3 | INSERT INTO "Employee"(first_name, last_name, about, department_id) VALUES ('John', 'Doe', 'A software developer', 1), ('Jane', 'Doe', 'A software developer', 1), ('Bob', 'Doe', 'A software developer', 1), ('Alice', 'Doe', 'A software developer', 1); 4 | 5 | SELECT * FROM "Department"; 6 | SELECT * FROM "Employee"; 7 | UPDATE "Employee" SET about = 'A manager updated about text' WHERE employee_id = 1; 8 | DELETE FROM "Employee" WHERE employee_id = 3; -------------------------------------------------------------------------------- /select.sql: -------------------------------------------------------------------------------- 1 | INSERT INTO "Courses"(course_name,credits) VALUES("web development",10); 2 | INSERT INTO "Departments"(department_name) VALUES("Software"); 3 | 4 | 5 | SELECT * FROM "Students" WHERE fees BETWEEN 100 AND 500; 6 | 7 | SELECT s.name s.email s.fees FROM "Students" s WHERE fees BETWEEN 100 AND 500; 8 | 9 | SELECT s.name s.email s.fees d.department_name d.department_id AS dept_if FROM "Students" INNER JOIN "Departments" ON d d.department_id = s.student_id; 10 | 11 | SELECT AVG(fees) AS avg_fee, COUNT(*) AS total, MAX(fees) AS max_fee FROM "Students"; 12 | 13 | -------------------------------------------------------------------------------- /table.sql: -------------------------------------------------------------------------------- 1 | 2 | CREATE TABLE IF NOT EXISTS "Departments"( 3 | department_id SERIAL PRIMARY KEY, 4 | department_name VARCHAR(50) 5 | ); 6 | 7 | 8 | CREATE TABLE "Employee" ( 9 | employee_id SERIAL PRIMARY KEY, 10 | first_name VARCHAR(50) NOT NULL, 11 | last_name VARCHAR(50) NOT NULL, 12 | about TEXT, 13 | department_id INT, 14 | CONSTRAINT fk_department FOREIGN KEY (department_id) REFERENCES "Departments"(department_id) ON DELETE CASCADE 15 | ); 16 | 17 | 18 | CREATE TABLE IF NOT EXISTS "Courses" ( 19 | course_id SERIAL PRIMARY KEY, 20 | course_name VARCHAR(100) NOT NULL, 21 | credits INT CHECK (credits BETWEEN 1 AND 10) 22 | ); 23 | 24 | 25 | CREATE TABLE IF NOT EXISTS "Students" ( 26 | student_id SERIAL PRIMARY KEY, 27 | student_name VARCHAR(30) NOT NULL, 28 | roll INT NOT NULL, 29 | fees INT NOT NULL, 30 | about TEXT, 31 | date_of_birth DATE CHECK ( 32 | date_of_birth BETWEEN '1900-01-01' AND CURRENT_DATE 33 | ), 34 | email VARCHAR(60) UNIQUE, 35 | department_id INT, 36 | CONSTRAINT fk_department FOREIGN KEY (department_id) REFERENCES "Departments"(department_id) ON DELETE CASCADE 37 | ); 38 | 39 | CREATE TABLE IF NOT EXISTS "Instructors"( 40 | instructor_id SERIAL PRIMARY KEY, 41 | instructor_name VARCHAR(100) NOT NULL, 42 | department_id INT REFERENCES "Departments"(department_id) ON DELETE CASCADE 43 | ); 44 | 45 | CREATE TABLE IF NOT EXISTS "Enrollments" ( 46 | enrollment_id SERIAL PRIMARY KEY, 47 | student_id INT REFERENCES "Students"(student_id) ON DELETE CASCADE, 48 | course_id INT REFERENCES "Courses"(course_id) ON DELETE CASCADE, 49 | grade NUMERIC(4,2) CHECK (grade BETWEEN 0 AND 100), 50 | enrollment_date DATE DEFAULT CURRENT_DATE 51 | ); 52 | 53 | CREATE TABLE IF NOT EXISTS "CourseAssignments" ( 54 | id SERIAL PRIMARY KEY, 55 | course_id INT REFERENCES "Courses"(course_id), 56 | instructor_id INT REFERENCES "Instructors"(instructor_id), 57 | semester VARCHAR(10), 58 | year INT 59 | ); 60 | -------------------------------------------------------------------------------- /user.sql: -------------------------------------------------------------------------------- 1 | -- ============================ 2 | -- PostgreSQL User Management 3 | -- ============================ 4 | 5 | -- 1. Create a New User 6 | CREATE USER your_username WITH PASSWORD 'your_secure_password'; 7 | 8 | -- 2. Alter User Password 9 | ALTER USER your_username WITH PASSWORD 'new_secure_password'; 10 | 11 | -- 3. Rename User 12 | ALTER USER your_username RENAME TO new_username; 13 | 14 | -- 4. Grant Superuser Privileges 15 | ALTER USER your_username WITH SUPERUSER; 16 | 17 | -- 5. Revoke Superuser Privileges 18 | ALTER USER your_username WITH NOSUPERUSER; 19 | 20 | -- 6. Drop User 21 | -- DROP USER your_username; 22 | 23 | -- 7. Create a New Database and Assign Owner 24 | CREATE DATABASE your_database OWNER your_username; 25 | 26 | -- 8. Change Database Owner 27 | ALTER DATABASE your_database OWNER TO new_owner; 28 | 29 | -- 9. Grant Privileges on Database 30 | GRANT CONNECT ON DATABASE your_database TO your_username; 31 | GRANT CREATE ON DATABASE your_database TO your_username; 32 | 33 | -- 10. Grant Privileges on All Tables in Schema (inside the database) 34 | -- (Make sure to \c your_database before running this) 35 | GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO your_username; 36 | 37 | -- 11. Grant Usage on All Sequences 38 | GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO your_username; 39 | 40 | -- 12. Set Default Privileges for Future Tables 41 | ALTER DEFAULT PRIVILEGES IN SCHEMA public 42 | GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO your_username; 43 | 44 | -- 13. Revoke All Permissions 45 | REVOKE ALL ON DATABASE your_database FROM your_username; 46 | REVOKE ALL ON ALL TABLES IN SCHEMA public FROM your_username; 47 | 48 | -- 14. (Reference Only) List All Users (run inside psql CLI) 49 | -- \du 50 | 51 | -- ============================ 52 | -- Example: Full Flow 53 | -- ============================ 54 | CREATE USER app_user WITH PASSWORD 'StrongPassword123'; 55 | CREATE DATABASE app_db OWNER app_user; 56 | GRANT ALL PRIVILEGES ON DATABASE app_db TO app_user; 57 | -------------------------------------------------------------------------------- /insert.sql: -------------------------------------------------------------------------------- 1 | INSERT INTO "Departments" (department_name) VALUES 2 | ('Computer Science'), 3 | ('Mathematics'), 4 | ('Physics'), 5 | ('Chemistry'), 6 | ('Biology'), 7 | ('English Literature'), 8 | ('Economics'), 9 | ('History'), 10 | ('Engineering'), 11 | ('Philosophy'); 12 | 13 | INSERT INTO "Employee" (first_name, last_name, about, department_id) VALUES 14 | ('Alice', 'Smith', 'Senior HR Manager', 1), 15 | ('Bob', 'Johnson', 'IT Technician', 1), 16 | ('Charlie', 'Brown', 'Accountant', 2), 17 | ('Diana', 'Taylor', 'Lab Technician', 3), 18 | ('Evan', 'White', 'Clerk', 4), 19 | ('Fiona', 'Green', 'Receptionist', 5), 20 | ('George', 'Martin', 'Research Assistant', 6), 21 | ('Hannah', 'Adams', 'Janitor', 7), 22 | ('Ian', 'Walker', 'Project Manager', 8), 23 | ('Julia', 'Hall', 'Admin Assistant', 9); 24 | 25 | INSERT INTO "Courses" (course_name, credits) VALUES 26 | ('Data Structures', 4), 27 | ('Linear Algebra', 3), 28 | ('Organic Chemistry', 4), 29 | ('Quantum Mechanics', 4), 30 | ('Microbiology', 3), 31 | ('British Poetry', 2), 32 | ('Macroeconomics', 3), 33 | ('Modern History', 3), 34 | ('Thermodynamics', 4), 35 | ('Ethics and Morality', 2); 36 | 37 | 38 | INSERT INTO "Students" (student_name, roll, fees, about, date_of_birth, email, department_id) VALUES 39 | ('Arif Hossain', 101, 15000, 'Loves algorithms', '2000-05-10', 'arif101@example.com', 1), 40 | ('Salma Khatun', 102, 14000, 'Interested in math', '1999-12-20', 'salma102@example.com', 2), 41 | ('Biplob Das', 103, 15500, 'Aspiring chemist', '2001-03-15', 'biplob103@example.com', 4), 42 | ('Nazmul Islam', 104, 16000, 'Physics enthusiast', '2000-08-22', 'nazmul104@example.com', 3), 43 | ('Faria Ahmed', 105, 14500, 'Bio lover', '2002-06-01', 'faria105@example.com', 5), 44 | ('Tamim Khan', 106, 17000, 'Poet and writer', '1998-11-30', 'tamim106@example.com', 6), 45 | ('Sadia Rahman', 107, 13500, 'Economics student', '2001-09-10', 'sadia107@example.com', 7), 46 | ('Jamil Chowdhury', 108, 14200, 'History buff', '1999-07-25', 'jamil108@example.com', 8), 47 | ('Nadia Hasan', 109, 18000, 'Engineer in making', '2000-04-18', 'nadia109@example.com', 9), 48 | ('Rafiq Karim', 110, 13000, 'Philosopher at heart', '2002-02-14', 'rafiq110@example.com', 10); 49 | 50 | 51 | INSERT INTO "Instructors" (instructor_name, department_id) VALUES 52 | ('Dr. Anwar Hossain', 1), 53 | ('Prof. Shirin Akter', 2), 54 | ('Dr. Kamal Uddin', 3), 55 | ('Dr. Lubna Ahmed', 4), 56 | ('Prof. Mahmud Hasan', 5), 57 | ('Dr. Nusrat Jahan', 6), 58 | ('Prof. Ahsan Karim', 7), 59 | ('Dr. Tanvir Rahman', 8), 60 | ('Prof. Rehana Siddiqui', 9), 61 | ('Dr. Omar Faruq', 10); 62 | 63 | 64 | INSERT INTO "Enrollments" (student_id, course_id, grade, enrollment_date) VALUES 65 | (1, 1, 85.50, '2024-01-15'), 66 | (2, 2, 78.00, '2024-01-20'), 67 | (3, 3, 92.30, '2024-01-25'), 68 | (4, 4, 88.75, '2024-01-28'), 69 | (5, 5, 80.00, '2024-02-01'), 70 | (6, 6, 95.00, '2024-02-05'), 71 | (7, 7, 82.50, '2024-02-10'), 72 | (8, 8, 75.00, '2024-02-12'), 73 | (9, 9, 89.60, '2024-02-14'), 74 | (10, 10, 91.10, '2024-02-16'); 75 | 76 | 77 | INSERT INTO "CourseAssignments" (course_id, instructor_id, semester, year) VALUES 78 | (1, 1, 'Spring', 2024), 79 | (2, 2, 'Spring', 2024), 80 | (3, 4, 'Fall', 2024), 81 | (4, 3, 'Fall', 2024), 82 | (5, 5, 'Summer', 2024), 83 | (6, 6, 'Spring', 2025), 84 | (7, 7, 'Fall', 2025), 85 | (8, 8, 'Summer', 2025), 86 | (9, 9, 'Spring', 2025), 87 | (10, 10, 'Fall', 2025); 88 | -------------------------------------------------------------------------------- /aggregation.sql: -------------------------------------------------------------------------------- 1 | SELECT COUNT(*) AS total, MAX(fees) AS max_fee, MIN(fees) AS min_fee, AVG(fees) AS avg_fee FROM "Students"; 2 | 3 | SELECT 4 | COUNT(*) AS student_per_dept, 5 | AVG(fees) AS avg_fee_per_dept, 6 | MAX(fees) AS max_fee_per_dept, 7 | MIN(fees) AS min_fee_per_dept, 8 | SUM(fees) AS total_fee_per_dept , 9 | d.department_name AS department 10 | FROM 11 | "Students" s 12 | LEFT JOIN 13 | "Departments" d ON d.department_id = s.department_id 14 | GROUP BY 15 | d.department_name; 16 | 17 | SELECT EXTRACT(YEAR FROM AGE(date_of_birth)) AS age_in_years ,student_name,date_of_birth FROM "Students" WHERE date_of_birth BETWEEN '1990-01-01' AND '1999-12-31'; 18 | 19 | SELECT COUNT(*) AS total_student , EXTRACT(YEAR FROM date_of_birth) AS years FROM "Students" GROUP BY years; 20 | 21 | SELECT 22 | c.course_name , 23 | c.course_id , 24 | (SELECT AVG(e.grade) FROM "Enrollments" e WHERE e.course_id = c.course_id) 25 | AS average_grade 26 | FROM "Courses" c 27 | ORDER BY average_grade DESC LIMIT 5; 28 | 29 | SELECT 30 | COUNT(*) AS total_student, 31 | d.department_name, 32 | d.department_id 33 | FROM "Departments" d 34 | INNER JOIN "Students" s ON d.department_id = s.department_id 35 | GROUP BY d.department_id ORDER BY total_student DESC LIMIT 5; 36 | 37 | SELECT 38 | about, 39 | email, 40 | student_name, fees, 41 | EXTRACT(YEAR FROM date_of_birth) AS birth_year 42 | FROM "Students" 43 | ORDER BY fees DESC 44 | LIMIT 3; 45 | 46 | SELECT 47 | d.department_id , 48 | d.department_name, 49 | AVG(s.fees) AS fees 50 | FROM "Departments" d 51 | INNER JOIN "Students" s 52 | ON s.department_id=d.department_id 53 | GROUP BY d.department_id 54 | ORDER BY d.department_id DESC 55 | LIMIT 3; 56 | 57 | SELECT 58 | e.enrollment_id, 59 | c.course_name, 60 | e.grade, 61 | e.enrollment_date, 62 | (SELECT COUNT(*) FROM "Students" s WHERE e.student_id =s.student_id) AS total_student 63 | FROM "Enrollments" e 64 | INNER JOIN "Courses" c ON c.course_id=e.course_id; 65 | SELECT 66 | c.course_id, 67 | c.course_name, 68 | COUNT(e.student_id) AS total_enrollments 69 | FROM "Enrollments" e 70 | INNER JOIN "Courses" c ON c.course_id = e.course_id 71 | GROUP BY c.course_id, c.course_name 72 | ORDER BY total_enrollments DESC 73 | LIMIT 3; 74 | 75 | -- this query bellow is not my 76 | SELECT 77 | c.course_id, 78 | c.course_name, 79 | COUNT(e.student_id) AS total_students, 80 | COALESCE( 81 | JSON_AGG( 82 | JSON_BUILD_OBJECT( 83 | 'student_id', s.student_id, 84 | 'student_name', s.student_name, 85 | 'email', s.email, 86 | 'roll', s.roll, 87 | 'fees', s.fees, 88 | 'dob', s.date_of_birth 89 | ) 90 | ) FILTER (WHERE s.student_id IS NOT NULL), 91 | '[]' 92 | ) AS students 93 | FROM "Courses" c 94 | LEFT JOIN "Enrollments" e ON c.course_id = e.course_id 95 | LEFT JOIN "Students" s ON s.student_id = e.student_id 96 | GROUP BY c.course_id, c.course_name 97 | ORDER BY total_students DESC; 98 | -- this query in up written by chatgpt 99 | 100 | SELECT 101 | c.course_id, 102 | c.course_name, 103 | ROUND(AVG(e.grade), 2) AS average_grade 104 | FROM "Courses" c 105 | JOIN "Enrollments" e ON c.course_id = e.course_id 106 | GROUP BY c.course_id, c.course_name 107 | ORDER BY average_grade DESC 108 | LIMIT 5; 109 | --------------------------------------------------------------------------------