2013-03-26 17 views
16

Desidero ordinare la tabella dei prodotti in base a due colonne: prod_price e prod_name.SQL ORDER BY multiple columns

SELECT prod_id, prod_price, prod_name 
FROM Products 
ORDER BY prod_price, prod_name; 

Come viene eseguito lo smistamento? Penso che accada prima da prod_price e poi da prod_name. Inoltre, come è la query sopra diverso da questo:

SELECT prod_id, prod_price, prod_name 
FROM Products 
ORDER BY prod_name; 

Il mio tavolo prodotti è la seguente:

CREATE TABLE Products 
(
    prod_id char(10)  NOT NULL , 
    vend_id char(10)  NOT NULL , 
    prod_name char(255)  NOT NULL , 
    prod_price decimal(8,2) NOT NULL , 
    prod_desc text   NULL 
); 

risposta

29

L'ordinamento in un ORDER BY viene eseguito dalla prima colonna e quindi da ciascuna colonna aggiuntiva nell'istruzione specificata.

Ad esempio, considerare i seguenti dati:

Column1 Column2 
======= ======= 
1   Smith 
2   Jones 
1   Anderson 
3   Andrews 

La query

SELECT Column1, Column2 FROM thedata ORDER BY Column1, Column2 

sarebbe ordina per tutti i valori in Column1

e quindi ordinare le colonne da Column2 a Produrre questo:

Column1 Column2 
======= ======= 
1   Anderson 
1   Smith 
2   Jones 
3   Andrews 

In altre parole, i dati vengono ordinati per la prima volta nell'ordine Column1, quindi ciascun sottoinsieme (Column1 righe che hanno il valore 1) viene ordinato nell'ordine della seconda colonna.

La differenza tra le due affermazioni che hai postato è che le righe nel primo sarebbero state ordinate per primo da prod_price (ordine di prezzo, dal più basso al più alto), e quindi per ordine di nome (nel senso che se due elementi hanno il stesso prezzo, quello con il valore alfa inferiore per il nome sarebbe elencato per primo), mentre il secondo dovrebbe essere ordinato solo in ordine alfabetico (ciò significa che i prezzi apparirebbero in ordine in base allo prod_name senza riguardo per il prezzo).

+0

E solo per divertimento (ma non solo per divertimento): c'è un altro modo per ordinare i dati in DBMS che supporta la sintassi della finestra: 'selezionare *, contare (*) sopra (ordina per Colonna1, Colonna2) da thedata' – Abelisto

0

Sì, l'ordinamento è diverso.

Gli articoli nell'elenco ORDER BY sono applicati in ordine.
Gli articoli successivi ordinano solo i peer rimasti dal passaggio precedente.

Perché non ti basta provare?

+0

Penso che l'ordinamento per prod_name venga eseguito solo quando colonne prod_price hanno gli stessi valori altrimenti viene ordinato per nome_prodotto. Per favore, dimmi se sono corretto – user2201462

+0

@ user2201462: Ecco cosa significa la parola * peer *. Queste righe sono tutte uguali per quanto riguarda un certo oggetto "ORDINA PER". Solo quelli sono soggetti all'elemento successivo. –

1

Dipende dalle dimensioni del database.

SQL si basa sulla teoria SET: non esiste un ordine intrinsecamente utilizzato quando si esegue una query su una tabella.

Quindi, se dovessi eseguire la prima query, ordinerebbe per primo il prezzo del prodotto e poi il nome del prodotto, se ci fossero duplicati nella categoria di prezzo, ad esempio $ 20, quindi ordinerebbe quei duplicati con il loro nome , quindi, sempre mantenendo che quando si esegue la query restituirà sempre lo stesso insieme di risultati nello stesso ordine.

Se si dovesse eseguire la seconda query, sarebbe possibile ordinare solo in base al nome, quindi se ci fossero due prodotti con lo stesso nome (per qualche strano motivo) allora non avrebbero un ordine garantito dopo aver eseguito il query.

5

I risultati sono ordinati in base alla prima colonna, quindi al secondo e così via per il numero di colonne incluso nella clausola ORDER BY. Se desideri che i risultati siano ordinati in ordine decrescente, la tua clausola ORDER BY deve utilizzare la parola chiave DESC direttamente dopo il nome o il numero della colonna pertinente.

Partenza questo esempio

SELECT first_name, last_name, hire_date, salary 
FROM employee 
ORDER BY hire_date DESC,last_name ASC; 

Sarà ordinare in successione. Ordina prima il Hire_Date, poi LAST_NAME di Hire_Date.

1

sì, l'ordinamento procede in modo diverso. in primo scenario, ordini basati su colonna1 e in aggiunta a tale processo ulteriormente ordinando colmun2 basato su colonna1 .. in secondo scenario, ordina completamente basato solo sulla colonna 1 ... si prega di procedere con un semplice esempio ... Otterrai rapidamente ..