«В этой статье представлен набор сложных вопросов для собеседования по 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 и т. д.

На собеседовании довольно часто задают вопросы о сотруднике и отделе, вот таблицы, а ниже вопросы и ответы.

  1. Можете ли вы написать 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-разработчиком, вот рекомендации.

Интервью о Java

Интервью о Java — Том 2

Интервью о Spring Boot

Спасибо за прочтение

  • 👏 Пожалуйста, аплодируйте истории и подписывайтесь на меня 👉(можно дать 50 хлопков)
  • 📰 Прочтите больше контента на моем Среднем(более 30 историй об интервью с разработчиком Java)
  • Найдите мою книгу Руководство по прохождению собеседования с разработчиком Java здесь Gumroad(PDF Формат >) и Amazon (электронная книга Kindle).
  • 🔔 Следуйте за мной: LinkedIn | Твиттер | Подстек | Фейсбук