Из предыдущего задания вы поняли, что PostgreSQL — это система управления объектно-реляционными базами данных (ORDBMS). Также вы установили в систему определенную версию СУБД PostgreSQL и создали нового пользователя для работы с ней. Теперь вам нужно разобраться в том, как работать с базами данных, и познакомиться с основными понятиями реляционных баз данных. После этого узнать, как создавать свои базы данных и управлять таблицами, как записывать информацию в базу данных и получать для работы конкретные данные из конкретных таблиц.
Мы начнем с разбора главных понятий и описания общего синтаксиса SQL.
База данных (БД) — это организованная структура данных, предназначенная для хранения, изменения и обработки взаимосвязанной информации, преимущественно больших объемов.
Любая база данных обладает набором преимуществ перед неструктурированными данными, а именно:
Концепция транзакции — это обеспечение безопасного изменения данных в базе с возможностью их восстановления после различных ошибок. Транзакция гарантирует, что изменения, связанные с конкретной базой данных, всегда будут выполняться по принципу сохранения всех изменений либо какого-то конкретного. Это позволяет восстановить базу данных в предыдущее состояние, если сбой произошел после того, как изменения начали вноситься или если вы просто решили отменить эти изменения.
Чтобы удовлетворять определению транзакции, СУБД должна придерживаться следующих четырех свойств!
Если ваша СУБД удовлетворяет всем свойствам транзакции, то она будет являться ACID-устойчивой.
Теперь, когда понятны все преимущества базы данных, рассмотрим элементы реляционных баз данных.
Реляционная база данных основана на реляционной модели.
Реляционная модель — это набор правил, основанных на математических принципах реляционной алгебры, которые определяют, каким образом системы управления базами данных должны функционировать. Подробнее об этом можно узнать тут.
Основными структурными элементами реляционных баз данных в реляционной модели являются:
Таблица — это логически связанная информация, рассматриваемая как единое целое.
Обычно таблицы делятся на три типа:
Таблицы состоят из строк (row) (или записей (record)) и столбцов (column) (или полей (field)).
Ниже приведен пример таблицы Users:
| user_id | firstname | lastname | username | password |
|---|---|---|---|---|
| 1 | Vasya | Ivanov | admin | VasyaSecretLongAdminPa$$w0Rd |
| 2 | Petya | Pertrov | hero1 | qwerty |
| 3 | Misha | Sidorov | Mishanya | sdop234$#%90 |
| 4 | Tanya | Smirnova | Luna | 123456 |
Поле — это «столбец» таблицы, включающий в себя значения определенного типа.
Каждое поле должно иметь конкретный тип данных.
Типы данных:
| Имя | Псевдонимы | Описание |
|---|---|---|
| bigint | int8 | знаковое целое из 8 байт |
| bigserial | serial8 | восьмибайтное целое с автоувеличением |
| bit [ (n) ] | битовая строка фиксированной длины | |
| bit varying [ (n) ] | varbit [ (n) ] | битовая строка переменной длины |
| boolean | bool | логическое значение (true/false) |
| box | прямоугольник в плоскости | |
| bytea | двоичные данные («массив байт») | |
| character [ (n) ] | char [ (n) ] | символьная строка фиксированной длины |
| character varying [ (n) ] | varchar [ (n) ] | символьная строка переменной длины |
| cidr | сетевой адрес IPv4 или IPv6 | |
| circle | круг в плоскости | |
| date | календарная дата (год, месяц, день) | |
| double precision | float8 | число двойной точности с плавающей точкой (8 байт) |
| inet | адрес узла IPv4 или IPv6 | |
| integer | int, int4 | знаковое четырехбайтное целое |
| interval [ поля ] [ (p) ] | интервал времени | |
| json | текстовые данные JSON | |
| jsonb | двоичные данные JSON, разобранные | |
| line | прямая в плоскости | |
| lseg | отрезок в плоскости | |
| macaddr | MAC-адрес | |
| macaddr8 | адрес MAC (Media Access Control) (в формате EUI-64) | |
| money | денежная сумма | |
| numeric [ (p, s) ] | decimal [ (p, s) ] | вещественное число заданной точности |
| path | геометрический путь в плоскости | |
| pg_lsn | последовательный номер в журнале Postgres Pro | |
| point | геометрическая точка в плоскости | |
| polygon | замкнутый геометрический путь в плоскости | |
| real | float4 | число одинарной точности с плавающей точкой (4 байта) |
| smallint | int2 | знаковое двухбайтное целое |
| smallserial | serial2 | двухбайтное целое с автоувеличением |
| serial | serial4 | четырехбайтное целое с автоувеличением |
| text | символьная строка переменной длины | |
| time [ (p) ] [ without time zone ] | время суток (без часового пояса) | |
| time [ (p) ] with time zone | timetz | время суток с учетом часового пояса |
| timestamp [ (p) ] [ without time zone ] | дата и время (без часового пояса) | |
| timestamp [ (p) ] with time zone | timestamptz | дата и время с учетом часового пояса |
| tsquery | запрос текстового поиска | |
| tsvector | документ для текстового поиска | |
| txid_snapshot | снимок идентификатора транзакций | |
| uuid | универсальный уникальный идентификатор | |
| xml | XML-данные |
В таблице Users, представленной выше, имеется 6 столбцов:
В таблице реляционной базы данных одинаковый набор столбцов (column) или полей (field) формирует строку этой таблицы.
Запись (строка) — это сущность таблицы, содержащая набор значений, размещенных в полях базы данных.
Эти значения характеризуют какой-то конкретный объект, например пользователя приложения из таблицы пользователей. Каждая строка рассматривается как отдельный объект.
В таблице Users, представленной выше, содержится четыре строки, каждая из которых содержит информацию о конкретном пользователе.
Например, ниже «одной строкой» представлена информация о пользователе (объекте) Petya Pertrov.
| user_id | firstname | lastname | username | password |
|---|---|---|---|---|
| 2 | Petya | Pertrov | hero1 | qwerty |
Как правило, в современных реляционных базах данных существует два основных типа ключей (key):
Primary Key — это столбец или группа столбцов, которые содержат уникальные значения, однозначно идентифицирующие строку в таблице. Поскольку Primary Key всегда уникален, он используется для исключения дублирования данных.
Хороший Primary Key должен обладать следующими характеристиками:
Теперь разберемся с Foreign Key.
Foreign Key – это значение столбца в одной таблице, которое должно соответствовать значению Primary Key столбца в другой таблице.
Другими словами, это ссылка одной таблицы на другую.
Если значение Foreign Key не нулевое, то значение Primary Key в другой таблице должно существовать.
Такие связи одного столбца таблицы с другим столбцом другой таблицы образуют реляционную базу данных, способную объединять таблицы.
Существуют еще ключи, называемые Сomposite Кey или составные ключи. Такие ключи состоят из более чем одного столбца, но в рамках основ мы их рассматривать не будем.
Индекс — это объект базы данных, создаваемый для повышения производительности выполнения запросов. Таблицы в базе данных могут иметь большое количество строк, которые хранятся в произвольном порядке, и их поиск по заданному значению путем последовательного просмотра таблицы строка за строкой может занимать много времени.
Индекс формируется из значений одного или нескольких столбцов таблицы и указателей на соответствующие строки таблицы. Это позволяет находить нужную строку по заданному значению. Ускорение работы с использованием индексов достигается в первую очередь за счет того, что индекс имеет структуру, оптимизированную под поиск (например, бинарное дерево).
Индексы могут быть уникальными и неуникальными. Отличие их лишь в том, что уникальный реализует ограничение целостности таблицы, исключая возможность вставки повторяющихся значений.
Индексы имеют следующие преимущества:
PostgreSQL использует концепцию ролей (roles) для управления разрешениями на доступ к базе данных. Роль можно рассматривать как пользователя базы данных или как группу пользователей, в зависимости от того, как роль настроена. Роли могут владеть объектами базы данных (например, таблицами и функциями) и выдавать другим ролям разрешения на доступ к этим объектам, управляя тем, кто имеет доступ и к каким объектам. Кроме того, можно предоставить одной роли членство в другой, и таким образом она сможет использовать права других ролей.
Концепция ролей включает в себя концепцию пользователей (users) и групп (groups). До версии 8.1 в PostgreSQL пользователи и группы были отдельными сущностями, но теперь есть только роли. Любая роль может использоваться в качестве пользователя, группы или и того, и другого совместно.
Подробнее роли вы разберете в задании 4.
Теперь перейдем к языку SQL.
Structured Query Language, SQL — декларативный язык программирования, применяемый для создания, изменения, перемещения и удаления данных в реляционных базах данных, которыми управляет соответствующая СУБД. В нашем случае — это СУБД PostgreSQL.
SQL содержит в себе следующие 4 подраздела языка:
Основные DDL команды для PostgreSQL:
CREATE — создает объект СУБД или базы данных, например базу данных.
# Это язык DDL SQL
# Создать базу данных db_name
CREATE DATABASE db_name;
ALTER — изменяет параметры объекта СУБД или базы данных, например выбранной роли.
# Это язык DDL SQL
# Изменение пароля роли
ALTER ROLE davide WITH PASSWORD 'hu8jmn3';
DROP — удаляет объект СУБД или базы данных, например таблицу для текущей базы данных.
# Это язык DDL SQL
# Удалить таблицу users
DROP TABLE users;
Основные DМL команды для PostgreSQL:
SELECT — получить строки из таблицы или представления.
SELECT получает строки из множества таблиц (это множество может быть пустым).
# Это язык DML SQL
# Выбрать все значения полей user_id, username, password из таблицы users
SELECT user_id,username,password FROM users;
INSERT — добавить строки в таблицу.
# Это язык DML SQL
# Добавить в таблицу users нового пользователя web-приложения, у которого:
# firstname = 'max'
# lastname = 'weber'
# username = 'web_admin'
# password = 'web_admin_STR0Ng_P@s$woRD'
INSERT INTO users(firstname,lastname,username,password)
VALUES ('max','weber','web_admin','web_admin_STR0Ng_P@s$woRD');
UPDATE — изменить строки таблицы.
UPDATE изменяет значения указанных столбцов во всех строках, удовлетворяющих условию. В предложении SET должны указываться только те столбцы, которые будут изменены; столбцы, не изменяемые явно, сохраняют свои предыдущие значения.
# Это язык DML SQL
# Обновление поля username для пользователя с username = 'hero1' в таблице users
UPDATE users SET username = 'Dramatic' WHERE username = 'hero1';
DELETE — удалить записи таблицы.
Команда DELETE удаляет из указанной таблицы строки, удовлетворяющие условию WHERE. Если предложение WHERE отсутствует, она удаляет из таблицы все строки, в результате будет получена рабочая, но пустая таблица.
# Это язык DML SQL
# Удалить столку из таблицы users где user_id = 2;
DELETE FROM users WHERE user_id = 2;
# Удалить все строки из таблицы users
DELETE FROM users;
# Будет получена рабочая, но пустая таблица users.
Основные DCL команды для PostgreSQL:
GRANT — выдать права доступа.
Команда GRANT имеет два варианта использования:
# Это язык DСL SQL
# Первый вариант использования GRANT
# Выдать все права на базу данных 'db_name' пользователю db_user
GRANT ALL PRIVILEGES ON DATABASE 'db_name' TO db_user;
# Второй вариант использования GRANT
# Включение в роль admins пользователя joe
GRANT admins TO joe;
REVOKE — отозвать права доступа.
Команда REVOKE лишает одну или несколько ролей прав, назначенных ранее.
# Это язык DСL SQL
# Отозвать все права на базу данных 'db_name' у пользователя db_user
REVOKE ALL PRIVILEGES ON DATABASE 'db_name' TO db_user;
BEGIN — начать блок транзакции.
BEGIN начинает блок транзакции, то есть обозначает, что все операторы после команды BEGIN и до явной команды COMMIT или ROLLBACK будут выполняться в одной транзакции. По умолчанию (без BEGIN) PostgreSQL выполняет транзакции в режиме «autocommit» (автофиксация), то есть каждый оператор выполняется в своей отдельной транзакции, которая неявно фиксируется в конце оператора (если оператор был выполнен успешно; в противном случае транзакция откатывается).
COMMIT — зафиксировать текущую транзакцию.
COMMIT фиксирует текущую транзакцию. Все изменения, произведенные транзакцией гарантированно сохранятся в случае сбоя и становятся видимыми для других пользователей, у которых есть доступ на просмотр этих данных.
ROLLBACK — прервать текущую транзакцию.
ROLLBACK откатывает текущую транзакцию и приводит к аннулированию всех изменений, произведённых транзакцией.
Для написания запросов важно понимать, в какой последовательности ваш запрос будет обрабатываться системой управления базами данных. Это позволит вам делать меньше ошибок.
В СУБД PostgreSQL, например, для SELECT процедура выполнения следующая:
Выполняются все запросы в списке WITH. По сути, они формируют временные таблицы, к которым затем можно обращаться в списке FROM. Запрос в WITH без указания NOT MATERIALIZED выполняется только один раз, даже когда он фигурирует в списке FROM неоднократно.
Вычисляются все элементы в списке FROM (каждый элемент в списке FROM представляет собой реальную или виртуальную таблицу). Если список FROM содержит несколько элементов, они объединяются перекрестным соединением.
Если указано предложение WHERE, все строки, не удовлетворяющие условию, исключаются из результата.
Если присутствует указание GROUP BY либо в запросе вызываются агрегатные функции, вывод разделяется по группам строк, соответствующим одному или нескольким значениям, а затем вычисляются результаты агрегатных функций. Если добавлено предложение HAVING, оно исключает группы, не удовлетворяющие заданному условию.
Вычисляются фактические выходные строки по заданным в SELECT выражениям для каждой выбранной строки или группы строк.
SELECT DISTINCT исключает из результата повторяющиеся строки. SELECT DISTINCT ON исключает строки, совпадающие по всем указанным выражениям. SELECT ALL (по умолчанию) возвращает все строки результата, включая дубликаты.
Операторы UNION, INTERSECT и EXCEPT объединяют вывод нескольких команд SELECT в один результирующий набор. Оператор UNION возвращает все строки, представленные в одном либо обоих наборах результатов. Оператор INTERSECT возвращает все строки, представленные строго в обоих наборах. Оператор EXCEPT возвращает все строки, представленные в первом наборе, но не во втором. Во всех трех случаях повторяющиеся строки исключаются из результата, если явно не указано ALL. Чтобы явно обозначить, что выдаваться должны только неповторяющиеся строки, можно добавить избыточное слово DISTINCT. Заметьте, что в данном контексте по умолчанию подразумевается DISTINCT, хотя в самом SELECT по умолчанию подразумевается ALL.
Если присутствует предложение ORDER BY, возвращаемые строки сортируются в указанном порядке. В отсутствие ORDER BY строки возвращаются в том порядке, в каком системе будет проще их выдать.
Если указано предложение LIMIT (или FETCH FIRST) либо OFFSET, оператор SELECT возвращает только подмножество строк результата.
Если указано FOR UPDATE, FOR NO KEY UPDATE, FOR SHARE или FOR KEY SHARE, оператор SELECT блокирует выбранные строки, защищая их от одновременных изменений.
Для всех столбцов, задействованных в команде SELECT, необходимо иметь право SELECT. Применение блокировок FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE или FOR KEY SHARE требует также права UPDATE (как минимум для одного столбца в каждой выбранной для блокировки таблице).
Для других запросов вы можете разобрать последовательность выполнения самостоятельно, обратившись к официальной документации.
Иногда требуется сохранить результаты какого-либо запроса на диск, для этого есть несколько вариантов решения.
psql указав флаг -о и имя выходного файла:psql -c "SELECT username,city FROM users;" -U rebrain_admin -d rebrain_courses_db -h localhost -p 5432 -o /tmp/out_fileaname.query_result
psql консоли с базой данных (подключившись к ней), можно выполннить метакоманду \o "file_name":\o /tmp/out_fileaname.query_result2
SELECT * FROM courses;
Чтобы выполнить команду для операционной системы из psql консоли, можно воспользоваться метакомандой \! "cmd":
\! mkdir -p /tmp/your_new_directory_name
\! ls /tmp/
\! cat /tmp/out_fileaname.query_result2
Теперь разберемся с JOIN.
Одним из способов обединения таблиц является использование оператора JOIN. Он предоставляет вам возможность объединения данных из одной или из разных таблиц в одном запросе, используя различные варианты записи, в зависимости от требований.
Варианты использования оператора JOIN указаны на рисунке ниже:
Запрос JOIN объединяет два элемента списка FROM, которые мы для простоты дальше будем называть «таблицами», хотя на самом деле это может быть любой объект, допустимый в качестве элемента FROM. Для определения порядка вложенности при необходимости следует использовать скобки. В отсутствие скобок предложения JOIN обрабатываются слева направо. В любом случае JOIN связывает элементы сильнее, чем запятые, разделяющие элементы в списке FROM.
Теперь разберемся в этих вариантах использования оператора JOIN подробнее.
JOIN или INNER JOIN формирует простое декартово произведение, то же, что можно получить, указав две таблицы на верхнем уровне FROM, но ограниченное возможным условием соединения. Предложение CROSS JOIN равнозначно INNER JOIN ON (TRUE), то есть никакие строки по условию не удаляются. Эти типы соединений введены исключительно для удобства записи, они не дают ничего такого, что нельзя было бы получить, используя просто FROM и WHERE.
# Пример INNER JOIN
SELECT list,of,fields
FROM table_A AS A
INNER JOIN table_B AS B
ON A.Key = B.Key
LEFT OUTER JOIN возвращает все строки ограниченного декартова произведения (то есть все объединенные строки, удовлетворяющие условию соединения) плюс все строки в таблице слева, для которых не находится строк в таблице справа, удовлетворяющих условию. Строка, взятая из таблицы слева, дополняется до полной ширины объединенной таблицы значениями NULL в столбцах таблицы справа. Заметьте, что для определения, какие строки двух таблиц соответствуют друг другу, проверяется только условие самого предложения JOIN. Внешние условия проверяются позже.
# Пример LEFT OUTER JOIN
SELECT list,of,fields
FROM table_A AS A
LEFT OUTER JOIN table_B AS B
ON A.Key = B.Key
LEFT EXCLUDING OUTER JOIN возвращает только строки для каждой строки слева, не имеющей соответствия справа (эта строка дополняется значениями NULL вправо).
# Пример LEFT OUTER JOIN
SELECT list,of,fields
FROM table_A AS A
LEFT OUTER JOIN table_B AS B
ON A.Key = B.Key
WHERE B.Key IS NULL
RIGHT OUTER JOIN возвращает все строки, имеющие соответствия справа и слева, плюс одну строку для каждой строки справа, не имеющей соответствия слева (эта строка дополняется значениями NULL влево). Это предложение введено исключительно для удобства записи, так как его можно легко свести к LEFT OUTER JOIN, поменяв левую и правую таблицы местами.
# Пример RIGHT OUTER JOIN
SELECT list,of,fields
FROM table_A AS A
RIGHT OUTER JOIN table_B AS B
ON A.Key = B.Key
RIGHT EXCLUDING JOIN возвращает только строки для каждой строки справа, не имеющей соответствия слева (эта строка дополняется значениями NULL влево).
# Пример RIGHT OUTER EXCLUDING JOIN
SELECT list,of,fields
FROM table_A AS A
RIGHT OUTER JOIN table_B AS B
ON A.Key = B.Key
WHERE A.Key IS NULL
FULL JOIN, OUTER JOIN или FULL OUTER JOIN возвращают все соединенные строки плюс все строки слева, не имеющие соответствия справа (дополненные значениями NULL вправо), плюс все строки справа, не имеющие соответствия слева (дополненные значениями NULL влево).
# Пример FULL OUTER JOIN
SELECT list,of,fields
FROM table_A AS A
FULL OUTER JOIN table_B AS B
ON A.Key = B.Key
OUTER EXCLUDING JOIN, или FULL EXCLUDING JOIN, или FULL OUTER EXCLUDING JOIN возвращает все строки слева, не имеющие соответствия справа (дополненные значениями NULL вправо), плюс все строки справа, не имеющие соответствия слева (дополненные значениями NULL влево), исключая все строки, имеющие соответствия справа и слева.
# Пример FULL OUTER EXCLUDING JOIN
SELECT list,of,fields
FROM table_A AS A
FULL OUTER JOIN table_B AS B
ON A.Key = B.Key
WHERE A.Key IS NULL OR B.Key IS NULL
Вы узнали основы работы с СУБД PostgreSQL и ваших знаний будет достаточно, чтобы пройти задание.
Представьте, что вам поручили разработку новой базы данных для компании REBRAIN. При этом узнали, что в техническом задании основным пунктом указана совместимость с СУБД PostgreSQL. Указанное имя базы данных: "rebrain_courses_db".
Для начала вы решили представить схематично как будет выглядеть база данных.
Вам потребуется таблица users, которая будет содержать информацию о пользователях, купивших практикум, и таблица courses с информацией об имеющихся у компании практикумах, количестве их задач и т.п.
Также вам потребуется связующая таблица users_courses, чтобы настроить реляционное отношение между двумя таблицами. Эта таблица будет показывать информацию о покупках пользователями практикумов.
Вы приступили к заданию и поняли, что необходимо создать следующие таблицы:
Таблица №1. - users
CREATE TABLE users(
user_id SERIAL PRIMARY KEY NOT NULL, -- Primary Key
username varchar(50) NOT NULL, -- Имя пользователя
email varchar(50) NOT NULL, -- Электронная почта
mobile_phone varchar(12) NOT NULL, -- Номер телефона
firstname TEXT NOT NULL, -- Имя
lastname TEXT NOT NULL, -- Фамилия
city TEXT, -- Название города
is_curator boolean NOT NULL, -- Является ли пользователь куратором
record_date timestamp NOT NULL DEFAULT now() -- Время создания записи о пользователе
);
Исходные данные для Таблицы №1.
| user_id | username | mobile_phone | firstname | lastname | city | is_curator | record_date | |
|---|---|---|---|---|---|---|---|---|
| 1 | admin | vasiliy_ozerov@mail.com | +79111937483 | Vasiliy | Ozerov | Moscow | true | 1354843544 |
| 2 | pricex | SimonWels@mail.com | +79111974384 | Simon | Wels | London | false | 1354843544 |
| 3 | MaytheForcebewithyou | Leya.Organa@newrepublic.com | +79991916526 | Leya | Organa | Alderaan | false | 1354843544 |
| 4 | yodajedi | magistr_yoda@oldrepublic.com | +79114326786 | Yoda | Yodin | Dagoba | false | 1354843544 |
| 5 | herion1 | Sabur03@yandex.ru | +79110983475 | Sabur | Gagiev | Kazan | false | 1354843544 |
| 6 | pusha | Liliana_Sal@yandex.ru | +79115897438 | Liliana | Salohina | SPB | false | 1354843544 |
| 7 | vierjohn | xen_power@mail.com | +79112232134 | John | Seltic | NULL | false | 1354843544 |
| 8 | trakstars | Pronina@mail.ru | +79811987483 | Varya | Pronina | Moscow | false | 1354843544 |
| 9 | vozilla | Maxxx@mail.ru | +79111047854 | Max | Visikov | NULL | false | 1354843544 |
| 10 | Kisa007 | Kisa007@mail.ru | +79112405972 | Raya | Simonova | Tver | false | 1354843544 |
| 11 | greenball | maike.greenball.vazovsky@corp.com | +79112425872 | Mike | Vazovsky | Monstertown | false | 1354843544 |
Таблица №2. - courses
CREATE TABLE courses(
course_id SERIAL PRIMARY KEY NOT NULL, -- Primary Key
coursename varchar(50) NOT NULL, -- Название практикума
tasks_count INT NOT NULL, -- Количество заданий в практикуме
price INT NOT NULL -- Цена практикума
);
Исходные данные для Таблицы №2.
| course_id | coursename | tasks_count | price |
|---|---|---|---|
| 1 | Kubernetes | 70 | 35000 |
| 2 | Highload | 130 | 75000 |
| 3 | Bash | 15 | 6900 |
| 4 | Golang | 117 | 55000 |
| 5 | Linux | 102 | 65000 |
| 6 | Devops | 212 | 75000 |
| 7 | Docker | 45 | 30000 |
| 8 | Logs | 14 | 7900 |
Таблица №3. - users__courses
CREATE TABLE users__courses(
id SERIAL PRIMARY KEY NOT NULL, -- Primary Key
user_id INT NOT NULL, -- Foreign Key to table users
course_id INT NOT NULL, -- Foreign Key to table courses
CONSTRAINT fk_user_id
FOREIGN KEY (user_id)
REFERENCES users(user_id),
CONSTRAINT fk_course_id
FOREIGN KEY (course_id)
REFERENCES courses(price)
);
Исходные данные для Таблицы №3.
| id | user_id | course_id |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 1 | 4 |
| 3 | 3 | 2 |
| 4 | 3 | 4 |
| 5 | 2 | 6 |
| 6 | 2 | 1 |
| 7 | 2 | 2 |
| 8 | 2 | 4 |
| 9 | 5 | 6 |
| 10 | 6 | 6 |
Пока на этом все, продолжим доделывать базу данных "rebrain_courses_db" в следующем задании. А пока можете приступать к текущему заданию.
${base_domain}).Внесите информацию о новом пользователе в таблицу №1:
| username | mobile_phone | firstname | lastname | city | is_curator | |
|---|---|---|---|---|---|---|
| vladon | Vladislav.Pirushin@gmail.com | +79817937545 | Vladislav | Pirushin | NULL | false |
Внесите информацию о новом курсе "Postgresql" в таблицу №2
| coursename | tasks_count | price |
|---|---|---|
| Postgresql | 14 | 7900 |
/tmp/answers/table2_courses_data. Для сохранения результата запроса в файл используйте запрос "COPY (SELECT..) TO /path/to/file CSV HEADER;", psql метакоманду "\o<\b> /path/to/file SELECT ... " или OS команду "psql -o /path/to/file". Проверяйте в выведенных данных наличие заголовков полей (это важно для успешного прохождения автопроверок)./tmp/answers/table1_usernames_and_phones./tmp/answers/LEFT_OUTER_JOIN в формате CSV с заголовками./tmp/answers/RIGHT_OUTER_JOIN в формате CSV с заголовками.pg_dump -U root rebrain_courses_db > rebrain_courses_db.sql.bqp
rebrain_courses_db.sql.bqp к себе на компьютер для выполнения следующих заданий.Чтобы начать выполнение задания, укажите в настройках вашу должность, название компании и аккаунт в Telegram
Заполнить