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

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

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

2

Puffball

1999-03-30

2001-08-29

2

Whistler

1997-12-09

2001-08-29

3

Slim

1996-04-29

2001-08-29

5

Claws

1994-03-17

2001-08-29

7

Fluffy

1993-02-04

2001-08-29

8

Fang

1990-08-27

2001-08-29

11

Bowser

1989-08-31

2001-08-29

11

Buffy

1989-05-13

2001-08-29

12

Подобный же запрос поможет определить возраст, которого достигли умершие животные на момент смерти. Выделить умерших животных можно, проверив значение поля 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

5

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

name

birth

MONTH(birth)

Fluffy

1993-02-04

2

Claws

1994-03-17

3

Buffy

1989-05-13

5

Fang

1990-08-27

8

Bowser

1989-08-31

8

Chirpy

1998-09-11

9

Whistler

1997-12-09

12

Slim

1996-04-29

4

Puffball

1999-03-30

3

Найти животных, дни рождения которых наступят в следующем месяце, тоже несложно. Предположим, что сейчас на дворе апрель. Тогда номер текущего месяца - 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).

Примеры стандартных запросов

В некоторых из примеров используется таблица shop (магазин), в которой содержатся цены по каждому изделию (item number)для определенных продавцов (dealer). Каждый продавец имеет одну фиксированную цену для каждого изделия; тогда пара изделие-продавец (article, dealer) является первичным ключом для записей таблицы.

CREATE TABLE shop ( article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL, dealer CHAR(20) DEFAULT '' NOT NULL, price DOUBLE(16,2) DEFAULT '0.00' NOT NULL, PRIMARY KEY(article, dealer));

INSERT INTO shop VALUES(1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),(3,'C',1.69),(3,'D',1.25),(4,'D',19.95);

mysql> SELECT * FROM shop;

article

dealer

price

0001

A

3.45

0001

B

3.99

0002

A

10.99

0003

B

1.45

0003

C

1.69

0003

D

1.25

0004

D

19.95