Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Для этого используется выражение ORDER BY.




mysql> SELECT name, birth FROM pet ORDER BY birth;

name birth
Buffy 1989-05-13
Bowser 1989-08-31
Fang 1990-08-27
Fluffy 1993-02-04
Claws 1994-03-17
Slim 1996-04-29
Whistler 1997-12-09
Chirpy 1998-09-11
Puffball 1999-03-30

Провести сортировку с учетом регистра символов можно при помощи команды

BINARY: ORDER BY BINARY(поле).

Использование нескольких таблиц

В таблице 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> 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

Для объединения не обязательно иметь две отдельные таблицы; иногда можно объединить таблицу с самой собой - если нужно сравнить одни записи таблицы с другими записями той же таблицы. Например, для того, чтобы обнаружить среди животных ``семейные пары'', можно объединить таблицу 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

В этом запросе мы указываем псевдонимы имен таблицы, для обращения к столбцам и определения, к какой из таблиц относится каждая ссылка на столбец.

Для сортировки в обратном порядке к имени столбца следует добавить ключевое слово DESC (по убыванию): mysql> SELECT name, birth FROM pet ORDER BY birth DESC;

name birth
Puffball 1999-03-30
Chirpy 1998-09-11
Whistler 1997-12-09
Slim 1996-04-29
Claws 1994-03-17
Fluffy 1993-02-04
Fang 1990-08-27
Bowser 1989-08-31
Buffy 1989-05-13

Сортировку можно проводить по нескольким столбцам сразу.

mysql> SELECT name, species, birth FROM pet ORDER BY species, birth DESC;

name species birth
Chirpy bird 1998-09-11
Whistler bird 1997-12-09
Claws cat 1994-03-17
Fluffy cat 1993-02-04
Fang dog 1990-08-27
Bowser dog 1989-08-31
Buffy dog 1989-05-13
Puffball hamster 1999-03-30
Slim snake 1996-04-29

Вычисление дат

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

mysql> SELECT name, birth, CURRENT_DATE, (YEAR(CURRENT_DATE)-YEAR(birth))

-> - (RIGHT(CURRENT_DATE,5)<RIGHT(birth,5)) AS age FROM pet;

name birth URRENT_DATE age
Fluffy 1993-02-04 2001-08-29  
Claws 1994-03-17 2001-08-29  
Buffy 1989-05-13 2001-08-29  
Fang 1990-08-27 2001-08-29  
Bowser 1989-08-31 2001-08-29  
Chirpy 1998-09-11 2001-08-29  
Whistler 1997-12-09 2001-08-29  
Slim 1996-04-29 2001-08-29  
Puffball 1999-03-30 2001-08-29  

В этом примере функция YEAR() выделяет из даты год, а RIGHT() - пять крайних справа символов, представляющих календарный день (MM-DD). Часть выражения, сравнивающая даты, выдает 1 или 0, что позволяет уменьшить результат на единицу, если текущий день (CURRENT_DATE) находится к началу календаря ближе, нежели день рождения животного.

Упорядочить запрос

mysql> SELECT name, birth, CURRENT_DATE, (YEAR(CURRENT_DATE)-YEAR(birth))

-> - (RIGHT(CURRENT_DATE,5)<RIGHT(birth,5)) AS age FROM pet ORDER BY name;

name birth CURRENT_DATE age
Bowser 1989-08-31 2001-08-29  
Buffy 1989-05-13 2001-08-29  
Chirpy 1998-09-11 2001-08-29  
Claws 1994-03-17 2001-08-29  
Fang 1990-08-27 2001-08-29  
Fluffy 1993-02-04 2001-08-29  
Puffball 1999-03-30 2001-08-29  
Slim 1996-04-29 2001-08-29  
Whistler 1997-12-09 2001-08-29  

Отсортировать результаты по возрасту также можно при помощи выражения ORDER BY:

mysql> SELECT name, birth, CURRENT_DATE, (YEAR(CURRENT_DATE)-YEAR(birth))

-> - (RIGHT(CURRENT_DATE,5)<RIGHT(birth,5)) AS age FROM pet ORDER BY age;

