Практическое использование MySQL Пример из жизни. Допустим, капитану пиратов нужно ограбить 3 самых богатых корабельных компании, протяженность всех маршрутов которых длинее 100 миль (с мелочевкой, суммарный маршрут которых короче и возиться нечего,а с военными компаниями - в чьих названиях помимо букв присутствуют цифры-тем более). Итак, у нас есть две таблицы: Таблица компаний (grp) ----------------------------------- | idgrp | Name | ----------------------------------- | 22 | Морские перевозки | | 24 | № 24 is updated | | 30 | Каботажные перевозки | | 31 | третья группа | | 32 | Океанские перевозки | | 33 | Шлюпки-1 | | 34 | Шлюпки-2 | | 35 | Каперы | | 36 | Каперы-3 | | 37 | Каперы-4 | | 38 | Каравеллы | | 39 | Фрегаты | | 40 | Фрегаты-5 | | 41 | Фрегаты-6 | | 42 | Линкоры | | 43 | Линкоры-7 | | 44 | Линкоры-8 | | 45 | Линкоры-8 | | 46 | Линкоры-8 | | 47 | № 43 is updated | | 48 | № 45 is updated | | 49 | Картографическая группа | ----------------------------------- SELECT idgrp, Name FROM grp g; Таблица рейсов (routes) --------------------------------------------------- | id_r | name_r | length_r | id_grp_r | --------------------------------------------------- | 1 | Береговой рейс | 300 | 22 | | 2 | Лондонский рейс | 200 | 44 | | 3 | Плимутский рейс | 150 | 30 | | 4 | Европейская трасса | 500 | 30 | | 5 | Местный рейс | 50 | 22 | | 6 | Кругосветный рейс | 40000 | 32 | | 7 | Устаревший маршрут | 400 | 50 | --------------------------------------------------- SELECT id_r, name_r, length_r, id_grp_r FROM routes r; Тип связи - один ко многим, тк одна компания может обслуживать несколько рейсов, а может и ни одного. (grp.idgrp<--->routes.id_grp_r) Для экстрима добавим в таблицу рейсов группу "Устаревший маршрут".Да, не существует компании с автокодом 50. Увы. Может разорилась, может все ее корабли потонули и маршрут обслуживать больше некому, а может просто сервер сбойнул - бывает и такое. Нужно получить таблицу по пяти первым группам корабельных компаний (grp) за исключением литерных (в чьих наименованиях задействованы номера),суммарная прояженность маршрутов(routes) которых (routes.length_r) превышает 100 морских миль и выдать ее в виде таблицы, где указать: 1.Наименование группы компаний 2.суммарную длину всех маршрутов 3.длину самого протяженного маршрута 4.общее количество маршрутов каждой группы Сортировку в таблице проводить по убыванию суммарной длины маршрутов. Рещение: SELECT grp.idgrp, grp.Name, SUM(routes.length_r) AS SUMMA , MAX(routes.length_r) AS MAXL , COUNT(*) FROM routes LEFT JOIN grp ON routes.id_grp_r = grp.idgrp WHERE ( grp.idgrp IS NOT NULL AND grp.Name NOT REGEXP('[0-9]') ) GROUP BY routes.id_grp_r,grp.Name HAVING MAX(routes.length_r)>100 ORDER BY SUMMA DESC LIMIT 0,5 ; А вот и результат: ----------------------------------------------------------- | idgrp | Name | SUMMA | MAXL | COUNT(*) | ----------------------------------------------------------- | 32 | Океанские перевозки | 40000 | 40000 | 1 | | 30 | Каботажные перевозки | 650 | 500 | 2 | | 22 | Морские перевозки | 300 | 300 | 1 | ----------------------------------------------------------- Относим таблицу капитану, получаем пиастры и идем отмечать в соседнюю таверну!