Условие поиска (transact-sql)search condition (transact-sql)

SQL References

SQL Keywords ADD ADD CONSTRAINT ALTER ALTER COLUMN ALTER TABLE ALL AND ANY AS ASC BACKUP DATABASE BETWEEN CASE CHECK COLUMN CONSTRAINT CREATE CREATE DATABASE CREATE INDEX CREATE OR REPLACE VIEW CREATE TABLE CREATE PROCEDURE CREATE UNIQUE INDEX CREATE VIEW DATABASE DEFAULT DELETE DESC DISTINCT DROP DROP COLUMN DROP CONSTRAINT DROP DATABASE DROP DEFAULT DROP INDEX DROP TABLE DROP VIEW EXEC EXISTS FOREIGN KEY FROM FULL OUTER JOIN GROUP BY HAVING IN INDEX INNER JOIN INSERT INTO INSERT INTO SELECT IS NULL IS NOT NULL JOIN LEFT JOIN LIKE LIMIT NOT NOT NULL OR ORDER BY OUTER JOIN PRIMARY KEY PROCEDURE RIGHT JOIN ROWNUM SELECT SELECT DISTINCT SELECT INTO SELECT TOP SET TABLE TOP TRUNCATE TABLE UNION UNION ALL UNIQUE UPDATE VALUES VIEW WHERE

MySQL Functions String Functions ASCII CHAR_LENGTH CHARACTER_LENGTH CONCAT CONCAT_WS FIELD FIND_IN_SET FORMAT INSERT INSTR LCASE LEFT LENGTH LOCATE LOWER LPAD LTRIM MID POSITION REPEAT REPLACE REVERSE RIGHT RPAD RTRIM SPACE STRCMP SUBSTR SUBSTRING SUBSTRING_INDEX TRIM UCASE UPPER

Numeric Functions ABS ACOS ASIN ATAN ATAN2 AVG CEIL CEILING COS COT COUNT DEGREES DIV EXP FLOOR GREATEST LEAST LN LOG LOG10 LOG2 MAX MIN MOD PI POW POWER RADIANS RAND ROUND SIGN SIN SQRT SUM TAN TRUNCATE

Date Functions ADDDATE ADDTIME CURDATE CURRENT_DATE CURRENT_TIME CURRENT_TIMESTAMP CURTIME DATE DATEDIFF DATE_ADD DATE_FORMAT DATE_SUB DAY DAYNAME DAYOFMONTH DAYOFWEEK DAYOFYEAR EXTRACT FROM_DAYS HOUR LAST_DAY LOCALTIME LOCALTIMESTAMP MAKEDATE MAKETIME MICROSECOND MINUTE MONTH MONTHNAME NOW PERIOD_ADD PERIOD_DIFF QUARTER SECOND SEC_TO_TIME STR_TO_DATE SUBDATE SUBTIME SYSDATE TIME TIME_FORMAT TIME_TO_SEC TIMEDIFF TIMESTAMP TO_DAYS WEEK WEEKDAY WEEKOFYEAR YEAR YEARWEEK

Advanced Functions BIN BINARY CASE CAST COALESCE CONNECTION_ID CONV CONVERT CURRENT_USER DATABASE IF IFNULL ISNULL LAST_INSERT_ID NULLIF SESSION_USER SYSTEM_USER USER VERSION

SQL Server Functions String Functions ASCII CHAR CHARINDEX CONCAT Concat with + CONCAT_WS DATALENGTH DIFFERENCE FORMAT LEFT LEN LOWER LTRIM NCHAR PATINDEX QUOTENAME REPLACE REPLICATE REVERSE RIGHT RTRIM SOUNDEX SPACE STR STUFF SUBSTRING TRANSLATE TRIM UNICODE UPPER

Numeric Functions ABS ACOS ASIN ATAN ATN2 AVG CEILING COUNT COS COT DEGREES EXP FLOOR LOG LOG10 MAX MIN PI POWER RADIANS RAND ROUND SIGN SIN SQRT SQUARE SUM TAN

Date Functions CURRENT_TIMESTAMP DATEADD DATEDIFF DATEFROMPARTS DATENAME DATEPART DAY GETDATE GETUTCDATE ISDATE MONTH SYSDATETIME YEAR

Advanced Functions CAST COALESCE CONVERT CURRENT_USER IIF ISNULL ISNUMERIC NULLIF SESSION_USER SESSIONPROPERTY SYSTEM_USER USER_NAME

MS Access Functions String Functions Asc Chr Concat with & CurDir Format InStr InstrRev LCase Left Len LTrim Mid Replace Right RTrim Space Split Str StrComp StrConv StrReverse Trim UCase

Numeric Functions Abs Atn Avg Cos Count Exp Fix Format Int Max Min Randomize Rnd Round Sgn Sqr Sum Val

Date Functions Date DateAdd DateDiff DatePart DateSerial DateValue Day Format Hour Minute Month MonthName Now Second Time TimeSerial TimeValue Weekday WeekdayName Year

Other Functions CurrentUser Environ IsDate IsNull IsNumeric

SQL OperatorsSQL Data TypesSQL Quick Ref


Фильтрация. WHERE

Последнее обновление: 13.07.2017

Для фильтрации в команде SELECT применяется оператор WHERE. После этого оператора ставится условие, которому должна соответствовать строка:

WHERE условие

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

  • =: сравнение на равенство (в отличие от си-подобных языков в T-SQL для сравнения на равенство используется один знак равно)

  • <>: сравнение на неравенство

  • <: меньше чем

  • >: больше чем

  • !<: не меньше чем

  • !>: не больше чем

  • <=: меньше чем или равно

  • >=: больше чем или равно

Например, найдем всех товары, производителем которых является компания Samsung:

SELECT * FROM Products
WHERE Manufacturer = 'Samsung'

Стоит отметить, что в данном случае регистр не имеет значение, и мы могли бы использовать для поиска и строку «Samsung», и «SAMSUNG», и «samsung». Все эти варианты давали бы эквивалентный результат выборки.

Другой пример — найдем все товары, у которых цена больше 45000:

SELECT * FROM Products
WHERE Price > 45000

В качестве условия могут использоваться и более сложные выражения. Например, найдем все товары, у которых совокупная стоимость больше 200 000:

SELECT * FROM Products
WHERE Price * ProductCount > 200000

Логические операторы

Для объединения нескольких условий в одно могут использоваться логические операторы. В T-SQL имеются следующие логические операторы:

  • AND: операция логического И. Она объединяет два выражения:

    выражение1 AND выражение2

    Только если оба этих выражения одновременно истинны, то и общее условие оператора AND также будет истинно. То есть если и первое условие истинно, и второе.

  • OR: операция логического ИЛИ. Она также объединяет два выражения:

    выражение1 OR выражение2

    Если хотя бы одно из этих выражений истинно, то общее условие оператора OR также будет истинно. То есть если или первое условие истинно, или второе.

  • NOT: операция логического отрицания. Если выражение в этой операции ложно, то общее условие истинно.

    NOT выражение

Если эти операторы встречаются в одном выражении, то сначала выполняется NOT, потом AND и в конце OR.

Например, выберем все товары, у которых производитель Samsung и одновременно цена больше 50000:

SELECT * FROM Products
WHERE Manufacturer = 'Samsung' AND Price > 50000

Теперь изменим оператор на OR. То есть выберем все товары, у которых либо производитель Samsung, либо цена больше 50000:

SELECT * FROM Products
WHERE Manufacturer = 'Samsung' OR Price > 50000

Применение оператора NOT — выберем все товары, у которых производитель не Samsung:

SELECT * FROM Products
WHERE NOT Manufacturer = 'Samsung'

Но в большинстве случае вполне можно обойтись без оператора NOT. Так, в предыдущий пример мы можем переписать следующим образом:

SELECT * FROM Products
WHERE Manufacturer <> 'Samsung'

Также в одной команде SELECT можно использовать сразу несколько операторов:

SELECT * FROM Products
WHERE Manufacturer = 'Samsung' OR Price > 30000 AND ProductCount > 2

Так как оператор AND имеет более высокий приоритет, то сначала будет выполняться подвыражение , и только потом оператор OR. То есть здесь выбираются товары, которыех на складе больше 2 и у которых одновременно цена больше 30000, либо те товары, производителем которых является Samsung.

