• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

SQL Group By

Cloud VPS
+1 głos
402 wizyt
pytanie zadane 24 marca 2023 w SQL, bazy danych przez Blds Użytkownik (830 p.)

Czy wszystkie selectowane kolumny muszą się znaleźć w Group by?

czy taka wersja kodu będzie poprawna? czy muszę wymienić w gropu by wszystkie kolumny?

SELECT customer_id, nip, city, sum(amount)
from customer
Group by customer_id

 

2 odpowiedzi

0 głosów
odpowiedź 24 marca 2023 przez Wiciorny Ekspert (281,450 p.)
Tzn, zależy od bazy danych z której korzystasz.
Dla większości systemów baz danych, gdy używasz klauzuli GROUP BY, wszystkie kolumny, które nie są częścią funkcji agregującej, muszą zostać wymienione w klauzuli GROUP BY.

Więc w tym wypadku twoje zapytanie nie jest poprawne.

Natomiast np.
klauzula HAVING może odwoływać się tylko do wartości wynikowych funkcji agregujących lub kolumn wymienionych w klauzuli GROUP BY.
0 głosów
odpowiedź 25 marca 2023 przez SzkolnyAdmin Szeryf (90,110 p.)
Wszystkie pola? Nie powiedziałbym. Tylko te, dla których chcesz dokonać podsumowań.

Bez struktury tabeli w przypadku pytającego niewielu można powiedzieć. Na podstawie kodu widać, że chce on znaleźć sumą wartości przypisanych do danego customer_id (plus dodatkowe dane dla tego pola). Jeżeli customer_id to klucz podstawowy tabeli customer, to tabela jest źle skonstruowana (skąd wiele pól amount dla danego identtfikatora?) lub też operacja nie ma sensu. Jeżeli customer_id to klucz obcy, to tabela jest źle skonstruowana (po co nip i city dla każdego wpisu?).
komentarz 25 marca 2023 przez SzkolnyAdmin Szeryf (90,110 p.)

Wiem, wiem, ale przy nieprawidłowo zbudowanej strukturze bazy można .

Przykład. Tabela z polami: ID (klucz), seller, city, country, continent.

Zapytanie liczące sprzedawców z danego miasta (+ dodatkowe informacje o mieście)

SELECT city, country, continent, count(*) FROM tabela GROUP by city

wykona się prawidłowo.

komentarz 25 marca 2023 przez Wiciorny Ekspert (281,450 p.)
I tu wychodzi znajomosc SQL i doświadczenie, które potem powoduje mase blędów.
Napisałem poprawne zapytanie, twoje zapytanie będzie zwracało nie-atomowe wyniki :) dla praktycznie tego samego zestawu danych, w których pewne rekordy bedą miały zmienne dane.

W twoim zapytaniu jeśli w group_by nie wymienisz, pozostałych kolumn, to oznacza, że wartości w kolumnach country i continent mogą być wybrane losowo, a wyniki zwrócone przez to zapytanie nie są dokładne.(i beda nieatomowe...), co już powoduje błąd nie tylko łamania zasady zapytania bazy danych, ale może narazić transakcje, czy całą idempotentność  metody HTTP/zapytania jeśli tam zostało to wykorzystane

Co ważne, jeśli to jest prosty MySQL ... w którym to nie konfigurujesz nic, to domyślnie i tak GROUP_BY , to MYSQL zrobi to za Ciebie...
MySQL używa domyślnych ustawień grupowania dla kolumn, które nie są wymienione w klauzuli GROUP BY,  więc jakbyś przedebugował w systemie bazy danych twoje zapytanie, zobaczysz, że ostatecznie :) zawiera grup_by na wszystkich kolumnach
komentarz 25 marca 2023 przez SzkolnyAdmin Szeryf (90,110 p.)
Przykład nie jest ogólny, lecz szczególny - pomijając np. Stambuł leżący na dwóch kontynentach, każde miasta ma przypisany jeden kraj i jeden kontynent. Rozumiem twój wywód i stosuję go oczywiście w praktyce, ale zawsze zdarzają się przypadki szczególne.

Podobne pytania

0 głosów
1 odpowiedź 264 wizyt
pytanie zadane 6 grudnia 2018 w SQL, bazy danych przez k222 Nałogowiec (30,150 p.)
0 głosów
1 odpowiedź 642 wizyt
pytanie zadane 2 listopada 2017 w SQL, bazy danych przez Patryk1712 Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 413 wizyt
pytanie zadane 6 kwietnia 2016 w SQL, bazy danych przez Lukasz95 Bywalec (2,160 p.)

93,460 zapytań

142,454 odpowiedzi

322,724 komentarzy

62,837 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...