Sqlвыборка с упорядочением


Содержание

Выборка данных — оператор SELECT.

Тема: Создание запросов на выборку.

Введение в SQL

SQL является инструментом для выборки и обработки информации, которая содержится в компьютерной базе данных. Уникальность этого языка состоит в том, что он является единственным стандартным языком баз данных. Язык SQL поддерживают свыше 100 СУБД (Системы Управления Базами Данных). И самое главное: несмотря на то, что каждая СУБД по-своему извращается над стандартом (вносит какие-то свои дополнения), стандартный SQL поддерживают все базы данных.

Когда пользователю необходимо получить информацию из базы данных, он запрашивает эту информацию у СУБД с помощью SQL. СУБД обрабатывает запрос, находит (или не находит) требуемые данные и возвращает результат пользователю.

SQL используется для реализации всех функциональных возможностей, предоставляемых СУБД. К ним относятся:

  • Организация данных. SQL предоставляет пользователю возможность изменять структуру представления данных, а также устанавливать отношения между элементами базы данных.
  • Выборка данных. SQL дает пользователю или приложению возможность извлекать из базы данных содержащуюся в ней информацию и пользоваться ею.
  • Обработка данных. SQL дает пользователю или приложению возможность изменять базу данных, то есть добавлять в нее новые данные, а также удалять или модифицировать имеющиеся данные.
  • Управление доступом. С помощью SQL можно ограничить возможности пользователя по выборке и изменению данных и защитить их от несанкционированного доступа.
  • Совместное использование данных. SQL позволяет координировать совместное использование данных пользователями, которые работают параллельно, чтобы они не мешали друг другу.
  • Целостность данных. SQL позволяет обеспечить целостность базы данных, защищая ее от разрушения из-за несогласованных изменений или отказа системы.

Операторы языка SQL.

Команды языка SQL можно поделить на три категории:

  • DDL — Data Definition Language (Язык Определения Данных) — состоит из команд, которые создают объекты (таблицы, индексы, представления, и так далее) в базе данных.
  • DML — Data Manipulation Language (Язык Манипулирования Данными) — это набор команд, которые определяют какие значения представлены в таблицах в любой момент времени.
  • DCL — Data Control Language (Язык Управления Данными) — состоит из средств, которые определяют, разрешить ли пользователю выполнять определенные действия или нет.

Рассмотрим основные операторы DDL.

Выборка данных — оператор SELECT.

Замечание: SQL является регистронезависимым языком, то есть различия между большими и малыми буквами не существует.

Предположим у нас есть таблица, которая хранит информацию об имеющихся книгах и их атрибутах

Запрос, позволяющий отобразить всю таблицу (она называется Books) целиком, выглядит таким образом: Select * From Books

Здесь: Select — оператор выборки данных; * — указывает, что должны выбираться все столбцы в том же порядке, как они определены в базе данных; ключевое слово From указывает откуда должны выбираться данные (имя таблицы).

Если же пользователю не нужна полная информация, он может указать какие столбцы необходимо выбирать и в каком порядке, расположив имена столбцов после инструкции Select, и разделив их запятыми.

Select Name, Author, Press, Pages

В этом случае пользователь выбирает только названия книг, их авторов, издательство и количество страниц.

Пользователь также имеет возможность форматировать вывод результата запроса на экран. Например, результат запроса

Select ‘Book = ‘, Name, ‘Press = ‘, Press

дает следующие результаты (см. рисунок).

Как можно заметить, у текстовых столбцов не очень понятное название (Expr2000 и т. п.). Так происходит потому, что таких столбцов в базе не существует и Access дает им собственные названия. Чтобы этого избежать, можно дать этим столбцам псевдонимы.

Select ‘Book = ‘ as BookName, Name, ‘Press = ‘as PressName, Press

Результат представлен на рисунке.

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

SQL также позволяет создавать «на лету» столбцы, значения в которых строятся на основе какого-либо выражения, в котором участвуют значения «реальных» столбцов, в каждой строке соответственно. Такой столбец называется вычислимым.

Например, вычислим общее количество страниц по имеющимся в наличии книгам.

Select Name, Quantity * Pages as TotalPages

Результат выполнения запроса представлен на рисунке.

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

Select Author From Books

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

Select Distinct Author From Books

Результат выполнения запроса представлен на рисунке.

Как видите, строки-дубликаты больше не появляются.

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

Для установки условия используется ключевое слово Where и набор логических операторов:

  • > — больше
  • >= — больше либо равно
  • — не равно (в некоторых базах используется знак !=)
  • and — логическое «И» (умножение)
  • or — логическое «или» (сложение)
  • not — логическое «не» (отрицание)
  • between — принадлежность диапазону
  • in — проверка на членство в множестве
  • like — проверка на соответствие шаблону
  • is null — проверка на равенство значению NULL

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

Приведем несколько примеров:

Запрос: необходимо вывести книги по программированию издательств «Питер» и «BHV»

Select Name as Название, Themes as Тематика, Press as Издательство

Where Themes = ‘Программирование’ and (Press = ‘BHV’ or Press = ‘Питер’)

Результат выполнения запроса представлен на рисунке.

Замечание: строки в SQL берутся в одинарные кавычки

Запрос: отобразить все книги, у которых количество страниц лежит в пределах от 200 до 600

Select Name as Название, Pages as Страницы

Where Pages Between 200 And 600

Результат выполнения запроса представлен на рисунке.

Запрос: отобразить все книги, имена авторов которых лежат в диапазоне от буквы ‘В’ до ‘О’

Select Name as Название, Author as Автор

Where Name Between ‘В’ And ‘О’

Результат выполнения запроса представлен на рисунке.

Замечание: при сравнении с текстом, отбор осуществляется согласно ASCII-кодам символов

Запрос: выбрать книги, относящиеся к программированию или к базам данных, и издательства которых не ‘Питер’и не ‘Бином’

Select Name as Название, Themes as Тематика, Press as Издательство

Where Press not in (‘Питер’,’Бином’)

Themes in (‘Программирование’,’Базы данных’)

Результат выполнения запроса представлен на рисунке.

Запрос: выбрать из таблицы тех авторов, у которых в имени и фамилии не менее трех букв ‘а’

Select Name as Автор

Where Name Like ‘*а*а*а*’

Результат выполнения запроса представлен на рисунке.

Оператор Like реализует поиск по шаблону:

  • * — означает, что данной позиции может присутствовать 0 или более любых символов (в других СУБД применяется символ %);
  • ? — означает, что в данной позиции обязан присутствовать 1 любой символ (в других СУБД применяется символ _);
  • # — означает, что в данной позиции обязана присутствовать 1 любая цифра;
  • [a-z] — означает, что в данной позиции обязан присутствовать 1 символ из указанного диапазона;
  • [dfaf] — означает, что в данной позиции обязан присутствовать 1 символ из указанного множества;
  • [!safgwe] — означает, что в данной позиции обязан присутствовать 1 символ, не входящий в указанный диапазон.

Для сортировки результирующих строк используется оператор Order By с необязательным параметром Asc (стоит по умолчанию) — сортировка по возрастанию (по алфавиту для строк), или Desc — сортировка по убыванию.

Запрос: отобразить всех авторов и их книги, авторов отсортировать по возрастанию, а названия книг (по авторам) по убыванию (вторичная сортировка)

Select Author as Автор, Name as Название

Order By Author, Name Desc

Результат выполнения запроса представлен на рисунке.

Итог:

Запрос на выборку данных подчиняется строгой структуре:

  1. Сначала указывается что выбрать и как отобразить (Select)
  2. Затем откуда выбрать (From)
  3. Как выбрать (Where)
  4. Как сортировать (Order By)

Не нашли то, что искали? Воспользуйтесь поиском:

Лучшие изречения: Только сон приблежает студента к концу лекции. А чужой храп его отдаляет. 8807 — | 7523 — или читать все.

188.64.174.135 © studopedia.ru Не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования. Есть нарушение авторского права? Напишите нам | Обратная связь.

Отключите adBlock!
и обновите страницу (F5)

очень нужно

Sqlвыборка с упорядочением

Оператор ORDER BY сортируют значения по одному или нескольких столбцам. Например, упорядочим выборку из таблицы Products по столбцу Price:

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

В качестве критерия сортировки также можно использовать сложно выражение на основе столбцов:

Сортировка по убыванию

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

По умолчанию вместо DESC используется оператор ASC , который сортирует по возрастанию:

Сотировка по нескольким столбцам

При сортировке сразу по нескольким столбцам все эти столбцы указываются через запятую после оператора ORDER BY :

Здесь строки сначала сортируются по столбцу Manufacturer по возрастанию. Затем если есть две строки, в которых столбец Manufacturer имеет одинаковое значение, то они сортируются по столбцу ProductName также по возрастанию. Но опять же с помощью ASC и DESC можно отдельно для разных столбцов определить сортировку по возрастанию и убыванию:

2.4 Выборка с упорядочением.

Синтаксис фразы упорядочения был дан в п. 2.1. Простейший вариант этой фразы — упорядочение строк результата по значению одного из столбцов с указанием порядка сортировки или без такого указания. (По умолчанию строки будут сортироваться в порядке возрастания значений в указанном столбце.)

Например, выдать перечень продуктов и содержание в них основных веществ в порядке убывания содержания белка

SELECT Продукт, Белки, Жиры, Углев
FROM Продукты
ORDER BY Белки DESC;
Продукт Белки Жиры Углев
Судак 190. 80. 0.
Говядина 189. 124. 0.
Творог 167. 90. 13.
Яйца 127. 115. 7.
Кофе 127. 36. 9.
Мука 106. 13. 732.
. . . .

При включении в список ORDER BY нескольких столбцов СУБД сортирует строки результата по значениям первого столбца списка пока не появится несколько строк с одинаковыми значениями данных в этом столбце. Такие строки сортируются по значениям следующего столбца из списка ORDER BY и т.д.

Например, выдать содержимое таблицы Блюда, отсортировав ее строки по видам блюд и основе:

SELECT *
FROM Блюда
ORDER BY В Основа;
БЛ Блюдо В Основа Выход Труд
21 Пудинг рисовый Г Крупа 160. 6
20 Каша рисовая Г Крупа 210. 4
18 Сырники Г Молоко 220. 4
. . . . . .
16 Драчена Г Яйца 180. 4
28 Крем творожный Д Молоко 160. 4
. . . . . .
26 Яблоки печеные Д Фрукты 160. 3
7 Сметана З Молоко 140. 1
8 Творог З Молоко 140. 2
2 Салат мясной З Мясо 200. 4
6 Мясо с гарниром З Мясо 250. 3
1 Салат летний З Овощи 200. 3
. . . . . .

Кроме того, в список ORDER BY можно включать не только имя столбца, а его порядковую позицию в перечне SELECT. Благодаря этому возможно упорядочение результатов на основе вычисляемых столбцов, не имеющих имен.

SELECT Продукт, ((Белки+Углев)*4.1+Жиры*9.3)
FROM Продукты
ORDER BY 2;

позволит получить список продуктов, показанный на рис.2.2,в – переупорядоченный по возрастанию значений калорийности список рис.2.2,а.

Основное SQL-выражение для выборки данных

ПРОСТЫЕ ВЫБОРКИ ДАННЫХ

Предположим, что реляционная база данных, состоящая из одной или нескольких таблиц, создана и вы к ней уже подключились. В этом случае типичной практической задачей является получение (извлечение) нужных данных. Например, может потребоваться просто просмотреть все содержимое какой-либо таблицы из базы данных или некоторых ее полей. При этом возможно, вы захотите получить не все записи, а лишь те, которые удовлетворяют заданным условиям. Однако чаще возникает более интересная и сложная задача извлечения данных сразу из нескольких таблиц. Данные из двух и более таблиц необходимо скомпоновать в одну таблицу, чтобы представить ее для обозрения, анализа или последующей обработки. Язык SQL предоставляет для этого широкие возможности, которые мы и рассмотрим.

В результате выполнения выражения на языке SQL (SQL-выражения) создается таблица, которая либо содержит запрошенные данные, либо пуста, если данных, соответствующих запросу, не нашлось. Эта таблица, называемая еще результатной, существует только во время сеанса работы с базой данных и не присоединяется к числу таблиц, входящих в базу данных. Иначе говоря, она не хранится на жестком диске компьютера подобно исходным таблицам базы данных, и поэтому ее еще называют виртуальной.

Выборка данных из нескольких таблиц, их обработка, а также использование подзапросов (запросов, которые нужны в качестве промежуточных для получения окончательного результата) относятся к теме сложных запросов. Здесь мы остановимся на задаче выборки данных из одной таблицы при относительно простых условиях отбора, группировки и сортировки записей. Тем не менее, операторы SQL, применяемые в простых запросах на выборку данных, используются и в сложных запросах, направленных не только на получение, но и на изменение данных. Начните с простого, чтобы потом было легко понять сложное. Материал данной главы относится к фундаментальным темам SQL, хотя многие пользователи баз данных могут им и ограничиться. Последнее вполне вероятно, поскольку материал этой главы сам по себе исключительно практичен.

Все SQL-выражения, предназначенные для выборки данных из существующих таблиц базы данных, начинаются с ключевого слова (оператора) SELECT (выбрать). Для уточнения запроса служат дополнительные операторы, такие как FROM (из), WHERE (где) и др. Сейчас важно понять и запомнить, что результатом выполнения запроса, сформулированного в виде SQL-выражения, является таблица, содержащая запрошенные данные. Эта таблица виртуальна в том смысле, что только представляет результаты запроса и не принадлежит к базе данных. SQL позволяет изменять существующую базу данных — создавать и добавлять к ней новые таблицы, а также модифицировать и удалять уже существующие.

Основное SQL-выражение для выборки данных

Чтобы выбрать из таблицы базы данных требуемые записи, следует, по крайней мере, указать столбцы и имя этой таблицы. Это требование было бы естественно сформулировать так:

ВЫБРАТЬ такие-то столбцы ИЗ такой-то таблицы;

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

SELECT списокСтолбцов FROM список Таблиц;

Операторы SELECT (выбрать) и FROM (из) в SQL-выражении, определяющем выборку данных, являются обязательными, т. е. ни один из них нельзя пропустить. SQL-выражение, содержащее только эти операторы, является основным выражением, определяющим запрос к базе данных на выборку данных. В результате выполнения этого запроса создается виртуальная таблица, содержащая указанные столбцы и все записи исходной таблицы.

Оператор SELECT осуществляет проекцию отношения, указанного в выражении FROM, на заданное множество атрибутов (столбцов), указанное в выражении SELECT.

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

Список столбцов — это перечень имен столбцов, разделенных запятой, как они определены в таблице, указанной в выражении FROM. Разумеется, можно указать все или только некоторые столбцы. Если вы хотите получить все столбцы таблицы, то вместо списка столбцов достаточно указать символ (*). Если в выражении FROM указано несколько таблиц, то в выражении SELECT имена столбцов должны содержать префиксы, указывающие, к какой именно таблице они относятся. Префикс отделяется от имени столбца точкой. Например, выражение Клиенты.Адрес означает столбец Адрес из таблицы Клиенты.

Тривиальный запрос, возвращающий все данные (все столбцы и все записи) из одной таблицы, формулируется так:

SELECT * FROM имяТаблицы;

Основное SQL-выражение может быть дополнено другими операторами, уточняющими запрос. Чаще всего употребляется оператор WHERE (где), с помощью которого можно задать условие выборки записей (строк таблицы). Таким образом, если выражение SELECT задает столбцы таблицы, указанной в операторе FROM, то выражение WHERE определяет записи (строки) из этой таблицы. Выражение, определяющее запрос на выборку данных, находящихся в некоторой таблице, имеет следующий вид:

SELECT * FROM имяТаблицы WHERE условиеПоиска;

Условие, указанное в выражении WHERE, принимает одно из двух логических значений: true (ИСТИНА) или false (ЛОЖЬ). Другими словами, это логическое выражение. При обработке запроса условие проверяется для каждой записи таблицы. Если оно истинно для данной записи, то она выбирается и будет представлена в результатной таблице. В противном случае запись не выбирается и в результатную таблицу не попадает. Если выражение WHERE не указано в SQL-выражении, то результатная таблица будет содержать все записи из таблицы, заданной в выражении FROM. Таким образом, выражение WHERE определяет фильтр записей. Фильтр что-то пропускает в результатную таблицу, а что-то отбрасывает.

Фильтр — одно из основных понятий в области работы с базами данных. В литературе иногда можно встретить различные его трактовки. Так, «отфильтровать записи» может означать «получить записи», а может наоборот — «отбраковать записи». Здесь понятия «отфильтровать», «пропустить через фильтр» или «наложить фильтр» всегда означают «выбрать записи, удовлетворяющие условию фильтра».

Сразу за оператором SELECT до списка столбцов можно применять ключевые слова ALL (все) и DISTINCT (отличающиеся), которые указывают, какие записи представлять в результатной таблице. Если эти ключевые слова не используются, то подразумевается, что следует выбрать все записи, что также соответствует применению ключевого слова ALL. В случае использования DISTINCT в результатной таблице представляются только уникальные записи. При этом если в исходной таблице находятся несколько идентичных записей, то из них выбирается только первая.

Примечание

В Microsoft Access кроме ключевых слов ALL и DISTINCT после SELECT можно использовать ключевое слово ТОР с дополнительными параметрами. Выражение ТОР n требует, чтобы в выборку данных попали только первые n записей, удовлетворяющих заданному условию запроса. Это ограничение условия поиска нужных записей, формулируемого в выражении WHERE. Если исходная таблица очень большая, то DISTINCT может ускорить получение ответа.

В Access можно использовать и выражение ТОР n PERCENT, чтобы указать, что n выражается в процентах от общего количества записей. Не трудно понять, что использование такого выражения направлено не на ускорение поиска, а на получение таблицы, избавленной от лишних данных.

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

SELECT ClientName AS Клиент, Address AS Адрес FROM Клиенты;

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

SELECT Т1.Имя, Т2.Адрес FROM Клиенты Т1, Контакты Т2;

Уточнения запроса

Основное SQL-выражение для выборки данных имеет вид:

SELECT списокСтолбцов FROM списокТаблиц;

Такой запрос возвращает таблицу, полученную из указанной в операторе FROM путем выделения в ней только тех столбцов, которые определены в операторе SELECT. Для выделения требуемых записей (строк) исходной таблицы используется выражение, следующее за ключевым словом (оператором) WHERE. Оператор WHERE является наиболее часто используемым, хотя и не обязательным в SQL-выражении. Именно из-за популярности его можно считать основным компонентом SQL-выражения. Кроме WHERE, в SQL-выражениях используются и другие операторы, позволяющие уточнить запрос.

Для уточнения запроса на выборку данных служит ряд дополнительных операторов:

· WHERE (где) — указывает записи, которые должны войти в результатную таблицу (фильтр записей);

· GROUP BY (группировать по) — группирует записи по значениям определенных столбцов;

· HAVING (имеющие, при условии) — указывает группы записей, которые должны войти в результатную таблицу (фильтр групп);

· ORDER BY (сортировать по) — сортирует (упорядочивает) записи.

Эти операторы не являются обязательными. Их можно совсем не использовать, или использовать лишь некоторые из них, или все сразу. Если применяются несколько операторов, то в SQL-выражении они используются в указанном в списке порядке. Таким образом, запрос данных из таблицы с применением всех перечисленных операторов уточнения запроса имеет следующий вид:

SELECT списокСтолбцов FROM имяТаблицы

GROUP BY столбецГруппировки

ORDER BY условиеСортировки;

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

1. FROM — выбирает таблицу из базы данных; если указано несколько таблиц, то выполняется их декартово произведение и результирующая таблица передается для обработки следующему оператору.

2. WHERE — из таблицы выбираются записи, отвечающие условию поиска, и отбрасываются все остальные.

3. GROUP BY— создаются группы записей, отобранных с помощью оператора WHERE (если он присутствует в SQL-выражении); каждая группа соответствует какому-нибудь значению столбца группирования. Столбец группирования может быть любым столбцом таблицы, заданной в операторе from, а не только тем, который указан в SELECT.

4. HAVING — обрабатывает каждую из созданных групп записей, оставляя только те из них, которые удовлетворяют условию поиска; этот оператор используется только вместе с оператором GROUP BY.

5. SELECT — выбирает из таблицы, полученной в результате применения перечисленных операторов, только указанные столбцы.

6. ORDER BY — сортирует записи таблицы. При этом в условии сортировки можно обращаться лишь к тем столбцам, которые указаны в операторе SELECT.

Допустим, среди таблиц вашей базы данных имеется таблица Клиенты, которая содержит столбцы с именами: имя, Адрес, Сумма_заказа и, возможно, какие-то другие. Семантика этой таблицы тривиальна. В ней фиксируются данные о клиентах и денежные суммы, которые они заплатили вашей фирме, пользуясь ее услугами.

Рис. 1. Таблица Клиенты

Предположим, нас интересуют не все данные этой таблицы, а только те, которые касаются клиентов, заплативших фирме более 500 (сейчас не важно, в какой валюте производились оплаты). Точнее, нам нужны имена и адреса клиентов, которые заплатили фирме более 500 денежных единиц. Таким образом, нам необходимо получить не все, что содержится в таблице Клиенты, а лишь некоторую ее часть, как по столбцам, так и по записям. Для этой цели подойдет следующее SQL-выражение:

SELECT Имя, Адрес FROM Клиенты WHERE Сумма_заказа > 500;

Это SQL-выражение представляет собой запрос, который на естественном языке выглядит приблизительно так:

ВЫБРАТЬ СТОЛБЦЫ имя, Адрес ИЗ ТАБЛИЦЫ клиенты ГДЕ Сумма_заказа > 500;

Здесь из таблицы клиенты выбираются записи, в которых значение столбца Сумма_заказа превышает 500. При этом в результатной таблице будут представлены только два столбца таблицы Клиенты: Имя и Адрес.

Столбец Сумма_заказа, имеющийся в исходной таблице, в данном случае не выводится (отсутствует в результирующей таблице). Впрочем, если бы вам потребовалось увидеть конкретные суммы, превышающие 500, то для этого было бы достаточно указать в списке столбцов, следующем за оператором SELECT, еще и столбец Сумма_заказа.

Рис. 2. Результат запроса ‘WHERE Сумма_заказа > 500’

Следующее SQL-выражение создает виртуальную таблицу, содержащую три Столбца: Регион, Имя и Адрес. Из таблицы Клиенты выбираются только те записи, в которых Сумма__заказа превышает 500, и они группируются по значениям столбцов Регион, Имя и Адрес. Это означает, что в результатной таблице записи, имеющие одинаковые значения в столбце Регион, будут расположены рядом друг с другом. Наконец, все записи в результатной таблице упорядочиваются по значениям столбца Имя (рис. 3).

Илон Маск рекомендует:  Как в Excel автоматически ставить дату

SELECT Регион, Имя, Адрес FROM Клиенты

WHERE Сумма_заказа > 500

GROUP BY Регион, Имя, Адрес

Рис. 3. Результат запроса ‘WHERE Сумма_заказа > 500’
с группировкой ‘GROUP BY Регион, Имя, Адрес’ и сортировкой ‘ORDER BY Имя’

Оператор выборки записей из исходной таблицы может соседствовать с другими SQL-операторами.

Оператор WHERE

Условия поиска в операторе WHERE (где) являются логическими выражениями, т. е. принимающими одно из двух возможных значений — true (ИСТИНА) или false (ЛОЖЬ). Например, выражение Сумма_заказа > 500 является истинным (имеет значение true), если в текущей записи таблицы значение столбца Сумма_заказа превышает 500. В противном случае это выражение ложно (имеет значение false). Одно и то же логическое выражение может быть истинным для одних записей и ложным для других. Вообще говоря, в SQL логические выражения могут принимать еще и неопределенное значение. Это происходит тогда, когда в выражении некоторые элементы имеют значение NULL. Тaким образом, в SQL мы имеем дело не с классической двузначной, а с трехзначной логикой.

Выражение, следующее за оператором WHERE, возвращает одно из трех значений: true, false или NULL. При выполнении запроса (SQL-выражения) логическое выражение WHERE применяется ко всем записям исходной таблицы. Если оно истинно для данной записи исходной Таблицы, то эта запись выбирается и будет представлена в результатной таблице; в противном случае запись не попадет в результатную таблицу.

При составлении логических выражений используются специальные ключевые слова и символы операций сравнения, которые называют предикатами. Предикат впервые появился в SQL: 1999. Например, в выражении Сумма_заказа > 500 применен предикат сравнения (>).

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

Наиболее часто используются предикаты сравнения, такие как (=), ( ), (<>), ( =). Однако имеются и другие. Далее приведен список всех предикатов:

(=) — равно, ( ) — больше, ( ) – не равно,

( =) — больше или равно (не меньше);

Примечание

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

BETWEEN

Предикат BETWEEN (между) позволяет задать выражение проверки вхождения какого-либо значения в диапазон, определяемый граничными значениями. Например:

WHERE Сумма_заказа BETWEEN 100 AND 750

Здесь ключевое слово AND представляет собой логический союз И. Граничные значения (в примере это 100 и 750) входят в диапазон. Причем первое граничное значение должно быть не больше второго.

