3. Lokální SQL

BDE umožňuje přistupovat jak k lokálním tak i vzdáleným databázovým tabulkám prostřednictvím Lokálního SQL. Lokální SQL (někdy nazývané klientské SQL) je podmnožina ANSI-92 SQL rozšířená o podporu pojmenovacích konvencí Paradoxu a dBASE. Lokální SQL umožňuje používat SQL k dotazování standardních databázových tabulek, které nesídlí na databázovém serveru (tabulek Paradoxu a dBASE) stejně jako vzdálených SQL serverů. Lokální SQL je také použitelné k provádění vícetabulkových dotazů mezi lokálními tabulkami a tabulkami na vzdálených SQL serverech.
SQL příkazy je možno rozdělit do dvou skupin:

Existují jistá pravidla pro aplikování Lokálního SQL. Tato pravidla určují pojmenování sloupců a tabulek, formát hodnot DATE, používání logických hodnot, a další aspekty jazyka Lokálního SQL. Nedodržení těchto pravidel způsobuje, že příkazy SQL nepracují. Tato pravidla jsou popsána v následujících bodech:
Jména tabulek
Standard ANSI SQL předpokládá, že každé jméno tabulky je tvořeno jedním slovem složeným z alfanumerických znaků a znaků podržení. Např.
SELECT *
FROM customer
Lokální SQL podporuje úplnou specifikaci souboru pro jméno tabulky. Jméno tabulky ve tvaru specifikace souboru musí být uzavřeno v uvozovkách nebo apostrofech. Např.
SELECT * FROM 'PARTS.DBF'
SELECT * FROM "C:\SAMPLE\PARTS.DBF"
Lokální SQL také podporuje BDE přezdívky pro jména tabulek. Např.
SELECT * FROM ":PDOX:TABLE1"
Pokud pro lokální jméno tabulky vynecháme příponu souboru, pak se předpokládá, že se jedná o tabulku typu specifikovaného v části Default Driver na stránce System konfigurační utility BDE nebo implicitní typ pro standardní přezdívku přiřazenou k dotazu nebo tabulce. Pokud jméno tabulky odpovídá některému klíčovému slovu SQL, pak jej také musíme uzavřít do apostrofů nebo uvozovek. Např.
SELECT PASSID FROM "PASSWORD"
Jména sloupců
Standard ANSI SQL předpokládá, že každé jméno sloupce je tvořeno jedním slovem složeným z alfanumerických znaků a znaků podržení. Lokální SQL podporuje víceslovní jména sloupců a jména sloupců, které se shodují s klíčovými slovy SQL. Uzavíráme je do apostrofů nebo uvozovek a jsou předcházeny SQL jménem tabulky nebo korelačním jménem tabulky. Např. jméno sloupce v následujícím příkazu je tvořeno dvěmi slovy:
SELECT E."Emp Id" FROM EMPLOYEE E
V dalším příkladě, jméno sloupce se shoduje s klíčovým slovem DATE:
SELECT DATELOG."DATE" FROM DATELOG
Formáty DATE
Lokální SQL očekává datumové konstanty v US formátu MM/DD/YY nebo MM/DD/YYYY. Mezinárodní datumové formáty nejsou podporovány. K zabránění datumovým konstantám před rozložením SQL pro aritmetické výpočty, je zapotřebí je uzavřít do uvozovek. Tím zabráníme např. 1/23/1999 od 1 děleno 23 děleno 1999.
SELECT *
FROM orders
WHERE (saledate <= "1/23/1998")
Úvodní nuly pro položky měsíce a dnů jsou volitelné.
Pokud rok nemá specifikováno století, pak století určuje nastavení FORDIGITYEAR BDE. Když FOURDIGITYEAR je nastaveno na FALSE a rok je specifikován pouze dvojicí číslic, pak roky 49 a menší předchází 20 a roky 50 a větší předchází 19. Např. s nastavením FOURDIGITYEAR na FALSE, následující příkaz SQL vrací řádky, kde sloupec SaleDate obsahuje datumy mezi ?5/5/1980? a ?5/5/2030?.
SELECT *
FROM orders
WHERE (saledate <= "5/5/30") OR  (saledate >= "5/5/80")
Pokud potřebujeme zadat jiné datumové konstanty, pak je nutno použít čtyřznakový rok. Např.
SELECT *
FROM orders
WHERE (saledate >= "5/5/1930") OR  (saledate <= "5/5/2080")
Formáty TIME
Lokální SQL očekává časové konstanty ve tvaru hh:mm:ss AP/PM, kde hh jsou hodiny, mm jsou minuty a ss jsou sekundy. Když vkládáme nový řádek s hodnotou času, pak AM/PM je volitelné a nezáleží na velikosti písmen. Časová konstanta musí být uzavřena v uvozovkách:
INSERT INTO WorkOrder (ID, StartTime)
VALUES ("B00120","10:30:00 PM")
K určení, která polovina dne je časovou konstantou určena, jsou možné dva způsoby. Pokud je použito AM nebo PM pak to určuje příslušnou polovinu dne. Pokud tento specifikátor není uveden, pak hodinová položka je porovnána s 12. Hodinová položka přepisuje specifikátor AM/PM. Např. časová konstanta "15:03:22 AM" je převedena na "3:03:22 PM".
Logické konstanty
Logické konstanty TRUE a FALSE mohou být zapisovány s nebo bez uvozovek. Např.
SELECT *
FROM transfers
WHERE (paid = TRUE) AND NOT (incomplete = "FALSE")
Korelační jména tabulek
Korelační jména tabulek jsou používány k explicitnímu přiřazení sloupců k tabulce ze které pochází. To je obzvláště užitečné, když je v jednom dotazu více sloupců stejného jména (obvykle ve vícetabulkových dotazech). Korelační jméno tabulky je definováno za jménem tabulky v klauzuli FROM dotazu SELECT unikátním identifikátorem. Tento identifikátor může být použit jako předpona jména sloupce.
Pokud jméno tabulky není uzavřeno v uvozovkách, pak jméno tabulky je implicitní korelační jméno. Explicitní korelační jméno stejné jako jméno tabulky nemusí být specifikováno v klauzuli FROM a jméno tabulky může předcházet jméno sloupce v jiných částech příkazu.
SELECT *
FROM customer
  LEFT OUTER JOIN orders ON (customer.custno = orders.custno)
Pokud jméno tabulky je uzavřeno v uvozovkách, pak musíme použít jednu z následujících dvou možností: Lze také použít zkrácené jméno jako korelační jméno v klauzuli FROM.
SELECT *
FROM "customer.db" C
  LEFT OUTER JOIN "orders.db" O ON (C.custno = O.custno)
Korelační jména sloupců
Použijeme klíčové slovo AS k přiřazení korelačního jména ke sloupci, agregované hodnotě nebo konstantě. Korelační jména sloupců nemohou být uzavřeny v uvozovkách a tedy nemohou obsahovat mezery. V následujícím příkazu sub a word jsou korelačními jmény.
SELECT SUBSTRING(company FROM 1 FOR 1) AS sub, "Text" AS word
FROM customer
Vnořené komentáře
Komentáře mohou být pro zvýšení srozumitelnosti vnořeny do příkazů SQL. Text je považován za komentář, pokud je uzavřen mezi symboly /* a */. Tyto symboly nemusí být na stejném řádku.
/*
  Toto je komentář
*/
SELECT SUBSTRING(company FROM 1 FOR 1) AS sub, "Text" AS word
FROM customer
Komentáře mohou být také uvnitř příkazu SQL. To je užitečné při ladění SQL příkazu (odstranění některé klauzule při testování).
SELECT company
FROM customer
/* WHERE (state = "TX") */
ORDER BY company

Příkazy jazyka manipulace dat (DML)

Při popisu DML použijeme tyto kategorie:
Seznam příkazů
Lokální SQL podporuje následující příkazy DML: Příkaz SELECT
Příkaz SELECT je používán k získávání dat z jedné nebo více tabulek. SELECT, který získává data z více tabulek se nazývá spojení. Lokální SQL podporuje následující tvar příkazu SELECT:
SELECT [DISTINCT] * | seznam_sloupců
 FROM tabulkový_odkaz
 [WHERE vyhledávací_podmínka]
 [ORDER BY seznam_pořadí]
 [GROUP BY seznam_skupiny]
 [HAVING seskupovací_podmínka]
