V tomto článku se podíváme na T-SQL MEZI logický operátor Dozvíte se, co tento operátor je a jak jej používat. Podíváme se samozřejmě také na příklady SQL dotazů pomocí operátoru BETWEEN.
Operátor BETWEEN v T-SQL
MEZI je logický operátor T-SQL, který určuje rozsah, který má být testován. Jinými slovy, pomocí BETWEEN můžeme zkontrolovat, zda je hodnota v určitém rozsahu.
Syntax
testovací_výraz[NE] MEZI počáteční_výraz A koncový_výraz
Popis argumentů
- test_expression – výraz, který podléhá testování členství v rozsahu od počátečního_výrazu do koncového_výrazu;
- begin_expression – výraz charakterizující začátek rozsahu;
- end_expression – výraz charakterizující konec rozsahu.
Všechny výrazy musí mít stejný datový typ.
Operátor BETWEEN vrací následující hodnoty (Boolean):
- TRUE – pokud je hodnota argumentu test_expression větší nebo rovna hodnotě begin_expression a menší nebo rovna hodnotě end_expression, tzn. testovací_výraz je v rozsahu od počátečního_výrazu do koncového_výrazu;
- FALSE – pokud hodnota argumentu test_expression není v rozsahu od begin_expression do end_expression.
Používáním NE klíčové slovo můžeme invertovat výsledek predikátu, jinými slovy NOT BETWEEN znamená, že chceme zkontrolovat hodnotu, zda není v daném rozsahu.
V tomto případě operátor NOT BETWEEN vrátí TRUE, pokud hodnota argumentu test_expression není v rozsahu od begin_expression do end_expression.
Pokud alespoň jeden z výrazů v BETWEEN obsahuje hodnotu NULL, bude výsledek nedefinovaný.
Poznámka! Připomínám, že si musíte vždy pamatovat, že existují hodnoty jako NULL (toto není prázdné nebo 0, toto je absence hodnoty), které SQL server zpracovává zvláštním způsobem; výsledek SQL dotaz obsahující hodnoty NULL nemusí být zřejmý a nepředvídatelný.
Poznámka! Pokud jste začínající programátor a chcete se naučit jazyk T-SQL od nuly, pak doporučuji přečíst si mou knihu „The T-SQL Programmer's Way“, ve které podrobně hovořím o základech jazyka T-SQL a také věnovat velkou pozornost pokročilým konstrukcím.
Zdrojová data pro příklady
Můj server je Microsoft SQL Server 2016 Express. Představme si například, že máme tabulku TestTable a ta obsahuje následující data ( seznam zboží s uvedením ceny). Řádky do tabulky přidávám pomocí příkazu INSERT INTO.
Vytvoření tabulky CREATE TABLE TestTable( IDENTITY(1,1) NOT NULL, (100) NOT NULL, NULL) GO --Přidání řádků do tabulky INSERT INTO TestTable(ProductName, Price) VALUES ("Systémová jednotka", 300), (" Monitor", 200), ("Klávesnice", 100), ("Myš", 50), ("Tiskárna", 200), ("Skener", 150), ("Telefon", 250), (" Tablet" , 300) GO --Výběr dat SELECT * FROM TestTable
Příklad použití operátoru BETWEEN v klauzuli WHERE
Pojďme napsat SQL dotaz, který nám ukáže všechny produkty, jejichž cena se pohybuje v rozmezí od 100 do 200 rublů včetně.
Podmínka pomocí operátoru BETWEEN SELECT ProductID, ProductName, Price FROM TestTable WHERE Cena BETWEEN 100 A 200
Tento dotaz bychom mohli napsat bez použití operátoru BETWEEN, např. následující SQL dotaz je naprosto ekvivalentní.
Podmínka pomocí operátorů porovnání SELECT ProductID, ProductName, Price FROM TestTable WHERE Price >= 100 AND Price<= 200
Jak vidíte, výsledek je stejný, ale v případě BETWEEN podmínka vypadá vizuálněji a srozumitelněji, navíc výraz pro kontrolu (Cena) jsme napsali pouze jednou, v případě operátorů porovnání dvakrát.
Příklad použití operátoru BETWEEN v podmíněném příkazu IF
Operátor BETWEEN lze použít nejen v klauzuli WHERE, ale i v jiných konstrukcích T-SQL, například v podmíněné konstrukci IF. V následujícím příkladu zkontrolujeme proměnnou @TestVar, zda je hodnota této proměnné v rozsahu od 1 do 10 a pokud ano, provedeme akci, kterou potřebujeme, například jednoduše pošlu dotaz SELECT .
DECLARE @TestVar INT = 5 POKUD @TestVar MEZI 1 A 10 VYBERTE "Proměnná @TestVar je v rozsahu od 1 do 10" AS [Výsledek]
Příklad použití operátoru NOT BETWEEN
Nyní napíšeme dotaz pomocí klíčového slova NOT, například musíme zobrazit všechny produkty, jejichž cena není v rozmezí od 100 do 200 rublů ( Přikládám také ekvivalentní příklad s použitím porovnávacích operátorů).
Podmínka používající operátor NOT BETWEEN SELECT ProductID, ProductName, Price FROM TestTable WHERE Price NOT BETWEEN A 200 --Podmínka pomocí operátorů porovnání SELECT ProductID, ProductName, Price FROM TestTable WHERE Price< 100 OR Price > 200
V tomto případě jsme dostali veškeré zboží, jehož cena je nižší než 100 nebo více než 200 rublů.
V jazyce T-SQL kromě operátoru BETWEEN existují další logické operátory, například operátor EXISTS, který může být v některých případech velmi užitečný, také jsme o něm na tomto webu diskutovali.
To je vše, co zatím mám!
Jakýkoli dotaz vytvořený pro práci v databázi zjednodušuje přístup k potřebným informacím. V předchozím příspěvku jsem mluvil o běžných podmíněných příkazech. Ve stejném příspěvku budu hovořit o operátorech, které vám umožní vytvářet dotazy, které mohou poskytnout podrobnější informace o zájmu, které zároveň není tak snadné najít pomocí dotazů s operátory AND, OR.
Jedním ze speciálních operátorů je V. Tento operátor umožňuje nastavit požadovaný rozsah pro zobrazení požadovaných informací. Vraťme se k údajům o dlužnících
Dlužníci
Num | Měsíc | Rok | Jméno | Město | Adresa | Dluh |
0001 | červenec | 2012 | Ivanov | Stavropol | Stavropolskaja, 1 | 50000 |
0002 | prosinec | 2019 | Kononov | Tatar | Zagorodnaja, 254 | 684068 |
0003 | Smět | 2013 | Yamshin | Michajlovsk | Selskaya, 48 | 165840 |
0004 | srpen | 2012 | Preney | Stavropol | Střed, 16 | 46580 |
... | ... | ... | ... | ... | ... | ... |
9564 | březen | 2015 | Ulieva | Demino | Mezinárodní, 156 | 435089 |
9565 | říjen | 2012 | Pavlova | Stavropol | Vokzalnaja, 37 | 68059 |
9566 | leden | 2012 | Uryupa | Michajlovsk | Fontannaya, 19 | 51238 |
9567 | listopad | 2017 | Valetov | Tatar | Vyezdnaja, 65 | 789654 |
Předpokládejme, že musíte vybrat všechny dlužníky města Stavropol nebo Tatarka. Analogicky k předchozímu záznamu byste museli použít požadavek
VYBRAT *
OD dlužníků
KDE město = "Stavropol"
NEBO Město = "Tatarka";
Za prvé, výsledný kód je těžkopádný. Pomocí speciálních operátorů můžete získat kompaktnější kód.
VYBRAT *
OD dlužníků
WHERE City IN („Stavropol“, „Tatarka“);
Výsledek bude
Řiďme se logikou programu. Pomocí klíčových slov SELECT, FROM a WHERE. Pak se ale objeví operátor IN. Nastavuje programu posloupnost akcí - je nutné zobrazit databázové informace obsažené ve sloupci "Město". A pro zobrazení je třeba vybrat data „Stavropol“ a „Tatarka“.
Dovolte mi zvážit příklad, ve kterém musíte provést výběr na základě určitých částek dluhu.
VYBRAT *
OD dlužníků
KDE Dluh IN (435089, 789654, 684068);
Výsledek bude následující
Tito. operátor IN prohledá celou databázi na přítomnost specifikovaných parametrů výběru informací.
Jiná situace je při použití jiného speciálního operátora MEZI. Pokud operátor V považovány za informace s výhradně specifikovanými parametry, pak provozovatel MEZI- mezi určitými rozsahy. Mezi anglickým překladem tohoto operátoru a jeho skutečným účelem by však neměla existovat analogie. Pokud zadáte BETWEEN 1 AND 5, neznamená to, že budou pravdivá čísla 2, 3 a 4. Tento operátor prostě SQL vnímá jako určitou hodnotu, kterou lze najít mezi ostatními hodnotami. V příkladu to bude vypadat takto.
VYBRAT *
OD dlužníků
KDE Dluhy MEZI 30000 A 100000;
Výsledek bude
To znamená, že SQL přijal operátora MEZI jako libovolnou hodnotu v rozsahu od 30000 do 100000 ve sloupci "Dluhy".
Kromě zadání přibližných rozsahů v číselných vyjádřeních můžete zadat abecední rozsahy, které zobrazují informace obsahující první písmena zadaného rozsahu. Ale je tu jeden zajímavý bod. Vytvořme následující požadavek
VYBRAT *
OD dlužníků
WHERE Sname MEZI „JÁ“ A „P“;
Poté se zobrazí následující údaje
Logická otázka: „Proč dlužníci s příjmením P reni a P Avlová? Koneckonců, první písmena jejich příjmení jsou zahrnuta v uvedeném rozsahu!" Písmena jsou zahrnuta, ale příjmení nikoli. To je způsobeno tím, že jazyk SQL v tomto druhu dotazů akceptuje pouze délku vyhledávání řetězců, které jsou specifikovány. Jinými slovy, délka řetězce je „P“ v dotazu je jeden znak a délka řetězce „Preni“ a „Pavlova“ v databázi je pět a sedm. příjmení" A vanov" spadá do rozsahu, protože rozsah začíná na A, jako začátek, jeden znak dlouhý.
Operátor BETWEEN provede booleovský test hodnoty proti rozsahu hodnot. Operátor vrátí TRUE, pokud je hodnota v rozsahu, a FALSE, pokud hodnota není v rozsahu. Pokud je nějaká hodnota v rozsahu NULL (neznámá), bude výsledek NULL.
Operátor EXISTS je sémanticky ekvivalentní operátoru ANY/SOME.
Syntaxe SQL 2003
SELECT * WHERE výraz BETWEEN dolní_mez A horní_mezKlíčová slova
výraz KDE
Testuje skalární výraz (jako je sloupec) proti rozsahu hodnot, které leží mezi horní a dolní hranicí. MEZI dolní_mezí A horní_mezí
Porovná výraz s dolní hranicí a horní hranicí. Porovnání zahrnuje extrémní hodnoty, to znamená, že je stejné jako „kde výraz [není] větší nebo roven dolní hranici a menší nebo roven horní hranici>.
Hlavní pravidla
Operátor BETWEEN se používá k testování výrazu proti rozsahu hodnot. Operátor BETWEEN lze použít s libovolným datovým typem kromě BLOB, CLOB, NCLOB, REF a ARRAY.
Potřebujeme například vidět počty děl (title_id), u kterých jsou meziroční prodeje (ytd_sales) v rozmezí od 10 000 do 20 000.
SELECT title_id FROM titles WHERE ytcLsales BETWEEN 10000 AND 20000
Operátor BETWEEN zahrnuje hranice rozsahu. V tomto případě bude výsledek obsahovat hodnoty 10000 a 20000. Pokud potřebujete hledat bez zahrnutí hranic rozsahu, musíte použít větší než (>) a menší než (<).
SELECT title_id FROM titles WHERE ytd.sales > 10000 AND ytd_sales< 20000
Operátor NOT umožňuje vyhledávat mimo rozsah určený operátorem BETWEEN. Můžete tedy najít čísla všech prací (title_id), které nebyly publikovány v roce 2003.
Někteří programátoři jsou velmi opatrní v tom, jak se klíčové slovo AND používá v klauzulích WHERE. Aby si někdo neznalý kódu myslel, že operátor AND použitý v příkazu BETWEEN je logický operátor, můžete celou klauzuli BETWEEN uzavřít do závorek.
SELECT title_id FROM titles WHERE (ytd_sales BETWEEN" 10000 AND 20000) AND pubdate >= "1991-06-12 00:00:00.000"
Rozdíly v implementacích na různých platformách
Všechny platformy podporují operátora BETWEEN, jak je popsáno výše.
Při práci s relačními DBMS, ve kterých jsou data uložena v tabulkové formě, se uživatelé často potýkají s úkolem vybrat hodnoty, které jsou zahrnuty (nezahrnuty) v určitém rozsahu. Jazyk SQL umožňuje určit množinu, do které by hodnota měla (neměla) patřit, pomocí různých voleb - operátor In, operátor Like, kombinace podmínek větší než - menší než a také operátor SQL Between. Popis a příklady v tomto článku se zaměří na druhou možnost.
Operátor "Mezi" v SQL: syntaxe, omezení
Operátor SQL mezi se doslovně překládá jako „mezi“. Jeho použití umožňuje nastavit omezení „Od a Do“ na konkrétní pole, a pokud další hodnota spadá do rozsahu, predikát nabude hodnotu „True“ a hodnota bude zahrnuta do konečného výběru.
Syntaxe operátoru je velmi jednoduchá:
Kde t1.n mezi 0 a 7 |
Jak vidíte, za klíčovým slovem mezi musíte zadat hodnotu dolní hranice rozsahu, potom AND a hodnotu horní hranice.
Pojďme si uvést, s jakými datovými typy může operátor SQL pracovat:
- S čísly - celými a zlomkovými.
- S daty.
- S textem.
To mezi operátorem SQL má určité vlastnosti. Pojďme se s nimi seznámit:
- Při práci s čísly a daty jsou do výběru zahrnuty hodnoty omezení Od a Do.
- Hodnota dolní hranice rozsahu musí být menší než hodnota horní hranice, jinak se nic nezobrazí, protože podmínka je logicky neplatná. Musíte být obzvláště opatrní, když jsou v podmínce zahrnuty proměnné namísto konkrétních hodnot.
Při práci s textem nebude do výběru zahrnuta hodnota pro horní hranici rozsahu, pokud nebude velmi přesně specifikována. V následujících částech se budeme touto funkcí zabývat podrobněji.
Výběr čísel a dat v určitém rozsahu
Připravme si tabulku s údaji o manažerech působících v organizaci. Tabulka bude mít následující strukturu:
Název pole | Datový typ | Popis |
Jedinečný identifikátor zaměstnance |
||
Text | Příjmení zaměstnance |
|
Text | Jméno zaměstnance |
|
Příjmení | Text | Druhé jméno zaměstnance |
Text | Pohlaví zaměstnance (M/F) |
|
Datum přijetí | Čas schůzky | Datum přijetí zaměstnance |
Počet dětí | Číselné | Počet dětí, které má zaměstnanec |
Vyplňte tabulku následujícími údaji:
Kód | Příjmení | název | Příjmení | Podlaha | Datum přijetí | Počet dětí |
Alexandrova | Nikolajevna | |||||
Štěpánovič | ||||||
Vinogradov | Pavlovič | |||||
Alexandr | Borisovič | |||||
Višňakov | Aleksandrovič | |||||
Tropnikov | Sergejevič | |||||
Žemčugov | Vasilevič | |||||
Konstantinovna | ||||||
Nikolajevič |
Pojďme vytvořit mezi, což nám pomůže vybrat všechny zaměstnance, kteří mají 2 nebo 3 děti:
Výsledkem budou tři řádky s údaji o zaměstnancích se jmény Shumilin, Tropnikov a Avdeeva.
Nyní budeme vybírat zaměstnance přijaté od 1. ledna 2005 do 31. prosince 2016. Je třeba poznamenat, že různé DBMS umožňují zapisovat data do podmínek odlišně. Ve většině případů je datum jednoduše vynuceno ve tvaru den-měsíc-rok (nebo co je vhodnější) a je zapsáno single nebo V DBMS je datum uzavřeno ve znaku „#“. Uveďme si na něm příklad:
SELECT Managers.*, Managers.Reception_date OD manažerů KDE Manažeři. Datum přijetí mezi #1/1/2005# a #31/12/2016# |
Výsledkem bude pět zaměstnanců přijatých ve stanoveném období včetně.
Práce mezi tím s řetězci
Velmi častým problémem, který musíte při práci s příjmeními zaměstnanců řešit, je nutnost výběru pouze těch, jejichž příjmení začínají na určité písmeno. Pokusme se splnit požadavek a vybrat zaměstnance, jejichž příjmení začíná příjmením od A do B:
Výsledek je následující:
Jak vidíte, dva zaměstnanci s příjmením začínajícím na písmeno B nebyli v seznamu zahrnuti. S čím to souvisí? Jde o to, jak operátor porovnává řetězce nestejné délky. Řádek „B“ je kratší než čára „Vinogradov“ a je vyplněn mezerami. Ale při abecedním řazení budou mezery na začátku a příjmení nebude zahrnuto do výběru. Různé DBMS nabízejí různé způsoby, jak tento problém vyřešit, ale často nejjednodušší způsob, jak být v bezpečí, je zadat následující písmeno abecedy v rozsahu:
Při realizaci tohoto požadavku nás výsledek zcela uspokojí.
Tato nuance existuje pouze při práci se znakovými daty, ale ukazuje, že musíte být opatrní při práci i s tak jednoduchými operátory, jako je mezi.