```sql select * from author order by name; -- Сортировка по возрастанию select * from author order by author_id select * from author order by author_id asc; -- Сортировка по убыванию select * from author order by author_id desc; -- Сортировка по author_id в порядке убывания (с указанием порядка null) select author_id, name, description from author order by 1 nulls last; ``` ```sql -- Временная таблица для сортировка 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; ``` ~={yellow}Работа с данным, созданными в SQL-запросе=~ ```sql select * from (values ('Яблоко'), ('Апельсин'), ('Банан')); -- сортировка просто по номеру колонки select * from (values ('Яблоко'), ('Апельсин'), ('Банан')) t order by 1; -- даём колонке имя, но сортировка по номеру колонки select * from (values ('Яблоко'), ('Апельсин'), ('Банан')) t(fruit) order by 1; -- даём колонке имя, сортировка по этому имени select * from ( values ('Яблоко'), ('Апельсин'), ('Банан') ) as t (fruit) order by fruit; -- добавляем ещё одну колонку просто для примера select * from ( values ('Яблоко', 100), ('Апельсин', 200), ('Банан', 150) ) as t (fruit, price) order by fruit; ``` ~={yellow}Задания на сортировку с базой птиц=~ ```sql select * from family order by family_id desc; select * from family order by description nulls first; select * from family order by description nulls last; select family_name from family where family_name like 'Д%' order by family_name; ``` ~={yellow}Ограничение количества результатов запроса=~ ```sql -- Верунь количество книг select count(*) from book; -- Вернуть 10 записей select book_id, name, author_id from book order by name limit 10; -- Вернуть сдедующие 10 записей (параметр offset) select book_id, name, author_id from book order by name limit 10 offset 10; ``` ~={yellow}Изменение данных в базе=~ ```sql --- Изменить описание update author set description='Французский писатель, классик приключенческой литературы, один из основоположников жанра научной фантастики.' where name='Жюль Верн'; select description from author where name='Жюл ``` ```sql --- Дополнить описание update author set description=description || ' И человек хороший. Скорее всего.' where name='Лусиану Рамальо'; select description from author where name='Лусиану Рамальо'; ``` ```sql --- Удаление не будет возможно если на эту запись ссылаются другие записи delete from author where name='какой-то автор'; --- Но можно удалить запись вместе со всеми записями, которые на нее ссылются --- Для начала создадим новую схему drop schema if exists tests cascade; create schema tests create table tests.author ( author_id bigint generated always as identity primary key, name varchar(150) not null check (length(name) >= 3), description text check (length(description) >= 30) ); create table tests.book_category ( category_id int generated always as identity primary key, name varchar(150) not null check (length(name) >= 2) ); create table tests.book ( book_id bigint generated always as identity primary key, name varchar(255) not null check (length(name) >= 2), -- тут важно! Добавлен ON DELETE CASCADE author_id bigint not null references tests.author(author_id) on delete cascade, description text check (length(description) >= 20), cover varchar(255), category_id int not null references tests.book_category(category_id) ); --- При удалении автора удалятся и его книги delete from tests.author where name='Михаил Шолохов'; ``` ~={yellow}Очистка таблицы. Быстрый способ.=~ ```sql truncate table book; --- Медленный способ delete from book where true; ``` ~={yellow}Обновление записи=~ ```sql --- Создами временную таблицу create temp table books_with_isbn ( book_id bigint generated always as identity primary key, name varchar(255), isbn char(17) unique ); insert into books_with_isbn(name, isbn) values( 'Тихий Доннн', '978-5-389-16579' ); --- При возникновении конфликта isbn обновить запись и --- взять имя из новой записи insert into books_with_isbn (name, isbn) values ( 'Тихий Дон', '978-5-389-16579' ) on conflict(isbn) do update set name = excluded.name; /*do nothing*/ table books_with_isbn; ``` ~={yellow}Форматированный вывод=~ ```sql select format('Птичка: %s', species_name) as "птичка" from species order by species_name; ```