Программирование >>  Программный интерфейс приложений 

1 ... 26 27 28 [ 29 ] 30 31 32 ... 264


SELECT student.student id, student.name,

SUM(score.score) AS total, COUNT(score.score) AS n

FROM event, score, student

WHERE event.event id = score.event

AND score . student id = student. student id

GROUP BY score. student id, student. student id

ORDER BY total;

Объединение можно производить не только между различными таблицами, но и таблицы самой с собой. Например, можно определить есть ли президенты, которые родились в одном и том же месте:

mysql> SELECT pi. last naime, pi. f irst naime, pi. city, pi. state ->FROM president AS pi, president AS p2 ~>WHERE pi.city = p2.city AND pi.state = p2. state ~>AND (pi.last name != p2.1ast name AND pi.first name !=

p2.first name)

~>ORDER BY state, city, last name;

H---

1--+

1 last name

1 first name

1 city

state 1

1 Adams

1 John Quincy

1 Braintree

MA 1

1 Adams

1 John

1 Braintree

MA 1

Этот запрос имеет две особенности.

Здесь требуется ссылаться на два экземпляра одной и той же таблицы. Для этого создается два экземпляра одной и той же таблицы с различными псевдонимами (р1, р2).

Запись каждого президента соответствует самой себе. Но они не нужны в отклике запроса. Вторая строка предложения where позволяет избежать этого.

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

функциями month() и dayofmonth() .

mysql> SELECT pi. last name, pi. f irst naime, pi.birth ->FROM president AS pi, president AS p2 ->WHERE MONTH(pi.birth) = MONTH(p2.birth) ->AND DAYOFMONTH (pi. birth) = DAYOFMONTH (p2 .birth) ~>AND (pi. last naime != p2 . last naime ->AND pi. f irst naime != p2 . f irst name) ~>ORDER BY pi.last name;

I last name +--

I Harding I Pollc

first name I birth

Warren G. James K.

1865-11-02 1795-11-02

Запрос можно упростить, если вместо комбинации функций month ()

и dayofmonth () воспользоваться фуНКЦИеЙ dayofyear () , НО ЭТО ДасТ



некорректные результаты при сравнении дат високосных и невисокосных годов.

Вот таким образом объединение позволяет манипулировать информацией из таблиц, имеющих некую смысловую взаимосвязь, но логику этих связей знает только сам создатель запроса. СУБД MySQL не знает , есть ли вообще что-то общее между объединенными таблицами. Например, можно объединить таблицы event и president для того, чтобы определить, проводились ли какие-либо викторины или гесты на тему дней рождения президентов.

mysql> SELECT president.last name, president.first name, ->president.birth, event.type ->FROM president, event

->WHERE MONTH(president.birth) = MONTH(event.birth)

->AND DAYOFMONTH(president.birth) = DAYOFMONTH(event.birth);

1 last name

1 first name

1 birth

1 type

1 Carter

1 James E.

1 1924-10-01

1 T

Оказывается, такое возможно. Ну и что? А то, что СУБД MySQL может вьщавать результаты независимо от того, имеют они смысл или абсолютно бессмысленны. Результаты запроса необязательно имеют пользу и какой-то смысл только потому, что они получены с помощью компьютера. К счастью, человек все еще должен думать и понимать, что он делает.

Удаление и модификация существующих записей

Иногда требуется избавиться от определенных записей или изменить их содержимое. Для этой цели существуют операторы DELETE и UPDATE. Оператор DELETE имеет следующий синтаксис:

DELETE FROM tbl name WHERE какие записи удалить

Предложение WHERE определяет, какая именно запись удаляется. Она может опускаться, но в этом случае будут удалены все записи в таблице! Это значит, что чем проще оператор DELETE, тем он опаснее :

DELETE FROM tbl name

Этот запрос стирает все содержимое таблицы. Будьте бдительны!

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

mysql> DELETE FROM president WHEFIE state = OH;

Query OK, 7 rows affected (0.00 sec)



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

Перед использованием предложения WHERE в операторе DELETE советую проверить его работу в операторе SELECT. Не мешает убедиться, какие записи будут удалены оператором DELETE. Предположим, что нужно удалить запись о президенте Теодоре Рузвельте. Выполнит ли следующий запрос эту задачу?

mysql> SELECT last name, first name, FROM president ->WHERE last name = Roosevelt,-

1 last name

-+-4-

1 first name 1

1 Roosevelt

1 I 1 Theodore

1 Roosevelt

1 Franklin D.

-+-+

Этот результат показывает, что требуется более серьезная детализация запроса.

mysql> SELECT last name, first name, FROM president

->WHERE last name = Roosevelt AND first name = Theodore;

last name I first name

Roosevelt I Theodore -+-

Теперь нам известно правильное предложение WHERE. Таким образом правильный оператор будет иметь вид:

mysql> DELETE FROM president

->WHERE last name = Roosevelt AND first name = Theodore;

Правда, операция удаления записи требует много предварительной работы? Семь раз отмерь, один раз отрежь! (На этом не стоит экономить. Сэкономить можно на копировании, вставке или методах редактирования строк. Более подробно об этом читайте в разделе Как работать с mysql .)

Для модификации уже сушествующих записей можно воспользоваться оператором UPDATE. Он имеет следующий синтаксис:

UPDATE FROM tbl name SET какой столбец изменить WHERE какую запись изменить

Здесь предложение WHERE ведет себя так же, как предложение WHERE для оператора DELETE. Оно может опускаться, но в этом случае изменения будут сделаны во всех записях таблицы] Вот запрос, который изменит имена всех учащихся из таблицы student на имя George :

mysql> UPDATE student SET name = George ;



1 ... 26 27 28 [ 29 ] 30 31 32 ... 264

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика