Основы SQL
333
Функция мах удобна для вычисления максимального значения указанного
поля:
SELECT MAX(price)
FROM books;
П3.11. Группировка записей.
Сложные запросы
До этого мы выполняли запросы только к одной таблице. В самом простом
случае этого достаточно. Но рано или поздно вам потребуется создать
сложный проект, в котором придется выбирать записи из нескольких таблиц
сразу. Тогда вам будет необходимо или выбирать все записи из нужных таблиц и
писать процедуру обработки данных на РНР, или же просто учить SQL. Ведь
намного проще передать запрос, а потом вывести его результат, чем вручную
обрабатывать данные, так что пусть за нас это сделает СУБД.
Предположим, что мы создаем небольшой интернет-магазин. Поэтому у нас
будут три таблицы: клиенты, товары и заказы (листинг П3.2).
CREATE TABLE CUSTOMERS
C_NO
LOGIN
PASS
FIO
ADDRESS
CITY
PHONE
int
varchar(32)
varchar(32)
varchar(32)
varchar(40)
varchar(50)
varchar(25)
varchar(11)
auto_increment,
NOT NULL,
NOT NULL,
NOT NULL,
NOT NULL,
NOT NULL,
NOT’NULL,
NOT NULL,
PRIMARY KEY (C_NO)
>;
CREATE TABLE GOODS
(
G NO
int
auto increment,
334
Приложения
DESCR varchar(40)
PRICE double(9,2)
QTY int
PRIMARY KEY (G_NO)
);
CREATE TABLE ORDERS
(
0_NO int
DT date,
C_NO int
G_NO int
QTY int
primary key(0_NO)
>;
Думаю, назначение полей этих таблиц понятно и без моих комментариев.
Сделаю только несколько небольших замечаний. Во-первых, мы продавать
будем не сахар и не картошку, поэтому количество товара (поле qty) везде
целочисленное: две книги, один мобильный телефон и т. д. Во-вторых,
индексы определены сразу, следовательно, cno, g_no и ono — уникальные
номера клиента, товара и заказа соответственно. В-третьих, поле descr
содержит название товара. Конечно, на самом деле оно должно содержать еще
и описание, а кроме того, должно быть поле title с названием товара и поля
art и photo, содержащие артикул товара и имя файла фотографии
соответственно, но ведь это экспериментальная база и наша цель — не создание
реального интернет-магазина, а изучение SQL, поэтому я упростил структуру
таблиц до допустимого минимума.
После создания таблиц заполните их данными по своему усмотрению.
Предположим, что в нашем магазине зарегистрировалось минимум два клиента,
каждый из которых сделал несколько заказов. Нужно вычислить общую
сумму всех заказов для каждого клиента. Для этого нам потребуется
информация из всех трех таблиц:
? из customers, чтобы вывести информацию о клиенте (для простоты
будем выводить только фамилию);
? из goods — ведь нам нужно знать цену каждого товара;
? из orders, чтобы узнать, сколько заказали того или иного товара.
NOT NULL,
NOT NULL,
NOT NULL,
auto_increment,
NOT NULL,
NOT NULL,
NOT NULL,
Приложение 3. Основы SQL
335
Введите следующий запрос:
SELECT CUSTOMERS.FIO, SUM( GOODS.PRICE * ORDERS.QTY ) AS A
FROM CUSTOMERS, GOODS, ORDERS
WHERE CUSTOMERS.C_NO = ORDERS.C_NO
GROUP BY ORDERS.C_NO;
Сразу скажу, что этот запрос неправильный, однако на его примере
рассмотрим несколько важных моментов. Мы выбираем только фамилию клиента,
затем функция sum подсчитывает сумму заказа, умножая цену товара
(goods.price) на количество заказанного товара (orders.qty). Результат
работы этой функции будет представлен как поле а (вы можете назвать это
поле по-своему).
Обратите внимание на то, что выборка производится из всех трех
таблиц (customers, goods и orders). Мы выбираем тех клиентов, которые есть в
таблице заказов (customers . c_no = orders . cno), а группировку записей
осуществляем по полю orders, cno. Вы уже заметили, как легко указать
СУБД, к какой таблице обращаться: для этого просто нужно написать имя
таблицы, а через точку — имя поля?
А теперь — почему этот запрос неправильный. Мы выполнили группировку
заказов, и если в таблице orders есть несколько заказов от одного и того же
клиента, вы заметите, что группировка выполняется верно, но сумма заказа
вычисляется неправильно.
5th Фев 2011
|
Теги:
|