В таблице pet
хранятся только основные данные о животных. Если же нужно
держать в базе какую-либо дополнительную информацию о них (скажем, записи
о событиях наподобие посещения ветеринара или рождения потомства),
понадобится еще одна таблица. Давайте определимся с ее структурой. Эта
таблица должна содержать:
С учетом всех приведенных выше требований можно составить примерно такую
команду CREATE TABLE
:
mysql> CREATE TABLE event (name VARCHAR(20), date DATE, -> type VARCHAR(15), remark VARCHAR(255));
Как и в случае с таблицей pet
, начальные данные в таблицу проще всего
загрузить, создав текстовый файл с информацией, разделенной символами
табуляции:
name | date | type | remark |
Fluffy | 1995-05-15 | litter | 4 kittens, 3 female, 1 male |
Buffy | 1993-06-23 | litter | 5 puppies, 2 female, 3 male |
Buffy | 1994-06-19 | litter | 3 puppies, 3 female |
Chirpy | 1999-03-21 | vet | needed beak straightened |
Slim | 1997-08-03 | vet | broken rib |
Bowser | 1991-10-12 | kennel | |
Fang | 1991-10-12 | kennel | |
Fang | 1998-08-28 | birthday | Gave him a new chew toy |
Claws | 1998-03-17 | birthday | Gave him a new flea collar |
Whistler | 1998-12-09 | birthday | First birthday |
Загрузите записи с помощью следующей команды:
mysql> LOAD DATA LOCAL INFILE "event.txt" INTO TABLE event;
Используя знания, усвоенные при работе с таблицей pet
, вы сможете
загружать данные из таблицы event
; принципы здесь те же. Но что если самой
по себе таблицы event
перестанет хватать для получения нужных вам ответов?
Предположим, нужно узнать, в каком возрасте животные давали приплод. В
таблице event
указаны даты родов, но для того, чтобы рассчитать возраст
матери, нужно знать и дату ее рождения. Так как даты рождения хранятся в
таблице pet
, в этом запросе нужно использовать обе таблицы:
mysql> SELECT pet.name, -> (TO_DAYS(date) - TO_DAYS(birth))/365 AS age, -> remark -> FROM pet, event -> WHERE pet.name = event.name AND type = "litter"; +--------+------+-----------------------------+ | name | age | remark | +--------+------+-----------------------------+ | Fluffy | 2.27 | 4 kittens, 3 female, 1 male | | Buffy | 4.12 | 5 puppies, 2 female, 3 male | | Buffy | 5.10 | 3 puppies, 3 female | +--------+------+-----------------------------+
На некоторые аспекты этого запроса следует обратить особое внимание:
FROM
указаны две таблицы, так как запрос будет получать
информацию из обеих.
WHERE
используется для сопоставления записей из
двух таблиц по значениям имен.
Для объединения не обязательно иметь две отдельные таблицы; иногда можно
объединить таблицу с самой собой - если нужно сравнить одни записи таблицы
с другими записями той же таблицы. Например, для того, чтобы обнаружить
среди животных ``семейные пары'', можно объединить таблицу pet
с ней
самой, составив пары животных разного пола, но одного вида:
mysql> SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species -> FROM pet AS p1, pet AS p2 -> WHERE p1.species = p2.species AND p1.sex = "f" AND p2.sex = "m"; +--------+------+--------+------+---------+ | name | sex | name | sex | species | +--------+------+--------+------+---------+ | Fluffy | f | Claws | m | cat | | Buffy | f | Fang | m | dog | | Buffy | f | Bowser | m | dog | +--------+------+--------+------+---------+
В этом запросе мы указываем псевдонимы имен таблицы, для обращения к столбцам и определения, к какой из таблиц относится каждая ссылка на столбец.
User Comments
Depending on when this query was run, Bowser might not be available for mating. :) In this case we can add additional criteria to the where clause to ensure that the animal is actually alive to perform.
2 rows in set (0.00 sec)select p1.name, p1.gender, p2.name, p2.gender, p1.species
from pet as p1, pet as p2
where p1.species = p2.species and p1.gender = 'f' and p2.gender = 'm'
and p1.death is null and p2.death is null;
mysql>
mysql> SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species
2 rows in set (0.00 sec)-> FROM pet AS p1, pet AS p2
-> WHERE p1.species = p2.species AND p1.sex = "f" AND p2.sex = "m"
-> AND p1.death IS NULL and p2.death IS NULL;
mysql>
The above follows the naming convention and syntax of the tutorial.
This website offers a wealth of information both to the new and experienced user.
I would suggest any user to to immerse yourself in this website; learn the tools, tricks and shortcuts, and you will look back back with clearer eyes and a heavier brain.
Kudos to Mysql.
--Marshall S. Houston
www.roommatesville.com
www.domains2dollars.com
www.24hourapartments.com
Add your own comment.