SQL Utilizzando il carattere jolly per selezionare tutte le colonne in una query.


Esempio

Considera un database con le seguenti due tabelle.

Tabella dei dipendenti:

Id FName LName deptid
1 Giacomo fabbro 3
2 John Johnson 4

Tabella dei dipartimenti:

Id Nome
1 I saldi
2 Marketing
3 Finanza
4 IT

Semplice affermazione di selezione

* è il carattere jolly utilizzato per selezionare tutte le colonne disponibili in una tabella.

Quando viene utilizzato come un sostituto per i nomi di colonna espliciti, restituisce tutte le colonne in tutte le tabelle che una query sta selezionando FROM . Questo effetto si applica a tutte le tabelle la query accede tramite le sue clausole JOIN .

Considera la seguente query:

SELECT * FROM Employees

Restituirà tutti i campi di tutte le righe della tabella Employees :

Id FName LName deptid
1 Giacomo fabbro 3
2 John Johnson 4

Notazione a punti

Per selezionare tutti i valori da una tabella specifica, il carattere jolly può essere applicato alla tabella con notazione a punti .

Considera la seguente query:

SELECT 
    Employees.*, 
    Departments.Name
FROM 
    Employees
JOIN 
    Departments 
    ON Departments.Id = Employees.DeptId

Ciò restituirà un set di dati con tutti i campi nella tabella Employee , seguito solo dal campo Name nella tabella Departments :

Id FName LName deptid Nome
1 Giacomo fabbro 3 Finanza
2 John Johnson 4 IT

Avvertenze contro l'uso

Si consiglia in genere che l'utilizzo di * venga evitato nel codice di produzione laddove possibile, in quanto può causare una serie di potenziali problemi, tra cui:

  1. Eccesso di I / O, carico di rete, utilizzo della memoria e così via, a causa del fatto che il motore di database non legge i dati necessari e li trasmette al codice di front-end. Questo è particolarmente un problema in cui potrebbero esserci campi grandi come quelli usati per memorizzare note lunghe o file allegati.
  2. Ulteriore sovraccarico di I / O se il database deve eseguire lo spool dei risultati interni sul disco come parte dell'elaborazione per una query più complessa di SELECT <columns> FROM <table> .
  3. Elaborazione extra (e / o anche più IO) se alcune delle colonne non necessarie sono:
    • colonne calcolate nei database che li supportano
    • in caso di selezione da una vista, colonne da una tabella / vista che altrimenti potrebbero essere ottimizzate da Query Optimiser
  4. Il potenziale di errori imprevisti se le colonne vengono aggiunte successivamente alle tabelle e alle viste che risultano in nomi di colonne ambigue. Ad esempio, SELECT * FROM orders JOIN people ON people.id = orders.personid ORDER BY displayname - se una colonna colonna denominata displayname viene aggiunta alla tabella degli ordini per consentire agli utenti di dare ai loro ordini nomi significativi per riferimenti futuri, il nome della colonna verrà visualizzato due volte nell'output quindi la clausola ORDER BY sarà ambigua e potrebbe causare errori ("nome colonna ambiguo" nelle recenti versioni di MS SQL Server) e, se non in questo esempio, il codice dell'applicazione potrebbe iniziare a visualizzare il nome dell'ordine in cui il nome della persona è inteso perché la nuova colonna è il primo di quel nome restituito e così via.

Quando puoi usare * , tenendo presente l'avvertimento sopra?

Mentre è meglio evitare nel codice di produzione, l'uso di * va bene come una scorciatoia quando si eseguono query manuali sul database per indagini o lavori di prototipazione.

A volte le decisioni di progettazione nella tua applicazione rendono inevitabile (in tali circostanze, preferisci le tablealias.* solo su * dove possibile).

Quando si utilizzano EXISTS , come SELECT A.col1, A.Col2 FROM A WHERE EXISTS (SELECT * FROM B where A.ID = B.A_ID) , non si restituiscono dati da B. Pertanto un join non è necessario e il motore non riconosce valori di B da restituire, quindi nessun risultato di prestazioni per l'utilizzo di * . Allo stesso modo, COUNT(*) va bene, in quanto non restituisce alcuna colonna, quindi è sufficiente leggere ed elaborare quelli utilizzati per scopi di filtraggio.