С помощью скобок мы также можем переопределить порядок операций:

SELECT * FROM Products
WHERE (Manufacturer = 'Samsung' OR Price > 30000) AND ProductCount > 2

IS NULL

Ряд столбцов может допускать значение NULL. Это значение не эквивалентно пустой строке ». NULL представляет полное отсутствие какого-либо значения. И для проверки на наличие подобного значения применяется оператор IS NULL.

Например, выберем все товары, у которых не установлено поле ProductCount:

SELECT * FROM Products
WHERE ProductCount IS NULL

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

SELECT * FROM Products
WHERE ProductCount IS NOT NULL

НазадВперед

ПримерыExamples

В следующем примере операторы сравнения Equals () Not Equal To () используются для сравнения со значениями в таблице, которые равны или не равны .The following example uses the Equals () and Not Equal To () comparison operators to make comparisons with and non-null values in a table. Этот пример также демонстрирует, что использование конструкции не зависит от значения параметра .The example also shows that is not affected by the setting.

Теперь установите параметр ANSI_NULLS в значение ON и выполните тестирование.Now set ANSI_NULLS to ON and test.

Теперь установите параметр ANSI_NULLS в значение OFF и выполните тестирование.Now set ANSI_NULLS to OFF and test.

RemarksRemarks

Приоритеты выполнения логических операторов распределяются следующим образом: NOT (наивысший приоритет), AND, OR (низший приоритет).The order of precedence for the logical operators is NOT (highest), followed by AND, followed by OR. Для перераспределения указанных приоритетов в условии поиска используются скобки.Parentheses can be used to override this precedence in a search condition. Порядок выполнения логических операторов может меняться в зависимости от настроек оптимизатора запросов.The order of evaluation of logical operators can vary depending on choices made by the query optimizer. Дополнительные сведения о работе логических операторов с логическими значениями см. в статьях AND (Transact-SQL), OR (Transact-SQL) и NOT (Transact-SQL).For more information about how the logical operators operate on logic values, see AND (Transact-SQL), OR (Transact-SQL), and NOT (Transact-SQL).

Примеры:Examples:

В следующих примерах используется база данных AdventureWorksPDW2012AdventureWorksPDW2012.The following examples use the AdventureWorksPDW2012AdventureWorksPDW2012 database.

В этом разделе приведены три примера кода.This section shows three code examples. В ходе выполнения первого примера кода возвращаются все строки (предложение WHERE не указано), а также все столбцы (используется ) таблицы .This first code example returns all rows (no WHERE clause is specified) and all columns (using the ) from the table.

В этом примере для достижения такого же результата используется присвоение псевдонима таблице.This next example using table aliasing to achieve the same result.

В ходе выполнения данного примера кода возвращаются все строки (предложение WHERE не задано) и подмножества столбцов (, , ) таблицы базы данных .This example returns all rows (no WHERE clause is specified) and a subset of the columns (, , ) from the table in the database. Заголовок третьего столбца переименовывается в .The third column heading is renamed to .


Этот пример возвращает только строки для , имеющие , не равное NULL, и , равное «M» (состоит в браке).This example returns only the rows for that have an that is not NULL and a of ‘M’ (married).

В.C. Совместное использование DISTINCT и SELECTUsing DISTINCT with SELECT

В следующем примере используется для создания списка всех уникальных должностей в таблице .The following example uses to generate a list of all unique titles in the table.

Г.D. Использование GROUP BYUsing GROUP BY

В следующем примере вычисляется общий объем всех продаж за каждый день.The following example finds the total amount for all sales on each day.

Так как в запросе используется предложение , то выводится только одна строка, содержащая общий объем продаж по каждому дню.Because of the clause, only one row containing the sum of all sales is returned for each day.

Д.E. Использование GROUP BY с несколькими группамиUsing GROUP BY with multiple groups

В следующем примере вычисляются значения средней цены и суммы продаж через Интернет за каждый день, сгруппированные по дате заказа и ключу продвижения.The following example finds the average price and the sum of Internet sales for each day, grouped by order date and the promotion key.

Е.F. Использование GROUP BY и WHEREUsing GROUP BY and WHERE

В следующем примере после извлечения строк, содержащих даты заказов позднее 1 августа 2002 г., происходит их разделение на группы.The following example puts the results into groups after retrieving only the rows with order dates later than August 1, 2002.

Ж.G. Использование GROUP BY с выражениемUsing GROUP BY with an expression

В следующем примере производится группировка с помощью выражения.The following example groups by an expression. Группировку можно производить только с помощью выражения, не содержащего агрегатных функций.You can group by an expression if the expression does not include aggregate functions.

З.H. Использование GROUP BY с ORDER BYUsing GROUP BY with ORDER BY

В следующем примере вычисляется сумма продаж за день и выполняется поиск заказов по определенному дню.The following example finds the sum of sales per day, and orders by the day.

И.I. Использование предложения HAVINGUsing the HAVING clause

Для ограничения результатов поиска в этом запросе используется предложение .This query uses the clause to restrict results.

Функции CASE и IIF

Последнее обновление: 29.07.2017

CASE

Функция CASE проверяет значение некоторого выражение, и в зависимости от результата проверки может возвращать тот или иной результат.

CASE принимает следующую форму:

CASE выражение
	WHEN значение_1 THEN результат_1
	WHEN значение_2 THEN результат_2
	.................................
	WHEN значение_N THEN результат_N
	
END

Возьмем для примера следующую таблицу Products:

CREATE TABLE Products
(
    Id INT IDENTITY PRIMARY KEY,
    ProductName NVARCHAR(30) NOT NULL,
    Manufacturer NVARCHAR(20) NOT NULL,
    ProductCount INT DEFAULT 0,
    Price MONEY NOT NULL
);

Выполним запрос к этой таблице и используем функцию CASE:

SELECT ProductName, Manufacturer,
	CASE ProductCount
		WHEN 1 THEN 'Товар заканчивается'
		WHEN 2 THEN 'Мало товара'
		WHEN 3 THEN 'Есть в наличии'
		ELSE 'Много товара'
	END AS EvaluateCount
FROM Products

Здесь значения столбца ProductCount последовательно сравнивается со значениями после операторов WHEN. В зависимости от значения столбца ProductCount функция CASE будет возвращать одну из строк, которая идет после соответствующего оператора THEN. Для возвращаемого результата определен столбец EvaluateCount:

Также функция CASE может принимать еще одну форму:

CASE
	WHEN выражение_1 THEN результат_1
	WHEN выражение_2 THEN результат_2
	.................................
	WHEN выражение_N THEN результат_N
	
END

Например, применительно к таблице Products:

SELECT ProductName, Manufacturer,
	CASE
		WHEN Price > 50000 THEN 'Категория A'
		WHEN Price BETWEEN 40000 AND 50000 THEN 'Категория B'
		WHEN Price BETWEEN 30000 AND 40000 THEN 'Категория C'
		ELSE 'Категория D'
	END AS Category
FROM Products

Фактически все то же самое, что и в предыдущем примере, только после CASE не указывается сравниваемое значение. А сами выражения сравнения стоят после оператора WHEN. И если выражение после оператора WHEN будет истинно, то возвращается значение, которое идет после соответствующего оператора THEN.

IIF

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

IIF(условие, значение_1, значение_2)

Если условие в функции IIF истинно то возвращается значение_1, если ложно, то возвращается значение_2. Например:

SELECT ProductName, Manufacturer,
	IIF(ProductCount>3, 'Много товара', 'Мало товара')
FROM Products

НазадВперед

Установка MS SQL Server 2017

Последнее обновление: 10.10.2017

MS SQL Server доступен в различных вариациях. Прежде всего, это MS SQL Server Enterprise — полный выпуск, нацеленный на использование в реальных проектах. Именно он используется на различных хостингах и серверах баз данных. Однако он доступен только в платной версии (не считая триального периода) и стоит довольно приличных денег.

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