Эквивалентным приведенному является выражение с предикатами сравнения:

Простая выборка данных из базы данных MS SQL Server

Читайте также:

  1. C. Этап 3. Подготовка данных
  2. Corporate Information Factory, Корпоративное хранилище данных
  3. D. Очистка данных
  4. Data Mart — Витрины данных
  5. Data Mining (DM) — интеллектуальный анализ данных
  6. Data Warehouse – хранилище данных — ХД — систем обработки данных
  7. Exchange Server.
  8. I. Создание баз данных
  9. If используется для разветвления процесса обработки данных на два направления.
  10. L ТРИПС регулирует вопросы правовой охраны произведений, созданных с применением новых технологий, а также новейшие способы использования произведений.
  11. LAN Server, IВМ Согр
  12. Nameserver 127.0.0.1

Основы оператора SELECT

Оператор SELECT позволяет извлекать данные из БД SQL Server и представлять их пользователю в виде одного или нескольких результирующих наборов. Результирующий набор — это данные в табличной форме, полученные в результате исполнения оператора SELECT. Подобно таблице, результирующий набор состоит из строк и столбцов. Далее описываются главные компоненты оператора SELECT и их использование (в составе полного оператора SELECT) для извлечения определенных данных из базы SQL Server и представления их в виде результирующего набора.

Оператор SELECT языка Transact-SQL позволяет получать существующие данные из базы данных SQL Server. Большинство операторов SELECT описывают четыре главных свойства результирующего набора:

• столбцы, которые должны войти в результирующий набор;

• таблицу, из которой извлекаются данные для формирования результирующего набора;

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

• последовательность упорядочения строк в результирующем наборе.

Например, оператор SELECT в следующем сценарии получает из таблицы Persons (предполагается, что она уже создана в БД) идентификатор персоны, ее имя и возраст, причем только тех, кто старше 40 лет:

SELECT PersonId, Name, PersonAge

WHERE PersonAge > 40

ORDER BY PersonAge ASC

Конструкция SELECT в этом примере определяет столбцы, из которых следует извлечь значения, а конструкция FROM — таблицу, в которой находятся эти столбцы. Конструкция WHERE ограничивает результирующий набор теми персонами, значение PersonAge которых больше 40. Конструкция ORDER BY задает сортировку результирующего набора по возрастанию на основе значения столбца PersonAge. Полный синтаксис оператора SELECT достаточно сложен, однако в общем виде главные конструкции можно записать следующим образом:

[GROUP BY группировка_по_списку]

[ORDER BY поле_для_сортировки [ASC DESC]]

Далее мы подробно расскажем о каждой конструкции и покажем на примерах, как определять конструкции, получающие определенные данные из базы данных SQL Server. Более подробная информация — в SQL Server Books Online.

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

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

Ключевое слово DISTINCT запрещает вывод в результирующем наборе повторяющихся строк. Например, в таблице Persons в нашей базе данных могут содержаться повторяющиеся значения в столбце BitrhPlace. Следующий код позволяет получить список значений BirthPlace без дубликатов:

SELECT DISTINCT BirthPlace, FirstName, LastName

ORDER BY BirthPlace

Ключевое слово ТОР n задает первые n строк результирующего набора, которые необходимо возвратить. Если задан параметр ORDER BY, выбор строк выполняется после упорядочения результирующего набора. Значение n указывает число возвращаемых строк (если не определено ключевое слово PERCENT). Если задано ключевое слово PERCENT, то n — это процент возвращаемых строк от общего числа строк в результирующем наборе.

Например, в следующем примере оператор SELECT возвращает первые 5 упорядоченных по алфавиту городов из таблицы Persons.

SELECT DISTINCT TOP 5 BirthPlace, FirstName, LastName

ORDER BY BirthPlace

Можно сделать оператор SELECT более читабельным, присвоив таблице псевдоним (его также называют связанным именем или переменной-диапазоном). Псевдоним можно присвоить таблице как с помощью ключевого слова AS, так и без него:

имя_таблицы AS псевдоним_таблицы

В следующем примере таблице Persons присваивается псевдоним р:

SELECT p.PersonId, p.Name

FFOM persons AS p

Если таблице присвоен псевдоним, то во всех явных ссылках на таблицу в операторах Transact-SQL необходимо использовать псевдоним, а не имя таблицы.

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

SELECT FirstName + ‘ ‘ + LastName AS «Person Name»,

IDENTITYCOL AS «Person ID»,

ORDER BY LastName, FirstName ASC

Этот оператор помещает в один столбец имена и фамилии персон, разделенные пробелом. Имя столбца, в котором хранятся имена людей, — Person Name. В результирующий набор также войдет столбец с идентификатором, который будет назван Person ID; а также столбцы HomePhone и BirthPlace. Результирующий набор упорядочен сначала по фамилии, а затем по имени.

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

В следующем сценарии оператор SELECT извлекает значения из столбцов FirstName и LastName таблицы Persons:

SELECT FirstName, LastName

Сгенерированный результирующий набор создает таблицу PersonNames. В новой таблице столбцы FirstName и LastName будут содержать значения из таблицы Persons.

Результирующий набор не будет выводиться в SQL Server Management Studio на вкладке Results, если не выполнить явный запрос к новой таблице.

Конструкцию FROM необходимо помещать в каждом операторе SELECT, который извлекает данные из таблиц или представлений. Эта конструкция позволяет задать список таблиц и представлений, на столбцы которых ссылаются список выбора и конструкция WHERE. Этим таблицам и представлениям могут быть присвоены псевдонимы в конструкции AS. Конструкция FROM, кроме того, позволяет соединять таблицы, задавая условия соединения в конструкции JOIN.

Конструкция FROM представляет собой список имен таблиц, представлений и конструкций JOIN, разделенных запятыми. В следующем примере в операторе SELECT конструкция FROM задает таблицу Persons:

SELECT * FROM Persons

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

Конструкции WHERE, GROUP BY и HAVING

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

SELECT PersonId, LastName, FirstName

WHERE BirthPlace = ‘Krasnoyarsk’

Конструкция HAVING, как правило (но не обязательно), используется вместе с конструкцией GROUP BY. Конструкция HAVING задает дополнительные фильтры, которые применяются после завершения фильтрации, определяемой конструкцией WHERE. В следующем сценарии в операторе SELECT использованы конструкции WHERE, GROUP BY и HAVING:

SELECT OrdD1OrderId AS OrderId,

SUM(OrdD1.Quantity) AS «Units Sold»,

SUM(OrdD1.UnitPrice * OrdD1.Quantity) AS Revenue

FROM [Order Details] AS OrdD1

WHERE OrdD1OrderId IN (SELECT DISTINCT OrdD2.OrderId

FROM [Order Details] AS OrdD2

WHERE OrdD2.UnitPrice > $1000)

GROUP BY OrdD1.OrderId

HAVING SUM(OrdD1.Quantity) > 50

Здесь конструкция WHERE возвращает заказы, стоимость которых больше $1000, а далее конструкция HAVING ограничивает результат, отбирая заказы на более чем 50 единиц товара. Конструкция GROUP BY ограничивает строки для каждого конкретного значения поля OrderId.

Конструкция GROUP BY

Конструкция GROUP BY используется для получения итоговых значений в каждой строке результирующего набора. При применении оператора SELECT без конструкции GROUP BY агрегатные функции возвращают лишь одно итоговое значение.

После ключевых слов GROUP BY следует список столбцов, которые называются группирующими. Конструкция GROUP BY ограничивает строки результирующего набора. Для каждого конкретного значения группирующего столбца или столбцов возможна только одна строка. В каждой строке результирующего набора содержатся итоговые данные, связанные с некоторым значением его группирующих столбцов.

Если в операторе SELECT имеется конструкция GROUP BY, SQL Server налагает ограничения на элементы списка выбора. В списке выбора могут быть лишь те группирующие столбцы и выражения, которые возвращают только одно значение для каждого значения группирующих столбцов, например агрегатные функции (векторные агрегаты), одним из параметров которых является имя столбца.

Как правило, конструкция HAVING используется с конструкцией GROUP BY, хотя ее разрешается применять и отдельно. Любое выражение может стать группирующим, если оно не содержит агрегатных функций.

В конструкции GROUP BY необходимо задавать имя столбца таблицы или представления, а не имя столбца результирующего набора, присвоенное с помощью конструкции AS.

В конструкции GROUP BY допустимо указать несколько столбцов в виде вложенных групп, то есть сгруппировать таблицу посредством любой комбинации столбцов.

Понимание верной последовательности, в которой применяются конструкции WHERE, GROUP BY и HAVING, помогает создавать достаточно эффективные запросы:

• конструкция WHERE фильтрует строки, которые являются результатом операций, заданных в конструкции FROM;

• выходная информация конструкции WHERE группируется с помощью конструкции GROUP BY;

• строки сгруппированного результата фильтруются средствами конструкции HAVING.

Любые условия поиска, которые разрешается применять как до, так и после операции группировки, стоит указывать в конструкции WHERE. Таким можно уменьшать количество строк, которые необходимо сгруппировать. В конструкции HAVING следует указывать только те условия поиска, которые надо применять после выполнения операции группировки.

Конструкция ORDER BY

Конструкция ORDER BY сортирует результат запроса по одному или нескольким полям. Сортировка может быть как по возрастанию (ASC), так и по убыванию (DESC). Если не задан ни один из видов сортировки, по умолчанию предполагается ASC. Если в конструкции ORDER BY названо несколько столбцов, выполняется вложенная сортировка.

Следующий оператор сортирует строки таблицы Persons сначала по фамилии (по убыванию), затем по имени (по возрастанию, для каждой персоны) и, наконец, по возрасту (также по возрастанию, поскольку не задан параметр DESC).

SELECT PersonId, LastName, FirstName, Age

ORDER BY LastName DESC, FirstName, Age

Пакеты, хранимые процедуры и триггеры

Пакет — это группа из одного или нескольких операторов Transact-SQL, которые приложение одновременно посылает на SQL Server для исполнения. SQL Server компилирует операторы пакета в единую исполнимую единицу (план исполненияExecution Plan). После этого по очереди выполняются операторы этого плана.

Ошибка при компиляции, например синтаксическая, останавливает процесс компиляции плана исполнения. В этом случае ни один из операторов пакета исполнен не будет.

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

• большинство ошибок периода выполнения останавливают исполнение текущего и последующих операторов пакета;

• некоторые ошибки периода выполнения, например нарушения ограничений, останавливают исполнение лишь текущего оператора. При этом все остальные операторы пакета будут исполнены.

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

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

При обработке пакетов действуют следующие правила:

• операторы CREATE DEFAULT, CREATE PROCEDURE, CREATE RULE, CREATE TRIGGER и CREATE VIEW не могут соседствовать в пакетах с другими операторами. Пакет должен начинаться с оператора CREATE. Все следующие за ним операторы будут интерпретированы как часть определения, созданного первым оператором CREATE;

• в пределах одного и того же пакета нельзя модифицировать таблицу и обращаться к новым столбцам;

• если оператор EXECUTE — первый оператор пакета, ключевое слово EXECUTE не требуется. Но оно необходимо, когда оператор EXECUTE не является первым оператором пакета.

Итак, пакет — это набор из одного или нескольких операторов, которые клиент отсылает как единую группу. При компиляции каждого пакета получается один план исполнения. Если пакет состоит из нескольких операторов SQL, то из всех оптимизированных шагов, необходимых для исполнения каждого оператора, формируется единый план исполнения.

Для того чтобы задать пакет, имеется несколько способов.

• Все операторы SQL, которые приложение отправляет на сервер как единицу исполнения, составляют единый пакет и генерируют один план исполнения.

• Все операторы хранимой процедуры или триггера составляют единый пакет. При компиляции любой хранимой процедуры или триггера получается единственный план исполнения.

• Строка, обрабатываемая оператором EXECUTE, интерпретируется как пакет, в результате компиляции которого получается один план исполнения.

• Строка, исполняемая системной хранимой процедурой sp_executesql, — это пакет, при компиляции которого получается один план исполнения.

Если приложение посылает пакет, в котором содержится оператор EXECUTE, план исполнения для обрабатываемой строки или хранимой процедуры выполняется отдельно от плана исполнения оператора EXECUTE. План исполнения, сгенерированный для строки, которую исполняет хранимая процедура sp_executesql, также будет отделен от плана исполнения остальной части пакета, в котором присутствует вызов процедуры sp_executesql.

Если оператор пакета вызывает триггер, то план исполнения триггера выполняется отдельно от плана исполнения исходного пакета.

Например, пакет, который содержит следующие четыре оператора, генерирует пять планов исполнения:

• оператор EXECUTE, исполняющий хранимую процедуру;

• вызов процедуры sp_executesql для обработки строки;

• оператор EXECUTE, обрабатывающий строку;

• оператор UPDATE, ссылающийся на таблицу, у которой есть триггер на обновление.

EXEC sp_executesql N’SELECT * FROM AdventureWorks.HumanResources.Employee

SET PersonName = ‘kuku’

Хранимая процедура — это группа операторов Transact-SQL, которая компилируется один раз и после этого может выполняться многократно. Такая функциональность повышает производительность, поскольку отпадает необходимость в перекомпиляции операторов Transact-SQL.

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

Операторы CREATE PROCEDURE и CREATE TRIGGER не могут располагаться в нескольких пакетах. Другими словами, хранимая процедура или триггер всегда создаются в одном пакете и компилируются в план исполнения.

SQL Server хранит только исходный текст хранимых процедур и триггеров. Когда хранимая процедура или триггер исполняется первый раз, исходный текст компилируется в план исполнения. Если до того, как план исполнения устареет и будет удален из памяти, хранимая процедура или триггер исполняется снова, реляционный механизм обнаруживает существующий план и использует его повторно. Если план устарел и удален из памяти, создается новый план исполнения. Этот процесс напоминает обработку SQL Server всех операторов SQL. Увеличение производительности при применении хранимых процедур и триггеров объясняется постоянством их SQL-операторов, что позволяет SQL Server использовать для них существующие планы исполнения.

В предыдущих версиях SQL Server выигрыш в производительности при использовании хранимых процедур был особенно заметен. Более ранние версии SQL Server не пытались повторно использовать планы исполнения для пакетов, которые не являлись хранимыми процедурами или триггерами. Единственный способ повторного использования планов исполнения заключался в программировании операторов SQL в виде хранимых процедур.

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


Дата добавления: 2014-01-11 ; Просмотров: 2097 ; Нарушение авторских прав? ;

Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет

SQL-Урок 3. Сортировка (ORDER BY)

В будущем нам может понадобиться сортировать нашу выборку — в алфавитном порядке для текста или по возрастанию/убыванию — для цифровых значений. Для таких целей в SQL есть специальный оператор ORDER BY .

1. Сортировка выбранных данных.

Давайте всю нашу таблицу посортируем по сумме реализации продукции, а именно по столбцу Amount.

SELECT * FROM Sumproduct ORDER BY Amount

Видим, что запрос посортировал записи по возрастанию в поле Amount. Обязательно нужно соблюдать последовательность расположения операторов, т.е. оператор ORDER BY должен идти в самом конце запроса. В противном случае будет получено сообщение об ошибке.

Также особенностью оператора ORDER BY является то, что он может сортировать данные по полю, которого мы не выбирали в запросе, то есть достаточно, чтобы оно вообще было в БД.

2. Сортировка по нескольким полям.

Теперь посортируем наш пример дополнительно за еще одним полем. Пусть это будет поле City, которое отображает место реализации продукции.

SELECT * FROM Sumproduct ORDER BY Amount, City

Очередность сортировки будет зависеть от порядка расположения полей в запросе. То есть, в нашем случае сначала данные будут рассортированы по колонке Amount , а затем по City.

3. Направление сортировки.

Несмотря на то, что по умолчанию оператор ORDER BY сортирует по возрастанию, мы можем также прописать сортировки значений по убыванию. Для этого в конце каждого поля проставляем оператор DESC (что является сокращением от слова DESCENDING).

SELECT * FROM Sumproduct ORDER BY Amount DESC , City

В данном примере, значение в поле Amount были посортированы по убыванию, а в поле City — по возрастанию. Оператор DESC применяется только для одного столбца, поэтому при необходимости его нужно прописывать после каждого поля, которое принимает участие в сортировке.

Урок 8. MySQL. Ограничение выборки SELECT

Дата публикации: 12-08-2020

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

Все уроки курса:

Добавить комментарий Отменить ответ

Для отправки комментария вы должны авторизоваться.

Количество уроков: 20

Продолжительность курса: 06:35:17

Автор: Андрей Кудлай

Меня зовут Андрей Кудлай — один из авторов проекта webformyself и практикующий веб-разработчик. Имею хорошие навыки работы с HTML, CSS, jQuery, PHP, MySQL, Bootstrap, CakePHP, Yii2, WordPress, OpenCart. Являюсь автором нескольких курсов-бестселлеров издательства WebForMySelf.com

Описание курса: Данный курс посвящен изучению языка запросов SQL и работе с сервером MySQL. Курс рассчитан как на новичков, так и на специалистов, уже имеющих опыт работы с SQL.

Все права защищены © 2020
ИП Рог Виктор Михайлович
ОГРН: 313774621200541
Служба поддержки

SELECT — предложение ORDER BY (Transact-SQL) SELECT — ORDER BY Clause (Transact-SQL)

ОБЛАСТЬ ПРИМЕНЕНИЯ: SQL Server База данных SQL Azure Azure Synapse Analytics (хранилище данных SQL) Parallel Data Warehouse APPLIES TO: SQL Server Azure SQL Database Azure Synapse Analytics (SQL DW) Parallel Data Warehouse

Сортирует данные, возвращенные запросом в SQL Server SQL Server . Sorts data returned by a query in SQL Server SQL Server . Это предложение используется для следующих целей: Use this clause to:

Упорядочение результирующего набора запроса по заданному списку столбцов и (дополнительно) ограничение числа возвращаемых строк указанным диапазоном. Order the result set of a query by the specified column list and, optionally, limit the rows returned to a specified range. Порядок, в котором строки возвращаются в результирующем наборе, не гарантируется, если не указано предложение ORDER BY. The order in which rows are returned in a result set are not guaranteed unless an ORDER BY clause is specified.

Определение порядка, в котором значения ранжирующей функции применяются к результирующему набору. Determine the order in which ranking function values are applied to the result set.

ORDER BY не поддерживается в инструкциях SELECT/INTO или CREATE TABLE AS SELECT (CTAS) в Azure Synapse Analytics (хранилище данных SQL) Azure Synapse Analytics (SQL DW) или Параллельное хранилище данных Parallel Data Warehouse . ORDER BY is not supported in SELECT/INTO or CREATE TABLE AS SELECT (CTAS) statements in Azure Synapse Analytics (хранилище данных SQL) Azure Synapse Analytics (SQL DW) or Параллельное хранилище данных Parallel Data Warehouse .

Синтаксис Syntax

Аргументы Arguments

order_by_expression order_by_expression
Указывает столбец или выражение, по которому производится сортировка результирующего набора запроса. Specifies a column or expression on which to sort the query result set. Столбец сортировки может быть указан с помощью имени или псевдонима столбца или неотрицательного целого числа, представляющего позицию столбца в списке выбора. A sort column can be specified as a name or column alias, or a nonnegative integer representing the position of the column in the select list.

Можно указать несколько столбцов сортировки. Multiple sort columns can be specified. Имена столбцов должны быть уникальными. Column names must be unique. Последовательность столбцов сортировки в предложении ORDER BY определяет организацию упорядоченного результирующего набора. The sequence of the sort columns in the ORDER BY clause defines the organization of the sorted result set. Иными словами, результирующий набор сортируется по первому столбцу, затем упорядоченный список сортируется по второму и т. д. That is, the result set is sorted by the first column and then that ordered list is sorted by the second column, and so on.

Имена столбцов, на которые содержатся ссылки в предложении ORDER BY, должны однозначно соответствовать столбцу или псевдониму столбца в списке выбора либо столбцу, определенному в таблице, указанной в предложении FROM. The column names referenced in the ORDER BY clause must correspond to either a column or column alias in the select list or to a column defined in a table specified in the FROM clause without any ambiguities. Если предложение ORDER BY ссылается на псевдоним столбца в списке выбора, псевдоним должен использоваться отдельно, а не как часть выражения в предложении ORDER BY, например: If the ORDER BY clause references a column alias from the select list, the column alias must be used standalone, and not as a part of some expression in ORDER BY clause, for example:

COLLATE collation_name COLLATE collation_name
Указывает, что операция ORDER BY должна выполняться в соответствии с параметрами сортировки, указанными в аргументе collation_name, но не в соответствии с параметрами сортировки столбца, определенными в таблице или представлении. Specifies that the ORDER BY operation should be performed according to the collation specified in collation_name, and not according to the collation of the column as defined in the table or view. Аргументом collation_name может быть либо имя параметров сортировки Windows, либо имя параметров сортировки SQL. collation_name can be either a Windows collation name or a SQL collation name. Дополнительные сведения см. в статье Collation and Unicode Support. For more information, see Collation and Unicode Support. Аргумент COLLATE применяется только к столбцам типа char, varchar, nchar и nvarchar. COLLATE is applicable only for columns of type char, varchar, nchar, and nvarchar.

ASC | DESC ASC | DESC
Указывает порядок сортировки значений в указанном столбце — по возрастанию или по убыванию. Specifies that the values in the specified column should be sorted in ascending or descending order. Значение ASC сортирует от низких значений к высоким. ASC sorts from the lowest value to highest value. Значение DESC сортирует от высоких значений к низким. DESC sorts from highest value to lowest value. Порядок сортировки по умолчанию — ASC. ASC is the default sort order. Значения NULL рассматриваются как минимально возможные значения. Null values are treated as the lowest possible values.

OFFSET < integer_constant | offset_row_count_expression > < ROW | ROWS >OFFSET < integer_constant | offset_row_count_expression > < ROW | ROWS >
Указывает число сток, которые необходимо пропустить, прежде чем будет начат возврат строк из выражения запроса. Specifies the number of rows to skip before it starts to return rows from the query expression. Это значение может быть целочисленной константой или выражением, значение которого больше нуля или равно нулю. The value can be an integer constant or expression that is greater than or equal to zero.

Применимо к: с SQL Server 2012 (11.x) SQL Server 2012 (11.x) по SQL Server 2020 SQL Server 2020 и База данных SQL Azure Azure SQL Database . Applies to: SQL Server 2012 (11.x) SQL Server 2012 (11.x) through SQL Server 2020 SQL Server 2020 and База данных SQL Azure Azure SQL Database .s

Илон Маск рекомендует:  6 новых вызова в HTML Academy

offset_row_count_expression может быть переменной, параметром или вложенным запросом, возвращающим скалярную константу. offset_row_count_expression can be a variable, parameter, or constant scalar subquery. При использовании вложенного запроса он не должен ссылаться на какие-либо столбцы, определенные в области внешнего запроса. When a subquery is used, it cannot reference any columns defined in the outer query scope. Иными словами, он не может коррелировать с внешним запросом. That is, it cannot be correlated with the outer query.

ROW и ROWS являются синонимами и оставлены для совместимости со стандартом ANSI. ROW and ROWS are synonyms and are provided for ANSI compatibility.

В плане выполнения запроса значение смещения строки отображается в атрибуте Offset оператора запроса TOP. In query execution plans, the offset row count value is displayed in the Offset attribute of the TOP query operator.

FETCH < FIRST | NEXT >< integer_constant | fetch_row_count_expression > < ROW | ROWS >ONLY FETCH < FIRST | NEXT >< integer_constant | fetch_row_count_expression > < ROW | ROWS >ONLY
Указывает число строк, возвращаемых после обработки предложения OFFSET. Specifies the number of rows to return after the OFFSET clause has been processed. Это значение может быть целочисленной константой или выражением, значение которого больше единицы или равно единице. The value can be an integer constant or expression that is greater than or equal to one.

Применимо к: с SQL Server 2012 (11.x) SQL Server 2012 (11.x) до SQL Server 2020 SQL Server 2020 и База данных SQL Azure Azure SQL Database . Applies to: SQL Server 2012 (11.x) SQL Server 2012 (11.x) through SQL Server 2020 SQL Server 2020 and База данных SQL Azure Azure SQL Database .

fetch_row_count_expression может быть переменной, параметром или вложенным запросом, возвращающим скалярную константу. fetch_row_count_expression can be a variable, parameter, or constant scalar subquery. При использовании вложенного запроса он не должен ссылаться на какие-либо столбцы, определенные в области внешнего запроса. When a subquery is used, it cannot reference any columns defined in the outer query scope. Иными словами, он не может коррелировать с внешним запросом. That is, it cannot be correlated with the outer query.

FIRST и NEXT являются синонимами и предусмотрены для совместимости со стандартом ANSI. FIRST and NEXT are synonyms and are provided for ANSI compatibility.

ROW и ROWS являются синонимами и оставлены для совместимости со стандартом ANSI. ROW and ROWS are synonyms and are provided for ANSI compatibility.

В плане выполнения запроса значение смещения строки отображается в атрибуте Rows или Top оператора запроса TOP. In query execution plans, the offset row count value is displayed in the Rows or Top attribute of the TOP query operator.

Рекомендации Best Practices

