Перевод первой части статьи «Top SQL Interview Questions».
SQL это один из самых широко используемых языков. Его применяют в своих проектах практически все самые известные компании, например, Uber, Netflix, Airbnb. Большинство специализаций в сфере разработки требуют знания языка SQL на том или ином уровне, потому что чаще всего разработчикам приходится подключаться к базам данных. И тут уже не важно, являетесь вы Python-разработчиком, тестировщиком, веб-разработчиком, администратором базы данных или специалистом по данным: изучать SQL все равно придется.
В связи с этим на всех технических собеседованиях 30-40% вопросов связаны с SQL. В этой статье мы разберем первые 15 из 30 вопросов, которые встречаются чаще всего:
- Поясните, в чем разница между выражениями HAVING и WHERE
- Что такое SQL?
- Расскажите о разных видах команд SQL.
- Что такое ограничение по умолчанию?
- Что такое ограничение уникальности?
- Как бы вы нашли вторую по величине зарплату в этой таблице?
- Что такое первичный ключ?
- Что такое внешний ключ?
- Что такое индекс?
- Расскажите о видах индексов.
- Поясните разницу между кластерными и некластерными индексами.
- Расскажите, чем отличаются SQL и PL/SQL.
- Как вы понимаете символьные функции?
- Что такое AUTO_INCREMENT?
- Чем отличаются команды DELETE и TRUNCATE?
1. Поясните, в чем разница между выражениями HAVING и WHERE
WHERE | HAVING | |
---|---|---|
Реализовано в | Строковых операциях | Столбцовых операциях |
Относится к | Отдельной строке | Суммированной строке или группам |
Используется для | Выборки конкретных данных из определенных строк, согласно заданным условиям | Выборки всех данных и отделения тех из них, которые соответствуют заданным условиям |
Агрегатные функции | Не может содержать | Может содержать |
Операторы | Может использоваться с SELECT, UPDATE и DELETE | Не может использоваться без оператора SELECT |
Выражение GROUP BY | Идет после выражения WHERE | Идет перед выражением HAVING |
2. Что такое SQL?
SQL расшифровывается как «Structured Query Language» — «язык структурированных запросов». Этот язык используется для взаимодействия с базами данных. Согласно ANSI (Американский национальный институт стандартов) SQL является стандартным языком запросов для систем управления реляционными базами данных и используется для поддержки этих баз и различных манипуляций с данными. В общем, это язык, используемый для создания и удаления баз данных, выборки и изменения строк таблиц и множества других операций.
3. Расскажите о разных видах команд SQL
Операторы определения данных (англ. Data Definition Language, DDL)
DDL — это часть SQL, которая служит для определения структуры данных в начальном состоянии, когда база данных только создается. Операторы определения данных используются, главным образом, для создания и реструктуризации объектов базы данных. К этим операторам относятся CREATE, ALTER и DROP.
CREATE служит для создания объектов базы данных, ALTER — для их изменения, DROP — для удаления.
Операторы манипуляции данными (англ. Data Manipulation Language, DML)
DML используется для работы с уже существующими данными, содержащимися в базе данных. С помощью этих операторов пользователи могут получать данные из базы и совершать над ними какие-то манипуляции. К этим операторам относятся SELECT, INSERT, UPDATE, DELETE.
Оператор INSERT позволяет вносить данные в базу данных, UPDATE — обновлять их, DELETE — удалять данные из базы.
Операторы определения доступа к данным (англ. Data Control Language, DCL)
DCL используется для контроля доступа к данным в базе данных. Команды DCL обычно служат для создания объектов, имеющих отношение к доступу пользователей к базе, а также к распределению разрешений между пользователями. Для этих операций используются операторы GRANT и REVOKE. Первый служит для «выдачи» разрешений, а второй — для их отзыва.
Операторы управления транзакциями (англ. Transaction Control Language, TCL)
TCL используется для контроля изменений, осуществленных при помощи DML. Также с помощью TCL происходит объединение операторов в логические транзакции. К операторам управления транзакциями относятся COMMIT, ROLLBACK, SAVEPOINT, BEGIN, TRANSACTION.
4. Что такое ограничение по умолчанию?
Ограничения используются для установки определенных правил обработки данных и указания типов данных, которые могут попадать в таблицу. Это что касается ограничений вообще. Теперь давайте рассмотрим ограничения по умолчанию.
Ограничение по умолчанию (DEFAULT) используется для определения дефолтного значения для столбца, которое будет автоматически добавляться во все новые записи, если нужное значение не будет задано явно. Например, если мы установим ограничение по умолчанию для столбца E_salary и укажем, что дефолтное значение — 85000, оно появится во всех ячейках этого столбца, за исключением случаев, когда при добавлении записи явно указывалось другое значение.
Теперь давайте посмотрим, как устанавливается значение по умолчанию. Начнем с создания новой таблицы и добавим ограничения по умолчанию для ее столбцов.
create table stu1(s_id int, s_name varchar(20), s_marks int default 50) select *stu1
Результат:
Теперь давайте добавим записи.
insert into stu1(s_id,s_name) values(1,’Sam’) insert into stu1(s_id,s_name) values(2,’Bob’) insert into stu1(s_id,s_name) values(3,’Matt’) select *from stu1
Результат:
5. Что такое ограничение уникальности?
Ограничения уникальности (UNIQUE) используются для обеспечения уникальности всех значений в столбце (т. е., чтобы все значения непременно были разными). Например, если мы установим ограничение уникальности для столбца e_name, каждая запись в этом столбце будет иметь уникальное значение.
Для начала давайте создадим таблицу.
create table stu2(s_id int unique, s_name varchar(20))
А теперь добавим в нее записи.
insert into stu2 values(1,’Julia’) insert into stu2 values(2,’Matt’) insert into stu2 values(3,’Anne’)
Результат:
6. Как бы вы нашли вторую по величине зарплату в этой таблице?
select * from employee select max(e_salary) from employee where e_salary not in (select max(e_salary) from employee)
Результат:
7. Что такое первичный ключ?
Первичный ключ используется в качестве уникального идентификатора для всех записей в таблице. Он не моет иметь значение NULL, кроме того, его значение должно быть уникальным. Первичный ключ может состоять из одного или нескольких полей.
Давайте напишем запрос для демонстрации использования первичного ключа в таблице Employee:
// CREATE TABLE Employee ( ID int NOT NULL, Employee_name varchar(255) NOT NULL, Employee_designation varchar(255), Employee_Age int, PRIMARY KEY (ID) );
8. Что такое внешний ключ?
Внешний ключ это атрибут или набор атрибутов, ссылающийся на первичный ключ в какой-нибудь другой таблице. В общем, он используется для связи между двумя таблицами.
Давайте создадим внешний ключ для этой таблицы:
CREATE TABLE Orders ( OrderID int NOT NULL, OrderNumber int NOT NULL, PersonID int, PRIMARY KEY (OrderID), FOREIGN KEY (PersonID) REFERENCES Persons(PersonID) )
9. Что такое индекс?
Индексы помогают ускорить поиск в базе данных. Если в выражении WHERE не задан индекс никакого столбца, SQL-сервер в поиске соответствия будет проверять каждую строку во всей таблице. Если у вас много данных, эта операция может оказаться довольно медленной.
Индексы используются для поиска всех строк, совпадающих по каким-то столбцам, а затем уже в этих выборках ведется поиск нужных данных.
Синтаксис:
CREATE INDEX INDEX_NAME ON TABLE_NAME (COLUMN)
10. Расскажите о видах индексов
Простые индексы. Создаются только для одного столбца таблицы.
Синтаксис:
CREATE INDEX index_name ON table_name(column_name);
Составные индексы. Создаются для двух или большего количества столбцов таблицы.
Синтаксис:
CREATE INDEX index_name ON table_name (column1, column2)
Уникальные индексы. Используются для поддержания целостности данных таблицы. Они не дают вставлять в таблицу несколько значений.
Синтаксис:
CREATE UNIQUE INDEX index ON table_name(column_name)
11. Поясните разницу между кластерными и некластерными индексами
Кластерный индекс используется для сортировки данных в строках по их ключевым значениям. Кластерный индекс напоминает телефонный справочник. Мы можем открыть справочник на David (например, в поисках «David, Thompson») и найти информацию обо всех Дэвидах, по порядку. Поскольку данные расположены друг за другом, это помогает выбирать их в запросах с указанием диапазона. Также кластерный индекс имеет отношение к тому, как, собственно, хранятся данные. В таблице может быть только один кластерный индекс.
Некластерный индекс хранит данные в одном месте, а индексы — в другом. Этот индекс имеет указатели на расположение данных. Поскольку индекс не хранится там же, где и данные, для каждой таблицы может существовать много некластерных индексов.
Давайте рассмотрим основные различия между кластерными и некластерными индексами.
Параметры | Кластерный индекс | Некластерный индекс |
---|---|---|
Используется для | Сортировки и хранения записей в памяти (физически) | Создания логического порядка для строк данных. Указатели указывают на физические файлы с данными |
Методы хранения | Хранит данные в лиственных узлах индекса | Никогда не хранит данные в лиственных узлах индекса |
Размер | Довольно большой | Сравнительно маленький |
Доступ к данным | Быстрый | Медленный |
Дополнительное дисковое пространство | Не требуется | Требуется для отдельного хранения индексов |
Тип ключа | По умолчанию первичный ключ таблицы является кластерным индексом | Может использоваться с ограничением уникальности в таблице, которая выступает в роли составного ключа |
Отличительная особенность | Улучшает производительность при получении данных | Должен создаваться в столбцах, используемых в JOIN |
12. Расскажите, чем отличаются SQL и PL/SQL
SQL | PL/SQL |
---|---|
SQL это структурированный язык запросов к базам данных. | Это язык программирования для баз данных, использующий SQL. |
SQL это отдельный запрос, который используется для выполнения команд DML и DDL. | PL/SQL это блок кодов, используемый для написания всей процедуры или функции. |
SQL это декларативный язык, ориентированный на данные. | PL/SQL это процедурный язык, ориентированный на приложение. |
Используется главным образом для манипуляций с данными. | Используется для создания приложения. |
Предоставляет возможность взаимодействия с сервером базы данных. | Не предоставляет возможности взаимодействия с сервером базы данных. |
Не может содержать в себе код PL/SQL. | Может содержать SQL, поскольку сам является расширением SQL. |
13. Как вы понимаете символьные функции?
Символьные функции используются для манипуляций с символами. К ним относятся:
UPPER
Возвращает строку в верхнем регистре.
Синтаксис:
UPPER(‘ string’)
Пример:
SELECT UPPER(‘demo string’) from String;
Результат:
DEMO STRING
LOWER
Возвращает строку в нижнем регистре.
Синтаксис:
LOWER(‘STRING’)
Пример:
SELECT LOWER (‘DEMO STRING’) from String
Результат:
demo string
INITCAP
Переводит первую букву строки в верхний регистр, оставляя всю остальную строку в нижнем.
Синтаксис:
Initcap(‘sTRING’)
Пример:
SELECT Initcap(‘dATASET’) from String
Результат:
Dataset
CONCAT
Используется для конкатениции (объединения) двух строк.
Синтаксис:
CONCAT(‘str1’,’str2’)
Пример:
SELECT CONCAT(‘Data’,’Science’) from String
Результат:
Data Science
LENGTH
Используется для получения длины строки.
Синтаксис:
LENGTH(‘String’)
Пример:
SELECT LENGTH(‘Hello World’) from String
Результат:
11
14. Что такое AUTO_INCREMENT?
AUTO_INCREMENT используется в SQL для автоматической генерации уникального номера при каждом добавлении записи в таблицу.
Поскольку первичный ключ уникален для каждой записи, мы добавляем это поле в качестве AUTO_INCREMENT поля, таким образом при каждой вставке новой записи номер будет увеличиваться автоматически.
По умолчанию значение AUTO-INCREMENT начинается с 1 и увеличивается на 1 при каждом добавлении новой записи.
Синтаксис:
CREATE TABLE Employee( Employee_id int NOT NULL AUTO-INCREMENT, Employee_name varchar(255) NOT NULL, Employee_designation varchar(255) Age int, PRIMARY KEY (Employee_id) )
15. Чем отличаются команды DELETE и TRUNCATE?
- DELETE используется для удаления одной или большего числа существующих таблиц.
- TRUNCATE удаляет все данные внутри таблицы.
Между DELETE и TRUNCATE существуют следующие различия:
- TRUNCATE — это команда DDL, а DELETE — команда DML.
- При помощи TRUNCATE мы не можем активировать триггер, а с DELETE можем.
- TRUNCATE не будет работать, если таблица содержит внешние ключи. В этом случае придется использовать DELETE.
Синтаксис команды DELETE:
DELETE FROM table_name [WHERE condition];
Пример:
select * from stu
Результат:
delete from stu where s_name=’Bob’
Результат:
Синтаксис команды TRUNCATE:
TRUNCATE TABLE Table_name;
Пример:
select * from stu1
Результат:
truncate table stu1
Результат:
Таким образом будут удалены все записи в таблице.
[customscript]techrocks_custom_after_post_html[/customscript]
[customscript]techrocks_custom_script[/customscript]
С DELETE вы конечно намудрили
Ну если тут delete с drop путают, то дальше можно не читать
Я бы задачу №6 решал примерно таким запросом: SELECT salary FROM employee ORDER BY salary DECK LIMIT 1, 1
Лучше сделать с одной группировкой, т.к. может быть несколько людей с одинаковой максимальной зарплатой
select distinct salary from salary
order by salary desc limit 1, 1