- •Глава 3. Учебное пособие по MySql
- •3.1. Подсоединение к серверу и отсоединение от него
- •3.2. Ввод запросов
- •3.3. Создание и использование базы данных
- •3.3.1. Создание и выбор базы данных
- •3.3.2. Создание таблицы
- •3.3.3. Загрузка данных в таблицу
- •3.3.4. Выборка информации из таблицы
- •3.3.4.1. Выборка всех данных
- •3.3.4.2. Выборка определенных строк
- •3.3.4.3. Выборка определенных столбцов
- •3.3.4.4. Сортировка строк
- •3.3.4.5. Вычисление дат
- •3.3.4.6. Работа с значениями null
- •3.3.4.7. Сравнение по шаблонам
- •3.3.4.8. Подсчет строк
- •3.3.4.9. Использование нескольких таблиц
- •3.4. Получение информации о базах данных и таблицах
- •3.5. Примеры стандартных запросов
- •3.5.1. Максимальное значение столбца
- •3.5.2. Строка, содержащая максимальное значение некоторого столбца
- •3.5.3. Максимальное значение столбца для группы
- •3.5.4. Строка, содержащая максимальное значение некоторого столбца
- •3.5.5. Использование пользовательских переменных
- •3.5.6. Использование внешних ключей
- •3.5.7. Поиск по двум ключам
- •3.5.8. Подсчет посещений за день
- •3.5.9. Использование атрибута auto_increment
- •3.6. Использование mysql в пакетном режиме
- •3.7. Запросы проекта 'Близнецы' (Twin Project)
- •3.7.1. Поиск нераспределенных близнецов
- •3.7.2. Вывод таблицы состояний пар близнецов
- •3.8. Использование MySql совместно с Apache
3.5.5. Использование пользовательских переменных
В MySQL для хранения результатов, чтобы не держать их во временных переменных на клиенте, можно применять пользовательские переменные (see Раздел 6.1.4, «Переменные пользователя»).
Например, для того чтобы найти изделия с максимальной или минимальной ценой, можно выполнить следующие действия:
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 |
+---------+--------+-------+
3.5.6. Использование внешних ключей
В MySQL 3.23.44 и выше в таблицах InnoDB осуществляется проверка ограничений целостности внешних ключей (обратитесь к разделам Раздел 7.5, «Таблицы InnoDB» и Раздел 1.9.4.5, «Внешние ключи»).
Фактически для соединения двух таблиц внешние ключи не нужны.
Единственное, что MySQL в настоящее время не осуществляет (в типах таблиц, отличных от InnoDB), это проверку (CHECK) что ключи, которые вы используете, действительно существуют в таблице(ах) на которые вы ссылаетесь, и не удаляет автоматически записи из таблиц с определением внешних ключей. Если же ключи используются обычным образом, все будет работать просто чудесно:
CREATE TABLE person (
id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
name CHAR(60) NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE shirt (
id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
style ENUM('t-shirt', 'polo', 'dress') NOT NULL,
color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL,
owner SMALLINT UNSIGNED NOT NULL REFERENCES person(id),
PRIMARY KEY (id)
);
INSERT INTO person VALUES (NULL, 'Antonio Paz');
INSERT INTO shirt VALUES
(NULL, 'polo', 'blue', LAST_INSERT_ID()),
(NULL, 'dress', 'white', LAST_INSERT_ID()),
(NULL, 't-shirt', 'blue', LAST_INSERT_ID());
INSERT INTO person VALUES (NULL, 'Lilliana Angelovska');
INSERT INTO shirt VALUES
(NULL, 'dress', 'orange', LAST_INSERT_ID()),
(NULL, 'polo', 'red', LAST_INSERT_ID()),
(NULL, 'dress', 'blue', LAST_INSERT_ID()),
(NULL, 't-shirt', 'white', LAST_INSERT_ID());
SELECT * FROM person;
+----+---------------------+
| id | name |
+----+---------------------+
| 1 | Antonio Paz |
| 2 | Lilliana Angelovska |
+----+---------------------+
SELECT * FROM shirt;
+----+---------+--------+-------+
| id | style | color | owner |
+----+---------+--------+-------+
| 1 | polo | blue | 1 |
| 2 | dress | white | 1 |
| 3 | t-shirt | blue | 1 |
| 4 | dress | orange | 2 |
| 5 | polo | red | 2 |
| 6 | dress | blue | 2 |
| 7 | t-shirt | white | 2 |
+----+---------+--------+-------+
SELECT s.* FROM person p, shirt s
WHERE p.name LIKE 'Lilliana%'
AND s.owner = p.id
AND s.color <> 'white';
+----+-------+--------+-------+
| id | style | color | owner |
+----+-------+--------+-------+
| 4 | dress | orange | 2 |
| 5 | polo | red | 2 |
| 6 | dress | blue | 2 |
+----+-------+--------+-------+
