DISTINCT – отброс строк дубликатов — КиберПедия 

Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...

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

DISTINCT – отброс строк дубликатов

2020-05-08 243
DISTINCT – отброс строк дубликатов 0.00 из 5.00 0 оценок
Заказать работу


Ключевое слово DISTINCT используется для того чтобы отбросить из результата запроса строки дубликаты. Грубо говоря представьте, что сначала выполняется запрос без опции DISTINCT, а затем из результата выбрасываются все дубликаты. Продемонстрируем это для большей наглядности на примере:

-- создадим для демонстрации временную таблицу

CREATE TABLE #Trash(

ID int NOT NULL PRIMARY KEY,

Col1 varchar(10),

Col2 varchar(10),

Col3 varchar(10)

)

 

-- наполним данную таблицу всяким мусором

INSERT #Trash(ID,Col1,Col2,Col3)VALUES

(1,'A','A','A'), (2,'A','B','C'), (3,'C','A','B'), (4,'A','A','B'),

(5,'B','B','B'), (6,'A','A','B'), (7,'A','A','A'), (8,'C','A','B'),

(9,'C','A','B'), (10,'A','A','B'), (11,'A',NULL,'B'), (12,'A',NULL,'B')

 

-- посмотрим что возвращает запрос без опции DISTINCT

SELECT Col1,Col2,Col3

FROM #Trash

 

-- посмотрим что возвращает запрос с опцией DISTINCT

SELECT DISTINCT Col1,Col2,Col3

FROM #Trash

 

-- удалим временную таблицу

DROP TABLE #Trash

 

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

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

SELECT DISTINCT DepartmentID

FROM Employees

 

DepartmentID
1
2
3


Здесь мы получили три строки, т.к. 2 сотрудника у нас числятся в одном отделе (ИТ).

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

SELECT DISTINCT DepartmentID,PositionID

FROM Employees

 

DepartmentID PositionID
1 2
2 1
3 3
3 4


Здесь мы получили 4 строчки, т.к. повторяющихся комбинаций (DepartmentID, PositionID) в нашей таблице нет.

Ненадолго вернемся к DDL


Так как данных для демонстрационных примеров начинает не хватать, а рассказать хочется более обширно и понятно, то давайте чуть расширим нашу таблицу Employess. К тому же немного вспомним DDL, как говорится «повторение – мать учения», и плюс снова немного забежим вперед и применим оператор UPDATE:

-- создаем новые колонки

ALTER TABLE Employees ADD

LastName nvarchar(30), -- фамилия

FirstName nvarchar(30), -- имя

MiddleName nvarchar(30), -- отчество

Salary float, -- и конечно же ЗП в каких-то УЕ

BonusPercent float -- процент для вычисления бонуса от оклада

GO

 

-- наполняем их данными (некоторые данные намерено пропущены)

UPDATE Employees

SET

LastName=N'Иванов',FirstName=N'Иван',MiddleName=N'Иванович',

Salary=5000,BonusPercent= 50

WHERE ID=1000 -- Иванов И.И.

 

UPDATE Employees

SET

LastName=N'Петров',FirstName=N'Петр',MiddleName=N'Петрович',

Salary=1500,BonusPercent= 15

WHERE ID=1001 -- Петров П.П.

 

UPDATE Employees

SET

LastName=N'Сидоров',FirstName=N'Сидор',MiddleName=NULL,

Salary=2500,BonusPercent=NULL

WHERE ID=1002 -- Сидоров С.С.

 

UPDATE Employees

SET

LastName=N'Андреев',FirstName=N'Андрей',MiddleName=NULL,

Salary=2000,BonusPercent= 30

WHERE ID=1003 -- Андреев А.А.

 

Убедимся, что данные обновились успешно:

SELECT *

FROM Employees

 

ID Name LastName FirstName MiddleName Salary BonusPercent
1000 Иванов И.И.   Иванов Иван Иванович 5000 50
1001 Петров П.П.   Петров Петр Петрович 1500 15
1002 Сидоров С.С.   Сидоров Сидор NULL 2500 NULL
1003 Андреев А.А.   Андреев Андрей NULL 2000 30

 

Задание псевдонимов для столбцов запроса


Думаю, здесь будет проще показать, чем написать:

SELECT

-- даем имя вычисляемому столбцу

LastName+' '+FirstName+' '+MiddleName AS ФИО,

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

HireDate AS "Дата приема",

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

Birthday AS [Дата рождения],

-- слово AS не обязательно

Salary ZP

FROM Employees

 

ФИО Дата приема Дата рождения ZP
Иванов Иван Иванович 2015-04-08 1955-02-19 5000
Петров Петр Петрович 2015-04-08 1983-12-03 1500
NULL 2015-04-08 1976-06-07 2500
NULL 2015-04-08 1982-04-17 2000


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

Обратите внимание, т.к. у последних 2-х сотрудников не указано отчество (NULL значение), то результат выражения «LastName+' '+FirstName+' '+MiddleName» так же вернул нам NULL.

Для соединения (сложения, конкатенации) строк в MS SQL используется символ «+».

Запомним, что все выражения в которых участвует NULL (например, деление на NULL, сложение с NULL) будут возвращать NULL.

На заметку.
В случае ORACLE для объединения строк используется оператор «||» и конкатенация будет выглядеть как «LastName||' '||FirstName||' '||MiddleName». Для ORACLE стоит отметить, что у него для строковых типов есть исключение, для них NULL и пустая строка '' это одно и тоже, поэтому в ORACLE такое выражение вернет для последних 2-х сотрудников «Сидоров Сидор» и «Андреев Андрей». На момент версии ORACLE 12c, насколько я знаю, опции которая изменяет такое поведение нет (если не прав, прошу поправить меня). Здесь мне сложно судить хорошо это или плохо, т.к. в одних случаях удобнее поведение NULL-строки как в MS SQL, а в других как в ORACLE.

В ORACLE тоже допустимы все перечисленные выше псевдонимы столбцов, кроме […].


Для того чтобы не городить конструкцию с использованием функции ISNULL, в MS SQL мы можем применить функцию CONCAT. Рассмотрим и сравним 3 варианта:

SELECT

LastName+' '+FirstName+' '+MiddleName FullName1,

-- 2 варианта для замены NULL пустыми строками '' (получаем поведение как и в ORACLE)

ISNULL(LastName,'')+' '+ISNULL(FirstName,'')+' '+ISNULL(MiddleName,'') FullName2,

CONCAT(LastName,' ',FirstName,' ',MiddleName) FullName3

FROM Employees

 

FullName1 FullName2 FullName3
Иванов Иван Иванович Иванов Иван Иванович Иванов Иван Иванович
Петров Петр Петрович Петров Петр Петрович Петров Петр Петрович
NULL Сидоров Сидор Сидоров Сидор
NULL Андреев Андрей Андреев Андрей


В MS SQL псевдонимы еще можно задавать при помощи знака равенства:

SELECT

'Дата приема'=HireDate, -- помимо "…" и […] можно использовать '…'

[Дата рождения]=Birthday,

ZP=Salary

FROM Employees

 

Использовать для задания псевдонима ключевое слово AS или же знак равенства, наверное, больше дело вкуса. Но при разборе чужих запросов, данные знания могут пригодиться.

Напоследок скажу, что для псевдонимов имена лучше задавать, используя только символы латиницы и цифры, избегая применения '…', "…" и […], то есть использовать те же правила, что мы использовали при наименовании таблиц. Дальше, в примерах я буду использовать только такие наименования и никаких '…', "…" и […].


Поделиться с друзьями:

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

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

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

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.02 с.