Несмотря на появление новых моделей баз данных и СУБД, реляционная модель на сегодняшний день является доминирующей, а язык SQL (Structured Query Language) является стандартом написания запросов для выборки и обработки информации из базы данных.
Предлагаемый Online-курс называется “Углубленное изучение языка SQL”. Причем ключевое слово в названии – углубленное. Предполагается, что слушатели уже знакомы в первом приближении с основными конструкциями языка SQL.
В интернете можно найти множество обучающих материалов по языку SQL.
Но, во-первых, уровень всех их либо НАЧАЛЬНЫЙ, либо СРЕДНИЙ и НИЖЕ СРЕДНЕГО. Таких знаний достаточно, чтобы написать простой сайт, либо простое по функциональности программное приложение, но абсолютно недостаточно, чтобы участвовать в разработке серьезной системы. Работодателей же интересуют не специалисты, знающие язык SQL, их интересуют специалисты, глубоко владеющие языком SQL.
Во-вторых, во всех имеющихся ресурсах по изучению языка SQL упор делается на изучение синтаксиса языка SQL. Это не очень продуктивно, поскольку имеется масса технических мануалов, справочников, где любой слушатель может в деталях познакомиться с синтаксисом языка SQL. Но это не значит, что он будет глубоко владеть языком SQL. Нужна практика.
В нашем Online-курсе основной упор делается на методическую сторону написания SQL-запросов при решении прикладных задач. Задачи Online-курса:
Online-курс включает 16 уроков, в которых по мере усложнения разбираются основные подходы к написанию запросов на языке SQL.
Урок 1. Выборка данных из нескольких таблиц с использованием внутреннего соединения таблиц.
Урок 2. Использование агрегатных функций без группирования данных
Урок 3. Написание SQL-запросов с условиями отбора с некоррелированным многоуровневым подзапросом
Урок 4. Написание SQL-запросов использованием операций над множествами (union, except, intersect).
Урок 5. Выбор объектов, имеющих связь только с элементами подмножества, определяемого подзапросом без группировки.
Урок 6. Выбор объектов, имеющих связь только с элементами подмножества, определяемого подзапросом с группировкой.
Урок 7. Написание SQL-запросов, использующих внешнее соединение таблиц и подзапросов.
Урок 8. Написание SQL-запросов, использующих внешнее соединение таблиц и подзапросов и конструкцией case.
Урок 9. Написание SQL-запросов, использующих двойное агрегирование.
Урок 10. Написание SQL-запросов, использующих коррелированные подзапросы.
Урок 11. Выбор объектов, имеющих связь с каждым элементом определенного подмножества.
Урок 12. Написание SQL-запросов, использующих конструкцию case.
Урок 13. Выбор объектов, не имеющих связи ни с одним элементом определенного подмножества.
Урок 14. Написание SQL-запросов, использующих внутреннее соединение таблиц и вложенных подзапросов с группировкой и агрегированием данных.
Урок 15. Написание SQL-запросов, использующих внутреннее соединение таблиц и вложенных подзапросов с группировкой по нескольким полям.
Урок 16. Написание SQL-запросов, использующих процентное распределение.
В каждом уроке подробно разбирается одна или несколько задач, после чего слушатель самостоятельно решает аналогичные задачи. Количество самостоятельно решаемых задач в уроке не ограничено, но для подтверждения полученных навыков и перехода к следующему уроку необходимо правильно решить не менее двух задач.
Проверка правильности написанных слушателем SQL-запросов выполняется в диалекте СУБД PostgreSQL. Поскольку Online-курс не ставит задачей изучение синтаксиса языка SQL, слушатели должны предварительно самостоятельно ознакомиться с основными конструкциями языка SQL.
При выполнении заданий, прежде всего, необходимо проанализировать задачу, т.е. понять, какая именно информация должна быть затребована из таблиц и как ее нужно преобразовать. Хороший подход, особенно на первых порах, представить, как бы вы работали с таблицами, если бы выполняли запрос вручную. Попытайтесь описать последовательность действий. Это поможет разбить сложный запрос на более простые подзадачи. Примеры лекционной части Online-курса демонстрируют, как выделять простые подзадачи и собирать из них требуемый запрос.
В Online-курсе используется база данных, схема которой включает четыре таблицы:
create table s (
n_post char(5) not null,
name char(20),
reiting smallint,
town char(15),
primary key (n_post));
create table p (
n_det char(6) not null,
name char(20),
cvet char(7),
ves smallint,
town char(15),
primary key (n_det));
create table j (
n_izd char(6) not null,
name char(30),
town char(15),
primary key (n_izd));
create table spj (
n_post char(5) references s,
n_det char(6) references p,
n_izd char(6) references j,
kol smallint)
Каждая запись Таблицы поставщиков (первичный ключ n_post) идентифицирует отдельного поставщика деталей. Поставщик имеет Имя, Рейтинг и Город, в котором он проживает. Перечень деталей (первичный ключ n_det) содержится в Таблице деталей. У детали есть Название, Цвет, Вес и Город, в котором она производится. Из деталей собираются изделия, содержащиеся в Таблице изделий (первичный ключ n_izd). Для каждого изделия есть Название и Город, где изделие собирается. Наконец, Таблица поставок содержит сведения о том, какой поставщик выполнял поставку какой детали, для какого изделия и в каком количестве.
Таблицы связаны между собой в виде ER-диаграммы, представленной на слайде.
Отметим, что структура приведенной базы данных выполнена с определенными нарушением требований проектирования базы данных: первичные ключи строковые, не все ограничения целостности установлены. Сделано это осмысленно, поскольку предметом Online-курса является изучение языка SQL, а не принципов проектирования реляционных баз данных.
Поскольку основное внимание при подборе заданий уделялось формированию навыков написания запросов, в данных и в формулировках запросов не следует искать глубокого смысла и совпадений с реальностью.
Результаты запросов, рассматриваемые в лекционной части Online-курса, проверяются на следующем наполнение таблиц.
Таблица поставщиков (S)
n_post | name | reiting | town |
(номеp поставщика) | (Фамилия) | (рейтинг) | (гоpод) |
S1 | Смит | 20 | Лондон |
S2 | Джонс | 10 | Париж |
S3 | Блейк | 30 | Париж |
S4 | Кларк | 20 | Лондон |
S5 | Адамс | 30 | Афины |
Таблица деталей (P)
n_det | name | cvet | ves | town |
(номеp детали) | (название) | (цвет) | (вес) | (гоpод) |
P1 | Гайка | Красный | 12 | Лондон |
P2 | Болт | Зеленый | 17 | Париж |
P3 | Винт | Голубой | 17 | Рим |
P4 | Винт | Красный | 14 | Лондон |
P5 | Кулачок | Голубой | 12 | Париж |
P6 | Блюм | Красный | 19 | Лондон |
Таблица изделий (J)
n_izd | name | town |
(номер изделия) | (название) | (город) |
J1 | Жесткий диск | Париж |
J2 | Перфоратор | Рим |
J3 | Считыватель | Афины |
J4 | Принтер | Афины |
J5 | Флоппи-диск | Лондон |
J6 | Терминал | Осло |
J7 | Лента | Лондон |
Таблица поставок (SPJ)
n_post | n_det | n_izd | kol |
(номер поставщика) | (номер детали) | (номер изделия) | (количество) |
S1 | P1 | J1 | 200 |
S1 | P1 | J4 | 700 |
S2 | P3 | J1 | 400 |
S2 | P3 | J2 | 200 |
S2 | P3 | J3 | 200 |
S2 | P3 | J4 | 500 |
S2 | P3 | J5 | 600 |
S2 | P3 | J6 | 400 |
S2 | P3 | J7 | 800 |
S2 | P5 | J2 | 100 |
S3 | P3 | J1 | 200 |
S3 | P4 | J2 | 500 |
S4 | P6 | J3 | 300 |
S4 | P6 | J7 | 300 |
S5 | P2 | J2 | 200 |
S5 | P2 | J4 | 100 |
S5 | P5 | J5 | 500 |
S5 | P5 | J7 | 100 |
S5 | P6 | J2 | 200 |
S5 | P1 | J4 | 100 |
S5 | P3 | J4 | 200 |
S5 | P4 | J4 | 800 |
S5 | P5 | J4 | 400 |
S5 | P6 | J4 | 500 |
Таблица поставщиков содержит 5 строк – 5 поставщиков S1, S2, S3, S4 и S5.
Таблица деталей содержит 6 строк – 6 деталей с номерами P1, P2,.. P6.
Таблица изделий содержит 7 строк – 7 изделий с номерами J1, J2,.. J7.
Таблица поставок spj содержит 24 строки – 24 поставки деталей, выполненных поставщиками S1, … S5. У каждой поставки есть объем. И столбец количество – это объем поставки. Число поставок равно числу строк таблицы spj.
Например, первая строка таблицы говорит о том, что поставщик S1 выполнил поставку детали P1 для изделия J1 в количестве 200 штук.
Однако SQL-запросы, написанные слушателями при выполнении заданий, должны правильно работать не только на этих, но и на любых осмысленных данных, соответствующих описанию полей таблиц. И проверяться написанные слушателем SQL-запросы будут не только на этих данных, но и на других комбинациях данных.
Ниже приведены некоторые пояснения к формулировкам запросов в задачах:
Число поставок – число строк таблицы spj.
Объем поставки – количество поставленных деталей – значение столбца kol таблицы spj.
Количество деталей – количество поставленных деталей – значение столбца kol таблицы spj.
Вес поставки – количество поставленных деталей * вес поставленной детали (вес, указанный в таблице p, это вес одной детали).
Число деталей – число разных номеров (наименований, видов, типов) деталей.
Число изделий – число разных номеров (наименований, видов, типов) изделий.
Число поставщиков – число разных номеров (наименований, видов, типов) поставщиков.
Город, из которого сделана поставка – город, где производится деталь, указанная в поставке.
Город, куда сделана поставка – город, где собирают изделие, указанное в поставке.
Список рекомендованной литературы: