Operátor LIKE se používá v klauzuli WHERE k vyhledání určitého vzoru ve sloupci.

SQL příkaz LIKE

Operátor LIKE se používá k vyhledání určitého vzoru ve sloupci.

Syntaxe SQL LIKE

Demo databáze

V tomto tutoriálu budeme používat známou databázi Northwind.

Níže je uveden výběr z tabulky „Zákazníci“:

uživatelské IDjméno klientaKontaktní osobaAdresaměstoPSČZemě
1 Alfred Futterkiste Marii Andersovou Obere Str. 57 Berlín 12209 Německo
2 Ana Trujillo Emparedados a helados Ana Trujillo Avda. de la Constitucion 2222 Mexiko D.F. 05021 Mexiko
3 Antonio Moreno Taqueria Antonio Moreno Mataderos 2312 Mexiko D.F. 05023 Mexiko
4 Kolem Hornu Thomas Hardy 120 Hannoverské náměstí Londýn WA1 1DP Spojené království
5 Berglunds snabbkop Christina Berglundová Berguvsvagen 8 Lulea S-958 22 Švédsko

Příklady operátorů SQL LIKE

Následující příkaz SQL vybere všechny zákazníky s městem začínajícím na písmeno "s" :

Rada: Znak "%" se používá k definování masky (chybějící písmena) před a za kresbou. Více o zástupných kartách se dozvíte v další kapitole.

Následující příkaz SQL vybere všechny klienty s městem končícím na písmeno "s" :

Následující příkaz SQL vybere všechny klienty se zemí obsahující vzor "land" :

Použití klíčového slova vám zabrání vybrat položky, které neodpovídají vzoru.

Následující příkaz SQL vybere všechny klienty se zemí, která neobsahuje vzor "land" .

LIKE a REGEXP_LIKE

Operátory LIKE a REGEXP_LIKE v dotazech Oracle SQL, symboly % a _, regulární výrazy v žádostech

Velmi často v praktická práce je nutné provádět vyhledávání znakové sady kdekoli ve sloupci - například hledat všechny záznamy s názvy produktů obsahujících slovo nebo hledat slovo v jednotném i množném čísle. K tomuto účelu můžete použít operátor LIKE v Oracle SQL (lze jej použít i na SQL Server) a operátor REGEXP _LIKE (tento operátor není v SQL Serveru k dispozici).

Řekněme, že LIKE a REGEXP _LIKE se používají pouze v relativně jednoduchých situacích. Pokud potřebujete hledat na základě gramatiky, filtrování šumových slov atd., pak byste měli zvážit použití fulltextového vyhledávání.

Operátor LIKE se používá k porovnání hodnot znaků se vzorem se speciálními zástupnými znaky (metaznaky). Všimněte si, že Oracle poskytuje čtyři varianty tohoto operátora:

· "normální" LIKE - používá se k dotazování sloupců řetězců s tradičním kódováním;

· LIKEC - používá se pro sloupce s kódováním Unicode (v terminologii Oracle - Unicode kompletní);

· LIKE2 - pro kódování UCS2;

· LIKE4 - pro kódování UCS4.

Příklad použití tohoto operátoru může vypadat takto:

jako"R%";

V tomto příkladu je poslední _name za klíčovým slovem where sloupec, ze kterého se přebírají hodnoty řetězce k testování, a "R %" je podmínka k testování. Výrazná vlastnost operátoru LIKE spočívá v tom, že může do podmínky zahrnovat speciální zástupné znaky (metaznaky). Pro tento operátor existují pouze dva zástupné znaky:

  • % - představuje libovolnou sekvenci nula nebo více znaků. V tomto případě se hodnota "%" nikdy nebude rovnat NULL (pro kontrolu takových hodnot se používá IS NULL);
  • _ - představuje libovolný jednotlivý znak.

V našem příkladu jsme použili zástupný znak %, takže dotaz vrátí všechny zaměstnance, jejichž příjmení začíná na R .

Chceme-li, aby znak procenta (%) a podtržítko (_) Oracle považoval za běžné prohledávatelné znaky (a ne jako zástupné znaky), máme k dispozici parametr ESCAPE. Pomocí této možnosti můžete definovat zvláštní charakter, po kterém bude zástupný znak považován za normální:

vyberte last_name z hr.employees kde last_name jako"R\%" ESCAPE "\";

V našem příkladu jsme definovali znak \ jako přepsání zástupného znaku, a pokud máme zaměstnance s příjmením R%, pak to dotaz určitě vrátí. Nejběžnějším zástupným znakem escape je zpětné lomítko (\), což je nejznámější význam pro programátory v jazyce C, ale můžete použít jakýkoli znak, když jej definujete pomocí ESCAPE .

Použití podmínky LIKE není obtížné, ale má velmi omezenou sadu možností. Mnohem větší funkčnost poskytuje podmínku REGEXP _LIKE, která vám umožňuje zadat podmínku vyhledávání pomocí standardních regulárních výrazů kompatibilních s POSIX. Regulární výrazy jsou velmi obsáhlým tématem, které přesahuje rámec tohoto tutoriálu. Úplný odkaz na regulární výrazy podporované Oracle najdete v dodatku C příručky SQL Reference v dokumentaci Oracle. Zde uvádíme pouze jednoduchý příklad:

SELECT křestní_jméno FROM zaměstnanců

WHERE REGEXP_LIKE (křestní_jméno, "^Ste(v|ph)en$");

V tomto příkladu vrátíme informace o všech zaměstnancích, jejichž jméno začíná na Ste , končí na en a mezi nimi je v nebo ph. Výsledek může vypadat takto:

Stevene

Stevene

Porovná řetězcový výraz se vzorem ve výrazu SQL.

Syntax

výraz Jako "vzorek"

Syntaxe operátora Jako obsahuje následující komponenty:

Poznámky

Operátor Jako lze použít k vyhledání hodnot polí, které odpovídají zadanému vzoru. Tak jako šablona můžete zadat celou hodnotu (například Like "Smith") nebo použít zástupné znaky k získání rozsahu hodnot (například Like "Sm*")).

Ve výrazech operátor Jako lze použít k porovnání hodnoty pole s řetězcovým výrazem. Například pokud v SQL dotaz zadejte Jako „C*“, dotaz vrátí všechny hodnoty polí začínající písmenem C. V dotazu s parametry můžete uživatele vyzvat k zadání vyhledávacího vzoru.

Následující příklad vrátí data, která začínají písmenem P následovaným libovolným písmenem od A do F a třemi číslicemi:

Jako "P###"

Následující tabulka ukazuje, jak používat operátor Jako pro kontrolu s různými vzory:


Typ zápasu


Vzorek

Shoda

Žádná shoda
(vrátí "True")

Více znaků

aa, aba, aBBBA

abc, AABB, kabina

Speciální znaky

Více znaků

abcdeyo, abc

Jedna postava

aaa, a3a, aba

Jedna číslice

a0a, a1a, a2a

Rozsah znaků

Mimo dosah

Smíšený

Užitečnost klauzule LIKE vychází z operátorů zobecnění, které podporuje. Klauzule LIKE vrátí booleovskou hodnotu TRUE, pokud porovnání nalezne shodu.

Aby klauzule LIKE fungovala, je velmi důležité rozlišovat malá a velká písmena konkrétního DBMS. Například, Microsoft SQL Server ve výchozím nastavení nerozlišuje velká a malá písmena (ačkoli jej lze podle toho nakonfigurovat). SQL Server tedy bude s řádky DAD a dad zacházet stejně. Na druhou stranu platforma Oracle rozlišuje velká a malá písmena a řetězce DAD a dad se zde budou lišit. Zde je příklad pro lepší ilustraci tohoto bodu.

SELECT * FROM autorů WHERE lname LIKE "LARS%"

Tento dotaz pro Microsoft SQL Server načte záznamy z tabulky autorů, kde je příjmení (lname) "larson" nebo "lars", i když je hledání v dotazu definováno pomocí velkých písmen ("LARS%"). V Oracle tento dotaz nenajde příjmení "Larson" nebo "Lars", protože Oracle provádí porovnání rozlišující malá a velká písmena.

DB2

Platforma DB2 podporuje syntaxi klauzule ANSI SQL 2003. Jsou podporovány zástupné znaky % a podtržítko (_). Jsou podporovány sekvence zrušení.

Platforma DB2 rozlišuje velká a malá písmena, takže zde implementace klauzule LIKE plně rozlišuje malá a velká písmena. Chcete-li vždy porovnávat hodnoty bez ohledu na velikost písmen, použijte funkci UPPER nebo TRANSLATE. Kromě toho produkt DB2 implicitně převádí kódovou stránku šablony řetězce nebo sekvence escape na kódovou stránku výrazu, pokud nejsou specifikovány pomocí klauzule FOR BIT DATA.

MySQL

Platforma MySQL podporuje syntaxi ANSI pro klauzuli LIKE. Zástupné znaky % a podtržítko (_) jsou podporovány. Klauzule ESCAPE je také podporována.

Kromě toho MySQL podporuje speciální funkce REGEXP a NOT RLIKE používané při ověřování regulárních výrazů. MySQL po verzi 3.23.4 ve výchozím nastavení nerozlišuje velká a malá písmena.

Věštec

Platforma Oracle podporuje syntaxi ANSI pro klauzuli LIKE. Zástupné znaky % a podtržítko (_) jsou podporovány. Klauzule ESCAPE je také podporována. Syntaxe klauzule LIKE v Oracle je následující.

výraz WHERE (LIKE | LIKEC | LIKE2 |

LIKE4) vzor_řetězce

Prvky syntaxe specifické pro Oracle mají následující význam.

použitý plný set znaky UNICODE.

Je použita znaková sada UNICODE USC2.

Je použita znaková sada UNICODE USC4.

Protože platforma Oracle rozlišuje velká a malá písmena, musíte do funkce UPPER zahrnout výraz, vzor_řetězce nebo obojí. V tomto případě budete vždy porovnávat, co potřebujete.

PostgreSQL

Platforma PostgreSQL podporuje syntaxi klauzule ANSI LIKE. Zástupné znaky % a podtržítko (_) jsou podporovány. Podporovány jsou také sekvence zrušení.

PostgreSQL ve výchozím nastavení rozlišuje velká a malá písmena. Pro srovnání bez ohledu na velikost písmen poskytuje PostgreSQL klíčové slovo ILIKE. Můžete také použít operátor - jako ekvivalent k LIKE a -* jako ekvivalent k ILIKE a !- a !-* jako ekvivalent k NOT LIKE a NOT ILIKE v uvedeném pořadí. Toto jsou všechna rozšíření standardu ANSI, která existují v PostgreSQL.

Například následující dotazy jsou funkčně ekvivalentní.

SELECT * FROM autorů WHERE město LIKE "%ville"; SELECT * FROM autorů WHERE město -- ^ville";

Protože tyto příklady používají malá písmena, můžete narazit na problém s rozlišováním velkých a malých písmen. To znamená, že dotaz hledá řetězec "%ville" v malých písmenech a tabulka může obsahovat velké hodnoty, které nebudou zahrnuty do výsledků - "BROWNSVILLE", "NASHVILLE", "HUNTSVILLE". Tento problém lze vyřešit, jak ukazuje následující příklad.

Převod hodnot na velká písmena

SELECT * FROM autorů WHERE město LIKE UPPER("%ville");

Proveďte srovnání bez ohledu na velikost písmen SELECT * FROM autorů WHERE město ~~* "%ville";

SELECT * FROM autorů WHERE město LIKE "%ville";

Měli byste si být vědomi (ačkoli to přesahuje rámec této knihy), že PostgreSQL také podporuje regulární výrazy POSIX. Podrobnosti jsou uvedeny v popisu platformy.

SQL Server

Platforma SQL Server podporuje syntaxi klauzule ANSI LIKE. Jsou podporovány sekvence zrušení. Podporovány jsou také následující operátory zobecnění.

Odpovídá jakékoli hodnotě ze zadané sady, například , nebo rozsahu, například [k-n].

[L]- odpovídá libovolnému znaku, který není v zadané sadě nebo rozsahu.

Použití dodatečného zobecnění SQL příkazy server dostanete další funkce. Můžete například chtít načíst záznamy pro autory, jejichž příjmení jsou Carson, Carsen, Karson nebo Karsen.

SELECT * FROM autorů WHERE au_lname LIKE "arsn"

SELECT * FROM autorů WHERE au_lname LIKE "arsn"

Téma 3.2. Výběr dat pomocí klauzule SELECT

Všechny příkazy SQL určené k výběru dat z existujících databázových tabulek začínají klíčovým slovem (operátor) SELECT (select). K upřesnění dotazu se používají další operátory, jako FROM (odkud), WHERE (kam) atd.

Nejjednodušší syntaxe pro dotaz SELECT je:

VYBRAT<список столбцов>

Z<список таблиц>

Jsou uvedeny operátory, které mohou v dotazu chybět. Tyto operátory se používají k upřesnění požadavku na načtení dat:

p KDE(kde) - označuje záznamy, které by měly být zahrnuty do výsledné tabulky (filtr záznamů);

p SKUPINA VYTVOŘENÁ(seskupit podle) - seskupuje záznamy podle hodnot určitých sloupců;

p MÍT(mající, podléhající) - označuje skupiny záznamů, které mají být zahrnuty do výsledné tabulky (filtr skupin);

p SEŘADIT PODLE(sort by) – seřadí (uspořádá) záznamy.

Operátoři VYBRAT a Z jsou povinne. Klíčové slovo SELECT sděluje databázi, že daná klauzule je požadavkem na získání informací. Za slovem SELECT až "," jsou uvedeny názvy sloupců, jejichž obsah je požadován. Za slovem FROM následuje seznam názvů tabulek (oddělených ","), ze kterých se získávají informace.

Příklad:

VYBERTE JMÉNO, PŘÍJMENÍ

Výše uvedený dotaz načte všechny hodnoty JMÉNO a PŘÍJMENÍ z tabulky STUDENTI. Výsledkem je tabulka se 2 sloupci.

Pořadí sloupců v této tabulce odpovídá pořadí polí zadaných v dotazu, nikoli jejich pořadí v tabulce STUDENTI.

Pokud potřebujete získat všechny sloupce tabulky, pak místo seznamu sloupců stačí zadat symbol ( *) .

Příklad:

VYBRAT *

Ihned po příkazu SELECT před seznamem sloupců můžete použít klíčová slova VŠECHNO (Všechno) a VÝZNAMNÉ (odlišný), které určují, které záznamy mají být ve výsledné tabulce reprezentovány. Pokud tato klíčová slova nejsou použita, předpokládá se, že by měly být vybrány všechny záznamy (což je také stejné jako použití klíčového slova ALL). Při použití DISTINCT jsou ve výsledné tabulce uvedeny pouze jedinečné záznamy. Pokud je v tomto případě ve zdrojové tabulce více stejných záznamů, vybere se z nich pouze první.

Příklad:

VYBERTE VZDÁLENÉ MĚSTO

Pokud je v klauzuli FROM uvedeno více než jedna tabulka, musí názvy sloupců v klauzuli SELECT obsahovat předpony s uvedením, ke které tabulce patří. Předpona je od názvu sloupce oddělena tečkou.

Příklad:

Výraz STUDENTOVO JMÉNO znamená sloupec NÁZEV od stolu STUDENTI

Záhlaví sloupců ve výsledné tabulce lze předefinovat podle svého uvážení přiřazením tzv aliasy. Chcete-li to provést, v seznamu sloupců za odpovídajícím sloupcem napište výraz formuláře: AS záhlaví sloupce

Příklad:

VYBERTE JMÉNO JAKO Křestní jméno, PŘÍJMENÍ JAKO Příjmení

Aliasy lze také zadat pro každou tabulku za klíčovým slovem FROM. K tomu stačí zadat alias oddělený mezerou bezprostředně za názvem příslušné tabulky. Aliasy tabulek, které jsou kratší než jejich názvy, jsou užitečné ve složitých dotazech.

Příklad:

VYBERTE T1.JMÉNO , T1.PŘÍJMENÍ, T2.SUM_STIPEND

OD ŽÁKŮ T1, STIPENDIA T2;

prohlášení WHERE

Podmínky vyhledávání v klauzuli WHERE jsou booleovské výrazy, tj. vzít jednu ze tří možné hodnoty: skutečný, Nepravdivé a NULA (k tomu dochází, když jsou některé prvky ve výrazu NULL). V SQL tedy máme co do činění s trojhodnotovou logikou.

Při sestavování logických výrazů se používají speciální klíčová slova a symboly porovnávacích operací, které se nazývají predikáty:

ü srovnávací predikáty: (=), (<), (>), (<>), (<=), (>=);

ü LIKE, NELÍBÍ;

ü VŠECHNY, NĚKTERÉ, JAKÉKOLI;

Příklad:

KDE PŘÍJMENÍ = "Petrov";

V důsledku provedení dotazu bude získána tabulka o jednom sloupci se jmény všech studentů jménem Petrov, kteří jsou v tabulce STUDENTI.

Příklad:

Napište žádost o jména a příjmení studentů studujících ve 3. ročníku a pobírajících stipendium:

VYBERTE JMÉNO, PŘÍJMENÍ

KDE KURS=3 A STIPEND>0;

MEZI Operátorem

Predikát BETWEEN (mezi) umožňuje zadat výraz pro kontrolu, zda je hodnota v rozsahu definovaném hraničními hodnotami.

Příklad:

SELECT SUBJECT_NAME

KDE HODINY MEZI 30 A 40;

Vypište názvy předmětů, jejichž studium je dáno počtem hodin v rozsahu od 30 do 40.

Mezní hodnoty jsou v rozmezí hodnot, se kterými je provedeno srovnání.

Ekvivalentem výše uvedeného je výraz se srovnávacími predikáty:

SELECT SUBJECT_NAME

WHERE HODINY>30 A HOD<40;

Kromě dat numerického typu mohou výrazy s BETWEEN používat data následujících typů: znak, bit, datum a čas.

Operátoři IN a NOT IN

Predikáty IN (in) a NOT IN (not in) se používají k testování, zda je hodnota v daném seznamu hodnot.

Predikát vytvořený pomocí IN se považuje za pravdivý, pokud hodnota pole, jehož název je uveden nalevo od IN, odpovídá jedné z hodnot v seznamu.

Příklad:

VYBERTE STUDENT_ID

WHERE MARK IN (4, 5);

Získejte z tabulky EXAM_MARKS informace o studentech, kteří mají pouze 4 a 5 známek zkoušky.

NE V- neodpovídá žádné z hodnot

Příklad:

VYBERTE STUDENT_ID

WHERE MARK NOT IN(0, 1, 2, 3);

Získejte informace o studentech, kteří nemají neuspokojivé známky ze zkoušky z tabulky EXAM_MARKS.

Operátoři LIKE a NELIKE

Predikáty LIKE (podobné) a NOT LIKE (nepodobné) se používají k testování částečné shody řetězců znaků. Tento operátor se dívá na hodnoty řetězců polí, aby zjistil, zda je řetězec zadaný v operátoru LIKE zahrnut ve znaku hodnota_řetězce kontrolovaného pole.

Kritérium částečné shody je specifikováno pomocí dvou zástupné znaky: znak procenta (%) a podtržítko (_). Znak procenta (%) znamená libovolnou sadu znaků, včetně prázdného, ​​a podtržítko (_) znamená libovolný jednotlivý znak.

Příklad:

VYBRAT *

KDE PŘÍJMENÍ JAKO "P%";

Výsledkem dotazu je tabulka obsahující údaje o studentech, jejichž příjmení začíná písmenem „P“.

Pokud chcete vyloučit všechny studenty s příjmením „Petrov“, musíte spustit následující dotaz:

VYBRAT *

KDE PŘÍJMENÍ NENÍ JAKO "Petrov";

Pokud je nutné do "vzorku" zahrnout samotné znaky podtržítka nebo procenta, je nutné, aby takové znaky nebyly interpretem SQL vnímány jako znaky masky. Aby byl znak procenta nebo podtržítka brán doslovně, musíte mu předcházet speciální ovládací znak. Tento znak lze definovat libovolně, pokud se nevyskytuje jako datový prvek.

Příklad:

SELECT Jméno, adresa, sleva_procenta

OD Klientů

KDE procentní_sleva AKO "20#%"

Zde za klíčovým slovem ESCAPE následuje znak, který se používá jako ovládací prvek. Stejným způsobem můžete zakázat i samotný řídicí znak.

Příklad:

JAKO "_ \ _P"

V tomto výrazu je znak "\" deklarován jako znak ESC pomocí klíčového slova ESCAPE. 1. znak "_" se bude stejně jako dříve shodovat s jakýmkoli znakem v kontrolovaném řetězci a 2. znak "_" bude interpretován doslovně, jako běžný znak podtržítka.

IS NULL Operátor

Predikát IS NULL se používá k identifikaci záznamů, kde určitý sloupec nemá žádnou hodnotu.

Příklad:

Záznamy zákazníků, pro které není zadána žádná adresa, můžete získat pomocí následujícího dotazu:

VYBERTE jméno, adresu, oblast

OD Klientů

KDE JE adresa NULL;

Chcete-li načíst záznamy, kde sloupec "Adresa" obsahuje nějakou konkrétní hodnotu (tj. nenulovou), můžete použít podobný výraz, ale s logickým operátorem NOT (not):

VYBERTE jméno, adresu, oblast

OD Klientů

KDE adresa NENÍ NULL;

Srovnávací predikáty by se neměly používat s NULL, například "Adresa=NULL"