Избегайте указания столбцов в предложении ORDER BY по их порядковому номеру в списке выбора. Avoid specifying integers in the ORDER BY clause as positional representations of the columns in the select list. Например, хотя инструкция SELECT ProductID, Name FROM Production.Production ORDER BY 2 верна, она будет не очень понятна другим пользователям по сравнению с тем случаем, когда столбцы указаны по именам. For example, although a statement such as SELECT ProductID, Name FROM Production.Production ORDER BY 2 is valid, the statement is not as easily understood by others compared with specifying the actual column name. Кроме того, если список выбора изменится, в частности изменится порядок столбца или будут добавлены новые столбцы, то это потребует изменения предложения ORDER BY во избежание непредвиденных результатов. In addition, changes to the select list, such as changing the column order or adding new columns, requires modifying the ORDER BY clause in order to avoid unexpected results.

В инструкции SELECT TOP (N) всегда указывайте предложение ORDER BY. In a SELECT TOP (N) statement, always use an ORDER BY clause. Это единственный способ предсказуемым образом отметить строки, которые были обработаны предложением TOP. This is the only way to predictably indicate which rows are affected by TOP. Дополнительные сведения см. в разделе TOP (Transact-SQL). For more information, see TOP (Transact-SQL).

Совместимость Interoperability

При использовании в инструкции SELECT. INTO предложения ORDER BY для вставки строк из другого источника вставка строк в указанном порядке не гарантируется. When used with a SELECT. INTO statement to insert rows from another source, the ORDER BY clause does not guarantee the rows are inserted in the specified order.

Использование OFFSET и FETCH в представлении не приведет к изменению его свойства Updateability. Using OFFSET and FETCH in a view does not change the updateability property of the view.

Ограничения Limitations and Restrictions

Нет ограничения на число столбцов в предложении ORDER BY, однако общий размер столбцов, перечисленных в нем, не может превышать 8060 байт. There is no limit to the number of columns in the ORDER BY clause; however, the total size of the columns specified in an ORDER BY clause cannot exceed 8,060 bytes.

Столбцы типа ntext, text, image, geography, geometry и xml не могут использоваться в предложении ORDER BY. Columns of type ntext, text, image, geography, geometry, and xml cannot be used in an ORDER BY clause.

Нельзя указывать целое число или константу, если аргумент order_by_expression присутствует в ранжирующей функции. An integer or constant cannot be specified when order_by_expression appears in a ranking function. Дополнительные сведения см. в статье Предложение OVER (Transact-SQL). For more information, see OVER Clause (Transact-SQL).

Если в качестве имени таблицы в предложении FROM используется псевдоним, то только псевдоним может быть использован для обозначения столбца этой таблицы в предложении ORDER BY. If a table name is aliased in the FROM clause, only the alias name can be used to qualify its columns in the ORDER BY clause.

Имена и псевдонимы столбцов, указанные в предложении ORDER BY, должны быть определены в списке выбора, если инструкция SELECT содержит одно из следующих предложений или операторов: Column names and aliases specified in the ORDER BY clause must be defined in the select list if the SELECT statement contains one of the following clauses or operators:

UNION, оператор UNION operator

Оператор EXCEPT EXCEPT operator

INTERSECT, оператор INTERSECT operator

SELECT DISTINCT SELECT DISTINCT

Кроме того, если в инструкцию входит оператор UNION, EXCEPT или INTERSECT, то имена и псевдонимы столбцов должны быть указаны в списке выбора первого (слева) запроса. Additionally, when the statement includes a UNION, EXCEPT, or INTERSECT operator, the column names, or column aliases must be specified in the select list of the first (left-side) query.

В запросе, содержащем оператор UNION, EXCEPT или INTERSECT, предложение ORDER BY допускается только в конце инструкции. In a query that uses UNION, EXCEPT, or INTERSECT operators, ORDER BY is allowed only at the end of the statement. Это ограничение применяется только при использовании операторов UNION, EXCEPT и INTERSECT в запросах верхнего уровня, но не во вложенных запросах. This restriction applies only to when you specify UNION, EXCEPT, and INTERSECT in a top-level query and not in a subquery. См подраздел «Примеры» ниже. See the Examples section that follows.

Предложение ORDER BY недопустимо в представлениях, встроенных функциях, производных таблицах и вложенных запросах, если также не указаны предложения TOP либо OFFSET и FETCH. The ORDER BY clause is not valid in views, inline functions, derived tables, and subqueries, unless either the TOP or OFFSET and FETCH clauses are also specified. В этих объектах предложение ORDER BY используется только для определения строк, возвращаемых предложением TOP или OFFSET и FETCH. When ORDER BY is used in these objects, the clause is used only to determine the rows returned by the TOP clause or OFFSET and FETCH clauses. Предложение ORDER BY не гарантирует упорядочивания результатов при запросе этих конструкций, если оно не указано в самом запросе. The ORDER BY clause does not guarantee ordered results when these constructs are queried, unless ORDER BY is also specified in the query itself.

Предложения OFFSET и FETCH не поддерживаются в индексированных представлениях и представлениях, определенных с предложением CHECK OPTION. OFFSET and FETCH are not supported in indexed views or in a view that is defined by using the CHECK OPTION clause.

Предложения OFFSET и FETCH могут быть использованы в любом запросе, допускающем применение TOP и ORDER BY, со следующими ограничениями. OFFSET and FETCH can be used in any query that allows TOP and ORDER BY with the following limitations:

Предложение OVER не поддерживает OFFSET и FETCH. The OVER clause does not support OFFSET and FETCH.

Предложения OFFSET и FETCH не могут быть указаны прямо в инструкциях INSERT, UPDATE, MERGE и DELETE, но могут быть указаны во вложенных запросах, определяемых этими инструкциями. OFFSET and FETCH cannot be specified directly in INSERT, UPDATE, MERGE, and DELETE statements, but can be specified in a subquery defined in these statements. Например, в инструкции INSERT INTO SELECT предложения OFFSET и FETCH могут быть указаны в инструкции SELECT. For example, in the INSERT INTO SELECT statement, OFFSET and FETCH can be specified in the SELECT statement.

В запросе, содержащем оператор UNION, EXCEPT или INTERSECT, предложения OFFSET и FETCH могут быть указаны только в конечном запросе, который определяет порядок следования результатов запроса. In a query that uses UNION, EXCEPT or INTERSECT operators, OFFSET and FETCH can only be specified in the final query that specifies the order of the query results.

TOP нельзя сочетать с OFFSET и FETCH в одном выражении запроса (в той же области запроса). TOP cannot be combined with OFFSET and FETCH in the same query expression (in the same query scope).

Использование OFFSET и FETCH для ограничения числа возвращаемых строк Using OFFSET and FETCH to limit the rows returned

Для разбиения на страницы и ограничения числа строк, передаваемых клиентскому приложению, рекомендуется пользоваться предложениями OFFSET и FETCH, а не предложением TOP. We recommend that you use the OFFSET and FETCH clauses instead of the TOP clause to implement a query paging solution and limit the number of rows sent to a client application.

Применение в качестве решения для разбиения на страницы предложений OFFSET и FETCH потребует однократного выполнения запроса для каждой «страницы» данных, возвращаемых клиентскому приложению. Using OFFSET and FETCH as a paging solution requires running the query one time for each «page» of data returned to the client application. Например, чтобы вернуть результаты запроса блоками по 10 строк, необходимо выполнить запрос для получения строк с 1 по 10, затем еще раз для получения строк с 11 по 20 и так далее. For example, to return the results of a query in 10-row increments, you must execute the query one time to return rows 1 to 10 and then run the query again to return rows 11 to 20 and so on. Каждый запрос выполняется независимо и никаким образом не связан с другими запросами. Each query is independent and not related to each other in any way. Это означает, что в отличие от использования курсора, где запрос выполняется всего один раз, а текущее состояние хранится на сервере, за отслеживание состояния отвечает клиентское приложение. This means that, unlike using a cursor in which the query is executed once and state is maintained on the server, the client application is responsible for tracking state. Чтобы добиться стабильных результатов между запросами с предложениями OFFSET и FETCH, должны выполняться следующие условия. To achieve stable results between query requests using OFFSET and FETCH, the following conditions must be met:

Базовые данные, используемые запросом, должны быть неизменными. The underlying data that is used by the query must not change. Иными словами, либо строки, обработанные запросом, не должны обновляться, либо все запросы страниц выполняемого запроса должны выполняться в одной транзакции, использующей моментальный снимок или сериализуемую изоляцию транзакции. That is, either the rows touched by the query are not updated or all requests for pages from the query are executed in a single transaction using either snapshot or serializable transaction isolation. Дополнительные сведения об уровнях изоляции транзакции см. в разделе SET TRANSACTION ISOLATION LEVEL (Transact-SQL). For more information about these transaction isolation levels, see SET TRANSACTION ISOLATION LEVEL (Transact-SQL).

Предложение ORDER BY содержит столбец или сочетание столбцов, которые гарантированно уникальны. The ORDER BY clause contains a column or combination of columns that are guaranteed to be unique.

См. пример «Выполнение нескольких запросов в одной транзакции» в подразделе «Примеры» ниже в этом разделе. See the example «Running multiple queries in a single transaction» in the Examples section later in this topic.

Если согласованность планов выполнения важна для решения разбиения на страницы, подумайте над использованием указания запросов OPTIMIZE FOR для параметров OFFSET и FETCH. If consistent execution plans are important in your paging solution, consider using the OPTIMIZE FOR query hint for the OFFSET and FETCH parameters. См. пункт «Указание выражений для значений OFFSET и FETCH» в подразделе «Примеры» ниже в этом разделе. See «Specifying expressions for OFFSET and FETCH values» in the Examples section later in this topic. Дополнительные сведения об OPTIMZE FOR см. в статье Указания запросов (Transact-SQL). For more information about OPTIMIZE FOR, see Query Hints (Transact-SQL).

Примеры Examples

Категория Category Используемые элементы синтаксиса Featured syntax elements
Основной синтаксис Basic syntax ORDER BY ORDER BY
Указание порядка по возрастанию или по убыванию Specifying ascending and descending order DESC • ASC DESC • ASC
Указание параметров сортировки Specifying a collation COLLATE COLLATE
Указание условного порядка Specifying a conditional order CASE, выражение CASE expression
Использование ORDER BY в ранжирующей функции Using ORDER BY in a ranking function Ранжирующие функции Ranking functions
Ограничение числа возвращаемых строк Limiting the number of rows returned OFFSET • FETCH OFFSET • FETCH
Использование ORDER BY с UNION, EXCEPT и INTERSECT Using ORDER BY with UNION, EXCEPT, and INTERSECT UNION UNION

Основной синтаксис Basic syntax

В примерах этого раздела показана базовая функциональность предложения ORDER BY с использованием минимально необходимого синтаксиса. Examples in this section demonstrate the basic functionality of the ORDER BY clause using the minimum required syntax.

A. A. Указание единственного столбца, определенного в списке выбора Specifying a single column defined in the select list

В следующем примере производится упорядочение результирующего набора по числовому столбцу ProductID . The following example orders the result set by the numeric ProductID column. Поскольку конкретный порядок сортировки не указан, используется порядок по умолчанию (по возрастанию). Because a specific sort order is not specified, the default (ascending order) is used.

Б. B. Указание столбца, не определенного в списке выбора Specifying a column that is not defined in the select list

В следующем примере результирующий набор упорядочивается по столбцу, не включенному в список выбора, но определенному в таблице, указанной в предложении FROM. The following example orders the result set by a column that is not included in the select list, but is defined in the table specified in the FROM clause.

В. C. Указание псевдонима в качестве столбца сортировки Specifying an alias as the sort column

В следующем примере в качестве столбца сортировки указывается псевдоним столбца SchemaName . The following example specifies the column alias SchemaName as the sort order column.

Г. D. Указание выражения в качестве столбца сортировки Specifying an expression as the sort column

В следующем примере в качестве столбца сортировки используется выражение. The following example uses an expression as the sort column. Выражение определено с использованием функции DATEPART, чтобы сортировать результирующий набор по году поступления сотрудника на работу. The expression is defined by using the DATEPART function to sort the result set by the year in which employees were hired.

Указание порядка по возрастанию или по убыванию Specifying ascending and descending sort order

A. A. Указание порядка по убыванию Specifying a descending order

В следующем примере производится упорядочение результирующего набора по числовому столбцу ProductID в убывающем порядке. The following example orders the result set by the numeric column ProductID in descending order.

Б. B. Указание порядка по возрастанию Specifying an ascending order

В следующем примере производится упорядочение результирующего набора по столбцу Name в возрастающем порядке. The following example orders the result set by the Name column in ascending order. Символьные значения сортируются в алфавитном порядке, а не в числовом. The characters are sorted alphabetically, not numerically. Иными словами, отсортированное значение 10 находится перед 2. That is, 10 sorts before 2.

