2010-05-25 14 views
9

Sono completamente nuovo a SQL, ma diciamo che sul StackExchange Data Explorer, voglio solo elencare i primi 15 utenti di reputazione, e ho scritto qualcosa di simile:Principiante SQL: evitando ripetuta espressione

SELECT TOP 15 
    DisplayName, Id, Reputation, Reputation/1000 As RepInK 
FROM 
    Users 
WHERE 
    RepInK > 10 
ORDER BY Reputation DESC 

Attualmente questo dà un Error: Invalid column name 'RepInK', che ha un senso, credo, perché RepInK non è una colonna in Users. Posso facilmente risolvere questo problema dicendo WHERE Reputation/1000 > 10, essenzialmente ripetendo la formula.

Quindi le domande sono:

  • Posso effettivamente utilizzare la "colonna" RepInK nella clausola WHERE?
    • faccio a forse bisogno di creare una tabella/vista virtuale con questa colonna, e poi fare una query SELECT/WHERE su di esso?
  • Posso citare un'espressione, ad esempio, Reputation/1000, quindi devo solo per ripetere i nomi in pochi luoghi al posto della formula?
    • Come si chiama questo? Una macro di sostituzione? Una funzione? Una procedura memorizzata?
  • C'è un foglio elettronico SQL, un glossario di termini, specifiche della lingua, tutto ciò che posso usare per raccogliere rapidamente la sintassi e la semantica della lingua?
    • ho capito che ci sono diversi "gusti"?
+1

Non è possibile utilizzare le istruzioni 'SELECT' come condizioni' WHERE', nel tuo caso 'RepInk', poiché t hey sarà risolto dopo il 'WHERE', è un paradosso e il server esploderà insieme all'intero edificio. – Ben

risposta

8

Posso effettivamente utilizzare la "colonna" RepInK nella clausola WHERE?

No, ma potete essere certi che il database valuterà (Reputation/1000) una volta, anche se lo si utilizza sia in campo SELECT e all'interno della clausola di WHERE.

Devo forse creare una tabella/vista virtuale con questa colonna e quindi eseguire una query SELECT/WHERE su di essa?

Sì, una vista è un'opzione per semplificare le query complesse.

Posso denominare un'espressione, ad es. Reputazione/1000, quindi devo solo ripetere i nomi in pochi punti invece della formula?

è possibile creare una funzione definita dall'utente che si può chiamare qualcosa come convertToK, che ricevere il valore rep come argomento e restituisce tale argomento diviso per 1000. Tuttavia spesso non è pratico per un caso banale come la uno nel tuo esempio.

C'è un foglio elettronico SQL, un glossario dei termini, le specifiche della lingua, tutto ciò che posso usare per raccogliere rapidamente la sintassi e la semantica della lingua?

Suggerisco pratica. È possibile iniziare a seguire il tag mysql su Overflow dello stack, in cui vengono poste molte domande per principianti ogni giorno. Download MySQL, e quando pensi che ci sia una domanda alla tua portata, prova a cercare la soluzione. Penso che questo ti aiuterà a prendere velocità, oltre alla consapevolezza delle funzionalità linguistiche. Non c'è bisogno di pubblicare la risposta all'inizio, perché ci sono alcune armi abbastanza veloci sul tema qui, ma con un po 'di pratica sono sicuro che sarete in grado di portare a casa alcuni punti :)

I capisci che ci sono diversi "sapori"?

Gli aromi sono in realtà estensioni a ANSI SQL. I fornitori di database di solito aumentano il linguaggio SQL con estensioni come Transact-SQL e PL/SQL.

+0

sconsiglia di apprendere l'SQL interrogando Stack Data Explorer Explorer? Perché quello era il mio piano. Non è necessario installare nulla, molte persone lo stanno già interrogando in modo da poter cercare le query di altre persone, dati reali di cui sono a conoscenza e che mi interessano, ecc. – polygenelubricants

+1

@polygenelubrificanti: No per niente. Questa è certamente una buona pratica, soprattutto se hai alcune curiosità specifiche che vuoi soddisfare dalle discariche di dati SE :) ... Ho suggerito di seguire le domande di SO semplicemente perché i problemi reali spesso rivelano molte più situazioni per le cose pratiche su SQL. Inoltre, vedrai anche come rispondono gli esperti, dai quali c'è molto da imparare. Il tag mysql in genere raccoglie problemi più semplici rispetto ai tag sql-server o ad altri. La sintassi non è poi così diversa: la maggior parte delle query verrà eseguita su tutti i database. –

+1

@polygenelubricants: Sembra che tu non sia l'unico [interessato ad imparare SQL dallo Stack Exchange Data Exporer] (http://meta.stackexchange.com/questions/51395/can-we-become-our-own -northwind-for-teaching-sql-databases) :) –

6

Si potrebbe semplicemente riscrivere la clausola WHERE

where reputation > 10000 

Questo non sarà sempre conveniente. Come alternativly, è possibile utilizzare una vista in linea:

SELECT 
    a.DisplayName, a.Id, a.Reputation, a.RepInK 
FROM 
    (
     SELECT TOP 15 
      DisplayName, Id, Reputation, Reputation/1000 As RepInK 
     FROM 
      Users 
     ORDER BY Reputation DESC 
    ) a 
WHERE 
    a.RepInK > 10 
1

È POTETE fare riferimento alla RepInK nella clausola Order By, ma nella clausola Where è necessario ripetere l'espressione. Ma, come altri hanno già detto, verrà eseguito una sola volta.

1

Ci sono già buone risposte per il problema tecnico, quindi affronterò solo alcune delle restanti domande.

Se stai lavorando con DataExplorer, ti consigliamo di familiarizzare con la sintassi di SQL Server poiché è ciò che è in esecuzione. Il posto migliore per trovarlo, ovviamente, è MSDN's reference.

Sì, esistono diverse varianti nella sintassi SQL. Ad esempio, la clausola TOP nella query che hai fornito è specifica per SQL Server; in MySQL dovresti usare la clausola LIMIT (e queste parole chiave non appaiono necessariamente nello stesso punto della query!).

2

Per quanto riguarda qualcosa come espressioni di nome, mentre ci sono diverse alternative possibili, query optimizer sta andando a fare meglio solo scrivendo la formula Reputation/1000 lunga mano. Se è davvero necessario eseguire un intero gruppo di query utilizzando lo stesso valore valutato, la soluzione migliore è creare una vista con il campo definito, ma non si vorrebbe farlo per una query una tantum.

In alternativa, (e nei casi in cui le prestazioni non è molto più di un problema), si potrebbe provare qualcosa di simile:

SELECT TOP 15 
    DisplayName, Id, Reputation, RepInk 
FROM (
    SELECT DisplayName, Id, Reputation, Reputation/1000 as RepInk 
    FROM Users 
) AS table 
WHERE table.RepInk > 10 
ORDER BY Reputation DESC 

anche se io non credo che è supportato da tutti i dialetti SQL e, ancora una volta , è probabile che l'ottimizzatore esegua un lavoro molto peggiore che questo genere di cose (dal momento che eseguirà SELECT rispetto alla tabella Utenti completa e quindi filtrerà tale risultato). Tuttavia, per alcune situazioni questo tipo di query è appropriato (c'è un nome per questo ... Sto disegnando un vuoto al momento).

Personalmente, quando ho iniziato con SQL, ho trovato il riferimento the W3 schools come il mio punto di arresto costante. Si adatta al mio stile per essere qualcosa che posso dare un'occhiata per trovare una risposta rapida e andare avanti.Alla fine, comunque, per sfruttare davvero il database è necessario approfondire la documentazione dei fornitori.

Sebbene SQL sia "standarizzato", sfortunatamente (sebbene, in una certa misura, fortunatamente), ogni fornitore di database implementa la propria versione con le proprie estensioni, il che può portare a una sintassi molto diversa tra quelle più appropriate (per una discussione di le incompatibilità di vari database su un problema si trovano nello SQLite documentation on NULL handling. In particolare, le funzioni standard, ad esempio per la gestione di DATE e TIME tendono a differire per fornitore, e ci sono altre differenze più drastiche (in particolare non supportano le sottosezioni o gestiscono correttamente le JOIN) Se si cura di alcuni dettagli, this document fornisce sia i moduli standard sia le deviazioni per diversi database principali:

+0

(Re: query nominate e ottimizzatore) A questo punto mi interessa scrivere query di buona lettura; Mi preoccuperò dell'ottimizzazione/prestazioni in seguito. Penso che sia il modo migliore per imparare la maggior parte delle lingue; Spero sia anche vero per SQL. – polygenelubricants

Problemi correlati