SQL-də VƏ VƏ VƏ VƏ VƏ VƏ YA DA BÖLMƏLƏR

Krediti sona çatma tarixi iyun ayında olan borcalan qeydlərini götürən aşağıdakı sualı nəzərdən keçirin.

SELECT BRWR_ID, ISBN 
	FROM BOOK_LOAN 
     WHERE DUE_DATE >= ‘1-Jun-2015’;

Yuxarıdakı sorğu BRWR_ID və ISBN -ni görən kimi yarımçıq görünür; kim borc götürdüyünü və ya götürdüyü kitabı müəyyən edə bilməz. İstifadəçiyə ən az məlumat verən hamısı identifikatorlardır. İstifadəçi bu şəxsiyyət sənədlərinin nə olduğunu anlamayacaq. Buna görə şəxsiyyət vəsiqəsi əvəzinə yuxarıdakı sorğuda borcalanın adını və kitabını göstərməliyik. Amma BOOK_LOAN cədvəlində adlarımız yoxdur. Borc və kitablarda var masaları müvafiq olaraq. Bu səbəbdən BOOK_LOAN cədvəlini bağlayaraq bu cədvəlləri də sorğulamalıyıq. Adları almaq üçün onları necə bağlaya bilərik? Bu mümkündür, çünki bu üç masanın hamısı xarici düymələr vasitəsilə bir -biri ilə müqayisə olunur. Nəticəni əldə etmək üçün BOOK_LOAN ilə iki cədvələ qoşulmalıyıq. Beləliklə, yuxarıdakı sorğuya daha iki şərt əlavə edirik. WHERE bəndindəki şərtləri burada AND cümləsi ilə əlaqələndirə bilərik. Sorğuda göstərilən bütün şərtlərin yerinə yetirildiyindən əmin olur və nəticəni göstərir. Beləliklə, mənalı nəticə əldə etmək üçün aşağıdakı kimi sorğu yaza bilərik.
SELECT BL.BRWR_ID, BL.ISBN
	FROM BOOK_LOAN BL, BORROWER BR, BOOKS B
     WHERE BL.BRWR_ID = BR.BRWR_ID
AND BL.ISBN = B.ISBN
AND BL.DUE_DATE >= '1-Jun-2015';

Burada qeyd edək ki, birləşmə şərtinin qaydası əvvəlcə FROM bəndindəki cədvəlləri göründükləri sırada birləşdirmək və sonra digər filtr şərtlərinə sahib olmaqdır. Ancaq yenə də mənalı bir nəticə verməyən şəxsiyyət vəsiqələrini nümayiş etdiririk. Buna görə müvafiq cədvəllərdən düzgün sütunları çəkək.

SELECT BR.BRWR_NAME, B.BOOK_NAME
	FROM BOOK_LOAN BL, BORROWER BR, BOOKS B
     WHERE BL.BRWR_ID = BR.BRWR_ID
AND BL.ISBN = B.ISBN
AND BL.DUE_DATE >= '1-Jun-2015';

Burada sorğu BOOK_COPY-dən həm BORROWER, həm də BOOKS ilə uyğun gələn qeydləri yoxlayır və qeydləri alır. Sonra son tarixə əsasən süzülür və yalnız SEÇMƏ sorğusunda tələb olunan sütunları göstərir. Beləliklə, istifadəçi üçün düzgün və başa düşülən nəticəni əldə edirik.

Bəzən istifadəçilərin iki şərti olur və şərtlərdən biri doğrudursa nəticələrini görmək istəyirlər. Bu vəziyyətdə OR vəziyyəti WHERE bəndindəki şərtləri birləşdirmək üçün istifadə olunur. Daha sonra şərtlərdən biri doğru olduqda nəticələri göstərəcəkdir.

2010-cu ildə və ya 2014-cü ildə kitabxanaya daxil olan Kitab detallarını çəkmək üçün sorğunu nəzərdən keçirin. Kitabxanaya nə vaxt gəldiklərini bilmək üçün BOOK_COPY cədvəlini soruşmalıyıq.

SELECT bc.ISBN, bc.COPY_NUM, bc.RECEIVED_DATE
FROM BOOK_COPY bc
WHERE TO_CHAR (bc.RECEIVED_DATE, 'YYYY') = '2010' 
	OR TO_CHAR (bc.RECEIVED_DATE, 'YYYY') = '2014';

Bu sorğunu daha dəqiq etmək üçün:

SELECT bc.ISBN, b.BOOK_NAME, bc.COPY_NUM, bc.RECEIVED_DATE
FROM BOOK_COPY bc, BOOKS b
WHERE bc.ISBN = b.ISBN
AND (TO_CHAR (bc.RECEIVED_DATE, 'YYYY') = '2010' 
	OR TO_CHAR (bc.RECEIVED_DATE, 'YYYY') = '2014');

Kredit tarixi İyun 2015-ci il olan və ya son tarix 2015-ci ilin iyun ayında olan qeydləri çəkmək üçün sorğunu nəzərdən keçirin. Bunun kredit tarixi və son tarix üçün BOOK_LOAN cədvəlini soruşması lazımdır.

SELECT BRWR_ID, ISBN, LOAN_DATE, DUE_DATE
	FROM BOOK_LOAN BL
     WHERE   BL.LOAN_DATE >= '1-Jun-2015' OR BL.DUE_DATE >= '1-Jun-2015';

Ancaq istifadəçinin anlaya biləcəyi sütun detallarını müvafiq ana masalarından əldə edə bilərsiniz - KİTABLAR və BORCU.

SELECT BR.BRWR_NAME, B.BOOK_NAME, BL.LOAN_DATE, BL.DUE_DATE
    FROM BOOK_LOAN BL, BORROWER BR, BOOKS B
     WHERE BL.BRWR_ID = BR.BRWR_ID
AND BL.ISBN = B.ISBN
AND BL.LOAN_DATE >= '1-Jun-2015' OR BL.DUE_DATE >= '1-Jun-2015';

Burada nə var? Yalnız 4 qeyd almalı idik, ancaq 4 dən çox qeyd alırıq! Yuxarıdakı sorğu, BL.LOAN_DATE> = '1-Jun-2015' OR BL.DUE_DATE> = '1-Jun-2015' şərtlərini təmin edən bütün qeydləri və sonra BOOK_LOAN cədvəli ilə kartezyen məhsulunu təqdim edəcəkdir. Buna görə səhv nəticə verdi. O zaman burada nə var?

Əvvəlcə BOOKS, BORROWER və BOOK_LOAN arasındakı bütün uyğun qeydləri seçməliyik, sonra borc tarixi və ya son tarixini yoxlamalıyıq. Bu, aşağıdakı kimi edilə bilər - uyğun vəziyyətdəki qeydlər nəticəsində yerinə yetirilməsi lazım olduğu üçün OR vəziyyəti üçün mötərizələr qoyulur.

SELECT BR.BRWR_NAME, B.BOOK_NAME
	FROM BOOK_LOAN BL, BORROWER BR, BOOKS B
     WHERE BL.BRWR_ID = BR.BRWR_ID
AND BL.ISBN = B.ISBN
AND (BL.LOAN_DATE >= '1-Jun-2015' OR BL.DUE_DATE >= '1-Jun-2015');

OR maddəsi üçün başqa bir nümunəni nəzərdən keçirin: James Martin və ya Ajai Kumar tərəfindən yazılmış kitabları sadalayın. Müəllif adları ilə bağlı məlumatları haradan əldə edə bilərik? Müəllif cədvəlindədir. Bu müəlliflərin yazdığı kitablarla bağlı məlumatlar haradadır? BOOK_AUTHOR cədvəlindədir. Bu iki masanın xəritəsini qura bilərikmi? Bəli, xarici açarlarımız var və onları xəritəyə sala bilərik. Bu iki cədvəl mənalı nəticəni göstərmək üçün kifayətdirmi? Bu cədvəllərin hər ikisində istifadəçilərin anlaya bilmədikləri şəxsiyyət vəsiqələri var. Kitab adlarını KİTABLAR cədvəlində olan istifadəçiyə göstərməliyik. Bu səbəbdən 3 cədvəl - AUTHOR, BOOK_AUTHOR və KİTABLAR sorğu etməyimiz lazımdır.

SELECT a.AUTHOR_NAME, b.BOOK_NAME
FROM AUTHOR a, BOOK_AUTHOR ba, BOOKS b
WHERE a.author_id = ba.author_id
AND ba.isbn = b.isbn
AND (a.author_name = ‘James Martin’ OR a.author_name = ‘Ajai Kumar’);

Bu sorğu, hər iki müəllif tərəfindən yazılmış kitablarımız olduğu üçün yalnız bir qeyd göstərir. Niyə?

Sorğumuzda nə səhvdir? Müəllif adını 'James Martin' üçün kiçik hərflə vermişdik, ancaq böyük hərfdədir. Beləliklə, qeydləri işlərinə görə xarakterə görə seçərkən diqqətli olmalıyıq. Beləliklə sorğumuz dəyişəcək:

SELECT a.AUTHOR_NAME, b.BOOK_NAME
FROM AUTHOR a, BOOK_AUTHOR ba, BOOKS b
WHERE a.author_id = ba.author_id
AND ba.isbn = b.isbn
AND (a.author_name = ‘JAMES MARTIN’ OR a.author_name = ‘Ajai Kumar’);

Xarakter növü ilə sorğu yazmağın daha yaxşı yolu onu həssas hala salmaqdır.
SELECT a.AUTHOR_NAME, b.BOOK_NAME
FROM AUTHOR a, BOOK_AUTHOR ba, BOOKS b
WHERE a.author_id = ba.author_id
AND ba.isbn = b.isbn
AND (UPPER (a.author_name)= ‘JAMES MARTIN’ OR UPPER (a.author_name)= = ‘AJAI KUMAR’);

İndi sorğu düzgün nəticələr verir.

Şərh yaz

Translate »