--
Вопрос 2: Извлечение данных. Основные опции команды SELECT.
Возвращает строки из базы данных и позволяет делать выборку одной или нескольких строк или столбцов из одной или нескольких таблиц в SQL Server. Синтаксис основных операций SELECT:
[ WITH { [ XMLNAMESPACES ,] [ <common_table_expression> ] } ]
SELECT [ ALL | DISTINCT ]
[TOP ( expression ) [PERCENT] [ WITH TIES ] ]
< select_list >
[ INTO new_table ]
[ FROM { <table_source> } [ ,...n ] ]
[ WHERE <search_condition> ]
[ <GROUP BY> ]
[ HAVING < search_condition > ]
Следующие действия демонстрируют логический порядок обработки или порядок привязки инструкции SELECT. Этот порядок определяет, когда объекты, определенные в одном шаге, становятся доступными для предложений в последующих шагах. Например, если обработчик запросов можно привязать (для доступа) к таблицам или представлениям, определенным в предложении FROM, эти объекты и их столбцы становятся доступными для всех последующих шагов. И наоборот, поскольку предложение SELECT является шагом 8, любые псевдонимы столбцов или производных столбцов, определенные в этом предложении, не могут быть объектом для ссылки предыдущих предложений. Вместе с тем к ним могут обращаться последующие предложения, например предложение ORDER BY. Фактическое физическое выполнение инструкции определяется обработчиком запросов и порядок из этого списка может значительно отличаться.
- FROM
- ON
- JOIN
- WHERE
- GROUP BY
- WITH CUBE или WITH ROLLUP
- HAVING
- SELECT
- DISTINCT
- ORDER BY
- В начало
WITH XMLNAMESPACES Данное предложение объявляет одно или несколько пространств имен XML.
WITH
ALL Указывает, что в результирующем наборе могут появиться повторяющиеся строки. ALL является параметром по умолчанию.
DISTINCT Указывает, что в результирующем наборе могут появиться только уникальные строки. Значения NULL считаются равными для ключевого слова DISTINCT.
TOP (expression ) [ PERCENT ] [ WITH TIES ] Указывает на то, что только заданное число или процент строк будет возвращен из результирующего набора запроса. expression может быть либо числом, либо процентом от числа строк. В целях обратной совместимости использование TOP expression без скобок в инструкциях SELECT поддерживается, но не рекомендуется. Дополнительные сведения см. в разделе TOP (Transact-SQL).
INTO Инструкция SELECT c INTO создает новую таблицу в файловой группе по умолчанию и вставляет в нее результирующие строки из запроса
FROM Указывает таблицу, представление, табличную переменную или источник производной таблицы с указанием или без указания псевдонима для использования в инструкции Transact-SQL.
WHERE Определяет условия, которые должны быть выполнены для всех возвращаемых строк. Количество предикатов, которое может содержать условие поиска, не ограничено.
GROUP BY Предложение инструкции SELECT, которое разделяет результат запроса на группы строк обычно с целью выполнения одного или нескольких статистических вычислений в каждой группе. Инструкция SELECT возвращает одну строку для каждой группы. Запрос группирует значения столбцов Country и Region и возвращает общую сумму по каждому сочетанию значений.
CREATE TABLE Sales ( Country varchar(50), Region varchar(50), Sales int );
INSERT INTO sales VALUES (N'Canada', N'Alberta', 100);
INSERT INTO sales VALUES (N'Canada', N'British Columbia', 200);
INSERT INTO sales VALUES (N'Canada', N'British Columbia', 300);
INSERT INTO sales VALUES (N'United States', N'Montana', 100);
SELECT Country, Region, SUM(sales) AS TotalSales
FROM Sales
GROUP BY Country, Region;
Результат
Country | Region | TotalSales |
---|---|---|
Canada | Alberta | 100 |
Canada | British Columbia | 500 |
United States | Montana | 100 |
HAVING Определяет условие поиска для группы или статистического выражения. Предложение HAVING можно использовать только в инструкции SELECT. HAVING обычно используется с предложением GROUP BY. Если предложение GROUP BY не используется, имеется одна неявная агрегированная группа. В следующем примере, который использует простое предложение HAVING, из таблицы SalesOrderID извлекается сумма всех полей SalesOrderDetail, значение которых превышает $100000.00.
SELECT SalesOrderID, SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID
HAVING SUM(LineTotal) > 100000.00
ORDER BY SalesOrderID ;