Karpov Flashcards

(40 cards)

1
Q

Сортировка

A

Для сортировки значений по какой-либо колонке в SQL используется оператор ORDER BY с ключевыми словами ASC (по возрастанию) или DESC (по убыванию).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Алиасы

A

При составлении SQL-запросов колонкам в результирующей таблице можно присваивать любые другие имена (их ещё называют «алиасами»). Это можно делать с помощью оператора AS:

SELECT name AS new_name
FROM table

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Функция вывода длины строки

A

Функция LENGTH выполняет довольно простую задачу — подсчитывает количество символов в поданном ей на вход значении текстового типа (текстовый тип данных ещё часто называют строкой — от англ. «string»). Иными словами, функция LENGTH измеряет длину некоторой строки в символах:

SELECT LENGTH(column) AS column_length
FROM table

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Функция вернуть часть строки

A

LEFT — возвращает первые n символов в строке:

SELECT LEFT(‘karpov.courses’, 6)

Результат:
karpov

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Функция разбить строку на части и вернуть одну из частей

A

Функция SPLIT_PART разбивает поданную ей на вход строку на несколько частей в соответствии с указанным разделителем и возвращает одну из частей.

Помимо самой строки (или колонки со значениями строкового типа) функция принимает ещё два аргумента — разделитель и порядковый номер части, которую необходимо вернуть. Посмотрите на следующий пример:

SELECT SPLIT_PART(‘karpov.courses’, ‘.’, 2)

Результат:
courses

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Способы изменения типа данных

A

1) На вход функции CAST необходимо подать имя колонки, указав через AS тип данных, к которому нужно привести все значения:

SELECT CAST(column AS VARCHAR)
FROM table

2) Также изменить тип данных можно с помощью специального синтаксиса с двумя двоеточиями («::»):

SELECT column::VARCHAR
FROM table

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

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

A

Функция CONCAT принимает на вход несколько аргументов и возвращает результат их последовательного сложения друг с другом. Хорошая аналогия — составление предложений из разных карточек со словами:

SELECT CONCAT(‘SQL’, ‘ ‘, ‘Simulator ‘, 2022)

Результат:
SQL Simulator 2022

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Функция, извлечь часть из даты (день, месяц, год и пр.)

A

SELECT DATE_PART(part, column)

На месте part необходимо в кавычках указать ту часть, которую нужно извлечь: ‘year’, ‘month’, ‘day’, ‘hour’ и т.д. На месте column следует указать нужную колонку либо конкретную дату или время. Можете самостоятельно запустить в Redash следующие запросы:

SELECT DATE_PART(‘year’, DATE ‘2022-01-12’)

Результат:
2022.00

SELECT DATE_PART(‘month’, DATE ‘2022-01-12’)

Результат:
1.00

SELECT DATE_PART(‘day’, DATE ‘2022-01-12’)

Результат:
12.00

SELECT DATE_PART(‘hour’, TIMESTAMP ‘2022-01-12 20:31:05’)

Результат:
20.00

SELECT DATE_PART(‘minute’, TIMESTAMP ‘2022-01-12 20:31:05’)

Результат:
31.00

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Функция COALESCE

A

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

SELECT COALESCE(NULL, ‘I am not NULL’ , ‘karpov.courses’)

Результат:
I am not NULL

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Арифметические операторы: остаток от деления, возведение в степень

A

% Остаток от деления
^ Возведение в степень

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Округление вещественных чисел

A

SELECT ROUND(100.5454, 2)

Результат:
100.55

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Условная конструкция CASE

A

Синтаксис:
CASE
WHEN logical_expression_1 THEN expression_1
WHEN logical_expression_2 THEN expression_2

ELSE expression_else
END AS case_example

Пример:
SELECT name,
CASE
WHEN name=’свинина’ OR name=’баранина’ OR name=’курица’ THEN ‘мясо’
WHEN name=’треска’ OR name=’форель’ OR name=’окунь’ THEN ‘рыба’
ELSE ‘другое’
END AS сategory
FROM table

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Фильтрация по шаблону

A

Для фильтрации по колонкам с текстовыми значениями в SQL предусмотрен оператор LIKE.

Оператор LIKE не просто сравнивает строки на полное совпадение (или несовпадение), а проверяет их на соответствие заданному шаблону: если строка ему соответствует, то возвращается TRUE, в противном случае — FALSE. Как можно догадаться, конструкция NOT LIKE работает с точностью до наоборот.

Шаблоны могут содержать как обычные символы, так и символы-шаблоны: знак процента ( % ) и подчёркивание ( _ ). Подчёркивание подменяет любой одиночный символ, а знак процента — любую (в том числе и пустую) последовательность символов:

SELECT ‘karpov.courses’ LIKE ‘karpov%’

Результат:
true

SELECT ‘karpov.courses’ LIKE ‘karpov_’

Результат:
false

SELECT ‘karpov.courses’ LIKE ‘%karpov%’

Результат:
true

SELECT ‘karpov.courses’ LIKE ‘_karpov%’

Результат:
false

SELECT ‘karpov.courses’ LIKE ‘%.%’

Результат:
true

SELECT ‘karpov.courses’ LIKE ‘.

Результат:
false

SELECT ‘karpov.courses’ LIKE ‘Karpov%’

Результат:
false

Обратите внимание на последний пример: оператор LIKE чувствителен к регистру.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Отобрать значения из некоторого списка или диапазона

A

В этом случае в логическом выражении после ключевого слова WHERE можно использовать операторы IN и BETWEEN. Для получения обратного результата в сочетании с операторами IN и BETWEEN можно использовать оператор NOT.

1) Оператор IN проверяет, соответствует ли значение в колонке одному из значений из заданного списка. Иными словами, он проверяет, входит ли значение в этот список:

SELECT column_1, column_2
FROM table
WHERE column_1 IN (‘product_1’, ‘product_2’, ‘product_3’)

2) В свою очередь оператор BETWEEN позволяет отобрать данные, относящиеся к некоторому интервалу. При этом границы интервала включаются:

SELECT column_1, column_2
FROM table
WHERE column_2 BETWEEN 5 AND 10

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

NULL: проверка на NULL, сравнение NULL с другими значениями

A

Для проверки на NULL значения в SQL есть оператор IS NULL. В сочетании с WHERE записывается он так:

SELECT column_1, column_2
FROM table
WHERE column_1 IS NULL

Если же, наоборот, необходимо отобрать не NULL значения, то дополнительно используется оператор NOT:

SELECT column_1, column_2
FROM table
WHERE column_1 IS NOT NULL

Как мы уже знаем, в мире данных NULL означает отсутствие информации. NULL — это не какая-то величина, и поэтому её нельзя сравнить с чем-либо ещё. Результатом сравнения NULL с любым другим значением будет тот же NULL. Более того, NULL не получится сравнить и с другим NULL, потому что в таком случае будут сравниваться две неопределённости и нельзя наверняка сказать, равны они или нет.

Попробуйте самостоятельно запустить в Redash следующие запросы и посмотрите на их результат:

SELECT NULL = NULL

Результат:
NULL

SELECT NULL IS NULL

Результат:
true

SELECT 100 = NULL

Результат:
NULL

SELECT 100 IS NULL

Результат:
false

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Вывести несколько уникальных колонок

A

Ключевое слово DISTINCT можно применять не только к одной колонке, но и сразу к нескольким.

Например, запрос для двух колонок будет выглядеть так:

SELECT DISTINCT column_1, column_2
FROM table

В таком случае в качестве результата запрос вернёт уникальные комбинации значений в колонках.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Агрегирующие функции (определение и основные)

A

