Общая помощь по созданию запросов.... лично я из своего опыта преподавания этого языка могу сказать следующее.....
[more]
99% трудностей возникает изза незнания реляционной модели данных...
Кто считает что реляционная модель, это когда есть две таблицы, в них есть совпадающий столбик, и если в одном значение 100, то это ссылка на значения в другой таблице где тоже значение 100 ....... ну почти угадали, несчитая, что связь это не только равно, может быть и меньше и больше и не равно, и может просто отсутствовать.... другое дело что чаще мы используем равно...
Таблица1
поле1 поле2 поле3 поле4
Таблица2
поле1 поле2 поле3
Таблица3
поле1 поле2
Таблица4
поле1 поле2 поле3
Как строиться связь между ними сразу на примере запроса....
1) вначале определяем декартово произведение каких доменов нужно сделать
секция from
Домен... попростому сдесь можете считать, что это таблица представленная ввиде стобика, тоесть её запись(строка) одно целое на данном этапе
Декартово произведение таблиц:
Таблица1
1,саша,123.ВА
2,оля,222,АА
Таблица3
ВА,к343532л
ВП,о3532ш53
АК,345ш4334
их декартово произведение
Табл1.поле1,Табл1.поле2,Табл1.поле3,Табл1.поле4,Табл3.поле1,Табл3.поле2
1,саша,123.ВА,ВА,к343532л
2,оля,222,АА,ВА,к343532л
1,саша,123.ВА,ВП,о3532ш53
2,оля,222,АА,ВП,о3532ш53
1,саша,123.ВА,АК,345ш4334
2,оля,222,АА,АК,345ш4334
2)Определяем собственно реляционную связь ... секция where
из полученого произведения выбираем подмножество которое называеться отношением:
каждую строку проверяем на логическое условие
ТАбл1.поле4=Табл3.поле1 например
1,саша,123.ВА,ВА,к343532л результат
можно и такое ТАбл1.поле4<>Табл3.поле1
2,оля,222,АА,ВА,к343532л
1,саша,123.ВА,ВП,о3532ш53
2,оля,222,АА,ВП,о3532ш53
1,саша,123.ВА,АК,345ш4334
2,оля,222,АА,АК,345ш4334
потом групировка и вычисление агрегирующих функций(это уже не имеет отношение к реляционной модели)
при агрегации можно дополнительно из групы выбирать лишь часть записей по условию(секция хэвинг)
потом сортировка, потом выбор нужных нам столбцов из того что получилость - первая часть оператора.
Теперь чтоб составить запрос, нужно
1)определить данные из каких таблиц нам понадобяться
2)представить себе это ввиде произведения доменов
3)придумать как бы вы вручную из этой каши искали нужные вам записи
4)сделать это для компьютера....
Вложенные подзапросы:
это уже когда условие не просто равно или неравно чемуто.... а например значение содержеться в множесте,
а само множество результат селекта.... тоесть задача просто разбиваеться на две независимые ....
несколько иное дело корелированный подзопрос, это аналог цикла ФОР....
ГДЕ
Табл1.поле2=Табл4.поле1 И
Табл1.поле3 В (Выбор поле3 ИЗ Таблица3 Где Табл3.поле2<> Табл1.поле2)
ведь вложенный подзапрос нельзя выполнить вначале, так как неизвестно значение Табл1.поле2
В этом случае построчно просматриваеться результат умножения таблиц во внешнем запросе, и для каждого значения
Табл1.поле2 выполняетсья внутрений....
Но зачастую задачу можно решить и используя обычную вложеность....
Поэтапная агрегация....
например есть таблица(или можем получить таблицу сделав умножение и выбор отношения, взяв нужные столбики)
Отдел имя датапремии сумапремии...
Хотим получить
отдел КолПремированых Общее количество премий
1 отдел имя КоличествоПремийчела=(Count(*))
2 отдел количествоПремированых=(Count(*)) КоличествоПремий=Sum(количествоПремийЧела)
ну а когда мы говорим про то, что нам нужны записи которые.......... ИЛИ записи, которые.....
притом это вда разных алгоритма получения данных .... на лицо последовательные выборы и соеденение их
UNION
ещо есть джоины и прочее... но вообщемто это экзотика, если вам это крайне необходимо, то либо плохо подумали,
можно и без них, либо не правильно спроэктирована база данных(с точки зрения реляционной модели)....
ну или это какойто нестандартный полуфантастический запрос который раз в год пришло в голову сделать....
Ещо раз настоятельно рекомендую всем, у кого трудности с построение запроса, неполениться и врубиться в
сущность реляционной модели.... легче понимать если ей учить после сетевой модели
Тоесть понимать что это модель, когда нет физической связи между данными... как в сетевой модели.
Там есть только логическая связь, которая каждый раз выщитываеться, и невсегда одна и тажа в общем случае....
1)Из таблиц сотруднико двух отделов выбрать пары чтобы дядя-дядя или тётя-тётя + ещо условия...
для суботника
2)Дядя-тётя +ещо услловия для корпоратива.... юзаем одно и тоже поле, а вот знаки разные.... равенство
полового признака и не равенство.....
Добавлено: а идейный смысл фразы связь между таблицами в базе..... это не связь между данными, а связи именно между таблицами для поддержания целостности данных.... заметку сделал, так как многих именно подобные предложения и вводят в заблуждение, они начинают думать, что в реляционно базе данных есть связи между данными...
[/more]