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;

Bronnen