-- ========== DDL: CREATE ==========
CREATE TABLE Donor (
    donor_id INTEGER PRIMARY KEY AUTOINCREMENT,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(60) UNIQUE NOT NULL,
    city VARCHAR(30),
    donor_type VARCHAR(15) NOT NULL,
    CHECK (donor_type IN ('Individual', 'Corporate'))
);


CREATE TABLE Campaign (
        campaign_id INTEGER PRIMARY KEY AUTOINCREMENT,
    title VARCHAR(80) NOT NULL,
    goal_amount DECIMAL(12,2) NOT NULL
        CHECK (goal_amount > 0),
    start_date DATE NOT NULL,
    status VARCHAR(15) DEFAULT 'Active'
);


CREATE TABLE Donation (
    donation_id INTEGER PRIMARY KEY AUTOINCREMENT,
    donor_id INT NOT NULL,
    campaign_id INT NOT NULL,
    amount DECIMAL(10,2) NOT NULL
            CHECK (amount > 0),
    donation_date DATE NOT NULL,
    payment_mode VARCHAR(15) DEFAULT 'UPI',

    FOREIGN KEY (donor_id)
        REFERENCES Donor(donor_id),

    FOREIGN KEY (campaign_id)
        REFERENCES Campaign(campaign_id)
);
CREATE TABLE Expense (
    expense_id INTEGER PRIMARY KEY AUTOINCREMENT,
    campaign_id INT NOT NULL,
    description VARCHAR(100),
    amount DECIMAL(10,2) NOT NULL CHECK (amount > 0),
    FOREIGN KEY (campaign_id) REFERENCES Campaign(campaign_id)
);


-- ========== DDL: ALTER, DROP ==========
ALTER TABLE Donor ADD phone VARCHAR(15);

ALTER TABLE Donor MODIFY phone VARCHAR(20);

ALTER TABLE Donor DROP COLUMN phone;

CREATE TABLE Temp (id INT);

DROP TABLE Temp;


-- ========== DML: INSERT ==========

INSERT INTO Donor (name, email, city, donor_type) VALUES
('Rahul Sharma', 'rahul@mail.com', 'Mumbai', 'Individual'),
('Priya Patil', 'priya@mail.com', 'Pune', 'Individual'),
('Tata Trust', 'csr@tata.com', 'Mumbai', 'Corporate'),
('Amit Verma', 'amit@mail.com', 'Delhi', 'Individual'),
('Anita Desai', 'anita@mail.com', 'Thane', 'Individual');


INSERT INTO Campaign (title, goal_amount, start_date, status) VALUES
('Education for All', 500000, '2026-01-15', 'Active'),
('Clean Water Drive', 300000, '2026-02-01', 'Active'),
('Flood Relief', 800000, '2026-07-01', 'Active');

-- DML: INSERT INTO Donation

INSERT INTO Donation
    (donor_id, campaign_id, amount, donation_date, payment_mode)
VALUES
    (1, 1, 5000, '2026-01-25', 'UPI'),
    (2, 1, 3000, '2026-02-10', 'Card'),
    (3, 1, 200000, '2026-02-20', 'Cheque'),
    (3, 2, 150000, '2026-03-01', 'Cheque'),
    (4, 2, 7500, '2026-03-15', 'UPI'),
    (1, 3, 10000, '2026-07-20', 'Card'),
    (3, 3, 300000, '2026-07-10', 'Cheque'),
    (2, 3, 2500, '2026-08-03', 'Cash');
-- DML: INSERT INTO Expense

INSERT INTO Expense (campaign_id, description, amount)
VALUES
    (1, 'School kits', 120000),
    (2, 'Water purifiers', 180000),
    (3, 'Food ration packs', 250000);


-- ========== DML: UPDATE, DELETE ==========

UPDATE Donor
SET city = 'Navi Mumbai'
WHERE donor_id = 1;

UPDATE Donation
SET amount = amount + 500
WHERE payment_mode = 'Cash';
DELETE FROM Expense
WHERE expense_id = 3;


-- ========== SELECT QUERIES ==========

-- 1. Selection & Projection
SELECT name, city FROM Donor;


-- 2. WHERE with relational + logical operators
SELECT *
FROM Donation
WHERE amount > 5000 AND payment_mode = 'Card';


-- 3. Arithmetic operator
SELECT description, amount, amount * 1.18 AS amount_with_tax
FROM Expense;
-- 4. ORDER BY
SELECT *
FROM Donation
ORDER BY amount DESC;

-- 5. GROUP BY + aggregate functions

SELECT campaign_id,
       COUNT(*) AS total_donations,
       SUM(amount) AS total_raised,
       AVG(amount) AS avg_donation
FROM Donation
GROUP BY campaign_id;


-- 6. JOIN

SELECT d.name, c.title, n.amount
FROM Donation n
JOIN Donor d ON n.donor_id = d.donor_id
JOIN Campaign c ON n.campaign_id = c.campaign_id;
-- 7. Nested query: donors who gave more than the average donation

SELECT name
FROM Donor
WHERE donor_id IN (
    SELECT donor_id
    FROM Donation
    WHERE amount > (
        SELECT AVG(amount)
        FROM Donation
    )
);


-- 8. Nested query: donors who never donated

SELECT name
FROM Donor
WHERE donor_id NOT IN (
    SELECT donor_id
    FROM Donation
);


-- ========== VIEW ==========

CREATE VIEW Campaign_Summary AS
SELECT c.title,
       c.goal_amount,
       IFNULL(SUM(n.amount), 0) AS raised
FROM Campaign c
LEFT JOIN Donation n
    ON c.campaign_id = n.campaign_id
GROUP BY c.campaign_id, c.title, c.goal_amount;


SELECT * FROM Campaign_Summary;


-- ========== CONSTRAINT TESTS ==========
-- Each query should FAIL; run separately and screenshot the errors.

-- 1. CHECK constraint: negative donation amount
-- INSERT INTO Donation (donor_id, campaign_id, amount, donation_date)
-- VALUES (1, 1, -500, '2026-10-01');

-- 2. UNIQUE constraint: duplicate email
-- INSERT INTO Donor (name, email, donor_type)
-- VALUES ('X', 'rahul@mail.com', 'Individual');

-- 3. FOREIGN KEY constraint: nonexistent donor_id
-- INSERT INTO Donation (donor_id, campaign_id, amount, donation_date)
-- VALUES (99, 1, 500, '2026-10-01');

-- 4. NOT NULL constraint: missing donor name
-- INSERT INTO Donor (email, donor_type)
-- VALUES ('t@mail.com', 'Individual');
































Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: