SET DATESTYLE TO SQL, MDY; 
	
DROP TABLE IF EXISTS employees;
CREATE TABLE employees(
  личный_номер integer PRIMARY KEY,
  фамилия_имя character varying(80),
  размер_комиссионных integer DEFAULT 3,
  должность character varying(80),
  дата_приема_на_работу date DEFAULT CURRENT_DATE
);

INSERT INTO employees (личный_номер, фамилия_имя, должность, дата_приема_на_работу)
VALUES
  (1, 'Калинин Платон', 'директор', '02/14/2020'),
  (2, 'Ковалёв Василий', 'закупщик', '02/22/2020'),
  (3, 'Семёнова Алиса', 'закупщик', '02/22/2020'),
  (4, 'Андрианов Георгий', 'консультант', '03/5/2020'),
  (5, 'Ефимова Арина', 'старший продавец', '07/16/2021'),
  (6, 'Воробьёва Анна', 'старший продавец', '1/05/2021'),
  (7, 'Волков Евгений', 'старший продавец', '11/03/2020'),
  (8, 'Новиков Владимир', 'старший продавец', '2/06/2020'),
  (9, 'Антипова Варвара', 'младший продавец', '12/09/2021'),
  (10, 'Попов Семён', 'младший продавец', '12/12/2020'),
  (11, 'Плотников Арсений', 'младший продавец', '02/11/2021'),
  (12, 'Фёдорова Агния', 'младший продавец', '02/19/2021'),
  (13, 'Муравьёв Роман', 'младший продавец', '10/3/2021'),
  (14, 'Попова Диана', 'младший продавец', '11/14/2021'),
  (15, 'Марков Матвей', 'младший продавец', '10/18/2021'),
  (16, 'Казанцев Игорь', 'младший продавец', '1/3/2021'),
  (17, 'Архипов Георгий', 'младший продавец', '12/22/2021'),
  (18, 'Кольцова Дарья', 'младший продавец', '6/10/2021'),
  (19, 'Субботин Никита', 'младший продавец', '05/16/2021'),
  (20, 'Малышев Леонид', 'младший продавец', '11/20/2021');
 SELECT * FROM employees;


-- ЛР1
DROP TABLE IF EXISTS books;
CREATE TABLE books (
  book_code serial PRIMARY KEY,
  автор character varying(80),
  имя character varying(160),
  издатель character varying(80),
  цена money,
  остаток smallint
);
INSERT INTO books (автор, имя, издатель, цена, остаток)
VALUES 
  ('Михаил Булгаков', 'Мастер и Маргарита', 'Эксмо — АСТ', 10, '1'),
  ('Лев Толстой', 'Война и Мир', 'Эксмо — АСТ', 11, '10'),
  ('Данил Зыков', 'Как написать книгу за 8 секунд', 'ДЗ', 1, '1'),
  ('Влад Стетхем', 'Как быть успешным', 'ДЗ', 1, '1'),
  ('Федор Достоевский', 'Преступление и наказание', 'Эксмо — АСТ', 12, '2'),
  ('Николай Гоголь', 'Вечера на хуторе близ Диканьки', 'Эксмо — АСТ', 13, '9'),
  ('Александр Солженицын', 'Архипелаг ГУЛАГ', 'ИП Просвещение', 14, '3'),
  ('Лев Толстой', 'Анна Каренина', 'ИП Просвещение', 15, '8'),
  ('Михаил Шолохов', 'Тихий Дон', 'ИП Просвещение', 9, '4'),
  ('Борис Пастернак', 'Доктор Живаго', 'Азбука – Аттикус', 8, '7'),
  ('Михаил Лермонтов', 'Герой нашего времени', 'Азбука – Аттикус', 7, '5'),
  ('Александр Пушкин', 'Евгений Онегин', 'Фламинго', 6, '6'),
  ('Александр Дюма', 'Граф Монте-Кристо', 'Азбука – Аттикус ', 9, '11'),
  ('Стефан Цвейг', 'Нетерпение сердца', 'Эксмо — АСТ', 12, '22'),
  ('Теодор Драйзер', 'Американская трагедия', 'Эксмо — АСТ', 11, '12'),
  ('Иван Тургенев', 'Отцы и Дети', 'У-Фактория', 10, '19'),
  ('Лев Толстой', 'Война и мир', 'Эксмо — АСТ', 11, '11'),
  ('Александр Пушкин', 'Пиковая дама ', 'Качели', 10, '18'),
  ('Фёдор Достоевский', 'Белые ночи', 'Эксмо — АСТ', 12, '14'),
  ('Фёдор Достоевский', 'Записки из мёртвого дома', 'Эксмо — АСТ', 12, '14');
 SELECT * FROM books;

DROP TABLE IF EXISTS suppliers;
CREATE TABLE suppliers (
  supplier_code serial PRIMARY KEY,
  имя character varying(40) UNIQUE NOT NULL,
  город character varying(40),
  адрес character varying(80),
  телефон character(13) DEFAULT '000 111-11-11',
  информация character varying(40)
);
INSERT INTO suppliers (имя, город, адрес, телефон, информация)
VALUES
  ('ОптНск', 'Новосибирск', 'Сибирская 42, оф. 25', '950 590-34-12', 'NULL'),
  ('ОптБел', 'Белово', 'Подсобная 33, оф. 3', '999 648-78-52', 'информация'),
  ('Книжная поставка', 'Новосибирск', 'Ленина 5, оф. 3', '999 666-11-00', 'информация'),
  ('Пост', 'Новосибирск', 'Ядринцевская 18, оф. 202', '913 913-13-13', 'информация'),
  ('Бук', 'Омск', 'Ленина 3, оф. 42', '953 911-34-56', 'информация'),
  ('Топ', 'Новосибирск', 'Шевченко 12, оф. 34', '987 654-32-10', 'информация'),
  ('Северо-Восток', 'Томск', 'Красный пр. 44, оф. 4', '961 714-40-04', 'информация'),
  ('Централ', 'Новосибирск', 'Красный пр. 26, оф. 11', '912 384-10-01', 'информация'),
  ('Юг', 'Барнаул', 'Эмилии Алексеевой 6, оф. 322', '961 642-24-54', 'NULL'),
  ('Нск', 'Новосибирск', 'Дуси Ковальчук 250, оф. 200', '912 123-58-99', 'информация'),
  ('ПрессФ', 'Новосибирск', 'Серебрениковская 42, оф. 1', '911 745-01-10', 'информация'),
  ('ТуПэй', 'Новосибирск', 'Спортивная 32, оф. 88', '951 363-54-18', 'информация'),
  ('Респект', 'Новосибирск', 'Тюменская 6, оф. 11', '951 034-01-23', 'информация'),
  ('Сибирь', 'Новосибирск', 'Богдана Хмельницкого 23, оф. 1', '998 012-22-33', 'информация'),
  ('Авангард', 'Омск', 'Центральная 5, оф. 11', '912 333-12-21', 'информация'),
  ('Металлург', 'Новокузнецк', 'Дзержинская 1, оф. 101', '911 020-30-40', 'информация'),
  ('Новая Сибирь', 'Новосибирск', 'Немировича-Данченко 160, оф. 18', '974 111-93-33', 'информация'),
  ('Советская Сибирь', 'Новосибирск', 'Серафимовича 27, оф. 1', '800 55-35-35', 'информация'),
  ('Российский Мяу', 'Грозный', 'Ахмат 1, оф.2', '656 252-11-25', 'информация'),
  ('Томь', 'Томск', 'Новый переулок 1, оф. 10', '984 001-11-10', 'информация');
SELECT * FROM suppliers;

DROP TABLE IF EXISTS customers;
CREATE TABLE customers (
  customer_code serial PRIMARY KEY,
  имя character varying(40),
  город character varying(40),
  адрес character varying(80),
  телефон character(13) DEFAULT '000 111-11-11'
);
INSERT INTO customers (имя, город, адрес, телефон)
VALUES
  ('Черепанов Георгий Андреевич', 'Новосибирск', 'Красный проспект 1, кв. 1', '999 111-00-01'),
  ('Митрофанов Илья Ярославович', 'Новосибирск', 'Красный проспект 2, кв. 2', '999 111-00-02'),
  ('Кузьмин Даниил Максимович', 'Новосибирск', 'Красный проспект 3, кв. 3', '999 111-00-03'),
  ('Кузьмина Варвара Сергеевна', 'Новосибирск', 'Красный проспект 4, кв. 4', '999 111-00-04'),
  ('Дементьева Евгения Константиновна', 'Новосибирск', 'Красный проспект 5, кв. 5', '999 111-00-05'),
  ('Бычкова Валерия Матвеевна', 'Новосибирск', 'Красный проспект 6, кв. 6', '999 111-00-06'),
  ('Иванова Арина Андреевна', 'Новосибирск', 'Красный проспект 7, кв. 7', '999 111-00-07'),
  ('Кузьмин Андрей Павлович', 'Новосибирск', 'Красный проспект 8, кв. 8', '999 111-00-08'),
  ('Романов Фёдор Даниилович', 'Новосибирск', 'Красный проспект 9, кв. 9', '999 111-00-09'),
  ('Баранова Александра Максимовна', 'Новосибирск', 'Красный проспект 10, кв. 10', '999 111-00-10'),
  ('Федотов Даниил Фёдорович', 'Новосибирск', 'Красный проспект 11, кв. 11', '999 111-00-11'),
  ('Григорьев Егор Михайлович', 'Новосибирск', 'Красный проспект 12, кв. 12', '999 111-00-12'),
  ('Дмитриев Тихон Дмитриевич', 'Новосибирск', 'Красный проспект 13, кв. 13', '999 111-00-13'),
  ('Королева Маргарита Тиграновна', 'Новосибирск', 'Красный проспект 14, кв. 14', '999 111-00-14'),
  ('Воробьева Алиса Алексеевна', 'Бердск', 'Красный проспект 15, кв. 15', '999 111-00-15'),
  ('Кочетков Александр Денисович', 'Бердск', 'Красный проспект 16, кв. 16', '999 111-00-16'),
  ('Панфилов Денис Тимофеевич', 'Бердск', 'Красный проспект 17, кв. 17', '999 111-00-17'),
  ('Чеботарев Александр Лукич', 'Бердск', 'Красный проспект 18, кв. 18', '999 111-00-18'),
  ('Васильева Полина Демидовна', 'Бердск', 'Красный проспект 19, кв. 19', '999 111-00-19'),
  ('Воронов Павел Тимурович', 'Бердск', 'Красный проспект 20, кв. 20', '999 111-00-20');
SELECT * FROM customers;

-- 3-2. В таблицу Заказы внесите следующие изменения: а) добавьте
-- столбец Оформил_заказ с ограничениями NOT NULL и внешнего
-- ключа со ссылкой на столбец Личный_номер таблицы
-- Сотрудники; б) добавьте столбец Количество с с ограничением
-- NOT NULL и значением по умолчанию  1.
DROP TABLE IF EXISTS orders;
CREATE TABLE orders (
  order_code serial CONSTRAINT order_pk PRIMARY KEY,
  book_code integer REFERENCES books(book_code),
  order_quantity integer NOT NULL DEFAULT 1,
  customer_code integer REFERENCES customers(customer_code),
  order_summ money,
  order_prepayment_amount money,  
  order_paid character varying(3) CHECK(order_paid = 'Yes' OR order_paid = 'No') NOT NULL,
  order_date date DEFAULT (NOW() at time zone 'ALMST') NOT NULL,
  order_made_by integer REFERENCES employees(личный_номер) NOT NULL
);
INSERT INTO orders (book_code, customer_code, order_summ, order_prepayment_amount, order_paid, order_date, order_made_by)
VALUES
(10, 10, 10, 9, 'Yes', '01/10/2022', 4),
(20, 10, 10, 2, 'Yes', '02/11/2022', 5),
('2', '11', '11', 3, 'Yes', '03/10/2022', 6),
('19', '8', '10', 4, 'Yes', '04/11/2022', 7),
('3', '12', '12', 5, 'Yes', '01/10/2022', 8),
('18', '7', '10', 6, 'Yes', '02/11/2022', 9),
('4', '13', '13', 7, 'No', '03/10/2022', 10),
('17', '6', '10', 8, 'Yes', '01/11/2022', 4),
('5', '14', '14', 9, 'Yes', '02/10/2022', 5),
('16', '5', '10', 10, 'Yes', '01/11/2022', 6),
('6', '15', '15', 10, 'No', '03/10/2022', 7),
('15', '4', '10', 9, 'Yes', '01/11/2022', 8),
('15', '4', '10', 9, 'Yes', '01/11/2022', 9),
('7', '16', '9', 8, 'No', '04/10/2022', 4),
('14', '4', '10', 7, 'Yes', '01/11/2022', 5),
('8', '17', '8', 6, 'Yes', '01/10/2022', 6),
('13', '2', '10', 5, 'Yes', '03/11/2022', 7),
('9', '18', '7', 4, 'Yes', '01/10/2022', 4),
('12', '20', '10', 3, 'No', '01/11/2022', 4),
('11', '19', '10', 2, 'No', '01/10/2022', 5),
('10', '1', '6', 1, 'Yes', '02/11/2022', 6),
('10', '1', '6', 1, 'Yes', '02/11/2022', 5),
('10', '1', '6', 1, 'Yes', '02/11/2022', 4),
('10', '1', '6', 1, 'Yes', '02/11/2022', 11);
 SELECT * FROM orders;

DROP TABLE IF EXISTS supplies;
CREATE TABLE supplies (
  supply_number serial PRIMARY KEY,
  book_code integer REFERENCES books(book_code),
  supplier_code integer REFERENCES suppliers(supplier_code),
  supply_quantity integer,
  supply_date date
);
INSERT INTO supplies (book_code, supplier_code, supply_quantity, supply_date)
VALUES
('6', '4', '8', '01/09/2022'),
('7', '3', '4', '01/09/2022'),
('8', '2', '7', '01/09/2022'),
('9', '1', '5', '01/09/2022'),
('10', '10', '6', '02/09/2022'),
('1', '9', '1', '01/09/2022'),
('2', '8', '10', '02/09/2022'),
('3', '7', '2', '01/09/2022'),
('4', '6', '9', '01/09/2022'),
('5', '5', '3', '01/09/2022'),
('16', '20', '18', '03/09/2022'),
('17', '20', '14', '03/09/2022'),
('18', '20', '17', '03/09/2022'),
('19', '20', '15', '03/09/2022'),
('11', '20', '11', '03/09/2022'),
('12', '20', '20', '03/09/2022'),
('13', '20', '12', '03/09/2022'),
('14', '20', '19', '03/09/2022'),
('15', '20', '13', '03/09/2022'),
('20', '20', '16', '03/09/2022');
 SELECT * FROM supplies;

-- -- -- ЛАБОРАТОНАЯ РАБОТА №2
-- -- 1. Напишите запрос для вывода названия, автора и цену книг из таблицы Книги
 SELECT имя, автор, цена FROM books;

-- -- 2. Напишите запрос для вывода всех уникальных имен авторов книг 
-- -- в текущем порядке из таблицы Книги.
 SELECT DISTINCT автор FROM books;

-- -- 3. Напишите запрос для вывода всех заказов из таблицы Заказы 
-- -- со значениями суммы предоплаты выше 5$.
 SELECT * FROM orders WHERE order_prepayment_amount >= '5';

-- -- 4. Напишите запрос для вывода всех заказов из таблицы Заказы, для 
-- -- которых сумма предоплаты составляет не менее 30% от стоимости книги
 SELECT * FROM orders WHERE order_prepayment_amount >= order_summ*0.3;


-- -- 5. Напишите запрос к таблице Заказы для вывода всех оплаченных 
-- -- заказов, соответствующих заказчику с кодом "10".
 SELECT * FROM orders WHERE order_paid = 'Yes' AND customer_code = 10 ;

-- -- 6. Напишите запрос для вывода всех строк из таблицы Заказчики,
-- -- относящихся к заказчикам, проживающим в г.Бердске
 SELECT * FROM customers WHERE город = 'Бердск';

-- -- 7. Напишите запрос для вывода кодов всех книг, их цен и кодов
-- -- поставщиков для книг, поставленных из Москвы.
 SELECT books.book_code, цена, supplier_code FROM supplies, books 
 WHERE books.book_code = supplies.book_code;

-- -- 8. Что может быть выведено в результате следующего запроса ?
 SELECT * FROM books WHERE (цена < '10' OR NOT (автор IS NULL AND остаток > 50));
-- -- Будут выведены все позицииЮ поскольку условие 'autor IS NULL' всегда будет ложным

-- -- 9. Как можно иначе переписать запрос:
 SELECT * FROM orders where (order_date > '02/10/22' or order_date < '03/10/22');
-- -- переписать можно так:   SELECT * FROM orders;

-- -- 10. Напишите запрос для выборки всех заказчиков, чьи имена
-- -- начинаются с буквы, попадающей в диапазон от A до М.
 SELECT * FROM customers WHERE имя LIKE 'В%';
 SELECT * FROM customers WHERE LEFT(имя, 1) BETWEEN 'А' AND 'М';

-- -- 11. Напишите запрос для выборки всех книг, в названии которых есть
-- -- слово "и" или "and"
 SELECT * FROM books WHERE имя LIKE '% и %' OR имя LIKE '% and %';

-- -- 12. Напишите запрос для вывода всех поставщиков, данные о которых
-- -- содержат NULL-значения.
 SELECT * FROM suppliers WHERE информация = 'NULL';

-- -- 13. Напишите запрос для подсчета суммы всех заказов на 3 октября
-- -- 2022 года
 SELECT * FROM orders WHERE orders.order_date = '2022-03-10';
-- -- 
 SELECT SUM(books.цена) FROM books, orders 
 WHERE books.book_code=orders.book_code
 AND orders.order_date='2022-03-10';


-- -- 14. Напишите запрос для подсчета числа различных не NULL-значений
-- -- полей Адрес и Телефон в таблице Поставщики.
 SELECT COUNT(адрес) as has_адрес FROM suppliers WHERE адрес IS NOT NULL;
 SELECT COUNT(телефон) as has_телефон FROM suppliers WHERE телефон IS NOT NULL;


-- -- 15. Напишите запрос для выборки наименьшей суммы предоплаты для 
 -- каждого заказчика.
 SELECT имя, MIN(order_prepayment_amount) FROM orders, customers 
 WHERE orders.customer_code = customers.customer_code
 GROUP BY имя;

-- -- 16. Напишите запрос для выборки заказчиков в алфавитном порядке,
 -- чьи имена начинаются с буквы К.
 SELECT имя 
 FROM Customers 
 WHERE имя like 'К%' 
 ORDER BY имя;

-- -- 17. Напишите запрос для подсчета общей суммы заказов за каждый
-- -- день с 02.10.22 по 04.10.22
 SELECT summ, date1 FROM orders WHERE orders.date1 
 BETWEEN '2022-02-10' AND '2022-04-10';
-- -- 
 SELECT SUM(books.цена) FROM books, orders 
 WHERE books.book_code=orders.book_code
 AND orders.date1 BETWEEN '2022-02-10' AND '2022-04-10';


-- -- 18. Напишите запрос к таблице Заказы для определения средней
-- -- суммы предоплаты за каждый месяц. 
 ALTER TABLE orders ALTER COLUMN prepayment_amount TYPE numeric(5,2);
-- --
 SELECT prepayment_amount, date1 FROM orders WHERE orders.date1 
 BETWEEN '01/01/2022' AND '01/31/2022';
 \echo '\nJanuary average: '
 SELECT Round(AVG(prepayment_amount), 2) FROM orders 
 WHERE orders.date1 BETWEEN '01/01/2022' AND '01/31/2022';
-- --
 SELECT prepayment_amount, date1 FROM orders WHERE orders.date1 
 BETWEEN '02/01/2022' AND '02/28/2022';
 \echo '\nFebruary average: '
 SELECT Round(AVG(prepayment_amount), 2) FROM orders 
 WHERE orders.date1 BETWEEN '02/01/2022' AND '02/28/2022';
-- --
 SELECT prepayment_amount, date1 FROM orders WHERE orders.date1 
 BETWEEN '03/01/2022' AND '03/31/2022';
 \echo '\nMarch average: '
 SELECT Round(AVG(prepayment_amount), 2) FROM orders 
 WHERE orders.date1 BETWEEN '03/01/2022' AND '03/31/2022';
-- --
 SELECT prepayment_amount, date1 FROM orders WHERE orders.date1 
 BETWEEN '04/01/2022' AND '04/30/2022';
 \echo '\nApril average: '
 SELECT Round(AVG(prepayment_amount), 2) FROM orders  
 WHERE orders.date1 BETWEEN '04/01/2022' AND '04/30/2022';
-- --
 ALTER TABLE orders ALTER COLUMN prepayment_amount TYPE money;


-- -- 19. Напишите запрос для вывода общей стоимости оплаченных заказов
 -- на каждый день в нисходящем порядке.
 SELECT SUM(summ), date1 FROM orders 
 GROUP BY date1 ORDER BY SUM DESC;


-- -- 20. Напишите запрос для формирования рейтинга издательств в виде
-- -- упорядоченного по убыванию списка издательств и количества их книг,
-- -- поставленных за некоторый период.
 SELECT имя, SUM(quantity) FROM suppliers, supplies
 WHERE supplies.supplier_code = suppliers.supplier_code
 GROUP BY имя ORDER BY SUM DESC;


-- -- 21. Напишите запрос, который бы выводил все заказы с величиной
-- -- предоплаты выше средней. Выведите код заказа, дату, имя
-- -- заказчика и величину предоплаты.
 ALTER TABLE orders ALTER COLUMN prepayment_amount TYPE numeric(5,2);
-- --
 SELECT prepayment_amount, date1 FROM orders;
 \echo '\nAverage prepayment_amount: '
 SELECT Round(AVG(prepayment_amount), 2) FROM orders;
-- --
 SELECT order_code, prepayment_amount FROM orders WHERE
 prepayment_amount > (SELECT AVG(prepayment_amount) FROM orders);
-- --
 ALTER TABLE orders ALTER COLUMN prepayment_amount TYPE money;


-- -- 22. Напишите запрос, который вычислил бы суммарные остатки
-- -- количества книг, поставленных каждым поставщиком. Выведите
 -- код поставщика, количество видов книг и суммарный остаток.
 SELECT supplier_code, COUNT(имя) AS kinds_of_books, 
 SUM(remains) AS remain_of_books
 FROM books, supplies
 WHERE supplies.book_code = books.book_code
 GROUP BY supplier_code
 ORDER BY remain_of_books DESC;


-- -- 23. Напишите запрос, который бы вывел все заказы, сделанные за
-- -- первый квартал 2022 года заказчиками из г. Бердска, и подсчитал
-- -- количество оплаченных и неоплаченных заказов.
 SELECT order_code, paid, date1, customers.city FROM orders, customers
 WHERE date1 BETWEEN '01/01/2022' AND '03/31/2022'
 AND customers.city = 'Бердск'
 AND orders.customer_code = customers.customer_code;
-- --
 SELECT paid, COUNT(paid) FROM orders, customers
 WHERE date1 BETWEEN '01/01/2022' AND '03/31/2022'
 AND customers.city = 'Бердск'
 AND orders.customer_code = customers.customer_code
 GROUP BY paid;


-- --24. Напишите запрос, который вывел бы имена всех заказчиков,
-- -- проживающих в том же городе, что и заказчик, имеющий на данный
-- -- момент времени максимальную сумму всех оплаченных заказов.
 SELECT имя, city FROM customers WHERE customers.city = (
   SELECT city FROM orders, customers WHERE paid='Yes' 
   AND prepayment_amount = 
     (SELECT MAX(prepayment_amount)
     FROM orders, customers WHERE paid='Yes' 
     AND orders.customer_code = customers.customer_code)
 AND orders.customer_code = customers.customer_code);


-- -- 25. Напишите запрос для получения списка книг, цены которых
-- -- превысят 10$ в случае повышения цен на 12%.
 SELECT имя, цена, цена*1.12 as цена_plus_12_percent FROM books;
-- --
 SELECT имя, цена*1.12 as цена_plus_12_percent FROM books
 WHERE цена*1.12 > '10';


-- -- 26. Напишите запрос, который бы выбрал общую сумму всех
-- -- приобретений для каждого заказчика, у которого эта общая сумма
-- -- больше средней по всем заказчикам
 ALTER TABLE orders ALTER COLUMN summ TYPE numeric(5,2);
-- -- 
 SELECT имя, SUM(summ), COUNT(summ) FROM orders, customers 
 WHERE orders.customer_code = customers.customer_code
 GROUP BY имя;
-- -- 
 SELECT ROUND(AVG(summ), 2) FROM orders, customers 
 WHERE orders.customer_code = customers.customer_code;
-- -- 
 SELECT имя, sum, count FROM
   (SELECT имя, SUM(summ), COUNT(summ) FROM orders, customers 
   WHERE orders.customer_code = customers.customer_code
   GROUP BY имя) 
 as aaa WHERE sum > 
   (SELECT ROUND(AVG(summ), 2) FROM orders, customers 
   WHERE orders.customer_code = customers.customer_code);
-- -- 
 ALTER TABLE orders ALTER COLUMN summ TYPE money;


-- -- 27. Напишите запрос с использованием коррелированного подзапроса
-- -- для выборки имен и кодов всех заказчиков, у которых наибольшая
-- -- общая стоимость приобретенных книг среди заказчиков,
-- -- проживающих в данном городе.
 SELECT имя, orders.customer_code, SUM(summ), COUNT(summ), city 
 FROM orders, customers 
 WHERE orders.customer_code = customers.customer_code
 GROUP BY имя, city, orders.customer_code;
-- --
 SELECT MAX(sum), city FROM
   (SELECT имя, orders.customer_code, SUM(summ), COUNT(summ), city 
   FROM orders, customers 
   WHERE orders.customer_code = customers.customer_code
   GROUP BY имя, city, orders.customer_code)
 as ab GROUP BY city;
-- -- Нужно добавить в вывод имя и customer_code
-- -- ДОДЕЛАТЬ!!!


-- -- 28. Напишите два запроса которые выберут всех заказчиков (по их
-- -- имени и коду), для которых есть поставщики приобретенных ими
-- -- книг, проживающие в тех же городах, что и заказчики. Один запрос 
-- -- – с использованием естественного соединения, а другой – с
-- -- коррелированным подзапросом. 
 SELECT DISTINCT имя, customers.customer_code, customers.city
 FROM customers, orders
 WHERE (city = ANY (SELECT city FROM suppliers))
 AND (book_code = ANY (SELECT book_code FROM supplies));


-- -- 29. Напишите запрос для выборки данных о книгах, которые в
-- -- данный момент заказаны по крайней мере одним заказчиком, а также тех
-- -- книг, которые к данному моменту времени ни разу не были заказаны.
 SELECT * FROM books
 WHERE book_code = ANY(SELECT book_code FROM orders);
-- --
 SELECT * FROM books
 WHERE NOT (book_code = ANY(SELECT book_code FROM orders));


-- -- 30. Напишите запрос, использующий ANY или ALL, который бы
-- -- находил всех заказчиков, которые не оплатили ни одного заказа.
 SELECT customer_code, имя FROM customers
 WHERE customer_code = ANY (SELECT customer_code FROM orders WHERE paid='No');


-- -- 31. Создайте объединение из двух запросов, которое вывело бы коды и
-- -- имена всех заказчиков. Те из них, для которых суммы
-- -- приобретенных книг выше средней, должны, кроме того, иметь
-- -- комментарий "Высокий Рейтинг", а остальные – "Низкий Рейтинг".
 ALTER TABLE orders ALTER COLUMN prepayment_amount TYPE numeric(5,2);
-- -- 
 SELECT ROUND(AVG(prepayment_amount), 2) as average FROM orders;
-- -- 
 SELECT DISTINCT customers.customer_code, имя, prepayment_amount, 'High rate' as comment
 FROM customers, orders
 GROUP BY customers.customer_code, prepayment_amount, orders.customer_code
 HAVING (SUM(prepayment_amount) > (SELECT AVG(prepayment_amount) FROM orders))
   AND (customers.customer_code = orders.customer_code)
 union
 SELECT DISTINCT customers.customer_code, имя, prepayment_amount, 'Low rate' as comment
 FROM customers, orders
 GROUP BY customers.customer_code, prepayment_amount, orders.customer_code
 HAVING (SUM(prepayment_amount) <= (SELECT AVG(prepayment_amount) FROM orders))
   AND (customers.customer_code = orders.customer_code);
-- --
 ALTER TABLE orders ALTER COLUMN prepayment_amount TYPE money;

-- Лр 3

-- -- 3-3.  Создайте копию таблицы Поставки, упорядочив все строки в
-- -- новой таблице по полям Код_книги и Код_поставщика. 
 CREATE TABLE supplies_copy AS SELECT * FROM supplies;
-- --
 SELECT * FROM supplies_copy ORDER BY book_code, supplier_code;


-- 3-4. Измените таблицу Сотрудники так, чтобы размер комиссионных по
-- -- умолчанию был равен 5% и для этого поля не допускались NULL значения. 
-- --
 ALTER TABLE employees ALTER COLUMN размер_комиссионных SET DEFAULT 5;
 ALTER TABLE employees ALTER COLUMN размер_комиссионных SET NOT NULL;
-- --
 INSERT INTO employees (личный_номер, фамилия_имя, должность, дата_приема_на_работу)
 VALUES
   (21, 'Ермолаева Владислава', 'младший продавец', '12/21/2021'),
   (22, 'Петухова Милана', 'младший продавец', '12/22/2021');
 SELECT * FROM employees;


-- 3-5. В таблице Заказы в состав первичного ключа дополнительно
-- -- введите поле Код_книги (Указание: для этого следует удалить
-- -- имеющийся в таблице первичный ключ)
-- --
 ALTER TABLE orders DROP CONSTRAINT order_pk;
 ALTER TABLE orders ADD PRIMARY KEY (order_code, book_code);
-- --
 \d orders;


-- -- 3-6. Создайте уникальный кластерный индекс для таблицы Книги.
-- -- Обоснуйте выбор полей для индексирования. 
 CREATE UNIQUE INDEX ui ON books (book_code, book_имя, book_цена, book_remains);
 CLUSTER VERBOSE books USING ui;
-- -- "Код книги", "имя", "цена" и "остаток" - поля для индексирования.
-- -- "Автор" и "издательство" - отброшены.
-- -- Первые 4 - основные, последними 2 можно принебречь


-- 3-7. Создайте представление для вывода трех заказчиков, имеющих
-- -- наибольшее количество заказов.
-- --
-- -- Вывод всех заказчиков
 SELECT customer_имя, COUNT(order_summ) as number_of_orders
 FROM orders, customers 
 WHERE orders.customer_code = customers.customer_code
 GROUP BY customer_имя
 ORDER BY number_of_orders DESC;
-- --
-- -- Создание представления 3-х лучших заказчиков
 CREATE VIEW top_3_customers AS
   SELECT customer_имя, COUNT(order_summ) as number_of_orders
   FROM orders, customers 
   WHERE orders.customer_code = customers.customer_code
   GROUP BY customer_имя
   ORDER BY number_of_orders DESC
   LIMIT 3;
-- --
-- -- Вывод созданного представления
 SELECT * FROM top_3_customers;


-- -- 3-8. Создайте представление для вывода количества оформленных
-- -- каждым сотрудником заказов и общей стоимости этих заказов.
-- --
 CREATE VIEW employee_orders AS
   SELECT фамилия_имя, COUNT(order_summ), SUM(order_summ) FROM orders, employees
   WHERE orders.order_made_by = employees.личный_номер
   GROUP BY фамилия_имя
   ORDER BY count DESC;
-- --
 SELECT * FROM employee_orders;


-- -- 3-9. Создайте представление, которое выводило бы данные о поставках,
-- -- упорядоченные по наименованию издательства и количеству книг.
 CREATE VIEW supplies_main_info AS
   SELECT supply_number, supplier_имя, supply_quantity FROM suppliers, supplies
   WHERE suppliers.supplier_code = supplies.supplier_code
  ORDER BY supply_number, supplier_имя, supply_quantity DESC;
-- --
 SELECT * FROM supplies_main_info;




-- -- 3-10. Создайте представление, которое выводило бы информацию о
-- -- неоплаченных заказах. 
-- --
 CREATE VIEW unpaid_orders as
   SELECT * FROM orders WHERE order_paid='No';
-- --
 SELECT * FROM unpaid_orders;


-- -- 3-11. Напишите инструкцию, результатом выполнения которой была бы
-- -- вставка нескольких строк в таблицу Сотрудники, созданную ранее.
 INSERT INTO employees (личный_номер, фамилия_имя, должность, дата_приема_на_работу)
 VALUES
   (21, 'Иванов Иван', 'младший продавец', '12/21/2021'),
   (22, 'Петров Петр', 'младший продавец', '12/22/2021');
-- --
 SELECT * FROM employees;


-- -- 3-12. Напишите инструкцию, результатом выполнения которой было бы
-- -- удаление всех неоплаченных на текущую дату заказов из таблицы
-- -- Заказы.
-- --
 SELECT * FROM orders;
-- --
 DELETE FROM orders WHERE order_paid='No';
-- --
 SELECT * FROM orders;


-- -- 3-13. Напишите инструкцию, результатом выполнения которой было бы
-- -- увеличение комиссионных трех сотрудников, имеющих наибольшее
-- -- количество оформленных заказов.
-- --
-- -- Получим список всех сотрудников, количество и сумму заказов каждого
 SELECT фамилия_имя, COUNT(order_summ), SUM(order_summ) FROM orders, employees
 WHERE orders.order_made_by = employees.личный_номер
 GROUP BY фамилия_имя
 ORDER BY count DESC;
-- --
-- -- Из предыдущей таблицы оставим только 3-х лучших
 SELECT фамилия_имя, COUNT(order_summ), SUM(order_summ) FROM orders, employees
 WHERE orders.order_made_by = employees.личный_номер
 GROUP BY фамилия_имя
 ORDER BY count DESC
 LIMIT 3;
-- --
-- -- А теперь оставим только имена 3-х лучших
 CREATE VIEW best_employees as 
 SELECT фамилия_имя FROM
   (SELECT фамилия_имя, COUNT(order_summ), SUM(order_summ) FROM orders, employees
   WHERE orders.order_made_by = employees.личный_номер
   GROUP BY фамилия_имя
   ORDER BY count DESC
   LIMIT 3) as aaa;
 SELECT * FROM best_employees;  
-- --
-- -- Увеличим размер комиссионных для 3-х лучших сотрудников
 UPDATE employees SET размер_комиссионных = 7
 WHERE (фамилия_имя = ANY (SELECT * FROM best_employees));
-- --
-- -- Выведем всех сотрудников для проверки правильности совершенных действий
SELECT * FROM employees ORDER BY личный_номер;


-- -- 3-14. Создайте таблицу такой же структуры, что и таблица Сотрудники,
-- -- и напишите инструкцию для вставки в нее данных обо всех
-- -- сотрудниках из таблицы Сотрудники, оформивших более трех
-- -- заказов и имеющих стаж не менее 10 месяцев.
-- --
 CREATE TABLE employees_2 AS
  SELECT employees.*
   FROM employees, orders
   WHERE orders.order_made_by = employees.личный_номер
   AND employees.дата_приема_на_работу < (now()-interval '10 months')
   GROUP BY employees.личный_номер
   HAVING COUNT(employees.*) > 3;
-- --
 SELECT * FROM employees_2;


-- -- 3-15. Напишите инструкцию, результатом выполнения которой было бы
-- -- удаление из таблицы Заказчики тех заказчиков, которые сделали
-- -- последний заказ более 8 месяцев тому назад. Удалите соответствующие
-- -- заказы из таблицы Заказы.
-- --
-- -- Выведем все заказы 
 SELECT * FROM orders ORDER BY customer_code;
-- --
-- -- Создадим временную таблицу с кодами покупателей, которые ничего
-- -- не покупали за последние 9 месяцев
 CREATE TEMPORARY TABLE table_2 AS 
   (SELECT customers.customer_code
   FROM customers, orders
   WHERE customers.customer_code = orders.customer_code
  GROUP BY customers.customer_code
  HAVING MAX(orders.order_date) < (now()-interval '9 months') );
-- --
-- -- Выведем эту таблицу
 SELECT * FROM table_2 ORDER BY customer_code;
-- --
-- -- Удаляем старые заказы из таблицы "Заказы"
 DELETE FROM orders WHERE customer_code IN (SELECT customer_code FROM table_2);
 DROP TABLE IF EXISTS table_2;
-- --
-- -- Выведем все оставшиеся заказы
 SELECT * FROM orders ORDER BY customer_code;


-- -- 3-16. В таблицу Заказы добавьте столбец Номер_договора типа uuid,
-- -- сделайте Номер_договора первичным ключом, предварительно
-- -- удалив созданный ранее первичный ключ. 
-- --
 SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE 'now()');
-- --
 ALTER TABLE orders ADD COLUMN order_number uuid 
   DEFAULT gen_random_uuid();
-- --
 SELECT * FROM orders;
-- --
 ALTER TABLE orders DROP CONSTRAINT order_pk;
-- --
 ALTER TABLE orders ADD CONSTRAINT order_pk 
   PRIMARY KEY (order_number);


-- -- -- 3-17. Создайте представление таблицы Сотрудники, включив в него
-- -- -- только поля личный_номер и размер_комиссионных. С
-- -- -- помощью этого представления увеличьте на 10% размер
-- -- -- комиссионных для продавца, имеющего максимальное число
-- -- -- принятых заказов.
-- --
-- -- Получим список всех сотрудников, количество и сумму заказов каждого
 SELECT личный_номер, размер_комиссионных, COUNT(order_summ), SUM(order_summ) FROM orders, employees
 WHERE orders.order_made_by = employees.личный_номер
 GROUP BY личный_номер
 ORDER BY count DESC;
-- --
-- -- Из предыдущей таблицы оставим только 1 лучшего
 SELECT личный_номер, размер_комиссионных, COUNT(order_summ), SUM(order_summ) FROM orders, employees
 WHERE orders.order_made_by = employees.личный_номер
 GROUP BY личный_номер
 ORDER BY count DESC
 LIMIT 1;
-- --
-- -- А теперь оставим только личный номер и размер комиссионных 1-го лучшего
 CREATE VIEW best_employees as 
 SELECT личный_номер, размер_комиссионных FROM
   (SELECT личный_номер, размер_комиссионных, COUNT(order_summ), SUM(order_summ) FROM orders, employees
  WHERE orders.order_made_by = employees.личный_номер
   GROUP BY личный_номер
   ORDER BY count DESC
  LIMIT 1) as aaa;
 SELECT * FROM best_employees;  
-- --
-- -- Увеличим размер комиссионных для 1 лучшего сотрудника
 UPDATE employees SET размер_комиссионных = 10
 WHERE (личный_номер = ANY (SELECT личный_номер FROM best_employees));
-- --
-- -- Выведем всех сотрудников для проверки правильности совершенных действий
SELECT * FROM employees ORDER BY личный_номер;
-- Директор: отчет по продажам
CREATE VIEW director_sales_report AS
  SELECT books.book_имя, COUNT(orders.*) AS amount
  FROM books, orders
  WHERE books.book_code = orders.book_code
  GROUP BY books.book_code
  ORDER BY amount DESC, book_имя;
SELECT * FROM director_sales_report;


-- Директор: отчет по продавцам
CREATE VIEW director_employees_report AS
  SELECT employees.фамилия_имя, COUNT(orders.*) AS amount, 
    SUM(books.book_цена) as цена
  FROM employees, orders, books  
  WHERE orders.order_made_by=employees.личный_номер
    AND orders.book_code = books.book_code
  GROUP BY employees.фамилия_имя
  ORDER BY цена DESC, amount DESC;
SELECT * FROM director_employees_report;


-- Директор: отчет по поставщкам
CREATE VIEW director_suppliers_report AS
  SELECT suppliers.supplier_имя, SUM(supplies.supply_quantity) as quantity,
    supplies.supply_date, books.book_цена as цена
  FROM suppliers, supplies, books
  WHERE suppliers.supplier_code = supplies.supplier_code
  AND supplies.book_code=books.book_code
  GROUP BY supplier_имя, supply_date, цена
  ORDER BY quantity DESC;
SELECT * FROM director_suppliers_report;   


-- Закупщик: отчет по поставщкам
CREATE VIEW buyer_suppliers_report AS
  SELECT suppliers.supplier_имя, SUM(supplies.supply_quantity) as quantity,
    supplies.supply_date, books.book_цена as цена
  FROM suppliers, supplies, books
  WHERE suppliers.supplier_code = supplies.supplier_code
  AND supplies.book_code=books.book_code
  GROUP BY supplier_имя, supply_date, цена
  ORDER BY quantity DESC;
SELECT * FROM buyer_suppliers_report;


-- Закупщик: отчет по книгам
CREATE VIEW buyer_books_report AS
  SELECT book_имя, SUM(book_remains) AS remain_of_books
  FROM books, supplies
  WHERE supplies.book_code = books.book_code
  GROUP BY book_имя
  ORDER BY remain_of_books DESC;
SELECT * FROM buyer_books_report;


-- Продавец: отчет по книгам
CREATE VIEW employee_books_report AS
  SELECT book_имя, SUM(book_remains) AS remain_of_books
  FROM books, supplies
  WHERE supplies.book_code = books.book_code
  GROUP BY book_имя
  ORDER BY remain_of_books DESC;
 SELECT * FROM employee_books_report;


-- Продавец: отчет по продажам
CREATE VIEW employee_sales_report AS
  SELECT фамилия_имя, COUNT(order_summ), SUM(order_summ) FROM orders, employees
  WHERE orders.order_made_by = employees.личный_номер
  AND orders.order_date = '01/10/2022'
  GROUP BY фамилия_имя
  ORDER BY count DESC;
SELECT * FROM employee_sales_report;


CREATE ROLE director LOGIN PASSWORD 'director';
GRANT SELECT ON director_sales_report TO director;
GRANT SELECT ON director_employees_report TO director;
GRANT SELECT ON books TO director;
GRANT SELECT ON orders TO director;
GRANT SELECT ON employees TO director;

CREATE ROLE buyer LOGIN PASSWORD 'buyer';
GRANT SELECT, INSERT ON buyer_suppliers_report TO buyer;
GRANT SELECT ON buyer_books_report TO buyer;
GRANT SELECT ON books TO buyer;
GRANT SELECT ON supplies TO buyer;
GRANT SELECT ON suppliers TO buyer;

CREATE ROLE employee LOGIN PASSWORD 'employee';
GRANT SELECT, INSERT ON employee_books_report TO employee;
GRANT SELECT ON employee_sales_report TO employee;
GRANT SELECT ON books TO employee;
GRANT SELECT ON orders TO employee;
GRANT SELECT ON employees TO employee;

-- 1.1 Создайте таблицу User_SP для хранения списка хранимых процедур
-- в БД BookShop. Таблица должна содержать следующие поля:
--  Имя SP
--  Владелец
--  Описание
--  Входные параметры
--  Выходные параметры
--  Другие результаты
--  Вызывается из (список вызывающих SP)
--  Вызывает (список вызываемых SP)
--  История обновлений (с момента создания):
--
DROP TABLE IF EXISTS User_SP;
CREATE TABLE User_SP(
  name_SP character varying(80),
  owner character varying(80),
  description character varying(80),
  input integer,
  output integer,
  other_results integer,
  called_from character varying(80),
  calles character varying(80),
  update_history character varying(80)
);
--
 SELECT * FROM User_SP;


-- -- 1.2 Создайте SP, предназаначенный для вставки в таблицу User_SP
-- --
 CREATE OR REPLACE FUNCTION insert_User_SP(
   name_SP character varying(80),
   owner character varying(80),
   description character varying(80),
   input integer,
   output integer,
   other_results integer,
   called_from character varying(80),
   calles character varying(80),
   update_history character varying(80)
 )
 RETURNS character varying AS $$
 INSERT INTO User_SP(name_SP, owner, description, input, output,
   other_results, called_from, calles, update_history)
 VALUES($1, $2, $3, $4, $5, $6, $7, $8, $9) RETURNING $1 $$
 LANGUAGE sql VOLATILE;
-- --
 SELECT insert_User_SP(
   '1'::character varying,
   '2'::character varying,
   '3'::character varying,
   4::integer,
   5::integer,
   6::integer,
   '7'::character varying,
   '8'::character varying,
   '9'::character varying
 );
-- --
 SELECT insert_User_SP(
   '11'::character varying,
   '22'::character varying,
   '33'::character varying,
   44::integer,
   55::integer,
   66::integer,
   '77'::character varying,
   '88'::character varying,
   '99'::character varying
 );
-- --
 SELECT * FROM User_SP;


-- -- 1.3 Создайте SP, предназаначенный для удаления из таблицы User_SP
-- --
 CREATE OR REPLACE FUNCTION clear_User_SP(
   OUT name_SP character varying(80),
   OUT owner character varying(80),
   OUT description character varying(80),
   OUT input integer,
   OUT output integer,
   OUT other_results integer,
   OUT called_from character varying(80),
   OUT calles character varying(80),
   OUT update_history character varying(80)
 )
 RETURNS SETOF RECORD
 AS $$
 DELETE FROM User_SP WHERE name_SP = '1' RETURNING *; $$
 LANGUAGE sql VOLATILE;
-- --
 SELECT * FROM clear_User_SP();


-- -- 1.4 Создайте SP, предназаначенный для модификации таблицы User_SP
 CREATE OR REPLACE FUNCTION alter_User_SP(
   name_SP character varying(80),
   owner character varying(80),
   description character varying(80),
   input integer,
   output integer,
   other_results integer,
   called_from character varying(80),
   calles character varying(80),
   update_history character varying(80)
 )
 RETURNS SETOF RECORD AS $$
 UPDATE ALTER TABLE User_SP ADD COLUMN order_number uuid 
   DEFAULT gen_random_uuid() RETURNING * $$
 LANGUAGE sql VOLATILE;
-- -- ДОДЕЛАТЬ !!!


-- -- 2 Создайте SP, предназаначенный для генерации в БД BookShop 
-- -- Отчета по продажам: показывает тенденции изменения спроса за
-- -- последние 6 месяцев для книг, объем продаж которых за указанный
-- -- период изменился более, чем на 100%.
-- --
 CREATE VIEW aaa AS
   SELECT book_code, COUNT(order_date) as half1
   FROM orders 
   WHERE (order_date BETWEEN '01/01/22' AND '06/30/22')
   GROUP BY book_code
   ORDER BY book_code;
-- --
 CREATE VIEW bbb AS
   SELECT book_code, COUNT(order_date) as half2
   FROM orders 
   WHERE (order_date BETWEEN '07/01/22' AND '12/31/22')
   GROUP BY book_code
   ORDER BY book_code;
 --
 CREATE VIEW ccc AS
   SELECT aaa.book_code, half1, half2
   FROM aaa, bbb
   WHERE aaa.book_code = bbb.book_code;
-- --
 SELECT * FROM ccc;
-- --
 CREATE OR REPLACE FUNCTION sales_report()
 RETURNS TABLE(book_code character varying, 
   half1 integer, half2 integer) AS $$
   SELECT * FROM ccc
   WHERE half1*2 < half2
 $$ LANGUAGE sql;
-- --
 SELECT * FROM sales_report()


-- 3.1 Создайте триггер для Книг INSERT/UPDATE, FOR EACH ROW

CREATE FUNCTION book_trigger() RETURNS trigger AS $book_trigger$
  BEGIN
    IF NEW.автор IS NULL THEN 
      RAISE EXCEPTION 'author cannot be NULL';
    END IF;
  END;
$book_trigger$ LANGUAGE plpgsql;
--
CREATE TRIGGER book_trigger BEFORE INSERT OR UPDATE ON books
  FOR EACH ROW EXECUTE FUNCTION book_trigger();
--
INSERT INTO books (автор, имя, издатель, цена, остаток)
VALUES (NULL, 'Мастер и Маргарита', 'Эксмо — АСТ', 10, '1');


-- -- 3.2 Создайте триггер для Заказов INSERT/UPDATE, FOR EACH ROW
-- --
 CREATE FUNCTION order_trigger() RETURNS trigger AS $order_trigger$
   BEGIN
     IF NEW.order_quantity < 1 THEN
       RAISE EXCEPTION 'quantity of books cannot be less than 1';
     END IF;
   END;
 $order_trigger$ LANGUAGE plpgsql;
-- --
 CREATE TRIGGER order_trigger BEFORE INSERT OR UPDATE ON orders
   FOR EACH ROW EXECUTE FUNCTION order_trigger();
-- --
 INSERT INTO orders 
 (book_code, customer_code, order_quantity, order_summ, 
 order_prepayment_amount, order_paid, order_date, order_made_by)
 VALUES (10, 10, -2, 10, 9, 'Yes', '01/10/2022', 4);


-- -- 3.3 Создайте триггер для Заказчиков INSERT/UPDATE, FOR EACH STATEMENT
-- --
 CREATE FUNCTION customers_trigger() RETURNS TRIGGER as $customers_trigger$
   BEGIN
     IF NEW.адрес IS NULL THEN
       RAISE EXCEPTION 'address cannot be NULL';
     END IF;
   END;
 $customers_trigger$ LANGUAGE plpgsql;
-- --
 CREATE TRIGGER customers_trigger BEFORE INSERT OR UPDATE ON customers 
   FOR EACH ROW EXECUTE FUNCTION customers_trigger();
-- --
 INSERT INTO customers (имя, город, адрес, телефон)
 VALUES
   ('Черепанов Георгий Андреевич', 'Новосибирск', NULL, '999 111-00-01');






 

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;