КампутарыТыпы файлаў

SQL distinct: апісанне, прыклады, ўласцівасці

Часцяком пры выкарыстанні SQL для выбаркі інфармацыі з табліц, карыстальнік атрымлівае залішнія дадзеныя, якія складаюцца ў наяўнасці абсалютна ідэнтычных паўтаральных радкоў. Для выключэння гэтай сітуацыі выкарыстоўваецца аргумент SQL distinct у сказе Select. У дадзеным артыкуле будуць разгледжаны прыклады выкарыстання дадзенага аргументу, а таксама сітуацыі, у якіх ад прымянення аргументу лепш адмовіцца.

Перш чым мы прыступім да разгляду канкрэтных прыкладаў, створым у базе дадзеных пару неабходных табліц.

падрыхтоўка табліц

Уявім, што ў нас у базе дадзеных захоўваецца інфармацыя аб шпалерах, прадстаўленая ў двух табліцах. Гэта табліца Oboi (шпалеры) з палямі id (унікальны ідэнтыфікатар), type (тып шпалер - папяровыя, вінілавыя і інш.), Color (колер), struct (структура) і price (кошт). І табліца Ostatki (рэшткі) з палямі id_oboi (спасылка на унікальны ідэнтыфікатар ў табліцы Oboi) і count (колькасць рулонаў на складзе).

Запоўнім табліцы дадзенымі. У табліцу са шпалерамі дадамо 9 запісаў:

Oboi

id

type

color

struct

price

1

папяровыя

Мультиколор

цісненне

56,9

2

папяровыя двухслаёвыя

бэж

гладкая

114,8

3

вінілавыя

оранж

цісненне

504

4

Флизелиновые

бэж

цісненне

1020,9

5

папяровыя двухслаёвыя

бэж

гладкая

150,6

6

папяровыя

Мультиколор

гладкая

95,4

7

вінілавыя

карычневыя

гладкая

372

8

Флизелиновые

белыя

цісненне

980,1

9

тканкавыя

ружовыя

гладкая

1166,5

У табліцу з рэшткамі - таксама дзевяць запісаў:

Ostatki

id_oboi

count

1

8

2

12

3

24

4

9

5

16

6

7

7

24

8

32

9

11

Прыступім да апісання парадку выкарыстання distinct ў SQL.

Месца distinct у сказе Select

Аргумент distinct варта змяшчаць адразу пасля ключавога слова Select у запытах. Ён ужываецца адразу да ўсіх слупках, названым у сказе Select, таму што будзе выключаць з выніковага выніку запыту абсалютна ідэнтычныя радка. Такім чынам, дастаткова адзін раз пазначыць пры напісанні запыту SQL «select distinct». Выключэнне складае выкарыстанне distinct ўнутры агрэгатных функцый, што разгледзім крыху пазней.

Варта памятаць, што большасць СКБД і ня распазнае ваш запыт кшталту:

SELECT distinct Ostatki.Count, distinct Oboi. *

FROM Oboi

INNER JOIN Ostatki ON Oboi.id = Ostatki.id_oboi

Тут некалькі разоў паказаны разгляданы аргумент альбо пазначаны адзін раз, але перад другім, трэцім ці іншым выбіраеш слупком. Вы атрымаеце памылку са спасылкай на недакладнасці ў сінтаксісе.

Прымяненне distinct ў стандартных запытах

Відавочна, што пры правільным пабудове структуры табліц і іх запаўненні, унутры адной табліцы выключаныя сітуацыі, калі сустракаюцца абсалютна ідэнтычныя радка. Таму выкананне запыту «Select distinct *» з выбаркай з адной табліцы практычна немэтазгодна.

Уявім сітуацыю, калі нам неабходна даведацца, якога тыпу ёсць у нас шпалеры, адразу для зручнасці выканаем сартаванне па тыпу:

SELECT Oboi.type

FROM Oboi order by type

І атрымаем вынік:

type

папяровыя

папяровыя

папяровыя двухслаёвыя

папяровыя двухслаёвыя

вінілавыя

вінілавыя

тканкавыя

Флизелиновые

Флизелиновые

Як бачым, у табліцы прысутнічаюць дубляваныя радка. Калі ж мы дадамо ў прапанова Select distinct:

SELECT distinct Oboi.type

FROM Oboi order by type

то атрымаем вынік без паўтораў:

type

папяровыя

папяровыя двухслаёвыя

вінілавыя

тканкавыя

Флизелиновые

Такім чынам, калі пісьменна ўносіліся дадзеныя ў табліцы, то адразу па званку або запыце пакупнікоў мы зможам адказаць, што вадкіх шпалер, стеклообоев і акрылавых шпалер ў наяўнасці ў краме няма. Улічваючы, што асартымент у крамах звычайна не абмяжоўваецца адной сотняй шпалер, праглядзець пералік з неуникальных тыпаў было б даволі працаёмкая.

Прымяненне distinct ўнутры агрэгатных функцый

Аргумент SQL distinct можна выкарыстоўваць з любой агрэгатнай функцыяй. Але для Min і Max яго ўжыванне не дасць ніякага эфекту, а пры вылічэнні сумы або сярэдняга значэння рэдка можна ўявіць сітуацыю, калі не трэба было б улічваць паўторы.

Дапусцім, мы хочам даведацца, наколькі запоўнены наш склад, і для гэтага адпраўляем запыт, вылічаць агульная колькасць рулонаў на складзе:

SELECT sum (Ostatki.count)

FROM Ostatki

Запыт выдасць адказ 143. Калі ж мы зменім на:

SELECT sum (distinct Ostatki.count)

FROM Ostatki

то атрымаем за ўсё 119, бо шпалеры пад артыкуламі 3 і 7 знаходзяцца на складзе ў аднолькавай колькасці. Аднак відавочна, што гэты адказ з'яўляецца памылковым.

Часцей за ўсё ў SQL distinct прымяняецца з функцыяй Count. Так, без працы мы можам даведацца, колькі унікальных відаў шпалер у нас увогуле ёсць:

SELECT count (distinct Oboi.type)

FROM Oboi

І атрымаць вынік 5 - папяровыя звычайныя і двухслаёвыя, вінілавыя, тканкавыя і флизелиновые. Напэўна ўсё бачылі рэкламу накшталт: «Толькі ў нас больш за 20 відаў розных шпалер!», Пад якой маецца на ўвазе, што ў дадзеным краме не пара дзясяткаў рулонаў за ўсё, а шпалеры самых разнастайных сучасных тыпаў.

Цікава, што ў адным запыце можна паказваць некалькі функцый Count як з атрыбутам distinct, так і без яго. То бок, гэта адзіная сітуацыя, калі distinct ў Select'е можа прысутнічаць некалькі разоў.

Калі варта адмовіцца ад прымянення аргументу

Ад прымянення аргументу SQL distinct варта адмовіцца ў адным з двух выпадкаў:

  1. Вы выконваеце выбарку з табліц і ўпэўненыя ў сваім адзіным значэнняў у кожнай. У такім выпадку прымяненне аргументу немэтазгодна, бо гэта дадатковая нагрузка на сервер або кліента (у залежнасці ад выгляду СКБД).
  2. Вы баіцеся страціць патрэбныя дадзеныя. Растлумачым.

Дапусцім, начальнік просіць вас вывесці спіс шпалер, якія ў вас ёсць, з указаннем усяго двух слупкоў - тып і колер. Па звычцы вы паказваеце аргумент distinct:

SELECT distinct Oboi.type, Oboi.color

FROM Oboi

ORDER BY Oboi.type

І - губляеце частка дадзеных:

type

color

папяровыя

Мультиколор

папяровыя двухслаёвыя

бэж

вінілавыя

карычневыя

вінілавыя

оранж

тканкавыя

ружовыя

Флизелиновые

бэж

Флизелиновые

белыя

Можа стварыцца ўражанне, што папяровых шпалер (звычайных і двухслойнае) у нас усяго па адным выглядзе, хоць на самай справе нават у нашай маленькай табліцы іх па два артыкула (вынік без distinct):

type

color

папяровыя

Мультиколор

папяровыя

Мультиколор

папяровыя двухслаёвыя

бэж

папяровыя двухслаёвыя

бэж

вінілавыя

карычневыя

вінілавыя

оранж

тканкавыя

ружовыя

Флизелиновые

белыя

Флизелиновые

бэж

Таму, як і пры напісанні любога запыту, з аргументам distinct трэба быць акуратным і пісьменна вырашаць пытанне з яе прымяненнем у залежнасці ад пастаўленай задачы.

альтэрнатыва distinct

Супрацьлегласць аргументу distinct - аргумент All. Пры яго ўжыванні радкі, якія паўтараюцца захоўваюцца. Але паколькі па змаўчанні СКБД так і лічыць, што трэба выводзіць усе значэння, то аргумент All - гэта хутчэй уточнитель, чым рэальны функцыянальны аргумент. Спадзяемся, што вам зараз зразумела, калі ўжываецца distinct (SQL). Апісанне дало вам поўную інфармацыю аб мэтазгоднасці прымянення гэтага аргументу пры вырашэнні розных задач. Бо, як аказалася, нават такі просты аргумент у сваім ужыванні хавае цалкам адчувальную верагоднасць страціць некаторыя дадзеныя і вывесці недакладную інфармацыю.

Similar articles

 

 

 

 

Trending Now

 

 

 

 

Newest

Copyright © 2018 be.birmiss.com. Theme powered by WordPress.