
- •1. Подготовка и допуск к работе
- •2. Содержание отчета
- •Лабораторная работа №15
- •Лабораторная работа № 16
- •Пример: backup table vines,query,client,distributor,delivery to c:/mysql_bak';
- •Удалены 3 таблицы. Теперь восстановим их.
- •Пример: optimizetablEmytable
- •Лабораторная работа №17
- •Значение usage можно задавать, если необходимо создать пользователя без привилегий.
- •Примеры:
- •Доступ к MySql из сети
- •С помощью утилиты Mysqlshow выполните команду на просмотр структуры и состав таблиц базы Mysql. Приведите в отчете её схему.
- •Лабораторная работа №18
- •Тема: Файлы журналов MySql Репликация в MySql
- •Цель: Формирование умений и знаний для работы в среде субд Mysql.
- •Журнал ошибок
- •Общий журнал запросов
- •Журнал обновлений (update)
- •Бинарный журнал обновлений
- •Журнал медленных запросов
- •Обслуживание файлов журналов
- •Репликация в MySql
- •Настройка репликации
- •Лабораторная работа № 19-20
- •Сохраненные процедуры и функции
- •Сохраненные подпрограммы и таблицы предоставления привилегий
- •Синтаксис хранимых процедур
- •Синтаксис alter procedure и alter function
- •Синтаксис drop procedure и drop function
- •Синтаксис команды call
- •Синтаксис составного оператора begin ... End
- •Синтаксис declare
- •Переменные в сохраненных подпрограммах Локальные переменные declare
- •Команда set
- •Команда select ... Into
- •Условия и драйверы
- •Declare условий
- •Declare драйвера
- •Курсоры
- •Объявление курсоров
- •Инструкция case
- •Инструкция loop
- •Инструкция leave
- •Инструкция iterate
- •5.2.10.6. Инструкция repeat
- •Инструкция while
- •Задание
- •Приложение а
- •Демонстрируется использование mysql в качестве несложного калькулятора:
- •Проверка таблицы при помощи команды describe:
- •Выборка всех данных
- •Выборка определенных строк. Выборка с условием
- •Операторы and и or можно использовать совместно.
- •Предположим, нужно узнать, в каком возрасте животные давали приплод:
- •В этом запросе мы указываем псевдонимы имен таблицы, для обращения к столбцам и определения, к какой из таблиц относится каждая ссылка на столбец.
- •Сортировку можно проводить по нескольким столбцам сразу.
- •Отсортировать результаты по возрасту также можно при помощи выражения orderby:
- •Максимальное значение столбца
Максимальное значение столбца
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. Выполнить два запроса из списка к базе данных,
Для каждой поставляемой для некоторого изделия детали выдать ее номер, номер изделия и соответствующее общее поставляемое количество деталей.
Выдать все триплеты "номер поставщика, номер детали и номер изделия", такие, что в каждом триплете указанные поставщик, деталь и изделие не являются попарно соразмещенными в одном городе.
Выдать номера изделий, для которых детали полностью поставляет поставщик S1. Т.е. поставляемых поставщиком S1 деталей достаточно для полного комплектования изделия. Состав деталей изделия можно оценить на основе базового набора данных таблицы поставка, имея в виду что в базовом наборе данных отражен полный состав всех изделий.
Выдать номера и фамилии поставщиков, поставляющих детали для какого-либо изделия с деталью P1 в количестве, большем, чем средний объем поставок детали P1 для этого изделия.
Выдать общее количество деталей P1, поставляемых поставщиком S1.
Выдать все пары названий городов, таких, что какой-либо поставщик из первого города поставляет детали для некоторого изделия, изготовляемого во втором городе.
Выдать номера изделий, использующих только детали, поставляемые поставщиком S1.
Выдать номера деталей, поставляемых каким-либо поставщиком из Лондона, для изделия, изготавливаемого также в Лондоне.
Выдать номера и фамилии поставщиков, поставляющих одну и ту же деталь для всех перечисленных изделий. Перечень изделий согласовать с преподавателем.
Выдать общее число изделий (не деталей), для которых поставляет детали поставщик S1.
Выдать номера изделий, детали для которых поставляет каждый поставщик, поставляющий какую-либо красную деталь. Т.е. необходимо получить такие номера изделий, детали для которой поставляются всеми поставщиками, среди поставляемых деталей которого есть детали красного цвета.
Выдать все триплеты "номер поставщика, номер детали и номер изделия", такие, что в каждом триплете указанные поставщик, деталь и изделие являются попарно соразмещенными в одном городе.
Выдать номера и фамилии поставщиков, поставляющих по крайней мере одну деталь, поставляемую по крайней мере одним поставщиком, который поставляет по крайней мере одну красную деталь. Т.е. необходимо выдать полные сведения о всех поставщиках которые поставляют такие детали, которые есть в поставках поставщиков, поставляющих красные детали.
Выдать список деталей, поставляющихся для всех изделий, изготавливаемых в Лондоне.
Выдать номера деталей, поставляемых каким-либо поставщиком из Лондона.
Выдать номера деталей, поставляемых для какого-либо изделия из Лондона.
Выдать номера изделий, для которых детали поставляются по крайней мере одним поставщиком не из того же самого города, что и изделие.
Выдать список всех поставок, в которых количество деталей находится в диапазоне от 300 до 750 включительно.
Выдать номера изделий, использующих, по крайней мере, одну деталь, поставляемую поставщиком S1. Т.е. показать такие изделия, для производства которых пригодились бы детали, поставляемые поставщиком S1.
Выдать номера и названия деталей, поставляемых для какого-либо изделия в Лондоне.