Агрегирующими функциями называют функции, которые обрабатывают определённый набор строк и возвращают одно обобщающее значение. Если вы когда-нибудь работали в Excel, то наверняка сталкивались с подсчётом суммы или максимального/минимального значения по столбцу — речь идёт именно об этом.

Вот несколько примеров таких функций в SQL:

  • COUNT — считает количество значений в колонке.
  • SUM — вычисляет сумму значений.
  • AVG — вычисляет среднее значение.
  • MAX — вычисляет максимальное значение.
  • MIN — вычисляет минимальное значение.
18
Q

Различия count(*) и count(column_name)

A

Важно учитывать один нюанс: запрос со звёздочкой возвращает количество вообще всех записей в таблице, а запрос с указанием столбца — количество тех записей, где в заданном столбце значения не являются NULL.

Таким образом, если в некоторой колонке column есть пропуски, выражения COUNT(*) и COUNT(column) вернут разные значения.

19
Q

Функция посчитать длину массива

A

Функция array_length вычисляет количество элементов в массиве (длину массива) и записывается следующим образом:

SELECT array_length(ARRAY[1,2,3], 1)

Результат:
3

Синтаксис может показаться вам немного сложным, но это только на первый взгляд! Давайте разбираться.

ARRAY[1,2,3] — это некоторый список из трёх значений: 1, 2 и 3.

Единица в качестве второго аргумента — это размерность массива, по которой считается его длина. Так как список у нас одноразмерный (просто значения, записанные в одну строчку), то выбор у нас невелик — можем указать только первую размерность.

20
Q

Функция Age()

A

Функция AGE возвращает разницу между двумя значениями, представленными в формате TIMESTAMP. При этом из первого значения вычитается второе, а сама разница получается в формате INTERVAL:

SELECT AGE(‘2022-12-12’, ‘2021-11-10’)

Результат:
397 days, 0:00:00

Таким образом, с ‘2021-11-10’ по ‘2022-12-12’ прошло ровно 397 дней.

Если в качестве первого аргумента не указать ничего, то на место первой даты автоматически подставится текущая дата (полночь текущего дня, т.е. начало дня).

Если сегодня ‘2022-12-12’, то с ‘2021-11-10’ прошло ровно столько же дней, сколько в примере выше:

SELECT AGE(TIMESTAMP ‘2021-11-10’)

Результат:
397 days, 0:00:00

На самом деле текущей дате соответствует значение current_date, которое можно указывать в качестве аргумента функции AGE:

SELECT AGE(current_date, ‘2021-11-10’)

Результат:
397 days, 0:00:00

Можете самостоятельно запустить два запроса — с current_date и без — и сравнить полученные результаты. В вашем случае это будут новые результаты, но они должны совпасть.

А само значение current_date можно вызвать так:

SELECT current_date

Результат:
12/12/22

И ещё один нюанс: чтобы результат отображался не в виде количества дней, а в более удобном формате, можно переводить результат вычислений в тип VARCHAR:

SELECT AGE(current_date, ‘2021-11-10’)::VARCHAR

Результат:
1 year 1 mon 2 days

21
Q

Агрегация расчетной колонки

A

Аргументом агрегирующей функции может быть и более сложная расчётная колонка — например, полученная в результате работы конструкции CASE.

В таком случае сама конструкция CASE помещается внутрь скобок агрегирующей функции:

AVG(
CASE
WHEN logical_expression_1 THEN expression_1
WHEN logical_expression_2 THEN expression_2
ELSE expression_else
END
)

Так, если бы в нашей таблице все товары были разбиты по категориям и мы захотели бы посчитать среднюю цену товаров с учётом повышающих или понижающих коэффициентов для каждой категории, то мы могли бы сделать это, например, следующим образом:

SELECT AVG(
CASE
WHEN category=’мясо’ THEN price0.95
WHEN category=’рыба’ THEN price
0.9
WHEN category=’напитки’ THEN price*1.05
ELSE price
END
) AS avg_price
FROM products

