Оператор between (transact-sql)between (transact-sql)

Order By clause in SQL Union vs Union All clause

We cannot use the Order by clause with each Select statement. SQL Server can perform a sort in the final result set only.

Let’s try to use Order by with each Select statement.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

SELECTNationalIDNumber,

LoginID,

JobTitle,

BirthDate,

MaritalStatus,

Gender

FROMAdventureWorks2017.HumanResources.Employee_M

OrderbyJobTitle

UNION

SELECTNationalIDNumber,

LoginID,

JobTitle,

BirthDate,

MaritalStatus,

Gender

FROMAdventureWorks2017.HumanResources.Employee_F

OrderbyJobTitle

UNION

SELECTNationalIDNumber,

LoginID,

JobTitle,

BirthDate,

MaritalStatus,

Gender

FROM

AdventureWorks2017.HumanResources.Employee_All

OrderbyJobTitle

We get the following error message. It gives a “incorrect syntax” error message.

The valid query to sort result using Order by clause in SQL Union operator is as follows.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

SELECTNationalIDNumber,

LoginID,

JobTitle,

BirthDate,

MaritalStatus,

Gender

FROMAdventureWorks2017.HumanResources.Employee_M

UNION

SELECTNationalIDNumber,

LoginID,

JobTitle,

BirthDate,

MaritalStatus,

Gender

FROMAdventureWorks2017.HumanResources.Employee_F

UNION

SELECTNationalIDNumber,

LoginID,

JobTitle,

BirthDate,

MaritalStatus,

Gender

FROMAdventureWorks2017.HumanResources.Employee_All

ORDERBYJobTitle;

We get the following output with result set sorted by JobTitle column.

Пример — использование оператора INSERT для вставки нескольких записей

Поместив оператор SELECT в оператор INSERT, вы можете быстро выполнить несколько операций вставки. Давайте рассмотрим пример того, как это сделать.

В этом примере у нас есть таблица employees со следующими данными:

employee_number first_name last_name salary dept_id
1001 Justin Bieber 62000 500
1002 Selena Gomez 57500 500
1003 Mila Kunis 71000 501
1004 Tom Cruise 42000 501

И таблица customers со следующими данными:

customer_id first_name last_name favorite_website
4000 Justin Bieber google.com
5000 Selena Gomez bing.com
6000  Mila Kunis yahoo.com
7000 Tom Cruise oracle.com
8000 Johnny Depp NULL
9000 Russell Crowe google.com

Теперь давайте вставим некоторую информацию из таблицы employees в таблицу customers:

PgSQL

INSERT INTO customers
(customer_id, last_name, first_name)
SELECT employee_number AS customer_id,
last_name,
first_name
FROM employees
WHERE employee_number < 1003;

1
2
3
4
5
6
7

INSERTINTOcustomers

(customer_id,last_name,first_name)

SELECTemployee_numberAScustomer_id,

last_name,

first_name

FROMemployees

WHEREemployee_number<1003;

СОВЕТ: С этим типом INSERT некоторые базы данных требуют от вас псевдонимов имен столбцов в SELECT, чтобы они соответствовали именам столбцов таблицы, в которую вы вставляете. Как вы можете видеть в приведенном выше примере, мы связали первый столбец в операторе SELECT с customer_id.

Будет вставлено 2 записи. Выберите данные из таблицы customers еще раз:

PgSQL

SELECT *
FROM customers;

1
2

SELECT*

FROMcustomers;

Вот результаты, которые вы должны получить:

customer_id first_name last_name favorite_website
4000 Justin Bieber google.com
5000 Selena Gomez bing.com
6000  Mila Kunis yahoo.com
7000 Tom Cruise oracle.com
8000 Johnny Depp NULL
9000 Russell Crowe google.com
1001 Justin Bieber 62000 NULL
1002 Selena Gomez 57500 NULL

В этом примере последние 2 записи в таблице customers были вставлены с использованием данных из таблицы employees.

SQL Server

Платформа SQL Server поддерживает ключевые слова UNION и UNION ALL стандартного синтаксиса ANSI.

инструкция SELECT 1 UNION

инструкция SELECT 2 UNION

SQL Server не поддерживает предложение CORRESPONDING. Предложение UNION DISTINCT не поддерживается, но функциональным эквивалентом является предложение UNION.

С предложениями UNION и UNION ALL вы можете использовать инструкцию SELECT…INTO, но ключевое слово INTO должно находиться в первом запросе оператора объединения. Специальные ключевые слова, такие, как SELECT ТОР и GROUP BY…WITH CUBE, можно использовать во всех запросах объединения. Однако обязательно включайте эти предложения во все запросы объединения. Если вы используете предложения SELECT ТОР или GROUP BY… WITH CUBE в одном запросе, операция выполнена не будет.

Все запросы в объединении должны содержать одно и то же количество столбцов. Типы данных столбцов не обязательно должны быть идентичны, но они должны быть неявным образом приводимы друг к другу. Например, совместное применение столбцов CHAR и VARCHAR допускается. При выводе данных SQL Server при определении размера типа данных для столбца результирующего набора использует размер наибольшего столбца. Таким образом, если в инструкции SELECT… UNION используются столбцы CHAR(5) и CHAR(IO), то данные обоих столбцов будут выводиться в столбце CHAR(IO). Числовые типы данных приводятся и отображаются в виде типа с наибольшей точностью.

Например, в следующем запросе объединяются результаты двух независимых запросов, использующих предложение GROUP BY…WITH CUBE.

На уроке будет рассмотрена тема использования операций объединения, пересечения и разности запросов. Разобраны примеры того, как используется SQL запрос Union, Exists, а также использование ключевых слов SOME, ANY и All. Рассмотрены строковые функции

Над множеством можно выполнять операции объединения, разности и декартова произведения. Те же операции можно использовать и в sql запросах (выполнять операции с запросами).

Использование оператора UNION требует выполнения нескольких условий:

  1. количество выходных столбцов каждого из запросов должно быть одинаковым;
  2. выходные столбцы каждого из запросов должны быть сравнимы между собой по типам данных (в порядке их очередности);
  3. в итоговом наборе используются имена столбцов, заданные в первом запросе;
  4. ORDER BY может быть использовано только в конце составного запроса, так как оно применяетя к результату объединения.

Пример:
Вывести цены на компьютеры и ноутбуки, а также их номера (т.е. произвести выгрузку из двух разных таблиц в одном запросе)

Решение:

1
2
3
4
5
6

SELECT
`Номер`
,
`Цена`

FROM
pc
UNION

SELECT
`Номер`
,
`Цена`

FROM
notebook
ORDER
BY
`Цена`

SELECT `Номер` , `Цена`
FROM pc
UNION
SELECT `Номер` , `Цена`
FROM notebook
ORDER BY `Цена`

Результат:

Рассмотрим более сложный пример с объединением inner join:

Пример:
Найти тип продукции, номер и цену компьютеров и ноутбуков

Решение:

1
2
3
4
5
6
7
8

SELECT
product.
`Тип`
,
pc.
`Номер`
,
`Цена`

FROM
pc
INNER
JOIN
product ON
pc.
`Номер`
=
product.
`Номер`

UNION

SELECT
product.
`Тип`
,
notebook.
`Номер`
,
`Цена`

FROM
notebook
INNER
JOIN
product ON
notebook.
`Номер`
=
product.
`Номер`

ORDER
BY
`Цена`

SELECT product.`Тип` , pc.`Номер` , `Цена`
FROM pc
INNER JOIN product ON pc.`Номер` = product.`Номер`
UNION
SELECT product.`Тип` , notebook.`Номер` , `Цена`
FROM notebook
INNER JOIN product ON notebook.`Номер` = product.`Номер`
ORDER BY `Цена`

Результат:

SQL Union 1.
Найти производителя, номер и цену всех ноутбуков и принтеров

SQL Union 2.
Найти номера и цены всех продуктов, выпущенных производителем Россия

Demo Database

In this tutorial we will use the well-known Northwind sample database.

Below is a selection from the «Customers» table:

CustomerID CustomerName ContactName Address City PostalCode Country
1 Alfreds Futterkiste Maria Anders Obere Str. 57 Berlin 12209 Germany
2 Ana Trujillo Emparedados y helados Ana Trujillo Avda. de la Constitución 2222 México D.F. 05021 Mexico
3 Antonio Moreno Taquería Antonio Moreno Mataderos 2312 México D.F. 05023 Mexico

And a selection from the «Suppliers» table:

SupplierID SupplierName ContactName Address City PostalCode Country
1 Exotic Liquid Charlotte Cooper 49 Gilbert St. London EC1 4SD UK
2 New Orleans Cajun Delights Shelley Burke P.O. Box 78934 New Orleans 70117 USA
3 Grandma Kelly’s Homestead Regina Murphy 707 Oxford Rd. Ann Arbor 48104 USA

Example — Different Field Names

It is not necessary that the corresponding columns in each SELECT statement have the same name, but they do need to be the same corresponding data types.

When you don’t have the same column names between the SELECT statements, it gets a bit tricky, especially when you want to order the results of the query using the ORDER BY clause.

Let’s look at how to use the UNION ALL operator with different column names and order the query results.

For example:

SELECT supplier_id, supplier_name
FROM suppliers
WHERE supplier_id > 2000
UNION ALL
SELECT company_id, company_name
FROM companies
WHERE company_id > 1000
ORDER BY 1;

In this SQL UNION ALL example, since the column names are different between the two SELECT statements, it is more advantageous to reference the columns in the ORDER BY clause by their position in the result set. In this example, we’ve sorted the results by supplier_id / company_id in ascending order, as denoted by the . The supplier_id / company_id fields are in position #1 in the result set.

Now, let’s explore this example further with data.

If you had the suppliers table populated with the following records:

supplier_id supplier_name
1000 Microsoft
2000 Oracle
3000 Apple
4000 Samsung

And the companies table populated with the following records:

company_id company_name
1000 Microsoft
3000 Apple
7000 Sony
8000 IBM

And you executed the following UNION ALL statement:

SELECT supplier_id, supplier_name
FROM suppliers
WHERE supplier_id > 2000
UNION ALL
SELECT company_id, company_name
FROM companies
WHERE company_id > 1000
ORDER BY 1;

You would get the following results:

supplier_id supplier_name
3000 Apple
3000 Apple
4000 Samsung
7000 Sony
8000 IBM

First, notice that the record with supplier_id of 3000 appears twice in the result set because the UNION ALL query returns all rows and does not remove duplicates.

Second, notice that the column headings in the result set are called supplier_id and supplier_name. This is because these were the column names used in the first SELECT statement in the UNION ALL.

If you had wanted to, you could have aliased the columns as follows:

SELECT supplier_id AS ID_Value, supplier_name AS Name_Value
FROM suppliers
WHERE supplier_id > 2000
UNION ALL
SELECT company_id AS ID_Value, company_name AS Name_Value
FROM companies
WHERE company_id > 1000
ORDER BY 1;

Now the column headings in the result will be aliased as ID_Value for the first column and Name_Value for the second column.

ID_Value Name_Value
3000 Apple
3000 Apple
4000 Samsung
7000 Sony
8000 IBM

UNION vs. UNION ALL Examples With Sort on Non-indexed Column

Here is another example doing the same thing, but this time doing a SORT on a
non indexed column. As you can see the execution plans are again identical for these
two queries, but this time instead of using a MERGE JOIN, a CONCATENATION and SORT
operations are used.

Next Steps
  • Take a look at these other tips that may be useful for using the union operators
    • Comparing Multiple Datasets with the INTERSECT
      and EXCEPT operators
    • SQL Server Four-part naming
    • Compare SQL Server Results of Two Queries using UNION

About the author

Greg Robidoux is the President of Edgewood Solutions and a co-founder of MSSQLTips.com.
View all my tips

Related Resources

  • SQL Server Join Example…
  • Join SQL Server tables where columns include NULL …
  • UNION vs. UNION ALL in SQL Server…
  • Compare SQL Server Datasets with INTERSECT and EXC…
  • SQL Server CROSS APPLY and OUTER APPLY…
  • More Database Developer Tips…

Become a paid author

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

DB2

Платформа DB2 поддерживает ключевые слова UNION и UNION ALL стандарта ANSI плюс предложение VALUES.

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

Хотя предложение UNION DISTINCT не поддерживается, функциональным эквивалентом является предложение UNION. Предложение CORRESPONDING не поддерживается.

С ключевым словом UNION нельзя использовать такие типы данных, как VARCHAR, LONG VARGRAPHIC, BLOB, CLOB, DBCLOB, DATALINK, и структурные типы (но их можно использовать с предложением UNION ALL).

Если во всех таблицах используется одно имя столбца, в результирующем наборе используется это имя. Если же имена столбцов различаются, то DB2 генерирует новое имя столбца. После этого этот столбец нельзя использовать в предложении ORDER BY или предложении FOR UPDATE.

Если в одном запросе используется несколько операторов для наборов данных, то первыми выполняются те, которые заключены в скобки. После этого операторы выполняются в порядке слева направо. Однако все операции INTERSECT выполняются до операций UNION или ЕХСЕРТ. Например:

SELECT empno
FROM employee
WHERE workdept LIKE «E%»
UNION
SELECT empno FROM emp_act
WHERE projno IN («IF1000», «IF2000», «AD3110»)
UNION
VALUES («AA0001), (AB0002»), («AC0003»)

В этом примере мы получаем все ID сотрудников из таблицы employee, которые состоят в любом департаменте, с названием, начинающимся с «Е», а также ID всех сотрудников из бухгалтерской таблицы emp_act, которые работают в проектах IF1000″, «IF2000», and «AD3110». Кроме того, сюда всегда включаются ID сотрудников «AA000T, «АВ0002», and «АС00031.

Пример — использование условия IN с символьными значениями

Условие IN может использоваться с любым типом данных в SQL. Давайте посмотрим, как использовать условие IN с символьными (строковыми) значениями. В этом примере у нас есть таблица suppliers со следующими данными:

supplier_id supplier_name city state
100 Yandex Moscow Russian
200 Lansing Michigan
300 Oracle Redwood City California
400 Bing Redmond Washington
500 Yahoo Sunnyvale Washington
600 DuckDuckGo Paoli Pennsylvania
700 Qwant Paris France
800 Menlo Park California
900 Electronic Arts San Francisco California

Введите следующий SQL оператор:

PgSQL

SELECT *
FROM suppliers
WHERE supplier_name IN (‘Yandex’, ‘Oracle’, ‘Facebook’);

1
2
3

SELECT*

FROMsuppliers

WHEREsupplier_nameIN(‘Yandex’,’Oracle’,);

Будет выбрано 3 записи. Вот результаты, которые вы должны получить:

supplier_id supplier_name city state
100 Yandex Moscow Russian
300 Oracle Redwood City California
800 Menlo Park California

В этом примере будут возвращены все строки из таблицы suppliers, где supplier_name — Yandex, Oracle или Facebook. Поскольку в SELECT используется , то все поля из таблицы suppliers будут отображаться в наборе результатов.

Это эквивалентно следующему оператору SQL:

PgSQL

SELECT *
FROM suppliers
WHERE supplier_name = ‘Yandex’
OR supplier_name = ‘Oracle’
OR supplier_name = ‘Facebook’;

1
2
3
4
5

SELECT*

FROMsuppliers

WHEREsupplier_name=’Yandex’

ORsupplier_name=’Oracle’

ORsupplier_name=;

Как вы можете видеть, использование условия IN облегчает чтение оператора и делает его более эффективным, чем использование нескольких условий OR.

Правила использования

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

  • Число и порядок извлекаемых столбцов должны совпадать во всех объединяемых запросах;
  • Типы данных в соответствующих столбцах должны быть совместимы.

Определения столбцов, данные из которых извлекаются в объединяемых запросах, не должны совпадать, однако должны быть совместимыми путём неявного преобразования. Если типы данных различаются, то получившийся тип данных определяется на основе правил очередности типов данных (для конкретной СУБД). Если типы совпадают, но различаются в точности, масштабе или длине, результат определяется на основе правил, используемых для объединения выражений (для конкретной СУБД). Типы не определенные ANSI, такие как DATA и BINARY, обычно должны совпадать с другими столбцами такого же нестандартного типа.

В Microsoft SQL Server столбцы с типом данных XML должны быть эквивалентными. Все столбцы должны либо иметь тип, определенный в XML-схеме, либо быть нетипизированными. Типизированные столбцы должны относиться к одной и той же коллекции XML-схем.

Ещё одно ограничение на совместимость — это запрет пустых значений (NULL) в любом столбце объединения, причем эти значения необходимо запретить и для всех соответствующих столбцов в других запросах объединения, поскольку пустые значения (NULL) запрещены с ограничением NOT NULL. Кроме того, нельзя использовать UNION в подзапросах, а также нельзя использовать агрегатные функции в предложении SELECT запроса в объединении (однако большинство СУБД пренебрегают этими ограничениями).

Frequently Asked Questions

Question: I need to compare two dates and return the count of a field based on the date values. For example, I have a date field in a table called last updated date. I have to check if trunc(last_updated_date >= trunc(sysdate-13).

Answer: Since you are using the COUNT function which is an aggregate function, we’d recommend using the Oracle UNION operator. For example, you could try the following:

SELECT a.code AS Code, a.name AS Name, COUNT(b.Ncode)
FROM cdmaster a, nmmaster b
WHERE a.code = b.code
AND a.status = 1
AND b.status = 1
AND b.Ncode <> 'a10'
AND TRUNC(last_updated_date) <= TRUNC(sysdate-13)
GROUP BY a.code, a.name
UNION
SELECT a.code AS Code, a.name AS Name, COUNT(b.Ncode)
FROM cdmaster a, nmmaster b
WHERE a.code = b.code
AND a.status = 1
AND b.status = 1
AND b.Ncode <> 'a10'
AND TRUNC(last_updated_date) > TRUNC(sysdate-13)
GROUP BY a.code, a.name;

The Oracle UNION allows you to perform a count based on one set of criteria.

TRUNC(last_updated_date) <= TRUNC(sysdate-13)

As well as perform a count based on another set of criteria.

TRUNC(last_updated_date) > TRUNC(sysdate-13)

Функция SQL Replace

Синтаксис:

SELECT `name` , REPLACE(`name` , «а», «аа»)
FROM `teachers`

Я уже писал о . И там вывод одной таблицы зависил от содержимого другой. Но бывает нужно, когда требуется полная независимость вывода одной таблицы от другой. Всё, что хочется — это просто в одном запросе вытащить записи сразу из нескольких таблиц
, не более того. И вот для этого используется в SQL ключевое слово UNION
.

Давайте с Вами разберём SQL-запрос с использованием UNION
:

SELECT `login`, `amount` FROM `employers` UNION SELECT `login`, `amount` FROM `staff`;

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

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

Ещё одной хорошей особенностью UNION
является отсутствие повторений. Например, если один и тот же человек находится и среди сотрудников, и среди работодателей, разумеется, с той же самой суммой на счету, то в выборке он будет не 2 раза, а только 1
, что, как правило, и требуется. А если всё-таки нужны повторения, то тогда есть UNION ALL
:

SELECT `login`, `amount` FROM `employers` UNION ALL SELECT `login`, `amount` FROM `staff`;

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

Примеры

Использование UNION при выборке из двух таблиц

Даны две таблицы:

sales2005
person amount
Иван 1000
Алексей 2000
Сергей 5000
sales2006
person amount
Иван 2000
Алексей 2000
Петр 35000

При выполнении следующего запроса:

(SELECT * FROM sales2005)
UNION
(SELECT * FROM sales2006);

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

person amount
Иван 1000
Алексей 2000
Иван 2000
Сергей 5000
Петр 35000

В результате отобразятся две строки с Иваном, так как эти строки различаются значениями в столбцах. Но при этом в результате присутствует лишь одна строка с Алексеем, поскольку значения в столбцах полностью совпадают.

Использование UNION ALL при выборке из двух таблиц

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

(SELECT * FROM sales2005)
UNION ALL
(SELECT * FROM sales2006);

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

person amount
Иван 1000
Иван 2000
Алексей 2000
Алексей 2000
Сергей 5000
Петр 35000

Использование UNION при выборке из одной таблицы

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

(SELECT person, amount FROM sales2005 WHERE amount=1000)
UNION
(SELECT person, amount FROM sales2005 WHERE person like 'Сергей');

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

person amount
Иван 1000
Сергей 5000

Использование UNION как внешнее объединение

При помощи можно создавать также (иногда используется в случае отсутствия встроенной прямой поддержки внешних объединений):

(SELECT *
FROM   employee 
       LEFT JOIN department 
          ON employee.DepartmentID = department.DepartmentID)
UNION
(SELECT *
FROM   employee
       RIGHT JOIN department
          ON employee.DepartmentID = department.DepartmentID);

Но при этом необходимо помнить, что это все же не одно и то же, что и оператор .

Синтаксис

Синтаксис SQL оператора INSERT при вставке одной записи в таблицу:

INSERT INTO table (column1, column2, … ) VALUES (expression1, expression2, … );

Или синтаксис SQL оператора INSERT при вставке нескольких записей в таблицу:

INSERT INTO table (column1, column2, … ) SELECT expression1, expression2, … FROM source_tables ;

Параметры или аргументы

table
Таблица, в которую нужно вставить записи.
column1, column2
Это столбцы в table для вставки значений.
expression1, expression2
Эти значения присваиваются столбцам в таблице. Поэтому column1 будет присвоено значение expression1, column2 будет присвоено значение expression2 и т.д. ,
source_tables
Используется при вставке записей из другой таблицы. Это исходная таблица при выполнении вставки.
WHERE conditions
Необязательный. Используется при вставке записей из другой таблицы. Это те условия, которые должны быть соблюдены для вставки записей.
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *