Added postgresql sql tasks.

pull/1/head
Vladimir Protsenko 2 years ago
parent 883bafe338
commit 55fb0dde38

@ -0,0 +1,127 @@
CREATE TABLE regions (
region_id INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
region_name VARCHAR(30)
);
INSERT INTO regions
(region_id, region_name)
VALUES
(1,'Europe'),
(2,'Americas'),
(3,'Asia'),
(4,'Middle East and Africa');
SELECT setval('regions_region_id_seq', 4, true);
CREATE TABLE countries (
country_id CHAR(2) PRIMARY KEY,
country_name VARCHAR(45),
region_id INTEGER NOT NULL REFERENCES regions (region_id)
);
INSERT INTO countries(country_id,country_name,region_id) VALUES
('AR','Argentina',2),
('AU','Australia',3),
('BE','Belgium',1),
('BR','Brazil',2),
('CA','Canada',2),
('CH','Switzerland',1),
('CN','China',3),
('DE','Germany',1),
('DK','Denmark',1),
('EG','Egypt',4),
('FR','France',1),
('HK','HongKong',3),
('IL','Israel',4),
('IN','India',3),
('IT','Italy',1),
('JP','Japan',3),
('KW','Kuwait',4),
('MX','Mexico',2),
('NG','Nigeria',4),
('NL','Netherlands',1),
('SG','Singapore',3),
('UK','United Kingdom',1),
('US','United States of America',2),
('ZM','Zambia',4),
('ZW','Zimbabwe',4);
CREATE TABLE locations (
location_id INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
street_address VARCHAR(45),
postal_code VARCHAR(12),
city VARCHAR (30) NOT NULL,
state_province VARCHAR (25),
country_id CHAR(2) NOT NULL REFERENCES countries (country_id)
);
INSERT INTO locations
(location_id,street_address,postal_code,city,state_province,country_id)
VALUES
(1,'9122 Rockfeller Rd','34232','Effingham','Indiana','US'),
(2,'44 Isaac Newton Ave','54898','London','London','UK'),
(3,'Deutschland 3232','79822','Munich','Bavaria','DE'),
(4,'210 W Main St','84032','Lehi','Utah','US');
SELECT setval('locations_location_id_seq', 4, true);
CREATE TABLE departments (
department_id INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
department_name VARCHAR (30) NOT NULL,
location_id INTEGER REFERENCES locations (location_id)
);
INSERT INTO departments
(department_id, department_name, location_id)
VALUES
(1,'Management', 1),
(2,'Information Technology',2),
(3,'Human Resources',3),
(4,'Sales',1);
SELECT setval('departments_department_id_seq', 4, true);
CREATE TABLE employees (
employee_id INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
first_name VARCHAR(20),
last_name VARCHAR(25) NOT NULL,
start_date DATE NOT NULL DEFAULT CURRENT_DATE,
job_title VARCHAR(100) NOT NULL,
salary NUMERIC (9, 2) NOT NULL,
manager_id INTEGER,
department_id INTEGER,
FOREIGN KEY (department_id) REFERENCES departments (department_id),
FOREIGN KEY (manager_id) REFERENCES employees (employee_id)
);
INSERT INTO employees
(employee_id, first_name, last_name, start_date, job_title, salary, manager_id, department_id)
VALUES
(1,'John','Smith','1989-05-07','President',364000.00,NULL,1),
(2,'Pointy','HairedBoss','1999-08-12','CTO',27000.00,1,2),
(3,'Dilbertzoni','DeScrewed','2001-02-02','Software Engineer',77000.00,2,2),
(4,'Vanda','Socialist','1994-03-06','VP Equity Diversity Inclusion',90000.00,1,3),
(5,'Howard','TheDuck','2001-08-11','VP Sales', 80000.00,1,4),
(6,'Luke','Fett','2007-07-21','Sales Guy',68000.00,5,4),
(7,'John','SkipWork','2003-05-03','HR Henchman',68000.00,4,3),
(8,'Lea','Palpatine','2009-07-04','UI Designer',87000.00,2,2);
SELECT setval('employees_employee_id_seq', 8, true);
CREATE TABLE dependents (
dependent_id INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
first_name VARCHAR (50) NOT NULL,
last_name VARCHAR (50) NOT NULL,
employee_id INTEGER NOT NULL REFERENCES employees (employee_id)
);
INSERT INTO dependents
(dependent_id, first_name, last_name, employee_id)
VALUES
(1,'Spoiled','Smith',1),
(2,'DoNothin','Smith',1),
(3,'Rafael','HairedBoss',2),
(4,'Beta','HairedBoss',2),
(5,'Wanda','DeScrewed',3);
SELECT setval('dependents_dependent_id_seq', 5, true);

File diff suppressed because it is too large Load Diff

@ -0,0 +1,140 @@
# Задания
## 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);
```
Loading…
Cancel
Save