Commit 398cd873 by Patryk Czarnik

Rozszerzona wersja skryptów SQL

parent 9f432933
-- numery 1-10 zostawiam na przykładowe produkty, a dopiero od 11 będzie automatyczna numeracja
CREATE SEQUENCE products_seq START 11;
CREATE TABLE products (
product_id SERIAL PRIMARY KEY,
product_id INTEGER DEFAULT nextval('products_seq'),
product_name VARCHAR(100) NOT NULL, -- tekst o dł maksymalnie 100 znaków
price NUMERIC(10, 2) NOT NULL, -- max 10 cyfr, z czego 2 to cyfry po przecinku
vat NUMERIC(2, 2), -- wartości do 0.99
description TEXT -- w PostgreSQL TEXT, a w Oracle CLOB to są "duże fragmenty tekstu"
description TEXT, -- w PostgreSQL TEXT, a w Oracle CLOB to są "duże fragmenty tekstu"
PRIMARY KEY(product_id),
CHECK(price > 0),
CHECK(vat >= 0)
);
-- W celach dydaktycznych: kluczem nie musi być liczba, może być tekst
CREATE TABLE customers (
customer_email VARCHAR(100) PRIMARY KEY,
customer_email VARCHAR(100),
customer_name VARCHAR(100) NOT NULL,
phone_number VARCHAR(20),
address VARCHAR(200),
postal_code CHAR(6),
city VARCHAR(100)
city VARCHAR(100),
PRIMARY KEY(customer_email)
);
CREATE TYPE order_status AS
ENUM('NEW', 'CONFIRMED', 'SHIPPED', 'CLOSED', 'RETURNED');
CREATE SEQUENCE orders_seq START 101;
-- REFERENCES oznacza "klucz obcy", za pomocą tej wartości wskazujemy klienta, który złożył zamówienie
-- technicznie: do pola orders.customer_email można wpisać tylko taką wartość, która wystepuje gdzieś w customers.customer_email
CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
customer_email VARCHAR(100) NOT NULL REFERENCES customers(customer_email),
status VARCHAR(10) NOT NULL,
order_date TIMESTAMP NOT NULL,
delivery_date DATE
order_id INTEGER DEFAULT nextval('orders_seq'),
customer_email VARCHAR(100) NOT NULL,
status order_status DEFAULT 'NEW' NOT NULL,
order_date TIMESTAMP DEFAULT current_timestamp NOT NULL,
delivery_date DATE,
PRIMARY KEY(order_id),
FOREIGN KEY(customer_email) REFERENCES customers(customer_email)
);
-- Tabela łączy zamówienia z produktami.
-- Jeśli w tej tabeli istnieje wpis z order_id=X i product_id=Y,
-- to znaczy, że w zamówieniu X wystepuje produkt Y
-- Dodatkowo zaposujemy informację o liczbie sztuk i cenie, po której towar był kupowany.
-- W tej tabeli mamy też dwukolumnowy klucz główny - unikalna jest para order_id×product_id
/* Tabela łączy zamówienia z produktami..
W jednym zamówieniu mogą być różne produkty.
Ten sam produkt może występować w różnych zamówieniach.
To jest związaek "wiele do wielu".
Jeśli w tej tabeli istnieje wpis z order_id=X i product_id=Y,
to znaczy, że w zamówieniu X występuje produkt Y
Dodatkowo zaposujemy informację o liczbie sztuk i cenie, po której towar był kupowany.
W tej tabeli mamy też dwukolumnowy klucz główny, bo kombinacja order_id×product_id
musi być unikalna.
*/
CREATE TABLE order_products (
order_id INTEGER NOT NULL REFERENCES orders(order_id),
product_id INTEGER NOT NULL REFERENCES products(product_id),
quantity SMALLINT NOT NULL,
actual_price NUMERIC(10, 2) NOT NULL,
PRIMARY KEY(order_id, product_id)
order_id INTEGER NOT NULL,
product_id INTEGER NOT NULL,
quantity SMALLINT DEFAULT 1 NOT NULL,
actual_price NUMERIC(10, 2) NOT NULL,
PRIMARY KEY(order_id, product_id),
FOREIGN KEY(order_id) REFERENCES orders(order_id),
FOREIGN KEY(product_id) REFERENCES products(product_id),
CHECK(quantity > 0)
);
CREATE TABLE products (
product_id SERIAL PRIMARY KEY,
product_name VARCHAR(100) NOT NULL, -- tekst o dł maksymalnie 100 znaków
price NUMERIC(10, 2) NOT NULL, -- max 10 cyfr, z czego 2 to cyfry po przecinku
vat NUMERIC(2, 2), -- wartości do 0.99
description TEXT -- w PostgreSQL TEXT, a w Oracle CLOB to są "duże fragmenty tekstu"
);
-- W celach dydaktycznych: kluczem nie musi być liczba, może być tekst
CREATE TABLE customers (
customer_email VARCHAR(100) PRIMARY KEY,
customer_name VARCHAR(100) NOT NULL,
phone_number VARCHAR(20),
address VARCHAR(200),
postal_code CHAR(6),
city VARCHAR(100)
);
-- REFERENCES oznacza "klucz obcy", za pomocą tej wartości wskazujemy klienta, który złożył zamówienie
-- technicznie: do pola orders.customer_email można wpisać tylko taką wartość, która wystepuje gdzieś w customers.customer_email
CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
customer_email VARCHAR(100) NOT NULL REFERENCES customers(customer_email),
status VARCHAR(10) NOT NULL,
order_date TIMESTAMP NOT NULL,
delivery_date DATE
);
-- Tabela łączy zamówienia z produktami.
-- Jeśli w tej tabeli istnieje wpis z order_id=X i product_id=Y,
-- to znaczy, że w zamówieniu X wystepuje produkt Y
-- Dodatkowo zaposujemy informację o liczbie sztuk i cenie, po której towar był kupowany.
-- W tej tabeli mamy też dwukolumnowy klucz główny - unikalna jest para order_id×product_id
CREATE TABLE order_products (
order_id INTEGER NOT NULL REFERENCES orders(order_id),
product_id INTEGER NOT NULL REFERENCES products(product_id),
quantity SMALLINT NOT NULL,
actual_price NUMERIC(10, 2) NOT NULL,
PRIMARY KEY(order_id, product_id)
);
......@@ -2,3 +2,7 @@ DROP TABLE order_products;
DROP TABLE orders;
DROP TABLE customers;
DROP TABLE products;
DROP SEQUENCE orders_seq;
DROP SEQUENCE products_seq;
DROP TYPE order_status;
INSERT INTO products(product_name, price, vat, description)
VALUES('pralka', 2300, 0.23, 'Pralka oszczędna i szybka.');
INSERT INTO products(product_id, product_name, price, vat, description)
VALUES (1, 'pralka', 2900.00, 0.23, 'Pralka szybkoobrotowa');
INSERT INTO products(product_name, price, vat)
VALUES('odkurzacz', 333.33, 0.23);
INSERT INTO products(product_id, product_name, price, vat, description)
VALUES (2, 'odkurzacz', 800.00, 0.23, 'Odkurzacz automatyczny');
INSERT INTO products(product_id, product_name, price, vat, description)
VALUES (3, 'telewizor 55"', 3300.00, 0.23, 'Telewizor 55 cali 4K');
INSERT INTO products(product_id, product_name, price, vat, description)
VALUES (4, 'telewizor 40"', 2200.00, 0.23, 'Telewizor 40 Full HD');
INSERT INTO products(product_id, product_name, price, vat)
VALUES (5, 'myszka gejmerska', 444.00, 0.23);
INSERT INTO products(product_id, product_name, price, vat)
VALUES (6, 'myszka zwykła', 50, 0.23);
INSERT INTO products(product_id, product_name, price, vat)
VALUES (7, 'ubezpieczenie', 100.00, NULL);
INSERT INTO products(product_id, product_name, price, vat)
VALUES (8, 'usługa montażu', 1200, 0.08);
INSERT INTO customers(customer_email, phone_number, customer_name, address, postal_code, city)
VALUES ('ala@example.com', '123123123', 'Ala Kowalska', 'Jasna 14/16', '01-234', 'Warszawa');
INSERT INTO customers(customer_email, phone_number, customer_name, address, postal_code, city)
VALUES ('ola@example.com', '321321321', 'Ola Malinowska', 'Ciemna 133', '99-999', 'Pcim');
INSERT INTO orders(order_id, customer_email, order_date, status)
VALUES (1, 'ala@example.com', '2022-06-20 12:30:00', 'CONFIRMED');
INSERT INTO orders(order_id, customer_email, order_date, status)
VALUES (2, 'ola@example.com', '2022-06-18 10:00:00', 'SHIPPED');
INSERT INTO orders(order_id, customer_email)
VALUES (3, 'ala@example.com');
INSERT INTO order_products(order_id, product_id, quantity, actual_price)
VALUES (1, 1, 1, 2900.00);
INSERT INTO order_products(order_id, product_id, quantity, actual_price)
VALUES (1, 2, 3, 2400.00);
INSERT INTO order_products(order_id, product_id, quantity, actual_price)
VALUES (2, 2, 1, 800.00);
INSERT INTO order_products(order_id, product_id, quantity, actual_price)
VALUES (3, 4, 1, 2200.00);
INSERT INTO order_products(order_id, product_id, quantity, actual_price)
VALUES (3, 3, 1, 300.00);
INSERT INTO order_products(order_id, product_id, quantity, actual_price)
VALUES (3, 5, 1, 1000.00);
/*
SELECT * FROM products ORDER BY product_id;
SELECT * FROM customers
LEFT JOIN orders USING(customer_email)
LEFT JOIN order_products USING(order_id)
LEFT JOIN products USING(product_id)
ORDER BY customer_email, order_id, product_id;
*/
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment