Subqueries (MySQL)

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen

Je kunt queries nesten op een redelijk intuïtieve manier:

  • De subquery of inner query moet binnen haakjes staan
  • Velden in de inner & outer query moeten unieke namen hebben
  • De recordset die de inner query retourneert, moet vaak een eigen naam hebben: Anders wordt de expressie waarmee die subquery is gemaakt de naam, en dat gaat vrij snel mis.

Mijn eerste dubbele query

update tbl_root

set NaamBrands = (

	select Brands
	from tbl_SKUandBrands
	where tbl_SKUandBrands.SKU = tbl_root.SKU
	)

Een vergelijkbare query:

update tbl_vertalingen 

set es2= (

	select tbl_powertools_spaans.es
	from tbl_powertools_spaans
	where tbl_powertools_spaans.en = tbl_vertalingen.en
)

Voorbeeld: Dubbele select-query

Deze query doet weinig nuttigs, anders dan bovenstaande principes illustreren. In dit geval moest ik de verschillende objecten namen geven. Daarbij worden de inner- en de outer-query meer ontkoppeld van elkaar. Interessant!

select ven, pes from
(
   select 
	tbl_vertalingen.nl as vnl, 
	tbl_vertalingen.en as ven,
	tbl_vertalingen.es as ves, 
	tbl_powertools_spaans.es as pes

   from tbl_vertalingen

   join tbl_powertools_spaans

   on tbl_vertalingen.en = tbl_powertools_spaans.en

) as blub

Voorbeeld: Stapsgewijs opbouwen

In den beginne:

select
	1,
	2,
	3;

select max(5);
select max(tid) from koolborstels.term_data;

geeft:

1, 2, 3
5
98414

En dit blijkt ook zomaar te kunnen:

select
	1,
	max(5),
	3;

En nu het klapstuk: Om de complete functie in te voeren, is het commando select nodig:

select
	1,
	(select max(tid) from term_data),
	3;

In dit geval hoef je de geneste query niet apart te benoemen

Je mag zelfs met de uitkomst van de subquery rekenen:

select
	(select max(tid) from term_data)+1,
	2,
	3;

Dit lijkt echter niet te kunnen icm. INSERT INTO:

select
	(select max(tid) from term_data)+1,
	2,
	3;

insert into term_data(
	(select max(tid) from term_data)+1, -- Foutmelding
	2,
	3
)

Voorbeeld: Omdat het kan

Ik wil in een prepared statement alle null-waardes in alle kolommen in een tabel omzetten naar lege strings. Een prepared statement kan echter maar één statement bevatten (dus één ';'). Kan ik dat? En kan ik dat en passant compact en impliciet doen? Nou, wat betreft nesting:

In den beginne...

select concat
(
    (
        "Update amazon_sjabloon_export set "
    )
    ,
    (
        select group_concat(column_name,"=ifnull(",column_name,",'')")
        from information_schema.columns 
        where table_name="amazon_sjabloon_export"
        order by ordinal_position asc
    )
    ,
    (
        ";"
    )
 ) as uitdrukking;

CASE-statement binnen een select-query

CREATE DEFINER=`root`@`localhost` PROCEDURE `test_cond`(in markt tinytext)
BEGIN

select

	"Hello, world!",

        -- Subquery tussen haakjes, zoals altijd

	(
		select case
		when markt="mx" then "9828313011"
		when markt="ca" then "13553126011"
                else "12345"
		end
	
	) as recommended_browse_nodes, -- De naam vd. subquery buiten de haakjes, zoals altijd. Optioneel
    
    "Dag"; -- Niet vergeten: sprocs moeten altijd eindigen met ;

END

Bronnen