22
Q

Агрегатные выражения с фильтрацией

A

Если после агрегирующей функции указать ключевое слово FILTER и поместить в скобках некоторое условие condition после WHERE, то агрегирующей функции на вход будут поданы только те строки, для которых условие фильтра окажется истинным.

В общем виде эта конструкция выглядит так:

SELECT agg_function(column) FILTER (WHERE condition)
FROM table

Например, если бы мы захотели посчитать среднюю цену только для товаров категории ‘рыба’, то запрос выглядел бы так:

SELECT AVG(price) FILTER (WHERE category = ‘рыба’) AS avg_fish_price
FROM table

Обратите внимание: это очень похоже на обычную фильтрацию с агрегацией, которую мы рассматривали в предыдущих задачах, только в данном случае условие на отбор записей указывается сразу в блоке SELECT.

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

23
Q

Как получить уникальные значения (не DISTINCT)

A

Если не указать агрегирующую функцию, то запрос вернёт уникальные значения в столбце (или уникальные комбинации значений в столбцах), т.е. тот же результат, что и оператор DISTINCT. Можете самостоятельно запустить следующие запросы в Redash и убедиться:

SELECT user_id
FROM user_actions
GROUP BY user_id

24
Q

Отличие операторов WHERE и HAVING

A

первый фильтрует записи в таблице перед группировкой и агрегацией, а второй — после. Кстати, это простой, но довольно популярный вопрос на собеседовании по SQL.