И также есть MS SQL Server Developer Edition. Это полнофункциональный выпуск, который содержит весь функционал, что и полная версия MS SQL Server Enterprise, только нацелена только для нужд разработки. В то же время эта версия не может быть использована для развертывания в качестве реального сервера на реальных проектах. Однако для изучения всей механики MS SQL Server эта версия представляет оптимальный вариант, поэтому именно эту версию мы и будем использовать.

Оставим языком по умолчанию английский и загрузим все файл iso. Так как загружаемый файл имеет расширение .iso, то после загрузки распакуем его и запустим программу установщика. Нам отобразится окно мастера установки:

Здесь выберем первый пункт «New SQL Server stand-alone installation or add features to an existing installation». Далее с помощью последовательности шагов нам надо будет установить опции установки.

Прощелкаем до пункта «Product Key». На этом этапе надо ввести ключ, либо указать один из бесплатных выпусков. Здесь мы указываем выпуск «Developer» и переходим к новому шагу по кнопке Next.

Далее надо будет принять лицензионное соглашение. И затем прощелкаем до шага «Feature Selection». На этом этапе предлагается выбрать компоненты для установки. Здесь отметим все компоненты, учитывая при этом объем свободной памяти:

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


Далее на шаге «Instance Configuration» нам надо будет указать название и ID запускаемой сущности SQL Server.

Для имени указываем опцию Default instance, а для ID устанавливаем MSSQLSERVER. Это будет то имя экземпляра, по которому мы сможем обращаться к серверу из внешних приложений.

Затем прощелкаем последующие два шага с опциями по умолчанию до «Database Engine Configuration». С помощью кнопки Add Current User здесь добавим текущего пользователя в качестве администратора для сервера.

На следующем шаге «Analysis Services Configuration» также добавим текущего пользователя в качестве администратора для функции Analysis Services:

На следующих двух шагах оставим настройки по умолчанию. И далее на шаге «Distributed Replay Controller» аналогично добавим текущего пользователя

На всех последующих шагах оставим настройки по умолчанию и на самом последнем экране для установки нажмем на кнопку Install:

Спустя некоторое время MS SQL Server будет установлен.

Итак, мы установили SQL Server 2017, при этому назначили для него идентификатор «MSSQLSERVER». Следует отметить, что перед подключением к нему, надо убедиться, что он запущен. Для этого можно открыть окно служб:

Если он не запущен, там же в панели служб мы его может запустить, и после этого мы сможем с ним работать.

НазадВперед

Логический порядок обработки инструкции SELECTLogical Processing Order of the SELECT statement

Следующие действия демонстрируют логический порядок обработки или порядок привязки инструкции SELECT.The following steps show the logical processing order, or binding order, for a SELECT statement. Этот порядок определяет, когда объекты, определенные в одном шаге, становятся доступными для предложений в последующих шагах.This order determines when the objects defined in one step are made available to the clauses in subsequent steps. Например, если обработчик запросов можно привязать (для доступа) к таблицам или представлениям, определенным в предложении FROM, эти объекты и их столбцы становятся доступными для всех последующих шагов.For example, if the query processor can bind to (access) the tables or views defined in the FROM clause, these objects and their columns are made available to all subsequent steps. И наоборот, поскольку предложение SELECT является шагом 8, любые псевдонимы столбцов или производных столбцов, определенные в этом предложении, не могут быть объектом для ссылки предыдущих предложений.Conversely, because the SELECT clause is step 8, any column aliases or derived columns defined in that clause cannot be referenced by preceding clauses. Вместе с тем к ним могут обращаться последующие предложения, например предложение ORDER BY.However, they can be referenced by subsequent clauses such as the ORDER BY clause. Фактическое физическое выполнение инструкции определяется обработчиком запросов и порядок из этого списка может значительно отличаться.The actual physical execution of the statement is determined by the query processor and the order may vary from this list.

  1. FROMFROM
  2. ONON
  3. JOINJOIN
  4. WHEREWHERE
  5. GROUP BYGROUP BY
  6. WITH CUBE или WITH ROLLUPWITH CUBE or WITH ROLLUP
  7. HAVINGHAVING
  8. SELECTSELECT
  9. DISTINCTDISTINCT
  10. ORDER BYORDER BY
  11. В началоTOP

Предупреждение

Как правило, применяется предыдущая последовательность.The preceding sequence is usually true. Однако в редких случаях может быть указана другая последовательность.However, there are uncommon cases where the sequence may differ.

Например, предположим, что в представлении есть кластеризованный индекс и представление исключает некоторые строки таблицы, а для списка столбцов SELECT представления используется инструкция CONVERT, которая изменяет тип данных с varchar на integer.For example, suppose you have a clustered index on a view, and the view excludes some table rows, and the view’s SELECT column list uses a CONVERT that changes a data type from varchar to integer. В этом случае CONVERT может выполняться до выполнения предложения WHERE.In this situation, the CONVERT may execute before the WHERE clause executes. Это нестандартное поведение.Uncommon indeed. Если это имеет значение в вашем случае, можно изменить представление, чтобы исключить использование другой последовательности.Often there is a way to modify your view to avoid the different sequence, if it matters in your case.

SQL Server Math/Numeric Functions

Function Description
ABS Returns the absolute value of a number
ACOS Returns the arc cosine of a number
ASIN Returns the arc sine of a number
ATAN Returns the arc tangent of a number
ATN2 Returns the arc tangent of two numbers
AVG Returns the average value of an expression
CEILING Returns the smallest integer value that is >= a number
COUNT Returns the number of records returned by a select query
COS Returns the cosine of a number
COT Returns the cotangent of a number
DEGREES Converts a value in radians to degrees
EXP Returns e raised to the power of a specified number
FLOOR Returns the largest integer value that is <= to a number
LOG Returns the natural logarithm of a number, or the logarithm of a number to a specified base
LOG10 Returns the natural logarithm of a number to base 10
MAX Returns the maximum value in a set of values
MIN Returns the minimum value in a set of values
PI Returns the value of PI
POWER Returns the value of a number raised to the power of another number
RADIANS Converts a degree value into radians
RAND Returns a random number
ROUND Rounds a number to a specified number of decimal places
SIGN Returns the sign of a number
SIN Returns the sine of a number
SQRT Returns the square root of a number
SQUARE Returns the square of a number
SUM Calculates the sum of a set of values
TAN Returns the tangent of a number

SQL Server String Functions

Function Description
ASCII Returns the ASCII value for the specific character
CHAR Returns the character based on the ASCII code
CHARINDEX Returns the position of a substring in a string
CONCAT Adds two or more strings together
Concat with + Adds two or more strings together
CONCAT_WS Adds two or more strings together with a separator
DATALENGTH Returns the number of bytes used to represent an expression
DIFFERENCE Compares two SOUNDEX values, and returns an integer value
FORMAT Formats a value with the specified format
LEFT Extracts a number of characters from a string (starting from left)
LEN Returns the length of a string
LOWER Converts a string to lower-case
LTRIM Removes leading spaces from a string
NCHAR Returns the Unicode character based on the number code
PATINDEX Returns the position of a pattern in a string
QUOTENAME Returns a Unicode string with delimiters added to make the string a valid SQL Server delimited identifier
REPLACE Replaces all occurrences of a substring within a string, with a new substring
REPLICATE Repeats a string a specified number of times
REVERSE Reverses a string and returns the result
RIGHT Extracts a number of characters from a string (starting from right)
RTRIM Removes trailing spaces from a string
SOUNDEX Returns a four-character code to evaluate the similarity of two strings
SPACE Returns a string of the specified number of space characters
STR Returns a number as string
STUFF Deletes a part of a string and then inserts another part into the string, starting at a specified position
SUBSTRING Extracts some characters from a string
TRANSLATE Returns the string from the first argument after the characters specified in the second argument are translated into the characters specified in the third argument.
TRIM Removes leading and trailing spaces (or other specified characters) from a string
UNICODE Returns the Unicode value for the first character of the input expression
UPPER Converts a string to upper-case

UNION

Последнее обновление: 20.07.2017

Оператор UNION подобно inner join или outer join позволяет соединить две таблицы. Но в отличие от inner/outer join объединения соединяют не столбцы разных таблиц, а два однотипных набора в один. Формальный синтаксис объединения:

SELECT_выражение1
UNION  SELECT_выражение2
 SELECT_выражениеN]

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

USE usersdb;

CREATE TABLE Customers
(
    Id INT IDENTITY PRIMARY KEY,
    FirstName NVARCHAR(20) NOT NULL,
	LastName NVARCHAR(20) NOT NULL,
	AccountSum MONEY
);
CREATE TABLE Employees
(
    Id INT IDENTITY PRIMARY KEY,
    FirstName NVARCHAR(20) NOT NULL,
	LastName NVARCHAR(20) NOT NULL,
);

INSERT INTO Customers VALUES
('Tom', 'Smith', 2000),
('Sam', 'Brown', 3000),
('Mark', 'Adams', 2500),
('Paul', 'Ins', 4200),
('John', 'Smith', 2800),
('Tim', 'Cook', 2800)

INSERT INTO Employees VALUES
('Homer', 'Simpson'),
('Tom', 'Smith'),
('Mark', 'Adams'),
('Nick', 'Svensson')

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

SELECT FirstName, LastName 
FROM Customers
UNION SELECT FirstName, LastName FROM Employees

В данном случае из первой таблицы выбираются два значения — имя и фамилия клиента. Из второй таблицы Employees также выбираются два значения — имя и фамилия сотрудников. То есть при объединении количество выбираемых столбцов и их тип совпадают для обеих выборок.

При этом названия столбцов объединенной выборки будут совпадать с названия столбцов первой выборки. И если мы захотим при этом еще произвести сортировку, то в выражениях ORDER BY необходимо ориентироваться именно на названия столбцов первой выборки:

SELECT FirstName + ' ' +LastName AS FullName
FROM Customers
UNION SELECT FirstName + ' ' + LastName AS EmployeeName 
FROM Employees
ORDER BY FullName DESC

В данном случае каждая выборка имеет по одному столбцу, который представляет объединение имени и фамилии клиента или сотрудника. Но в случае с клиентами столбец будет называться FullName, а в случае с сотрудниками — EmployeeName. Тем не менее для сортировки применяется название столбца из первой выборки и он же будет в результирующей выборке:

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

SELECT FirstName, LastName, AccountSum
FROM Customers
UNION SELECT FirstName, LastName 
FROM Employees

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

SELECT FirstName, LastName
FROM Customers
UNION SELECT Id, LastName 
FROM Employees

В данном случае первый столбец первой выборки имеет тип NVARCHAR, то есть хранит строку. Первый столбец второй выборки — Id имеет тип INT, то есть хранит число.

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

SELECT FirstName, LastName
FROM Customers
UNION ALL SELECT FirstName, LastName 
FROM Employees

Объединять выборки можно и из одной и той же таблицы. Например, в зависимости от суммы на счете клиента нам надо начислять ему определенные проценты:

SELECT FirstName, LastName, AccountSum + AccountSum * 0.1 AS TotalSum 
FROM Customers WHERE AccountSum < 3000
UNION SELECT FirstName, LastName, AccountSum + AccountSum * 0.3 AS TotalSum 
FROM Customers WHERE AccountSum >= 3000

В данном случае если сумма меньше 3000, то начисляются проценты в размере 10% от суммы на счете. Если на счете больше 3000, то проценты увеличиваются до 30%.

НазадВперед

РазрешенияPermissions

Для выборки данных требуется разрешение SELECT на таблицу или представление, которое может быть унаследовано из области более высокого уровня, например разрешение SELECT на схему или разрешение CONTROL на таблицу.Selecting data requires SELECT permission on the table or view, which could be inherited from a higher scope such as SELECT permission on the schema or CONTROL permission on the table. Или необходимо быть членом предопределенных ролей базы данных db_datareader или db_owner либо предопределенной роли сервера sysadmin.Or requires membership in the db_datareader or db_owner fixed database roles, or the sysadmin fixed server role. Для создания новой таблицы с помощью SELECTINTO также необходимы разрешение CREATETABLE и разрешение ALTERSCHEMA на схему, которой принадлежит новая таблица.Creating a new table using SELECTINTO also requires both the CREATETABLE permission, and the ALTERSCHEMA permission on the schema that owns the new table.


С этим читают