Tag Archive for select

GROUP BY og WITH ROLLUP function

GROUP BY er en funktion som bruges til at gruper en række rows som det formenligt også ligger i navnet GROUP BY, men man kan også lave nogle trisk som spare SQL serveren og dig selv for tid, det kan være hvis du eks. Har en række tal du gerne vil ha lagt sammen i en indkøbs kurve så kan GROUP BY benyttes på denne måde.

SELECT sum( shopAntal ) AS TotalAntal, sum( shopPris * shopAntal ) AS TotalPris FROM shop_barsket WHERE userId = ‘brugerid’ GROUP BY userId;

denne SQL ligge alle vare antal og alle priseren sammen til et enklet row udtræk så du ikke skal til at køre en while løkke for at tælle det hele sammen endnu en gang og der efter beregne din data.

Når man kommer til at tælle tal sammen og faktisk ikke gider at lave 2 SQL udtræk kan man gøre det hele meget simplet, for at slippe for 2 SQL udtræk kan man lave et WITH ROLLUP satament som tæller alle ens int værdier sammen og til sidst laver et ekster row udtræk hvor den har indeholder NULL i de steder som ikke er INT værdier eller er regnet sammen.

SELECT SUM( shopAntal ) AS TotalAntal, sum( shopPris * shopAntal ) AS TotalPris FROM shop_barsket WHERE userId = ‘brugerid’ GROUP BY produktId, userId WITH ROLLUP;

HAVING function

Når der skal trækkes en bestemt mængte data ud efter eget valg i dette tilfælde alle felter der er under en vis værdi kan man benytte HAVING efter WHERE statement eks.

SELECT * FROM test_felt WHERE bindKatId = 2 HAVING underKat < 5;

Du vil her få listet alle rows ud fra test_felt som har bindKatId = 2 hvorefter der er under 5 underkategoriere, HAVING bruges isted for at man skriver

SELECT * FROM test_felt WHERE bindkatId = 2 AND underKat < 5;

COUNT() Function

COUNT() bruges til at tælle et X antal rækker sammen som er tilgænlige at liste ud eks.

SELECT COUNT(*) FROM t;
return:  COUNT(*) = 7

Her retuerer den talet 7 fordi der er fundet 7 rækker som er klar til at blive listet ud, man kan også benytte COUNT() på en bestemt felt navn eks.

SELECT COUNT( i ), COUNT( j ) FROM t;
return: COUNT( i ) = 5, COUNT( j ) = 4

Her vil den retuere 5 og 4 fordi den kun tæller de ting sammen hvor der ikke findes et NULL også kaldt for ( non-null value ), hvis man ønsker kun at få talt de ting sammen som er 100% unik i en række kan man her bruge DISTINCT functionen eks.

SELECT COUNT( DISTINCT i ), COUNT( DISTINCT j ) FROM t;
return:  COUNT( DISTINCT i )  =  1, COUNT( DISTINCT j ) = 3

Det er også muligt at kombinere felter med DISTINCT inde i en COUNT() så leds at man får et mere spefikt udtrækt eks.

SELECT COUNT( DISTINCT i, j ) FROM t;
return: COUNT( DISTINCT i, j ) = 2

Den trækker alle felter ud som ikke er ens og ikke indeholder NULL værdien.

SUM() og AVG() Function

SUM() og AVG() bruges til at regne en total antal sammen og finde gennemsnittet af en række tal, man kan renge alle landens indbygger sammen og derefter finde et gennemsnit på hvormange der er i hvert land eks.

SELECT SUM( Population ), AVG ( Population ) FROM Country;
return:  SUM( Population ) = 6078749450, AVG( Population ) = 25434098.1172

Hvis SUM() og AVG() bliver brut på andre felter end et tal vil den automatisk forsøge at lave dit felt om til talværdi, den hopper over alle NULL vædir i databasen.

MIN() og MAX() Function

Brugen af MIN() og MAX() funktionen i MySQL bruges til at trække det laves og største værdi ud af databasen med, som hvis man skal hente ud hvad land der har mindts og flest indbygger eks.

SELECT MIN( Population ), MAX( Population ) FROM Country;
return:  MIN( Population ) = 0, MAX( Population ) = 1277558000

SELECT MIN ( Name ), MAX( Name ) FROM Country;
return: MIN( Name ) = Afghanistan, MAX( Name ) = Zimbabwe

Grunden til at der er skrevet en normal string hvor der bliver benyttet MIN() og MAX() er for at vise dig hvordan man enligt kan benytte det hvis feltet er en CHAR, grunden til at Afghanistan kommer føst ved brugen af MIN() er at A er det første bukstav i alfebetet, MAX() funger på samme måde bare omvendt altså den tager fra det sidste bukstav og så ned til den finder et korrekt match.

Brugen af DISTINCT til at fjerne doblet row

For at fjerne en række der gentager sig når du nu trækker et udtræk ud så alle dine udtræk er unikke kan du gøre det ved at bruge DISTINCT efter SELECT og før du printer outputtet til browseren.

SELECT DISTINCT last_name FROM t;

Der er forskel på hvordan den fjerne disse gentaglser alt efter om du bruger binær eller ikke binær felter, hvis du bruger binær er ”ABC, Abc og abc” forskellige til hvis du bruger ikke binær felter.

Ved brugen af DISTINCT kan du benytte multi select til at ude lukke en støre sansynlighed for en dublikering.

SELECT DISTINCT last_name, first_name FROM t;

DISTINCT er god til små mængte data men skal man op og benytte nogle forskellige ting som at udelukke 2 e-mail adresser men stadig have brugers navn og adresse med ud kan DSTINCT ikke benyttes, til dette formål ville det være en bædre løsning hvis der bliver benyttet GROUP BY statment.

SELECT navn, adresse, email FROM table GROUP BY email;

På denne måde samler man alle emails samme i en gruppe hvor efter man kan trække adresse og navn med ud som en multi select.

Den største forskel mellem DISTINCT og GROUP BY er at DISTINCT ikke kan sorters men det kan GROUP BY godt, der i mod kan DISTINCT tælle sammen hvor mange lighedere der er mellem sin egen række som eks. Sådan her.

SELECT COUNT( DISTINCT j ) FROM t;

Limit af en select

MySQL understøtter LIMIT inde i en SELECT, det  gør at du kan fortælle MySQL hvor meget der må kommer med ud af et row.

LIMIT kan inde holde 1 eller 2 værdier.

LIMIT row_count
LIMIT skip_count, row_count

Hver værdig skal være en int ( heltal ) og ikke en variable ( string ) værdi.

Når du indtastter et tal tager den row nummer 1 fra din table og retuerene så X antal rækker som du har bedt om

SELECT * FROM Country LIMIT 10;

Hvis du gerne vil have vil have fra nummer 20 og de nsæste 10 udtrukket vil det se sådan her ud.

SELECT * FROM Country LIMTI 20, 10;

Det er tit en fordel at benytte ORDRE BY funktionen til at udskefeisere dine udvalg nået mere så de også bliver mere presise.

SELECT * FROM Country ORDER BY Id DESC LIMIT 1;

Eks. Når der skal laves et søge felt med flere sider på kan og vil en SQL tit se ud i stil med denne

SELECT * FROM t ORDER BY Id DESC LIMTI 0, 20;
SELECT * FROM t ORDER BY Id DESC LIMTI 20, 20;
SELECT * FROM t ORDER BY Id DESC LIMTI 40, 20;
SELECT * FROM t ORDER BY Id DESC LIMTI 60, 20;
…..

Du skal huske selv om du bruger LIMIT og har 1.000.000 rækker i MySQL og vil have fat i de 10 sidste skal den løbe hele databasen igennem for at få de sidste 10, derfor er det en god ide at benytte WHERE statement for at reducere databasens udtræk.

Spekfikser et row select

Hvis man vil spefiksere nået data fra databasen når man har meget data man ikke behøves at liste ud altid men kun nået af dataen skal listes ud så kan man benytte en WHERE statement til at fortælle MySQL hvad for nået data der skal trækkes ud til brugeren, eks. hvis man har en land database hvor man updater hvornår man sidst har fået infomartion fra landet og det skal så kun være de lande som man har fået data fra efter 2006.

SELECT * FROM Country WHERE UpdateYear > 2006;

En mere complex WHERE udtræk kan hvor vi kun vil have de udtræk hvor der er flere indbygger end 1 mil. og mindre end 5 mil. vil en normal SQL se såda ud.

SELECT * FROM Country WHERE Indbygger >= 1000000 AND Indbygger <= 5000000;

Isted for at benytte så lang en SQL kan du bruge BETWEEN i MySQL til at udtrække 2 værdiere mellem hianden den ser sådan ud.

SELECT * FROM Country WHERE Indbygger BETWEEN 1000000 AND 5000000;

Det er nogle værdier i en SELECT statement der er stræker end andre eks. AND er stærker end OR i en SELECT.

WHERE GNP < 1000 AND Continent = ‘Africa’ OR Continent = ‘Asia’;

Denne SQL vil udtrække alle Continent fra Africa hvor GNP er mindre end 1000 og alle fra Continent fra Asia, for at få det mere udspefikerst og lave syntaxen rigtig vil din kode komme til at se sådan ud.

WHERE ( GNP < 1000 AND Continent = ‘Africa’ ) OR Continent = ‘Asia’;

Hvis du nu sider og tænker på du gerne vil have alle hvor GNP er mindre end 1000 og Continent er enten Africa eller Asia på samme tid, så skal du blodt andre lidt i din SQL så den kommer til at se sådan her ud.

WHERE GNP < 1000 AND ( Continent = ‘Africa’ OR Continent = ‘Asia’ );

Navngive colum i en select

Som standart er en colum ( række ) det samme navn som der står i database men dette kan ændres ved at benytte AS statement.

SELECT felt AS feltnavn FROM t;

du kan bruge det nye navn til at referer i GROUP BY, HAVING eller ORDER BY statement.