Medzi SQL: príklady, popis. BETWEEN v T-SQL - príklady použitia logického operátora SQL medzi syntaxou

V tomto článku sa pozrieme na T-SQL MEDZI logický operátor Dozviete sa, čo je tento operátor a ako ho používať. Pozrieme sa samozrejme aj na príklady SQL dotazov pomocou operátora BETWEEN.

Operátor BETWEEN v T-SQL

MEDZI je T-SQL booleovský operátor, ktorý špecifikuje rozsah, ktorý sa má testovať. Inými slovami, pomocou BETWEEN môžeme skontrolovať, či je hodnota v určitom rozsahu.

Syntax

testovací_výraz[NIE] MEDZI begin_expression A koncový_výraz

Popis argumentov

  • test_expression – výraz, ktorý je predmetom testovania na príslušnosť v rozsahu od begin_expression po end_expression;
  • begin_expression – výraz charakterizujúci začiatok rozsahu;
  • end_expression – výraz charakterizujúci koniec rozsahu.

Všetky výrazy musia mať rovnaký typ údajov.

Operátor BETWEEN vráti nasledujúce hodnoty (Boolean):

  • TRUE – ak je hodnota argumentu test_expression väčšia alebo rovná hodnote begin_expression a menšia alebo rovná hodnote end_expression, t.j. testovací_výraz je v rozsahu od začiatku_výrazu po koncový_výraz;
  • FALSE – ak hodnota argumentu test_expression nie je v rozsahu od začiatku_výrazu po koncový_výraz.

Používaním NIE kľúčové slovo výsledok predikátu môžeme invertovať, inými slovami NOT BETWEEN znamená, že chceme skontrolovať hodnotu, či nie je v danom rozsahu.

V tomto prípade operátor NOT BETWEEN vráti TRUE, ak hodnota argumentu test_expression nie je v rozsahu od begin_expression do end_expression.

Ak aspoň jeden z výrazov v BETWEEN obsahuje hodnotu NULL, výsledok nebude definovaný.

Poznámka! Pripomínam vám, že si musíte vždy pamätať, že existujú hodnoty ako NULL (toto nie je prázdne alebo 0, toto je absencia hodnoty), ktoré SQL server spracováva špeciálnym spôsobom; výsledok SQL dotaz obsahujúci hodnoty NULL nemusí byť zrejmý a nepredvídateľný.

Poznámka! Ak ste začínajúci programátor a chcete sa naučiť jazyk T-SQL od nuly, potom odporúčam prečítať si moju knihu „T-SQL Programmer's Way“, v ktorej podrobne hovorím o základoch jazyka T-SQL a venujte veľkú pozornosť aj pokročilým konštrukciám.

Zdrojové údaje pre príklady

Môj server je Microsoft SQL Server 2016 Express. Predstavme si napríklad, že máme tabuľku TestTable a tá obsahuje nasledujúce údaje ( zoznam tovaru s uvedením ceny). Riadky do tabuľky pridávam pomocou príkazu INSERT INTO.

Vytvorenie tabuľky CREATE TABLE TestTable( IDENTITY(1,1) NOT NULL, (100) NOT NULL, NULL) GO --Pridanie riadkov do tabuľky INSERT INTO TestTable(ProductName, Price) VALUES ("Systémová jednotka", 300), (" Monitor", 200), ("Klávesnica", 100), ("Myš", 50), ("Tlačiareň", 200), ("Skener", 150), ("Telefón", 250), (" Tablet" , 300) GO --Výber údajov SELECT * FROM TestTable

Príklad použitia operátora BETWEEN v klauzule WHERE

Napíšme SQL dotaz, ktorý nám ukáže všetky produkty, ktorých cena sa pohybuje v rozmedzí od 100 do 200 rubľov vrátane.

Podmienka pomocou operátora BETWEEN SELECT ProductID, ProductName, Price FROM TestTable WHERE Price BETWEEN A 200

Tento dotaz by sme mohli napísať bez použitia operátora BETWEEN, napríklad nasledujúci SQL dotaz je absolútne ekvivalentný.

Podmienka využívajúca porovnávacie operátory SELECT ProductID, ProductName, Price FROM TestTable WHERE Price >= 100 AND Price<= 200

Ako vidíte, výsledok je rovnaký, ale v prípade MEDZI podmienka vyzerá vizuálne a zrozumiteľnejšie, navyše výraz pre kontrolu (Cena) sme napísali iba raz, v prípade porovnávacích operátorov dvakrát.

Príklad použitia operátora BETWEEN v podmienenom príkaze IF

Operátor BETWEEN je možné použiť nielen v klauzule WHERE, ale aj v iných konštruktoch T-SQL, napríklad v podmienenom konštrukte IF. V nasledujúcom príklade skontrolujeme premennú @TestVar, či je hodnota tejto premennej v rozsahu od 1 do 10 a ak áno, vykonáme akciu, ktorú potrebujeme, napríklad jednoducho pošlem požiadavku SELECT .

DECLARE @TestVar INT = 5 AK @TestVar BETWEEN 1 AND 10 SELECT "Premenná @TestVar je v rozsahu od 1 do 10" AS [Výsledok]


Príklad použitia operátora NOT BETWEEN

Teraz napíšme dotaz pomocou kľúčového slova NOT, napríklad musíme zobraziť všetky produkty, ktorých cena nie je v rozmedzí od 100 do 200 rubľov ( Prikladám aj ekvivalentný príklad s použitím porovnávacích operátorov).

Podmienka používajúca operátor NOT BETWEEN SELECT ProductID, ProductName, Price FROM TestTable WHERE Price NOT BETWEEN A 200 --Podmienka používajúca operátory porovnávania SELECT ProductID, ProductName, Price FROM TestTable WHERE Price< 100 OR Price > 200

V tomto prípade sme dostali všetok tovar, ktorého cena je nižšia ako 100 alebo viac ako 200 rubľov.

V jazyku T-SQL okrem operátora BETWEEN existujú aj ďalšie logické operátory, napríklad operátor EXISTS, ktorý môže byť v niektorých prípadoch veľmi užitočný, o čom sme diskutovali aj na tejto stránke.

To je všetko, čo zatiaľ mám!

Akýkoľvek dotaz vytvorený pre prácu v databáze zjednodušuje prístup k potrebným informáciám. V predchádzajúcom príspevku som hovoril o bežných podmienených príkazoch. V tomto istom príspevku budem hovoriť o operátoroch, ktoré vám umožnia vytvárať dopyty, ktoré môžu poskytnúť podrobnejšie informácie o záujme, ktoré zároveň nie je také ľahké nájsť pomocou dopytov s operátormi AND, OR.
Jedným zo špeciálnych operátorov je IN. Tento operátor umožňuje nastaviť požadovaný rozsah pre zobrazenie požadovaných informácií. Vráťme sa k údajom o dlžníkoch

Dlžníci

Num mesiac rok Meno Mesto Adresa Dlh
0001 júla2012 IvanovStavropolStavropolskaja, 150000
0002 December2019 KononovtatárskyZagorodnaja, 254684068
0003 Smieť2013 YamshinMichajlovskSelskaya, 48 rokov165840
0004 augusta2012 PreneyStavropolStred, 1646580
... ... ... ... ... ... ...
9564 marca2015 UlievaDeminoMedzinárodné, 156435089
9565 októbra2012 PavlovaStavropolVokzalnaja, 3768059
9566 januára2012 UryupaMichajlovskFontannaya, 1951238
9567 novembra2017 ValetovtatárskyVyezdnaja, 65789654

Predpokladajme, že musíte vybrať všetkých dlžníkov mesta Stavropol alebo Tatarka. Analogicky s predchádzajúcim záznamom by ste museli použiť požiadavku
VYBRAŤ *
OD dlžníkov
KDE Mesto = "Stavropol"
ALEBO Mesto = "Tatarka";

V prvom rade je výsledný kód ťažkopádny. Použitím špeciálnych operátorov môžete získať kompaktnejší kód.
VYBRAŤ *
OD dlžníkov
WHERE City IN („Stavropol“, „Tatarka“);

Výsledkom bude

Držme sa logiky programu. Pomocou kľúčových slov SELECT, FROM a WHERE. Potom sa však objaví operátor IN. Nastavuje program postupnosť akcií - je potrebné zobraziť informácie z databázy obsiahnuté v stĺpci "Mesto". A na zobrazenie je potrebné vybrať údaje „Stavropol“ a „Tatarka“.
Dovoľte mi zvážiť príklad, v ktorom musíte urobiť výber na základe určitej výšky dlhu.
VYBRAŤ *
OD dlžníkov
KDE dlhy (435089, 789654, 684068);

Výsledok bude nasledovný

Tie. operátor IN skontroluje celú databázu na prítomnosť špecifikovaných parametrov výberu informácií.
Iná situácia je pri použití iného špeciálneho operátora MEDZI. Ak prevádzkovateľ IN informácie s výlučne špecifikovanými parametrami, potom prevádzkovateľ MEDZI- medzi určitými rozsahmi. Netreba však robiť analógiu medzi anglickým prekladom tohto operátora a jeho skutočným účelom. Ak zadáte BETWEEN 1 AND 5, neznamená to, že budú pravdivé čísla 2, 3 a 4. Tento operátor jednoducho SQL vníma ako určitú hodnotu, ktorú možno nájsť medzi ostatnými hodnotami. V príklade to bude vyzerať takto.
VYBRAŤ *
OD dlžníkov
KDE dlhy MEDZI 30000 A 100000;

Výsledkom bude

To znamená, že SQL akceptoval operátora MEDZI ako akúkoľvek hodnotu v rozsahu od 30 000 do 100 000 v stĺpci „Dluhy“.
Okrem zadávania približných rozsahov v číselnom vyjadrení môžete zadať aj abecedné rozsahy, ktoré zobrazujú informácie obsahujúce prvé písmená zadaného rozsahu. Ale je tu jeden zaujímavý bod. Vytvorme nasledujúcu požiadavku
VYBRAŤ *
OD dlžníkov
KDE Sname MEDZI „JA“ A „P“;

Potom sa zobrazia nasledujúce údaje

Logická otázka: „Prečo dlžníci s priezviskom P reni a P Avlova? Koniec koncov, prvé písmená ich priezvisk sú zahrnuté v uvedenom rozsahu!" Písmená sú zahrnuté, ale priezviská nie. Je to spôsobené tým, že jazyk SQL v tomto druhu dopytov akceptuje iba dĺžku vyhľadávania reťazce, ktoré sú špecifikované. Inými slovami, dĺžka reťazca je „P“ v dopyte je jeden znak a dĺžka reťazca „Preni“ a „Pavlova“ v databáze je päť a sedem. priezvisko" A vanov“ spadá do rozsahu, pretože rozsah začína na A, ako začiatok, jeden znak dlhý.

Operátor BETWEEN vykoná booleovský test hodnoty oproti rozsahu hodnôt. Operátor vráti TRUE, ak je hodnota v rozsahu a FALSE, ak hodnota nie je v rozsahu. Ak je akákoľvek hodnota v rozsahu NULL (neznáma), výsledok bude NULL.

Operátor EXISTS je sémanticky ekvivalentný operátoru ANY/SOME.

Syntax SQL 2003

SELECT * WHERE výraz BETWEEN dolná_medza A horná_medza

Kľúčové slová

výraz KDE

Testuje skalárny výraz (napríklad stĺpec) v porovnaní s rozsahom hodnôt, ktoré sa nachádzajú medzi hornou hranicou a dolnou hranicou. MEDZI dolná_hranica A horná_hranica

Porovná výraz s dolnou hranicou a hornou hranicou. Porovnanie zahŕňa extrémne hodnoty, to znamená, že je to isté ako „kde výraz [nie je] väčší alebo rovný dolnej hranici a menší alebo rovný hornej hranici>.

Všeobecné pravidlá

Operátor BETWEEN sa používa na testovanie výrazu v porovnaní s rozsahom hodnôt. Operátor BETWEEN možno použiť s akýmkoľvek typom údajov okrem BLOB, CLOB, NCLOB, REF a ARRAY.

Potrebujeme napríklad vidieť počty diel (title_id), ktorých medziročné tržby (ytd_sales) sú v rozsahu od 10 000 do 20 000.

SELECT title_id FROM titles WHERE ytcLsales BETWEEN 10000 AND 20000

Operátor BETWEEN zahŕňa hranice rozsahu. V tomto prípade bude výsledok obsahovať hodnoty 10000 a 20000. Ak potrebujete hľadať bez zahrnutia hraníc rozsahu, musíte použiť väčšie ako (>) a menšie ako (<).

SELECT title_id FROM titles WHERE ytd.sales > 10000 AND ytd_sales< 20000

Operátor NOT vám umožňuje vyhľadávať mimo rozsahu určeného operátorom BETWEEN. Takže môžete nájsť čísla všetkých diel (title_id), ktoré neboli publikované v roku 2003.

Niektorí programátori veľmi dbajú na to, ako sa kľúčové slovo AND používa v klauzulách WHERE. Ak chcete zabrániť tomu, aby si niekto, kto nie je oboznámený s kódom, myslel, že operátor AND použitý v príkaze BETWEEN je logický operátor, môžete celú klauzulu BETWEEN uzavrieť do zátvoriek.

SELECT title_id FROM titles WHERE (ytd_sales BETWEEN" 10000 AND 20000) AND pubdate >= "1991-06-12 00:00:00.000"

Rozdiely v implementáciách na rôznych platformách

Všetky platformy podporujú operátora BETWEEN, ako je popísané vyššie.

Pri práci s relačnými DBMS, v ktorých sú údaje uložené v tabuľkovej forme, sa používatelia často stretávajú s úlohou vybrať hodnoty, ktoré sú zahrnuté (nie sú zahrnuté) v určitom rozsahu. Jazyk SQL umožňuje určiť množinu, do ktorej má (nemala) hodnota patriť, pomocou rôznych možností - operátora In, operátora Like, kombinácie podmienok väčší ako - menší ako, ako aj operátora SQL Between. Popis a príklady v tomto článku sa zamerajú na druhú možnosť.

Operátor "Medzi" v SQL: syntax, obmedzenia

Operátor SQL medzi sa doslovne prekladá ako „medzi“. Jeho použitie vám umožňuje nastaviť obmedzenie „Od a Do“ na konkrétne pole a ak ďalšia hodnota spadá do rozsahu, predikát nadobudne hodnotu „True“ a hodnota bude zahrnutá do konečného výberu.

Syntax operátora je veľmi jednoduchá:

Kde t1.n medzi 0 a 7

Ako vidíte, za kľúčovým slovom between musíte zadať hodnotu dolnej hranice rozsahu, potom AND a hodnotu hornej hranice.

Uveďme si, s akými typmi údajov môže operátor SQL pracovať:

  1. S číslami - celé a zlomkové.
  2. S dátumami.
  3. S textom.

Toto medzi operátorom SQL má určité vlastnosti. Poďme sa s nimi zoznámiť:

  1. Pri práci s číslami a dátumami sú do výberu zahrnuté hodnoty obmedzení Od a Do.
  2. Hodnota dolnej hranice rozsahu musí byť menšia ako hodnota hornej hranice, inak sa nič nezobrazí, pretože podmienka je logicky neplatná. Musíte byť obzvlášť opatrní, keď sú v podmienke zahrnuté premenné namiesto konkrétnych hodnôt.

Pri práci s textom nebude do výberu zahrnutá hodnota pre hornú hranicu rozsahu, pokiaľ nie je špecifikovaná veľmi presne. V nasledujúcich častiach sa budeme touto funkciou zaoberať podrobnejšie.

Výber čísel a dátumov v určitom rozsahu

Pripravme si tabuľku s údajmi o manažéroch pracujúcich v organizácii. Tabuľka bude mať nasledujúcu štruktúru:

Názov poľa

Dátový typ

Popis

Jedinečný identifikátor zamestnanca

Text

Priezvisko zamestnanca

Text

Meno zamestnanca

Priezvisko

Text

Stredné meno zamestnanca

Text

Pohlavie zamestnanca (M/Ž)

Dátum prijatia

Dátum Čas

Dátum prijatia zamestnanca

Počet detí

Číselné

Počet detí, ktoré má zamestnanec

Vyplňte tabuľku nasledujúcimi údajmi:

kód

Priezvisko

názov

Priezvisko

Poschodie

Dátum prijatia

Počet detí

Alexandrova

Nikolajevna

Stepanovič

Vinogradov

Pavlovič

Alexander

Borisovič

Višňakov

Aleksandrovič

Tropnikov

Sergejevič

Zhemchugov

Vasilevič

Konštantinovna

Nikolajevič

Poďme vytvoriť medzi, čo nám pomôže vybrať všetkých zamestnancov, ktorí majú 2 alebo 3 deti:

Výsledkom budú tri riadky s údajmi o zamestnancoch s menami Shumilin, Tropnikov a Avdeeva.

Teraz budeme vyberať zamestnancov prijatých od 1. januára 2005 do 31. decembra 2016. Treba poznamenať, že rôzne DBMS vám umožňujú písať dátumy v podmienkach odlišne. Vo väčšine prípadov je dátum jednoducho vnútený do tvaru deň-mesiac-rok (alebo čokoľvek, čo je vhodnejšie) a zapisuje sa jednoducho alebo V DBMS je dátum uzavretý v znaku „#“. Uveďme si na základe toho príklad:

SELECT Managers.*, Managers.Reception_date

OD manažérov

WHERE Manažéri. Dátum prijatia medzi #1/1/2005# a #31/12/2016#

Výsledkom bude päť zamestnancov prijatých v určenom období vrátane.

Práca medzi tým so strunami

Veľmi častým problémom, ktorý musíte pri práci s priezviskami zamestnancov riešiť, je nutnosť vybrať len tých, ktorých priezviská začínajú na určité písmeno. Pokúsme sa splniť požiadavku a vybrať zamestnancov, ktorých priezviská začínajú priezviskami od A po B:

Výsledok je nasledovný:

Ako vidíte, dvaja zamestnanci s priezviskom začínajúcim na písmeno B neboli zaradení do zoznamu. S čím to súvisí? Ide o to, ako operátor porovnáva reťazce nerovnakej dĺžky. Čiara „B“ je kratšia ako čiara „Vinogradov“ a je vyplnená medzerami. Ale pri abecednom triedení budú medzery vedúce znaky a priezvisko nebude zahrnuté do výberu. Rôzne DBMS ponúkajú rôzne spôsoby riešenia tohto problému, ale často najjednoduchší spôsob, ako byť v bezpečí, je špecifikovať nasledujúce písmeno abecedy v rozsahu:

Pri realizácii tejto požiadavky nás výsledok úplne uspokojí.

Táto nuansa existuje iba pri práci so znakovými údajmi, ale ukazuje, že musíte byť opatrní pri práci aj s takými jednoduchými operátormi, ako je medzi.