[16-10-2009] Джо
Выборка данных из баз данных MySQL осуществляется запросами с оператором SELECT. Простейшие формы таких запросов рассмотрены в статьях о простом скрипте поиска и его модификации. В этой статье рассмотрена уже чуть более полная форма оператора SELECT, позволяющая организовать более сложные и интересные запросы.
Вот что я оставил от SELECT для первого знакомства:
SELECT <имя_поля1>,..., <имя_поляN>
[FROM <имя_таблицы1>,...,<имя_таблицыM>
[WHERE <условие>]
[GROUP BY {<группировка1>, ...<группировкаL>]
[HAVING <условие_для_групп>]
[ORDER BY <имя_поля1> [DESC],..., <имя_поляR> [DESC]]
[LIMIT [<номер_строки>,] <количество_строк>]]
здесь:
SELECT - выбрать наборы полей
FROM - из таблиц
WHERE - где соблюдено условие
GROUP BY - сгруппированные по именам полей
HAVING - для групп справедливо условие
ORDER BY - упорядоченные по именам полей ( по умолчанию - возрастание, DESC - убывание )
LIMIT - начиная с номера строки, в количестве
Для работы с группировками в запросе нужно знать еще 5 групповых функций:
MAX() - максимальное значение в колонке
MIN()- минимальное значение в колонке
COUNT() - количество значений в колонке
SUM() - сумма всех значений в колонке
AVG() - среднее значение
Оператор SELECT позволяет выбирать значения полей из нескольких таблиц. Как это сделать - посмотрим на примере 2х таблиц:
В первой таблице rkz - данные рюкзаков: название, производитель, литраж.
| nazv | proizv | litr |
|---|---|---|
| Кондор 80 | Терра | 80 |
| Lhotse CD-100 | RedFox | 100 |
| Macalu CD 60 | RedFox | 60 |
| Атлант - 90 | Normal | 90 |
| KIMBERLY 80 1404 | Tatonka | 80 |
| KATANGA 60 | Tatonka | 60 |
Во второй таблице ts - цены на рюкзаки в разных магазинах: название, магазин, цена.
| nazv | mag | tsena |
|---|---|---|
| Кондор 80 | Спортбаза | 890 |
| Кондор 80 | Туристёнок | 900 |
| Кондор 80 | Туритура | 910 |
| Lhotse CD-100 | Спортбаза | 3850 |
| Атлант - 90 | Туритура | 3100 |
| Атлант - 90 | Спортбаза | 3070 |
| KIMBERLY 80 1404 | Спортбаза | 7500 |
| KIMBERLY 80 1404 | Туритура | 7600 |
| KIMBERLY 80 1404 | Туристёнок | 7620 |
| KATANGA 60 | Спортбаза | 8100 |
| KATANGA 60 | Туритура | 8105 |
| KATANGA 60 | Туристёнок | 8092 |
Допустим, нам нужно вывести название рюкзака, его литраж, магазин и цену.
Это такой запрос:
SELECT rkz.nazv, rkz.litr, ts.mag, ts.tsena FROM ts,rkz WHERE rkz.nazv=ts.nazv
Здесь:
rkz.nazv, rkz.litr - поля nazv и litr из таблицы rkz;
ts.mag, ts.tsena - поля mag и tsena из таблицы ts;
WHERE rkz.nazv=ts.nazv - условие связывания строк таблиц - равенство значений поля nazv в обеих таблицах.
Для получения осмысленного результата запроса необходимо, чтобы в одной из объединяемых таблиц значение поля, по которому связываются строки, было уникальным.
Результат выполнения запроса:
| nazv | litr | mag | tsena |
|---|---|---|---|
| Кондор 80 | 80 | Спортбаза | 890 |
| Кондор 80 | 80 | Туристёнок | 900 |
| Кондор 80 | 80 | Туритура | 910 |
| Lhotse CD-100 | 100 | Спортбаза | 3850 |
| Атлант - 90 | 90 | Туритура | 3100 |
| Атлант - 90 | 90 | Спортбаза | 3070 |
| KIMBERLY 80 1404 | 80 | Спортбаза | 7500 |
| KIMBERLY 80 1404 | 80 | Туритура | 7600 |
| KIMBERLY 80 1404 | 80 | Туристёнок | 7620 |
| KATANGA 60 | 60 | Спортбаза | 8100 |
| KATANGA 60 | 60 | Туритура | 8105 |
| KATANGA 60 | 60 | Туристёнок | 8092 |
Можно заметить, что рюкзак Macalu CD 60, которого нет во второй таблице, в результат запроса не попадает.