25
Порядок выполнения ключевых слов в запросе
1) Сначала выполняется оператор FROM — происходит выбор нужной таблицы. 2) Далее WHERE — отфильтровываются строки, соответствующие условию. 3) Потом GROUP BY — строки объединяются в группы и производится агрегация. 4) Затем HAVING — отфильтровываются группы, соответствующие условию. 5) После этого SELECT — отбираются указанные столбцы. 6) Потом ORDER BY — производится сортировка результирующей таблицы. 7) И в самом конце LIMIT — ограничивается количество выводимых записей.
26
Группировка по CASE
В качестве поля для группировки может выступать и более сложная расчётная колонка — например, результат выполнения условной конструкции CASE: SELECT CASE WHEN name='свинина' OR name='баранина' OR name='курица' THEN 'мясо' WHEN name='треска' OR name='форель' OR name='окунь' THEN 'рыба' ELSE 'другое' END AS сategory, AVG(price) AS avg_price FROM table GROUP BY сategory Запрос выше сначала поделит все товары на группы, затем сгруппирует их и для каждой группы посчитает среднюю цену всех попавших в неё продуктов.
27
В каких частях основного запроса могут применяться подзапросы
* в операторе FROM; * в операторе SELECT (если запрос возвращает один столбец с одним значением); * в операторах WHERE и HAVING (если запрос возвращает один столбец с одним или несколькими значениями); * в операторе CASE при формировании продвинутых условных конструкций.
28
WITH
оператор WITH позволяет создавать так называемые табличные выражения (CTE, common table expressions). Табличные выражения — это временные таблицы, существующие только для одного запроса. Их основное предназначение заключается в разбиении сложных запросов на несколько частей. Табличные выражения создаются так: WITH subquery_1 AS ( SELECT column_1, column_2 FROM table ) После оператора WITH указывается название табличного выражения (в данном случае это subquery_1), а затем после ключевого слова AS в скобках указывается сам запрос, с помощью которого будет формироваться табличное выражение. Затем в основной части запроса к табличному выражению можно обращаться по имени, как к таблице: WITH subquery_1 AS ( SELECT column_1, column_2 FROM table ) SELECT column_1 FROM subquery_1;
29
Основные типы объединений JOIN
1) INNER JOIN 2) LEFT 3) RIGHT JOIN 4) FULL JOIN 5) CROSS JOIN
30
USING
Если имя поля, по которому происходит объединение, совпадает в обеих таблицах (как в примерах выше), то можно использовать сокращенную запись c оператором USING: SELECT a.column_1, b.column_2 FROM table_1 a JOIN table_2 b USING (id) ...
31
Подзапросы при объединении таблиц
При объединении таблиц можно также использовать подзапросы. Их можно объединять с другими таблицами или друг с другом: SELECT ... FROM table_1 JOIN ( SELECT ... FROM table_2 ) AS subquery ON table_1.id = subquery.id ...
32
Процесс объединения можно представить в виде следующей последовательности операций: ?
1) Сначала каждая строка первой таблицы сопоставляется с каждой строкой второй таблицы. т.е. происходит декартово произведение двух множеств, результатом которого является новое множество, состоящее из всевозможных пар исходных строк. Например, если в одной таблице было 50 записей, а в другой 10, то в результате декартова произведения получится 500 записей. 2) Затем для каждой объединённой строки, состоящей из строк двух исходных таблиц, проверяется условие соединения, указанное после оператора ON. 3) После этого в соответствии с выбранным типом объединения формируется результирующая таблица. При соединении не двух, а нескольких таблиц, операция соединения выполняется последовательно несколько раз, т.е. описанный выше алгоритм запускается столько раз, сколько указано соединений. При этом в этой последовательности при каждом объединении может использоваться любой тип соединения (INNER, LEFT и т.д.).
33
INNER JOIN
Первый тип объединения, который мы рассмотрим, называется INNER JOIN. Это оператор внутреннего соединения, для которого совершенно неважен порядок указания таблиц. При этом в запросе вместо INNER JOIN можно писать просто JOIN — это одно и то же. Результат объединения INNER JOIN формируется следующим образом: * Сначала каждая строка первой таблицы сопоставляется с каждой строкой второй таблицы (происходит декартово произведение). * Затем для каждой объединённой строки проверяется условие соединения, указанное после оператора ON. * После этого все объединённые строки, для которых условие оказалось истинным, добавляются в результирующую таблицу. Таким образом, в результате объединения INNER JOIN из двух таблиц отбрасываются все строки, которые не прошли проверку на соответствие указанному условию. Вот и всё!
34
LEFT JOIN / RIGHT JOIN
Следующий тип соединения, который мы рассмотрим, — это LEFT OUTER JOIN (или просто LEFT JOIN). LEFT JOIN — это оператор внешнего соединения, для которого важен порядок таблиц в запросе, т.е. в отличие от INNER JOIN он не является симметричным. Результат объединения LEFT JOIN формируется следующим образом: * Сначала каждая строка левой таблицы сопоставляется с каждой строкой правой таблицы (происходит декартово произведение). * Затем для каждой объединённой строки проверяется условие соединения, указанное после оператора ON. * После этого все объединённые строки, для которых условие оказалось истинным, добавляются в результирующую таблицу. * Далее в результат добавляются те записи из левой таблицы (внимание: только из левой), для которых условие оказалось ложным и которые не вошли в соединение на предыдущем шаге. При этом для таких записей соответствующие поля из правой таблицы заполняются значениями NULL. Если внимательно посмотреть на описанный алгоритм, то можно понять, что он легко сводится к следующей последовательности действий: 1) Сначала в соответствии с указанным условием выполняется INNER JOIN первой и второй таблиц. 2) Затем в результат добавляются те записи из левой таблицы (внимание: только из левой), для которых условие оказалось ложным и которые не вошли в соединение на предыдущем шаге. При этом для таких записей соответствующие поля из правой таблицы заполняются значениями NULL. Вот и вся магия! Соединение RIGHT JOIN работает аналогичным образом, только на втором этапе в результат INNER JOIN добавляются записи не из левой, а из правой таблицы.
35
FULL JOIN
А чтобы лучше разобраться с джойнами, рассмотрим ещё один тип объединения таблиц — FULL OUTER JOIN или просто FULL JOIN. Это оператор полного внешнего соединения, для которого, как и для INNER JOIN, неважен порядок указания таблиц. Однако работает он совсем по-другому. Результат объединения FULL JOIN формируется следующим образом: * Сначала каждая строка левой таблицы сопоставляется с каждой строкой правой таблицы (происходит декартово произведение). * Затем для каждой объединённой строки проверяется условие соединения, указанное после оператора ON. * После этого все объединённые строки, для которых условие оказалось истинным, добавляются в результирующую таблицу. * Далее в результат добавляются те записи из левой и правой таблиц (внимание: из обеих таблиц), для которых условие оказалось ложным и которые не вошли в соединение на предыдущем шаге. При этом для таких записей соответствующие поля из другой таблицы (для левой — это поля из правой, для правой — это поля из левой) заполняются значениями NULL. Этот алгоритм можно свести к следующей последовательности действий: 1) Сначала в соответствии с указанным условием выполняется INNER JOIN левой и правой таблиц. 2) Далее в результат добавляются те записи из левой и правой таблиц (внимание: из обеих таблиц), для которых условие оказалось ложным и которые не вошли в соединение на предыдущем шаге. При этом для таких записей соответствующие поля из другой таблицы (для левой — это поля из правой, для правой — это поля из левой) заполняются значениями NULL.
36
Операции с множествами (какие есть?)
1) UNION 2) EXCEPT 3) INTERSECT Они позволяют комбинировать результаты нескольких запросов друг с другом и получать один общий результат. Причём именно комбинировать, а не объединять, как это делают джойны. Эту разницу важно понимать: в операциях с множествами не происходит совмещения столбцов из двух таблиц — база данных просто отбирает строки из таблиц, удовлетворяющие типу операции, и добавляет их в общий результат. SELECT column_1, column_2 FROM table_1 UNION / EXCEPT / INTERSECT SELECT column_1, column_2 FROM table_2 Для работы этих операций необходимо, чтобы выполнялись следующие условия: 1) В каждом запросе в SELECT должно быть одинаковое количество столбцов. 2) Типы данных в столбцах должны быть совместимы. При этом количество столбцов в операторе SELECT может быть любым — главное, чтобы оно было одинаковым.
37
UNION
Операция UNION объединяет записи из двух запросов в один общий результат (объединение множеств). При этом по умолчанию эти операции исключают из результата строки-дубликаты. Чтобы дубликаты не исключались из результата, необходимо после имени операции указать ключевое слово ALL.
38
EXCEPT
Операция EXCEPT возвращает все записи, которые есть в первом запросе, но отсутствуют во втором (разница множеств). При этом по умолчанию эти операции исключают из результата строки-дубликаты. Чтобы дубликаты не исключались из результата, необходимо после имени операции указать ключевое слово ALL. Set A = (10,11,12,10,10) Set B = (10,10) A except B --> (11,12) A except all B --> (10,11,12)
39
INTERSECT
Операция INTERSECT возвращает все записи, которые есть и в первом, и во втором запросе (пересечение множеств). При этом по умолчанию эти операции исключают из результата строки-дубликаты. Чтобы дубликаты не исключались из результата, необходимо после имени операции указать ключевое слово ALL. INTERSECT возвращает все строки, содержащиеся в результате и первого, и второго запроса. Дублирующиеся строки отфильтровываются, если не указано ALL.
40
CROSS JOIN
На самом деле CROSS JOIN — это просто декартово произведение двух таблиц, то есть именно то, что происходит на первом этапе остальных джойнов. Важное отличие в синтаксисе CROSS JOIN состоит в том, что для него не нужно указывать условие для соединения: SELECT column_1, column_2, ... FROM table_1 CROSS JOIN table_2 Тот же результат можно получить с помощью следующей записи: SELECT column_1, column_2, ... FROM table_1, table_2