Запросы с использованием SQL
Введено| English | Значение |
|---|---|
| SQL/ˌes kjuː ˈel/ | SQL |
| JOIN/dʒɔɪn/ | JOIN |
| GROUP BY/ɡruːp baɪ/ | GROUP BY |
Два разных курса имеют одинаковое название
- Два курса называются «Робототехника». Группировка только по названию объединяет их записи и скрывает тот факт, что это разные курсы.
- SQL описывает желаемый результат данных. Проверьте идентичность строк и ожидаемый вывод, прежде чем доверять правдоподобному подсчету.
Проследите связь при использовании JOIN
- JOIN объединяет строки на основе связи, такой как
e.course_id = c.id. Явно опишите предполагаемую связь. - Кросс-джойн (cross join) сопоставляет каждую строку одной стороны с каждой строкой другой. В SQLite несвязанный джойн может создать такое произведение; другие системы SQL могут отвергнуть отсутствие условий джойна.
В SQLite неограниченное соединение связывает три курса с тремя записями о записи. Сколько пар оно может образовать?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Перекрестное произведение содержит 3 × 3 строк, до любого последующего фильтрации.
Сохраните курсы без записей
- Левое соединение (left join) сохраняет все курсы, включая тот, у которого нет совпадающей записи. Поля несоответствующей записи будут иметь значение NULL.
- Подсчитайте
e.student_id, который исключает NULL, вместоCOUNT(*), который также считает сохраненную несоответствующую строку. Пустой курс должен показать ноль.
Какое выражение правильно считает нулевые записи для курса, присоединенного левым соединением без совпадений?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
COUNT для несовпадающего поля с допускаемым значением NULL исключает NULL; COUNT(*) считает сохраненную строку.
Запустите запрос с известными ответами
- Выполните этот полный скрипт в локальной базе данных SQLite. Его два курса «Робототехника» имеют разные ID, а «Искусство» не имеет записей.
- GROUP BY группирует по обоим: ID курса и название. Ожидаемые строки —
(7, Robotics, 1),(8, Robotics, 2)и(9, Art, 0).
CREATE TABLE courses (id INTEGER PRIMARY KEY, title TEXT NOT NULL);
CREATE TABLE enrolments (student_id INTEGER, course_id INTEGER);
INSERT INTO courses VALUES (7, 'Robotics'), (8, 'Robotics'), (9, 'Art');
INSERT INTO enrolments VALUES (1, 7), (1, 8), (2, 8);
SELECT c.id, c.title, COUNT(e.student_id) AS enrolled
FROM courses AS c
LEFT JOIN enrolments AS e ON e.course_id = c.id
GROUP BY c.id, c.title
ORDER BY c.id;
Заполните часть запроса для группировки по идентификатору и названию курса: ____ c.id, c.title
Difficulty 1/5 · 100 coins + a small bonus on first completion today
GROUP BY определяет группы. Включение ID разделяет курсы с одинаковыми названиями.
Какие результаты подсчета записей вернет полный запрос для ID курсов 7, 8 и 9?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
В выборке одно совпадение для 7, два для 8 и none для 9.
Фильтрация строк и групп на разных этапах
WHEREфильтрует входные строки перед группировкой.HAVINGфильтрует группы, используя условие, например,COUNT(e.student_id) >= 2.- В этом примере добавление условия HAVING перед ORDER BY вернет только курсы 8. Фильтрация
e.student_idв WHERE может удалить несовпадающие строки, которые вы intended оставить.
Какой оператор фильтрует группы, содержащие не менее двух зачисленных студентов?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
HAVING применяет условие к группам; WHERE фильтрует входные строки.
Объясните WHERE и HAVING на примере подсчета курсов.
Difficulty 3/5 · 200 coins + a small bonus on first completion today
WHERE фильтрует строки; HAVING проверяет количество в каждой группе.
Используйте крайние случаи для проверки результата
- Проверяйте повторяющиеся названия, нулевые совпадения и множественные совпадения с известными счетами. Результата, который выглядит разумным, недостаточно.
- Объясните выбранные поля, условие соединения, группировку и подсчет. Решите, являются ли дублирующиеся записи отношений допустимыми или они должны быть предотвращены схемой.
Присоединяйтесь по связи, группируйте по идентификатору и подсчитывайте желаемое. Небольшой известный набор данных облегчает выявление ошибок в запросах.
Достаточно правдоподобного подсчета, чтобы считать SQL-запрос корректным.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Сравните известные ожидаемые строки, включая нулевые совпадения и повторяющиеся названия.
Группировка только по названию сохраняет два курса робототехники отдельными.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Равные заголовки образуют одну группу. Сгруппируйте также по идентичности курса.