|
|
|
|
# Задания
|
|
|
|
|
|
|
|
|
|
## 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);
|
|
|
|
|
```
|