Результатом выполнения оператора SELECT
является таблица. К этой таблице может быть снова применен оператор SELECT
и т.д., то есть такие операторы могут быть вложены друг в друга. Вложенные операторы SELECT
называют подзапросами.
Синтаксис оператора SELECT
использует следующие основные предложения:
SELECT <список столбцов>
FROM <список таблиц>
[WHERE <условие выбора строк>]
[GROUP BY <условие группировки>]
[HAVING <условие выбора групп>]
[ORDER BY <условие сортировки>]
Кратко пояснить смысл предложений оператора SELECT
можно следующим образом:
SELECT
— выбрать данные из указанных столбцов и (если необходимо) выполнить перед выводом их преобразование в соответствии с указанными выражениями и (или) функциямиFROM
— из перечисленных таблиц, в которых расположены эти столбцыWHERE
— где строки из указанных таблиц должны удовлетворять указанному перечню условий отбора строкGROUP BY
— группируя по указанному перечню столбцов с тем, чтобы получить для каждой группы единственное значениеHAVING
— имея в результате лишь те группы, которые удовлетворяют указанному перечню условий отбора группORDER BY
— сортируя по указанному перечню столбцов
Как видно из синтаксиса рассматриваемого оператора, обязательными являются только два первых предложения: SELECT
и FROM
.
Рассмотрим каждое предложение оператора SELECT
.
Спонсор поста
База данных для примеров
Дальше будет много примеров и логично постоянно использовать одну и ту же БД. Так что на основании базы данных ниже будут продемонстрированы все примеры, не только в этой статье, но и в других.
Постановка задачи: пусть требуется разработать БД для предметной области «Поставка деталей»!
Требуется хранить следующую информацию:
- О поставщиках (P) pnum, pname
- О деталях (D) pnum, dname, dprice
- О поставках (PD) volume
Значения таблицы P
pnum | pname |
---|---|
1 | Иванов |
2 | Петров |
3 | Сидоров |
4 | Кузнецов |
Значения таблицы D
pnum | dname | dprice |
---|---|---|
1 | Болт | 10 |
2 | Гайка | 20 |
3 | Винт | 30 |
Значения таблицы PD
pnum | dnum | volume |
---|---|---|
1 | 1 | 100 |
1 | 2 | 100 |
1 | 3 | 300 |
2 | 1 | 150 |
1 | 2 | 250 |
3 | 1 | 1000 |
После служебного слова SELECT
перечисляются имена столбцов, значения которых будут входить в результат выполнения запроса.
Столбцы в результирующей таблице размещаются в том порядке, в котором они были указаны в предложении SELECT
. Имена столбцов указываются через запятую.
Если имя столбца содержит пробелы или разделители, то его необходимо заключить в квадратные скобки.
При обработке данных из разных таблиц может возникнуть ситуация, когда столбцы разных таблиц имеют одинаковые имена. В этом случае имя столбца необходимо записывать как составное, указывая перед ним имя соответствующей таблицы: <Имя таблицы>.<Имя столбца>
Предложение FROM
В предложении FROM
перечисляются имена таблиц, которые содержат столбцы, указанные после слова SELECT
.
Пример 1.
Вывести список наименований деталей из таблицы D (“Детали”).
SELECT dname
FROM D
Пример 2.
Получить всю информацию из таблицы D (“Детали”).
Получить результат можно двумя способами:
-
Явным указанием всех столбцов таблицы.
SELECT dnum, dname, dprice FROM D
-
Полный список столбцов таблицы заменяет символ
*
.SELECT * FROM D
В результате и первого и второго запроса получаем новую таблицу, представляющую собой полную копию таблицы D (“Детали”).
Можно осуществить выбор отдельных столбцов и их перестановку.
Пример 3.
Получить информацию о наименовании и номере поставщика.
SELECT pname, pnum
FROM P
Пример 4.
Определить номера поставщиков, которые поставляют детали в настоящее время (то есть номера тех поставщиков, которые присутствуют в таблице PD (“Поставки”)).
SELECT pnum
FROM PD
Результат:
pnum |
---|
1 |
1 |
1 |
2 |
2 |
3 |
Дополнительно о SELECT
Теперь, когда мы научились делать простые запросы с SELECT
и FROM
, можно ненадолго снова вернуться к SELECT
.
Агрегатные функции
В операторе SELECT
можно использовать агрегатные функции, которые дают единственное значение для целой группы строк в таблице.
Агрегатная функция записывается в следующем виде: <имя функции>(<имя столбца>)
Пользователю доступны следующие агрегатные функции:
SUM
‑ вычисляет сумму множества значений указанного столбца;COUNT
‑ вычисляет количество значений указанного столбца;MIN
/MAX
‑ определяет минимальное/максимальное значение в указанном столбце;AVG
‑ вычисляет среднее арифметическое значение множества значений столбца;FIRST
/LAST
‑ определяет первое/последнее значение в указанном столбце.
Пример 5.
Определить общий объем поставляемых деталей.
SELECT SUM(volume)
FROM PD
Expr1000 |
---|
2000 |
Вычисляемые столбцы
Столбцы результирующей таблицы, которых не существовало в исходных таблицах, называются вычисляемыми. Таким столбцам СУБД присваивает системные имена, что не всегда является удобным.
При вычислении результатов любой агрегатной функции СУБД сначала исключает все NULL
-значения, после чего требуемая операция применяется к оставшимся значениям.
Для функции COUNT
возможен особый вариант использования — COUNT(*)
. Его назначение состоит в подсчете всех строк в результирующей таблице, включая NULL
-значения.
Следует запомнить, что агрегатные функции нельзя вкладывать друг в друга. Такая конструкция работать не будет: MAX(SUM(VOLUME))
Переименование столбца
Язык SQL позволяет задавать новые имена столбцам результирующей таблицы, для чего используется операция AS
. Переименование также используют для изменения сложных имен столбцов таблицы.
Например, присвоить новое имя вычисляемому столбцу в предыдущем примере позволит выполнение следующего запроса.
SELECT SUM(volume) AS SUM
FROM PD
Sum |
---|
2000 |
Пример 6.
Определить количество поставщиков, которые поставляют детали в настоящее время.
SELECT COUNT(pnum) AS COUNT
FROM PD
Count |
---|
6 |
Несмотря на то, что реальное число поставщиков деталей в таблице PD равно 3, СУБД возвращает число 6. Такой результат объясняется тем, что СУБД подсчитывает все строки в таблице PD, не обращая внимание на то, что в строках есть одинаковые значения.
Операция DISTINCT
Если до применения агрегатной функции необходимо исключить дублирующиеся значения, следует перед именем столбца указать ключевое слово DISTINCT
.
SELECT COUNT(DISTINCT pnum) AS COUNT
FROM PD
Count |
---|
3 |
DISTINCT
можно задать только один раз для одного предложения SELECT
.
Противоположностью DISTINCT
является операция ALL
. Она имеет противоположное действие «показать все строки таблицы» и предполагается по умолчанию.
Операция TOP
Итоговый набор записей, получаемых после выполнения запроса можно ограничить первыми N строками или первыми N процентами от общего количества строк результата.
Для этого используется операция TOP
, которая записывается в предложении SELECT
следующим образом: SELECT TOP N [PERCENT] <список столбцов>
Пример 7.
Определить номера первых двух деталей таблицы D.
SELECT TOP 2 dnum
FROM D
Стандарт SQL требует, чтобы при сортировке NULL
-значения трактовались либо как превосходящие, либо как уступающие по сравнению со всеми остальными значениями. Так как конкретный вариант стандартом не оговаривается, то в зависимости от используемой СУБД при сортировке NULL
-значения следуют до или после остальных значений. В MS SQL Server NULL
-значения считаются уступающими по сравнению с остальными значениями.
Предложение WHERE
После служебного слова WHERE
указываются условия выбора строк, помещаемых в результирующую таблицу. Существуют различные типы условий выбора:
Типы условий выбора:
- Сравнение значений атрибутов со скалярными выражениями, другими атрибутами или результатами вычисления выражений.
- Проверка значения на принадлежность множеству.
- Проверка значения на принадлежность диапазону.
- Проверка строкового значения на соответствие шаблону.
- Проверка на наличие
null
-значения.
Сравнение
В языке SQL используются традиционные операции сравнения =
,<>
,<
,<=
,>
,>=
.
В качестве условия в предложении WHERE
можно использовать сложные логические выражения, использующие атрибуты таблиц, константы, скобки, операции AND
, OR
, отрицание NOT
.
Пример 8.
Определить номера деталей, поставляемых поставщиком с номером 2.
SELECT dnum
FROM PD
WHERE pnum = 2
Пример 9.
Получить информацию о поставщиках Иванов и Петров.
SELECT *
FROM P
WHERE pname='Иванов' OR pname='Петров'
Строковые значения атрибутов заключаются в апострофы.
Проверка на принадлежность множеству
Операция IN
проверяет, принадлежит ли значение атрибута заданному множеству.
Пример 10.
Получить информацию о поставщиках ‘Иванов’ и ‘Петров’.
SELECT *
FROM P
WHERE pname IN ('Иванов','Петров')
Пример 11.
Получить информацию о деталях с номерами 1 и 2.
SELECT *
FROM D
WHERE dnum IN (1, 2)
Проверка на принадлежность диапазону
Операция BETWEEN
определяет минимальную и максимальную границу диапазона, в которое должно попадать значение атрибута. Обе границы считаются принадлежащими диапазону.
Пример 12.
Определить номера деталей, с ценой от 10 до 20 рублей.
SELECT dnum
FROM D
WHERE dprice BETWEEN 10 AND 20
Пример 13.
Вывести наименования поставщиков, начинающихся с букв от ‘К’ по ‘П’.
SELECT pname
FROM P
WHERE pname BETWEEN 'К' AND 'Р'
Сравнение символов
Буква Р
в условии запроса объясняется тем, что строки сравниваются посимвольно. Для каждого символа при этом определяется код. Для нашего случая справедливо условие: П < Петров < Р
Проверка строкового значения на соответствие шаблону
Операция LIKE
используется для поиска подстрок. Значения столбца, указываемого перед служебным словом LIKE
сравниваются с задаваемым после него шаблоном. Форматы шаблонов различаются в конкретных СУБД.
Для СУБД MS SQL Server:
- Символ
%
заменяет любое количество любых символов. - Символ
_
заменяет один любой символ. [<множество символов>]
‑ вместо символа строки может быть подставлен один любой символ из множества возможных, указанных в ограничителях.[^<множество символов>]
‑ вместо символа строки может быть подставлен любой из символов кроме символов из множества, указанного в ограничителях.
Множество символов в квадратных скобках можно указывать через запятую, либо в виде диапазона.
Пример 14.
Вывести фамилии поставщиков, начинающихся с буквы И
.
SELECT pname
FROM P
WHERE pname LIKE 'И%'
Пример 15.
Вывести фамилии поставщиков, начинающихся с букв от К
по П
.
SELECT pname
FROM P
WHERE dname LIKE '[К-П]%'
Проверка на наличие null
-значения
Операции IS NULL
и IS NOT NULL
используются для сравнения значения атрибута со значением NULL
.
Пример 16.
Определить наименования деталей, для которых не указана цена.
SELECT dname
FROM D
WHERE dprice IS NULL
Пример 17.
Определить номера поставщиков, для которых указано наименование.
SELECT pnum
FROM P
WHERE pname IS NOT NULL
Предложение GROUP BY
Использование GROUP BY
позволяет разбивать таблицу на логические группы и применять агрегатные функции к каждой из этих групп. В результате получим единственное значение для каждой группы.
Обычно предложение GROUP BY
применяют, если формулировка задачи содержит фразу «для каждого…», «каждому..» и т.п.
Пример 18.
Определить суммарный объем деталей, поставляемых каждым поставщиком.
SELECT pnum, SUM(VOLUME) AS SUM
FROM PD
GROUP BY pnum
pnum | sum |
---|---|
1 | 600 |
2 | 400 |
3 | 1000 |
Выполнение запроса можно описать следующим образом: СУБД разбивает таблицу PD на три группы, в каждую из групп помещаются строки с одинаковым значением номера поставщика. Затем к каждой из полученных групп применяется агрегатная функция SUM, что дает единственное итоговое значение для каждой группы.
Рассмотрим два похожих примера. В примере 19 определяется минимальный объем поставки каждого поставщика. В примере 20 определяется объем минимальной поставки среди всех поставщиков.
Пример 19:
SELECT pnum, MIN(VOLUME) AS MIN
FROM PD
GROUP BY pnum
Пример 20:
SELECT MIN(VOLUME) AS MIN
FROM P
Результаты запросов представлены в следующей таблице:
pnum | min | max |
---|---|---|
1 | 100 | 100 |
2 | 150 | |
3 | 1000 |
Следует обратить внимание, что в первом примере мы можем вывести номера поставщиков, соответствующие объемам поставок, а во втором примере – не можем.
Все имена столбцов, перечисленные после ключевого слова SELECT
должны присутствовать и в предложении GROUP BY
, за исключением случая, когда имя столбца является аргументом агрегатной функции.
Однако в предложении GROUP BY
могут быть указаны имена столбцов, не перечисленные в списке вывода после ключевого слова SELECT
.
Если предложение GROUP BY
расположено после предложения WHERE
, то группы создаются из строк, выбранных после применения WHERE
.
Пример 21.
Для каждой из деталей с номерами 1 и 2 определить количество поставщиков, которые их поставляют, а также суммарный объем поставок деталей.
SELECT dnum, COUNT(pnum) AS COUNT, SUM(volume) AS SUM
FROM PD
WHERE dnum=1 OR dnum=2
GROUP BY dnum
Результат запроса:
dnum | COUNT | SUM |
---|---|---|
1 | 3 | 1250 |
2 | 2 | 450 |
Чтобы организовать вложенные группировки, после GROUP BY
следует указать несколько группирующих столбцов через запятую. В этом случае реальный подсчет данных будет происходить по той группе, которая указана последней.
Предложение HAVING
Предложение HAVING
определяет критерий, согласно которому, определенные группы, сформированные с помощью предложения GROUP BY
, исключаются из результирующей таблицы.
Выполнение предложения HAVING
сходно с выполнением предложения WHERE
. Но предложение WHERE
исключает строки до того, как выполняется группировка, а предложение HAVING
— после. Поэтому предложение HAVING
может содержать агрегатные функции, а предложение WHERE
— не может.
Пример 22.
Определить номера поставщиков, поставляющих в сумме более 500 деталей.
SELECT pnum, SUM(volume) AS SUM
FROM PD
GROUP BY pnum
HAVING SUM(volume) > 500
pnum | SUM |
---|---|
1 | 600 |
3 | 1000 |
Пример 23.
Определить номера поставщиков, которые поставляют только одну деталь.
SELECT pnum, COUNT(dnum) AS COUNT
FROM PD
GROUP BY pnum
HAVING COUNT(dnum) = 1
pnum | SUM |
---|---|
3 | 1 |
Предложение ORDER BY
При выполнении запроса СУБД возвращает строки в случайном порядке. Предложение ORDER BY
позволяет упорядочить выходные данные запроса в соответствии со значениями одного или нескольких выбранных столбцов.
Можно задать возрастающий — ASC
(от слова Ascend) или убывающий — DESC
(от слова Descend) порядок сортировки. По умолчанию принят возрастающий порядок сортировки.
Пример 24.
Отсортировать таблицу PD в порядке возрастания номеров поставщиков, а строки с одинаковыми значениями pnum отсортировать в порядке убывания объема поставок.
SELECT pnum, volume, dnum
FROM PD
ORDER BY pnum ASC, volume DESC
pnum | volume | dnum |
---|---|---|
1 | 300 | 3 |
1 | 200 | 2 |
1 | 100 | 1 |
2 | 250 | 2 |
2 | 150 | 1 |
3 | 1000 | 1 |
Операцию TOP
удобно применять после сортировки результирующего набора с помощью предложения ORDER BY
.
Пример 25.
Определить номера первых двух деталей с наименьшей стоимостью.
SELECT TOP 2 dnum
FROM D
ORDER BY dprice ASC
Следует отметить, что если в таблице D будут две детали без указания цены, то именно их и отобразит предыдущий запрос. Поэтому при наличии NULL
-значений их необходимо исключать с помощью предложения WHERE
.
SELECT TOP 2 dnum
FROM D
WHERE dprice IS NOT NULL
ORDER BY dprice ASC
Заключение
В статье было рассмотрен оператор выборки SELECT
. Знание оператора SELECT
является ключевым при написании любых SQL-запросов. Он позволяет производить выборку данных из таблиц и преобразовывать результаты в соответствии с нужными выражениями и функциями.
Результатом выполнения оператора SELECT
является таблица, которую можно вложить в другой оператор SELECT
в качестве подзапроса.
Синтаксис оператора SELECT
содержит несколько предложений, из которых обязательными являются только SELECT
и FROM
. Остальные предложения, такие как WHERE
, GROUP BY
, HAVING
и ORDER BY
, могут использоваться по желанию для уточнения выборки данных.
Время на прочтение
5 мин
Количество просмотров 1.1M
Введение
Язык SQL очень прочно влился в жизнь бизнес-аналитиков и требования к кандидатам благодаря простоте, удобству и распространенности. Из собственного опыта могу сказать, что наиболее часто SQL используется для формирования выгрузок, витрин (с последующим построением отчетов на основе этих витрин) и администрирования баз данных. И поскольку повседневная работа аналитика неизбежно связана с выгрузками данных и витринами, навык написания SQL запросов может стать фактором, из-за которого кандидат или получит преимущество, или будет отсеян. Печальная новость в том, что не каждый может рассчитывать получить его на студенческой скамье. Хорошая новость в том, что в изучении SQL нет ничего сложного, это быстро, а синтаксис запросов прост и понятен. Особенно это касается тех, кому уже доводилось сталкиваться с более сложными языками.
Обучение SQL запросам я разделил на три части. Эта часть посвящена базовому синтаксису, который используется в 80-90% случаев. Следующие две части будут посвящены подзапросам, Join’ам и специальным операторам. Цель гайдов: быстро и на практике отработать синтаксис SQL, чтобы добавить его к арсеналу навыков.
Практика
Введение в синтаксис будет рассмотрено на примере открытой базы данных, предназначенной специально для практики SQL. Чтобы твое обучение прошло максимально эффективно, открой ссылку ниже в новой вкладке и сразу запускай приведенные примеры, это позволит тебе лучше закрепить материал и самостоятельно поработать с синтаксисом.
Кликнуть здесь
После перехода по ссылке можно будет увидеть сам редактор запросов и вывод данных в центральной части экрана, список таблиц базы данных находится в правой части.
Структура sql-запросов
Общая структура запроса выглядит следующим образом:
SELECT ('столбцы или * для выбора всех столбцов; обязательно')
FROM ('таблица; обязательно')
WHERE ('условие/фильтрация, например, city = 'Moscow'; необязательно')
GROUP BY ('столбец, по которому хотим сгруппировать данные; необязательно')
HAVING ('условие/фильтрация на уровне сгруппированных данных; необязательно')
ORDER BY ('столбец, по которому хотим отсортировать вывод; необязательно')
Разберем структуру. Для удобства текущий изучаемый элемент в запроса выделяется CAPS’ом.
SELECT, FROM
SELECT, FROM — обязательные элементы запроса, которые определяют выбранные столбцы, их порядок и источник данных.
Выбрать все (обозначается как *) из таблицы Customers:
SELECT * FROM Customers
Выбрать столбцы CustomerID, CustomerName из таблицы Customers:
SELECT CustomerID, CustomerName FROM Customers
WHERE
WHERE — необязательный элемент запроса, который используется, когда нужно отфильтровать данные по нужному условию. Очень часто внутри элемента where используются IN / NOT IN для фильтрации столбца по нескольким значениям, AND / OR для фильтрации таблицы по нескольким столбцам.
Фильтрация по одному условию и одному значению:
select * from Customers
WHERE City = 'London'
Фильтрация по одному условию и нескольким значениям с применением IN (включение) или NOT IN (исключение):
select * from Customers
where City IN ('London', 'Berlin')
select * from Customers
where City NOT IN ('Madrid', 'Berlin','Bern')
Фильтрация по нескольким условиям с применением AND (выполняются все условия) или OR (выполняется хотя бы одно условие) и нескольким значениям:
select * from Customers
where Country = 'Germany' AND City not in ('Berlin', 'Aachen') AND CustomerID > 15
select * from Customers
where City in ('London', 'Berlin') OR CustomerID > 4
GROUP BY
GROUP BY — необязательный элемент запроса, с помощью которого можно задать агрегацию по нужному столбцу (например, если нужно узнать какое количество клиентов живет в каждом из городов).
При использовании GROUP BY обязательно:
- перечень столбцов, по которым делается разрез, был одинаковым внутри SELECT и внутри GROUP BY,
- агрегатные функции (SUM, AVG, COUNT, MAX, MIN) должны быть также указаны внутри SELECT с указанием столбца, к которому такая функция применяется.
Группировка количества клиентов по городу:
select City, count(CustomerID) from Customers
GROUP BY City
Группировка количества клиентов по стране и городу:
select Country, City, count(CustomerID) from Customers
GROUP BY Country, City
Группировка продаж по ID товара с разными агрегатными функциями: количество заказов с данным товаром и количество проданных штук товара:
select ProductID, COUNT(OrderID), SUM(Quantity) from OrderDetails
GROUP BY ProductID
Группировка продаж с фильтрацией исходной таблицы. В данном случае на выходе будет таблица с количеством клиентов по городам Германии:
select City, count(CustomerID) from Customers
WHERE Country = 'Germany'
GROUP BY City
Переименование столбца с агрегацией с помощью оператора AS. По умолчанию название столбца с агрегацией равно примененной агрегатной функции, что далее может быть не очень удобно для восприятия.
select City, count(CustomerID) AS Number_of_clients from Customers
group by City
HAVING
HAVING — необязательный элемент запроса, который отвечает за фильтрацию на уровне сгруппированных данных (по сути, WHERE, но только на уровень выше).
Фильтрация агрегированной таблицы с количеством клиентов по городам, в данном случае оставляем в выгрузке только те города, в которых не менее 5 клиентов:
select City, count(CustomerID) from Customers
group by City
HAVING count(CustomerID) >= 5
В случае с переименованным столбцом внутри HAVING можно указать как и саму агрегирующую конструкцию count(CustomerID), так и новое название столбца number_of_clients:
select City, count(CustomerID) as number_of_clients from Customers
group by City
HAVING number_of_clients >= 5
Пример запроса, содержащего WHERE и HAVING. В данном запросе сначала фильтруется исходная таблица по пользователям, рассчитывается количество клиентов по городам и остаются только те города, где количество клиентов не менее 5:
select City, count(CustomerID) as number_of_clients from Customers
WHERE CustomerName not in ('Around the Horn','Drachenblut Delikatessend')
group by City
HAVING number_of_clients >= 5
ORDER BY
ORDER BY — необязательный элемент запроса, который отвечает за сортировку таблицы.
Простой пример сортировки по одному столбцу. В данном запросе осуществляется сортировка по городу, который указал клиент:
select * from Customers
ORDER BY City
Осуществлять сортировку можно и по нескольким столбцам, в этом случае сортировка происходит по порядку указанных столбцов:
select * from Customers
ORDER BY Country, City
По умолчанию сортировка происходит по возрастанию для чисел и в алфавитном порядке для текстовых значений. Если нужна обратная сортировка, то в конструкции ORDER BY после названия столбца надо добавить DESC:
select * from Customers
order by CustomerID DESC
Обратная сортировка по одному столбцу и сортировка по умолчанию по второму:
select * from Customers
order by Country DESC, City
JOIN
JOIN — необязательный элемент, используется для объединения таблиц по ключу, который присутствует в обеих таблицах. Перед ключом ставится оператор ON.
Запрос, в котором соединяем таблицы Order и Customer по ключу CustomerID, при этом перед названиям столбца ключа добавляется название таблицы через точку:
select * from Orders
JOIN Customers ON Orders.CustomerID = Customers.CustomerID
Нередко может возникать ситуация, когда надо промэппить одну таблицу значениями из другой. В зависимости от задачи, могут использоваться разные типы присоединений. INNER JOIN — пересечение, RIGHT/LEFT JOIN для мэппинга одной таблицы знаениями из другой,
select * from Orders
join Customers on Orders.CustomerID = Customers.CustomerID
where Customers.CustomerID >10
Внутри всего запроса JOIN встраивается после элемента from до элемента where, пример запроса:
Другие типы JOIN’ов можно увидеть на замечательной картинке ниже:
В следующей части подробнее поговорим о типах JOIN’ов и вложенных запросах.
При возникновении вопросов/пожеланий, всегда прошу обращаться!
На уроке будет рассмотрен язык запросов: оператор SELECT sql — на выборку данных
Содержание:
- Оператор SELECT sql
- Сортировка в SQL
- Удаление повторяющихся значений в SQL
- Язык sql: where условие
- Несколько условий в SQL
- Between в SQL (между)
- Предикат IN
- Предикат IN с подзапросом
- Язык SQL запрос LIKE
SQL-запрос Select предназначен для обычной выборки из базы данных. Т.е. если нам необходимо просто получить данные, не делая с ними никакой обработки и не внося изменений в базу данных, то можно смело использовать данный запмагарос.
Синтаксис оператора SELECT
SELECT * FROM имя_таблицы;Это самый простой вариант работы с оператором, когда мы выбираем все записи из таблицы БД.
Символ
*
обозначает выборку всех записей из таблицы. При этом столбцы и строки результирующего набора не упорядочены.
Рассмотрим примеры sql запросов select:
Пример БД «Институт»: если вы создали локальную базу данных и заполнили таблицы, как в рассмотренном ранее уроке (или же воспользовались сервисом sqlFiddle), то выполним следующий пример.
Необходимо выбрать все записи из таблицы teachers
Чтобы ограничить количество выбранных записей используется служебное слово
LIMIT
:SELECT * FROM имя_таблицы LIMIT 2,3;В примере происходит выборка 3 записей из таблицы, начиная со 2 записи.
Этот запрос особо необходим при создании блока страниц навигации.
Чтобы упорядочить поля результирующего набора, их следует перечислить через запятую в нужном порядке после слова
SELECT
:
SELECT name, zarplata FROM teachers;
Выберет все значения полей name
и zarplata
в том же порядке (сначала name
, затем zarplata
)
Сортировка в SQL
Чтобы выполнить сортировку по любому из полей, указанных в предложении
SELECT
, используется предложениеORDER BY
:
SELECT name, zarplata, premia FROM teachers ORDER BY name;
Выберет значения полей name
, zarplata
, premia
и отсортирует по полю name
(по алфавиту)
Пример: БД «Компьютерный магазин». Выбрать данные о скорости и памяти компьютеров. Требуется упорядочить результирующий набор по скорости процессора в порядке возрастания.
SELECT `Скорость`,`Память` FROM `pc` ORDER BY `Скорость` ASC
Или
SELECT `Скорость`,`Память` FROM `pc` ORDER BY 1 ASC
Результат:
Сортировку можно выполнять по двум полям:
SELECT `Скорость`,`Память` FROM `pc` ORDER BY `Скорость` ASC, `Память` ASC
Задание sql select 1_1. База данных Компьютерный магазин: Получить информацию только о скорости процессора и объеме оперативной памяти компьютеров.
Задание sql select 1_2. База данных Компьютерный магазин: Требуется упорядочить результирующий набор по объему оперативной памяти в порядке убывания.
Сортировку можно производить по возрастанию, тогда добавляется параметр
ASC
(он же применяется по умолчанию) или по убыванию (в таком случае добавляется параметрDESC
):
SELECT name, zarplata, premia FROM teachers ORDER BY name DESC;
Выберет значения полей name
, zarplata
, premia
и отсортирует по полю name
по убыванию
Задание 1_3. БД «Компьютерные курсы». Вывести информацию о фамилиях и годах рождения. Упорядочить результирующий набор по году рождения в порядке убывания.
Удаление повторяющихся значений в SQL
В случае когда необходимо получить уникальные строки, можно использовать ключевое слово
DISTINCT
.DISTINCT (в переводе с английского ОТЛИЧИЕ) — аргумент, который устраняет двойные значения:
Пример БД «Институт»: требуется узнать возможные варианты размера премий. Если не использовать Distinct
, в результате будет выдаваться два одинаковых значения. Удалить в sql повторяющиеся значения можно при введении Distinct
— в результате дублирующиеся значения не повторяются.
SELECT premia FROM teachers;
SELECT DISTINCT premia FROM teachers;
Рассмотрим другой пример из базы данных «Компьютерный магазин»:
Пример: База данных «Компьютерный магазин»: требуется получить информацию только о скорости процессора и объеме оперативной памяти компьютеров
SELECT Скорость, Память FROM PC;
Результат:
В таблице PC
первичным ключом является поле code
. Поскольку это поле отсутствует в запросе, в приведенном выше результирующем наборе имеются дубликаты строк.
Когда требуется получить уникальные строки (например, нас интересуют только различные комбинации скорости процессора и объема памяти, а не характеристики всех имеющихся компьютеров), то нужно использовать Distinct
:
SELECT DISTINCT Скорость, Память FROM PC;
Результат:
Задание sql select 1_3. База данных Компьютерный магазин: Из таблицы Продукты
выбрать различные страны-производители.
Задание sql select 1_1. БД «Институт» Выполните запрос на выборку id
и name
из таблицы учителей. Отсортируйте фамилии учителей по убыванию
Задание sql select 1_2. БД «Институт» Выведите возможные варианты длины курсов (length
) из таблицы курсов (courses
), удалив повторяющиеся значения
Задание 1_4. БД «Компьютерные курсы». Из таблицы личные данные вывести поля Word
и Excell
. Получить уникальные строки
Язык sql: where условие
Условие выполняется предложением
WHERE <предикат>
которое записывается после предложенияFROM
.При этом в результирующий набор попадут только те записи, для которых значение предиката равно
TRUE
(истина).
Пример БД «Институт»: Выводить данные преподавателя из таблицы teachers
, фамилия которого Иванов
SELECT * FROM `teachers` WHERE `name` = 'Иванов'
Задание sql select 1_4. База данных Компьютерный магазин: Получить информацию о частоте процессора и объеме оперативной памяти для компьютеров с ценой ниже 6000
Задание sql select 1_5. База данных Компьютерный магазин: Вывести производителей принтеров
Задание 1_5. БД «Компьютерные курсы». Получить информацию по полям Фамилия
, Имя
, Отчество
из таблицы Список
, о студентках, имя которых Ольга
Несколько условий в SQL
Предикаты (условия) могут состоять как из одного выражения, так и из любой комбинации выражений, построенных с помощью булевых операторов:
AND
,OR
или NOT
Пример БД «Институт»: вывести код преподавателя
, зарплата которого составляет 10000, а премия 500
SELECT * FROM `teachers` WHERE `zarplata`=10000 AND `premia`=500
Задание sql select 1_2. БД «Институт» Из таблицы courses
вывести длину курса (length
), название которого — «Программирование SQL»
Реляционные операторы, встречающиеся в условиях:
=
Равный
>
Больше чем
<
Меньше чем
>=
Больше чем или равно
<=
Меньше чем или равно
<>
Не равно
Задание sql select 1_6. База данных «Компьютерный магазин»: Получить информацию о компьютерах, имеющих частоту процессора не менее 500 Мгц и цену ниже 25000
Задание sql select 1_7. База данных «Компьютерный магазин»: Получить информацию обо всех принтерах, которые не являются струйными и стоят меньше 5000
Задание 1_6. БД «Компьютерные курсы». Получить информацию о студентах:
— год рождения которых выше 1983 и обучающихся на первом курсе;
— год рождения которых не 1980 или обучающихся на курсе старше второго.
Between в SQL (между)
Предикат
BETWEEN
проверяет, попадают ли значения проверяемого выражения в диапазон, задаваемый пограничными выражениями, соединяемыми служебным словомAND
.Синтаксис:
<Проверяемое выражение> [NOT] BETWEEN <Начальное выражение> AND <Конечное выражение>
Пример БД «Институт»: Вывести фамилию и зарплату преподавателя, зарплата которого между 5000 и 10000.
SELECT name, zarplata FROM teachers WHERE (zarplata BETWEEN 5000 AND 10000);
Пример БД «Институт»: Вывести фамилию и зарплату преподавателя, зарплата которого не находится в диапазоне от 5000 до 10000.
SELECT name, zarplata FROM teachers WHERE (zarplata NOT BETWEEN 5000 AND 10000);
Задание sql select 1_8. База данных «Компьютерный магазин»: Требуется найти номер и частоту процессора компьютеров стоимостью от 25000 до 35000
Предикат IN
Предикат
IN
определяет, будет ли значение проверяемого выражения обнаружено в наборе значений, который явно определен.Синтаксис:
<Проверяемое выражение> [NOT] IN (<набор значений>)
Пример БД «Институт»: вывести имена преподавателей, зарплата которых составляет 5000
, 10000
или 11000
SELECT name, zarplata FROM teachers WHERE (zarplata IN (5000,10000,11000));
Пример БД «Институт»: вывести имена преподавателей, зарплата которых не находится среди значений: 5000
, 10000
или 11000
SELECT name, zarplata FROM teachers WHERE (zarplata NOT IN (5000,10000,11000));
Задание sql select 1_3. БД «Институт» Вывести фамилию, зарплату и премию учителей, премия которых от 2000
до 5000
рублей.
Задание sql select 1_9. База данных «Компьютерный магазин»: Требуется найти номер, частоту процессора и объем жесткого диска тех компьютеров, которые комплектуются жесткими дисками 500 или 1000Гб.
Предикат IN с подзапросом
Предикат
IN
определяет, будет ли значение проверяемого выражения обнаружено в наборе значений, который получен с помощью табличного подзапроса.Синтаксис:
<Проверяемое выражение> [NOT] IN (<подзапрос>)
Пример: БД «Компьютерный магазин». Найти номер, частоту процессора и объем жесткого диска тех компьютеров, которые имеют частоту процессора 1000, 2000 и 3000 МГц и выпускаются производителем Америка
SELECT `Номер`,`Скорость`,`HD` FROM `pc` WHERE `Скорость` IN (1000,2000,3000) AND `Номер` IN (SELECT `Номер` FROM product WHERE Производитель = "Америка")
Результат:
Задание sql select 10. База данных «Компьютерный магазин»: Найти производителей компьютеров, с частотой процессора не менее 2000 МГц
Задание sql select. База данных Институт: Вывести зарплату тех преподавателей, у которых уже стоят уроки (есть записи в таблице lessons
)
Язык SQL запрос LIKE
Предикат
LIKE
сравнивает проверяемое значение с шаблоном в выражении.Синтаксис:
<Проверяемое значение>[NOT] LIKE <Выражение>
Пример: Вывести все данные о преподавателях, фамилии которых заканчиваются на "а"
SELECT * FROM teachers WHERE (name LIKE "%а");
Символ %
заменяет любую последовательность символов.
Важно: При работе с СУБД Access символ %
заменяется на символ *
Задание sql select 14. База данных «Компьютерные курсы». Вывести данные о преподавателях, фамилия которых начинается с м
. Упорядочить значения по возрастанию зарплаты
Задание sql select 11. База данных «Компьютерный магазин»: Найти все номера компьютеров, производитель которых начинается на букву «Я»
Задание sql select 12. База данных «Компьютерный магазин»: Найти все номера компьютеров, производитель которых заканчивается на букву «Я» и не начинается с буквы «Р»
Задание 1_10. БД «Компьютерные курсы». Из таблицы Личные данные
вывести Адрес
студента, номер телефона которого заканчивается цифрами 33
Задание 1_11. БД «Компьютерные курсы». Вывести сведения по студентам из таблицы Список
, фамилия которых не заканчивается на «ин»
SELECT SQL — оператор запроса, который возвращающает определённый набор данных из базы данных. Список столбцов выборки задаётся в части оператора, которая называется предложением оператора SELECT.
- Синтаксис SELECT SQL
- Примеры использования SELECT SQL
SELECT column1, column2, ...
FROM table_name;
Здесь column1
, column2
, … — это имена полей таблицы, из которой выбираются данные. Если вы хотите выбрать все поля, доступные в таблице, используйте следующий синтаксис:
SELECT * FROM table_name;
Примеры использования SELECT SQL
Если у вас есть таблица employees
со столбцами id
, name
, age
, department
, salary
, вы можете выбрать только имена и возраст всех сотрудников следующим образом:
SELECT name, age FROM employees;
Чтобы выбрать все столбцы из таблицы, вы можете использовать символ *
:
SELECT * FROM employees;
Вы также можете использовать оператор WHERE для фильтрации данных по определенным условиям. Например, чтобы выбрать только имена и возраст сотрудников младше 30 лет, используйте такой запрос:
SELECT name, age FROM employees WHERE age < 30;
Кроме того, есть ORDER BY для сортировки результатов по определённому столбцу. Например, можно отсортировать сотрудников по возрасту в порядке убывания:
SELECT * FROM employees ORDER BY age DESC;
SQL SELECT может использоваться для выполнения вычислительных операций над столбцами данных, например, для вычисления общей суммы или среднего значения. Чтобы вычислить среднюю зарплату всех сотрудников, напишем такой запрос:
SELECT AVG(salary) FROM employees;
Все эти примеры демонстрируют основы оператора SELECT в SQL. Также вы можете почитать о других основных командах SQL.
Одна из основных функций SQL — это получение выборок данных из СУБД.
Для этого в SQL используется оператор SELECT. Давайте рассмотрим несколько простых запросов с его участием.
Вывод произвольных значений
Для начала важно понимать, что через оператор SELECT можно выводить данные не только из таблиц базы данных,
но и произвольные строки, числа, даты и т.д. Например, так можно вывести произвольную строку:
Вывод всех данных из таблицы
Для вывода всех полей из определённой таблицы используется символ *. Давайте взглянем на схему базы данных и
выведем данные одной из таблиц.
SELECT * FROM FamilyMembers
Вывод данных из определённых колонок таблицы
Если необходимо вывести информацию только по определённым столбцам таблицы, а не всю сразу, то
это можно сделать перечисляя названия столбцов через запятую:SELECT member_id, member_name FROM FamilyMembers
Псевдонимы
В случае, если мы хотим вывести какие-то столбцы таблицы, но чтобы в итоговой выборке они были названы иначе,
мы можем использовать псевдонимы (их также называют алиасами).Их синтаксис достаточно простой, мы должны использовать оператор AS. Как в примере ниже:
SELECT member_id, member_name AS Name FROM FamilyMembers
Или же можно обойтись и без него, просто написав желаемое наименование поля через пробел.
SELECT member_id, member_name Name FROM FamilyMembers
Псевдонимы могут содержать до 255 знаков (включая пробелы, цифры и специальные символы)
Самостоятельные упражнения
Это наш первый урок практического модуля. До этого были лишь теоретические, направленные на восполнение потенциальных пробелов в теории реляционных баз данных.
После каждого практического урока мы предлагаем группу заданий для самостоятельной работы, чтобы сразу же закрепить полученную информацию.Если вы пропустили модуль «Введение», а именно статью «Структура курса» , где описывался принцип работы и интерфейс блока
«Самостоятельные упражнения», то рекомендуем вернуться к нему .