Grejen med SQL

Det finns alltid en rätt tid för en fräsig SQL och en fel tid och fel tid är oftast när klockan är efter 21. Idag är det 23:25 men ändå en bra SQL-tid i saltgruvan.

För den (stackare) som ännu inte är invigd i SQL-träsket kan jag berätta att att SQL är ett språk (Structured Query Language) alltså ett strukturerat fråge-språk och det är precis vad det låter som: ett språk med vilket man hämtar data genom att ställa frågor!

För den oinvigde är ”data” helt enkelt information, ex: personinformation över alla personer som finns i Sverige, information om alla bilarna du äger, din porrfilmssamling eller innehållet i ditt kylskåp. Data är typ information i någon from av struktur.

En dator är alltså en pryl som behandlar data och du kan inte kalla din dator för ”data” med hedern i behåll. Det är liksom som att blanda ihop ord och bokstäver (typ) men det gör man ju inte. G är en bokstav GET är ett ord bestående av bokstäver, ja ni fattar. När det kommer till tal och siffror är det precis samma sak fast här verkar totalt kaos råda. DAGLIGEN läser man om dödssiffror som stiger och annat felaktigt. Det är ju faktiskt dödstalet som stiger. Tal består ju av siffror… Om man som jag gillar att reta upp sig på saker är detta närmast en outtömbar källa för irritation och bultande ådror i pannan  – DAGLIGEN. Se detta inlägg för mer information.

Hur som, i all denna är information är SQL din vän att hålla i handen när du behöver leta i detta träsk av information och jag har inte alls tänkt att närmare förklara vad och hur man pratar SQL men det är lite av ett vägskäl inom programmering, många ger upp när de kommer till SQL. En dålig SQL-fråga kan sega ner ett system enormt samtidigt som en bra kan öka prestandan som satan. Bäst är när man på en kvart optimerar en fråga och går från flera sekunder till några millisekunder. Många är de stollar som försökt ersätta SQL med något annat ”enklare” – nästan alltid mycket sämre.

I alla fall, en grej som ofta är lite knölig i SQL är att bygga en snabb sökmotor och om du står inför detta så fortsätt läsa…. (konstpaus).

Anta att du har ett antal produkter i ditt system och dessa produkter har ett eller flera sökord kopplade till sig och du vill alltså söka fram den produkt som matchar bäst, dvs där flest sökord matchar din sökfras.

Programmering handlar mycket om att kunna uttrycka saker på så få ord som möjligt och så exakt som möjligt med de ord som finns i ett språk och egentligen är det samma sak att uttrycka på ett vanligt språk som att ”programmera” det man vill säga. Enda kruxet är att programmeringsspråk har ofta väldigt begränsat med ord man kan använda sig av.

På svenska skulle jag säga:
Jag vill ha en lista på alla produkter vars sökord innehåller sökfrasen och listan ska sorteras så att den produkt som har flest träffar bland sökorden på sökfrasen ska vara överst och resten i fallande ordning.

Men det kommer man inte långt på, det är alldeles för luddigt och svaret skulle bara bli error stupid! SQL har inte dessa ord så då får man uttrycka sig med andra ord. SQL har däremot orden ”längd” och ”ersätt” som man kan använda för att få reda på längden (antal bokstäver) på ett ord eller mening och ersätt för att ersätta ett ord med ett annat.

Så på svenska skulle jag då säga:
Jag vill ha en lista på alla produkter vars sökord innehåller sökfrasen och listan ska sorteras fallande utifrån kvoten av differensen av antalet bokstäver i produktens sökord och antalet bokstäver i produktens sökord efter att alla förekomster av sökfrasen tagits bort, och längden på sökfrasen.

Visst fuktar det? VISST FUKTAR DET?

Differens och kvot kommer du ihåg från matten i åk6 va? Det är alltså ”delat med” och ”minus” vi pratar om.

På SQL skulle det skrivas såhär:
select Product.*, (length(Product_keywords) – length(replace(Product_keywords, ‘SÖKFRAS’,”))) / length(‘SÖKFRAS’) as score from Product where Product_keywords like ‘%SÖKFRAS%’ order by score desc

BOOM! Sen tar man liksom bara en kaffe och sträcker ut sig.

Ska inte hävda att jag själv klurade ut  detta utan jag snubblade sannolikt över det på nätet när jag googlade efter en bra lösning på nämnda problem för länge sen men det är en härlig SQL jag med stor iver med jämna mellanrum skriver.

Frågor (höhö) på det?

3 thoughts on “Grejen med SQL

  1. Topp! Det jag tar med mig från detta inlägg är din eminenta förklaring om dödssiffra eller dödstal (där jag förövrigt håller med dig på alla punkter). När jag behöver hjälp med SQL-frågor kan du räkna med att jag frågar dig :)

  2. Härligt med lite SQL logik, här kommer lite logik från stormen Gorm.
    34m/s = -2 takpannor fattigare. Men egentligen när man mäter upp 34m/s i vindbyarna så borde benämningen på blåsten i natt vara ”Orkanen Gorm”.

  3. Håller med dig till nästan 100 % där. -2 takpannor fattigare borde alltså bli 2 takpannor rikare (100-(-2)=100+2=102)… Men jag förstår vad du menar ;) Fast jag kanske inte hänger med när det gäller SQL-logik?

Kommentera

E-postadressen publiceras inte. Obligatoriska fält är märkta *

Följande HTML-taggar och attribut är tillåtna: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>