Adatbáziskezelésnél, SQL-ben count függvény használatakor mikor kell * és mikor egy konkrét érték a zárójelen belül?
Olyasmit hallottam, hogy a count(*) "mindent" számol a megadott feltételeknek megfelelőn, de honnan tudom eldönteni, hogy mikor kell egy konkrét értéket pl. count(valami) beleírni? Mert ilyenkor a "valami"-ket számolja, de sokszor működik akkor is, ha a "valami" helyére *-ot írok, vagy fordítva.
Ha több dolog tartozik hozzá akkor kell a *, vagy hogy van ez pontosan?
Én SQL-ezek már több mint 3 éve, de még 1x se kellet használnom a COUNT(NÉV) alakot. Világéletemben csillagoztam.
A "mindent" számol nem pontos kifejezés. Hanem a táblában lévő sorok db számát adja.
Most csak feltételezem (szóval nem tudom pontosan), hogy a NULL mezőket nem számolja bele, ha annak az oszlop nevével hívod meg. Persze ehhez szükséges, hogy a tábla definícióban a "NOT NULL" ne szerepeljen.
Jól látod, pontosan ez a különbség! Például az egyik érettségi megoldókulcsban egyszer egy ilyen count(*)-os megoldást adtak, ahol a következő lépés a nem null értékekre való szűrés volt abban a mezőben külön pontért, holott ha azt a mezőt számolják össze a counttal, akkor egy lépésben kijön az eredmény.
Emellett sebességbeli különbségek is lehetnek, de az egyik SQL-nél ebbe az irányba, a másiknál pont fordítva, erre a konkrét nyelvjárás alapján lehet guglizni.
+ még egy szolgáltatása a konkrét mező megnevezésének: lehetőséget ad COUNT(DISTINCT mezőnév) használatára: szűrés a csak egymástól különböző előfordulásokra (ismétlődésektől való eltekintés kérése).
Szóval éppen tegnap egy feladat során azt tapasztaltam, hogy ha mezőnevet adok meg, akkor még arra is van lehetőségem ezáltal, hogy arra a mezőnévre nézve csak a különböző értékeket számolja össze, az ismétlődéseket ne
COUNT(DISTINCT itemtype).
Nagyméretű legacy kódot örököltünk, és időnk is kevés volt, ezért egy feltehetőleg csúnya megoldást kellett alkalmaznunk. Kétféle szempont szerint joinoltunk árucikkekhez hozzátartozó szempontokat:
- vásárlókat,
- illetve díjcsomagokat,
és mind a kettőről kellett kimutatás is:
- vásárlók vonatkozásában pedig az adott árucikkhez tartozó vásárlószám, hogyúgymondjam ,,népszerűség'', ,,kelendőség'').
- a díjcsomagok esetében pedig a cikkhez tartozó minimáldíjcsomag ára,
Csúnyán csináltuk meg a dolgot, egyszerűen mind a két szempontot külön-külön hozzájoinoltuk a főtáblához. Ilyenkor ,,összeszorzódnak'' a két-két join által adott lehetőségek, az összes lehetséges variáció szerint. COUNT(*) vagy COUNT(customer.id) nem az adott cikkhez tartozó vásárlók számát, hanem az adott cikkhez tartozó vásárlók számának és szintén az adott cikkhez tartozó a díjcsomagok számának a **szorzatát** adja (ez természetes, hiszen két független egy-sok asszociációt húz be a két join). A COUNT(DISTINCT customer.id) viszont még ilyen kifogásolható megoldás esetén is a vásárók adott árucikkre vonatkozó valódi számát adja, ez figyel arra, hogy az ismétlődő mezőelőfordulásokat figyelmen kívül hagyja.
Ez persze valószínűleg visszaélésszerű használata volt a COUNT(DISTINCT mezőnév)-nek, a problémát alapos újratervezéssel kellett volna megoldanunk, de ezt csak példaként írtam, lehet a COUNT(DISTINCT mezőnév)-nek olyan használata is, ahol tényleg az a tömör és szép megoldás.
Ennek továbbgondolása az,hogy akár származtatott értékeket is be lehet írni, ez főleg akkor hasznos, ha feltételes összeszámlálást akar az ember:
"lehet a COUNT(DISTINCT mezőnév)-nek olyan használata is, ahol tényleg az a tömör és szép megoldás"
Elég sokszor használtam már alkalmi interaktív lekérdezésekben, egyszerűen ez volt kézenfekvő.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!