-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTasks.sql
More file actions
337 lines (274 loc) · 9.6 KB
/
Copy pathTasks.sql
File metadata and controls
337 lines (274 loc) · 9.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
create table books
(
id serial primary key,
title varchar(30),
author varchar(30),
test integer not null,
date_added timestamp
);
-- Посмотрели, что таблица пуста:
select *
from books;
insert into books(title, author, date_added)
values ('Недоросль', 'Д. И. Фонвизин', now());
insert into books(title, author, date_added)
values ('Путешествие из Петербурга в Москву', 'А. Н. Радищев', now() - interval '24h');
alter table books
alter column author type varchar(100);
alter table books
alter column title type varchar(100);
insert into books(id, title, author, date_added)
values (3, 'Доктор Живаго', 'Б. Л. Пастернак', now() - interval '24h');
insert into books
values (4, 'Сестра моя - жизнь', 'Б. Л. Пастернак', now());
delete
from books
where id = 1;
insert into books
values (1, 'Недоросль', 'Д. И. Фонвизин', now());
truncate table books;
truncate table reviews;
drop table books;
drop table reviews;
create table books
(
id serial primary key,
title varchar(100) NOT NULL,
author varchar(100) NOT NULL,
date_added timestamp NOT NULL
);
INSERT INTO books(title, author, date_added)
VALUES ('Недоросль', 'Д. И. Фонвизин', now());
INSERT INTO books(title, author, date_added)
VALUES ('Путешествие из Петербурга в Москву', 'А. Н. Радищев', now() - interval '24h');
INSERT INTO books(title, author, date_added)
VALUES ('Доктор Живаго', 'Б. Л. Пастернак', now() - interval '24h');
INSERT INTO books(title, author, date_added)
VALUES ('Сестра моя - жизнь', 'Б. Л. Пастернак', now());
select *
from books
where id = 2;
select *
from books
limit 5;
select *
from books
offset 2;
select *
from books
offset 2 limit 5;
-- current page - 1 * количество записей на странице limit количество записей на странице
-- Найти автора книги по названию ‘Недоросль’
select *
from books
where title = 'Недоросль';
-- Найти все книги Пастернака
select *
from books
where author like '%Пастернак';
-- Вывести максимальный id в таблице
select max(id)
from books;
-- Найти все книги Радищева или Пастернака отсортированные по дате в обратном порядке
select *
from books
where author like '%Пастернак'
or author like '%Радищев'
order by date_added DESC;
-- Найти все книги Пастернака добавленные вчера
-- now() - interval '24h'
select *
from books
where author like '%Пастернак'
and date_added <= now() - interval '24h'
and date_added >= now() - interval '48h';
update books
set date_added = '2020-02-02'
where id = 2;
update books
set date_added = '2020-02-02'
where title like '%Недоросль';
select *
from books;
create table reviews
(
id serial primary key,
book_id integer REFERENCES books,
reviewer varchar(100) not null,
rating integer not null,
comment varchar(255) null
);
-- books <- reviews
-- 1:1 один к одному
-- человек - паспорт
--
-- user
-- id=1
-- pass_id=2
--
-- passport
-- id=2
-- user_id=1
--
-- 1:М один ко многим
-- user
-- id = 1
-- name
-- last_name
-- age
--
-- phones
-- id = 1
-- number = 21312312
-- user_id = 1
--
-- select * from phones where user_id = 1;
--
-- М:М
-- cinema
-- id
-- title
--
-- usr
-- id
-- fio
--
-- cinema_cast
-- id
-- usr_id
-- cinema_id
--
-- select * from cinema_cast where usr_id = 2;
insert into reviews(book_id, reviewer, rating, comment)
values (2, 'петя', 9, 'Хорошая книга');
select *
from reviews;
INSERT INTO reviews(book_id, reviewer, rating)
VALUES (1, 'Кирилл', 9);
INSERT INTO reviews(book_id, reviewer, rating, comment)
VALUES (2, 'Петя', 7, 'ок');
INSERT INTO reviews(book_id, reviewer, rating, comment)
VALUES (3, 'Иннокентий', 2, 'не понравилась');
-- Достать только те записи reviews, у которых comment != null
select *
from reviews
where comment is not null;
-- Посчитать сколько всего записей в reviews. Назвать столбец Количество отзывов
select count(*) as rewie_count
from reviews;
-- Узнать количество уникальных id книг, по которым были оставлены отзывы:
-- Оператор SELECT DISTINCT используется для возврата только различных (различных) значений
select count(distinct book_id)
from reviews;
select *
from reviews;
-- Вывести сколько review по каждой id книги;
select count(*), book_id
from reviews
group by book_id;
-- Вывести все значения по books и по reviews (объединение столбцов результатов)
select *
from books b,
reviews r
where b.id = r.book_id;
select *
from books b
join reviews r on b.id = r.book_id;
-- А через left join добъемся вывода книги, для которой нет отзывов
select *
from books b
left join reviews r on b.id = r.book_id;
delete
from books
where id = 1;
delete
from reviews
where id = 2;
alter table reviews
drop constraint reviews_book_id_fkey;
alter table reviews
add constraint reviews_book_id_fkey
foreign key (book_id)
references books (id)
on delete cascade on update no action;
delete
from books
where id = 2;
--ACID
-- A - Atomicity - атомарность
-- C - Consistency - согласованность
-- I - Isolation - изолированность
-- D - Durability - Надежность
-- Атомарность гарантирует, что каждая транзакция будет выполнена полностью или не будет выполнена совсем.
-- Не допускаются промежуточные состояния.
-- Согласованность Это свойство вытекает из предыдущего.
-- Благодаря тому, что транзакция не допускает промежуточных результатов,
-- база остается консистентной.
-- Есть такое определение транзакции: «Упорядоченное множество операций,
-- переводящих базу данных из одного согласованного состояния в другое».
-- То есть до выполнения операции и после база остается консистентной (в переводе на русский — согласованной).
-- Атомарность гарантирует, что не получится такого, что адрес с телефоном сохранились, а сам клиент — нет.
-- Это сделало бы базу неконсистентной, ведь у нас бы появились атрибуты, «висящие в воздухе», никому не принадлежащие.
-- Что, в свою очередь, приведет к ошибкам в системе.
-- Изолированность Во время выполнения транзакции параллельные транзакции не должны оказывать влияния на её результат.
-- Надежность — Если пользователь получил подтверждение от системы, что транзакция выполнена,
-- он может быть уверен, что сделанные им изменения не будут отменены из-за какого-либо сбоя.
-- Обесточилась система, произошел сбой в оборудовании? На выполненную транзакцию это не повлияет.
-- DML операции (Data Manipulation Language)
-- insert
-- update
-- select
-- delete
-- truncate
-- DDL операции (Data Definition Language)
-- create
-- drop
-- alter
create procedure myProcedure(a integer, b integer)
language sql
as
$$
insert into test(first, second)
values (a, b);
$$;
call myprocedure(1, 2);
call myprocedure(b=>3, a=>4);
create or replace function get_all_book_authors_by_title(varchar) returns setof character as
'
select author
from books
where title like $1;
'
language sql;
select *
from get_all_book_authors_by_title('Доктор Живаго');
create or replace function count_books_with_review(integer) returns integer as
'
declare
i integer;
begin
select count(*)
from reviews
into i where book_id = $1;
return i;
end;
'
language plpgsql;
select * from count_books_with_review(3);
--view представления
create view books_title_view as
select title from books;
select * from books_title_view;
create view get_all_review_with_comment as
select * from reviews where comment is not null;
select * from get_all_review_with_comment;
--cursor
create type fio as (first_name varchar, last_name varchar, middle_name varchar);
create table usr(
id serial,
role varchar,
fio fio
);
insert into usr(role, fio) values ('user', ('first', 'last', 'middle'));
select *
from usr;