← Все курсы · Курс SQL · Все руководства
Где взять образец базы данных для практики SQL
К концу этой страницы у вас на компьютере будет реальная база данных с 11 таблицами, 3503 треками и 412 счетами клиентов, и вы выполните запрос, который докажет, что все таблицы доставлены в целости и сохранности. Затем вы выполните объединение двух таких таблиц, чему вас никогда не научит одна таблица. Это занимает около пяти минут и ничего не стоит.
Вот чем на самом деле заняться сегодня. Загрузите файл базы данных Чинук, откройте его в браузере DB для SQLite и запустите один запрос, который подсчитывает строки в каждой таблице. Если значения совпадают с указанными ниже, у вас есть рабочая среда, и вы можете прекратить ее покупать.
Краткая версия: получить Chinook_Sqlite.sqlite, откройте его, посчитайте строки, затем соедините две таблицы. Нортвинд и Сакила — два других имени, которые вы увидите, а ниже есть таблица, в которой указано, когда каждое из них является правильным выбором.
Причина, по которой пример базы данных превосходит уже имеющийся у вас CSV, заключается в одной идее: она дает представление о картине.
- Почему одного CSV недостаточно
- Возьмите Чинук, тот, с которого стоит начать.
- Откройте его, и запрос, подтверждающий его загрузку
- Ваше первое соединение двух таблиц
- Нортвинд, Сакила и собственные данные комплекта: когда каждый прав
- Дыры в данных — вот суть
- Посмотрите, как 412 строк превращаются в 2240.
- Полное до и после
- Что пошло не так и как это исправить
- Почему практика с реальной базой данных работает
- Использование этого в вашем собственном проекте
- Все на одном экране
1. Почему одного CSV недостаточно
Прежде чем объяснять: подумайте о последней таблице, с которой вы работали. На какой вопрос вы не могли бы ответить, не открыв рядом с ней второй файл?
Почти каждое упражнение SQL, которое вы можете попрактиковать с одним файлом, представляет собой фильтр, сортировку или итог. Это настоящие навыки, и вы исчерпаете их за полдня. Навыки, которые проверяются на собеседованиях и используются каждый день на работе, — это соединения, зернистость и сверка, и для каждого из них нужны как минимум две таблицы, которые ссылаются друг на друга.
A образец базы данных — это один файл, содержащий множество таблиц, которые уже правильно ссылаются друг на друга. Кто-то проделал работу по тому, чтобы клиент 14 в одной таблице стал тем же клиентом 14 в другой. Эта проводка является практическим материалом. Вы не столько загружаете данные, сколько загружаете отношения.
2. Возьмите Чинук, тот, с которого стоит начать.
Чинук — это выдуманный магазин цифровой музыки: исполнители, альбомы, треки, клиенты, счета и сотрудники, которые их продали. Это лучший выбор для начинающих, поскольку он поставляется в виде одного готового файла SQLite. Нет ни сервера, ни сценария для запуска, ни шага импорта, который может пойти не так.
Загрузите этот файл и поместите его где-нибудь, где вы сможете его снова найти, например в папке «Документы».
https://github.com/lerocha/chinook-database/releases/download/v1.4.5/Chinook_Sqlite.sqlite
Это около 1 МБ. Щелкните ссылку правой кнопкой мыши и выберите «Сохранить ссылку как» или вставьте ее в адресную строку браузера. Расширение файла .sqlite, и вы также можете увидеть .db или .sqlite3 используется в другом месте для файла того же типа. SQLite не заботится о том, какой из трех вы используете; они все просто имя.
Игнорируйте другой файл в этом выпуске, Chinook_Sqlite.sql. Это сценарий инструкций по созданию базы данных, а не сама база данных, и его запуск сегодня вам не нужен.
3. Откройте его и загрузите запрос, подтверждающий его.
Перед объяснением: вы собираетесь выполнить запрос, который возвращает 8 строк. Что может показать вам этот результат, чего не может показать простой просмотр файла на диске?
Открыть Браузер БД для SQLite, выберите «Открыть базу данных» и выберите только что загруженный файл. Слева вы должны увидеть список таблиц: «Альбом», «Исполнитель», «Клиент», «Сотрудник», «Жанр», «Счет», «Счет-фактура», «Медиатип», «Плейлист», «ПлейлистТрек», «отслеживать». Одиннадцать из них.
Просмотр имен таблиц не является доказательством того, что строки появились вместе с ними. Перейдите на вкладку «Выполнение SQL» и запустите это.
SELECT 'Album' AS tbl, COUNT(*) AS rows FROM Album
UNION ALL SELECT 'Artist', COUNT(*) FROM Artist
UNION ALL SELECT 'Customer', COUNT(*) FROM Customer
UNION ALL SELECT 'Employee', COUNT(*) FROM Employee
UNION ALL SELECT 'Genre', COUNT(*) FROM Genre
UNION ALL SELECT 'Invoice', COUNT(*) FROM Invoice
UNION ALL SELECT 'InvoiceLine', COUNT(*) FROM InvoiceLine
UNION ALL SELECT 'Track', COUNT(*) FROM Track;
tbl rows
----------- ----
Album 347
Artist 275
Customer 59
Employee 8
Genre 25
Invoice 412
InvoiceLine 2240
Track 3503
Если ваши номера совпадают, база данных не повреждена и настройка завершена. UNION ALL здесь делает что-то простое: он укладывает результаты одного запроса под другой, так что восемь однострочных счетчиков превращаются в один восьмистрочный отчет. Сохраните этот запрос. Это тот же самый прием, который используется для проверки любой переданной вам базы данных, а в реальной работе вы доказываете, что загрузка завершена, прежде чем кто-нибудь об этом спросит.
Два числа, за которые нужно держаться, потому что они используются в остальной части страницы: 412 счетов и 2240 строк счета-фактуры.
4. Ваше первое объединение двух таблиц
Перед пояснением: в таблице «Счета-фактуры» записана стоимость каждой продажи, а в таблице «Клиенты» указано, где живет каждый покупатель. Для какого из двух вопросов «что мы продали» и «где живут наши покупатели» нужны обе таблицы сразу?
Вот запрос, который не может существовать в одном файле. Доходам по странам нужны деньги из одной таблицы, а стране - из другой.
SELECT c.Country,
COUNT(*) AS invoices,
ROUND(SUM(i.Total), 2) AS revenue
FROM Invoice i
JOIN Customer c ON c.CustomerId = i.CustomerId
GROUP BY c.Country
ORDER BY revenue DESC
LIMIT 5;
Country invoices revenue
------- -------- -------
USA 91 523.06
Canada 56 303.96
France 35 195.1
Brazil 35 190.1
Germany 28 156.48
Линия, выполняющая работу, ON c.CustomerId = i.CustomerId. В нем говорится: строка счета-фактуры и строка клиента принадлежат друг другу, если идентификатор клиента, указанный в счете, совпадает с собственным идентификатором клиента. Этот общий столбец является ключевым, и это линия, нарисованная на рисунке вверху. Если вам нужен полный отчет о том, как соединения влияют на количество строк, SQL-СОЕДИНЕНИЯ является руководством для этого.
Обратите внимание, что 91 + 56 + 35 + 35 + 28 = 245, а не 412, потому что LIMIT 5 сократили список до пяти стран. Несогласованная сумма обычно представляет собой фильтр, который вы забыли написать, и LIMIT считается за один.
5. Нортвинд, Сакила и собственные данные комплекта: когда каждый прав
Еще три имени всплывают постоянно. Вот честное сравнение с цифрами, которые я измерил, а не с теми, которые повторяются в Интернете.
| база данных | Что он содержит | Сколько стоит установка | Выбери это, когда |
|---|---|---|---|
| Чинук | Музыкальный магазин. 11 таблиц, 3503 трека, 412 счетов, 59 клиентов. | Загрузите один файл размером 1 МБ и откройте его. | Вы начинаете. Это значение по умолчанию. |
| Нортвинд (версия SQLite) | Заказы для малого бизнеса. 13 столов плюс просмотры. Предварительно заполненный файл, который я скачал, содержит 16 282 заказа и 609 283 строки заказа в файле размером 24 МБ. | Загрузите один файл и откройте его. | Вам нужно достаточно строк, чтобы отсутствующий индекс работал медленно, или вам нужно попрактиковаться с представлениями. |
| Сакила | Прокат DVD. 1000 фильмов, а также хранимые процедуры и триггеры. | Требуется установка и запуск MySQL, а затем два сценария, загруженные в командной строке. | Вакансия просила конкретно MySQL. Он не работает на SQLite. |
| Собственные данные Курс SQL | Пара товаров и продаж, 180 строк продаж, специально оставлены недостающие регионы. | Ничего. Он запускается во вкладке браузера. | Вы хотите ввести запрос в течение следующих тридцати секунд, ничего не загружая. |
Цифры Нортвинд заслуживают внимания, поскольку на большинстве страниц с их описанием упоминается исходная версия Майкрософт с несколькими сотнями заказов. Сборка SQLite теперь поставляется с гораздо большим количеством предварительно заполненных строк, что является плюсом и сюрпризом, если вам сказали ожидать 830 строк. Всегда посчитайте, прежде чем доверять описанию, включая это.
6. Дело в дырах в данных
Примеры баз данных часто называют чистыми. «Чинук» — нет, и это его лучшая особенность. Запустите это.
SELECT COUNT(*) AS total,
COUNT(Composer) AS has_composer,
COUNT(*) - COUNT(Composer) AS missing
FROM Track;
total has_composer missing
----- ------------ -------
3503 2525 978
Прежде чем читать дальше, скажите, почему эти два пункта различаются, в одном предложении.
COUNT(*) считает строки. COUNT(Composer) подсчитывает строки, в которых этот столбец действительно содержит значение. 978 треков не имеют записи композитора, что составляет 28% каталога. Ничто не содержало ошибок, ничто вас не предупреждало, и любой отчет, который вы создаете, сгруппированный по композитору, молча описывает остальные 72%. Этот разрыв и есть то, что NULL в SQL вот-вот, и встретить его здесь, в игрушечной базе данных, гораздо дешевле, чем встретиться с ним перед клиентом.
Таблица «Клиент» имеет такую же форму отверстия. Из 59 клиентов только у 10 зарегистрирована компания и только у 30 — государство. Пробел — это факт сбора данных, а не ошибка, которую нужно скрыть.
7. Посмотрите, как 412 строк превращаются в 2240.
Самая дорогостоящая ошибка SQL — это соединение, которое незаметно умножает строки, и эта база данных покажет вам это в одной строке.
SELECT COUNT(*) AS rows_after_join
FROM Invoice i
JOIN InvoiceLine l ON l.InvoiceId = i.InvoiceId;
rows_after_join
---------------
2240
Вы начали с таблицы, содержащей 412 счетов-фактур, и получили 2240 строк. Ничего не сломано. В каждом счете-фактуре есть несколько строк, по одной на каждую купленную дорожку, поэтому объединение строк в счета-фактуры повторяет счет-фактуру один раз для каждой строки. Среднее значение: 2240 ÷ 412 = 5,4 трека на продажу.
Опасность заключается в том, что произойдет дальше. Писать SUM(i.Total) против этого объединенного результата, и общая сумма каждого счета добавляется один раз в строке, поэтому счет из 5,4 строк учитывается 5,4 раза, и ваш показатель дохода оказывается в несколько раз завышенным. Это будет похоже на правдоподобное число. Ничто вас не предупредит.
Теперь вместо этого представьте свои собственные рабочие данные: заказы и строки заказов, билеты и комментарии к ним, пациенты и посещения. Какая пара в вашем мире способна умножаться, и кто-нибудь когда-нибудь суммировал по ней деньги? Инстинкт проверки количества строк до и после каждого соединения — единственная привычка, которой лучше всего обучает эта база данных.
Полное до и после
Оба раза цель одна: узнать, как выглядят продажи в магазине.
До
-- One file, one table, exported to a spreadsheet.
SELECT * FROM Invoice;
412 строк идентификаторов счетов, дат и итогов. Вы можете суммировать их, сортировать и фильтровать. Вы не можете сказать, кто купил, где они живут, что они купили или превышает ли средний заказ в одной стране, чем в другой, потому что ни один из этих фактов не указан в этой таблице. Каждый интересный вопрос находится на расстоянии одного стола.
после
-- Three tables, joined on their keys, one row per country.
SELECT c.Country,
COUNT(DISTINCT i.InvoiceId) AS invoices,
COUNT(*) AS lines_sold,
ROUND(SUM(l.UnitPrice * l.Quantity), 2) AS revenue
FROM Invoice i
JOIN Customer c ON c.CustomerId = i.CustomerId
JOIN InvoiceLine l ON l.InvoiceId = i.InvoiceId
GROUP BY c.Country
ORDER BY revenue DESC
LIMIT 5;
Country invoices lines_sold revenue
------- -------- ---------- -------
USA 91 494 523.06
Canada 56 304 303.96
France 35 190 195.1
Brazil 35 190 190.1
Germany 28 152 156.48
Прочитайте, что изменилось. COUNT(DISTINCT i.InvoiceId) для США по-прежнему указано 91, что соответствует предыдущему результату для двух таблиц, поскольку DISTINCT отменяет умножение для этого одного столбца. COUNT(*) теперь сообщает о 494 строках, что является умноженным числом и является правильным ответом на другой вопрос. А доход суммируется по ценам строк, а не по итоговым суммам счетов, поэтому двойной учет невозможен. Три столбца, три разных зерна — все правильно, потому что каждое выбрано сознательно.
Что пошло не так и как это исправить
Пять вещей, которые останавливают людей именно на этой странице.
Загрузка сохранена в виде текстового файла. Некоторые браузеры переименовывают Chinook_Sqlite.sqlite к .txtили откройте его на экране в виде стены символов. Щелкните ссылку правой кнопкой мыши и используйте «Сохранить ссылку», а не щелкайте ее левой кнопкой мыши. Если он уже сохранен неправильно, переименуйте файл обратно, и он откроется нормально, потому что расширение никогда не делало его базой данных.
«Файл не является базой данных». Почти всегда это означает, что вы загрузили веб-страницу, а не файл, и преимуществом является размер: реальный файл Чинук имеет размер около 1 МБ, а страница с ошибкой HTML — несколько килобайт. Сначала проверьте размер файла, а затем загрузите его еще раз.
Имена таблиц не будут соответствовать вашему запросу. «Чинук» использует имена в единственном числе, Invoice и не Invoices. Нортвинд использует множественное число, Orders и Customers. Учебники постоянно смешивают эти два понятия. Если вы получили сообщение «нет такой таблицы», прочитайте список на боковой панели, а не руководство.
Пробелы в имени таблицы. У Нортвинд есть стол, который буквально называется Order Details. Запишите это в двойных кавычках, SELECT * FROM "Order Details"или SQL считывает пробел как конец имени.
Ваши изменения не сохраняются. Браузер БД сохраняет изменения в памяти до тех пор, пока вы не нажмете «Записать изменения». Закройте без него, и ваш новый стол исчезнет. Это ловит всех один раз, и только один раз.
Почему практика с реальной базой данных работает
Причин две, и обе изучаются, а не фольклор.
Во-первых, почему база данных, а не файл. Реляционная модель определяет данные как набор таблиц, связи между которыми определяются общими значениями в обычных столбцах, а не указателями или порядком расположения строк (Кодд, 1970, Коммуникации ACM, 13(6), 377–385). Вот и вся причина, по которой ключ работает: CustomerId в счете-фактуре что-то значит только потому, что оно взято из того же пула значений, что и CustomerId в Клиенте. У одного CSV нет второго пула, поэтому объединению, центральной операции модели, не над чем работать. Вы не можете реализовать эту идею на данных, которые ее не содержат.
Во-вторых, почему выполнение запросов важнее их чтения. Извлечение ответа из памяти обеспечивает значительно лучшее долговременное запоминание, чем повторное чтение того же материала, и с течением времени разрыв скорее увеличивается, чем сужается (Краснее & выбирать карпа, 2006, Психологическая наука, 17(3), 249–255). Ввод соединения самостоятельно и прогнозирование количества строк — это поиск. Смотрю учебник типа перечитываю. Именно поэтому на этой странице вас постоянно просили дать ответ, прежде чем показывать его, поскольку первая попытка улучшает запоминание правильного ответа, даже если попытка ошибочна (Бисра, Лю, Несбит, Салими и Винн, 2018, Обзор педагогической психологии, 30(3), 703–725).
Использование этого в вашем собственном проекте
Не пытайтесь выучить все 11 таблиц. Никто не держит в голове схему, и именно попытки люди бросают на второй день. Вместо этого сделайте это по порядку.
- Каждый раз сначала запускайте запрос на подсчет количества строк вы открываете любую базу данных, свою или клиента. Это занимает десять секунд, и это единственное доказательство того, что вещь завершена.
- Изучайте две таблицы одновременно, и только пара, которая вам нужна для одного вопроса. Счет-фактура и ответы клиента «кто покупает». Это работа на целый вечер, и этого достаточно.
- Подсчитайте строки до и после каждого соединения. Если число выросло, скажите вслух, почему оно выросло, прежде чем писать еще одну строчку. Это привычка, которая окупает все упражнения.
- Сначала напишите один вопрос в день в предложении, прописью, то переведите. Вопрос «Какая страна тратит больше всего на заказ» лучше, чем открывать инструмент и ковыряться в нем.
- Сохраните рабочий файл с сработавшими запросами. Через три недели это становится тем, из чего вы клеите, и это начало портфолио.
Если у вас под рукой есть бумага, один дополнительный рисунок стоит пяти минут. Нарисуйте четыре встреченные вами таблицы: «Клиент», «Счет», «Строка счета» и «Отслеживание» в виде четырех прямоугольников, затем проведите линию между каждой парой и напишите в этой строке ключевой столбец. Получающий InvoiceLine посередине, касаясь как «Счета», так и «Трека», — момент, когда цифра 412 становится 2240, перестает быть сюрпризом.
Все на одном экране
Это лист поиска. Закройте правую колонку, проработайте левую и произнесите каждый ответ вслух, прежде чем проверять его.
| вещь | Что это такое или что оно делает |
|---|---|
| образец базы данных | Один файл, содержащий множество таблиц, которые уже правильно ссылаются друг на друга. |
| Почему не один CSV | Для соединений, зернистости и согласования требуется вторая таблица. В файле нет второй таблицы. |
| Чинук | По умолчанию для новичков. Один файл SQLite размером 1 МБ, 11 таблиц, без настройки. |
| Нортвинд | Та же легкость, гораздо больше рядов. Сборка SQLite поставляется с 16 282 заказами. |
| Сакила | Требуется работающий MySQL. Не работает на SQLite. |
| Доказательный запрос | SELECT 'T', COUNT(*) FROM T UNION ALL ... Строки учитываются для каждой таблицы одновременно. |
| ключ | Столбец, значения которого взяты из того же пула, что и столбец в другой таблице. |
JOIN ... ON a.id = b.id | Объединяет строки из двух таблиц, где значения ключей совпадают. |
| Умножение строк | 412 счетов, объединенных в 2240 строк, возвращают 2240 строк. Каждый счет повторяется один раз в строке. |
| Денежная ловушка | При суммировании общей суммы счета по объединенной таблице строк она учитывается один раз в каждой строке. |
COUNT(DISTINCT id) | Подсчитывает каждый счет еще раз после того, как соединение повторило его. |
COUNT(*) против COUNT(col) | Строки против присутствующих значений. 3503 трека, 2525 композиторов, 978 заготовок. |
| «Файл не является базой данных» | Вы загрузили веб-страницу. Проверьте размер: 1 МБ — хорошо, несколько КБ — нет. |
| Стол с пространством | Цитирую: FROM "Order Details". |
| Запись изменений | Браузер БД сохраняет изменения в памяти до тех пор, пока вы его не нажмете. Тогда они спасаются. |
Еще одна мысль, и мне бы искренне хотелось услышать ответы других людей. В первый раз, когда соединение умножило мои строки, итоговое значение было неверным по причине, которую я не мог объяснить, и я провел час, убежденный, что данные были повреждены, а не в том, что я задал неправильный вопрос. Какое первое число вы не смогли согласовать и что за ним оказалось?
Ссылки
- Кодд, EF (1970). Реляционная модель данных для крупных общих банков данных. Коммуникации ACM, 13(6), 377–387.
- Рёдигер, Х.Л., и Карпике, Дж.Д. (2006). Улучшенное обучение с помощью тестов: прохождение тестов на память улучшает долгосрочное запоминание. Психологическая наука, 17(3), 249–255.
- Бисра К., Лю К., Несбит Дж. К., Салими Ф. и Винн П. Х. (2018). Побуждение к самообъяснению: метаанализ. Обзор педагогической психологии, 30(3), 703–725.
SQL для аналитиков состоит из 458 страниц, каждый запрос читается построчно простыми словами, с практическими вопросами, в которых печатается ответ и причина, по которой он правильный.
SQL для аналитиков, 19 $ →тот SQL-практикум передает вам один выполняемый запрос за раз и просит ввести его самостоятельно, о чем и идет исследование выше. Курс SQL это более полный путь: уроки, карточки и действующая база данных на вкладке браузера, так что вы можете практиковаться, пока идет загрузка.
Откройте SQL-практикум →