CREATE TABLE Store (
    store_no SERIAL PRIMARY KEY,
    store_name VARCHAR(100),
    phone_no VARCHAR(20),
    email VARCHAR(100),
    fax_no VARCHAR(20),
    street_no VARCHAR(20),
    suburb VARCHAR(50),
    state VARCHAR(50),
    postcode VARCHAR(10),
    manager_emp_no INT
);

CREATE TABLE Department (
    dept_no SERIAL PRIMARY KEY,
    dept_title VARCHAR(100),
    phone_no VARCHAR(20),
    email VARCHAR(100),
    store_no INT,
    supervisor_emp_no INT
);

CREATE TABLE Employee (
    emp_no SERIAL PRIMARY KEY,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    address VARCHAR(100),
    mobile_no VARCHAR(20),
    email VARCHAR(100),
    TFN VARCHAR(20),
    salary_type VARCHAR(10),
    salary DECIMAL(10, 2),
    hourly_rate DECIMAL(10, 2),
    joining_date DATE,
    dept_no INT
);

CREATE TABLE Payslip (
    payslip_no SERIAL PRIMARY KEY,
    hours_worked INT,
    emp_no INT,
    store_no INT,
    gross_pay DECIMAL(10, 2)
);

CREATE TABLE Product (
    prod_no SERIAL PRIMARY KEY,
    prod_name VARCHAR(100),
    brand VARCHAR(50),
    description TEXT,
    price DECIMAL(10, 2)
);

CREATE TABLE Supplier (
    supplier_id SERIAL PRIMARY KEY,
    supplier_name VARCHAR(100),
    supplier_phone VARCHAR(20),
    supplier_email VARCHAR(100)
);

CREATE TABLE Supply (
    supplier_id INT,
    prod_no INT,
    supply_price DECIMAL(10, 2),
    PRIMARY KEY (supplier_id, prod_no)
);

CREATE TABLE Inventory (
    store_no INT,
    prod_no INT,
    quantity_available INT,
    quantity_ordered INT,
    PRIMARY KEY (store_no, prod_no)
);

CREATE TABLE Customer (
    cust_no SERIAL PRIMARY KEY,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    mobile_no VARCHAR(20),
    address VARCHAR(100)
);

CREATE TABLE Orders (
    order_no SERIAL PRIMARY KEY,
    order_date DATE,
    cust_no INT,
    store_no INT
);

CREATE TABLE Order_Details (
    order_no INT,
    prod_no INT,
    quantity INT,
    PRIMARY KEY (order_no, prod_no)
);


ALTER TABLE Department
ADD CONSTRAINT fk_store_no FOREIGN KEY (store_no) REFERENCES Store(store_no),
ADD CONSTRAINT fk_supervisor_emp_no FOREIGN KEY (supervisor_emp_no) REFERENCES Employee(emp_no);

ALTER TABLE Employee
ADD CONSTRAINT fk_dept_no FOREIGN KEY (dept_no) REFERENCES Department(dept_no);

ALTER TABLE Payslip
ADD CONSTRAINT fk_emp_no FOREIGN KEY (emp_no) REFERENCES Employee(emp_no),
ADD CONSTRAINT fk_store_no FOREIGN KEY (store_no) REFERENCES Store(store_no);

ALTER TABLE Supply
ADD CONSTRAINT fk_supplier_id FOREIGN KEY (supplier_id) REFERENCES Supplier(supplier_id),
ADD CONSTRAINT fk_prod_no FOREIGN KEY (prod_no) REFERENCES Product(prod_no);

ALTER TABLE Inventory
ADD CONSTRAINT fk_store_no FOREIGN KEY (store_no) REFERENCES Store(store_no),
ADD CONSTRAINT fk_prod_no FOREIGN KEY (prod_no) REFERENCES Product(prod_no);

ALTER TABLE Orders
ADD CONSTRAINT fk_cust_no FOREIGN KEY (cust_no) REFERENCES Customer(cust_no),
ADD CONSTRAINT fk_store_no FOREIGN KEY (store_no) REFERENCES Store(store_no);

ALTER TABLE Order_Details
ADD CONSTRAINT fk_order_no FOREIGN KEY (order_no) REFERENCES Order(order_no),
ADD CONSTRAINT fk_prod_no FOREIGN KEY (prod_no) REFERENCES Product(prod_no);


-- Insert sample data into Store table
INSERT INTO Store (store_name, phone_no, email, fax_no, street_no, suburb, state, postcode, manager_emp_no)
VALUES 
('Central Store', '1234567890', '[email protected]', '123-4567', '10', 'Central City', 'Central State', '12345', 1),
('North Store', '2345678901', '[email protected]', '234-5678', '20', 'North City', 'North State', '23456', 2),
('East Store', '3456789012', '[email protected]', '345-6789', '30', 'East City', 'East State', '34567', 3),
('South Store', '4567890123', '[email protected]', '456-7890', '40', 'South City', 'South State', '45678', 4),
('West Store', '5678901234', '[email protected]', '567-8901', '50', 'West City', 'West State', '56789', 5);

-- Insert sample data into Department table
INSERT INTO Department (dept_title, phone_no, email, store_no, supervisor_emp_no)
VALUES 
('Electronics', '1234567890', '[email protected]', 1, 6),
('Clothing', '2345678901', '[email protected]', 2, 7),
('Grocery', '3456789012', '[email protected]', 3, 8),
('Toys', '4567890123', '[email protected]', 4, 9),
('Furniture', '5678901234', '[email protected]', 5, 10);

-- Insert sample data into Employee table
INSERT INTO Employee (first_name, last_name, address, mobile_no, email, TFN, salary_type, salary, hourly_rate, joining_date, dept_no)
VALUES 
('John', 'Doe', '123 Main St', '1234567890', '[email protected]', '123-456-789', 'Full-time', 50000, NULL, '2020-01-01', 1),
('Jane', 'Smith', '456 Elm St', '2345678901', '[email protected]', '234-567-890', 'Part-time', NULL, 20, '2021-02-01', 2),
('Jim', 'Brown', '789 Oak St', '3456789012', '[email protected]', '345-678-901', 'Full-time', 55000, NULL, '2019-03-01', 3),
('Jake', 'White', '321 Pine St', '4567890123', '[email protected]', '456-789-012', 'Part-time', NULL, 25, '2022-04-01', 4),
('Jill', 'Black', '654 Cedar St', '5678901234', '[email protected]', '567-890-123', 'Full-time', 60000, NULL, '2020-05-01', 5);

-- Insert sample data into Payslip table
INSERT INTO Payslip (hours_worked, emp_no, store_no, gross_pay)
VALUES 
(160, 1, 1, 4000),
(80, 2, 2, 1600),
(160, 3, 3, 4400),
(80, 4, 4, 2000),
(160, 5, 5, 4800);

-- Insert sample data into Product table
INSERT INTO Product (prod_name, brand, description, price)
VALUES 
('Laptop', 'Dell', '15-inch laptop', 1000),
('Shirt', 'Nike', 'Cotton shirt', 50),
('Apple', 'Local Farm', 'Fresh apple', 2),
('Toy Car', 'Hot Wheels', 'Miniature car', 10),
('Sofa', 'Ikea', 'Comfortable sofa', 500);

-- Insert sample data into Supplier table
INSERT INTO Supplier (supplier_name, supplier_phone, supplier_email)
VALUES 
('Tech Supplies', '1234567890', '[email protected]'),
('Clothing Co', '2345678901', '[email protected]'),
('Fresh Farm', '3456789012', '[email protected]'),
('Toy Distributors', '4567890123', '[email protected]'),
('Furniture World', '5678901234', '[email protected]');

-- Insert sample data into Supply table
INSERT INTO Supply (supplier_id, prod_no, supply_price)
VALUES 
(1, 1, 900),
(2, 2, 40),
(3, 3, 1),
(4, 4, 8),
(5, 5, 450);

-- Insert sample data into Inventory table
INSERT INTO Inventory (store_no, prod_no, quantity_available, quantity_ordered)
VALUES 
(1, 1, 50, 10),
(2, 2, 100, 20),
(3, 3, 200, 30),
(4, 4, 150, 25),
(5, 5, 30, 5);

-- Insert sample data into Customer table
INSERT INTO Customer (first_name, last_name, mobile_no, address)
VALUES 
('Alice', 'Green', '1234567890', '123 Apple St'),
('Bob', 'Blue', '2345678901', '456 Berry St'),
('Charlie', 'Red', '3456789012', '789 Cherry St'),
('Diana', 'Yellow', '4567890123', '321 Date St'),
('Eve', 'Purple', '5678901234', '654 Fig St');

-- Insert sample data into Order table
INSERT INTO Orders (order_date, cust_no, store_no)
VALUES 
('2023-01-01', 1, 1),
('2023-02-01', 2, 2),
('2023-03-01', 3, 3),
('2023-04-01', 4, 4),
('2023-05-01', 5, 5);

