Əsas səhifə > MySQL, Oracle, Oracle SQL > Exploring JOINs in MySQL and Oracle(part1 PURE NATURAL JOIN)

Exploring JOINs in MySQL and Oracle(part1 PURE NATURAL JOIN)

Bu və ardıcıl yazılarda JOIN-lərə baxacıq. MySQL və Oracle-da JOİN-ləri araşdıracıq.
Birinci yazı həsr olunur PURE NATURAL JOİN-e
Oracle üçün Mənbə : Oracle 11g SQL Fundamentals Chapter 7

Oracle üçün nümunə cədvəl və məlumatlar:

create table t1(
id1 number,
name1 varchar2(25),
name_id number
);

create table t2(
id2 number,
name2 varchar(25),
name_id number
);

insert into t2(id2,name2,name_id) values(1,'farid',1);
insert into t2(id2,name2,name_id) values(2,'arif',2);
insert into t2(id2,name2,name_id) values(3,'zulfugar',3);
insert into t2(id2,name2,name_id) values(4,'xxx',4);
insert into t2(id2,name2,name_id) values(5,'yyy',5);
insert into t2(id2,name2,name_id) values(6,'zzz',6);

insert into t1(id1,name1,name_id) values(1,'shahriyar',1);
insert into t1(id1,name1,name_id) values(2,'orxan',2);
insert into t1(id1,name1,name_id) values(3,'elvin',3);

MySQL üçün nümunə cədvəl və məlumatlar:

CREATE TABLE `t1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(25) DEFAULT NULL,
  `name_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
)

CREATE TABLE `t2` (
  `id2` int(11) NOT NULL AUTO_INCREMENT,
  `name2` varchar(25) DEFAULT NULL,
  `name_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id2`)
)

insert into t1(name,name_id) values('shahriyar',1),('orxan',2),('elvin',3);

insert into t2(name2,name_id) values('farid',1),('arif',2),('zulfugar',3);
insert into t2(name2,name_id) values('xxx',4);
insert into t2(name2,name_id) values('yyy',5);
insert into t2(name2,name_id) values('zzz',6);

The NATURAL JOİN clause:

Hər iki RDBMS-dəki cədvəllərdəki məlumatlar aşağıdakı kimidir:

MariaDB [join_test]> select * from t2;
+-----+----------+---------+
| id2 | name2    | name_id |
+-----+----------+---------+
|   1 | farid    |       1 |
|   2 | arif     |       2 |
|   3 | zulfugar |       3 |
|  10 | xxx      |       4 |
|  11 | yyy      |       5 |
|  12 | zzz      |       6 |
+-----+----------+---------+
6 rows in set (0.00 sec)

MariaDB [join_test]> select * from t1;
+----+-----------+---------+
| id | name      | name_id |
+----+-----------+---------+
|  1 | shahriyar |       1 |
|  2 | orxan     |       2 |
|  3 | elvin     |       3 |
+----+-----------+---------+
3 rows in set (0.00 sec)

Oracle 11g SQL Fundamentals kitabından page 319-dakı query-ləri sınayaq:

-- Oracle

select * from t1 natural join t2;
>>>
+---------+----+-----------+-----+----------+
| NAME_İD |İD1 | NAME1     | İD2 | NAME2    |
+---------+----+-----------+-----+----------+
|       1 |  1 | shahriyar |   1 | farid    |
|       2 |  2 | orxan     |   2 | arif     |
|       3 |  3 | elvin     |   3 | zulfugar |
+---------+----+-----------+-----+----------+

-- MySQL

MariaDB [join_test]> select * from t1 natural join t2;
+---------+----+-----------+-----+----------+
| name_id | id | name      | id2 | name2    |
+---------+----+-----------+-----+----------+
|       1 |  1 | shahriyar |   1 | farid    |
|       2 |  2 | orxan     |   2 | arif     |
|       3 |  3 | elvin     |   3 | zulfugar |
+---------+----+-----------+-----+----------+
3 rows in set (0.01 sec)

Eyni nəticə çıxdı.
Davam edək:

-- Oracle

select * from t1,t2
where t1.name_id = t2.name_id;
>>>

+----+-----------+---------+-----+----------+---------+
|İD1 | NAME1     | NAME_İD | İD2 | NAME2    | NAME_İD_1
+----+-----------+---------+-----+----------+---------+
|  1 | shahriyar |       1 |   1 | farid    |       1 |
|  2 | orxan     |       2 |   2 | arif     |       2 |
|  3 | elvin     |       3 |   3 | zulfugar |       3 |
+----+-----------+---------+-----+----------+---------+

-- MySQL

MariaDB [join_test]> select * from t1,t2
     where t1.name_id = t2.name_id;
+----+-----------+---------+-----+----------+---------+
| id | name      | name_id | id2 | name2    | name_id |
+----+-----------+---------+-----+----------+---------+
|  1 | shahriyar |       1 |   1 | farid    |       1 |
|  2 | orxan     |       2 |   2 | arif     |       2 |
|  3 | elvin     |       3 |   3 | zulfugar |       3 |
+----+-----------+---------+-----+----------+---------+
3 rows in set (0.00 sec)

Gördüyümüz kimi Syntax eynidir və nəticələr də eynidir.

NATURAL join üçün maraqlı məqamlardan biri,
Əgər natural join şərti zamanı eyni adlı column-lar tapılmazsa o zaman Cartesian join result geri dönəcək:

-- Oracle

-- Nümunə cədvəlimizi yaradaq

create table t3(
id3 number,
name3 varchar2(25),
name_id1 number
);

insert into t3 select * from t2;

Gördüyümüz kimi bu cədvəldə t1 və t2 (yuxarıdakı cədvəllər) ilə eyni adlı column yoxdur.
Və az əvvəl söylədiyimiz iddiani test edək:

select * from t2 natural join t3;
>>> 
.
.
36 rows

Niyə məhz 36?

select count(*) from t2;
>>> 6

select count(*) from t3;
>>> 6

Cartesian Join zamanı isə bildiyimiz kimi t2xt3 qədər row qayıtmalıdır və 6×6=36.
Eyni hal MySQL üçün də geçərlidir:

create table t3(
id3 int not null auto_increment,
name3 varchar(25),
name_id1 int,
primary key(id3)
);

MariaDB [join_test]> insert into t3 select * from t2;
Query OK, 6 rows affected (0.04 sec)
Records: 6  Duplicates: 0  Warnings: 0

MariaDB [join_test]> select * from t3 natural join t2;

.
.
36 rows in set (0.00 sec)

Dolayısı ilə hər 2 RDBMS üçün column match-i tapmayan natural join, Cartesian join result qaytarır və bu aşağıdakı sorğuya bərabərdir:

-- Oracle

select * from t2,t3;
>>> 
36 rows fetched

-- MySQL

select * from t2,t3;
>>>
36 rows in set (0.00 sec)

Ən sonda hər iki RDBMS-də NATURAL LEFT JOİN və NATURAL RİGHT JOİN-ə baxaq.
Xatırladıram ki t1 və t2 cədvəlində aşağıdakı məlumatlar var:
t1:

t2:

-- Oracle
-- NATURAL LEFT JOİN

select * from t1 natural left join t2;

-- Oracle
-- NATURAL RIGHT JOİN

select * from t1 natural right join t2;

Nəticə MySQL-də də eynidir. Fərq yalnız ondadır ki,
MySQL right join-dirsə adına uyğun ilk öncə sağdakı cədvəldən məlumatları sıralayır.

-- MySQL
-- NATURAL LEFT JOİN

select * from t1 natural left join t2;

-- MySQL
-- NATURAL RIGHT JOİN

select * from t1 natural right join t2;

NATURAL JOİN haqqında bu qədər..
Təşəkkürlər😉

  1. Hələlik heç bir şərh yoxdur
  1. No trackbacks yet.

Bir cavab yazın

Sistemə daxil olmaq üçün məlumatlarınızı daxil edin və ya ikonlardan birinə tıklayın:

WordPress.com Loqosu

WordPress.com hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Twitter rəsmi

Twitter hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Facebook fotosu

Facebook hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Google+ foto

Google+ hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

%s qoşulma

%d bloqqer bunu bəyənir: