Confusione sull'uso corretto di * jolly in SQL [duplicato]

5

Supponiamo che stavo scrivendo un'applicazione di rubrica in cui i dettagli di ciascun contatto erano memorizzati in un database SQL.

Un utente desidera conoscere tutti i dettagli per una persona il cui nome è "Bob [Someone]".

In tal caso, scrivere una query come questa va bene?

SELECT *
FROM contacts
WHERE name LIKE 'Bob %';

Sono confuso perché il mio professore ha detto di evitare l'uso del carattere jolly * ma non riesco a pensare a un modo alternativo di scriverlo.

Va bene usare il carattere jolly se eseguo questa query su un thread separato.

Grazie per il tuo aiuto.

    
posta W.K.S 04.05.2012 - 16:29
fonte

6 risposte

15

Il * è una scorciatoia per selezionare tutte le colonne dal set di risultati; il modo alternativo di scrivere questo è di scrivere tutte le colonne che ci si aspetta nella tabella contacts , ad es. SELECT id, name, email FROM contacts WHERE name LIKE 'Bob%' .

In parole povere, SELECT name, email FROM ... significa "dimmi i nomi e gli indirizzi e-mail di ...", mentre SELECT * FROM ... significa "dimmi tutto ciò che sai su ...".

Il motivo per cui le persone scoraggiano SELECT * sono di due tipi: prima di tutto, se lo si utilizza nel codice di produzione e il database cambia per qualsiasi motivo, l'ordine delle colonne sarà disattivato e si recupereranno i risultati nelle variabili sbagliate . Se si specificano le colonne in modo esplicito, è possibile fare affidamento sul numero corretto e sull'ordinamento delle colonne dei risultati e la query avrà esito negativo se le colonne specificate non corrispondono a quelle trovate nel database.

Un altro motivo sono le prestazioni. SELECT * significa che il DBMS deve eseguire una ricerca aggiuntiva per ottenere l'elenco di colonne. Significa anche che non hai pensato a ciò di cui hai realmente bisogno, quindi è probabile che raccoglierai più dati di quelli di cui hai bisogno, il che, considerando i tipici colli di bottiglia nelle prestazioni nelle applicazioni web, è qualcosa che vuoi davvero evitare.

Infine; i thread non hanno assolutamente nulla a che fare con questo. Niente di niente. Mi chiedo dove hai preso quella nozione; sembra che tu sia ancora abbastanza confuso sulla sintassi SQL.

TL; DR: SELECT * è OK per le query attivate manualmente, ma dovresti evitarlo nel codice di produzione, perché può produrre risultati imprevisti e può portare a query inefficienti.

    
risposta data 04.05.2012 - 16:47
fonte
8

L'alternativa è nominare esplicitamente tutti i dettagli nella tua clausola SELECT, o meglio tutti quei dettagli che vuoi realmente.

L'uso di * è sconsigliato per due motivi:

  • deve recuperare più dati di una query focalizzata per i dati effettivamente necessari, quindi può sprecare risorse.
  • potrebbe incoraggiare il programmatore del client ad aspettarsi che i campi vengano restituiti in un ordine particolare e con una particolare cardinalità. Se si estrae quindi il campo "primo" dal set di risultati e lo si visualizza, il risultato apparirà corretto, fino a quando qualcuno non aggiunge o modifica la definizione della colonna della tabella sottostante, dopo di che il codice precedentemente funzionante si interrompe improvvisamente, senza che nessuno si senta responsabile.

Pertanto, la best practice consiste nel selezionare esplicitamente le colonne effettivamente desiderate e recuperarle per nome anziché per posizione.

    
risposta data 04.05.2012 - 16:38
fonte
0

Il "*" in questo caso sta tirando tutti i campi della tabella. Non ha nulla a che fare con i criteri di ricerca "Bob%". In quasi tutti i casi dovresti elencare esplicitamente i campi che desideri vengano restituiti.

    
risposta data 04.05.2012 - 16:37
fonte
0

Supponendo che l'intero nome si trovi in un campo e che tu non abbia il primo e l'ultimo separati in due colonne, allora la tua query di base va bene.

Se non puoi usare la * wild card, puoi ottenere ogni campo individualmente, in questo modo:

select name, phone, address from contacts where name like 'Bob%';
    
risposta data 04.05.2012 - 16:39
fonte
0

Pensa al * come selettore di colonna anziché a carattere jolly. Il motivo per cui il tuo professore ha detto che era perché selezionare tutte le colonne è un modo inefficiente di ottenere dati, dal momento che probabilmente non avrai bisogno di tutte le informazioni che verranno recuperate.

Al contrario, il '%' è un carattere jolly, e penso che sia quello che stai confondendo con '*' . Nella tua query, stai utilizzando '%' per specificare chiunque abbia il nome che inizia con 'Bob ' . Nota che se avessi usato '*' per questo, avresti cercato qualcuno il cui nome fosse esattamente 'Bob *' .

    
risposta data 04.05.2012 - 16:39
fonte
-1
SELECT Name, Birthday, Adress
FROM contacts
WHERE name LIKE 'Bob %';
    
risposta data 04.05.2012 - 16:38
fonte

Leggi altre domande sui tag