name birth CURRENT_DATE age
Chirpy 1998-09-11 2001-08-29  
Puffball 1999-03-30 2001-08-29  
Whistler 1997-12-09 2001-08-29  
Slim 1996-04-29 2001-08-29  
Claws 1994-03-17 2001-08-29  
Fluffy 1993-02-04 2001-08-29  
Fang 1990-08-27 2001-08-29  
Bowser 1989-08-31 2001-08-29  
Buffy 1989-05-13 2001-08-29  

Подобный же запрос поможет определить возраст, которого достигли умершие животные на момент смерти. Выделить умерших животных можно, проверив значение поля death на предмет равенства NULL. Затем для записей, значения поля death которых не равно NULL, можно вычислить разницу между датами смерти и рождения:

mysql> SELECT name, birth, death, (YEAR(death)-YEAR(birth)) - (RIGHT(death,5)<RIGHT(birth,5)) AS age FROM pet WHERE death IS NOT NULL ORDER BY age;

name birth death age
Bowser 1989-08-31 1995-07-29  

В MySQL предусмотрено несколько функций для получения частей дат - YEAR(), MONTH(), и DAYOFMONTH(). mysql> SELECT name, birth, MONTH(birth) FROM pet;

name birth MONTH(birth)
Fluffy 1993-02-04  
Claws 1994-03-17  
Buffy 1989-05-13  
Fang 1990-08-27  
Bowser 1989-08-31  
Chirpy 1998-09-11  
Whistler 1997-12-09  
Slim 1996-04-29  
Puffball 1999-03-30  

Найти животных, дни рождения которых наступят в следующем месяце, тоже несложно. Предположим, что сейчас на дворе апрель. Тогда номер текущего месяца - 4, а искать надо животных, родившихся в мае (5-м месяце), таким образом:

mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = 5;

name birth
Buffy 1989-05-13

Конечно, в декабре возникают некоторые осложнения. Если просто добавить единицу к номеру месяца (12) и поискать животных, родившихся в тринадцатом месяце, найти что-нибудь вряд ли удастся. Вместо этого нужно искать животных, родившихся в январе (1-м месяце). Можно даже написать небольшой запрос, который будет работать вне зависимости от того, какой нынче месяц. Функция DATE_ADD() позволяет прибавить к дате некоторый интервал времени. Если добавить к значению, возвращаемому функцией NOW(), месяц, а затем извлечь из получившейся даты номер месяца при помощи функции MONTH(), мы получим именно тот месяц, который нам нужен:

mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = MONTH(DATE_ADD(NOW(), INTERVAL 1 MONTH));

Ту же задачу можно решить и другим методом - для этого нужно прибавить единицу к номеру месяца, следующего за текущим (воспользовавшись функцией расчета по модулю (MOD) для перехода к 0, если номер текущего месяца равен 12):

mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = MOD(MONTH(NOW()), 12) + 1;

Функция MONTH возвращает число от 1 до 12, а выражение MOD(число,12) - число от 0 до 11. Поэтому операцию сложения нужно проводить после MOD(), иначе результат перепрыгнет с ноября (11) сразу на январь (1).

Поделиться:





Читайте также:

The emphatic and communicative functions of word order
Андрей Николаевич, но ведь сила не всегда сочетается с нравственностью. Как этого добиться – выбрать верный духовный Путь?
Более точно и иногда столь же удобно выражение «выживание наиболее приспособленного», часто используемое г-ном Гербертом Спенсером.
Бытие мира как выражение его единства
В каких значениях в психологии семьи используется понятие «функция»?
В каких случаях при работе протокола BGP используется сообщение NOTIFICATION? Формат этого сообщения?
В качестве инструмента используется методика анализа временных рядов: с учётом либо рыночного тренда, либо стадии жизненного цикла, на которой находится Ваша компания.
В отрасли связи используется несколько показателей прибыли.
В твердых средах скорость звука определяется выражением
В течение всего дня, когда вы чувствуете, что попадаете под власть страха, напоминайте себе, что в ваших силах испытывать вместо этого Любовь.






Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...