SQL отделни: описание, примери, свойства
Често при използване на SQL за вземане на пробиинформацията от таблиците, потребителят получава излишни данни, състоящи се от наличието на абсолютно еднакви дублиращи се линии. За да изключите тази ситуация, използвайте отделния аргумент на SQL в клаузата Избор. В тази статия ще разгледаме примери за използването на този аргумент, както и ситуации, при които е по-добре да се изостави аргументът.
Преди да започнем да разглеждаме конкретни примери, ще създадем няколко необходими таблици в базата данни.
Подготовка на маси
Представете си, че сме съхранили в нашата база данниинформация за тапета, представена в две таблици. Тази таблица Oboi (тапети) на полетата за идентификационен (уникален идентификатор), от типа (вида на тапети. - хартия, винил и т.н.), цвят (цвят), а структура (структура) и цена (цена). И маса Ostatki (остатъци) с id_oboi полета (препратка към уникалния идентификатор в таблицата Oboi) и броят (броят на ролките на склад).
Попълнете таблиците с данни. В таблицата с тапет добавете 9 записа:
Oboi | ||||
идентификатор | тип | цвят | структура | цена |
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 | броене |
1 | 8 |
2 | 12 |
3 | 24 |
4 | 9 |
5 | 16 |
6 | 7 |
7 | 24 |
8 | 32 |
9 | 11 |
Нека да започнем, като опишем как да използваме разликата в SQL.
Поставете различно в клаузата Избор
Различният аргумент трябва да бъде поставен непосредствено след товаизбраната ключова дума в заявките. Той се прилага незабавно към всички колони, посочени в клаузата за избиране, тъй като ще изключи абсолютно еднакви редове от резултата от заявката. Поради това е достатъчно да се уточни "изберете отделно", когато пишете SQL заявката. Единственото изключение е използването на отделни вътрешни функции, които ще разгледаме малко по-късно.
Трябва да се помни, че повечето СУБД не разпознават заявката ви по следния начин:
ИЗБЕРЕТЕ отличителните Другики, отделни Oboi. * От Обой ВЪТРЕШНО ПРЕКЪСВАНЕ Другите в Oboi.id = Ostatki.id_oboi |
Тук аргументът се посочва няколко пъти или се указва веднъж, но преди втората, третата или друга избираема колона. Ще получите грешка с препратка към неточности в синтаксиса.
Използване на отделни в стандартните заявки
Очевидно, с добре структурирана структуратаблици и попълването им в една таблица, се изключват ситуации, когато се срещат абсолютно еднакви струни. Следователно, изпълнението на заявката "Select distinct *" с избор от една таблица е практически непрактично.
Представете си ситуация, в която трябва да разберете какъв тип тапет имаме, само за удобство, сортиране по тип:
SELECT Oboi.type ОТ Oboi ред по тип |
И получаваме резултата:
тип |
хартия |
хартия |
Двуслойна хартия |
Двуслойна хартия |
винил |
винил |
кърпа |
Нетъкани румени ръкавици |
Нетъкани румени ръкавици |
Както можете да видите, в таблицата има дублирани редове. Ако добавим към отделната клауза за избор:
ИЗБЕРЕТЕ отделен тип Oboi ОТ Oboi ред по тип |
тогава получаваме резултата, без да повтаряме:
тип |
хартия |
Двуслойна хартия |
винил |
кърпа |
Нетъкани румени ръкавици |
По този начин, ако данните са въведени правилнослед това веднага след обаждането или искането на купувачите, ще можем да отговорим, че течните тапети, тапетите и акрил тапетите не са налични в магазина. Като се има предвид, че асортиментът в магазините обикновено не се ограничава до сто тапети, би било доста трудоемко да се сканира списъкът на не-уникални видове.
Използване на отделни в съвкупните функции
Различният аргумент на SQL може да се използва с всичкиагрегатна функция. Но за Мин и Макс неговото използване няма да има никакво въздействие и при изчисляването на сумата или средната стойност рядко е възможно да си представим ситуация, при която няма да е необходимо да се вземат под внимание повторенията.
Да приемем, че искаме да знаем колко нашият склад е пълен и затова изпращаме заявка, която изчислява общия брой ролки в склада:
SELECT сума (Ostatki.count) От Други |
Заявката ще върне отговор 143. Ако променим:
SELECT сума (отделен бройкит) От Други |
тогава получаваме само 119, защото тапетите по членове 3 и 7 са на склад в същото количество. Очевидно обаче е, че този отговор е неправилен.
Най-често SQL се използва с функцията Count. Така че, без затруднения, можем да разберем колко уникални вида тапети обикновено имаме:
SELECT брой (отделен тип Oboi.type) От Обой |
И да получите резултат 5 - хартия обикновени идвуслойни, винилови, платнени и нетъкани. Разбира се, всеки видя реклама като: "Само че имаме повече от 20 вида различни тапети!", Което означава, че в този магазин няма няколко десетки рула от всичко, но тапети от най-различни модерни типове.
Интересното е, че в една заявка можете да посочитемногобройни функции за отчитане с или без отделен атрибут. Тоест, това е единствената ситуация, в която отделни в Select не могат да присъстват повече от веднъж.
Кога трябва да отхвърля използването на аргумент
Използването на отделен аргумент на SQL трябва да бъде отхвърлено по един от двата начина:
- Избирате от масите и сте сигурниуникалността на ценностите във всяка от тях. В този случай използването на аргумента е нецелесъобразно, защото това е допълнително натоварване на сървъра или клиента (в зависимост от вида СУБД).
- Страхувате се от загуба на необходимите данни. Ще обясним.
Да предположим, че шефът ви помоли да покажете списък с тапети, които имате, като посочите само две колони - тип и цвят. По навик, вие посочвате разликата в аргумента:
ИЗБЕРЕТЕ отличителните типове Oboi.type, Oboi.color От Обой ПОРЪЧАЙ ОТ Oboi.type |
И - изгубете някои от данните:
тип | цвят |
хартия | многоцветен |
Двуслойна хартия | бежов |
винил | кафяв |
винил | оранжев |
кърпа | розов |
Нетъкани румени ръкавици | бежов |
Нетъкани румени ръкавици | бял |
Може да се окаже, че имаме само един тип тапети от хартия (конвенционални и двупластови), въпреки че всъщност дори в нашата малка маса те имат две статии (резултатът не е различен):
тип | цвят |
хартия | многоцветен |
хартия | многоцветен |
Двуслойна хартия | бежов |
Двуслойна хартия | бежов |
винил | кафяв |
винил | оранжев |
кърпа | розов |
Нетъкани румени ръкавици | бял |
Нетъкани румени ръкавици | бежов |
Следователно, както при писането на всяка заявка, с отделен аргумент, човек трябва да внимава и правилно да реши проблема с приложението си в зависимост от задачата.
Алтернативно различно
Обратното на аргумента е различноAll. Когато го използвате, дублираните линии се запазват. Но тъй като по подразбиране DBMS смята, че е необходимо да отпечатате всички стойности, All аргументът е по-скоро спецификатор, отколкото истински функционален аргумент.