Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
для студентов РУБД / Лаб раб 4 курс.doc
Скачиваний:
60
Добавлен:
21.03.2016
Размер:
635.39 Кб
Скачать

Максимальное значение столбца

SELECT MAX(article) AS article FROM shop

article

4

"Как определить номер, дилера и цену самого дорогого изделия?"

SELECT article, dealer, price FROM shop WHERE price=(SELECT MAX(price) FROM shop)

Следует получить максимальное значение цены из таблицы при помощи оператора SELECT, используя это значение, необходимо составить следующий запрос:

SELECT article, dealer, price FROM shop WHERE price=19.95

Существует еще одно решение: отсортировать все строки по убыванию цен и после этого получить первую строку, используя специальный оператор LIMIT:

SELECT article, dealer, priceFROM shop ORDER BY price DESC LIMIT 1

Примечание: если существует несколько самых дорогих изделий (например, каждое из них стоит 19,95), запрос, использующий LIMIT, возвращает лишь одно из них!

Как определить наибольшую цену по каждому изделию?

SELECT article, MAX(price) AS price FROM shop GROUP BY article

article

|price

0001

3.99

0002

10.99

0003

1.69

0004

19.95

Для каждого изделия, как определить дилер(ов) с самыми высокими ценами?

SELECT article, dealer, price FROM shop s1 WHERE price=

(SELECT MAX(s2.price) FROM shop s2 WHERE s1.article = s2.article);

1.Следует получить список (изделие, максимальная цена)

2.Для каждого изделия, получить соответствующие записи, в которых цена соответствует максимальной.

Это легко делается с помощью временной таблицы:

CREATE TEMPORARY TABLE tmp ( article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL, price DOUBLE(16,2) DEFAULT '0.00' NOT NULL);

LOCK TABLES shop read;

INSERT INTO tmp SELECT article, MAX(price) FROM shop GROUP BY article;

SELECT shop.article, dealer, shop.price FROM shop, tmp

WHERE shop.article=tmp.article AND shop.price=tmp.price;

UNLOCK TABLES;

DROP TABLE tmp;

Если не использовать ключевое слово TEMPORARY, следует поставить блокировку на таблицу tmp.

"А можно ли это сделать одним запросом?"

SELECT article, SUBSTRING( MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 7) AS dealer,00+LEFT( MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 6) AS price FROM shop GROUP BY article;

article

dealer

price

0001

B

3.99

0002

A

10.99

0003

C

1.69

0004

D

19.95

Использование пользовательских переменных

В MySQL для хранения результатов, чтобы не держать их во временных переменных на клиенте, можно применять пользовательские переменные

Например, для того чтобы найти изделия с максимальной или минимальной ценой, можно выполнить следующие действия:

mysql> SELECT @min_price:=MIN(price),@max_price:=MAX(price) FROM shop;

mysql> SELECT * FROM shop WHERE price=@min_price OR price=@max_price;

article

dealer

price

0003

D

1.25

0004

D

19.95

Поиск по двум ключам

MySQL пока не осуществляет оптимизации, если поиск производится по двум различным ключам, которые связаны при помощи оператора OR (поиск по одному ключу с различными частями OR оптимизируется хорошо):

SELECT field1_index, field2_index FROM test_table WHERE field1_index = '1'OR field2_index = '1'

В настоящее время данную проблему очень эффективно можно решить при помощи временной таблицы. Этот способ оптимизации также хорошо подходит, если вы запускаете очень сложные запросы, когда SQL-сервер делает оптимизацию в неправильном порядке.

CREATE TEMPORARY TABLE tmp

SELECT field1_index, field2_index FROM test_table WHERE field1_index = '1';

INSERT INTO tmp

SELECT field1_index, field2_index FROM test_table WHERE field2_index = '1';

SELECT * from tmp;

DROP TABLE tmp;

Вышеупомянутый способ выполнения этого запроса - это фактически UNION (объединение) двух запросов.

Подсчет посещений за день

В этом разделе представлен пример использования групповых побитовых функций для вычисления дней месяца, когда пользователь заходил на веб-сайт.

CREATE TABLE t1 (year YEAR(4), month INT(2) UNSIGNED ZEROFILL,day INT(2) UNSIGNED ZEROFILL);

INSERT INTO t1 VALUES(2000,1,1),(2000,1,20),(2000,1,30),(2000,2,2),(2000,2,23),(2000,2,23);

SELECT year,month,BIT_COUNT(BIT_OR(1<<day)) AS days FROM t1 GROUP BY year,month;

year

month

days

2000

01

3

2000

02

2

Этот запрос подсчитывает, сколько различных дней входит в данную комбинацию год/месяц, автоматически исключая дублирующиеся значения.

ПРИЛОЖЕНИЕ 4

Рисунок 5 - Концептуальная модель учебной базы данных

Таблица поставщиков (S)

Hомеp поставщика

Фамилия

Рейтинг

Город

S1

Смит

20

Лондон

S2

Джонс

10

Париж

S3

Блейк

30

Париж

S4

Кларк

20

Лондон

S5

Адамс

30

Афины

Таблица деталей (P)

Номер детали

Название

Цвет

Вес

Город

P1

Гайка

Красный

12

Лондон

P2

Болт

Зеленый

17

Париж

P3

Винт

Голубой

17

Рим

P4

Винт

Красный

14

Лондон

P5

Кулачок

Голубой

12

Париж

P6

Блюм

Красный

19

Лондон

Таблица изделий (J)

Номер изделия

Название

Город

J1

Жесткий диск

Париж

J2

Перфоратор

Рим

J3

Считыватель

Афины

J4

Принтер

Афины

J5

Флоппи-диск

Лондон

J6

Терминал

Осло

J7

Лента

Лондон

Таблица поставок (SPJ)

Номер поставщика

Номер детали

Номер изделия

Количество

Дата поставки

S1

P1

J1

200

S1

P1

J4

700

S2

P3

J1

400

S2

P3

J2

200

S2

P3

J3

200

S2

P3

J4

500

S2

P3

J5

600

S2

P3

J6

400

S2

P3

J7

800

S2

P5

J2

100

S3

P3

J1

200

S3

P4

J2

500

S4

P6

J3

300

S4

P6

J7

300

S5

P2

J2

200

S5

P2

J4

100

S5

P5

J5

500

S5

P5

J7

100

S5

P6

J2

200

S5

P1

J4

100

S5

P3

J4

200

S5

P4

J4

800

S5

P5

J4

400

S5

P6

J4

500

3. Выполнить два запроса из списка к базе данных,

  1. Для каждой поставляемой для некоторого изделия детали выдать ее номер, номер изделия и соответствующее общее поставляемое количество деталей.

  2. Выдать все триплеты "номер поставщика, номер детали и номер изделия", такие, что в каждом триплете указанные поставщик, деталь и изделие не являются попарно соразмещенными в одном городе.

  3. Выдать номера изделий, для которых детали полностью поставляет поставщик S1. Т.е. поставляемых поставщиком S1 деталей достаточно для полного комплектования изделия. Состав деталей изделия можно оценить на основе базового набора данных таблицы поставка, имея в виду что в базовом наборе данных отражен полный состав всех изделий.

  4. Выдать номера и фамилии поставщиков, поставляющих детали для какого-либо изделия с деталью P1 в количестве, большем, чем средний объем поставок детали P1 для этого изделия.

  5. Выдать общее количество деталей P1, поставляемых поставщиком S1.

  6. Выдать все пары названий городов, таких, что какой-либо поставщик из первого города поставляет детали для некоторого изделия, изготовляемого во втором городе.

  7. Выдать номера изделий, использующих только детали, поставляемые поставщиком S1.

  8. Выдать номера деталей, поставляемых каким-либо поставщиком из Лондона, для изделия, изготавливаемого также в Лондоне.

  9. Выдать номера и фамилии поставщиков, поставляющих одну и ту же деталь для всех перечисленных изделий. Перечень изделий согласовать с преподавателем.

  10. Выдать общее число изделий (не деталей), для которых поставляет детали поставщик S1.

  11. Выдать номера изделий, детали для которых поставляет каждый поставщик, поставляющий какую-либо красную деталь. Т.е. необходимо получить такие номера изделий, детали для которой поставляются всеми поставщиками, среди поставляемых деталей которого есть детали красного цвета.

  12. Выдать все триплеты "номер поставщика, номер детали и номер изделия", такие, что в каждом триплете указанные поставщик, деталь и изделие являются попарно соразмещенными в одном городе.

  13. Выдать номера и фамилии поставщиков, поставляющих по крайней мере одну деталь, поставляемую по крайней мере одним поставщиком, который поставляет по крайней мере одну красную деталь. Т.е. необходимо выдать полные сведения о всех поставщиках которые поставляют такие детали, которые есть в поставках поставщиков, поставляющих красные детали.

  14. Выдать список деталей, поставляющихся для всех изделий, изготавливаемых в Лондоне.

  15. Выдать номера деталей, поставляемых каким-либо поставщиком из Лондона.

  16. Выдать номера деталей, поставляемых для какого-либо изделия из Лондона.

  17. Выдать номера изделий, для которых детали поставляются по крайней мере одним поставщиком не из того же самого города, что и изделие.

  18. Выдать список всех поставок, в которых количество деталей находится в диапазоне от 300 до 750 включительно.

  19. Выдать номера изделий, использующих, по крайней мере, одну деталь, поставляемую поставщиком S1. Т.е. показать такие изделия, для производства которых пригодились бы детали, поставляемые поставщиком S1.

  20. Выдать номера и названия деталей, поставляемых для какого-либо изделия в Лондоне.