«В этой статье представлен набор сложных вопросов для собеседования по SQL, подходящих для любого собеседования с разработчиком программного обеспечения. Уверенное понимание концепций баз данных SQL является важным навыком для каждого инженера-программиста, который имеет большое значение во время собеседований. В большинстве сценариев собеседований вы можете ожидать, что вам будет поручено составить сложные запросы, включающие различные соединения. Ответив на эти вопросы, вы будете лучше подготовлены к более эффективной подготовке. Давайте углубимся прямо в суть!»
Примечание. Если вы готовитесь к собеседованию по SQL, вот полное руководство по подготовке и успешному прохождению собеседования: Grokking the SQL Interview.
В этой книге рассматриваются распространенные вопросы на собеседованиях по Java:
Интервью по SQL и базам данных
Объединения, запросы и индексы
Группировка, агрегирование и дата-время
Хранимые процедуры и триггеры
Транзакции и оконные функции
Глубокое погружение в популярные темы SQL.
Как найти повторяющиеся записи в таблице базы данных?
Чтобы найти повторяющиеся записи в таблице базы данных, вам необходимо подтвердить определение дубликатов. Например, в приведенной ниже таблице контактов, которая должна хранить имя и номер телефона контакта, запись считается дубликатом, если имя и номер телефона одинаковы, но уникальны, если любое из них различается.
Проблемы дубликатов в базах данных возникают, когда у вас нет первичного ключа или уникального ключа в базе данных, и поэтому рекомендуется иметь ключевой столбец в таблице. В любом случае, найти повторяющиеся записи в таблице легко, используя предложение group by ANSI SQL.
В следующем запросе мы использовали запрос SELECT, чтобы выбрать все записи из таблицы Контакты. Здесь Джеймс, Джонни, Гарри и Рон дублируются четыре раза.
mysql> select * from Contacts; +-------+----------+ | name | phone | +-------+----------+ | James | 80983243 | | Johnny | 67543212 | | Harry | 12341234 | | Ron | 44446666 | | James | 80983243 | | Johnny | 67543212 | | Harry | 12341234 | | Ron | 44446666 | | James | 80983243 | | Johnny | 67543212 | | Harry | 12341234 | | Ron | 44446666 | | James | 80983243 | | Johnny | 67543212 | | Harry | 12341234 | | Ron | 44446666 | | Ruby | 8965342 | | Ruby | 6888342 | +-------+----------+ 18 rows in set (0.00 sec)
Следующий запрос SELECT будет находить дубликаты записей только на основе имени, что может быть неверно, если хранятся два контакта с одинаковыми, но разными номерами, поскольку в следующем наборе результатов Ruby отображается как дубликат, что неправильно.
mysql> select name, count(name) from contacts group by name; +-------+-------------+ | name | count(name) | +-------+-------------+ | Harry | 4 | | James | 4 | | Johnny | 4 | | Ron | 4 | | Ruby | 2 | +-------+-------------+ 5 rows in set (0.00 sec)
Это правильный способ поиска повторяющихся контактов: он выглядит имя и номер телефона и печатает дубликат только в том случае, если имя и телефон совпадают.
mysql> select name, count(name) from contacts group by name, phone; +-------+-------------+ | name | count(name) | +-------+-------------+ | Harry | 4 | | James | 4 | | Johnny | 4 | | Ron | 4 | | Ruby | 1 | | Ruby | 1 | +-------+-------------+
имеющее предложение в SQL-запросе будет фильтровать повторяющиеся записи из уникальных записей. Как и в следующем запросе, он выводит все повторяющиеся записи и количество повторений в таблице.
mysql> select name, count(name) as times from contacts group by name, phone having times>1; +-------+-------+ | name | times | +-------+-------+ | Harry | 4 | | James | 4 | | Johnny | 4 | | Ron | 4 | +-------+-------+ 4 rows in set (0.00 sec)
Это все, что касается как найти повторяющиеся записи в таблице.
Разница между усечением и удалением в SQL?
Обрезка и удаление — популярные темы собеседований, и на собеседованиях по SQL всегда возникают вопросы по этим командам.
Это важный момент, который следует понимать перед использованием усечения или удаления в производственной среде или написанием любого сценария, который удаляет данные из таблиц.
1.усечение — быстрое удаление — медленное.
2. truncate не регистрирует журналы удаления по строкам.
3. Откат возможен с помощью удаления, а не с помощью усечения, пока это специально не поддерживается поставщиком.
4. truncate не запускает триггер, а delete делает.
5. Не удаляйте, а обрезайте, когда дело доходит до очистки таблиц.
6. Усекать столбец идентификаторов сброса в таблице, если таковой имеется, удаление — нет.
7. усечение — это DDL, а удаление — DML (используйте это при написании экзамена)
8. truncate не поддерживает предложениеwhere, а delete поддерживает.
Итак, наконец, если у вас есть таблица с огромными данными и вы хотите ее очистить, не удаляйте, а обрежьте ее.
Разница между ключом-кандидатом и первичным ключом?
В чем разница между первичным ключом и ключом-кандидатом — еще один популярный вопрос на собеседованиях по SQL и базам данных, который время от времени появляется на различных собеседованиях по программированию?
Прежде чем увидеть разницу между ключом-кандидатом и первичным ключом, давайте посмотрим на некоторые сходства между ними в пунктах списка.
1. Уникальная идентификация. И первичный ключ, и ключ-кандидат могут однозначно идентифицировать записи в таблице базы данных.
2. Ограничения. И первичный ключ, и ключ-кандидат имеют ограничения UNIQUE и NOT NULL.
3. Структура. Первичный ключ или ключи-кандидаты могут представлять собой либо один столбец, либо комбинацию нескольких столбцов в таблице.
Вот хорошая таблица, в которой объясняется пара потенциальных ключей (столбцов, которые могут стать первичными ключами) и то, как другие ключи становятся альтернативными ключами после выбора первичного ключа.
В этой таблице Roll_No, Name и Branch являются кандидатами на ключи, поскольку они имеют уникальные значения, но на самом деле Name может дублироваться, а Branch также может дублироваться, но Roll_No будет уникальным, поэтому он выбран в качестве первичного ключа.
Как найти вторую по величине или вторую максимальную зарплату Сотрудника?
Как найти вторую по величине или вторую максимальную зарплату сотрудника — один из наиболее часто задаваемых вопросов на собеседовании по SQL.
мы напишем SQL-запросы, чтобы получить вторую по величине зарплату среди сотрудников. Прежде чем писать запрос, полезно ознакомиться со схемой, а также с данными в таблице. Вот таблица «Сотрудники», которую мы будем использовать в этом примере SQL:
mysql> SELECT * FROM Employee; +--------+----------+---------+--------+ | emp_id | emp_name | dept_id | salary | +--------+----------+---------+--------+ | 1 | James | 10 | 2000 | | 2 | Jack | 10 | 4000 | | 3 | Henry | 11 | 6000 | | 4 | Tom | 11 | 8000 | +--------+----------+---------+--------+
Подзапросы в SQL — отличный инструмент для такого рода сценариев: здесь мы сначала выбираем максимальную зарплату, а затем еще одну максимальную, исключая результат подзапроса.
mysql> SELECT max(salary) FROM Employee WHERE salary NOT IN (SELECT max(salary) FROM Employee); +-------------+ | max(salary) | +-------------+ | 6000 | +-------------+ 1 row IN SET (0.00 sec)
Вот еще один SQL-запрос для поиска второй по величине зарплаты с использованием подзапроса и оператора ‹ вместо предложения IN:
mysql> SELECT max(salary) FROM Employee WHERE salary < (SELECT max(salary) FROM Employee); +-------------+ | max(salary) | +-------------+ | 6000 | +-------------+ 1 row IN SET (0.00 sec)
Вторая максимальная зарплата с использованием ключевого слова LIMIT базы данных MYSQL,
Ключевое слово LIMIT базы данных MySQL немного похоже на ключевое слово TOP базы данных SQL Server и позволяет брать только определенные строки из набора результатов. Если вы посмотрите на пример SQL ниже, он очень похож на пример ключевого слова SQL Server TOP.
mysql> SELECT salary FROM (SELECT salary FROM Employee ORDER BY salary DESC LIMIT 2) AS emp ORDER BY salary LIMIT 1; +--------+ | salary | +--------+ | 6000 | +--------+ 1 row IN SET (0.00 sec)
12 примеров SQL-запросов и практические вопросы для технических собеседований
Пришло время писать SQL-запросы. В этом разделе содержатся вопросы для собеседования по SQL-запросам, которые проверят многие ваши навыки SQL, такие как соединения, группировка и агрегирование данных, то, как вы обрабатываете значения NULL в SQL и т. д.
На собеседовании довольно часто задают вопросы о сотруднике и отделе, вот таблицы, а ниже вопросы и ответы.
- Можете ли вы написать SQL-запрос, чтобы показать сотрудников (имена), у которых зарплата выше, чем у их руководителя?
-- Employees (names) who have a bigger salary than their manager SELECT a.emp_name FROM Employee a JOIN Employee b ON a.mngr_id = b.emp_id WHERE a.salary > b.salary;
2. Напишите SQL-запрос, чтобы найти сотрудников с самой большой зарплатой в своем отделе.
-- Employees who have the biggest salary in their Department SELECT a.emp_name, a.dept_id FROM Employee a JOIN (SELECT a.dept_id, MAX(salary) as max_salary FROM Employee a JOIN Department b ON a.dept_id = b.dept_id GROUP BY a.dept_id) b ON a.salary = b.max_salary AND a.dept_id = b.dept_id;
3. Написать SQL-запрос, чтобы получить список отделов, в которых работает менее трех человек?
-- Departments that have less than 3 people in it SELECT dept_id, COUNT(emp_name) as 'Number of Employee' FROM Employee GROUP BY dept_id HAVING COUNT(emp_name) < 3;
4. Напишите SQL-запрос, чтобы просмотреть все отделы и количество сотрудников в них.
-- All Department along with the number of people there SELECT b.dept_name, COUNT(a.dept_id) as 'Number of Employee' FROM Employee a FULL OUTER JOIN Department b ON a.dept_id=b.dept_id GROUP BY b.dept_name;
5. Можете ли вы написать SQL-запрос, чтобы просмотреть всех сотрудников, у которых нет менеджера в том же отделе?
-- Employees that don't have a manager in the same department SELECT a.emp_name FROM Employee a JOIN Employee b ON a.mngr_id = b.emp_id WHERE a.dept_id != b.dept_id;
6. Можете ли вы написать SQL-запрос, чтобы вывести список всех отделов и их общую зарплату?
-- All Department along with the total salary there SELECT b.dept_name, SUM(a.salary) as 'Total Salary' FROM Employee a FULL OUTER JOIN Department b ON a.dept_id = b.dept_id GROUP BY b.dept_name;
Это все, что есть в этой статье о примерах SQL-запросов, практических вопросах и вопросах на собеседовании по SQL-запросам.
Если вам нужна помощь с собеседованием с Java-разработчиком, вот рекомендации.
Спасибо за прочтение
- 👏 Пожалуйста, аплодируйте истории и подписывайтесь на меня 👉(можно дать 50 хлопков)
- 📰 Прочтите больше контента на моем Среднем(более 30 историй об интервью с разработчиком Java)
- Найдите мою книгу Руководство по прохождению собеседования с разработчиком Java здесь Gumroad(PDF Формат >) и Amazon (электронная книга Kindle).
- 🔔 Следуйте за мной: LinkedIn | Твиттер | Подстек | Фейсбук