Joomla портал
seo seo Subscribe
seo
0
seo

Основы SQL

333

Функция мах удобна для вычисления максимального значения указанного

поля:

SELECT MAX(price)

FROM books;

П3.11. Группировка записей.

Сложные запросы

До этого мы выполняли запросы только к одной таблице. В самом простом

случае этого достаточно. Но рано или поздно вам потребуется создать

сложный проект, в котором придется выбирать записи из нескольких таблиц

сразу. Тогда вам будет необходимо или выбирать все записи из нужных таблиц и

писать процедуру обработки данных на РНР, или же просто учить SQL. Ведь

намного проще передать запрос, а потом вывести его результат, чем вручную

обрабатывать данные, так что пусть за нас это сделает СУБД.

Предположим, что мы создаем небольшой интернет-магазин. Поэтому у нас

будут три таблицы: клиенты, товары и заказы (листинг П3.2).

CREATE TABLE CUSTOMERS

C_NO

LOGIN

PASS

EMAIL

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 есть несколько заказов от одного и того же

клиента, вы заметите, что группировка выполняется верно, но сумма заказа

вычисляется неправильно.

seo
5th Фев 2011
Теги:
seo

Написать ответ

seo
 
Все права защищены © 2023 Joomla портал
 
 
seo