-- -----------------------------------------------------------------
-- Создание таблиц

-- Таблица авторов
create table author (
	author_id bigint generated always as identity primary key,
	name varchar(150) no null check (length(name) >= 3),
	description text check (length(description) >= 30)
);

-- Таблица категорий книг
create table book_category (
	category_id int generated always as identity primary key,
	name varchar(150) not null check (length(name) >= 2)
);

-- Таблица книг
create table book (
	book_id bigint generated always as identity primary key,
	name varchar(255) not null check (length(name) >= 2),
	author_id bigint not null references author(author_id),
	description text check (length(description) >= 30),
	cover varchar(255),
	category_id int not null references book_catefory(category_id)
);

-- -----------------------------------------------------------------
-- Создание временных таблиц и вставка данных

create temp table something (id serial, name text);

insert into something (name) values('hello');
insert into something (name) values('dratuti');

-- -----------------------------------------------------------------
-- Редактирование таблиц

alter table 

-- -----------------------------------------------------------------
-- Удаление таблиц

drop table if exists author, book_category, book;

-- -----------------------------------------------------------------
-- Вставка данных

insert into author (name, description) values (
	'Михаил Шолохов',
	'Великий русский советский писатель, журналист и киносценарист.'
), (
	'Лусиану Рамальо',
	'Автор замечательных книг по языку программирования Python'
);

-- -----------------------------------------------------------------
-- Выборка данных

-- Выбрать все данные из таблицы. Так нельзя делать в prodaction коде.
select * from author;
table author order by name desc limit 1;

select name as Имя, description as Описание from book;

-- Преобразование к верхнему регистру
select upper(name) as Имя, lower(description) as Описание from book;

-- Можно сослаться на конретную таблицу через .
-- Последовательность: база данных -> схема -> таблица
select book.name as Имя from rroom_db.public.book;

show search_path;

-- -----------------------------------------------------------------
-- Выборка данных из других источников

-- Выборка из подзапроса
select description from (
	select * from author where name="Михаил Шолохов"
);

-- Выборка из вьюшки (заранее созданный запрос)

-- Создание вьюшки
create view book_with_author as
	select book.name as book_name, author.name as author_name 
	from book join author using (autor_id);

-- Выборка из вьюшки
select * from book_with_author;

-- Выборка из функции

select num from generate_series(1, 10) num; -- от 1 до 10 включительно 

select d
	from generate_series('2023-01-01'::date,
						 '2023-01-05'::date,
						 '1 day'::interval) d; -- генерация серии дат

-- Выборка из набора значений. Где t - виртуальная таблица						 -- 
select * from (
values (1, 'Алексей'), (2, 'Петр'), (3, 'Иннокентий')
) as t(id, name);
				
-- Выборка из виртуальной таблицы только поля name
select t.name from (
values (1, 'Алексей'), (2, 'Петр'), (3, 'Иннокентий')
) as t(id, name);

-- -----------------------------------------------------------------
-- Фильтрация данных

select * from author where author_id=1;

-- AND
select * from author where name='Михаил Шолохов';
select * from author where name='Михаил Шолохов' and author_id=200;

-- OR
select * from author where name='Михаил Шолохов' or author_id=200;

-- NOT
select * from author where not author_id = 1;
select * from author where author_id != 1;
select * from author where author_id <> 1;

-- Compare
select * from author where author_id <= 2;

-- Between
select * from author where author_id between 1 and 10;

-- IN
select * from author where author_id in (1, 2, 3, 4, 5);

-- Выборка авторов у которых есть книга или книги
select * from author where author_id in (
	select author_id from book
);

select * from author where author_id in (
	select author_id from book where name='Тихий Дон'
);

-- LIKE (шаблоны)
-- % - нуль или больше символов
-- _ - ровно один символ

select * from author where name like '%Шолохов%'

-- ILIKE - поиск по шаблону, не обращает внимание на регистр символов
select * from author where name ilike '%михаил%'
select * from author where name ilike '%миХАил%'

-- ger exp (регуляные выражения)
-- ^ - начало строки
-- \w+ - любой алфивитно-цифровой символ, где + - это один или более символов
-- \W+ - любой не алфивитно-цифровой символ
-- $ - конец строки

-- найти название книги, которое состоит из двух слов
select name from book where name ~ '^\w+\W+\w+$';


-- -----------------------------------------------------------------
-- 11.19 Особое значение NULL, coalesce
-- NULL при сравнении с чем-либо дает NULL

drop table if exists author_without_checks;
table author_without_checks;
-- Создадим временную таблицу
create temp table author_without_checks (
	author_id bigint generated always as identity primary key,
	name varchar(150) not null,
	description text
);

-- и вставим запись
insert into author_without_checks (name) values (
	'какой-то автор'
);

-- проверка на NULL
select * from author_without_checks where description is null;

-- coalesce - подствит нужное значение если значение NULL
select 
	author_id,
	name,
	coalesce(description, 'не заполнено') as description
from author_without_checks;

-- обновление данных
update author_without_checks set description='привет' where author_id=1;


-- -----------------------------------------------------------------
-- 11.20 Сортировка данных

select * from author order by name;

-- по возрастанию (так происходит по умолчанию)
select * from author order by id asc;

-- по убыванию
select * from author order by id desc;

-- можно указать номер колонки для сортировки. Но это лучше не использовать.
select author_id, name, description from author order by 1;

-- можно указать куда вставлять NULL. В данном случае поместить в конц выборки.
select author_id, name, description from author order by 3 nulls last;

-- сортировка по нескольким колонкам

-- создадим временную таблицу
drop table if exists author_tmp;
table author_tmp;

create temp table author_tmp (
	author_id bigint generated always as identity primary key,
	first_name varchar(150) not null,
	last_name varchar(150) not null
);

insert into author_tmp (first_name, last_name) values
   ('Михаил', 'Шишкин'),
   ('Михаил', 'Веллер'),
   ('Михаил', 'Шолохов'),
   ('Михаил', 'Зощенко'),
   ('Михаил', 'Булгаков'),
   ('Александр', 'Беляев'),
   ('Александр', 'Пушкин'),
   ('Лусиану', 'Рамальо');

select * from author_tmp order by first_name;
select * from author_tmp order by first_name, last_name;
select * from author_tmp order by first_name, last_name desc;
select * from author_tmp order by first_name desc, last_name desc;

-- Можно сортировать и виртуальные таблицы

select * from (values ('Яблоко'), ('Апельсин'), ('Банан'));

-- сортировка просто по номеру колонки
select * from (values ('Яблоко'), ('Апельсин'), ('Банан')) t order by 1;

-- даём колонке имя, но сортировка по номеру колонки
select * from (values ('Яблоко'), ('Апельсин'), ('Банан')) t(fruit) order by 1;


-- -----------------------------------------------------------------
-- 11.21 Ограничение количества результатов запроса

-- count - возвращает количество записей в таблице
select count(*) from book;

-- выборка первых 10и записей
select book_id, name, author_id from book order by name limit 10;

-- выборка следующих 10 записей
select book_id, name, author_id from book order by name limit 10 offset 10;


-- -----------------------------------------------------------------
-- Заметки

-- Остановился на 21 главе 

-- -----------------------------------------------------------------
-- Мусор

select |/25;



