V tomto videu vás provedeme i když, jak používat SQL MEZI provozovatelem; ukážeme vám, proč byste chtěli použít MEZI provozovatelem a jak se vyhnout nástrahám při použití s typ DATETIME.
MEZI operátor je ekvivalentní použití A kombinace >= a <= relační operátory, ale je více kompaktní rozsah srovnání. Jakmile projdete tímto článkem, doporučil bych sledovat naši další základní minutu SQL a pokračovat další informace o serveru SQL!
jakmile jste sledovali video, podívejte se na ukázkový kód níže. Také jsem zahrnul přepis, který můžete použít.
Toto je SQL minuta na mezi operátorem!
Vítejte v další základní minutě SQL. V této epizodě se naučíme, jak používat operátor mezi k porovnání rozsahu hodnot v dotazech serveru SQL.
operátor mezi se používá k porovnání rozsahu hodnot. Zde je příklad, kde to používám k porovnání rozsahu hodnot, které jsou větší nebo rovny 12 a menší nebo rovny 28. Když používám mezi operátory, je to včetně.
bude obsahovat čísla, která porovnáváme mezi nimi. Společný formulář pro použití mezi v klauzuli WHERE je zadat pole, takže v tomto případě je to „IsoNumericCode“, to je pole. Pak mezi operátory; říkáme, že chceme, aby „IsoNumericCode“ byl mezi a pak rozsahem. Takže chceme, aby to bylo mezi 12 a 28.
možná se divíte, co to bude vypadat jako staromódní způsob použití větší než a rovno a menší než a rovný. Takhle by to vypadalo. Pokud bychom měli udělat to samé pomocí větší než a rovno a menší než a rovný, budeme mít kde IsoNumericCode >=12 A IsoNumericCode <= 28.
v pořádku, takže pojďme se podívat, jak to vypadá v SQL serveru. Mám náš dotaz načten v SQL serveru. Zde můžete vidět, že budeme hledat IsoNumericCode MEZI 12 a 28, to je na stejném řádku, to je obvykle, jak to bude napsané.
SELECT CountryID ,CountryName ,IsoAlpha3Code FROM Application.Countries WHERE IsoNumericCode BETWEEN 12 and 28
dovolte mi to spustit a trochu to zde. Můžete vidět, že rozsah hodnot, které se vracejí, je od 12 do 28. Kdybych to měl zvýšit řekněme na 100, očekával bych, že se vrátí další řádky. Můžete vidět, že jdou celou cestu až do 100.
nyní vás chci upozornit, že na objednávce záleží. Pokud jsem udělal mezi 100 a 12, nebudu mít žádné výsledky.
protože když se nad tím zamyslíte, chci, aby číselné kódy byly mezi … chci, aby byly větší nebo rovny 100 a menší nebo rovny 12. Nic mezi tím není. Takže je chyba, že se nic nevrátí. Takže na objednávce záleží, a je důležité, abyste ji měli tak, že pomocí mezi operátorem, nejnižší číslo je první. Dobře, vraťme se k 12 a 28.
Další věc, kterou mohu udělat, je použít ne operátor s mezi. Takže když řeknu „ne mezi 12 a 28“, co opravdu říkám, je vrátit každý řádek v tabulce zemí, který nemá číselný kód, který je větší nebo roven 12 a menší nebo roven 28.
SELECT CountryID ,CountryName ,IsoAlpha3Code FROM Application.Countries WHERE IsoNumericCode NOT BETWEEN 12 and 28
takže v podstatě by tyto čtyři řádky byly vyřezány z tohoto výsledku. Projdeme to. Teď vidíte, že mám 186 řádků.
Pokud jsem právě udělal dotaz přímo bez jakýchkoli omezení, uvidíte, že dostanu 190 řádků zpět. To vám ukazuje, že tyto čtyři řady byly skutečně vyřezány. Ve skutečnosti, pokud chcete udělat další test, mohl bych jen říct nebo IsoNumericCode mezi 12 a 28 a to by přineslo všechno.
SELECT CountryID ,CountryName ,IsoAlpha3Code FROM Application.Countries WHERE IsoNumericCode NOT BETWEEN 12 and 28 OR IsoNumericCode BETWEEN 12 and 28
takže to přináší zpět 190 řádků. Opravdu, to je trochu nesmyslné v tom smyslu, že to přináší zpět všechny řádky.
všechny naše příklady zatím pracují s celým číslem. Ale mezi prací s mnoha dalšími datovými typy. Mohli bychom jej také použít pro datové typy znaků (VARCHAR) a fungovalo by to stejným způsobem, pokud máme nastavené pořadí řazení, vše funguje dobře.
jeden datový typ, i když si myslím, že musíte být opatrní, je datový typ“ DateTime“.
Protože v DateTime typ dat, uvidíte, že tam je časová složka v termínu, a pokud jsme jen MEZI použitím pouze den a čas, datum a čas, bude výchozí půlnoci. Opravdu to nedosahuje všech výsledků, o kterých si myslíte, že by to bylo. Myslím, že nejlepší způsob, jak to udělat, je ukázat vám, co tím myslím.
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');
vezmu v příklad, kde budeme deklarovat tabulky a v této tabulce budeme táhnout v termínech od února 1. až 3. Když to spustím, uvidíte, že dostanu pět řádků zpět.
Všimněte si, jak tam jsou časy, že? Pokud neurčím čas na rande, vrátí se s datem začínajícím o půlnoci. Zatím je to dobré.
velká otázka by byla tak, co se stane, pak na další dotaz zde, pokud přivedu zpět „ModifyDate“ mezi 1. a 3.?
pokud to řeknu anglicky, očekával bych, že se všech pět z nich vrátí. Ale teď řeknu, že ne všech pět se vrátí, protože tenhle tady, který má 3. na něm, když se převede na DateTime, bude mít ve skutečnosti čas půlnoci. Takže to bude klesat, že 5. řádek. Ukážu vám, co tím myslím.
SELECT Name, ModifyDateFROM @myTableWHERE ModifyDate BETWEEN '2017-02-01' AND '2017-02-03'ORDER BY ModifyDate
Jak můžete vidět, teď je to v podstatě přináší zpět pouze čtyři řádky, protože hledáme v podstatě data a časy, které jsou mezi půlnocí 1. a zhruba o půlnoci z 3.
Jeden způsob, jak můžete tento problém vyřešit, je dát na čas těsně před půlnocí. Takže jen … půjdu do sekund. Takže teď, když to spustím, uvidíte, že dostanu pět řádků, protože to bude „11: 59: 59“ sekund.
SELECT Name, ModifyDateFROM @myTableWHERE ModifyDate BETWEEN '2017-02-01' AND '2017-02-03 23:59:59'ORDER BY ModifyDate
nepočítám stovky sekund a tak dále. Abych byl upřímný, mám pocit, že je to trochu chaotické. Mám pocit, že v tomto případě opravdu chcete použít mezi daty, a chtěli jste získat každé možné datum s časem od 3., nejlepší způsob, jak toho dosáhnout, je pouze Použít 4.
VYBERTE Jméno, ModifyDate
Z @mojetabulka
KDE ModifyDate MEZI 2017-02-01 “ A „2017-02-04′
ORDER BY ModifyDate
V tomto případě, MEZI s DateTime není nutně pomocí stejné chování jako bychom, že by se celá čísla, protože i když to je včetně, to je jít do půlnoci, což je právě to nanosekund minulosti 3. Jen to vypadá legračně. Když to spustím, uvidíte, že to vytáhne toto datum z druhé části 3.
takže to je gotcha s mezi a DateTime. Takže vím, že mnoho lidí se mezi daty a časem vyhýbá, a prostě použijí větší než a méně než.
tak to vyvolává otázku; proč byste použít mezi?
myslím, že existují dva důvody, proč byste chtěli použít mezi. První je čitelnost. Druhým je udržovatelnost.
Pro čitelnost, co chci říct je, že pokud bych měl říct, že jsme „ModifyDate“ je větší než a rovno 1, a „ModifyDate“ je menší než rovná 4, ve velmi dlouhou dotazu tohle může být těžké číst, protože je to hodně výrazů začít analyzovat prostřednictvím, a Boolean logika může dostat v cestě. V tomto smyslu, mezi by se mohlo zdát trochu přirozenější číst. S rizikem nedorozumění, co to vlastně dělá, jak jsme vysvětlili s DateTime.
také z hlediska udržovatelnosti, pokud chci jít dovnitř a potřebuji se změnit jako „ModifyDate“, vím, že sem mohu přijít a musím to změnit na dvou místech. Musel bych změnit první část termínu a druhou část, hypoteticky. Kde, když používám jen mezi, potřebuji to změnit pouze na jednom místě.
Pokud byste chtěli znát můj názor na to, zda byste použili mezi nebo větší nebo menší než, osobně používám větší nebo menší než, protože pak vím, jaké kroky jsou skutečně podniknuty. Mám pocit, že mám trochu jasnější slovo v tom, co se děje, a to mi dělá lépe. Nemusím si dělat starosti, “ opravdu to funguje?“? Trvá to datum před půlnocí?“Všechny ty domněnky jdou z okna. Rád pracuji tam, kde nejsou předpoklady v počítačích, jen se cítím šťastnější. Já osobně nepoužívám mezi. Ale pokud se vám to líbí, myslím, že je skvělé použít. Je podporován v mnoha různých dialektech SQL a já říkám, jděte na to. Ještě jednou díky, hezký den.