Subqueries (MySQL)
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