Tag Archive for MySQL

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;

GROUP_CONCAT() Function

MyQL har en meget smart funktion til de der ønsker at smide et udtræk ud på en linje så de spare selve at skille disse ting op med eks. Komma, vil lave et udtræk som trækker alle de lande der tilhøre Thailand ud og liste dem derefter på 1 linje isted for X antal row.

SELECT GROUP_CONCAT( Language ) AS Language FROM CountryLanguage WHERE CountryCode = ’THA’;
return: Languages = Chinese, Khmer, Kuy, Lao, Malay, Thai

Skulle slutbruger nu ikke være tilfræs med at det kommer med komma skilte ord kan du sel lave det om til at komme med det tegn du har løst til eks.

GROUP_CONCAT( Language SEPARATOR ’ – ’  )

Som så adslikker hvert ord med – isted for , Hvis du er i mod gerne vil sortere den måde dette udtræk bliver listet ud på kan du gøre det inde i din GROUP_CONCAT() funktion så leds.

GROUP_CONCAT( Language ORDER BY Language DESC )

Hvor den efter fulgt lister det ud i den nye række følge, skulle man være uheldig og side med de samme navne i en database hvor man gerne vil have de samme navne sortert fra kan man bruger her DISTINCT inde i GROUP_CONCAT() også .

GROUP_CONCAT( DISTINCT Lnguage )

Så vil den automatisk sortere alle der er 2 af fra så de kun bliver vist en enkle gang, GROUP_CONCAT() hopper automatisk over NULL værdier.

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.

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’ );

Drop indexes

For at slette et index man har lavet i MySQL kan man benytte ALTER TABLE  eller DROP INDEX.

Ved at bruge ALTER TABLE skal der bruges DROP funktionen og det navn på det index der skal slettes, slette en PRIMARY KEY er meget simplet.

ALTER TABLE kontakt_personer DROP PRIMARY KEY;

for at droppe andre index må man spefikere det navn som skal slettes fra indexet, hvis du ikke kender navnet kan du bruge SHOW CREATE TABLE og får en liste over table struktueren og der ved finde alle de index du har til denne table.

Navnet på det valgte index kunne være NameIndex og for at slette dette index kan du udføre føglene.

ALTER TABLE kontakt_personer DROP INDEX NameIndex;

efter du har slettet dette index kan du oprette det igen ved at skrive

ALTER TABLE kontakt_personer ADD INDEX NameIndex( LastName , FirstName );

Når du slettere et index kan du ikke fortryde det så sikkere dig at du har taget en backup af din database inden du bevæger dig ud i at slette disse index.

Hvis du vælger at bruge DROP INDEX kan det gøres på denne måde

DROP INDEX NameIndex ON t;

For at slette en PRIMARY KEY skal du blot skrive

DROP INDEX PRIMARY KEY ON t;