Příkazy jazyka SQL ve VFP a na SQL Serveru Hana Horová hana.horova@daquas.cz Praha, červen 2010
Příkazy jazyka SQL DDL Data Definition Language CREATE TABLE ALTER TABLE DROP TABLE … DML Data Manipulation Language INSERT UPDATE DELETE SELECT
Ukázková data
CREATE TABLE CREATE TABLE název_tabulky [ „obecné“ vlastnosti tabulky – jen VFP ] ( seznam definic sloupců [ , omezení tabulky ] )
Definice sloupce – VFP název_sloupce datový_typ [ ( délka [ , des_místa ] ) ] [ NULL | NOT NULL ] [ AUTOINC [ NEXTVALUE počátek [ STEP krok ] ] ] | [ DEFAULT výraz ] omezení: [ CHECK log_výraz [ ERROR text ] ] [ PRIMARY KEY | UNIQUE [ COLLATE collate_sequence ] ] [ REFERENCES název_tabulky [ TAG název_složky ] ]
Definice sloupce – SQL Server název_sloupce datový_typ [ ( délka [ , des_místa ] ) ] [ COLLATE collate_sequence ] [ NULL | NOT NULL ] [ IDENTITY [ (počátek, krok) ] | [ DEFAULT výraz ] omezení: [ CONSTRAINT název_omezení ] PRIMARY KEY | UNIQUE | [ FOREIGN KEY ] REFERENCES název_tabulky [ (název_sloupce) ] | CHECK (log_výraz)
Omezení tabulky jako omezení sloupce v indexových a logických výrazech smí figurovat více sloupců
Dočasné tabulky VFP SELECT … INTO CURSOR CursorAlias bez fráze READWRITE jen ke čtení CREATE CURSOR CursorAlias … přepisovatelný některé vlastnosti jako pro tabulky v databázi SQL Server SELECT … INTO #TableName CREATE TABLE #TableName #TableName se založí v databázi Tempdb DECLARE @t table CTE
INSERT (1) jen VFP: INSERT INTO název_tabulky FROM ARRAY název_pole | FROM MEMVAR | FROM NAME název_objektu
INSERT (2) INSERT INTO název_tabulky [ (seznam sloupců) ] VALUES (seznam výrazů) INSERT INTO název_tabulky [ (seznam sloupců) ] příkaz_SELECT
UPDATE UPDATE cílová_tabulka SET název_sloupce = výraz [ , ... ] [ FROM zdrojové_tabulky ] [ WHERE log_výraz ]
DELETE DELETE [ cílová_tabulka ] [ FROM zdrojové_tabulky ] [ WHERE log_výraz ] bez WHERE odstraní všechny řádky tabulky! na SQL Serveru řádky opravdu odstraní, nikoliv označí k odstranění!
ALTER TABLE (1) Přidání sloupce: ALTER TABLE název_tabulky ADD definice_sloupce Odebrání sloupce: ALTER TABLE název_tabulky DROP COLUMN název_sloupce Přejmenování sloupce ve VFP: ALTER TABLE název_tabulky RENAME COLUMN starý_název TO nový_název Přejmenování sloupce na SQL Serveru: uloženou procedurou sp_rename
ALTER TABLE (2) Změna definice sloupce ve VFP: ALTER TABLE název_tabulky ALTER COLUMN název_sloupce datový_typ [ ( délka [ , des_místa ] ) ] [ NULL | NOT NULL ] [ SET DEFAULT výraz ] [ SET CHECK log_výraz ] [ DROP DEFAULT ] [ DROP CHECK ]
ALTER TABLE (3) Změna definice sloupce na SQL Serveru: ALTER TABLE název_tabulky ALTER COLUMN název_sloupce datový_typ [ ( délka [ , des_místa ] ) ] [ NULL | NOT NULL ] [ ADD CONSTRAINT omezení sloupce ] [ DROP CONSTRAINT název_omezení ]
ALTER TABLE (4) Změna omezení tabulky ve VFP: ALTER TABLE název_tabulky [ SET CHECK log_výraz ] [ DROP CHECK ] [ ADD PRIMARY KEY výraz TAG název_složky [ COLLATE collate_sequence ] ] [ DROP PRIMARY KEY ] [ ADD UNIQUE výraz TAG název_složky [ COLLATE collate_sequence ] ] [ DROP UNIQUE TAG název_složky ] [ ADD FOREIGN KEY [ výraz ] TAG název_složky REFERENCES název_tabulky [ TAG název_složky ] ] [ DROP FOREIGN KEY TAG název_složky [ SAVE ] ]
ALTER TABLE (5) Změna omezení tabulky na SQL Serveru: ALTER TABLE název_tabulky [ ADD CONSTRAINT omezení tabulky ] [ DROP CONSTRAINT název_omezení ]
DROP TABLE DROP TABLE název_tabulky
SELECT – základní syntaxe SELECT sloupce [ INTO výstup ] FROM tabulka [ JOIN tabulka ON podmínky … ] [ WHERE podmínky ] [ GROUP BY sloupce ] [ HAVING podmínky ] [ ORDER BY sloupce ] [ … ]
Typy spojení [ INNER ] JOIN LEFT [ OUTER ] JOIN RIGHT [ OUTER ] JOIN FULL [ OUTER ] JOIN „SELF JOIN“ „CROSS JOIN“
NULL NULL + hodnota = NULL porovnání: IS NULL, IS NOT NULL VFP: nikdy neporovnáváme = NULL nebo <> NULL VFP: ISNULL(par) NVL(par1, par2) SQL Server: ISNULL(par1, par2) nebo COALESCE(par1, par2, … parN) NULLIF(par1, par2)
Standardní pořadí zpracování FROM tabulky WHERE GROUP BY HAVING SELECT sloupce DISTINCT ORDER BY TOP
Pořadí zpracování ve VFP FROM tabulky WHERE SELECT sloupce GROUP BY HAVING DISTINCT ORDER BY TOP
Poddotazy (1) ve frázi WHERE ve všech verzích FoxPro výraz operátor ALL (poddotaz) | ANY (poddotaz) | SOME (poddotaz) výraz [ NOT ] IN (poddotaz) [ NOT ] EXISTS (poddotaz) ve všech verzích FoxPro ve VFP 9 a na SQL Serveru je lze vnořovat
Poddotazy (2) VFP 9 a SQL Server: ve frázi FROM místo tabulky musí mít lokální alias v seznamu sloupců SELECT smí vracet jediný sloupec a max. 1 řádek
Poddotazy (3) korelované nekorelované odkazují se na sloupec některé tabulky v hlavním příkazu SELECT jsou pomalejší nekorelované SELECT si je může „předzpracovat“
GROUP BY agregační funkce COUNT, SUM, AVG, MAX, MIN kromě COUNT(*) ignorují NULL nelze je vnořovat všechny výstupní sloupce buď obsahují agregační funkci, nebo musí být uvedeny v seznamu GROUP BY HAVING podmínka filtrující výsledek SQL Server: WITH ROLLUP, WITH CUBE GROUPING()
SELECT – SQL Server 2005+ ROW_NUMBER() APPLY FOR XML PATH PIVOT …
ROW_NUMBER() ROW_NUMBER() OVER ( [ PARTITION BY sloupce ] ORDER BY sloupce ) … a další „ranking functions“ RANK() DENSE_RANK() NTILE(int)
APPLY zdrojová_tabulka { CROSS | OUTER } APPLY funkce nebo poddotaz obdoba { INNER | LEFT OUTER } JOIN pravá strana se zpracuje pro každý řádek levé strany
FOR XML PATH SELECT … FROM … WHERE … FOR XML PATH ('') pohodlné zřetězení hodnot z několika vstupních řádků
PIVOT SELECT pevný_sloupec, [první_souhrnný_sloupec] AS alias_sloupce, [druhý_souhrnný_sloupec] AS alias_sloupce, ... [poslední_souhrnný_sloupec] AS alias_sloupce FROM ( poddotaz ) AS lokální_alias PIVOT ( agregační_výraz FOR [sloupec_jehož_hodnoty_budou_hlavičkami_sloupců] IN ( [první_souhrnný_sloupec], [druhý_souhrnný_sloupec], ... [poslední_souhrnný_sloupec] ) ) AS lokální_alias
Zdroje informací anglicky nápověda Taming Visual FoxPro's SQL Inside MS SQL Server 2008: T-SQL Querying webová fóra, např. www.sqlservercentral.com www.mssqltips.com www.sql-server-performance.com www.sqlteam.com www.simple-talk.com
Zdroje informací česky SQL Bez předchozích znalostí předchozí přednášky Nejen SELECTem živ je člověk (DevCon 2009) Visual FoxPro – úvod do jazyka SQL (seminář jaro 2007) Magický příkaz SELECT (DevCon 2005) webová fóra, např. pandora.idnes.cz/conference/foxpro/ knowledge-base.havit.cz/sql/
Dotazy (možná i odpovědi )