# Database HW6
### Andreev Anton BSE206
## Task №1
* Показать все названия книг вместе с именами издателей.
```sql
SELECT title, pubname FROM book
```
* В какой книге наибольшее количество страниц?
```sql
SELECT title, MAX(pagesnum) as pagesnum FROM book
GROUP BY title
```
* Какие авторы написали более 5 книг?
```sql
SELECT author, COUNT(author) FROM book
GROUP BY author
HAVING COUNT(author) >= 5;
```
* В каких книгах более чем в два раза больше страниц, чем среднее количество страниц для всех книг?
```sql
SELECT title FROM book
WHERE pagesnum > 2 * (SELECT AVG(pagesnum) FROM book)
```
* Какие категории содержат подкатегории?
```sql
SELECT DISTINCT parentcat FROM category
WHERE parentcat IS NOT Null
```
* У какого автора (предположим, что имена авторов уникальны) написано максимальное количество книг?
```sql
SELECT author, COUNT(*) AS Number_of_books FROM book
GROUP BY author
ORDER BY Number_of_books DESC
LIMIT 1
```
* Какие читатели забронировали все книги (не копии), написанные "Марком Твеном"?
```sql
SELECT firstname, lastname FROM reader
JOIN borrowing b on reader.number = b.readernr
JOIN book b2 on b.isbn = b2.isbn
WHERE author = 'Марк Твен'
GROUP BY firstname, lastname
HAVING count(b.isbn) = (SELECT COUNT(*) FROM book WHERE author = 'Марк Твен')
```
* Какие книги имеют более одной копии?
```sql
SELECT isbn FROM copy
GROUP BY isbn
HAVING count(*) > 1
```
* ТОП 10 самых старых книг
```sql
SELECT * FROM book
ORDER BY pubyear
LIMIT 10
```
* Перечислите все категории в категории “Спорт” (с любым уровнем вложености).
```sql
SELECT * FROM category
WHERE parentcat = 'Спорт'
```
## Task №2
* Добавьте запись о бронировании читателем ‘Василеем Петровым’ книги с ISBN 123456 и номером копии 4.
```sql
INSERT INTO borrowing (copynumber, isbn, readernr, returndate) VALUES (4, 123456, (SELECT number FROM reader
WHERE firstname = 'Василий' and lastname = 'Петров'), (now() + interval '10 day'))
```
* Удалить все книги, год публикации которых превышает 2000 год.
```sql
DELETE FROM book
WHERE (SELECT EXTRACT (YEAR FROM pubyear)) > 2000
```
* Измените дату возврата для всех книг категории "Базы данных", начиная с 01.01.2016, чтобы они были в заимствовании на 30 дней дольше
```sql
UPDATE borrowing AS bor
SET returndate = returndate + INTERVAL '30 day'
WHERE bor.isbn in (SELECT bc.isbn FROM book_category as bc
JOIN book b on bc.isbn = b.isbn
WHERE categoryname = 'Базы данных' AND bor.returndate >= DATE('01.01.2016'))
```
## Task №3
Опишите на русском языке результаты следующих запросов:
* Student( MatrNr, Name, Semester )
* Check( MatrNr, LectNr, ProfNr, Note )
* Lecture( LectNr, Title, Credit, ProfNr )
* Professor( ProfNr, Name, Room )
1.
```sql
SELECT s.Name, s.MatrNr FROM Student s
WHERE NOT EXISTS (
SELECT * FROM Check c WHERE c.MatrNr = s.MatrNr AND c.Note >= 4.0 ) ;
```
Получить имена + номера студентов, у которых есть оценки ниже 4
2.
```sql
(SELECT p.ProfNr, p.Name, sum(lec.Credit)
FROM Professor p, Lecture lec
WHERE p.ProfNr = lec.ProfNr
GROUP BY p.ProfNr, p.Name)
UNION
(SELECT p.ProfNr, p.Name, 0
FROM Professor p
WHERE NOT EXISTS (
SELECT * FROM Lecture lec WHERE lec.ProfNr = p.ProfNr));
```
Получаем имена профессоров и сумму кредитов лекций, которые он ведет, а если не ведет ни одной лекции, то возвращаем 0
3.
```sql
SELECT s.Name, с.Note
FROM Student s, Lecture lec, Check c
WHERE s.MatrNr = c.MatrNr AND lec.LectNr = c.LectNr AND c.Note >= 4
AND c.Note >= ALL (
SELECT c1.Note FROM Check c1 WHERE c1.MatrNr = c.MatrNr )
```
Получить имена и оценки студентов, которые они получили, при условии, что оценки >= 4 и оценка >= всех остальных оценок в таблице Check