Всем привет, почему-то я решил сейчас больше времени уделять базам данных, а именно языку SQL. Почему именно SQL, да потому что, через SQL-запросы, можно сделать очень полезные действия, а самое главное, что это будет все намного быстрее, чем что-то организовывать, например, через цикл.
Вот, в этой статье, я хотел бы поговорить о том, как можно объединить таблицы СУБД, все возможными способами. При этом, объединение можно сделать человеку, который и не знает языка запросов — SQL, но тут ему придется использовать цикл, а использование цикла, говорит уже о многом. Если в таблицах будет по 5 записей, то проблем при объединении с помощью цикла, не возникнет, а если записей в таблицах будет больше 50 тысяч, то тут уже могут возникнуть проблемы.
В языке SQL, есть отличный оператор INNER JOIN, который позволяет быстро и четко объединить таблицы, по определенному алгоритму. Давайте приступим, к созданию наших таблиц.
Для примера возьмем СУБД MS Access, в которой, я создал две таблицы:
- Student
- Country
У меня они вышли следующей структуры:
Теперь приступим к нашему проекту. Создадим проект в Delphi, затем на форму установим следующие компоненты:
- TADOConnection
- TADOQuery
- TDataSource
- TDBGrid
- TButton — 3 шт.
Как только все у нас готово, нам необходимо сделать подключение к нашей БД, как это делать, я рассматривал в данной статье. Делаем все тоже самое, по аналогии.
Как только мы сделали подключение, нам необходимо связать компоненты. Компонент TADOQuery в свойстве Connection указываем — TADOConnection, в компоненте TDataSource, в свойстве DataSet - указываем TADOQuery, в компоненте TDBGrid, в свойстве DataSource, указываем — TDataSource. Все, как всегда быстро и просто. Большая часть дела у нас сделано, теперь приступим к изучению теорию, по самой конструкции оператора INNER JOIN, языка SQL.
Вообще с помощью оператора INNER JOIN можно объединять таблиц разными способами. Чтобы тоже самое сделать, не используя данный оператор языка SQL, то придется написать достаточно кода, чтобы объединить таблицы, не используя язык SQL, который естественно будет также и работать медленнее.
Что касается данного оператора, естественно он должен поддерживаться провайдером БД, в некоторых СУБД он вообще может не работать, а в некоторых работать немного по-другому (иметь другой синтаксис), в отличии от той же самой трубы нержавейки, которая прослужит очень долго Вам.
Данный оператор входит в раздел FROM языка запросов SQL. Сам оператор INNER JOIN объединяет записей из одной таблицы, которые соответствуют записям другой таблицы, то есть их количеству.
А оператор OUTER JOIN, предполагает объединение таблиц, в независимости от количество записей в той или иной таблице.
Кроме этого при указании параметров LEFT или RIGHT, можно конкретно указывать, какую таблицу с какой объединять, то есть правую с левой, левую с правой и так далее.
Ну и оператор CROSS JOIN - который объединяет две таблицы, со всевозможными сочетаниями, чтобы это реализовать без SQL-запросов, то тут, возможно не обойтись без нескольких даже циклов.
Ну, а теперь давайте приступим к практике и посмотрим, как объединить таблицы, в которых одинаковое количество записей, по какому-то условию. На событие OnClick кнопки, напишем следующий код:
procedure TForm1.btn1Click(Sender: TObject);
begin
qry1.SQL.Clear;
qry1.SQL.Add('SELECT * FROM Student INNER JOIN Country ON Student.id=Country.id');
qry1.Active:=True;
end;
Данным запросом, я смогу объединить только те записи, которые соответствуют условию, то есть и в той, и в той таблицах, равны их идентификаторы.
Теперь, что касается OUTER JOIN, на событие OnClick кнопки, пишем следующий код:
procedure TForm1.btn2Click(Sender: TObject);
begin
qry1.SQL.Clear;
qry1.SQL.Add('SELECT * FROM Student LEFT OUTER JOIN Country ON Student.id=Country.id');
qry1.Active:=True;
end;
Тут, мы к левой таблице присоединяем записи из правой таблицы, которые соответствуют условию, а если, в левой таблице, записей окажется больше, то, недостающие записи из правой таблице, заполняться нулевыми значениями. Тут, уже можно экспериментировать, как угодно.
Ну и наконец-то, перейдем к CROSS JOIN, который, на сколько я знаю, не поддерживается MS Access, но это не проблема, так как его можно реализовать другим запросом в любой СУБД, на событие OnClick напишем следующий код:
procedure TForm1.btn3Click(Sender: TObject);
begin
qry1.SQL.Clear;
qry1.SQL.Add('SELECT * FROM Student, Country');
qry1.Active:=True;
end;
Данный код, сделает всевозможные перестановки записей из двух таблиц. Вот и все, что касается данного оператора SQL, теперь Вам выбирать, пользоваться ли SQL-запросами, либо же обходиться без них, преимущество у них явное. А главное, что они везде одинаковые во всех СУБД, как говорил мой преподаватель SQL - он и в Африке SQL.
Для, тех, кому не все ясно, приложу исходник, IDE Delphi XE — скачать
Можете сравнить объединение циклом и с помощью SQL-запросов.