13.2.10.1 SELECT .. . PROHLÁŠENÍ
SELECT ... INTO
forma SELECT
umožňuje výsledek dotazu, který má být uložen v proměnných nebo zapsán do souboru:
-
SELECT ... INTO
vybere hodnoty sloupců a uloží je do proměnných.var_list
-
SELECT ... INTO OUTFILE
zapíše vybrané řádky do souboru. K vytvoření konkrétního výstupního formátu lze zadat zakončení sloupců a řádků. -
SELECT ... INTO DUMPFILE
zapíše do souboru jeden řádek bez jakéhokoli formátování.
Daný příkaz SELECT
může obsahovat maximálně jednu klauzuli INTO
, i když to ukazuje SELECT
popis syntaxe (viz Oddíl 13.2.10,„ Příkaz SELECT “), INTO
se může objevit na různých pozicích:
-
Před
FROM
. Příklad: -
Před koncovou blokovací klauzulí. Příklad:
-
Na konci
SELECT
. Příklad:
INTO
Pozice na konci příkazu je podporována od MySQL 8.0.20 a je preferovanou pozicí. Pozice před zamykací klauzulí je zastaralá od MySQL 8.0.20; očekávejte, že bude podpora odstraněna v af čistá verze MySQL. Jinými slovy, INTO
po FROM
, ale ne na konci SELECT
vytvoří Varování.
Klauzule INTO
by neměla být použita ve vnořené SELECT
, protože taková SELECT
musí vrátit svůj výsledek do vnějšího kontextu. Existují také omezení týkající se použití INTO
v rámci UNION
prohlášení; viz Oddíl 13.2.10.3, „Klauzule UNION“.
Varianta INTO
: var_list
-
var_list
pojmenuje seznam jedné nebo více proměnných, z nichž každá může být uživatelem definovaná proměnná, uložená procedura nebo parametr funkce nebo uložená místní proměnná programu. (V rámci připraveného příkazuSELECT ... INTO
jsou povoleny pouze uživatelem definované proměnné; viz Oddíl 13.6.4.2, „Rozsah a rozlišení lokálních proměnných“ .)var_list
-
Vybrané hodnoty jsou přiřazeny proměnným. Počet proměnných se musí shodovat s počtem sloupců. Dotaz by měl vrátit jeden řádek. Pokud dotaz nevrátí žádné řádky, objeví se varování s kódem chyby 1329 (
No data
) a hodnoty proměnných zůstanou nezměněny. Pokud dotaz vrátí více řádků, dojde k chybě 1172 (Result consisted of more than one row
). Pokud je možné, že příkaz může načíst více řádků, můžete pomocíLIMIT 1
omezit sadu výsledků na jeden řádek.
INTO
může být také používá se s var_list
TABLE
s výhradou těchto omezení:
-
Počet proměnné se musí shodovat s počtem sloupců v tabulce.
-
Pokud tabulka obsahuje více než jeden řádek, musíte použít
LIMIT 1
k omezení sady výsledků na jeden řádek.LIMIT 1
musí předcházetINTO
klíčovému slovu.
Příklad takového prohlášení je zobrazeno zde:
Můžete také vybrat hodnoty z VALUES
příkazu, který generuje jeden řádek do sady uživatelských proměnných. V tomto případě musíte použít alias tabulky a každou hodnotu ze seznamu hodnot musíte přiřadit proměnné. Každý ze dvou zde uvedených příkazů je ekvivalentní s SET @x=2, @y=4, @z=8
:
Názvy uživatelských proměnných nerozlišují velká a malá písmena . Viz Sekce 9.4, „Uživatelem definované proměnné“.
SELECT ... INTO OUTFILE "
forma file_name
"SELECT
zapíše vybrané řádky do souboru. Soubor je vytvořen na hostiteli serveru, takže k použití této syntaxe musíte mít oprávnění FILE
. file_name
nemůže být existující soubor, což mimo jiné zabrání úpravám souborů jako /etc/passwd
a databázových tabulek. Interpretace character_set_filesystem
řídí interpretaci názvu souboru.
Příkaz SELECT ... INTO OUTFILE
je určen k povolení výpisu tabulky do textového souboru na hostiteli serveru.Chcete-li vytvořit výsledný soubor na jiném hostiteli, je SELECT ... INTO OUTFILE
obvykle nevhodný, protože neexistuje způsob, jak zapsat cestu k souboru ve vztahu k systému souborů hostitele serveru, pokud umístění umístění k souboru na vzdáleném hostiteli lze přistupovat pomocí síťově mapované cesty v systému souborů hostitele serveru.
Alternativně, pokud je klientský software MySQL nainstalován na vzdáleném hostiteli, můžete použít příkaz klienta, například mysql -e "SELECT ..." >
vygenerovat soubor na tomto hostiteli. file_name
SELECT ... INTO OUTFILE
je doplňkem LOAD DATA
. Hodnoty sloupců se zapisují převedené na znakovou sadu uvedenou v klauzuli CHARACTER SET
. Pokud taková klauzule není k dispozici, jsou hodnoty vypsány pomocí znakové sady binary
. Ve skutečnosti neexistuje žádná konverze znakové sady. Pokud výsledková sada obsahuje sloupce v několika znakových sadách, je to i výstupní datový soubor a nemusí být možné soubor znovu správně načíst.
Syntaxe export_options
části příkazu se skládá ze stejných FIELDS
a LINES
klauzule, které se používají s příkazem LOAD DATA
. Informace o klauzulích FIELDS
a LINES
, včetně jejich výchozích hodnot a povolených hodnot, viz Oddíl 13.2.7, „Prohlášení o LOAD DATA“ .
FIELDS ESCAPED BY
určuje, jak psát speciální znaky. Pokud znak FIELDS ESCAPED BY
není prázdný, použije se, když je nutné se vyhnout nejednoznačnosti jako předpony, která předchází následující znaky na výstupu:
-
FIELDS ESCAPED BY
znak -
FIELDS ENCLOSED BY
znak -
První znak
FIELDS TERMINATED BY
aLINES TERMINATED BY
hodnoty -
ASCII
NUL
(bajt s nulovou hodnotou; to, co je vlastně napsáno za únikovým znakem, je ASCII0
, nikoli bajt s nulovou hodnotou)
FIELDS TERMINATED BY
, ENCLOSED BY
, ESCAPED BY
, nebo LINES TERMINATED BY
znaků musí být ukončeno, aby bylo možné soubor spolehlivě přečíst zpět. ASCII NUL
je vynechán, aby se usnadnilo prohlížení u některých pagerů.
Výsledný soubor nemusí odpovídat syntaxi SQL, takže není třeba nic jiného unikat.
Pokud je znak FIELDS ESCAPED BY
prázdný, žádné znaky neuniknou a NULL
se vydá jako NULL
, nikoli \N
. Pravděpodobně není dobrý nápad zadat prázdný řídicí znak, zvláště pokud hodnoty polí ve vašich datech obsahují některý ze znaků v právě zadaném seznamu.
INTO OUTFILE
lze také použít s příkazem TABLE
, pokud chcete vypsat všechny sloupce tabulky do textový soubor. V takovém případě lze pořadí a počet řádků řídit pomocí ORDER BY
a LIMIT
; tyto klauzule musí předcházet INTO OUTFILE
. TABLE ... INTO OUTFILE
podporuje stejné export_options
stejně jako SELECT ... INTO OUTFILE
a podléhá stejným omezením při zápisu do systému souborů. Příklad takového prohlášení je uveden zde:
Můžete také použít SELECT ... INTO OUTFILE
s VALUES
příkazem hodnoty přímo do souboru. Zde je uveden příklad:
Musíte použít alias tabulky; Aliasy sloupců jsou také podporovány a lze je volitelně použít k zápisu hodnot pouze z požadovaných sloupců. K formátování výstupu do souboru můžete také použít libovolnou nebo všechny možnosti exportu podporované SELECT ... INTO OUTFILE
.
Zde je příklad, který vytváří soubor ve formátu hodnot oddělených čárkami (CSV), který používá mnoho programů:
Pokud používáte INTO DUMPFILE
namísto INTO OUTFILE
MySQL zapíše do souboru pouze jeden řádek, bez ukončení sloupce nebo řádku a bez provedení únikového zpracování. To je užitečné pro výběr hodnoty BLOB
a její uložení do souboru.
Jakýkoli soubor vytvořený INTO OUTFILE
nebo INTO DUMPFILE
je ve vlastnictví uživatele operačního systému, pod jehož účtem běží mysqld. (Z tohoto a dalších důvodů byste nikdy neměli spouštět mysqld jako root
.) Od verze MySQL 8.0.17 je umask pro vytváření souborů 0640; k manipulaci s obsahem souboru musíte mít dostatečná přístupová oprávnění. Před MySQL 8.0.17 je umask 0666 a do souboru je možné zapisovat všichni uživatelé na hostiteli serveru.
Pokud je systémová proměnná secure_file_priv
nastavena na neprázdný název adresáře, musí být soubor, který má být zapsán, umístěn v tomto adresáři.
V kontextu SELECT ... INTO
příkazů, které se vyskytují jako součást událostí prováděných plánovačem událostí, se do protokolu chyb zapisují diagnostické zprávy (nejen chyby, ale také varování). a v systému Windows do protokolu událostí aplikace. Další informace najdete v části 25.4.5, „Stav plánovače událostí“.
Od verze MySQL 8.0.22 je poskytována podpora pro pravidelnou synchronizaci výstupních souborů zapsaných do souboru SELECT INTO OUTFILE
a SELECT INTO DUMPFILE
, povoleno nastavením systémové proměnné serveru select_into_disk_sync
zavedené v této verzi. Velikost výstupní vyrovnávací paměti a volitelné zpoždění mohou být nastavit pomocí select_into_buffer_size
a select_into_disk_sync_delay
. Další informace najdete v popisech těchto systémových proměnných.