Często podczas pobierania SQLinformacje z tabel, użytkownik otrzymuje zbędne dane polegające na obecności absolutnie identycznych powtarzających się wierszy. Aby wyeliminować tę sytuację, użyj odrębnego argumentu SQL w klauzuli Select. W tym artykule omówiono przykłady użycia tego argumentu, a także sytuacje, w których lepiej odmówić użycia argumentu.
Zanim przejdziemy do konkretnych przykładów, utwórzmy kilka wymaganych tabel w bazie danych.
Wyobraźmy sobie, że nasza baza danych przechowujeinformacje o tapecie przedstawione w dwóch tabelach. Jest to tabela Oboi (tapeta) z polami id (unikalny identyfikator), typ (rodzaj tapety - papier, winyl itp.), Kolor (kolor), struktura (struktura) i cena (cena). Oraz tabelę Ostatki (resztki) z polami id_oboi (link do unikalnego identyfikatora w tabeli Oboi) i count (ilość rolek w magazynie).
Wypełnijmy tabele danymi. Dodaj 9 rekordów do tabeli tapet:
Oboi | ||||
ID | rodzaj | kolor | struct | Cena £ |
1 | Papier | Wielobarwność | Wytłaczane | 56,9 |
2 | Papier dwuwarstwowy | Beżowy | Gładka | 114,8 |
3 | Płyta winylowa | Pomarańczowy | Wytłaczane | 504 |
4 | Włóknina | Beżowy | Wytłaczane | 1020,9 |
5 | Papier dwuwarstwowy | Beżowy | Gładka | 150,6 |
6 | Papier | Wielobarwność | Gładka | 95,4 |
7 | Płyta winylowa | brązowy | Gładka | 372 |
8 | Włóknina | Biali | Wytłaczane | 980,1 |
9 | Tkanka | Różowy | Gładka | 1166,5 |
W tabeli znajduje się również dziewięć wpisów z resztami:
Ostatki | |
id_oboi | liczyć |
1 | 8 |
2 | 12 |
3 | 24 |
4 | 9 |
5 | 16 |
6 | 7 |
7 | 24 |
8 | 32 |
9 | 11 |
Zacznijmy od opisywania, jak odrębne jest używane w SQL.
Distinct należy umieścić zaraz poWybierz słowo kluczowe w zapytaniach. Jest stosowany natychmiast do wszystkich kolumn określonych w klauzuli Select, ponieważ wyklucza absolutnie identyczne wiersze z końcowego wyniku zapytania. W związku z tym podczas pisania zapytania SQL wystarczy raz określić „wybierz odrębne”. Wyjątkiem jest użycie odrębnych wewnętrznych funkcji agregujących, które rozważymy nieco później.
Należy pamiętać, że większość DBMS nie rozpoznaje zapytania w postaci:
WYBIERZ odrębne Ostatki.Count, różne Oboi. * OD Oboi INNER JOIN Ostatki ON Oboi.id = Ostatki.id_oboi |
Argument, o którym mowa, został tutaj określony kilka razy lub został określony raz, ale przed drugą, trzecią lub inną wybieralną kolumną. Pojawi się błąd z podaniem niedokładności w składni.
Oczywiste jest, że przy kompetentnej konstrukcji konstrukcjitabele i ich wypełnianie wewnątrz jednej tabeli wyklucza się sytuacje, gdy napotykane są absolutnie identyczne wiersze. Dlatego wykonanie zapytania „Wybierz inny *” z wyborem z jednej tabeli jest praktycznie niepraktyczne.
Wyobraź sobie sytuację, w której musimy dowiedzieć się, jaki rodzaj tapety posiadamy, dla wygody od razu posortujemy według rodzaju:
SELECT Oboi.type Z kolejności Oboi według typu |
I otrzymujemy wynik:
rodzaj |
Papier |
Papier |
Papier dwuwarstwowy |
Papier dwuwarstwowy |
Płyta winylowa |
Płyta winylowa |
Tkanka |
Włóknina |
Włóknina |
Jak widać, w tabeli są zduplikowane wiersze. Jeśli dodamy do klauzuli Wybierz wyraźną:
WYBIERZ odrębny typ Oboi Z kolejności Oboi według typu |
wynik otrzymujemy bez powtórzeń:
rodzaj |
Papier |
Papier dwuwarstwowy |
Płyta winylowa |
Tkanka |
Włóknina |
Tak więc, jeśli dane zostały poprawnie wprowadzonestolikach, to od razu na telefon lub prośbę klientów będziemy mogli odpowiedzieć, że w sklepie nie ma tapety w płynie, tapety szklanej i tapety akrylowej. Biorąc pod uwagę, że asortyment w sklepach zwykle nie ogranicza się do stu tapet, przejrzenie listy nietypowych typów byłoby dość pracochłonne.
Argument odrębny SQL może być używany z dowolnymfunkcja agregująca. Ale dla Min i Max nie przyniesie to żadnego efektu, a przy obliczaniu sumy lub średniej rzadko można sobie wyobrazić sytuację, w której nie byłoby konieczne uwzględnienie powtórzeń.
Powiedzmy, że chcemy wiedzieć, jak zapełniony jest nasz magazyn i w tym celu wysyłamy zapytanie, które wylicza całkowitą liczbę rolek w magazynie:
WYBIERZ sumę (Ostatki.count) Z Ostatki |
Żądanie zwróci odpowiedź 143. Jeśli zmienimy na:
WYBIERZ sumę (odrębna Ostatki.count) Z Ostatki |
otrzymujemy tylko 119, ponieważ tapety z art. 3 i 7 są w magazynie w tej samej ilości. Jednak ta odpowiedź jest ewidentnie nieprawidłowa.
Najczęściej używane w SQL w odróżnieniu od funkcji Count. Możemy więc bez trudu dowiedzieć się, ile unikalnych rodzajów tapet mamy na ogół:
SELECT count (odrębny Oboi.type) OD Oboi |
I uzyskaj wynik 5 - papier zwykły idwuwarstwowe, winylowe, tekstylne i nietkane. Z pewnością każdy widział reklamę typu: „Tylko u nas jest ponad 20 rodzajów różnych tapet!”, Co oznacza, że w tym sklepie nie ma kilkudziesięciu rolek wszystkiego, ale tapety w najróżniejszych współczesnych typach.
Ciekawe, że w jednym zapytaniu możesz określićwiele funkcji Count z i bez odrębnych. Oznacza to, że jest to jedyna sytuacja, w której wyraz odrębny w Wybierz może pojawić się wiele razy.
Odrębny argument SQL należy odrzucić w jednym z dwóch przypadków:
Załóżmy, że szef prosi Cię o wyświetlenie posiadanej tapety za pomocą zaledwie dwóch kolumn - rodzaju i koloru. Z przyzwyczajenia używasz odrębnego argumentu:
WYBIERZ odrębny Oboi.type, Oboi.color OD Oboi ZAMÓWIENIE WEDŁUG Oboi.type |
I - tracisz część danych:
rodzaj | kolor |
Papier | Wielobarwność |
Papier dwuwarstwowy | Beżowy |
Płyta winylowa | brązowy |
Płyta winylowa | Pomarańczowy |
Tkanka | Różowy |
Włóknina | Beżowy |
Włóknina | Biali |
Może się wydawać, że mamy tylko jeden rodzaj tapet papierowych (zwykły i dwuwarstwowy), chociaż tak naprawdę nawet w naszym małym stoliku każdy z nich zawiera dwa artykuły (wynik jest bez wyrazu):
rodzaj | kolor |
Papier | Wielobarwność |
Papier | Wielobarwność |
Papier dwuwarstwowy | Beżowy |
Papier dwuwarstwowy | Beżowy |
Płyta winylowa | brązowy |
Płyta winylowa | Pomarańczowy |
Tkanka | Różowy |
Włóknina | Biali |
Włóknina | Beżowy |
Dlatego tak jak w przypadku pisania każdego zapytania, z wyraźnym argumentem, należy uważnie i kompetentnie rozwiązać problem z jego zastosowaniem, w zależności od wykonywanego zadania.
Przeciwieństwem odrębności jest argumentWszystko. Powielone linie są zachowywane po zastosowaniu. Ale ponieważ domyślnie DBMS uważa, że powinny być wyświetlane wszystkie wartości, argument All jest bardziej kwalifikatorem niż prawdziwym argumentem funkcjonalnym.