Hoe een variabele declareren in MySQL?

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:

  1. 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 van NULLen een type string.

    SELECT @var_any_var_name
    

    U kunt een variabele initialiseren met behulp van SETof SELECT-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.

  2. Lokale variabelen(geen prefix ) :

    Lokale variabelen moeten worden gedeclareerd met DECLAREvoordat
    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 beginwaarde NULL.

    Het bereik van een lokale variabele is het BEGIN ... ENDblok binnen
    waarin het is aangegeven.

  3. Serversysteemvariabelen(vooraf met @@):

    De MySQL-server onderhoudt veel systeemvariabelendie als standaard zijn geconfigureerd waarde.
    Ze kunnen van het type GLOBAL, SESSIONof BOTHzijn.

    Algemene variabelen beïnvloeden de algehele werking van de server, terwijl sessievariabelen de werking voor individuele clientverbindingen beïnvloeden.

    Gebruik de instructie SHOW VARIABLESof SELECT @@var_nameom 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 van SET GLOBALof SET 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 ;

Other episodes