Результатом выполнения оператора 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
, могут использоваться по желанию для уточнения выборки данных.
Для
выборки информации из таблиц базы данных
используется SQL-инструкций SELECT (выбрать)
языка SQL.
Упрощенный
синтаксис SQL-инструкций SELECT
в общем случае выглядит следующим
образом:
SELECT
[DISTINCT]
<СПИСОК АТРИБУТОВ>
FROM
<список таблиц> [WHERE
<условие выборки >]
[ORDER
BY
<СПИСОК АТРИБУТОВ>]
[GROUP
BY
<список атрибутов>]
[HAVING
<условие>]
[UNION
<выражение с оператором SELECT>];
Примечание:
в квадратных скобках указаны
элементы, которые могут отсутствовать
в запросе.
Ключевое
слово SELECT
сообщает базе данных, что данное
предложение является запросом на
извлечение информации. После слова
SELECT
через запятую перечисляются наименования
полей (список атрибутов), содержимое
которых запрашивается.
Обязательным
ключевым словом в предложении-запросе
SELECT
является слово FROM
(из). За ключевым словом FROM
указывается список разделенных запятыми
имен таблиц, из которых извлекается
информация.
3. Содержание работы
Задание
№1.
Создать запрос на выборку в режиме SQL
всех значений полей ИМЯ и ФАМИЛИЯ из
таблицы СПИСОК.
Перейдите
на вкладку Запросы,
щелкнув в Окне базы данных кнопку
Запросы.
Нажмите
кнопку Создать
и
в открывшемся окне Новый
запрос
выберите
Конструктор.
Нажмите
кнопку ОК, в открывшемся окне Добавление
таблицы кнопку
Закрыть.
Щелкните
на раскрывающемся списке кнопки Вид на
панели инструментов и выберите режим
SQL.
В
открывшемся окне Запрос
1: запрос на
выборку наберите:
SELECT
ИМЯ, ФАМИЛИЯ
FROM
СПИСОК;
Для
запуска запроса нажмите кнопку Запуск
на
панели инструментов.
Задание
№2.
Создать запрос на выборку в режиме SQL
всех столбцов таблицы СПИСОК.
Вместо
перечисления имен столбцов можно
использовать символ «*» (звездочка).
SELECT
*
FROM
СПИСОК;
Результатом
выполнения запроса будет вся таблица
СПИСОК.
Задание
№3.
Создать запрос на выборку в режиме SQL
названий городов, где проживают студенты,
сведения о которых находятся в таблице
ЛИЧНЫЕ_ДАННЫЕ.
SELECT
ГОРОД
FROM
ЛИЧНЫЕ_ДАННЫЕ;
Результатом
запроса будет таблица, в которой
будут встречаться одинаковые строки.
Внимание!
Получаемые в результате SQL-запроса
таблицы не в полной мере отвечают
определению реляционного отношения. В
частности, в них могут оказаться кортежи
с одинаковыми значениями атрибутов.
Для
исключения из результата SELECT
запроса повторяющихся записей используется
ключевое слово DISTINCT
(отличный). Если запрос SELECT
извлекает множество полей, то DISTINCT
исключает дубликаты строк, в которых
значения всех выбранных полей идентичны.
Предыдущий
запрос можно записать в следующем виде.
SELECT
DISTINCT
ГОРОД
FROM
ЛИЧНЫЕ_ДАННЫЕ;
В
результате получим таблицу, в которой
дубликаты строк исключены.
Ключевое
слово ALL
(все), в отличие от DISTINCT,
оказывает противоположное действие,
то есть при его использовании повторяющиеся
строки включаются в состав выходных
данных. Режим, задаваемый ключевым
словом ALL,
действует по умолчанию, поэтому в
реальных запросах для этих целей оно
практически не используется.
Задание
№4.
Создать запрос на выборку в режиме SQL,
выполняющий выборку имен всех студентов
с фамилией Воробьёв, сведения о которых
находятся в таблице СПИСОК.
Для
задания в запросе условия отбора
используется ключевое слово
WHERE
(где), принимающее значение истина или
ложь для значении полей строк таблиц,
к которым обращается оператор
SELECT.
Предложение WHERE
определяет, какие строки указанных
таблиц должны быть выбраны. В таблицу,
являющуюся результатом запроса,
включаются только те строки, для которых
условие (предикат), указанное в
предложении WHERE
принимает значение истина.
Запрос
будет выглядеть следующим образом:
SELECT
ФАМИЛИЯ,
ИМЯ
FROM
СПИСОК
WHERE
ФАМИЛИЯ=’Воробьёв’;
Задание
№5.
Создать запрос на выборку в режиме SQL
для получения имен и фамилий студентов,
обучающихся в группе УИТ-41 и получающих
стипендию (размер стипендии больше
нуля).
В
задаваемых в предложении WHERE
условиях могут использоваться операции
сравнения, определяемые операторами
= (равно), > (больше), < (меньше), >=
(больше или равно), < = (меньше или
равно), <>
(не
равно), а также логические операторы
AND,
OR
и NOT.
SQL-запрос
будет выглядеть таким образом:
SELECT
ИМЯ,
ФАМИЛИЯ
FROM
СПИСОК
WHERE
ГРУППА
=’УИТ-41’ AND
СТИПЕНДИЯ> 0;
Задание
№6.
Создать запрос в режиме SQL.
на выборку из таблицы ЛИЧНЫЕ_ДАННЫЕ
сведении о студентах, имеющих оценки
по физике только 4 и 5.
При
задании логического условия в предложении
WHERE
могут быть использованы операторы IN,
BETWEEN,
LIKE,
IS
NULL.
Операторы
IN
(равен любому из списки) и NOT
IN
(не равен ни одному из списка) используются
для сравнения проверяемого значения
поля с заданным списком. Этот список
значений указывается в скобках справа
от оператора IN.
Построенный
с использованием IN
предикат (условие) считается истинны,
если значение поля, имя которого указано
слева от IN,
совпадает (подразумевается точное
совпадение) с одним из значений,
перечисленных в списке, указанном в
скобках справа от IN.
Предикат,
построенный с использованием NOT
IN,
считается истинным, если значение поля,
имя которого указано слева от NOT
IN,
не совпадает ни с одним из значений,
перечисленных в списке, указанном в
скобках справа от NOT
IN.
Запрос
будет выглядеть следующим образом:
SELECT
*
FROM
ЛИЧНЫЕ_ДАННЫЕ
WHERE
ФИЗИКА
IN
(4,
5);
Задание
№7.
Coздать
зanpoc
и режиме SQL
на выборку сведений о студентах, не
имеющих ни одной экзаменационной оценки
по физике и математике, равной 4 и 5.
SELECT
*
FROM
ЛИЧНЫЕ_ДАННЫЕ
WHERE
ФИЗИКА
NOT
IN
(4, 5) AND
МАТЕМАТИКА
NOT
IN
(4, 5);
Задание
№8.
Создать запрос в режиме SQL
на выборку записей о преподавателях,
часы которых находятся в пределах между
30 и 40.
Оператор
BETWEEN
используется для проверки условия
вхождении значения поля в заданный
интервал, то есть вместо списка
значений атрибута этот оператор задает
границы его изменения.
Оператор
BETWEEN
может использоваться как для числовых,
так и для символьных типов полей.
Зanpoc
будет иметь вид:
SELECT
*
FROM
ГРУППЫ
WHERE
ЧАСЫ
BETWEEN
30
AND
40;
Граничные
значения, в данном случае значения
30 и 40, входят во множество значений,
с которыми производится сравнение.
Задание
№9.
Создать запрос в режиме SQL
на выборку из таблицы СПИСОК сведений
о студентах, фамилии которых начинаются
на букву «В».
Опеpamop
LIKE
применим только к символьным полям.
Этот оператор просмаmpueaem
строковые значения полей с целью
определения, входит ли
Заданная
в операторе LIKE
подстрока (образец поиска) в символьную
строку-значение проверяемого поля.
SELECT*
FROM
СПИСОК
WHERE
ФАМИЛИЯ
LIKE
‘В*’;
SELECT Name SQL, SQL запрос SELECT WHERE, выбор столбца, упорядочивание и другие практические примеры использования оператора.
SELECT SQL — оператор запроса, который возвращающает определённый набор данных из базы данных. Список столбцов выборки задаётся в части оператора, которая называется предложением оператора SELECT.
- Синтаксис SELECT SQL
- Примеры использования SELECT SQL
Синтаксис SELECT SQL
SELECT column1, column2, ...
FROM table_name;
На данный момент этот блок не поддерживается, но мы не забыли о нём!Наша команда уже занята его разработкой, он будет доступен в ближайшее время.
На данный момент этот блок не поддерживается, но мы не забыли о нём!Наша команда уже занята его разработкой, он будет доступен в ближайшее время.
На уроке будет рассмотрен язык запросов: оператор 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. БД «Компьютерные курсы». Вывести сведения по студентам из таблицы Список
, фамилия которых не заканчивается на «ин»
#статьи
-
0
Эти команды нужны разработчикам, аналитикам, маркетологам и всем, кто хочет выжимать из данных максимум пользы.
Иллюстрация: Оля Ежак для Skillbox Media
Любитель научной фантастики и технологического прогресса. Хорошо сочетает в себе заумного технаря и утончённого гуманитария. Пишет про IT и радуется этому.
SQL — это язык запросов для управления реляционными базами данных. «Реляционные» означает, что все данные хранятся в виде взаимосвязанных таблиц. А SQL как раз используют для того, чтобы как-то влиять на элементы внутри этих таблиц: добавлять, удалять, изменять и так далее.
Язык SQL лежит в основе систем управления реляционными базами данных, таких как MySQL, PostgreSQL, Oracle и т.д. Таким образом, чтобы работать, скажем, с базой данных MySQL, нужно сперва изучить язык запросов SQL.
По синтаксису SQL-запросы максимально похожи на обычные предложения:
SELECT (Name, Age) FROM Clients WHERE Age > 20
Если перевести на русский, получится что-то вроде:
Выбрать Имя и Возраст из Таблицы с клиентами, где Возраст больше 20
В этой статье мы научимся читать такие запросы, понимать, как они работают, а заодно попрактикуемся в создании собственных. В результате у нас получится простая база данных с котами и их владельцами.
Подробнее о языке SQL и принципах его работы мы рассказывали в одной из предыдущих статей. Если хотите чуть лучше разбираться в технических нюансах языка, можно начать с неё. Но это не обязательно
Перед тем как писать команды, разберёмся, какие есть виды запросов в SQL. Всего их четыре — DDL, DML, DCL и TCL. Каждый из них выполняет определённые действия — давайте разберём каждую категорию подробнее.
DDL, или data definition language, нужен, чтобы определять данные. Эти запросы позволяют настраивать базу данных — создавать с нуля и прописывать её структуру.
Примеры DDL-запросов: CREATE, DROP, RENAME, ALTER.
DML, или data manipulation language, нужен, чтобы управлять данными в таблицах. Эти запросы помогают добавлять, обновлять, удалять и выбирать данные.
Примеры DML-запросов: SELECT, UPDATE, DELETE, INSERT.
DCL, или data control language, нужен, чтобы выдавать или отзывать права доступа для пользователей.
Примеры DCL-запросов: GRANT, REVOKE, DENY.
TCL, или transaction control language, нужен, чтобы управлять транзакциями. Это могут быть запросы, связанные с подтверждением или откатом изменений в базе данных.
Примеры TCL-запросов: COMMIT, ROLLBACK, BEGIN.
Инфографика: Оля Ежак для Skillbox Media
Теперь перейдём к тому, как SQL-запросы составляются и из каких элементов состоят.
Перед вами — пример классического SQL-запроса, который состоит из шести самых популярных операторов: два из них обязательные, а другие четыре — используются по обстоятельствам. Вместе они выглядят так:
- SELECT — выбирает отдельные столбцы или всю таблицу целиком (обязательный);
- FROM — из какой таблицы получить данные (обязательный);
- WHERE — условие, по которому SQL выбирает данные;
- GROUP BY — столбец, по которому мы будут группироваться данные;
- HAVING — условие, по которому сгруппированные данные будут отфильтрованы;
- ORDER BY — столбец, по которому данные будут отсортированы;
Давайте разберём каждую из частей этого запроса по порядку.
Любая команда должна начинаться с ключевого слова — или действия, которое должно произойти. Например, выбрать строку, вставить новую, изменить старую или удалить таблицу целиком.
Одно из таких ключевых слов — SELECT. Оно выбирает отдельные столбцы или таблицу целиком, чтобы потом передать данные другим запросам на обработку.
В качестве примера выберем столбцы Name и Age из таблицы Clients:
SELECT (Name, Age) FROM Clients
На выходе будут все строки таблицы, принадлежащие столбцам Name и Age.
Эта часть ставится после SELECT и нужна затем, чтобы указать, из какой таблицы или источника данных приходит информация. Здесь прописывается имя таблицы, с которой мы хотим работать.
Например, ранее мы уже выбирали данные из таблицы Clients:
SELECT (Name, Age) FROM Clients
В SQL всё построено на таблицах. Поэтому, если нужно получить данные из другого места — указываем другую таблицу.
Если нужно отфильтровать данные, используем слово WHERE. После него указывается условие, которому должны удовлетворять строки, чтобы они попали в результат выполнения запроса.
Например, этот запрос вернёт все строки из таблицы, где значения Age больше 20:
SELECT (Name, Age) FROM Clients WHERE Age > 20
Этот оператор помогает нам сгруппировать данные по определённым столбцам. В результате получим новую таблицу, составленную на основе выбранных данных.
Например, сгруппируем результат предыдущего запроса по городам:
SELECT (Name, Age) FROM Clients WHERE Age > 20 GROUP BY City
Запрос вернёт клиентов старше 20 лет и сгруппирует их по городам. Главное — чтобы столбец City присутствовал в таблице.
Нужен, чтобы собирать группы по определённым условиям. Его обычно используют в паре с GROUP BY, а по своей функциональности он похож на WHERE.
Например, укажем, чтобы в группы добавлялись только клиенты с суммой заказа от 1000 рублей:
SELECT (Name, PaymentAmount, Age) FROM Clients WHERE Age > 20 GROUP BY City HAVING PaymentAmount > 1000
Так как наш запрос растёт, будем каждую его часть выносить на новую строку — чтобы не запутаться. На корректность запроса это не повлияет, а читать его станет куда удобнее.
Позволяет сортировать полученные строки по возрастанию или убыванию. Работает как с числами, так и с символами. В качестве параметра нужно указать столбец, по которому надо выполнить сортировку.
Допустим, если хотим отсортировать клиентов по возрасту — от младшего к старшему, — добавляем команду ORDER BY Age:
SELECT (Name, PaymentAmount, Age) FROM Clients WHERE Age > 20 GROUP BY City HAVING PaymentAmount > 1000 ORDER BY Age
А чтобы отсортировать по убыванию, просто добавляем слово DESC:
SELECT (Name, PaymentAmount, Age) FROM Clients WHERE Age > 20 GROUP BY City HAVING PaymentAmount > 1000 ORDER BY Age DESC
Кроме этих шести операторов есть масса дополнительных — например, VIEW, UNION, LIKE. Они уникальны для каждого запроса и используются в зависимости от ситуации. Конечно, в этой статье мы не успеем разобрать все — если вам нужен полный список, можно заглянуть в эту шпаргалку по SQL.
Со структурой запросов разобрались, пришло время посоздавать таблицы. В качестве примера будем наполнять базу данных с котами, живущими в разных городах России.
Первым делом создаём базу данных. Делается это с помощью команды CREATE DATABASE:
CREATE DATABASE CatsCatsCats;
Внутри пока ничего нет. Но это пока.
Запрос создаёт таблицу в базе данных. В общем виде команда выглядит так:
CREATE TABLE table_name ( column1 datatype, column2 datatype, column3 datatype );
Чтобы задать свои параметры таблицы, на месте table_name пишем название, а в скобках указываем названия колонок и типы данных, которые они будут содержать.
В SQL много типов данных. Вот примеры самых популярных:
- INT — целое число;
- DATETIME — дата;
- VARCHAR — строка;
- FLOAT — десятичное число.
В нашей таблице используется два типа: строки (VARCHAR) и целые числа (INT):
CREATE TABLE CatsAndOwners ( CatID int(6) NOT NULL, CatName varchar(255) NOT NULL, CatAge int(6) NOT NULL, CatColor varchar(255) NOT NULL, CatOwnerName varchar(255) NOT NULL );
В примере выше мы добавили пять столбцов: уникальный номер кота CatID, его имя CatName, возраст CatAge, цвет CatColor и имя владельца CatOwnerName. А ещё задали, чтобы ни одно из полей не было пустым — NOT NULL.
Цифры рядом с типами данных обозначают, сколько бит выделяется для поля. Например, varchar (255) значит, что строка может принимать размер от 0 до 255 бит — по объёму данных это приблизительно соответствует фразе «Я люблю язык SQL».
Созданная таблица пока выглядит пустовато. Читайте дальше, чтобы узнать, как наполнить её данными и научиться группировать их по своему усмотрению.
CatID | CatName | CatAge | CatColor | CatOwnerName |
---|---|---|---|---|
| | | | |
Если вдруг забыли добавить столбец во время создания таблицы — ничего страшного. Новые колонки можно добавлять с помощью команды ALTER TABLE. Давайте добавим город проживания кота:
ALTER TABLE CatsAndOwners ADD City varchar(255);
В запросе указываем, в какую таблицу хотим внести изменения, а затем с помощью ключевого слова ADD добавляем название столбца и его тип данных.
Теперь таблица выглядит так:
CatID | CatName | CatAge | CatColor | CatOwnerName | City |
---|---|---|---|---|---|
| | | | | |
Вообще, возможности команды ALTER TABLE немного шире, чем мы разобрали в этом примере. Она заточена не только на добавление новых колонок, но и на удаление и редактирование существующих. Подробнее об этом поговорим чуть дальше, а пока — продолжим наполнять таблицу.
Позволяет добавить новую строку в таблицу. Для этого нужно указать, какие столбцы мы хотим заполнить и передать значения для них с помощью команды VALUES. Добавим несколько котов:
INSERT INTO CatsAndOwners(CatID, CatName, CatAge, CatColor, CatOwnerName, City) VALUES (1, 'Мурка', 3, 'Чёрная', 'Дмитрий', 'Москва'); INSERT INTO CatsAndOwners(CatID, CatName, CatAge, CatColor, CatOwnerName, City) VALUES (2, 'Белла', 7, 'Белая', 'Максим', 'Саратов'); INSERT INTO CatsAndOwners(CatID, CatName, CatAge, CatColor, CatOwnerName, City) VALUES (3, 'Симба', 5, 'Рыжий', 'Екатерина', 'Санкт-Петербург'); INSERT INTO CatsAndOwners(CatID, CatName, CatAge, CatColor, CatOwnerName, City) VALUES (4, 'Лео', 2, 'Полосатый', 'Александр', 'Екатеринбург'); INSERT INTO CatsAndOwners(CatID, CatName, CatAge, CatColor, CatOwnerName, City) VALUES (5, 'Мася', 1, 'Серый', 'Анна', 'Москва');
Обратите внимание: строки указываются в одинарных кавычках, а числа — без них. И, к сожалению, нельзя добавить несколько строк одной командой.
Блеск! Таблица наконец-то обзавелась данными:
CatID | CatName | CatAge | CatColor | CatOwnerName | City |
---|---|---|---|---|---|
1 | Мурка | 3 | Чёрная | Дмитрий | Москва |
2 | Белла | 7 | Белая | Максим | Саратов |
3 | Симба | 5 | Рыжий | Екатерина | Санкт-Петербург |
4 | Лео | 2 | Полосатый | Александр | Екатеринбург |
5 | Мася | 1 | Серый | Анна | Москва |
Запрос нужен, чтобы доставать данные из таблицы. Ранее мы уже успели познакомиться с этой командой, — давайте немного освежим память. Достанем из таблицы список котов и их владельцев:
SELECT CatName, CatOwnerName FROM CatsAndOwners;
Результат:
CatName | CatOwnerName |
---|---|
Мурка | Дмитрий |
Белла | Максим |
Симба | Екатерина |
Лео | Александр |
Мася | Анна |
Если нужно выбрать все столбцы из таблицы, после слова SELECT добавим символ *. В этом случае на выходе получим всю таблицу целиком.
SELECT * FROM CatsAndOwners;
Нужен, чтобы задавать условия для фильтрации строк. Например, можем выбрать только те, у которых значение CatAge больше 5:
SELECT CatName, CatAge FROM CatsAndOwners WHERE CatAge > 5
Результатом будет одна строка с двумя столбцами:
Оператор WHERE интересен тем, что внутри него можно указывать условия — причём сразу несколько. Делается это с помощью логических конструкций AND, OR и BETWEEN.
AND — это логическое И. Оно означает, что должны выполняться оба условия запроса одновременно. Например, кошка должна быть чёрной И проживать в Москве.
SELECT CatName FROM CatsAndOwners WHERE CatColor = 'Чёрная' AND City = 'Москва'
Результат:
OR — это логическое ИЛИ. Оно означает, что должно выполниться или одно условие, или второе. Например, кошка должна быть ИЛИ старше пяти лет, ИЛИ быть чёрной.
SELECT CatName FROM CatsAndOwners WHERE CatAge > 5 OR CatColor = 'Чёрная'
Результат:
BETWEEN — это оператор, который выбирает все элементы внутри заданного диапазона. Например, можно запросить всех кошек в возрасте от двух до шести лет.
SELECT CatName, CatAge FROM CatsAndOwners WHERE CatAge BETWEEN 2 AND 6
Результат:
CatName | CatAge |
---|---|
Мурка | 3 |
Симба | 5 |
Лео | 2 |
Все вышеуказанные операторы можно использовать одним пакетом:
SELECT CatName, CatAge FROM CatsAndOwners WHERE CatAge BETWEEN 2 AND 8 AND (City = 'Саратов' OR City = 'Санкт-Петербург') OR CatName = 'Мурка'
Результат:
CatName | CatAge |
---|---|
Мурка | 3 |
Белла | 7 |
Симба | 5 |
Сортирует полученные строки в заданном столбце по убыванию или по возрастанию. Например, можем выбрать всех кошек и отсортировать их от самых старших к самым младшим:
SELECT CatName, CatAge FROM CatsAndOwners ORDER BY CatAge DESC
Результат:
CatName | CatAge |
---|---|
Белла | 7 |
Симба | 5 |
Мурка | 3 |
Лео | 2 |
Мася | 1 |
Чтобы отсортировать записи по возрастанию, нужно просто убрать из запроса параметр DESC:
SELECT CatName, CatAge FROM CatsAndOwners ORDER BY CatAge
Результат:
CatName | CatAge |
---|---|
Мася | 1 |
Лео | 2 |
Мурка | 3 |
Симба | 5 |
Белла | 7 |
Выбранные строки можно сгруппировать по столбцам. Например, можем посмотреть, сколько кошек живёт в разных городах.
SELECT City, COUNT(*) AS CatCount FROM CatsAndOwners GROUP BY City;
В этом примере мы применили агрегатную функцию COUNT, которая посчитала количество строк в каждой группе. К функциям-агрегаторам мы вернёмся позже, а пока — насладимся результатом:
CatName | CatCount |
---|---|
Москва | 2 |
Саратов | 1 |
Санкт-Петербург | 1 |
Екатеринбург | 1 |
Также мы использовали оператор AS, чтобы задать название для новой колонки, в которую мы и собрали количество котов в разных городах.
Запрос позволяет ограничить количество строк в финальной выдаче. Например, можем указать, чтобы выводились только первые две строки из таблицы:
SELECT * FROM CatsAndOwners LIMIT 2;
Результат:
CatID | CatName | CatAge | CatColor | CatOwnerName | City |
---|---|---|---|---|---|
1 | Мурка | 3 | Чёрная | Дмитрий | Москва |
2 | Белла | 7 | Белая | Максим | Саратов |
Позволяет изменить данные в таблице. Допустим, кошка Симба сходила в парикмахерскую для животных и сменила цвет шёрстки на пурпурный. Отражаем эти изменения в таблице с помощью такого кода:
UPDATE CatsAndOwners SET CatColor = 'Пурпурный' WHERE CatName = 'Симба';
Всё просто: рядом с командой UPDATE пишем название таблицы, которую нужно обновить, затем рядом с SET указываем, какой именно столбец меняем и на какое значение, а в конце — определяем конкретную ячейку.
Результат:
CatID | CatName | CatAge | CatColor | CatOwnerName | City |
---|---|---|---|---|---|
1 | Мурка | 3 | Чёрная | Дмитрий | Москва |
2 | Белла | 7 | Белая | Максим | Саратов |
3 | Симба | 5 | Пурпурный | Екатерина | Санкт-Петербург |
4 | Лео | 2 | Полосатый | Александр | Екатеринбург |
5 | Мася | 1 | Серый | Анна | Москва |
Удаляет строку. Например, можем удалить из таблицы всех кошек, которые живут в Саратове:
DELETE FROM CatsAndOwners WHERE City = 'Саратов';
Результат:
CatID | CatName | CatAge | CatColor | CatOwnerName | City |
---|---|---|---|---|---|
1 | Мурка | 3 | Чёрная | Дмитрий | Москва |
3 | Симба | 5 | Пурпурный | Екатерина | Санкт-Петербург |
4 | Лео | 2 | Полосатый | Александр | Екатеринбург |
5 | Мася | 1 | Серый | Анна | Москва |
Удаляет столбец. Например, можно удалить имена кошачьих хозяев:
ALTER TABLE CatsAndOwners DROP COLUMN CatOwnerName;
Заметьте, что сначала нужно применить команду ALTER TABLE. Как мы помним, она заточена на то, чтобы добавлять, менять или удалять колонки в таблице.
Результат:
CatID | CatName | CatAge | CatColor | City |
---|---|---|---|---|
1 | Мурка | 3 | Чёрная | Москва |
3 | Симба | 5 | Пурпурный | Санкт-Петербург |
4 | Лео | 2 | Полосатый | Екатеринбург |
5 | Мася | 1 | Серый | Москва |
Если таблица больше не нужна, можем удалить её. Сделать это просто:
DROP TABLE CatsAndOwners;
Применяйте команду на свой страх и риск. Предварительно советуем всё-таки сохранить таблицу — вдруг пригодится.
Агрегатные функции используют для того, чтобы производить вычисления с данными в таблице: считать количество строк, суммировать значения в столбце, найти среднее значение и так далее.
В SQL доступны пять агрегатных функций:
- COUNT — посчитать количество строк;
- SUM — посчитать сумму значений в столбце;
- AVG — получить среднее значение в столбце;
- MIN — получить минимальное значение в столбце;
- MAX — получить максимальное значение в столбце.
Попробуем вычислить совокупный возраст всех кошек:
SELECT SUM(CatAge) AS TotalAge FROM CatsAndOwners;
Результат:
Теперь найдём наименьший возраст кошки:
SELECT MIN(CatAge) AS MinAge FROM CatsAndOwners;
Результат:
А теперь высшая математика — вычислим средний возраст кошек для каждого города:
SELECT City, AVG(CatAge) AS AverageAge FROM CatsAndOwners GROUP BY City;
Результат:
City | AverageAgeCatCount |
---|---|
Москва | 2 |
Санкт-Петербург | 5 |
Екатеринбург | 2 |
Выделим важные пункты из этой статьи, которые стоит запомнить:
- SQL — это язык структурированных запросов. Он нужен, чтобы управлять информацией в реляционных базах данных — то есть тех, которые состоят из связанных между собой таблиц.
- Каждый запрос нацелен на то, чтобы совершать какое-то действие с данными в таблице: выводить на экран, добавлять новые, считать средние значения, удалять и так далее.
- Все запросы делятся на четыре группы: DDL, DML, DCL и TCL. DDL отвечает за определение данных. DML — за управление данными. DCL — за выдачу прав доступа. TCL — за управление транзакциями.
- Классический запрос состоит из шести операторов. Два из них обязательные: SELECT и FROM. Остальные четыре — используются в зависимости от задачи: WHERE, GROUP BY, HAVING и ORDER BY.
- Помимо базовых команд, в SQL существует множество дополнительных — изучить их можно, например, в шпаргалке от W3Schools. А ещё лучше — берите эти команды на вооружение и экспериментируйте, ведь теория без практики мертва.
Жизнь можно сделать лучше!
Освойте востребованную профессию, зарабатывайте больше и получайте от работы удовольствие. А мы поможем с трудоустройством и важными для работодателей навыками.
Посмотреть курсы