В. C. Указание порядка и по возрастанию, и по убыванию Specifying both ascending and descending order

В следующем примере производится упорядочение результирующего набора по двум столбцам. The following example orders the result set by two columns. Результирующий набор запроса сначала сортируется по возрастанию по столбцу FirstName , а затем в убывающем порядке по столбцу LastName . The query result set is first sorted in ascending order by the FirstName column and then sorted in descending order by the LastName column.

Указание параметров сортировки Specifying a collation

Следующий пример показывает, как задание параметров сортировки в предложении ORDER BY может изменить порядок, в котором возвращаются результаты запроса. The following example shows how specifying a collation in the ORDER BY clause can change the order in which the query results are returned. Созданная таблица содержит столбец, определенный без учета регистра и параметров сортировки диакритических знаков. A table is created that contains a column defined by using a case-insensitive, accent-insensitive collation. Вставленные значения имеют различные сочетания регистра и диакритических знаков. Values are inserted with a variety of case and accent differences. Поскольку параметры сортировки в предложении ORDER BY не заданы, первый запрос при упорядочении значений использует порядок сортировки столбца. Because a collation is not specified in the ORDER BY clause, the first query uses the collation of the column when sorting the values. Во втором запросе в предложении ORDER BY указаны параметры сортировки без учета регистра символов и диакритических знаков, поэтому строки возвращаются в другом порядке. In the second query, a case-sensitive, accent-sensitive collation is specified in the ORDER BY clause, which changes the order in which the rows are returned.

Указание условного порядка Specifying a conditional order

В следующем примере выражение CASE используется в предложении ORDER BY, чтобы условно определить порядок сортировки строк на основе значения заданного столбца таблицы. The following examples use the CASE expression in an ORDER BY clause to conditionally determine the sort order of the rows based on a given column value. В первом примере вычисляется значение столбца SalariedFlag таблицы HumanResources.Employee . In the first example, the value in the SalariedFlag column of the HumanResources.Employee table is evaluated. Сотрудники, для которых столбец SalariedFlag имеет значение 1, возвращаются в порядке BusinessEntityID (по убыванию). Employees that have the SalariedFlag set to 1 are returned in order by the BusinessEntityID in descending order. Сотрудники, для которых столбец SalariedFlag имеет значение 0, возвращаются в порядке BusinessEntityID (по возрастанию). Employees that have the SalariedFlag set to 0 are returned in order by the BusinessEntityID in ascending order. Во втором примере результирующий набор упорядочивается по столбцу TerritoryName , если столбец CountryRegionName содержит значение «United States», и по столбцу CountryRegionName в остальных строках. In the second example, the result set is ordered by the column TerritoryName when the column CountryRegionName is equal to ‘United States’ and by CountryRegionName for all other rows.

Использование ORDER BY в ранжирующей функции Using ORDER BY in a ranking function

В следующем примере предложение ORDER BY используется в ранжирующих функциях ROW_NUMBER, RANK, DENSE_RANK и NTILE. The following example uses the ORDER BY clause in the ranking functions ROW_NUMBER, RANK, DENSE_RANK, and NTILE.

Ограничение числа возвращаемых строк Limiting the number of rows returned

В следующих примерах предложения OFFSET и FETCH ограничивают число строк, возвращаемых запросом. The following examples use OFFSET and FETCH to limit the number of rows returned by a query.

Применимо к: с SQL Server 2012 (11.x) SQL Server 2012 (11.x) до SQL Server 2020 SQL Server 2020 и База данных SQL Azure Azure SQL Database . Applies to: SQL Server 2012 (11.x) SQL Server 2012 (11.x) through SQL Server 2020 SQL Server 2020 and База данных SQL Azure Azure SQL Database .

A. A. Указание целочисленных констант в качестве значений OFFSET и FETCH Specifying integer constants for OFFSET and FETCH values

В следующем примере в качестве значений предложений OFFSET и FETCH указана целочисленная константа. The following example specifies an integer constant as the value for the OFFSET and FETCH clauses. Первый запрос возвращает все строки, отсортированные по столбцу DepartmentID . The first query returns all rows sorted by the column DepartmentID . Сравните результаты, возвращенные этим запросом, с результатами двух следующих запросов. Compare the results returned by this query with the results of the two queries that follow it. В следующем запросе предложение OFFSET 5 ROWS используется для пропуска первых 5 строк и возврата оставшихся. The next query uses the clause OFFSET 5 ROWS to skip the first 5 rows and return all remaining rows. Конечный запрос содержит предложение OFFSET 0 ROWS , чтобы начать с первой строки, а затем предложение FETCH NEXT 10 ROWS ONLY , ограничивающее число возвращаемых строк до 10 из сортированного результирующего набора. The final query uses the clause OFFSET 0 ROWS to start with the first row and then uses FETCH NEXT 10 ROWS ONLY to limit the rows returned to 10 rows from the sorted result set.

Б. B. Указание переменных в качестве значений OFFSET и FETCH Specifying variables for OFFSET and FETCH values

В следующем примере объявлены переменные @StartingRowNumber и @FetchRows . Затем эти переменные указаны в предложениях OFFSET и FETCH. The following example declares the variables @StartingRowNumber and @FetchRows and specifies these variables in the OFFSET and FETCH clauses.

В. C. Указание выражений в качестве значений OFFSET и FETCH Specifying expressions for OFFSET and FETCH values

В следующем примере выражение @StartingRowNumber — 1 определяет значение OFFSET, а выражение @EndingRowNumber — @StartingRowNumber + 1 — значение FETCH. The following example uses the expression @StartingRowNumber — 1 to specify the OFFSET value and the expression @EndingRowNumber — @StartingRowNumber + 1 to specify the FETCH value. Кроме этого, приведено указание запроса OPTIMIZE FOR. In addition, the query hint, OPTIMIZE FOR, is specified. Это указание можно использовать, чтобы предоставить конкретное значение для локальной переменной при компиляции и оптимизации запросов. This hint can be used to provide a particular value for a local variable when the query is compiled and optimized. Значение используется только в процессе оптимизации запроса, но не в процессе выполнения. The value is used only during query optimization, and not during query execution. Дополнительные сведения см. в разделе Указания запросов (Transact-SQL). For more information, see Query Hints (Transact-SQL).

Г. D. Указание вложенного запроса, возвращающего скалярную константу, в качестве значений OFFSET и FETCH Specifying a constant scalar subquery for OFFSET and FETCH values

В следующем примере вложенный запрос, возвращающий скалярную константу, используется для определения значения для предложения FETCH. The following example uses a constant scalar subquery to define the value for the FETCH clause. Вложенный запрос возвращает единственное значение из столбца PageSize в таблице dbo.AppSettings . The subquery returns a single value from the column PageSize in the table dbo.AppSettings .

Д. E. Выполнение нескольких запросов в одной транзакции Running multiple queries in a single transaction

В следующем примере показан один из методов реализации решения разбиения на страницы, который обеспечивает стабильные результаты, возвращаемые во всех запросах. The following example shows one method of implementing a paging solution that ensures stable results are returned in all requests from the query. Этот запрос выполняется в одной транзакции уровня изоляции моментального снимка, а столбец, указанный в предложении ORDER BY, гарантирует уникальность столбца. The query is executed in a single transaction using the snapshot isolation level, and the column specified in the ORDER BY clause ensures column uniqueness.

Использование ORDER BY с UNION, EXCEPT и INTERSECT Using ORDER BY with UNION, EXCEPT, and INTERSECT

Если запрос содержит оператор UNION, EXCEPT или INTERSECT, предложение ORDER BY должно быть указано в конце инструкции, а результаты объединенного запроса должны быть отсортированы. When a query uses the UNION, EXCEPT, or INTERSECT operators, the ORDER BY clause must be specified at the end of the statement and the results of the combined queries are sorted. В следующем примере возвращаются все продукты желтого или красного цвета, отсортированные в общем списке по столбцу ListPrice . The following example returns all products that are red or yellow and sorts this combined list by the column ListPrice .

Примеры: Azure Synapse Analytics (хранилище данных SQL) Azure Synapse Analytics (SQL DW) и Параллельное хранилище данных Parallel Data Warehouse Examples: Azure Synapse Analytics (хранилище данных SQL) Azure Synapse Analytics (SQL DW) and Параллельное хранилище данных Parallel Data Warehouse

В следующем примере демонстрируется упорядочение результирующего набора по числовому столбцу EmployeeKey в возрастающем порядке. The following example demonstrates ordering of a result set by the numerical EmployeeKey column in ascending order.

В следующем примере производится упорядочение результирующего набора по числовому столбцу EmployeeKey в убывающем порядке. The following example orders a result set by the numerical EmployeeKey column in descending order.

В следующем примере производится упорядочение результирующего набора по столбцу LastName . The following example orders a result set by the LastName column.

В следующем примере производится упорядочение по двум столбцам. The following example orders by two columns. Этот запрос сначала сортирует в возрастающем порядке по столбцу FirstName , а затем сортирует общие значения FirstName в убывающем порядке по столбцу LastName . This query first sorts in ascending order by the FirstName column, and then sorts common FirstName values in descending order by the LastName column.

Содержание

Глава 2. Запросы с использованием единственной таблицы

2.1. О предложении SELECT

Все запросы на получение практически любого количества данных из одной или нескольких таблиц выполняются с помощью единственного предложения SELECT. В общем случае результатом реализации предложения SELECT является другая таблица (см. примеры п.1.3). К этой новой (рабочей) таблице может быть снова применена операция SELECT и т.д., т.е. такие операции могут быть вложены друг в друга. Представляет исторический интерес тот факт, что именно возможность включения одного предложения SELECT внутрь другого послужила мотивировкой использования прилагательного «структуризированный» в названии языка SQL.

Предложение SELECT может использоваться как:

  • самостоятельная команда на получение и вывод строк таблицы, сформированной из столбцов и строк одной или нескольких таблиц (представлений);
  • элемент WHERE- или HAVING-условия (сокращенный вариант предложения, называемый «вложенный запрос»);
  • фраза выбора в командах CREAT VIEW, DECLARE CURSOR или INSERT;
  • средство присвоения глобальным переменным значений из строк сформированной таблицы (INTO-фраза).

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

  • звездочка (*) для обозначения «все» — употребляется в обычном для программирования смысле, т.е. «все случаи, удовлетворяющие определению»;
  • квадратные скобки ([]) – означают, что конструкции, заключенные в эти скобки, являются необязательными (т.е. могут быть опущены);
  • фигурные скобки (<>) – означают, что конструкции, заключенные в эти скобки, должны рассматриваться как целые синтаксические единицы, т.е. они позволяют уточнить порядок разбора синтаксических конструкций, заменяя обычные скобки, используемые в синтаксисе SQL;
  • многоточие (. ) – указывает на то, что непосредственно предшествующая ему синтаксическая единица факультативно может повторяться один или более раз;
  • прямая черта (|) – означает наличие выбора из двух или более возможностей. Например обозначение ASC|DESC указывает, можно выбрать один из терминов ASC или DESC; когда же один из элементов выбора заключен в квадратные скобки, то это означает, что он выбирается по умолчанию (так, [ASC]|DESC означает, что отсутствие всей этой конструкции будет восприниматься как выбор ASC);
  • точка с запятой (;) – завершающий элемент предложений SQL;
  • запятая (,) – используется для разделения элементов списков;
  • пробелы ( ) – могут вводиться для повышения наглядности между любыми синтаксическими конструкциями предложений SQL;
  • прописные жирные латинские буквы и символы – используются для написания конструкций языка SQL и должны (если это специально не оговорено) записываться в точности так, как показано;
  • строчные буквы – используются для написания конструкций, которые должны заменяться конкретными значениями, выбранными пользователем, причем для определенности отдельные слова этих конструкций связываются между собой символом подчеркивания (_);
  • термины таблица, столбец, . – заменяют (с целью сокращения текста синтаксических конструкций) термины имя_таблицы, имя_столбца, . соответственно;
  • термин таблица – используется для обобщения таких видов таблиц, как базовая_таблица, представление или псевдоним; здесь псевдоним служит для временного (на момент выполнения запроса) переименования и (или) создания рабочей копии базовой_таблицы (представления).

Предложение SELECT (выбрать) имеет следующий формат:

и позволяет объединить (UNION) а затем упорядочить (ORDER BY) результаты выбора данных, полученных с помощью нескольких «подзапросов». При этом упорядочение можно производить в порядке возрастания — ASC (ASCending) или убывания DESC (DESCending), а по умолчанию принимается ASC.

В этом предложении подзапрос позволяет указать условия для выбора нужных данных и (если требуется) их обработки

