Глава 12. Выборка из таблицы

Пришло время познакомиться с другими возможностями команды SELECT.

Во-первых, можно изменить порядок выдачи записей. Для этого в конец запроса добавляется фраза ORDER BY … . Например, можно вывести записи о планетах в порядке возрастания их диаметров:

test54=# SELECT * FROM planet ORDER BY diameter;
   name   | token | diameter |    mass    | orbit  
----------+-------+----------+------------+--------
 Меркурий | ☿     |     4880 |    3.3e+23 |   0.38
 Марс     | ♂     |     6794 | 6.4219e+23 |   1.52
 Венера   | ♀     |  12103.6 |  4.869e+24 |   0.72
 Земля    | ♁     |  12756.3 | 5.9736e+24 |      1
 Нептун   | ♆     |    49532 | 1.0247e+26 |  30.06
 Уран     | ♅     |    51118 |  8.683e+25 | 19.218
 Сатурн   | ♄     |   120536 |   5.68e+26 |   9.54
 Юпитер   | ♃     |   142984 |    1.9e+27 |    5.2
(8 rows)

Противоположный порядок можно получить, добавив фразу ORDER BY … DESC:

test54=# SELECT * FROM planet ORDER BY diameter DESC;
   name   | token | diameter |    mass    | orbit  
----------+-------+----------+------------+--------
 Юпитер   | ♃     |   142984 |    1.9e+27 |    5.2
 Сатурн   | ♄     |   120536 |   5.68e+26 |   9.54
 Уран     | ♅     |    51118 |  8.683e+25 | 19.218
 Нептун   | ♆     |    49532 | 1.0247e+26 |  30.06
 Земля    | ♁     |  12756.3 | 5.9736e+24 |      1
 Венера   | ♀     |  12103.6 |  4.869e+24 |   0.72
 Марс     | ♂     |     6794 | 6.4219e+23 |   1.52
 Меркурий | ☿     |     4880 |    3.3e+23 |   0.38
(8 rows)

Имеется возможность выводить не все колонки таблицы, или изменить порядок колонок при выводе. Для этого нужно заменить звёздочку в запросе SELECT на список полей (через запятую).

test54=# SELECT name, mass FROM planet ORDER BY name;
   name   |    mass    
----------+------------
 Венера   |  4.869e+24
 Земля    | 5.9736e+24
 Марс     | 6.4219e+23
 Меркурий |    3.3e+23
 Нептун   | 1.0247e+26
 Сатурн   |   5.68e+26
 Уран     |  8.683e+25
 Юпитер   |    1.9e+27
(8 rows)

Можно ограничить список выводимых колонок, наложив условие, которому должны удовлетворять выводимые записи. Сейчас будут выведены записи о планетах, которые расположены ближе к Солнцу, чем Земля. Условием отбора записей будет неравенство orbit<1:

test54=# SELECT * FROM planet WHERE orbit<1 ORDER BY orbit;
   name   | token | diameter |   mass    | orbit 
----------+-------+----------+-----------+-------
 Меркурий | ☿     |     4880 |   3.3e+23 |  0.38
 Венера   | ♀     |  12103.6 | 4.869e+24 |  0.72
(2 rows)

При помощи запроса SELECT можно выводить не только значения полей таблицы, но и значения выражений, в которых участвуют поля. Попросим вывести названия планет и среднюю плотность их вещества, вычисляемую по формуле ρ = m V , V = π D 3 6 . Здесь ρ — средняя плотность, m — масса планеты, D — её диаметр. Таким образом, ρ = 6 m π D 3 . Выведем названия планет и их плотности (в кг/м3):

test54=# SELECT name, 1E-9*6*mass/3.1415926/diameter^3 FROM planet;
   name   |     ?column?     
----------+------------------
 Меркурий | 5423.20300055831
 Венера   | 5244.42083382882
 Земля    |  5496.2105803137
 Марс     | 3911.00452011731
 Юпитер   | 1241.34547590606
 Сатурн   | 619.440218250837
 Уран     | 1241.50823272514
 Нептун   | 1610.42514063507
(8 rows)

(множитель 1E-9 нужен для перевода из кг/км3 в кг/м3). В выражении кроме привычных в компьютерных программах арифметических операторов *, / использован оператор ^ возведения в степень.

К сожалению, колонка с плотностью не имела названия, поэтому в качестве названия выведено ?column?. Это легко исправить. Дадим при запросе этой колонке имя density и попросим выводить записи по возрастанию плотности:

test54=# SELECT name, 1E-9*6*mass/3.1415926/diameter^3 AS density
test54-# FROM planet ORDER BY density;
   name   |     density      
----------+------------------
 Сатурн   | 619.440218250837
 Юпитер   | 1241.34547590606
 Уран     | 1241.50823272514
 Нептун   | 1610.42514063507
 Марс     | 3911.00452011731
 Венера   | 5244.42083382882
 Меркурий | 5423.20300055831
 Земля    |  5496.2105803137
(8 rows)

Информатика-54