Mezi SQL: příklady, popis. BETWEEN v T-SQL - příklady použití logického operátoru Sql mezi syntaxí

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 červenec2012 IvanovStavropolStavropolskaja, 150000
0002 prosinec2019 KononovTatarZagorodnaja, 254684068
0003 Smět2013 YamshinMichajlovskSelskaya, 48165840
0004 srpen2012 PreneyStavropolStřed, 1646580
... ... ... ... ... ... ...
9564 březen2015 UlievaDeminoMezinárodní, 156435089
9565 říjen2012 PavlovaStavropolVokzalnaja, 3768059
9566 leden2012 UryupaMichajlovskFontannaya, 1951238
9567 listopad2017 ValetovTatarVyezdnaja, 65789654

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í_mez

Klíč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:

  1. S čísly - celými a zlomkovými.
  2. S daty.
  3. S textem.

To mezi operátorem SQL má určité vlastnosti. Pojďme se s nimi seznámit:

  1. Při práci s čísly a daty jsou do výběru zahrnuty hodnoty omezení Od a Do.
  2. 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.