You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

140 lines
6.6 KiB
Markdown

# Задания
## 1.
Установите postgresql на любую виртуальную машину.
## 2.
Пройдите все уроки https://www.crunchydata.com/developers/tutorials по SQL запросам. Далее следует перевод заданий.
При выполнении на локальном компьютере используйте скрипт `weather.sql` для инициализации базы данных. В `psql` выполните
```
\i scripts/weather.sql
```
## 2.1 Основы
Вы суперпользователь.
Первая команда, которую нужно знать, это как получить помощь по командам:
```
\?
```
Вы увидите страницу общей помощи по командам терминала. Результаты будут на разбиты на страницы, которые можно пролистать клавишей пробел.
Чтобы вывести список возможных SQL команд, наберите
```
\h
```
Чтобы вывести информацию о команде, добавьте её после `\h`. Например
```
\h create database
```
Выведите список всех баз данных
```
\l
```
Из командой строки `psql` даже можно выполнить команду linux. Выведите список файлов корневого каталога операционной системы
```
\! ls -la
```
### 2.1.1 Описание таблиц
Команда `\d` без параметров выведет список всех таблиц и объектов в текущей базе данных. Если добавить символ `+`, для каждой таблицы можно увидеть дополнительную информацию такую как количество занимаемого места на диске.
```
\d+ weather
```
Существует множество `\d`-команд. Наиболее часто используемые:
- `\dn` - вывод всех схем,
- `\dv` - вывод всех представлений (views),
- `\du` - вывод всех пользователей,
- `\df` - вывод всех функций,
- `\dp` - вывод привилегий доступа для таблиц и представлений.
### 2.1.2 Пейджер
По умолчанию пейджер `psql`, который разбивает вывод на страницы, включён. Вы можете отключить его установить значение параметра `pager` равным 0.
```
\pset pager 1
```
### 2.1.3 SQL запросы
Попробуйте дать базе данных простой запрос
```sql
SELECT event_type FROM weather LIMIT 20;
```
Это запрос на получение данных колонки `event_type` из таблицы `weather`. Количество результатов будет ограничено 20 записями.
### 2.1.3.1 Буфер многострочного запроса
В терминале вы также можете написать многострочный запрос. Вводите запрос как обычно, используя Enter для переноса строки. `psql` создаст так называемый буфер запроса. Запрос не будет интерпретирован, пока вы не введёте символ `;`. Чтобы сбросить буфер при ошибке ввода, используйте `\r`.
```sql
\r
SELECT DISTINCT(event_type)
FROM weather
WHERE state = 'HAWAII';
```
### 2.1.3.2 Замер времени выполнения запроса
Вы можете замерить время выполнения запроса, включив его командой `\timing`
```sql
\timing
SELECT DISTINCT(event_type) FROM weather LIMIT 40;
```
### 2.1.4 DDL, DML запросы
SQL запросы, связанные с модификацией данных таблиц называют DML (Data Modification Language) запросами. SQL запросы, связанные с модификацией базы данных называют DDL (Data Definition Language) запросами.
Попробуйте в командой строке простой DML запрос
```sql
UPDATE weather
SET magnitude = 40
WHERE episode_id = 57676;
```
Чтобы выйти из консоли введите `\q`.
## 2.2 Соединения таблиц
В реляционных базах данные разбиваются на таблицы так, чтобы избыточность хранимой информации была минимальной, запросы и долгосрочная поддержка были эффективными. Это приводит к необходимости объединять информацию из разных таблиц с помощью механизма `JOIN`.
Для этих примеров мы рассмотрим гипотетическую базу данных для приложения для человеческих ресурсов.Это приложение отслеживает отделы, сотрудников, их менеджеры и зарплаты. Перед выполнением выполните инициализацию базы данных
```
\i scripts/hr.sql
```
### 2.2.1 Внутренние соединения (inner join)
```sql
SELECT e.employee_id, e.first_name, e.last_name, d.department_name
FROM employees e
INNER JOIN departments d ON (e.department_id = d.department_id);
```
### 2.2.2 Левые внешние соединения (left outer join)
```sql
SELECT e.employee_id, e.first_name, e.last_name, d.department_name, dep.first_name || ' ' || dep.last_name AS dependent
FROM employees e
INNER JOIN departments d ON (e.department_id = d.department_id)
LEFT OUTER JOIN dependents dep ON (e.employee_id = dep.employee_id);
```
### 2.2.3 Правые внешние соединения (right outer join)
```sql
SELECT d.department_name, l.city, l.state_province, l.country_id
FROM departments d
RIGHT OUTER JOIN locations l ON (d.location_id = l.location_id);
```
### 2.2.4 Cоединения на себя (self join)
```sql
SELECT e.first_name, e.last_name, e.job_title, format('%s %s', m.first_name, m.last_name) AS manager
FROM employees e LEFT OUTER JOIN employees m ON (e.manager_id = m.employee_id);
```