[18-10-2009] Джо
Начало статьи об операторе SELECT
GROUP BY группирует результат SELECT по значениям какого-либо поля ( полей ). Использовать GROUP BY имеет смысл только вместе с одной из аналитических групповых функций
MAX() - максимальное значение в колонке
MIN()- минимальное значение в колонке
COUNT() - количество значений в колонке
SUM() - сумма всех значений в колонке
AVG() - среднее значение
К примеру, если нужно узнать из таблиц, определенных в 1й части статьи, магазины, в которых минимальные цены на рюкзаки, и сами минимальные цены, необходимо сделать следующий запрос:
SELECT rkz.nazv, ts.mag, MIN(ts.tsena) FROM ts,rkz WHERE rkz.nazv=ts.nazv GROUP BY rkz.nazv
Результат выполнения запроса:
| nazv | mag | tsena |
|---|---|---|
| KATANGA 60 | Спортбаза | 8092 |
| KIMBERLY 80 1404 | Спортбаза | 7500 |
| Lhotse CD-100 | Спортбаза | 3850 |
| Атлант - 90 | Туритура | 3070 |
| Кондор 80 | Спортбаза | 890 |
Если нужно ограничить значение минимальной цены, нужно использовать предложение HAVING:
SELECT rkz.nazv, ts.mag, MIN(ts.tsena) FROM ts,rkz WHERE rkz.nazv=ts.nazv GROUP BY rkz.nazv HAVING MIN(ts.tsena)<5000
Результат выполнения запроса:
| nazv | mag | tsena |
|---|---|---|
| Lhotse CD-100 | Спортбаза | 3850 |
| Атлант - 90 | Туритура | 3070 |
| Кондор 80 | Спортбаза | 890 |
Если необходимо выбрать только рюкзаки с литражом больше 80 литров, условие добавляется в предложение WHERE:
SELECT rkz.nazv, ts.mag, MIN(ts.tsena) FROM ts,rkz WHERE rkz.nazv=ts.nazv AND rkz.litr>80 GROUP BY rkz.nazv HAVING MIN(ts.tsena)<5000
Результат выполнения запроса:
| nazv | mag | tsena |
|---|---|---|
| Lhotse CD-100 | Спортбаза | 3850 |
| Атлант - 90 | Туритура | 3070 |
Видно, что при вводе ограничения на значение групповой операции используется HAVING, а при введении ограничения на значение поля - WHERE
Упорядочить результат выполнения запроса для его анализа имеет смысл, если результат ожидается достаточно большим.
К примеру, запрос из Начала статьи об операторе SELECT будет иметь такой вид:
SELECT rkz.nazv, rkz.litr, ts.mag, ts.tsena FROM ts,rkz WHERE rkz.nazv=ts.nazv ORDER BY rkz.nazv
Результат выполнения запроса:
| nazv | litr | mag | tsena |
|---|---|---|---|
| KATANGA 60 | 60 | Туристёнок | 8092 |
| KATANGA 60 | 60 | Спортбаза | 8100 |
| KATANGA 60 | 60 | Туритура | 8105 |
| KIMBERLY 80 1404 | 80 | Спортбаза | 7500 |
| KIMBERLY 80 1404 | 80 | Туритура | 7600 |
| KIMBERLY 80 1404 | 80 | Туристёнок | 7620 |
| Lhotse CD-100 | 100 | Спортбаза | 3850 |
| Атлант - 90 | 90 | Туритура | 3100 |
| Атлант - 90 | 90 | Спортбаза | 3070 |
| Кондор 80 | 80 | Спортбаза | 890 |
| Кондор 80 | 80 | Туристёнок | 900 |
| Кондор 80 | 80 | Туритура | 910 |
По умолчанию идет сортировка по возрастанию, если необходима сортировка по убыванию - указывается параметр DESC
SELECT rkz.nazv, rkz.litr, ts.mag, ts.tsena FROM ts,rkz WHERE rkz.nazv=ts.nazv ORDER BY rkz.nazv DESC
Результат выполнения запроса:
| nazv | litr | mag | tsena |
|---|---|---|---|
| Кондор 80 | 80 | Спортбаза | 890 |
| Кондор 80 | 80 | Туристёнок | 900 |
| Кондор 80 | 80 | Туритура | 910 |
| Атлант - 90 | 90 | Туритура | 3100 |
| Атлант - 90 | 90 | Спортбаза | 3070 |
| Lhotse CD-100 | 100 | Спортбаза | 3850 |
| KIMBERLY 80 1404 | 80 | Спортбаза | 7500 |
| KIMBERLY 80 1404 | 80 | Туритура | 7600 |
| KIMBERLY 80 1404 | 80 | Туристёнок | 7620 |
| KATANGA 60 | 60 | Туристёнок | 8092 |
| KATANGA 60 | 60 | Спортбаза | 8100 |
| KATANGA 60 | 60 | Туритура | 8105 |
В случае очень большого количества строк в результате запроса имеет смысл ограничить количество строк. Для этого используют предложение LIMIT с 2мя числовыми параметрами: номером первой выводимой строки и количеством выводимых строк. В случае одного параметра выводится количество строк, равное этому параметру, начиная с 1й.
SELECT rkz.nazv, rkz.litr, ts.mag, ts.tsena FROM ts,rkz WHERE rkz.nazv=ts.nazv ORDER BY rkz.nazv DESC LIMIT 5
Результат выполнения запроса:
| nazv | litr | mag | tsena |
|---|---|---|---|
| Кондор 80 | 80 | Спортбаза | 890 |
| Кондор 80 | 80 | Туристёнок | 900 |
| Кондор 80 | 80 | Туритура | 910 |
| Атлант - 90 | 90 | Туритура | 3100 |
| Атлант - 90 | 90 | Спортбаза | 3070 |
SELECT rkz.nazv, rkz.litr, ts.mag, ts.tsena FROM ts,rkz WHERE rkz.nazv=ts.nazv ORDER BY rkz.nazv DESC LIMIT 3,5
Результат выполнения запроса:
| nazv | litr | mag | tsena |
|---|---|---|---|
| Атлант - 90 | 90 | Туритура | 3100 |
| Атлант - 90 | 90 | Спортбаза | 3070 |
| Lhotse CD-100 | 100 | Спортбаза | 3850 |
| KIMBERLY 80 1404 | 80 | Спортбаза | 7500 |
| KIMBERLY 80 1404 | 80 | Туритура | 7600 |