-- Insert sample data into Order_Details table
INSERT INTO Order_Details (order_no, prod_no, quantity)
VALUES 
(1, 1, 1),
(2, 2, 2),
(3, 3, 3),
(4, 4, 4),
(5, 5, 5);

-- Query 1: 

SELECT (first_name || ' ' || last_name) AS "Customer full name", phone_no, address
FROM Customer
ORDER BY cust_no DESC;

-- Query 2:

SELECT * FROM Product
WHERE price < 100;

-- Query 3:

SELECT od.prod_no, p.prod_name, od.quantity, p.price AS unit_price, (od.quantity * p.price) AS total_amount
FROM Order_Details od
JOIN Product p ON od.prod_no = p.prod_no
WHERE od.order_no = 1005;

-- Query 4:

SELECT store_name, (street_no || ' ' || suburb || ' ' || state || ' ' || postcode) AS full_address, fax_no
FROM Store
WHERE LOWER(street_no) LIKE '%george%';

-- Query 5:

SELECT order_no
FROM Order_Details
GROUP BY order_no
HAVING COUNT(DISTINCT prod_no) >= 2;

-- Query 6:

SELECT c.cust_no, (c.first_name || ' ' || c.last_name) AS name, c.address
FROM Customer c
LEFT JOIN Order o ON c.cust_no = o.cust_no
WHERE o.order_no IS NULL;

-- Query 7:

SELECT e.first_name, e.last_name, e.emp_no, d.dept_title, s.store_name
FROM Employee e
JOIN Department d ON e.dept_no = d.dept_no
JOIN Store s ON d.store_no = s.store_no;

-- Query 8:

SELECT s.store_name, COUNT(e.emp_no) AS num_employees
FROM Store s
JOIN Department d ON s.store_no = d.store_no
JOIN Employee e ON d.dept_no = e.dept_no
WHERE d.dept_title = 'Account'
GROUP BY s.store_name;

-- Query 9:

SELECT *
FROM Orders
WHERE order_date > '2017-06-30' AND order_date < '2018-07-01';

-- Query 10:

SELECT cust_no, COUNT(order_no) AS total_orders
FROM Orders
GROUP BY cust_no;

-- Query 11:

SELECT o.order_no, o.order_date, COUNT(od.prod_no) AS num_products
FROM Orders o
JOIN Order_Details od ON o.order_no = od.order_no
GROUP BY o.order_no, o.order_date
ORDER BY o.order_no DESC;
 
by

PostgreSQL online editor

Write, Run & Share PostgreSQL queries online using OneCompiler's PostgreSQL online editor and compiler for free. It's one of the robust, feature-rich online editor and compiler for PostgreSQL. Getting started with the OneCompiler's PostgreSQL editor is really simple and pretty fast. The editor shows sample boilerplate code when you choose database as 'PostgreSQL' and start writing queries to learn and test online without worrying about tedious process of installation.

About PostgreSQL

PostgreSQL is a open source relational database system and is also knows as Postgres.

Key Features:

  • Postgres is not only free and open-source but also it is highly extensible.
  • Custom Data types and funtions from various programming languaues can be introduced and the good part is compiling entire database is not required.
  • ACID(Atomicity, Consistency, Isolation, Durability) compliant.
  • First DBMS which implemented Multi-version concurrency control (MVCC) feature.
  • It's the default database server for MacOS.
  • It supports all major operating systems like Linux, Windows, OpenBSD,FreeBSD etc.

Syntax help

1. CREATE

CREATE command is used to create a table, schema or an index.

Syntax:

         CREATE TABLE table_name (
                column1 datatype,
                column2 datatype,
                ....);

2. ALTER

ALTER command is used to add, modify or delete columns or constraints from the database table.

Syntax

ALTER TABLE Table_name ADD column_name datatype;

3. TRUNCATE:

TRUNCATE command is used to delete the data present in the table but this will not delete the table.

Syntax

TRUNCATE table table_name;

4. DROP

DROP command is used to delete the table along with its data.

Syntax

DROP TABLE table_name;

5. RENAME

RENAME command is used to rename the table name.

Syntax

ALTER TABLE table_name1 RENAME to new_table_name1; 

6. INSERT

INSERT Statement is used to insert new records into the database table.

Syntax

INSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...);

7. SELECT

Select statement is used to select data from database tables.

Syntax:

SELECT column1, column2, ...
FROM table_name; 

8. UPDATE

UPDATE statement is used to modify the existing values of records present in the database table.

Syntax

UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition; 

9. DELETE

DELETE statement is used to delete the existing records present in the database table.

Syntax

DELETE FROM table_name where condition;