Hoe declareer ik een variabele in mysql, zodat mijn tweede query deze kan gebruiken?
Ik zou graag iets willen schrijven als:
SET start = 1;
SET finish = 10;
SELECT * FROM places WHERE place BETWEEN start AND finish;
Antwoord 1, autoriteit 100%
Er zijn hoofdzakelijk drie soorten variabelen in MySQL:
-
Door de gebruiker gedefinieerde variabelen(voorafgegaan door
@
):U hebt toegang tot elke door de gebruiker gedefinieerde variabele zonder deze te declareren of
het initialiseren. Als u verwijst naar een variabele die niet is
geïnitialiseerd, heeft het een waarde vanNULL
en een type string.SELECT @var_any_var_name
U kunt een variabele initialiseren met behulp van
SET
ofSELECT
-instructie:SET @start = 1, @finish = 10;
of
SELECT @start := 1, @finish := 10; SELECT * FROM places WHERE place BETWEEN @start AND @finish;
Aan gebruikersvariabelen kan een waarde worden toegewezen uit een beperkte set gegevens
typen: geheel getal, decimaal, drijvende-komma, binaire of niet-binaire tekenreeks,
of NULL-waarde.Door de gebruiker gedefinieerde variabelen zijn sessiespecifiek. Dat wil zeggen, een gebruiker
variabele gedefinieerd door de ene klant kan niet worden gezien of gebruikt door een andere
klanten.Ze kunnen worden gebruikt in
SELECT
-query’s met behulp van Geavanceerde MySQL-technieken voor gebruikersvariabelen. -
Lokale variabelen(geen prefix ) :
Lokale variabelen moeten worden gedeclareerd met
DECLARE
voordat
toegang krijgen.Ze kunnen worden gebruikt als lokale variabelen en de invoerparameters
binnen een opgeslagen procedure:DELIMITER // CREATE PROCEDURE sp_test(var1 INT) BEGIN DECLARE start INT unsigned DEFAULT 1; DECLARE finish INT unsigned DEFAULT 10; SELECT var1, start, finish; SELECT * FROM places WHERE place BETWEEN start AND finish; END; // DELIMITER ; CALL sp_test(5);
Als de
DEFAULT
-clausule ontbreekt, is de beginwaardeNULL
.Het bereik van een lokale variabele is het
BEGIN ... END
blok binnen
waarin het is aangegeven. -
Serversysteemvariabelen(vooraf met
@@
):De MySQL-server onderhoudt veel systeemvariabelendie als standaard zijn geconfigureerd waarde.
Ze kunnen van het typeGLOBAL
,SESSION
ofBOTH
zijn.Algemene variabelen beïnvloeden de algehele werking van de server, terwijl sessievariabelen de werking voor individuele clientverbindingen beïnvloeden.
Gebruik de instructie
SHOW VARIABLES
ofSELECT @@var_name
om de huidige waarden te zien die worden gebruikt door een actieve server.SHOW VARIABLES LIKE '%wait_timeout%'; SELECT @@sort_buffer_size;
Ze kunnen worden ingesteld bij het opstarten van de server met behulp van opties op de opdrachtregel of in een optiebestand.
De meeste kunnen dynamisch worden gewijzigd terwijl de server draait met behulp vanSET GLOBAL
ofSET SESSION
:-- Syntax to Set value to a Global variable: SET GLOBAL sort_buffer_size=1000000; SET @@global.sort_buffer_size=1000000; -- Syntax to Set value to a Session variable: SET sort_buffer_size=1000000; SET SESSION sort_buffer_size=1000000; SET @@sort_buffer_size=1000000; SET @@local.sort_buffer_size=10000;
Antwoord 2, autoriteit 5%
SET
SET @var_name = value
OF
SET @var := value
beide operators =en :=worden geaccepteerd
SELECTEER
SELECT col1, @var_name := col2 from tb_name WHERE "conditon";
als meerdere recordsets zijn gevonden, is alleen de laatste waarde in col2 behouden (overschrijven);
SELECT col1, col2 INTO @var_name, col3 FROM .....
in dit geval bevat het resultaat van select geen col2-waarden
Ex beide methoden gebruikt
— TRIGGER_BEFORE_INSERT — een kolomwaarde instellen op basis van berekeningen
...
SELECT count(*) INTO @NR FROM a_table WHERE a_condition;
SET NEW.ord_col = IFNULL( @NR, 0 ) + 1;
...
Antwoord 3, autoriteit 3%
Gebruik setof select
SET @counter := 100;
SELECT @variable_name := value;
voorbeeld:
SELECT @price := MAX(product.price)
FROM product
Antwoord 4
Verschillende soorten variabelen:
- lokale variabelen(die niet worden voorafgegaan door @) zijn sterk getypt en beperkt tot het opgeslagen programmablok waarin ze zijn gedeclareerd. Merk op dat, zoals gedocumenteerd onder Syntaxis VERKLAREN:
DECLARE is alleen toegestaan binnen een BEGIN … END samengestelde instructie en moet aan het begin staan, vóór alle andere instructies.
- Gebruikersvariabelen(die worden voorafgegaan door @) zijn losjes getypt en vallen onder de sessie. Houd er rekening mee dat ze niet hoeven te worden gedeclareerd en ook niet kunnen worden aangegeven – gebruik ze gewoon rechtstreeks.
Als je dus een opgeslagen programma definieert en eigenlijk een “lokale variabele” wilt, moet je het @-teken laten vallen en ervoor zorgen dat je DECLARE-statement aan het begin van je programmablok staat. Anders, om een “gebruikersvariabele” te gebruiken, laat u de DECLARE-instructie vallen.
Bovendien moet u uw zoekopdracht tussen haakjes plaatsen om deze als subquery uit te voeren:
SET @countTotal = (SELECT COUNT(*) VAN nGrams);
Anders kun je SELECT … INTO gebruiken:
SELECTEER COUNT(*) INTO @countTotal VAN nGrams;
Antwoord 5
Iedereen die @variable gebruikt in de functie concat_ws om aaneengeschakelde waarden te krijgen, vergeet niet om deze opnieuw te initialiseren met een lege waarde. Anders kan het de oude waarde gebruiken voor dezelfde sessie.
Set @Ids = '';
select
@Ids := concat_ws(',',@Ids,tbl.Id),
tbl.Col1,
...
from mytable tbl;
Antwoord 6
-
Verklaar:
SET @a = 1;
-
Gebruik:
INSERT INTO `t` (`c`) VALUES (@a);
Antwoord 7
SET-waarde
declare @Regione int;
set @Regione=(select id from users
where id=1) ;
select @Regione ;
declare @Regione int;
set @Regione=(select id from users
where id=1) ;
select @Regione ;