|
@@ -108,11 +108,165 @@ 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;
|
|
|
+
|
|
|
|
|
|
-- -----------------------------------------------------------------
|
|
|
-- Заметки
|
|
|
|
|
|
--- Остановился на 16 главе
|
|
|
+-- Остановился на 21 главе
|
|
|
|
|
|
-- -----------------------------------------------------------------
|
|
|
-- Мусор
|