Příkaz SELECT používáme k: Klauzule SELECT definuje seznam prvků vracených příkazem SELECT. Klauzule SELECT používá čárkami oddělený seznam složený ze jmen sloupců, konstant, a sloupců nebo konstant modifikovaných funkcemi. Nelze používat parametry k reprezentaci jmen sloupců. K získání hodnot všech sloupců použijeme hvězdičku.
Sloupce v seznamu sloupců klauzule SELECT mohou být z více než jedné tabulky, ale mohou být pouze z těch tabulek, které jsou uvedeny v klauzuli FROM. Klauzule FROM identifikuje tabulky, ze kterých jsou získávána data.
Následující příkaz získává data ze dvou sloupců a všech řádků tabulky.
SELECT custno, company
FROM orders
DISTINCT použijeme k omezení získávání dat na pouze lišící se řádky. Řádky rozlišujeme na základě kombinace sloupců v seznamu sloupců klauzule SELECT. DISTINCT může být použit pouze s jednoduchými typy sloupců jako je CHAR a INTEGER (nelze použít se složitými typy sloupců jako BLOB nebo MEMO).
Příkaz SELECT může také získávat řádky ze souboru QBE Paradoxu. Je to aproximace pohledu SQL.
SELECT *
FROM "customers.qbe"

Příkaz DELETE

Ruší jeden nebo více řádků v tabulce.
DELETE FROM tabulkový_odkaz
[WHERE tvrzení]
Delete použijeme k zrušení jednoho nebo více řádků z existující tabulky.
DELETE FROM "employee.db"
Volitelná klauzule WHERE omezuje rušené řádky na podmnožinu řádků v tabulce. Pokud klauzule WHERE není specifikována, pak jsou zrušeny všechny řádky tabulky.
DELETE FROM "employee.db"
WHERE (empno IN (SELECT empno FROM "old_employee.db"))
Jména tabulek nemohou být předávány pomocí parametrů.

Příkaz INSERT
Přidává jeden nebo více nových řádků dat do tabulky.
INSERT INTO tabulkový_odkaz
[(seznam_sloupců)]
VALUES (vkládané_hodnoty)
Příkaz INSERT používáme k přidávání nových řádků dat k tabulce.
Tabulkový odkaz v klauzuli INTO použijeme ke specifikaci tabulky přijímající data.
Seznam sloupců v čárkami oddělovaném seznamu uzavřeném v závorkách je volitelný. Klauzule VALUES je čárkami oddělený seznam vkládaných hodnot, uzavřený v závorkách. Pokud seznam sloupců není specifikován, pak datové hodnoty jsou uloženy do položek v pořadí jak jsou definovány ve struktuře tabulky. Počet hodnot musí odpovídat počtu sloupců v tabulce.
INSERT INTO "holdings.dbf"
VALUES (4094095, "BORL", 5000, 10.500, "1/2/1998")
Pokud je použit seznam sloupců, pak nové hodnoty jsou ukládány do sloupců uvedených v seznamu a to v pořadí jejich uvedení v seznamu. Do ostatních sloupců (které nejsou uvedeny v seznamu) jsou vloženy hodnoty NULL.
INSERT INTO "customer.db"
(custno, company)
VALUES (9842, "Borland International, Inc.")
Pro přidávání řádků z jedné tabulky do jiné vynecháme klíčové slovo VALUES a použijeme poddotaz jako zdroj pro nové řádky.
INSERT INTO "customer.db"
(custno, company)
SELECT custno, company
FROM "oldcustomer.db"
Vkládané hodnoty mohou být předány příkazu INSERT pomocí parametrů. Parametry nelze použít pro odkaz na tabulku nebo v seznamu sloupců.
Poznámka: Vkládání jednoho nebo více řádků z jedné tabulky do jiné prostřednictvím poddotazu není podporováno.

Příkaz UPDATE
Modifikuje jeden nebo více řádků v existující tabulce.
UPDATE tabulkový_odkaz
SET sloupcový_odkaz = vkládaná_hodnota [, sloupcový_odkaz = vkládaná_hodnota...]
[WHERE tvrzení]
Tabulkový odkaz v klauzuli UPDATE použijeme ke specifikaci tabulky přijímající datové změny.
Klauzule SET je čárkami oddělený seznam aktualizovaných výrazů. Každý výraz je složen ze jména sloupce, operátoru přiřazení (=) a nové hodnoty pro tento sloupec. Nová hodnota může být konstanta, jedna hodnota vrácená z poddotazu nebo něco z předchozího modifikované funkcí. Poddotaz musí vracet pouze jeden řádek s jedním sloupcem.
UPDATE salesinfo
SET taxrate = 0.0825
WHERE (state = "CA")
Vkládané hodnoty mohou být předávány příkazu pomocí parametrů. Parametry nelze použít pro tabulkové odkazy a seznam sloupců. Volitelná klauzule WHERE omezuje aktualizace na podmnožinu řádků v tabulce. Pokud klauzule WHERE není použita, pak jsou aktualizovány všechny řádky v tabulce.

Seznam klauzulí
Lokální SQL podporuje následující klauzule příkazů SQL: Klauzule FROM
Specifikuje tabulky ze kterých příkaz SELECT získává data.
FROM tabulkový_odkaz [, tabulkový_odkaz...]
Hodnota pro klauzuli FROM je čárkami oddělený seznam jmen tabulek. Specifikace jmen tabulek musí splňovat pojmenovací konvence pro tabulky Lokálního SQL. Např. následující příkaz získává data z jedné tabulky Paradoxu.
SELECT *
FROM "customer.db"
Tabulkové odkazy pro klauzuli FROM nelze předávat přes parametry.

Klauzule WHERE
Specifikuje filtrovací podmínku pro příkazy SELECT a UPDATE.
WHERE tvrzení
Klauzuli WHERE používáme k omezení efektu příkazů SELECT a UPDATE na podmnožinu řádků v tabulce. Použití klauzule WHERE je nepovinné.
Hodnota pro klauzuli WHERE je jeden nebo více logických výrazů (tvrzení), které po vyhodnocení pro každý řádek tabulky dávají TRUE nebo FALSE. Pouze ty řádky, které dávají TRUE jsou získány příkazem SELECT nebo modifikovány příkazem UPDATE. Např. následující příkaz SELECT získává všechny řádky, které ve sloupci STATE obsahují hodnotu "CA".
SELECT company, state
FROM customer
WHERE state = "CA"
Více tvrzení musí být odděleno jedním z logických operátorů (OR nebo AND). Každé tvrzení může být negováno operátorem NOT. Závorky mohou být použity k izolování logických porovnávání a skupin porovnávání k vytvoření odlišných kritérií. Např. následující příkaz SELECT získává všechny řádky, které ve sloupci STATE obsahují hodnoty "CA" nebo "HI".
SELECT company, state
FROM customer
WHERE (state = "CA") OR (state = "HI")
Další příkaz SELECT získává všechny řádky, kde ve sloupci SHAPE je "round" nebo "square", ale pouze tehdy, když sloupec COLOR obsahuje "red".
SELECT shape, color, cost
FROM objects
WHERE ((shape = "round") OR (shape = "square")) AND (color = "red")
Bez závorek má předchozí příkaz jiný význam. Získává všechny řádky kde SHAPE je "round" a to bez ohledu na sloupec COLOR a také všechny řádky kde SHAPE je "square" s současně COLOR je "red". Tedy dostaneme i řádek kde SHAPE je "round" a COLOR je "blue".
SELECT shape, color, cost
FROM objects
WHERE shape = "round" OR shape = "square" AND color = "red"
V klauzuli WHERE jsou podporované poddotazy. Poddotazy pracují jako část tvrzení k omezení počtu řádků vracených vnějším nebo nadřízeným dotazem.
V klauzuli WHERE nelze předávat odkazy sloupců pomocí parametrů. Porovnávané hodnoty lze parametry předávat.
Poznámka: Klauzule WHERE filtruje data před agregováním klauzulí GROUP BY. Pro filtrování na základě agregovaných hodnot používáme klauzuli HAVING.

Klauzule ORDER BY
Řadí řádky získané příkazem SELECT.
ORDER BY sloupcový_odkaz [, sloupcový_odkaz...] [ASC|DESC]
Klauzuli ORDER BY použijeme k seřazení řádků získaných příkazem SELECT na základě hodnot jednoho nebo více sloupců.
Hodnota pro klauzuli ORDER BY je čárkami oddělený seznam jmen sloupců. Sloupce v tomto seznamu musí být také v klauzuli SELECT příkazu dotazu. Sloupce v seznamu ORDER BY mohou být z jedné nebo více tabulek. Číselná reprezentace relativní pozice sloupce v klauzuli SELECT může být použita místo jména sloupce. V klauzuli ORDER BY mohou být také použita korelační jména sloupců.
Použijeme ASC (nebo ASCENDING) k zajištění vzestupného řazení (od nejmenšího k největšímu), nebo DESC (nebo DESCENDING) pro sestupné řazení. Pokud není specifikováno, pak je implicitně použito ASC.
Následující příkaz řadí výsledkovou množinu sestupně podle roku získaného ze sloupce LASTINVOICEDATA, pak vzestupně podle sloupce STATE a pak vzestupně podle sloupce COMPANY převedeného na velká písmena.
SELECT EXTRACT(YEAR FROM lastinvoicedate) AS YY, state, UPPER(company)
FROM customer
ORDER BY YY DESC, state ASC, 3
Sloupcové odkazy nemohou být předávány pomocí parametrů.

Klauzule GROUP BY
Kombinuje hodnoty sloupců řádků do jednoho řádku.
GROUP BY sloupcový_odkaz [, sloupcový_odkaz...]
Klauzuli GROUP BY použijeme ke kombinování řádků se stejnými hodnotami sloupců do jednoho řádku. Kritérium pro kombinování řádků je založeno na hodnotách sloupců specifikovaných v klauzuli GROUP BY. Důvodem pro použití klauzule GROUP BY je kombinovat jednu nebo více hodnot sloupců (agregovat) do jedné hodnoty a poskytnout jeden nebo více sloupců k jednoznačné identifikaci agregovaných hodnot. Klauzule GROUP BY může být použita pouze, když na jeden nebo více sloupců je aplikována agregační funkce.
Hodnota pro klauzuli GROUP BY je čárkami oddělovaný seznam sloupců. Každý sloupec v tomto seznamu musí splňovat následující kritéria:

Když je použita klauzule GROUP BY, pak všechny sloupce tabulky v klauzuli SELECT dotazu musí mít alespoň jedno následující kritérium nebo nemůže být vložen do klauzule SELECT: Konstanty v klauzuli SELECT nejsou subjektem předchozích kritérií.
Řádky jsou rozděleny na základě specifikovaných sloupců v seznamu sloupců. Všechny řádky se stejnými hodnotami v těchto sloupcích jsou kombinovány do jednoho řádku (nebo logické skupiny). Sloupce, které jsou subjektem agregačních funkcí získají své hodnoty ze všech řádků ve skupině. Všechny sloupce které nejsou subjektem agregačních funkcí si hodnoty ponechají a slouží k identifikaci skupin. Např. v následujícím příkazu SELECT, hodnoty ve sloupci SALES jsou agregovány (sečteny) do skupin na základě hodnot sloupce COMPANY. Tím získáme celkové prodeje v jednotlivých podnicích.
SELECT company, SUM(sales) AS TOTALSALES
FROM sales1998
GROUP BY company
ORDER BY company
Sloupce mohou být v klauzuli GROUP BY identifikovány referenčním jménem sloupce, místo aktuálním jménem sloupce. Následující příkaz seskupuje podle prvního sloupce (COMPANY), reprezentovaným jménem korelačním jménem sloupce Co.
SELECT company AS Co, SUM(sales) AS TOTALSALES
FROM sales1998
GROUP BY Co
ORDER BY 1
Poznámka: Odvozené hodnoty (počitatelné položky) nemohou být použity jako základ pro GROUP BY.
Odkazy sloupců v klauzuli GROUP BY nelze předávat prostřednictvím parametrů.

Klauzule HAVING
Specifikuje filtrovací podmínku pro příkaz SELECT.
HAVING tvrzení
Klauzuli HAVING používáme k omezení získávaných řádků příkazem SELECT na podmnožinu řádků, kde agregované hodnoty sloupců splňují specifikovaná kritéria. Tato klauzule může být použita pouze v příkazu SELECT, který:

Hodnota pro klauzuli HAVING je jeden nebo více logických výrazů (tvrzení), jejichž vyhodnocením získáme TRUE nebo FALSE pro každý agregovaný řádek získaný z tabulky. Pouze ty řádky, jejich vyhodnocením získáme TRUE jsou získány příkazem SELECT. Např. příkaz SELECT uvedený dále získává všechny řádky jejich celkový prodej překračuje 1000.
SELECT company, SUM(sales) AS TOTALSALES
FROM sales1998
GROUP BY company
HAVING (SUM(sales) >= 1000)
ORDER BY company
Více tvrzení musí být odděleno některým logickým operátorem (OR nebo AND). Každé tvrzení může být negováno operátorem NOT. Závorky mohou být použity k izolování logických porovnávání a skupin porovnávání k získání jiného kritéria.
Příkaz SELECT může obsahovat jak klauzuli WHERE, tak i klauzuli HAVING. Klauzule WHERE filtruje data používaná k agregování. Klauzule HAVING pak filtruje data po agregaci. Následující dotaz SELECT provádí stejné operace jako dříve, ale pouze pro ty řádky, které ve sloupci STATE mají CA.
SELECT company, SUM(sales) AS TOTALSALES
FROM sales1998
WHERE (state = "CA")
GROUP BY company
HAVING (SUM(sales) >= 1000)
ORDER BY company
V klauzuli HAVING jsou podporovány poddotazy. Poddotazy pracují jako vyhledávací podmínky k omezení počtu řádků vrácených vnějším dotazem.
Poznámka: Klauzule HAVING filtruje data po agregování klauzulí GROUP BY. Pro filtrování hodnot řádků před agregováním používáme klauzuli WHERE.
Seznam funkcí
Lokální SQL podporuje následující funkce jazyka manipulací dat: Spojovací funkce
Spojuje dvě znakové hodnoty.
hodnota1 || hodnota2
Např. následující výraz vrazí řetězec ABCdef.
"ABC" || "def"
Následující příkaz používá spojovací funkci ke sloučení hodnot sloupců a znakové konstanty.
SELECT lastname || ", " || firstname
FROM names
Spojovací funkce může být používána pouze se znakovými sloupci nebo konstantami. Pro použití na hodnotách jiných datových typů, hodnota musí být nejprve převedena na CHAR pomocí funkce CAST.

Funkce LOWER
Převádí všechny znaky na malá písmena.
LOWER(sloupcový_odkaz)
Funkci LOWER použijeme pro převod všech znaků ve sloupci tabulky nebo znakové konstantě na malá písmena. Např. následující příkaz SELECT zobrazuje hodnoty ze sloupce NAME malými písmeny.
SELECT LOWER(name)
FROM country
Když funkci aplikujeme na data získaná příkazem SELECT, pak efekt je přechodný a neovlivňuje uložená data. Při aplikování na vkládanou hodnotu příkazu UPDATE, efekt je trvalý a převádí ukládané hodnoty.
Funkce LOWER může být použita v klauzuli WHERE při porovnávání řetězců k ignorování velikosti písmen. Funkci aplikujeme na obě strany porovnávacího operátoru (je-li na jedné straně znaková konstanta, pak stačí když ji zapíšeme malými písmeny).
SELECT *
FROM names
WHERE LOWER(lastname) = "smith"
LOWER může být používána pouze se znakovými sloupci nebo konstantami. Pro použití na hodnotách jiných datových typů, hodnota musí být nejprve převedena na CHAR pomocí funkce CAST.

Funkce UPPER
Převádí všechny znaky na velká písmena.
UPPER(sloupcový_odkaz)
Funkci UPPER použijeme pro převod všech znaků ve sloupci tabulky nebo znakové konstantě na velká písmena. Např. následující příkaz SELECT zobrazuje hodnoty ze sloupce NAME velkými písmeny. Protože funkce je aplikována na sloupec filtru i na porovnávanou hodnotu, tak při filtrování není rozlišována velikost písmen.
SELECT name, capital, continent
FROM country
WHERE UPPER(name) LIKE UPPER("Pe%")
Když funkci aplikujeme na data získaná příkazem SELECT, pak efekt je přechodný a neovlivňuje uložená data. Při aplikování na vkládanou hodnotu příkazu UPDATE, efekt je trvalý a převádí ukládané hodnoty.
UPPER může být používána pouze se znakovými sloupci nebo konstantami. Pro použití na hodnotách jiných datových typů, hodnota musí být nejprve převedena na CHAR pomocí funkce CAST.

Funkce SUBSTRING
Extrahuje podřetězec z řetězce.
SUBSTRING(sloupcový_odkaz FROM počáteční_index [FOR délka])
SUBSTRING používáme k extrakci podřetězce ze sloupce tabulky nebo znakové konstanty specifikované ve sloupcovém odkazu.
FROM je znaková pozice od které začíná podřetězec v původním řetězci. Znaky v řetězci jsou číslovány od 1. FOR je nepovinné a specifikuje délku extrahovaného podřetězce. Je-li FOR vynecháno, pak podřetězec končí koncem řetězce.
Následující příklad vrací hodnotu BCD.
SELECT SUBSTRING("ABCDE" FROM 2 FOR 3) AS Sub
FROM country
Následující příkaz ignoruje první znaky ve sloupci NAME.
SELECT SUBSTRING(name FROM 2)
FROM country
Když funkci aplikujeme na data získaná příkazem SELECT, pak efekt je přechodný a neovlivňuje uložená data. Při aplikování na vkládanou hodnotu příkazu UPDATE, efekt je trvalý a převádí ukládané hodnoty.
SUBSTRING může být používána pouze se znakovými sloupci nebo konstantami. Pro použití na hodnotách jiných datových typů, hodnota musí být nejprve převedena na CHAR pomocí funkce CAST.

Funkce TRIM
Odstraňuje počáteční a koncové znaky z řetězce.
TRIM([LEADING|TRAILING|BOTH] [odstraňovaný_znak] FROM sloupcový_odkaz)
TRIM používáme k odstranění úvodních nebo koncových znaků ze sloupce tabulky nebo znakové konstanty. Funkce TRIM ruší znaky umístěné pouze na specifikovaných pozicích.
První parametr indikuje pozici rušených znaků a má jednu z následujících hodnot:

Parametr odstraňovaného znaku specifikuje rušený znak, je-li přítomen. Je zde rozlišována velikost písmen. FROM specifikuje sloupec nebo znakovou konstantu kde rušíme znaky. Následují různé příklady použití:
 
Výraz Výsledek
TRIM(LEADING "_" FROM "_ABC_") "ABC_"
TRIM(TRAILING "_" FROM "_ABC_") "_ABC"
TRIM(BOTH "_" FROM "_ABC_") "ABC"
TRIM(BOTH "A" FROM "ABC")  "BC"

Když funkci aplikujeme na data získaná příkazem SELECT, pak efekt je přechodný a neovlivňuje uložená data. Při aplikování na vkládanou hodnotu příkazu UPDATE, efekt je trvalý a převádí ukládané hodnoty.
TRIM může být používáno pouze se znakovými sloupci nebo konstantami. Pro použití na hodnotách jiných datových typů, hodnota musí být nejprve převedena na CHAR pomocí funkce CAST.

Funkce AVG
Vrací průměrnou hodnotu specifikovaného sloupce nebo výrazu.
AVG([ALL] sloupcový_odkaz | DISTINCT sloupcový_odkaz)
AVG použijeme k výpočtu průměrné hodnoty pro číselný sloupec. Jako agregační funkce, AVG provádí výpočet agregované hodnoty ve sloupci přes všechny řádky v datové množině. Datová množina může být celá tabulka, filtrovaná datová množina nebo logická skupina vytvořená klauzulí GROUP BY. Nulové hodnoty sloupců jsou započítávány do průměru. Hodnoty NULL jsou ignorovány.
SELECT AVG(itemstotal)
FROM orders
ALL vrací průměr pro všechny řádky. Když není specifikováno DISTINCT, pak se implicitně předpokládá ALL. DISTINCT ignoruje duplicitní hodnoty při výpočtu průměru ve specifikovaném sloupci.
AVG vrací průměr hodnot ve sloupci nebo průměr vypočítaného výrazu pro každý řádek.
SELECT AVG(itemstotal), AVG(itemstotal * 0.0825) AS AverageTax
FROM orders
Když použijeme klauzuli GROUP BY, pak AVG vypočítá jednu hodnotu pro každou skupinu. Tato hodnota je agregací specifikovaného sloupce pro všechny řádky v každé skupině. Následující příkaz agreguje průměrné hodnoty pro sloupec ITEMSTOTAL v tabulce ORDERS s vytvářením mezisoučtu pro každý podnik v tabulce COMPANY.
SELECT C."company", AVG(O."itemstotal") AS Average,
  MAX(O."itemstotal") AS Biggest,
  MIN(O."itemstotal") AS Smallest
FROM "customer.db" C, "orders.db" O
WHERE (C."custno" = O."custno")
GROUP BY C."company"
ORDER BY C."company"
AVG operuje pouze na číselných hodnotách. Pro použití AVG na nečíselných hodnotách, musíme nejprve použít funkci CAST k převedení sloupce na číselný typ.

Funkce COUNT
Vrací počet řádků, které splňují vyhledávací podmínku dotazu.
COUNT(* | [ALL] sloupcový_odkaz | DISTINCT sloupcový_odkaz)
COUNT používáme k výpočtu počtu řádků získaných příkazem SELECT. Příkaz SELECT může být jedno nebo více tabulkový dotaz. Hodnota vracená COUNT je počet řádků filtrované datové množiny.
SELECT COUNT(amount)
FROM averaging
ALL vrací počet všech řádků. Když není specifikováno DISTINCT, pak se implicitně předpokládá ALL. DISTINCT ignoruje duplicitní hodnoty ve specifikovaném sloupci při počítání řádků.

Funkce MAX
Vrací největší hodnotu ve specifikovaném sloupci.
MAX([ALL] sloupcový_odkaz | DISTINCT sloupcový_odkaz)
MAX použijeme k výpočtu největší hodnoty pro číselný sloupec. Jako agregační funkce, MAX provádí výpočet agregované hodnoty ve sloupci přes všechny řádky v datové množině. Datová množina může být celá tabulka, filtrovaná datová množina nebo logická skupina vytvořená klauzulí GROUP BY. Nulové hodnoty sloupců jsou zahrnuty do výpočtu. Hodnoty NULL jsou ignorovány. Pokud počet řádků je nulový, pak funkce vrací NULL.
SELECT MAX(itemstotal)
FROM orders
ALL vrací největší hodnotu ze všech řádků. Když není specifikováno DISTINCT, pak se implicitně předpokládá ALL. DISTINCT ignoruje duplicitní hodnoty ve specifikovaném sloupci při výpočtu největší hodnoty sloupce.
MAX vrací největší hodnotu ve sloupci nebo výpočtu výrazu provedeném pro každý řádek.
SELECT MAX(itemstotal), MAX(itemstotal * 0.0825) AS HighestTax
FROM orders
Při použití s klauzulí GROUP BY, MAX vrací jednu hodnotu pro každou skupinu. Tato hodnota je agregací specifikovaného sloupce pro všechny řádky každé skupiny. Následující příkaz agreguje největší hodnotu pro sloupec ITEMSTOTAL v tabulce ORDERS s vytvářením mezisoučtů pro každý podnik v tabulce COMPANY.
SELECT C."company", AVG(O."itemstotal") AS Average,
  MAX(O."itemstotal") AS Biggest,
  MIN(O."itemstotal") AS Smallest
FROM "customer.db" C, "orders.db" O
WHERE (C."custno" = O."custno")
GROUP BY C."company"
ORDER BY C."company"
MAX může být použito na všechny typy sloupců s výjimkou BLOB. Když používáme s číselnými sloupci, pak vracená hodnota je stejného typu jako sloupec (např. INTEGER nebo FLOAT). Když je použito se sloupcem CHAR, pak vrácená největší hodnota závisí na jazyku použitého ovladače BDE.

Funkce MIN
Vrací nejmenší hodnotu ve specifikovaném sloupci.
MIN([ALL] sloupcový_odkaz | DISTINCT sloupcový_odkaz)
MIN použijeme k výpočtu nejmenší hodnoty pro číselný sloupec. Jako agregační funkce, MIN provádí výpočet agregované hodnoty ve sloupci přes všechny řádky v datové množině. Datová množina může být celá tabulka, filtrovaná datová množina nebo logická skupina vytvořená klauzulí GROUP BY. Nulové hodnoty sloupců jsou zahrnuty do výpočtu. Hodnoty NULL jsou ignorovány. Pokud počet řádků je nulový, pak funkce vrací NULL.
SELECT MIN(itemstotal)
FROM orders
ALL vrací nejmenší hodnotu ze všech řádků. Když není specifikováno DISTINCT, pak se implicitně předpokládá ALL. DISTINCT ignoruje duplicitní hodnoty ve specifikovaném sloupci při výpočtu nejmenší hodnoty sloupce.
MIN vrací nejmenší hodnotu ve sloupci nebo výpočtu výrazu provedeném pro každý řádek.
SELECT MIN(itemstotal), MIN(itemstotal * 0.0825) AS LowestTax
FROM orders
Při použití s klauzulí GROUP BY, MIN vrací jednu hodnotu pro každou skupinu. Tato hodnota je agregací specifikovaného sloupce pro všechny řádky každé skupiny. Následující příkaz agreguje nejmenší hodnotu pro sloupec ITEMSTOTAL v tabulce ORDERS s vytvářením mezisoučtů pro každý podnik v tabulce COMPANY.
SELECT C."company", AVG(O."itemstotal") AS Average,
  MAX(O."itemstotal") AS Biggest,
  MIN(O."itemstotal") AS Smallest
FROM "customer.db" C, "orders.db" O
WHERE (C."custno" = O."custno")
GROUP BY C."company"
ORDER BY C."company"
MIN může být použito na všechny typy sloupců s výjimkou BLOB. Když používáme s číselnými sloupci, pak vracená hodnota je stejného typu jako sloupec (např. INTEGER nebo FLOAT). Když je použito se sloupcem CHAR, pak vrácená největší hodnota závisí na jazyku použitého ovladače BDE.

Funkce SUM
Počítá součet hodnot sloupce.
SUM([ALL] sloupcový_odkaz | DISTINCT sloupcový_odkaz)
SUM použijeme k výpočtu součtu hodnot pro číselný sloupec. Jako agregační funkce, SUM provádí výpočet agregované hodnoty ve sloupci přes všechny řádky v datové množině. Datová množina může být celá tabulka, filtrovaná datová množina nebo logická skupina vytvořená klauzulí GROUP BY. Nulové hodnoty sloupců jsou zahrnuty do výpočtu. Hodnoty NULL jsou ignorovány. Pokud počet řádků je nulový, pak funkce vrací NULL.
SELECT SUM(itemstotal)
FROM orders
ALL vrací součet hodnot ze všech řádků. Když není specifikováno DISTINCT, pak se implicitně předpokládá ALL. DISTINCT ignoruje duplicitní hodnoty ve specifikovaném sloupci při výpočtu součtu hodnot sloupce.
SUM vrací součet hodnot ve sloupci nebo výpočtu výrazu provedeného pro každý řádek.
SELECT SUM(itemstotal), SUM(itemstotal * 0.0825) AS TotalTax
FROM orders
Při použití s klauzulí GROUP BY, SUM vrací jednu hodnotu pro každou skupinu. Tato hodnota je agregací specifikovaného sloupce pro všechny řádky každé skupiny. Následující příkaz agreguje součtovou hodnotu pro sloupec ITEMSTOTAL v tabulce ORDERS s vytvářením mezisoučtů pro každý podnik v tabulce COMPANY.
SELECT C."company", SUM(O."itemstotal") AS SubTotal
FROM "customer.db" C, "orders.db" O
WHERE (C."custno" = O."custno")
GROUP BY C."company"
ORDER BY C."company"
SUM operuje pouze na číselných sloupcích. Pro použití SUM na nečíselných hodnotách, musíme nejprve funkcí CAST převést sloupec na číselný typ.

Funkce CAST
Převádí specifikovanou hodnotu na specifikovaný datový typ.
CAST(sloupcový_odkaz AS datový_typ)
CAST použijeme k převodu hodnoty ve specifikovaném sloupci na specifikovaný datový typ. CAST může být také použito na konstantu nebo vypočítanou hodnotu. CAST může být použito v seznamu sloupců příkazu SELECT, v tvrzení pro klauzuli WHERE nebo k modifikování měněné hodnoty v příkazu UPDATE.
Parametr datového typu může být jedním z možných datových typů sloupců, jako je např. CHAR, INTEGER a NUMERIC. Následující typy sloupců nemohou byt použity jako zdrojový nebo cílový datový typ: BLOB, MEMO a BYTES.
Následující příkaz převádí hodnoty sloupce DATETIME Paradoxu na DATE:
SELECT CAST(saledate AS DATE)
FROM ORDERS
Převáděním hodnoty sloupce pomocí CAST umožňuje používání ostatních funkcí pro jinak nekompatibilní datový typ, jako je např. používání funkce SUBSTRING na sloupci DATE.
SELECT saledate, SUBSTRING(CAST(CAST(saledate AS DATE) AS CHAR(10)) FROM 1 FOR 1)
FROM orders
Když funkci aplikujeme na data získaná příkazem SELECT, pak efekt je přechodný a neovlivňuje uložená data. Při aplikování na vkládanou hodnotu příkazu UPDATE, efekt je trvalý a převádí ukládané hodnoty.

Funkce EXTRACT
Vrací jednu část datumové hodnoty.
EXTRACT(extrahovaná_položka FROM sloupcový_odkaz)
EXTRACT použijeme k návratu roku, měsíce nebo dne ze sloupce typu DATE nebo TIMESTAMP. Pokud sloupec použitý s funkcí EXTRACT obsahuje NULL, pak funkce vrací NULL. Pokud hodnota není NULL, pak funkce vrací specifikovanou část datumu jako SMALLINT.
Parametr extrahované položky může obsahovat některou z následujících hodnot: YEAR, MONTH, DAY, HOUR, MINUTE nebo SECOND. Specifikátory YEAR, MONTH a DAY mohou být použity pouze pro sloupce DATE a TIMESTAMP. Specifikátory HOUR, MINUTE a  SECOND mohou být použity pouze pro sloupce TIMESTAMP a TIME.
SELECT saledate,
  EXTRACT(YEAR FROM saledate) AS YY,
  EXTRACT(MONTH FROM saledate) AS MM,
  EXTRACT(DAY FROM saledate) AS DD
FROM orders
Následující příkaz používá sloupec DOB (obsahující datum narození) k filtrování těch řádků, kde datum obsahuje měsíc květen.
SELECT DOB, LastName, FirstName
FROM People
WHERE (EXTRACT(MONTH FROM DOB) = 5)
EXTRACT operuje pouze na hodnotách DATE, TIME a TIMESTAMP. Pro použití EXTRACT na jiných hodnotách musíme nejprve pomocí funkce CAST převést sloupec na datumový typ.
Poznámka: I když SQL-92 poskytuje pro funkci EXTRACT specifikátory TIMEZONE_HOUR a TIMEZONE_MINUTE, tyto specifikátory nejsou podporovány Lokálním SQL.

Seznam operátorů
Lokální SQL podporuje následující operátory: Aritmetické operátory
Provádějí aritmetické operace. Např.
číselná_hodnota1 + číselná_hodnota2
číselná_hodnota1 - číselná_hodnota2
číselná_hodnota1 * číselná_hodnota2
číselná_hodnota1 / číselná_hodnota2
Pomocí aritmetických operátorů provádíme aritmetické výpočty na datech v příkazu SELECT. Výpočty mohou být prováděny na místech kde jsou povolena neagregovaná data, jako je klauzule SELECT nebo WHERE. V následujícím příkazu je prováděno násobení:
SELECT (itemstotal * 0.0825) AS Tax
FROM orders
Aritmetické výpočty dodržují normální prioritu operátorů. V následujícím příkazu je před násobením provedeno sčítání.
SELECT (n.numbers * (n.multiple + 1)) AS Result
FROM numbertable n
Aritmetické operátory operují pouze na číselných hodnotách. Pro jejich použití na nečíselných hodnotách musíme nejprve pomocí funkce CAST převést hodnotu na číselný typ.

Logické operátory
Spojuje více tvrzení.
[NOT] tvrzení OR [NOT] tvrzení
[NOT] tvrzení AND [NOT] tvrzení
Logické operátory OR a AND používáme ke spojování dvou tvrzení v jedné klauzuli WHERE. To umožňuje filtrování tabulky pomocí složitějších podmínek. V následujícím příkazu jsou vraceny řádky, kdy alespoň jedno tvrzení je pravdivé (reservdate < "1/31/1998" nebo paid = TRUE).
SELECT *
FROM reservations
WHERE ((reservdate < "1/31/1998") OR (paid = TRUE))
Logické operátory jsou prováděny v pořadí priority: AND a potom OR. Ke změně priority lze použít závorky. Např.
SELECT shape, color, cost
FROM objects
WHERE (shape = "round") AND ((color = "blue") OR  (color = "red"))
Bez závorek je jiné pořadí provádění logických operací.
SELECT shape, color, cost
FROM objects
WHERE shape = "round" AND color = "blue" OR color = "red"
Operátor NOT použijeme k negaci logického výsledku operace. V následujícím příkazu, jsou vráceny pouze ty řádky kde sloupec PAID obsahuje hodnoty FALSE.
SELECT *
FROM reservations
WHERE (NOT (paid = "TRUE"))

Seznam tvrzení
Lokální SQL podporuje následující tvrzení: Porovnávání
Porovnává dvě hodnoty.
hodnota1 < hodnota2
hodnota1 > hodnota2
hodnota1 = hodnota2
hodnota1 <> hodnota2
hodnota1 != hodnota2
hodnota1 >= hodnota2
hodnota1 <= hodnota2
Používáme pro porovnávání dvou hodnot. Mohou být porovnávány hodnoty sloupců, konstanty nebo vypočítané hodnoty. Výsledek porovnávání je logická hodnota, která je použita v kontextu klauzule WHERE k určení zda řádek splňuje filtrovací kritéria.
SELECT *
FROM orders
WHERE (itemstotal >= 1000)
Porovnávat lze kodnoty stejného nebo kompatibilního typu. Pokud jedna hodnota je nekompatibilního typu, pak ji musíme nejprve převést funkcí CAST na kompatibilní typ.
Výsledek porovnávání může být modifikován logickými operátory, jako např. NOT.
SELECT *
FROM orders
WHERE NOT (itemstotal >= 1000)
Poznámka: Porovnávání může být použito pouze v klauzulích WHERE a HAVING, ale ne v klauzuli ON spojení; nemůže být použito v klauzuli SELECT.

Tvrzení BETWEEN
Určuje, zda hodnota je v intervalu.
hodnota1 [NOT] BETWEEN hodnota2 AND hodnota3
Tvrzení BETWEEN použijeme k zjištění, zda hodnota je ve specifikovaném rozsahu. Je-li hodnota v rozsahu, pak BETWEEN vrací TRUE, jinak vrací FALSE. Např. následující výraz vrací FALSE, protože 10 není mezi 1 a 5:
10 BETWEEN 1 AND 5
NOT použijeme k negaci porovnávání BETWEEN. Např. následující výraz vrací TRUE:
10 NOT BETWEEN 1 AND 5
BETWEEN může být použito se všemi datovými typy s výjimkou BLOB, ale porovnávané hodnoty musí být stejného nebo kompatibilního datového typu. Pokud jedna hodnota je nekompatibilního typu, pak nejprve musíme použít funkci CAST k přetypování na kompatibilní datový typ. Hodnoty použité v BETWEEN mohou být sloupce, konstanty nebo vypočítané hodnoty.
SELECT saledate
FROM orders
WHERE (saledate BETWEEN "1/1/1988" AND "12/31/1988")

Tvrzení EXISTS
Indikuje, zda hodnota existuje v poddotazu.
EXISTS poddotaz
EXISTS použijeme k filtrování tabulky na základě existence hodnoty sloupce v tabulce z poddotazu. EXISTS vrací TRUE, pokud poddotaz má ve své výsledkové množině alespoň jeden řádek a FALSE je-li získán nulový počet řádků. Poddotaz je proveden jednou pro každý řádek ve filtrované tabulce a existence řádku v poddotazu je použita k vložení nebo vyloučení řádku filtrované tabulky.
SELECT O.orderno, O.custno
FROM orders O
WHERE EXISTS
  (SELECT C.custno
   FROM customer C
   WHERE (C.custno = O.custno))
Např. následující příkaz vrací řádky všech zákazníků, kteří mají objednávky překračující 1000.
SELECT C.company, C.custno
FROM customer C
WHERE EXISTS
  (SELECT O.custno
   FROM orders O
   WHERE (O.custno = C.custno) AND (O.itemstotal > 1000))
NOT používáme k návratu negace porovnávání EXISTS.

Tvrzení IN
Indikuje, zda hodnota existuje v množině hodnot.
hodnota [NOT] IN (množina_hodnot)
IN použijeme k filtrování tabulky na základě existence hodnoty sloupce ve specifikované množině porovnávaných hodnot. Množina porovnávaných hodnot může být statická (čárkami oddělovaný seznam konstant) nebo dynamická (používá výsledek z poddotazu).
Porovnávaná hodnota s množinou hodnot může být hodnota sloupce, konstanta nebo vypočítaná hodnota.
Příklad použití statické množiny porovnávaných hodnot:
SELECT C.company, C.state
FROM customer C
WHERE (C.state IN ("CA", "HI"))
Množina porovnávaných hodnot může být také dynamická. Poddotaz pro porovnávání může vracet více řádků ale pouze jeden sloupec.
SELECT C.company, C.state
FROM customer C
WHERE (C.state IN
  (SELECT R.state
  FROM regions R
  WHERE (R.region = "Pacific")))
NOT použijeme k negaci porovnávání IN.
IN může být použito se všemi datovými typy s výjimkou BLOB, ale porovnávané hodnoty musí být stejného nebo kompatibilního datového typu. Pokud jedna hodnota je nekompatibilního typu, pak nejprve musíme použít funkci CAST k přetypování na kompatibilní datový typ.

Tvrzení LIKE
Indikuje podobnost jedné hodnoty s jinou.
hodnota [NOT] LIKE [substituční_znak] porovnávaná_hodnota [substituční_znak] [ESCAPE znak_escape]
LIKE filtruje tabulku na základě podobnosti hodnoty sloupce s porovnávanou hodnotou. Substituční znaky umožňují porovnávat na základě celé hodnoty sloupce nebo její části.
SELECT *
FROM customer
WHERE (company LIKE "Adventure Undersea")
Substituční znak % může být použit v porovnávání k reprezentaci neznámého počtu znaků. LIKE vrací TRUE, když část hodnoty sloupce odpovídá části porovnávané hodnoty neodpovídající pozici substitučního znaku. Substituční znak může být na začátku, uprostřed nebo na konci porovnávané hodnoty (nebo více kombinací těchto pozic). Např. následující příkaz získává řádky, kde hodnota sloupce COMPANY začíná A které je následováno libovolným počtem znaků.
SELECT *
FROM customer
WHERE (company LIKE "A%")
Substituční znak _ může byt použit k reprezentaci jednoho znaku. Např. následující příkaz získává řádky, kde ve sloupci WORDS je hodnota začínající b, následuje jeden libovolný znak a končí znakem n.
SELECT words
FROM dictionary
WHERE (words LIKE "b_n")
NOT lze použít k negaci porovnávání LIKE.
Když substituční znaky se vyskytují v datech sloupce, pak použijeme ESCAPE. Klíčové slovo ESCAPE určuje znak escape. V porovnávané hodnotě pro tvrzení LIKE, znak následující znak escape je brán jako znak dat a ne jako substituční znak. Ostatní substituční znaky v porovnávané hodnotě nejsou ovlivněny.
V následujícím příkladě znak ^ je určen jako znak escape. V porovnávané hodnotě pro tvrzení LIKE se provádí filtrování na základě řetězce 10%.
SELECT *
FROM Sales
WHERE (PercentValue LIKE "%10^%%" ESCAPE "^")
LIKE může být použito pouze s datovým typem CHAR nebo kompatibilními typy. Pokud jedna hodnota je nekompatibilního typu, pak musíme nejprve funkcí CAST převést data na kompatibilní typ. Při porovnávání provedeném pomocí LIKE se rozlišuje velikost písmen.

Tvrzení IS NULL
Indikuje zda sloupec obsahuje hodnotu NULL.
sloupcový_odkaz IS [NOT] NULL
Např.
SELECT *
FROM customer
WHERE (invoicedate IS NULL)
NOT použijeme k negaci výsledku porovnávání.
Poznámka: Pro číselné sloupce, nulová hodnota není totéž co NULL.

Tvrzení SOME/ANY/ALL
Porovnává hodnotu sloupce s hodnotou sloupce ve více řádcích v poddotazu.
sloupcový_odkaz porovnávací_operátor SOME | ANY | ALL (poddotaz)
Tvrzení SOME, ANY a ALL můžeme použít k filtrování tabulky porovnávání hodnoty sloupce s více porovnávanými hodnotami (ve sloupci poddotazu).
ANY je vyhodnoceno na TRUE, když tvrzení nabývá hodnotu TRUE pro libovolnou hodnotu v poddotazu. SOME pracuje stejně jako ANY. Např. pomocí následujícího příkazu, pro libovolný řádek vrácený z tabulky HOLDINGS, hodnota ve sloupci PUR_PRICE musí být větší než libovolná hodnota vrácená poddotazem.
SELECT *
FROM "holdings.dbf" H
WHERE (H."pur_price" > ANY
  (SELECT O."price"
  FROM "old_sales.dbf"))
Tvrzení ALL je vyhodnoceno na TRUE, když tvrzení nabývá hodnotu TRUE pro všechny hodnoty v poddotazu. Např. pomocí následujícího příkazu, pro libovolný řádek vrácený z tabulky HOLDINGS, hodnota ve sloupci PUR_PRICE musí být větší než všechny hodnoty vrácené poddotazem.
SELECT *
FROM "holdings.dbf" H
WHERE (H."pur_price" > ALL
  (SELECT O."price"
  FROM "old_sales.dbf"))
Poznámka: Poddotaz poskytující porovnávané hodnoty může získávat více řádků, ale musí mít pouze jeden sloupce.

Seznam relačních operátorů
Lokální SQL podporuje následující typy spojení: Spojení Ekvi
Spojení dvou tabulek na základě společných hodnot sloupců s vyloučením neshody.
SELECT seznam_sloupců
FROM tabulkový_odkaz, tabulkový_odkaz [, tabulkový_odkaz...]
WHERE tvrzení [AND tvrzení...]
Použijeme ke spojení dvou tabulek, zdrojové a spojované tabulky, které mají hodnoty z jednoho nebo více sloupců společné. Jeden nebo více sloupců z každé tabulky je porovnáván v klauzuli WHERE na ekvivalentní hodnoty. Pro řádky ve zdrojové tabulce, které mají shodu ve spojované tabulce, jsou vloženy spojené do výsledkové množiny. Řádky ze zdrojové tabulky, bez nalezení řádků ve spojované tabulce jsou vyloučeny ze spojované výsledkové množiny. V následujícím příkladu, tabulky CUSTOMER a ORDERS jsou spojeny na základě stejných hodnot ve sloupci CUSTNO, který obsahují obě tabulky.
SELECT *
FROM customer C, orders O
WHERE (C.custno = O.custno)
Tímto spojením lze spojovat i více tabulek. Jedno porovnávání v klauzuli WHERE je vyžadováno pro spojení každých dvou tabulek. Následující příkaz spojuje tabulku CUSTOMER s ORDERS a pak ORDERS s ITEMS. V tomto případě, připojená tabulka ORDERS pracuje jako zdrojová tabulka pro připojení tabulky ITEMS.
SELECT *
FROM customer C, orders O, items I
WHERE (C.custno = O.custno) AND (O.orderno = I.orderno)
Tabulky mohou být také spojovány pomocí zřetězení hodnot více sloupců k vytvoření jedné hodnoty pro porovnávací tvrzení spojení. Např. sloupce ID1 a ID2 ve spojované tabulce jsou spojeny a porovnávány s hodnotou ID ve zdrojové tabulce.
SELECT *
FROM source S, joining J
WHERE (S.ID = J.ID1 || J.ID2)

Spojení INNER
Spojení dvou tabulek na základě společných hodnot sloupců s vyloučením neshody.
SELECT seznam_sloupců
FROM tabulkový_odkaz
  [INNER] JOIN tabulkový_odkaz
    ON tvrzení
  [[INNER] JOIN tabulkový_odkaz
    ON tvrzení...]
Použijeme ke spojení dvou tabulek, zdrojové a spojované tabulky, které mají hodnoty z jednoho nebo více sloupců společné. Jeden nebo více sloupců z každé tabulky je porovnáván v klauzuli ON na ekvivalentní hodnoty. Pro řádky ve zdrojové tabulce, které mají shodu ve spojované tabulce, jsou vloženy spojené do výsledkové množiny. Řádky ze zdrojové tabulky, bez nalezení řádků ve spojované tabulce jsou vyloučeny ze spojované výsledkové množiny. V následujícím příkladu, tabulky CUSTOMER a ORDERS jsou spojeny na základě stejných hodnot ve sloupci CUSTNO, který obsahují obě tabulky.
SELECT *
FROM customer C
  INNER JOIN orders O
    ON (C.custno = O.custno)
Tímto spojením lze spojovat i více tabulek. Jedno použití operátoru INNER JOIN a odpovídající klauzule ON je vyžadováno pro spojení každých dvou tabulek. Následující příkaz spojuje tabulku CUSTOMER s ORDERS a pak ORDERS s ITEMS. V tomto případě, připojená tabulka ORDERS pracuje jako zdrojová tabulka pro připojení tabulky ITEMS. Následující příkaz je použit bez nepovinného klíčového slova INNER.
SELECT *
FROM customer C
  JOIN orders O
    ON (C.custno = O.custno)
  JOIN items I
    ON (O.orderno = I.orderno)
Tabulky mohou být také spojovány pomocí zřetězení hodnot více sloupců k vytvoření jedné hodnoty pro porovnávací tvrzení spojení. Např. sloupce ID1 a ID2 ve spojované tabulce jsou spojeny a porovnávány s hodnotou ID ve zdrojové tabulce.
SELECT *
FROM source S
  INNER JOIN joining J
    ON (S.ID = J.ID1 || J.ID2)

Spojení OUTER
Spojení dvou tabulek na základě společných hodnot sloupců bez vyloučení neshody.
SELECT seznam_sloupců
FROM tabulkový_odkaz
   LEFT | RIGHT | FULL [OUTER] JOIN tabulkový_odkaz
    ON tvrzení
  [LEFT | RIGHT | FULL [OUTER] JOIN tabulkový_odkaz
    ON tvrzení...]
OUTER JOIN použijeme ke spojení dvou tabulek, zdrojové a  spojované tabulky, které mají jeden nebo více sloupců společných. Jeden nebo více sloupců z každé tabulky je porovnáváno v klauzuli ON na rovnost. Základní rozdíl mezi vnitřním (INNER) a vnějším (OUTER) spojením je ten, že řádky ve vnějším spojení, ze zdrojové tabulky, které nemají shodu ve spojované tabulce, nejsou vyloučeny z výsledkové množiny (sloupce ve spojované tabulce získají hodnoty NULL).
V následujícím příkazu, tabulky CUSTOMER a ORDERS jsou spojeny na základě stejných hodnot ve sloupci CUSTNO, který je obsažen v obou tabulkách. Pro řádky z CUSTOMER, které nemají shodné hodnoty v CUSTOMER.CUSTNO a ORDERS.CUSTNO, sloupce z ORDERS získají hodnoty NULL.
SELECT *
FROM customer C
  LEFT OUTER JOIN orders O
    ON (C.custno = O.custno)
Modifikátor LEFT způsobuje, že všechny řádky z tabulky vlevo od operátoru OUTER JOIN jsou vloženy do výsledkové množiny a to bez ohledu na to, zda odpovídající řádek je nalezen v tabulce napravo od operátoru. Pokud není nalezen odpovídající řádek v tabulce napravo, pak jeho sloupce získají hodnoty NULL. Modifikátor RIGHT způsobuje, že všechny řádky z tabulky napravo od operátoru OUTER JOIN jsou vloženy do výsledkové množiny a to bez ohledu na nalezení shody. Jestliže není nalezen odpovídající řádek v tabulce nalevo od operátoru, pak jeho sloupce získají hodnoty NULL. Modifikátor FULL způsobuje, že všechny řádky ze všech tabulek specifikovaných v klauzuli FROM jsou vloženy do výsledkové množiny a to bez ohledu na nalezení shody. Pokud některý řádek některé tabulky není nalezen, pak jeho sloupce získají hodnoty NULL.
Tímto spojením lze spojovat i více tabulek. Jedno použití operátoru OUTER JOIN a odpovídající klauzule ON je vyžadováno pro spojení každých dvou tabulek. Následující příkaz spojuje tabulku CUSTOMER s ORDERS a pak ORDERS s ITEMS. V tomto případě, připojená tabulka ORDERS pracuje jako zdrojová tabulka pro připojení tabulky ITEMS.
SELECT *
FROM customer C
  FULL OUTER JOIN orders O
    ON (C.custno = O.custno)
  FULL OUTER JOIN items I
    ON (O.orderno = I.orderno)
Tabulky mohou být také spojovány pomocí výrazů vytvářejících jednotlivé hodnoty pro porovnávací tvrzení spojení. Např. sloupce ID1 a ID2 jsou porovnávány samostatně s dvěmi hodnotami vytvořenými rozložením sloupce ID.
SELECT *
FROM source S
  RIGHT OUTER JOIN joining J
    ON (SUBSTRING(S.ID FROM 1 FOR 2) = J.ID1) AND
    (SUBSTRING(S.ID FROM 3 FOR 1) = J.ID2)

Kartézské spojení
Spojení dvou tabulek nerelačním způsobem.
SELECT *
FROM tabulkový_odkaz, tabulkový_odkaz [,tabulkový_odkaz...]
Použijeme pro spojení sloupců dvou tabulek do jedné výsledkové množiny, bez závislostí mezi řádky tabulek. Každý řádek ze zdrojové tabulky je spojen se všemi řádky spojované tabulky. Pokud zdrojová tabulka má 10 řádků a spojovaná tabulka také 10 řádků, pak výsledková množina bude mít 100 řádků.
SELECT *
FROM "employee.dbf", "items.db"

Spojení UNION
Připojuje řádky jedné tabulky na konec jiné tabulky.
SELECT sloup_1 [, sloup_2, ... sloup_n]
FROM tabulkový_odkaz
UNION [ALL]
SELECT sloup_1 [, sloup_2, ... sloup_n]
FROM tabulkový_odkaz
Spojení UNION přidává řádky jedné tabulky na konec jiné podobně strukturované výsledkové množiny. Příkaz SELECT pro zdrojovou a spojovanou tabulku musí mít stejný počet sloupců a sloupce musí být kompatibilní.
SELECT custno, company
FROM customers
UNION
SELECT custno, company
FROM old_customers

Heterogenní spojení
Spojení dvou tabulek z různých databází.
SELECT seznam_sloupců
FROM ":databázový_odkaz:tabulkový_odkaz", ":databázový_odkaz:tabulkový_odkaz" [,":databázový_odkaz:tabulkový_odkaz"...]
WHERE tvrzení [AND tvrzení...]
Používáme ke spojení dvou tabulek, které sídlí v různých databázích. Spojované tabulky mohou být různého typu, ale musí to být tabulky databází, ke kterým můžeme přistupovat pomocí BDE. Např.
SELECT *
FROM ":DBDEMOS:customer.db" C, ":BCDEMOS:orders.db" O
WHERE (C.custno = O.custno)

Aktualizovatelné dotazy
Dotazy, které splňují následující podmínky jsou aktualizovatelné.
Substituce parametrů v DML příkazech
Označovače parametrů mohou být používány v příkazech DML na místě datových hodnot. Parametry jsou identifikovány dvojtečkou. Např.
SELECT last_name, first_name
FROM "customer.db"
WHERE (last_name > :lname) AND (first_name < :fname)
Parametry umožňují jednomu příkazu SQL používat pro porovnávání různé datové hodnoty. Za běhu, aplikace doplní hodnoty parametrů a pak je dotaz proveden. Např.
UPDATE orders
SET itemstotal = :TotalParam
WHERE (orderno = 1014)

Příkazy jazyka definice dat

Lokální SQL podporuje jazyk definice dat (DDL) pro vytváření, modifikaci a rušení tabulek a pro vytváření a rušení indexů. Jsou podporovány také pohledy. Lokální SQL neumožňuje substituci proměnných v DDL příkazech.
Lokální SQL podporuje následující příkazy: Příkaz CREATE TABLE
Vytváří tabulku.
CREATE TABLE tabulkový_odkaz (definice_sloupce [, definice_sloupce,...] [, omezení_primárního_klíče])
Příkaz CREATE TABLE použijeme k vytvoření tabulky dBASE nebo Paradoxu, definování jejich sloupců a primárního klíče.
Jméno tabulky musí splňovat pravidla pojmenovací konvence. Pokud jméno obsahuje mezeru, pak musí být uzavřeno v uvozovkách.
Definice sloupců obsahují čárkami oddělený seznam kombinací jmen sloupců, datových typů a velikostí (jsou-li aplikovatelné). Seznam definic sloupců můsí být uzavřen v závorkách.
K vytvoření primárního klíče použijeme klíčové slovo PRIMARY KEY. Následující příkaz vytváří tabulku Paradoxu:
CREATE TABLE "employee.db"
(
  last_name CHAR(20),
  first_name CHAR(15),
  salary NUMERIC(10,2),
  dept_no SMALLINT,
  PRIMARY KEY (last_name, first_name)
)
Alternativní syntaxí pro vytváření primárního klíče je použití klíčového slova CONSTRAINT. I když primární index tabulky Paradoxu nemá jméno, při použití CONSTRAINT musí být jméno poskytnuto.
CREATE TABLE "employee.db"
(
  last_name CHAR(20),
  first_name CHAR(15),
  salary NUMERIC(10,2),
  dept_no SMALLINT,
  CONSTRAINT z PRIMARY KEY (last_name, first_name)
)
K určení, zda vytváříme tabulku Paradoxu nebo dBASE, určíme příponou jména tabulky: Pokud vynecháme příponu, pak je vytvořen typ tabulky specifikovaný v nastavení Default Driver na stránce INIT Administrátora BDE. Při použití přípony, musí být jméno tabulky uzavřeno v uvozovkách.

Příkaz ALTER TABLE
Přidává nebo odstraňuje sloupce z tabulky.
ALTER TABLE tabulkový_odkaz DROP [COLUMN] sloupcový_odkaz | ADD [COLUMN] sloupcový_odkaz [,odkaz DROP [COLUMN] sloupcový_odkaz | ADD [COLUMN] sloupcový_odkaz...]
Příkaz ALTER TABLE používáme k přidávání sloupce k nebo rušení sloupce v existující tabulce. Je možno zrušit jeden sloupec a přidat jiný v jednom příkazu ALTER TABLE.
Klíčové slovo DROP vyžaduje pouze jméno rušeného sloupce. Klíčové slovo ADD vyžaduje kombinaci jména sloupce, typu a případně rozměrů, jako při definování sloupce v příkazu CREATE TABLE.
Následující příkaz ruší sloupec FULLNAME a přidává sloupec LASTNAME.
ALTER TABLE "names.db"
DROP fullname, ADD lastname CHAR(25)
Je možné zrušit a přidat sloupec stejného jména v jednom příkazu ALTER TABLE, ale data z rušeného sloupce jsou ztracena. To umožňuje rychlou redefinici sloupců ve stavu návrhu databáze.
ALTER TABLE "names.db"
DROP lastname, ADD lastname CHAR(30)
Pokud zrušený sloupec je částí primárního klíče, pak je zrušen i primární klíč. ALTER TABLE končí chybou po pokusu o zrušení sloupce, který je cílem omezení cizího klíče (referenční integrita).
K odkazům na sloupec s nenumerickými znaky nebo mezerami uzavřeme jméno sloupce do uvozovek a před něj zapíšeme jméno tabulky v uvozovkách.
ALTER TABLE "customer.db"
ADD "customer.db"."#ID" CHAR(3)

Příkaz DROP TABLE
Ruší tabulku.
DROP TABLE tabulkový_odkaz
Příkaz DROP TABLE ruší celou tabulku. Např.
DROP TABLE "employee.db"

Příkaz CREATE INDEX
Vytváří sekundární index.
CREATE [UNIQUE] [ASC | DESC] INDEX indexový_odkaz ON tabulkový_odkaz (sloupcový_odkaz [,sloupcový_odkaz...])
Příkaz CREATE INDEX použijeme k vytvoření sekundárního indexu pro existující tabulku. Jména indexů nemohou obsahovat mezeru. Paradox může indexovat na základě více sloupců.
UNIQUE použijeme k vytvoření indexu, který generuje chybu, pokud je vložen řádek s duplicitními hodnotami sloupce. Implicitně indexy nejsou unikátní.
ASC (nebo ASCENDING) použijeme k vytvoření indexu, který řadí data ve vzestupném pořadí. DESC (nebo DESCENDING) vytváří sestupné pořadí. Pokud není specifikováno, pak implicitní hodnota je ASC.
Následující příkaz vytváří vícesloupcový (složený) sekundární index Paradoxu:
CREATE INDEX custdate ON "orders.db" (custno, saledate)
Další příkaz vytváří unikátní sekundární index dBASE:
CREATE UNIQUE INDEX namex ON "employee.dbf" (last_name)

Příkaz DROP INDEX
Ruší index.
DROP INDEX tabulkový_odkaz.indexový_odkaz | PRIMARY
Příkaz DROP INDEX použijeme ke zrušení primárního nebo sekundárního indexu.
K zrušení primárního nebo sekundárního indexu dBASE nebo sekundárního indexu Paradoxu, identifikujeme index pomocí jména tabulky a jména indexu oddělené tečkou.
DROP INDEX "employee.dbf".namex
K zrušení primárního indexu Paradoxu index identifikujeme klíčovým slovem PRIMARY:
DROP INDEX orders.PRIMARY


  1. Začneme opět vytvářet aplikace C++ Builderu. Naše nová aplikace spojí dvě tabulky customer.db a orders.db v dotazu SQL. Výsledek dotazu bude zobrazen v ovladači DBGrid. Použitý příkaz SQL zadáme do vlastnosti SQL objektu TQuery.

  2. Začneme vývoj nové aplikace. Na formulář umístíme komponenty TQuery, TDataSource a TDBGrid. U komponenty TQuery nastavíme vlastnost DatabaseName na BCDEMOS, vlastnost SQL na
    select Customer.Company, Orders.OrderNo, Orders.SaleDate
      from Customer, Orders
      where Customer.CustNo = Orders.CustNo
    a vlastnost Active na true. U komponenty TDataSource nastavíme vlastnost DataSet na Query1. U komponenty TDBGrid nastavíme Align na alClient, BorderStyle na bsNone a DataSource na DataSource1. Tím je naše aplikace hotova. Můžete ji vyzkoušet.
  3. V Inspektoru objektů modifikujte vlastnosti SQL a DatabaseName komponenty TQuery a podívejte se na změny zobrazené výsledkové množiny v TDBGrid. Např. výsledkovou množinu seřaďte podle jména podniku, vypisujte pouze některé záznamy splňující určité kritérium nebo vypisujte údaje některé tabulky jiné databáze.
  4. Zjistěte položky tabulky Customer. Např. pomocí změny vlastnosti SQL komponenty TQuery.
  5. Pokuste se v nějaké aplikaci použít tabulku vytvořenou v předchozí kapitole.
3. Lokální SQL