← Все курсы · Курс SQL · Все руководства

Где взять образец базы данных для практики SQL

Одиннадцать таблиц на вашем компьютере за пять минут и запрос, подтверждающий их загрузку · Часть Analyst Prep Kit

К , аналитик данных · Опубликовано

К концу этой страницы у вас на компьютере будет реальная база данных с 11 таблицами, 3503 треками и 412 счетами клиентов, и вы выполните запрос, который докажет, что все таблицы доставлены в целости и сохранности. Затем вы выполните объединение двух таких таблиц, чему вас никогда не научит одна таблица. Это занимает около пяти минут и ничего не стоит.

Вот чем на самом деле заняться сегодня. Загрузите файл базы данных Чинук, откройте его в браузере DB для SQLite и запустите один запрос, который подсчитывает строки в каждой таблице. Если значения совпадают с указанными ниже, у вас есть рабочая среда, и вы можете прекратить ее покупать.

Краткая версия: получить Chinook_Sqlite.sqlite, откройте его, посчитайте строки, затем соедините две таблицы. Нортвинд и Сакила — два других имени, которые вы увидите, а ниже есть таблица, в которой указано, когда каждое из них является правильным выбором.

Причина, по которой пример базы данных превосходит уже имеющийся у вас CSV, заключается в одной идее: она дает представление о картине.

One table against many linked tables Two panels side by side. The left panel holds a single grid of rows and columns, standing alone with nothing attached to it. The right panel holds four smaller grids arranged around each other. A highlighted column at the edge of each small grid is joined by a solid line to a matching highlighted column on a neighbouring grid, so all four grids are wired together into a connected shape. The left panel has no lines at all, because there is nothing for a line to reach. one CSV a database
Заштрихованный столбец в каждой таблице является ключом, а строка — соединением. На другом конце линии ни один файл не имеет ничего, поэтому соединения — это единственный навык, который электронная таблица не может дать вам повторений.
Что ты будешь делать
  1. Почему одного CSV недостаточно
  2. Возьмите Чинук, тот, с которого стоит начать.
  3. Откройте его, и запрос, подтверждающий его загрузку
  4. Ваше первое соединение двух таблиц
  5. Нортвинд, Сакила и собственные данные комплекта: когда каждый прав
  6. Дыры в данных — вот суть
  7. Посмотрите, как 412 строк превращаются в 2240.
  8. Полное до и после
  9. Что пошло не так и как это исправить
  10. Почему практика с реальной базой данных работает
  11. Использование этого в вашем собственном проекте
  12. Все на одном экране
Каждое число на этой странице является реальным. Я загрузил Чинук v1.4.5 и Нортвинд 8 августа 2026 года и выполнил каждый запрос с помощью SQLite 3.51.1. Счеты, выходные данные и умножение строк — это то, что вернулось, а не то, что должно было вернуться. Если у вас еще нет программного обеспечения для работы с базами данных, Как настроить базу данных SQL — это пятнадцатиминутная версия этого шага, и эта страница начинается сразу после нее.

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 таблиц. Никто не держит в голове схему, и именно попытки люди бросают на второй день. Вместо этого сделайте это по порядку.

  1. Каждый раз сначала запускайте запрос на подсчет количества строк вы открываете любую базу данных, свою или клиента. Это занимает десять секунд, и это единственное доказательство того, что вещь завершена.
  2. Изучайте две таблицы одновременно, и только пара, которая вам нужна для одного вопроса. Счет-фактура и ответы клиента «кто покупает». Это работа на целый вечер, и этого достаточно.
  3. Подсчитайте строки до и после каждого соединения. Если число выросло, скажите вслух, почему оно выросло, прежде чем писать еще одну строчку. Это привычка, которая окупает все упражнения.
  4. Сначала напишите один вопрос в день в предложении, прописью, то переведите. Вопрос «Какая страна тратит больше всего на заказ» лучше, чем открывать инструмент и ковыряться в нем.
  5. Сохраните рабочий файл с сработавшими запросами. Через три недели это становится тем, из чего вы клеите, и это начало портфолио.

Если у вас под рукой есть бумага, один дополнительный рисунок стоит пяти минут. Нарисуйте четыре встреченные вами таблицы: «Клиент», «Счет», «Строка счета» и «Отслеживание» в виде четырех прямоугольников, затем проведите линию между каждой парой и напишите в этой строке ключевой столбец. Получающий InvoiceLine посередине, касаясь как «Счета», так и «Трека», — момент, когда цифра 412 становится 2240, перестает быть сюрпризом.

Подробнее об этом и еще что-нибудь подобное. Все инструкции находятся в одном месте на индекс направляющих: настройка, SQL, Excel, Python и навыки работы с ними.

Все на одном экране

Это лист поиска. Закройте правую колонку, проработайте левую и произнесите каждый ответ вслух, прежде чем проверять его.

вещьЧто это такое или что оно делает
образец базы данныхОдин файл, содержащий множество таблиц, которые уже правильно ссылаются друг на друга.
Почему не один 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".
Запись измененийБраузер БД сохраняет изменения в памяти до тех пор, пока вы его не нажмете. Тогда они спасаются.
Единственная привычка, которую следует сохранить. Каждый раз посчитайте строки до объединения и после него и произнесите вслух, почему число изменилось. Эта одна проверка выявляет умноженный доход, недостающие строки и случайный фильтр, которые в совокупности являются основной причиной ошибок в SQL. Если запрос прерывается таким образом, который не описан на этой странице, существует общая шлейф диагностики на предмет застревания.

Еще одна мысль, и мне бы искренне хотелось услышать ответы других людей. В первый раз, когда соединение умножило мои строки, итоговое значение было неверным по причине, которую я не мог объяснить, и я провел час, убежденный, что данные были повреждены, а не в том, что я задал неправильный вопрос. Какое первое число вы не смогли согласовать и что за ним оказалось?

Ссылки

У вас есть база данных, на которой можно попрактиковаться, и вы не знаете, что спросить у нее в первую очередь.

SQL для аналитиков состоит из 458 страниц, каждый запрос читается построчно простыми словами, с практическими вопросами, в которых печатается ответ и причина, по которой он правильный.

SQL для аналитиков, 19 $ →
У вас есть база данных. Теперь найдите повторы.

тот SQL-практикум передает вам один выполняемый запрос за раз и просит ввести его самостоятельно, о чем и идет исследование выше. Курс SQL это более полный путь: уроки, карточки и действующая база данных на вкладке браузера, так что вы можете практиковаться, пока идет загрузка.

Откройте SQL-практикум →