room_1.sql 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. -- -----------------------------------------------------------------
  2. -- Создание таблиц
  3. -- Таблица авторов
  4. create table author (
  5. author_id bigint generated always as identity primary key,
  6. name varchar(150) no null check (length(name) >= 3),
  7. description text check (length(description) >= 30)
  8. );
  9. -- Таблица категорий книг
  10. create table book_category (
  11. category_id int generated always as identity primary key,
  12. name varchar(150) not null check (length(name) >= 2)
  13. );
  14. -- Таблица книг
  15. create table book (
  16. book_id bigint generated always as identity primary key,
  17. name varchar(255) not null check (length(name) >= 2),
  18. author_id bigint not null references author(author_id),
  19. description text check (length(description) >= 30),
  20. cover varchar(255),
  21. category_id int not null references book_catefory(category_id)
  22. );
  23. -- -----------------------------------------------------------------
  24. -- Создание временных таблиц и вставка данных
  25. create temp table something (id serial, name text);
  26. insert into something (name) values('hello');
  27. insert into something (name) values('dratuti');
  28. -- -----------------------------------------------------------------
  29. -- Редактирование таблиц
  30. alter table
  31. -- -----------------------------------------------------------------
  32. -- Удаление таблиц
  33. drop table if exists author, book_category, book;
  34. -- -----------------------------------------------------------------
  35. -- Вставка данных
  36. insert into author (name, description) values (
  37. 'Михаил Шолохов',
  38. 'Великий русский советский писатель, журналист и киносценарист.'
  39. ), (
  40. 'Лусиану Рамальо',
  41. 'Автор замечательных книг по языку программирования Python'
  42. );
  43. -- -----------------------------------------------------------------
  44. -- Выборка данных
  45. -- Выбрать все данные из таблицы. Так нельзя делать в prodaction коде.
  46. select * from author;
  47. table author order by name desc limit 1;
  48. select name as Имя, description as Описание from book;
  49. -- Преобразование к верхнему регистру
  50. select upper(name) as Имя, lower(description) as Описание from book;
  51. -- Можно сослаться на конретную таблицу через .
  52. -- Последовательность: база данных -> схема -> таблица
  53. select book.name as Имя from rroom_db.public.book;
  54. show search_path;
  55. -- -----------------------------------------------------------------
  56. -- Выборка данных из других источников
  57. -- Выборка из подзапроса
  58. select description from (
  59. select * from author where name="Михаил Шолохов"
  60. );
  61. -- Выборка из вьюшки (заранее созданный запрос)
  62. -- Создание вьюшки
  63. create view book_with_author as
  64. select book.name as book_name, author.name as author_name
  65. from book join author using (autor_id);
  66. -- Выборка из вьюшки
  67. select * from book_with_author;
  68. -- Выборка из функции
  69. select num from generate_series(1, 10) num; -- от 1 до 10 включительно
  70. select d
  71. from generate_series('2023-01-01'::date,
  72. '2023-01-05'::date,
  73. '1 day'::interval) d; -- генерация серии дат
  74. -- Выборка из набора значений. Где t - виртуальная таблица --
  75. select * from (
  76. values (1, 'Алексей'), (2, 'Петр'), (3, 'Иннокентий')
  77. ) as t(id, name);
  78. -- Выборка из виртуальной таблицы только поля name
  79. select t.name from (
  80. values (1, 'Алексей'), (2, 'Петр'), (3, 'Иннокентий')
  81. ) as t(id, name);
  82. -- -----------------------------------------------------------------
  83. -- Фильтрация данных
  84. select * from author where author_id=1;
  85. -- AND
  86. select * from author where name='Михаил Шолохов';
  87. select * from author where name='Михаил Шолохов' and author_id=200;
  88. -- OR
  89. select * from author where name='Михаил Шолохов' or author_id=200;
  90. -- NOT
  91. select * from author where not author_id = 1;
  92. select * from author where author_id != 1;
  93. select * from author where author_id <> 1;
  94. -- Compare
  95. select * from author where author_id <= 2;
  96. -- Between
  97. select * from author where author_id between 1 and 10;
  98. -- IN
  99. select * from author where author_id in (1, 2, 3, 4, 5);
  100. -- Выборка авторов у которых есть книга или книги
  101. select * from author where author_id in (
  102. select author_id from book
  103. );
  104. select * from author where author_id in (
  105. select author_id from book where name='Тихий Дон'
  106. );
  107. -- LIKE (шаблоны)
  108. -- % - нуль или больше символов
  109. -- _ - ровно один символ
  110. select * from author where name like '%Шолохов%'
  111. -- ILIKE - поиск по шаблону, не обращает внимание на регистр символов
  112. select * from author where name ilike '%михаил%'
  113. select * from author where name ilike '%миХАил%'
  114. -- ger exp (регуляные выражения)
  115. -- ^ - начало строки
  116. -- \w+ - любой алфивитно-цифровой символ, где + - это один или более символов
  117. -- \W+ - любой не алфивитно-цифровой символ
  118. -- $ - конец строки
  119. -- найти название книги, которое состоит из двух слов
  120. select name from book where name ~ '^\w+\W+\w+$';
  121. -- -----------------------------------------------------------------
  122. -- 11.19 Особое значение NULL, coalesce
  123. -- NULL при сравнении с чем-либо дает NULL
  124. drop table if exists author_without_checks;
  125. table author_without_checks;
  126. -- Создадим временную таблицу
  127. create temp table author_without_checks (
  128. author_id bigint generated always as identity primary key,
  129. name varchar(150) not null,
  130. description text
  131. );
  132. -- и вставим запись
  133. insert into author_without_checks (name) values (
  134. 'какой-то автор'
  135. );
  136. -- проверка на NULL
  137. select * from author_without_checks where description is null;
  138. -- coalesce - подствит нужное значение если значение NULL
  139. select
  140. author_id,
  141. name,
  142. coalesce(description, 'не заполнено') as description
  143. from author_without_checks;
  144. -- обновление данных
  145. update author_without_checks set description='привет' where author_id=1;
  146. -- -----------------------------------------------------------------
  147. -- 11.20 Сортировка данных
  148. select * from author order by name;
  149. -- по возрастанию (так происходит по умолчанию)
  150. select * from author order by id asc;
  151. -- по убыванию
  152. select * from author order by id desc;
  153. -- можно указать номер колонки для сортировки. Но это лучше не использовать.
  154. select author_id, name, description from author order by 1;
  155. -- можно указать куда вставлять NULL. В данном случае поместить в конц выборки.
  156. select author_id, name, description from author order by 3 nulls last;
  157. -- сортировка по нескольким колонкам
  158. -- создадим временную таблицу
  159. drop table if exists author_tmp;
  160. table author_tmp;
  161. create temp table author_tmp (
  162. author_id bigint generated always as identity primary key,
  163. first_name varchar(150) not null,
  164. last_name varchar(150) not null
  165. );
  166. insert into author_tmp (first_name, last_name) values
  167. ('Михаил', 'Шишкин'),
  168. ('Михаил', 'Веллер'),
  169. ('Михаил', 'Шолохов'),
  170. ('Михаил', 'Зощенко'),
  171. ('Михаил', 'Булгаков'),
  172. ('Александр', 'Беляев'),
  173. ('Александр', 'Пушкин'),
  174. ('Лусиану', 'Рамальо');
  175. select * from author_tmp order by first_name;
  176. select * from author_tmp order by first_name, last_name;
  177. select * from author_tmp order by first_name, last_name desc;
  178. select * from author_tmp order by first_name desc, last_name desc;
  179. -- Можно сортировать и виртуальные таблицы
  180. select * from (values ('Яблоко'), ('Апельсин'), ('Банан'));
  181. -- сортировка просто по номеру колонки
  182. select * from (values ('Яблоко'), ('Апельсин'), ('Банан')) t order by 1;
  183. -- даём колонке имя, но сортировка по номеру колонки
  184. select * from (values ('Яблоко'), ('Апельсин'), ('Банан')) t(fruit) order by 1;
  185. -- -----------------------------------------------------------------
  186. -- 11.21 Ограничение количества результатов запроса
  187. -- count - возвращает количество записей в таблице
  188. select count(*) from book;
  189. -- выборка первых 10и записей
  190. select book_id, name, author_id from book order by name limit 10;
  191. -- выборка следующих 10 записей
  192. select book_id, name, author_id from book order by name limit 10 offset 10;
  193. -- -----------------------------------------------------------------
  194. -- Заметки
  195. -- Остановился на 21 главе
  196. -- -----------------------------------------------------------------
  197. -- Мусор
  198. select |/25;