i den här videon går vi dig om hur man använder SQL mellan operatör; vi visar dig varför du vill använda mellan operatör och hur man undviker fallgropar när man använder den med DATETIME-typen.
mellan operatör motsvarar användning och kombination av >= och <= jämförelse operatörer, men gör för en mer kompakt intervall jämförelse. När du har gått igenom den här artikeln rekommenderar jag att du tittar på vår nästa väsentliga SQL-minut för att fortsätta lära dig mer om SQL Server!
När du har tittat på videon kolla in exempelkoden nedan. Jag har också inkluderat ett transkript som du kan använda.
detta är en SQL minut på mellan operatör!
Välkommen till en annan viktig SQL-minut. I det här avsnittet kommer vi att lära oss hur man använder operatören mellan för att jämföra ett antal värden i SQL server-frågor.
mellan operatör används för att jämföra ett intervall av värden. Här är ett exempel där jag använder det för att jämföra ett antal värden som är större än eller lika med 12 och mindre än eller lika med 28. När jag använder mellan operatör, det är inkluderande.
det kommer att innehålla de siffror som vi jämför mellan. Den vanliga formen för att använda mellan i WHERE-klausulen är att ange fältet, så i det här fallet är det ”IsoNumericCode”, det är fältet. Sedan mellan operatörerna; vi säger att vi vill att ”IsoNumericCode” ska vara mellan och sedan intervallet. Så vi vill att det ska vara mellan 12 och 28.
Du kanske undrar hur det här skulle se ut på gammaldags sätt med större än och lika med och mindre än och lika med. Så här skulle det se ut. Om vi skulle göra samma sak med större än och lika med och mindre än och lika med, skulle vi ha var IsoNumericCode >=12 och IsoNumericCode < = 28.
Okej, så låt oss gå in för att se hur det här ser ut i SQL server. Jag har vår fråga laddad upp i SQL server. Du kan se här att vi ska leta efter IsoNumericCode mellan 12 och 28, Det är på samma rad, det är vanligtvis hur det skulle skrivas.
SELECT CountryID ,CountryName ,IsoAlpha3Code FROM Application.Countries WHERE IsoNumericCode BETWEEN 12 and 28
Låt mig köra det och ta upp det här lite här. Du kan se att intervallet av värden som kommer tillbaka är från 12 till 28. Om jag skulle öka detta låt oss säga till 100, skulle jag förvänta mig att se fler rader komma tillbaka. Du kan se att de går hela vägen upp till 100.
nu vill jag varna dig att ordning spelar roll. Om jag gjorde mellan 100 och 12 får jag inga resultat.
För om du tänker på det, vad det här säger är att jag vill att de numeriska koderna ska vara mellan … Jag vill att den ska vara större än eller lika med 100 och mindre än eller lika med 12. Det finns inget däremellan. Så det är ett fel ingenting kommer tillbaka. Så beställ frågor, och det är viktigt att du har det så att använda mellan operatör, det lägsta antalet är först. Okej, låt oss gå tillbaka till 12 och 28.
en annan sak jag kan göra är att använda inte operatör med mellan. Så om jag säger ”inte mellan 12 och 28” vad jag verkligen säger är låt oss ta tillbaka varje rad i tabellen länder som inte har en numerisk kod som är större än eller lika med 12, och mindre än eller lika med 28.
SELECT CountryID ,CountryName ,IsoAlpha3Code FROM Application.Countries WHERE IsoNumericCode NOT BETWEEN 12 and 28
så väsentligen skulle dessa fyra rader huggas ut ur det resultatet. Vi kör det här. Du kan se nu jag får 186 rader.
Om jag bara gjorde frågan direkt utan några begränsningar på den ser du att jag får 190 rader tillbaka. Så detta tjänar till att visa dig att de fyra raderna verkligen huggades ut. Faktum är att om du vill göra ett annat test kan jag bara säga eller IsoNumericCode mellan 12 och 28 Och detta skulle få tillbaka allt.
SELECT CountryID ,CountryName ,IsoAlpha3Code FROM Application.Countries WHERE IsoNumericCode NOT BETWEEN 12 and 28 OR IsoNumericCode BETWEEN 12 and 28
så detta ger tillbaka 190 rader. Verkligen, detta är typ av meningslösa i den meningen att det är att föra tillbaka alla rader.
alla våra exempel hittills har arbetat med heltalet. Men mellan fungerar med många andra datatyper. Vi kan också använda den för teckendatatyper (varchar), och det skulle fungera på samma sätt så länge vi har sorteringsorderna inställda, fungerar allt bra.
en datatyp men som jag tror att du måste vara försiktig med är datatypen ”DateTime”.
eftersom du i datatypen DateTime ser att det finns en tidskomponent i datumet, och om vi bara gör en mellan att bara använda dagen och inte tiden, kommer datum och tid som standard till midnatt. Det får verkligen inte alla resultat du tror att det skulle. Jag tror att det bästa sättet att göra detta är att visa dig vad jag menar.
DECLARE @myTable TABLE(Name varchar(40), ModifyDate DateTime)INSERT INTO @myTable (Name, ModifyDate) VALUES ('Tom', '2017-02-01');INSERT INTO @myTable (Name, ModifyDate) VALUES ('Tom', '2017-02-01 08:23:42');INSERT INTO @myTable (Name, ModifyDate) VALUES ('Tom', '2017-02-01 14:04:02');INSERT INTO @myTable (Name, ModifyDate) VALUES ('Tom', '2017-02-03');INSERT INTO @myTable (Name, ModifyDate) VALUES ('Tom', '2017-02-03 22:32:43');
Jag ska ta med ett exempel där vi ska deklarera en tabell, och i den här tabellen kommer vi att dra in datum från 1 februari till 3: e. När jag kör detta, du kommer att se att jag får fem rader tillbaka.
Lägg märke till hur det finns tider på dessa, eller hur? Om jag inte anger en tid på ett datum, det kommer tillbaka med ett datum som börjar vid midnatt. Hittills, så bra.
den stora frågan skulle vara så vad kommer att hända då på en annan fråga här, om jag tar tillbaka ”ModifyDate” mellan 1: A och 3: e?
om jag säger det på engelska, skulle jag förvänta mig att alla fem av dessa kommer tillbaka. Men jag ska säga just nu att inte alla fem kommer att komma tillbaka, för den här här som har den 3: e på den, när den konverteras till DateTime kommer faktiskt att ha en tid på midnatt. Så det kommer att släppa den 5: e raden. Låt mig visa dig vad jag menar här.
SELECT Name, ModifyDateFROM @myTableWHERE ModifyDate BETWEEN '2017-02-01' AND '2017-02-03'ORDER BY ModifyDate
som du kan se, nu är det i princip att föra tillbaka bara fyra rader eftersom vi letar efter i huvudsak datum och tider som är mellan midnatt den 1: A och ungefär midnatt den 3: e.
ett sätt som du kan komma runt detta är att sätta in tiden strax före midnatt. Så bara för att … jag går ut till sekunderna här. Så nu när jag kör detta ser du att jag får fem rader eftersom det kommer att ”11:59:59” sekunder.
SELECT Name, ModifyDateFROM @myTableWHERE ModifyDate BETWEEN '2017-02-01' AND '2017-02-03 23:59:59'ORDER BY ModifyDate
Jag räknar inte hundratals sekunder och så vidare. För att vara ärlig känner jag att det är lite rörigt. Jag känner att om du verkligen vill använda mellan med datum i det här fallet, och du ville få varje datum möjligt med sin tid från den 3: e, det bästa sättet att göra det är bara att använda den 4: e.
Välj namn, ModifyDate
från @myTable
där ModifyDate mellan ’ 2017-02-01 ’och’2017-02-04’
ORDER BY ModifyDate
i det här fallet, mellan med DateTime använder inte nödvändigtvis samma beteende som vi skulle tro att det skulle med heltal, för även om det är inkluderande, kommer detta att gå till midnatt, vilket bara är det nanosekund förbi 3: e. Det ser bara roligt ut. När jag kör det här ser du att det drar in det datumet från den senare delen av 3: e.
så det är en gotcha med mellan och DateTime. Så jag vet att många människor slags undvika mellan med datum och tid, och de kommer bara att använda större än och mindre än.
så det väcker frågan; varför skulle du använda mellan?
Jag tror att det finns två skäl till varför du vill använda mellan. Den första är läsbarhet. Den andra är underhållbarhet.
för läsbarhet, vad jag menar är att om jag var tvungen att säga att vi är ”ModifyDate” är större än och lika med 1: A, och ”ModifyDate” är mindre än lika med den 4: e, i en mycket lång fråga kan det bli svårt att läsa eftersom det är många uttryck att börja analysera igenom, och den booleska logiken kan komma i min väg. I den meningen, mellan kan tyckas lite mer naturligt att läsa. Med risk för missförstånd vad det faktiskt gör, som vi har förklarat med DateTime.
också, från en underhållssynpunkt, om jag vill gå in och jag behöver ändra som ”ModifyDate” till, vet jag att jag kan komma in här och jag måste ändra det på två ställen. Jag skulle behöva ändra den första delen av termen och den andra delen, hypotetiskt. Var om jag bara använder mellan, jag behöver bara ändra det på ett ställe.
Om du vill veta min syn på om du skulle använda mellan eller större än eller mindre än, använder jag personligen större än eller mindre än, för då vet jag vilka åtgärder som faktiskt vidtas. Jag känner att jag har lite mer explicit säga i vad som händer, och det får mig att må bättre. Jag behöver inte oroa mig för, ” fungerar det verkligen? Tar det datumet före midnatt?”All den typen av antagande saker går ut genom fönstret. Jag gillar att arbeta där det inte finns några antaganden i datorer, det får mig bara att känna mig mer lycklig. Jag använder personligen inte mellan. Men om du gillar det tycker jag att det är bra att använda. Det stöds i många olika SQL-dialekter, och jag säger gå för det. Tack igen, ha en bra dag.