Əsas səhifə > MySQL > SUM() function wrong output???

SUM() function wrong output???

Çox maraqlı bir hadisə baş verib yəni mənə maraqlı gəldi və indi yazıram…
* Bu yazıda subquery,join(inner join) (hamısı da basic şəkildə) istifadə olunub…İrəlidə subquery və join haqqında ayrılıqda yazı yazacam yəqin ki *

Deməli bizim 2 table-ımız var:

CREATE TABLE sum_test (
  id int
);

CREATE TABLE sum_test2 (
  id int
);

İnsert edirik:

insert into sum_test() values(1),(2),(3),(4);

insert into sum_test2() values(1),(2),(3),(4),(5),(6);

Selectlər:


mysql> select * from sum_test;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
+------+
4 rows in set (0.00 sec)

mysql> select * from sum_test2;  
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
|  6 |
+----+
6 rows in set (0.00 sec)

Gördüyümüz kimi, sum_test-də 4 , sum_test2-də isə 6 row var. *bu 4 və 6 rəqəmlərini yadda saxlayın\saxlayaq!!!*

İndi isə sum() funksiyası ilə işləyək biraz…Bu funksiya adından da göründüyü kimi summary\sum yəni toplama əməliyyatını yerinə yetirir.
Əgər sınasaq:

-- sum_test üçün
mysql> select sum(id) from sum_test;
+---------+
| sum(id) |
+---------+
|      10 |
+---------+
1 row in set (0.00 sec)

-- sum_test2 üçün

mysql> select sum(id) from sum_test2; 
+---------+
| sum(id) |
+---------+
|      21 |
+---------+
1 row in set (0.00 sec)

Bəli həqiqətən də sum_test üçün: 1+2+3+4=10 edir. sum_test2 üçün isə: 1+2+3+4+5+6=21 edir. Nə gözəl nə qəşəy…
Yaxşı deyək ki, indi bizə lazımdır sum_test və sum_test2 üçün sum-ları eyni anda çıxarım.Yəni 2 table-dan məlumat çıxarım. Burda istifadə olunacaq join (və yaxud inner join).

select 
    sum(sum_test2.id), sum(sum_test.id)
from
    sum_test,
    sum_test2;

Məntiqlə fikirləşsək dərhal demək olar ki, cavabımız 21 və 10 olacaq…Yuxarıdakı misala uyğun olaraq bu belə olmalıdır…Amma ki :

Bir yerdən külək əsir elə bil😀
Yaxşı məntiqimiz suya düşdü ama niyə???
Deməli Join-də belə bir qayda var ki, əgər join-i heç bir şərtsiz(where-siz meselen) yerinə yetirsək. O zaman son nəticədə görsənəcək row sayı fərqli olacaq və belə hesablanacaq: sum_test-də 4 row , sum_test2-də isə 6…Join nəticəsi olaraq 4×6=24 row çıxacaq

Göstərək:

Həqiqətən də 24 row çıxır…Və məncə şəkildən də aydın olur, bu 84 və 60 cavabları hardan peyda olub🙂
Yəni ordakı sol və sağda olan rəqəmləri topladıqda 84 və 60 alınır…

Bəs onda çıxış yolu nədədir??? Sadə bir Subquery:

select (select sum(id) from sum_test2),(select sum(id) from sum_test) from dual;

Hətta hər hansı riyazi əməliyyatlar da aparmaq olar.Məsələn:

mysql> select (select sum(id) from sum_test2)+(select sum(id) from sum_test) as sum;
+------+
| sum  |
+------+
|   31 |
+------+
1 row in set (0.00 sec)

Təşəkkürlər🙂

Kateqoriyalar: MySQL Etiketlər: , , , ,
  1. Fevral 7, 2014 tarixində, saat 20:55

    Salam, bir sey sorusum; umumyetle bezen ele olurki baxramki qarsima goydygym tapsirigi joinlede ede bilerem, sub queryler-lede; performans cehetden subquerylerden cox istifade etmek zererlimidir?

    • Fevral 8, 2014 tarixində, saat 09:50

      Əgər söhbət MySQL-dən gedirsə, o zaman bir şeyi deməliyəm ki,
      Köhnə versiya MySQL-lərdə yəni 5.1 və 5.5-də Subquery-lər performance cəhətdən elə də yaxşı deyildi. Lakin yeni 5.6.x versiyalarda bir çox improvement olub ki, indi artıq subquery-ləri təhlükə hesab etmirik. Ən azından Oracle elə elan edib:

      http://www.mysql.com/news-and-events/events/innovation-day/slides/MySQL_Innovation_Day_Optimizer.pdf

      Lakin istənilən halda, eyni query-ni həm join-lə həm də subquery ilə yazıb Explain plana baxıb hansının daha üstün olduğuna qərar verə bilərsiniz. Nəyin zərərli nəyin xeyirli olmağına yalnız konkret hallarda qərar verə bilərik. Ümumi elə bir qayda yoxdur ki, subquery olmaz join olar və yaxud əksinə😉

  2. Fevral 8, 2014 tarixində, saat 20:13

    ok, tesekkurler🙂

  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: