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

SQL Group By

Object Storage Arubacloud
+1 głos
208 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 (269,770 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 (86,360 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 (86,360 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 (269,770 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 (86,360 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ź 184 wizyt
pytanie zadane 6 grudnia 2018 w SQL, bazy danych przez k222 Nałogowiec (30,150 p.)
0 głosów
1 odpowiedź 509 wizyt
pytanie zadane 2 listopada 2017 w SQL, bazy danych przez Patryk1712 Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 250 wizyt
pytanie zadane 6 kwietnia 2016 w SQL, bazy danych przez Lukasz95 Bywalec (2,160 p.)

92,567 zapytań

141,420 odpowiedzi

319,615 komentarzy

61,952 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...