In questo post voglio invece spiegare come è possibile fare la differenza dei dati di due tabelle con un database MySQL, un database MariaDB, un database PostegreSQL e un database Microsoft SQL, conosciuto come MSSQL.
Oggetto della discussione è la differenza su database relazionali.
I dati di cui disponiamo sono due tabelle, chiamate per semplicità t1 e t1b, aventi la stessa struttura, ossia due campi di testo contenenti stringhe.
Le due tabelle contengono lo stesso tipo di dati, ma con alcune differenze nei dati stessi.
Scopo del test è quindi verificare, che tipo di query bisogna costruire, per estrarre i dati che sono contenuti nella tabella t1, ma non sono contenuti nella tabella t1b.
Tutto in funzione del motore di database che si utilizza.
Questa la struttura dei dati di esempio.
Tabella t1
nome | cognome |
mario | rossi |
giovanni | verdi |
giuseppe | bianchi |
alessio | gialli |
Tabella t1b
nome | cognome |
mario | rossi |
andrea | verdi |
carlo | bianchi |
alfonso | gialli |
paolo | marroni |
Iniziamo eseguendo il test su Mysql e MariaDB.
La query di intersezione su Mysql
select nome, cognome from t1 where (nome,cognome) NOT IN ( select nome,cognome from t1b );
e questo è il risultato
nome | cognome |
giovanni | verdi |
giuseppe | bianchi |
alessio | gialli |
Eseguiamo ora il test sugli altri database modificando la query in modo da sfruttare l’operatore INTERSECT, non supportato da MySQL.
Eseguiamo ora il test su PostgreSQL
La query di intersezione su PostgreSQL è la seguente
select nome,cognome from t1 EXCEPT select nome,cognome from t1b;
e questo è il risultato
nome | cognome |
giovanni | verdi |
giuseppe | bianchi |
alessio | gialli |
Eseguiamo ora il test su MariaDB
La query di intersezione su MariaDB è la seguente
select nome,cognome from t1 EXCEPT select nome,cognome from t1b;
e questo è il risultato
nome | cognome |
giovanni | verdi |
giuseppe | bianchi |
alessio | gialli |
Eseguiamo ora il test su Microsoft SQL
La query di intersezione su Microsoft SQL è la seguente
select nome,cognome from t1 EXCEPT select nome,cognome from t1b;
e questo è il risultato
nome | cognome |
giovanni | verdi |
giuseppe | bianchi |
alessio | gialli |
Come avete certamente notato, MSSQL, PostegreSQL e MariaDB si comportano allo stesso modo, consentono di eseguire la stessa query, attraverso l’operatore EXCEPT
Mysql invece ci consente di eseguire l’intersezione attraverso l’esecuzione di una select di select, ossia tramite un annidamento.
Se proviamo ad utilizzare l’operatore EXCEPT con MySQL otteniamo l’errore seguente
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'except
select nome,cognome from t1b' at line 2, Time: 0.010000s
Con tutti i motori citati, possiamo sempre utilizzare la query provata con MySQL, ossia
select nome, cognome from t1 where (nome,cognome) NOT IN ( select nome,cognome from t1b );
Versioni dei motori SQL utilizzati
Microsoft SQL Server 2017 (RTM-CU13) (KB4466404) – 14.0.3048.4 (X64)
psql (PostgreSQL) 11.7 (Ubuntu 11.7-0ubuntu0.19.10.1)
MySQL Ver 8.0.18 for Linux on x86_64 (MySQL Community Server – GPL)
MariaDB 10.3.22-MariaDB-0ubuntu0.19.10.1
Reading Time: < 1 minute Esclusione di una serie di prodotti selezionati tramite l'apposito menù…
Reading Time: < 1 minute Nel video che vedete di seguito, a titolo di esempio,…
Reading Time: 2 minutes Vediamo come è possibile fare il restart di php-fpm con capistrano…
"Stiamo scoprendo modi migliori di creare software,sviluppandolo e aiutando gli altri a fare lo stesso.Grazie…
Shopware ha rilasciato una security patch in grado di colmare alcune lacune di sicurezza per…
Il tema e-commerce ed omnicanalità ha sostituito l'ormai obsoleta multicanalità, vediamo di cosa si tratta.…