SELECT (выбрать) данные из указанных столбцов и (если необходимо) выполнить перед выводом их преобразование в соответствии с указанными выражениями и (или) функциями FROM (из) перечисленных таблиц, в которых расположены эти столбцы WHERE (где) строки из указанных таблиц должны удовлетворять указанному перечню условий отбора строк GROUP BY (группируя по) указанному перечню столбцов с тем, чтобы получить для каждой группы единственное агрегированное значение, используя во фразе SELECT SQL-функции SUM (сумма), COUNT (количество), MIN (минимальное значение), MAX (максимальное значение) или AVG (среднее значение) HAVING (имея) в результате лишь те группы, которые удовлетворяют указанному перечню условий отбора групп

Элемент_SELECT — это одна из следующих конструкций:

где значение – это:

Синтаксис выражений имеет вид

а синтаксис SQL_функций – одна из следующих конструкций:

Фраза WHERE включает набор условий для отбора строк:

где WHERE_условие – одна из следующих конструкций:

Кроме традиционных операторов сравнения (= | <> | | >=) в WHERE фразе используются условия BETWEEN (между), LIKE (похоже на), IN (принадлежит), IS NULL (не определено) и EXISTS (существует), которые могут предваряться оператором NOT (не). Критерий отбора строк формируется из одного или нескольких условий, соединенных логическими операторами:

AND — когда должны удовлетворяться оба разделяемых с помощью AND условия; OR — когда должно удовлетворяться одно из разделяемых с помощью OR условий; AND NOT — когда должно удовлетворяться первое условие и не должно второе; OR NOT — когда или должно удовлетворяться первое условие или не должно удовлетворяться второе,

причем существует приоритет AND над OR (сначала выполняются все операции AND и только после этого операции OR). Для получения желаемого результата WHERE условия должны быть введены в правильном порядке, который можно организовать введением скобок.

При обработке условия числа сравниваются алгебраически — отрицательные числа считаются меньшими, чем положительные, независимо от их абсолютной величины. Строки символов сравниваются в соответствии с их представлением в коде, используемом в конкретной СУБД, например, в коде ASCII. Если сравниваются две строки символов, имеющих разные длины, более короткая строка дополняется справа пробелами для того, чтобы они имели одинаковую длину перед осуществлением сравнения.

Наконец, синтаксис фразы GROUP BY имеет вид

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

С помощью фразы HAVING (синтаксис которой почти не отличается от синтаксиса фразы WHERE)

можно исключить из результата группы, не удовлетворяющие заданным условиям:

2.2. Выборка без использования фразы WHERE

2.2.1. Простая выборка

Запрос выдать название, статус и адрес поставщиков

дает результат, приведенный на рис. 2.1,а.

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

или использовать его более короткую нотацию:

Здесь «звездочка» (*) служит кратким обозначением всех имен полей в таблице, указанной во фразе FROM. При этом порядок вывода полей соответствует порядку, в котором эти поля определялись при создании таблицы.

Еще один пример. Выдать основу всех блюд:

дает результат, показанный на рис. 2.1,б.

а) б) в)
Название Статус Адрес
СЫТНЫЙ рынок Сытнинская, 3
ПОРТОС кооператив Садовая, 27
ШУШАРЫ совхоз Новая, 17
ТУЛЬСКИЙ универсам Тульская, 3
УРОЖАЙ коопторг Песчаная, 19
ЛЕТО агрофирма Пулковское ш.,8
ОГУРЕЧИК ферма Укмерге, 15
КОРЮШКА кооператив Нарвское ш., 64
Основа
Овощи
Мясо
Овощи
Рыба
Рыба
Мясо
Молоко
Молоко
.
Кофе
Основа
Кофе
Крупа
Молоко
Мясо
Овощи
Рыба
Фрукты
Яйца

Рис. 2.1. Примеры простой выборки

2.2.2. Исключение дубликатов

В предыдущем примере был выдан правильный, но не совсем удачный перечень основных продуктов: из него не были исключены дубликаты. Для исключения дубликатов и одновременного упорядочения перечня необходимо дополнить запрос ключевым словом DISTINCT (различный, различные), как показано в следующем примере:

Результат приведен на рис. 2.1,в.

2.2.3. Выборка вычисляемых значений

Из синтаксиса фразы SELECT (п.2.1) видно, что в ней может содержаться не только перечень столбцов таблицы или символ *, но и выражения.

Например, если нужно получить значение калорийности всех продуктов, то можно учесть, что при окислении 1 г углеводов или белков в организме освобождается в среднем 4.1 ккал, а при окислении 1 г жиров — 9.3 ккал, и выдать запрос:

результат которого приведен на рис. 2.2,а.

а) б) в)
Продукт
Говядина 1928.1
Судак 1523.
Масло 8287.5
Майонез 6464.7
Яйца 1618.9
Сметана 3011.4
Молоко 605.1
Творог 1575.
Морковь 349.6
Лук 459.2
Помидоры 196.8
Зелень 118.9
Рис 3512.1
Мука 3556.7
Яблоки 479.7
Сахар 4091.8
Кофе 892.4
Продукт
Говядина Калорий = 1928.1
Судак Калорий = 1523.
Масло Калорий = 8287.5
Майонез Калорий = 6464.7
Яйца Калорий = 1618.9
Сметана Калорий = 3011.4
Молоко Калорий = 605.1
Творог Калорий = 1575.
Морковь Калорий = 349.6
Лук Калорий = 459.2
Помидоры Калорий = 196.8
Зелень Калорий = 118.9
Рис Калорий = 3512.1
Мука Калорий = 3556.7
Яблоки Калорий = 479.7
Сахар Калорий = 4091.8
Кофе Калорий = 892.4
Продукт
Зелень 118.9
Помидоры 196.8
Морковь 349.6
Лук 459.2
Яблоки 479.7
Молоко 605.1
Кофе 892.4
Судак 1523.
Творог 1575.
Яйца 1618.9
Говядина 1928.1
Сметана 3011.4
Рис 3512.1
Мука 3556.7
Сахар 4091.8
Майонез 6464.7
Масло 8287.5

Рис. 2.2. Примеры запросов с вычисляемыми полями

Фраза SELECT может включать не только выражения, но и отдельные числовые или текстовые константы. Следует отметить, что текстовые константы должны заключаться в апострофы (‘). На рис. 2.2,б приведен результат запроса:

А что произойдет, если какой-либо член выражения не определен, т.е. имеет значение NULL и каким образом появилось такое значение?

Если при загрузке строк таблицы в какой-либо из вводимых строк отсутствует значение для какого-либо столбца, то СУБД введет в такое поле NULL-значение. NULL-значение «придумано» для того, чтобы представить единым образом «неизвестные значения» для любых типов данных. Действительно, так как при вводе данных в столбец или их изменении СУБД запрещает ввод значений не соответствующих описанию данных этого столбца, то, например, нельзя использовать пробел для отсутствующего значения числа. Нельзя для этих целей использовать и ноль: нет месяца или дня недели равного нулю, да и для чисел ноль не может рассматриваться как неизвестное значение в одном месте и как известное — в другом. При выводе же NULL-значения на экран или печатающее устройство его код воспроизводится каким-либо специально заданным символом или набором символов: например, пробелом (если его нельзя перепутать с текстовым значением пробела) или сочетанием -0-.

С помощью специальной команды можно установить в СУБД один из режимов представления NULL-значений при выполнении числовых расчетов: запрет или разрешение замены NULL-значения нулем. В первом случае любое арифметическое выражение, содержащее неопределенный операнд, будет также иметь неопределенное значение. Во втором случае результат вычислений будет иметь численное значение (если это значение попадает в диапазон представления соответствующего типа данных).

Например, при выполнении запроса

и разных «настройках» СУБД могут быть получены разные результаты:

ПР Цена К_во (Цена*К_во)
9 -0- -0- -0-
11 1.5 50 75.
12 3. 10 30.
15 2. 170 340.
ПР Цена К_во (Цена*К_во)
9 -0- -0- 0.
11 1.5 50 75.
12 3. 10 30.
15 2. 170 340.

2.3. Выборка c использованием фразы WHERE

2.3.1. Использование операторов сравнения

В синтаксисе фразы WHERE (п.2.1) показано, что для отбора нужных строк таблицы можно использовать операторы сравнения = (равно), <> (не равно), (больше), >= (больше или равно), которые могут предваряться оператором NOT, создавая, например, отношения «не меньше» и «не больше».

Так, для получения перечня продуктов, практически не содержащих углеводов, можно сформировать запрос

Продукт Белки Жиры Углев K Ca Na B2 PP C
Говядина 189. 124. 0. 3150 90 600 1.5 28.
Судак 190. 80. 0. 1870 270 0 1.1 10. 30

Возможность использования нескольких условий, соединенных логическими операторами AND, OR, AND NOT и OR NOT, позволяет осуществить более детальный отбор строк. Так, для получения перечня продуктов, практически не содержащих углеводов и натрия, можно сформировать запрос:

Результат запроса имеет вид

Продукт Белки Жиры Углев K Ca Na B2 PP C
Судак 190. 80. 0. 1870 270 1.1 10. 30

Добавим к этому запросу еще одно условие

и получим на экране сообщение «No rows exist or satisfy the specified clause» или аналогичное (в зависимости от вкусов разработчиков разных СУБД), информирующее об отсутствии строк, удовлетворяющих заданному(ым) условию(ям).

2.3.2. Использование BETWEEN

С помощью BETWEEN . AND . (находится в интервале от . до . ) можно отобрать строки, в которых значение какого-либо столбца находятся в заданном диапазоне.

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

Результат:
Продукт Белки
Майонез 31.
Сметана 26.
Молоко 28.
Морковь 13.
Лук 17.

Можно задать и NOT BETWEEN (не принадлежит диапазону между), например:

Результат:
Продукт Белки Жиры
Говядина 189. 124.
Масло 60. 825.
Яйца 127. 115.

BETWEEN особенно удобен при работе с данными, задаваемыми интервалами, начало и конец которых расположен в разных столбцах.

Для примера воспользуемся таблицей «минимальных окладов» (табл. 2.1), величина которых непосредственно связана со студенческой стипендией. В этой таблице для текущего значения минимального оклада установлена запредельная дата окончания 9 сентября 9999 года.

Таблица 2.1
Минимальные оклады

Миноклад Начало Конец
2250 01-01-1993 31-03-1993
4275 01-04-1993 30-06-1993
7740 01-07-1993 30-11-1993
14620 01-12-1993 30-06-1994
20500 01-07-1994 09-09-9999

Если, например, потребовалось узнать, какие изменения минимальных окладов производились в 1993/94 учебном году, то можно выдать запрос

и получить результат:

Начало Миноклад
01-12-1993 14620
01-07-1994 20500

Отметим, что при формировании запросов значения дат следует заключать в апострофы, чтобы СУБД не путала их с выражениями и не пыталась вычитать из 31 значение 8, а затем 1994.

Для выявления всех значений минимальных окладов, которые существовали в 1993/94 учебном году, можно сформировать запрос

Миноклад Начало Конец
7740 01/07/1993 30/11/1993
14620 01/12/1993 30/06/1994
20500 01/07/1994 09/09/9999

Наконец, для получения минимального оклада на 15-5-1994:

Результат:
Миноклад
14620

2.3.3. Использование IN

Выдать сведения о блюдах на основе яиц, крупы и овощей

БЛ Блюдо В Основа Выход Труд
1 Салат летний З Овощи 200. 3
3 Салат витаминный З Овощи 200. 4
16 Драчена Г Яйца 180. 4
17 Морковь с рисом Г Овощи 260. 3
19 Омлет с луком Г Яйца 200. 5
20 Каша рисовая Г Крупа 210. 4
21 Пудинг рисовый Г Крупа 160. 6
23 Помидоры с луком Г Овощи 260. 4

Рассмотренная форма IN является в действительности просто краткой записью последовательности отдельных сравнений, соединенных операторами OR. Предыдущее предложение эквивалентно такому:

Можно задать и NOT IN (не принадлежит), а также возможность использования IN (NOT IN) с подзапросом (см. главу 3).

2.3.4. Использование LIKE

Выдать перечень салатов

Результат:
Блюдо
Салат летний
Салат мясной
Салат витаминный
Салат рыбный

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

  • символ _ (подчеркивание) – заменяет любой одиночный символ,
  • символ % (процент) – заменяет любую последовательность из N символов (где N может быть нулем),
  • все другие символы означают просто сами себя.

Следовательно, в приведенном примере SELECT будет осуществлять выборку записей из таблицы Блюда, для которых значение в столбце Блюдо начинается сочетанием ‘Салат’ и содержит любую последовательность из нуля или более символов, следующих за сочетанием ‘Салат’. Если бы среди блюд были «Луковый салат», «Фруктовый салат» и т.п., то они не были бы найдены. Для их отыскания надо изменить фразу WHERE:

или при отсутствии различий между малыми и большими буквами (такую настройку допускают некоторые СУБД):

Это позволит отыскать все салаты.

2.3.5. Вовлечение неопределенного значения (NULL-значения)

Как было рассказано в п.2.2.3, если при загрузке данных не введено значение в какое-либо поле таблицы, то СУБД поместит в него NULL-значение. Аналогичное значение можно ввести в поле таблицы, выполняя операцию изменения данных. Так, при отсутствии сведений о наличии у поставщиков судака и моркови в столбцы Цена и К_во соответствующих строк таблицы Поставки вводится NULL и там будет храниться код NULL-значения, а не 0, 0. или пробел. (Отметим, что в распечатке таблицы Поставки рис.1.1 в этих местах расположен пробел, установленный в СУБД для представления NULL-значения при выводе на печать).

В этом случае для выявления названий продуктов, отсутствующих в кладовой, шеф-повар может дать запрос

Результат: ПР
2
9

Естественно, что для выявления продуктов, существующих в кладовой, следует дать запрос

связано с тем, что ничто — и даже само NULL-значение — не считается равным другому NULL-значению. (Несмотря на это, два неопределенных значения рассматриваются, однако, как дубликаты друг друга при исключении дубликатов, и предложение SELECT DISTINCT даст в результате не более одного NULL-значения.)

2.4. Выборка с упорядочением

Синтаксис фразы упорядочения был дан в п. 2.1. Простейший вариант этой фразы — упорядочение строк результата по значению одного из столбцов с указанием порядка сортировки или без такого указания. (По умолчанию строки будут сортироваться в порядке возрастания значений в указанном столбце.)

Например, выдать перечень продуктов и содержание в них основных веществ в порядке убывания содержания белка

Результат:
Продукт Белки Жиры Углев
Судак 190. 80. 0.
Говядина 189. 124. 0.
Творог 167. 90. 13.
Яйца 127. 115. 7.
Кофе 127. 36. 9.
Мука 106. 13. 732.
. . .

При включении в список ORDER BY нескольких столбцов СУБД сортирует строки результата по значениям первого столбца списка пока не появится несколько строк с одинаковыми значениями данных в этом столбце. Такие строки сортируются по значениям следующего столбца из списка ORDER BY и т.д.

Например, выдать содержимое таблицы Блюда, отсортировав ее строки по видам блюд и основе:

Результат:
БЛ Блюдо В Основа Выход Труд
21 Пудинг рисовый Г Крупа 160. 6
20 Каша рисовая Г Крупа 210. 4
18 Сырники Г Молоко 220. 4
. . .
16 Драчена Г Яйца 180. 4
28 Крем творожный Д Молоко 160. 4
. . .
26 Яблоки печеные Д Фрукты 160. 3
7 Сметана З Молоко 140. 1
8 Творог З Молоко 140. 2
2 Салат мясной З Мясо 200. 4
6 Мясо с гарниром З Мясо 250. 3
1 Салат летний З Овощи 200. 3
. . .

Кроме того, в список ORDER BY можно включать не только имя столбца, а его порядковую позицию в перечне SELECT. Благодаря этому возможно упорядочение результатов на основе вычисляемых столбцов, не имеющих имен.

позволит получить список продуктов, показанный на рис.2.2,в – переупорядоченный по возрастанию значений калорийности список рис.2.2,а.

2.5. Агрегирование данных

2.5.1 SQL-функции

В SQL существует ряд специальных стандартных функций (SQL-функций). Кроме специального случая COUNT(*) каждая из этих функций оперирует совокупностью значений столбца некоторой таблицы и создает единственное значение, определяемое так:

COUNT — число значений в столбце, SUM — сумма значений в столбце, AVG — среднее значение в столбце, MAX — самое большое значение в столбце, MIN — самое малое значение в столбце.

Для функций SUM и AVG рассматриваемый столбец должен содержать числовые значения.

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

Аргументу всех функций, кроме COUNT(*), может предшествовать ключевое слово DISTINCT (различный), указывающее, что избыточные дублирующие значения должны быть исключены перед тем, как будет применяться функция. Специальная же функция COUNT(*) служит для подсчета всех без исключения строк в таблице (включая дубликаты).

2.5.2. Функции без использования фразы GROUP BY

Если не используется фраза GROUP BY, то в перечень элементов_SELECT можно включать лишь SQL-функции или выражения, содержащие такие функции. Другими словами, нельзя иметь в списке столбцы, не являющихся аргументами SQL-функций.

Например, выдать данные о массе лука (ПР=10), проданного поставщиками, и указать количество этих поставщиков:

Результат:
SUM(К_во) COUNT(К_во)
220 2

Если бы для вывода в результат еще и номера продукта был сформирован запрос

то было бы получено сообщение об ошибке. Это связано с тем, что SQL-функция создает единственное значение из множества значений столбца-аргумента, а для «свободного» столбца должно быть выдано все множество его значений. Без специального указания (оно задается фразой GROUP BY) SQL не будет выяснять, одинаковы значения этого множества (как в данном примере, где ПР=10) или различны (как было бы при отсутствии WHERE фразы). Поэтому подобный запрос отвергается системой.

Правда, никто не запрещает дать запрос

Результат:
‘Кол-во лука =’ SUM(К_во) COUNT(К_во)
Кол-во лука = 220 2

Отметим также, что в столбце-аргументе перед применением любой функции, кроме COUNT(*), исключаются все неопределенные значения. Если оказывается, что аргумент — пустое множество, функция COUNT принимает значение 0, а остальные — NULL.

Например, для получения суммы цен, средней цены, количества поставляемых продуктов и количества разных цен продуктов, проданных коопторгом УРОЖАЙ (ПС=5), а также для получения количества продуктов, которые могут поставляться этим коопторгом, можно дать запрос

(*)

SUM(Цена) AVG(Цена) COUNT(Цена) COUNT(DISTINCT Цена) COUNT
6.2 1.24 5 4 7

В другом примере, где надо узнать «Сколько поставлено моркови и сколько поставщиков ее поставляют?»:

будет получен ответ:

SUM(К_во) COUNT (К_во)
-0-

Наконец, попробуем получить сумму массы поставленного лука с его средней ценой («Сапоги с яичницей»):

Результат:
SUM(К_во)+AVG(Цена)
220.6

2.5.3. Фраза GROUP BY

Мы показали, как можно вычислить массу определенного продукта, поставляемого поставщиками. Предположим, что теперь требуется вычислить общую массу каждого из продуктов, поставляемых в настоящее время поставщиками. Это можно легко сделать с помощью предложения

Результат показан на рис. 2.3,а.

а) б) в) г)
ПР
9
11 150
12 30
15 370
1 370
3 250
5 170
6 220
8 150
7 200
2
4 100
13 190
14 70
16 250
17 50
10 220
ПС ПР Цена К_во
1 9 -0- -0-
3 9 -0- -0-
5 9 -0- -0-
1 11 1.50 50
5 11 -0- -0-
6 11 -0- -0-
8 11 1.00 100
1 12 3.00 10
3 12 2.50 20
6 12 -0- -0-
1 15 2.00 170
3 15 1.50 200
2 1 3.60 300
7 1 4.20 70
2 3 -0- -0-
7 3 4.00 250
. . .
ПР
1 370
2
3 250
4 100
5 170
6 220
7 200
8 150
9
10 220
11 150
12 30
13 190
14 70
15 370
16 250
17 50
ПР
9
11 150
12 30
15 70
1 370
3 250
5 70
6 140
8 150
7 200
2
4 100
13 190
14 70
16 250
17 50
10 220

Рис. 2.3. Иллюстрации к фразе GROUP BY

Фраза GROUP BY (группировать по) инициирует перекомпоновку указанной во FROM таблицы по группам, каждая из которых имеет одинаковые значения в столбце, указанном в GROUP BY. В рассматриваемом примере строки таблицы Поставки группируются так, что в одной группе содержатся все строки для продукта с ПР = 1, в другой – для продукта с ПР = 2 и т.д. (см. рис. 2.3.б). Далее к каждой группе применяется фраза SELECT. Каждое выражение в этой фразе должно принимать единственное значение для группы, т.е. оно может быть либо значением столбца, указанного в GROUP BY, либо арифметическим выражением, включающим это значение, либо константой, либо одной из SQL-функций, которая оперирует всеми значениями столбца в группе и сводит эти значения к единственному значению (например, к сумме).

Отметим, что фраза GROUP BY не предполагает ORDER BY. Чтобы гарантировать упорядочение по ПР результата рассматриваемого примера (рис. 2.3,в) следует дать запрос

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

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

Т БЛ COUNT(БЛ)
1 3 18
1 6 14
1 19 17
1 21 15
.

Если в запросе используются фразы WHERE и GROUP BY, то строки, не удовлетворяющие фразе WHERE, исключаются до выполнения группирования.

Например, выдать для каждого продукта его код и общий объем возможных поставок, учитывая временную недееспособность поставщика с ПС=2:

Результат, приведенный на рис. 2.3,г, отличается от результата (рис. 2.3,а) аналогичного запроса для всех поставщиков объемом поставок продуктов с кодами 15, 5 и 6.

2.5.4. Использование фразы HAVING

Фраза HAVING (рис.2.3) играет такую же роль для групп, что и фраза WHERE для строк: она используется для исключения групп, точно так же, как WHERE используется для исключения строк. Эта фраза включается в предложение лишь при наличии фразы GROUP BY, а выражение в HAVING должно принимать единственное значение для группы.

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

Результат: ПР
9
11
12

В п.3.6 можно познакомиться с более содержательным примером использования этой фразы.

Получение, ограничение и сортировка данных используя SQL — Итоги

Возможности команды SELECT

  • Три операции доступные для команды SELECT это проекция, выборка и объединение
  • Проекция – это ограничение столбцов, выбираемых из таблцы. Используя проекцию вы получаете только столбцы в которых вы заинтересованы, вместо всех возможных.
  • Выборка используется во время вычитки строк из таблицы. Выборка включает наложение ограничений на выбираемые строки на основе критериев или условий. Это позволяет вам получать только те строки, которые вам необходимы
  • Объединение включает в себя связь таблиц основываясь на общиъ аттрибутах. Объединение позволяет хранить данные в третьей нормальной форме в разных таблицах вместо одной большой таблицы.
  • Команда DESCRIBE выводит список названий столбцов, их типов данных и ограничение обязательности

Базовая команда SELECT

  • Директива SELECT определяет проекцию столбцов. Другими словами, SELECT определяет какие именно столбцы должны быть включены в результат
  • Ключевое слово DISTINCT препятствует возникновению строк, содержащих дубликаты всех столбцов в возвращаемом результате
  • Выражения и столбцы могут использовать псевдоним используя ключевое слово AS или пробел между столбцом или выражением и псевдонимом
  • Одиночная кавычка в символьном литерале может быть экранирована путём добавления дополнительной одинарной кавычки или используя оператор quote.

Ограничение строк, получаемых запросом

  • Одно или более условий образуют раздел WHERE. Эти условия определяют правила, которые должны выполнять данные чтобы быть выбраны в результат
  • Для каждой строки, проверяемой в условии, есть операнды, которые находятся слева и справа от оператора. Операндом может быть значение столбца, литерал или выражение.
  • Операторы сравнения могут проверять данные по-разному. Равенство или неравенство проверяются очень часто, но доступны также операторы проверки диапазона, вхождения в группу и проверка на основании шаблона.
  • Булевыми операторами являются операторы AND, OR и NOT. Операторы AND и OR позволяют использовать несколько условий в разделе WHERE.
  • Оператор NOT меняет смысл оператора сравнения на противоположный.

Сортировка строк, возвращаемых запросом

  • Результат можно сортировать, используя ключевое слово ORDER BY. Полученные строки могут быть отсортированы по одному или нескольким столбцам указав имя столбца или его порядковый номер в разделе SELECT
  • Вывод данных может быть отсортирован по возрастанию или убыванию используя ключевые слова DESC или ASC после каждого столбца или выражения исопльзуемого для сортировки.
  • Подстановка переменной позволяет использовать написанный ранее запрос добавляя возможность заменить некоторые элементы во время выполнения. Один и тот же запрос может быть выполнен несколько раз с указанием разных параметров.
  • Переменные сессии могут задаваться явно, используя команду DEFINE. Команда UNDEFINE позволяет удалить переменные сессии включая явно созданные командой DEFINE и неявно созданные (используя двойной амперсант).
  • Команда VERIFY управляет выводом пользователю запроса до и после подстановки переменной
Илон Маск рекомендует:  21 ошибка программиста php
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL