SELECT emp.ID,emp.Name,emp.DepartmentID,dep.ID,dep.Name
FROM Employees emp
JOIN Departments dep ON emp.DepartmentID=dep.ID
ID
|
Name
|
DepartmentID
|
ID
|
Name
|
1000
|
O'tish: Saytda Harakatlanish, Qidiruv
|
1
|
1
|
Boshqaruv
|
1001
|
Petrov P. P.
|
3
|
3
|
It
|
1002
|
Sidorov S. S.
|
2
|
2
|
Buxgalteriya hisobi
|
1003
|
Andreev A. A. A.
|
3
|
3
|
It
|
1004
|
Николаев Н.Н.
|
3
|
3
|
ИТ
|
-- LEFT JOIN вернет 6 строк
SELECT emp.ID,emp.Name,emp.DepartmentID,dep.ID,dep.Name
FROM Employees emp
LEFT JOIN Departments dep ON emp.DepartmentID=dep.ID
ID
|
Name
|
DepartmentID
|
ID
|
Name
|
1000
|
O'tish: Saytda Harakatlanish, Qidiruv
|
1
|
1
|
Boshqaruv
|
1001
|
Petrov P. P.
|
3
|
3
|
It
|
1002
|
Sidorov S. S.
|
2
|
2
|
Buxgalteriya hisobi
|
1003
|
Andreev A. A. A.
|
3
|
3
|
It
|
1004
|
Nikolaev N. N.
|
3
|
3
|
It
|
1005
|
Aleksandrov A. A.
|
NULL
|
NULL
|
NULL
|
-- RIGHT JOIN вернет 7 строк
SELECT emp.ID,emp.Name,emp.DepartmentID,dep.ID,dep.Name
FROM Employees emp
RIGHT JOIN Departments dep ON emp.DepartmentID=dep.ID
ID
|
Name
|
DepartmentID
|
ID
|
Name
|
1000
|
O'tish: Saytda Harakatlanish, Qidiruv
|
1
|
1
|
Boshqaruv
|
1002
|
Sidorov S. S.
|
2
|
2
|
Buxgalteriya hisobi
|
1001
|
Petrov P. P.
|
3
|
3
|
It
|
1003
|
Andreev A. A. A.
|
3
|
3
|
It
|
1004
|
Nikolaev N. N.
|
3
|
3
|
It
|
NULL
|
NULL
|
NULL
|
4
|
Marketing va reklama
|
NULL
|
NULL
|
NULL
|
5
|
Logistika
|
-- FULL JOIN вернет 8 строк
SELECT emp.ID,emp.Name,emp.DepartmentID,dep.ID,dep.Name
FROM Employees emp
FULL JOIN Departments dep ON emp.DepartmentID=dep.ID
ID
|
Name
|
DepartmentID
|
ID
|
Name
|
1000
|
O'tish: Saytda Harakatlanish, Qidiruv
|
1
|
1
|
Boshqaruv
|
1001
|
Petrov P. P.
|
3
|
3
|
It
|
1002
|
Sidorov S. S.
|
2
|
2
|
Buxgalteriya hisobi
|
1003
|
Andreev A. A. A.
|
3
|
3
|
It
|
1004
|
Nikolaev N. N.
|
3
|
3
|
It
|
1005
|
Aleksandrov A. A.
|
NULL
|
NULL
|
NULL
|
NULL
|
NULL
|
NULL
|
4
|
Marketing va reklama
|
NULL
|
NULL
|
NULL
|
5
|
Logistika
|
-- CROSS JOIN вернет 30 строк - (6 строк таблицы Employees) * (5 строк таблицы Departments)
SELECT emp.ID,emp.Name,emp.DepartmentID,dep.ID,dep.Name
FROM Employees emp
CROSS JOIN Departments dep
ID
|
Name
|
DepartmentID
|
ID
|
Name
|
1000
|
O'tish: Saytda Harakatlanish, Qidiruv
|
1
|
1
|
Boshqaruv
|
1001
|
Petrov P. P.
|
3
|
1
|
Boshqaruv
|
1002
|
Sidorov S. S.
|
2
|
1
|
Boshqaruv
|
1003
|
Andreev A. A. A.
|
3
|
1
|
Boshqaruv
|
1004
|
Nikolaev N. N.
|
3
|
1
|
Boshqaruv
|
1005
|
Александров А.А.
|
NULL
|
1
|
Администрация
|
1000
|
Иванов И.И.
|
1
|
2
|
Бухгалтерия
|
1001
|
Петров П.П.
|
3
|
2
|
Бухгалтерия
|
1002
|
Сидоров С.С.
|
2
|
2
|
Бухгалтерия
|
1003
|
Andreev A. A. A.
|
3
|
2
|
Buxgalteriya hisobi
|
1004
|
Nikolaev N. N.
|
3
|
2
|
Buxgalteriya hisobi
|
1005
|
Aleksandrov A. A.
|
NULL
|
2
|
Buxgalteriya hisobi
|
1000
|
O'tish: Saytda Harakatlanish, Qidiruv
|
1
|
3
|
It
|
1001
|
Petrov P. P.
|
3
|
3
|
It
|
1002
|
Sidorov S. S.
|
2
|
3
|
It
|
1003
|
Andreev A. A. A.
|
3
|
3
|
It
|
1004
|
Nikolaev N. N.
|
3
|
3
|
It
|
1005
|
Aleksandrov A. A.
|
NULL
|
3
|
It
|
1000
|
O'tish: Saytda Harakatlanish, Qidiruv
|
1
|
4
|
Marketing va reklama
|
1001
|
Petrov P. P.
|
3
|
4
|
Marketing va reklama
|
1002
|
Sidorov S. S.
|
2
|
4
|
Marketing va reklama
|
1003
|
Andreev A. A. A.
|
3
|
4
|
Marketing va reklama
|
1004
|
Nikolaev N. N.
|
3
|
4
|
Marketing va reklama
|
1005
|
Aleksandrov A. A.
|
NULL
|
4
|
Marketing va reklama
|
1000
|
O'tish: Saytda Harakatlanish, Qidiruv
|
1
|
5
|
Logistika
|
1001
|
Petrov P. P.
|
3
|
5
|
Logistika
|
1002
|
Sidorov S. S.
|
2
|
5
|
Logistika
|
1003
|
Andreev A. A. A.
|
3
|
5
|
Logistika
|
1004
|
Nikolaev N. N.
|
3
|
5
|
Logistika
|
1005
|
Aleksandrov A. A.
|
NULL
|
5
|
Logistika
|
Ikkinchi qismning boshida aytgan jadvallarning taxalluslari haqida eslash vaqti keldi.
Ko'p sonli so'rovlarda, taxallus bizga maydonning qaysi jadvalidan olinganligini aniq ko'rsatishga yordam beradi. Keling, misolni ko'rib chiqaylik:
SELECT emp.ID,emp.Name,emp.DepartmentID,dep.ID,dep.Name
FROM Employees emp
JOIN Departments dep ON emp.DepartmentID=dep.ID
Unda ID va Name nomlari bo'lgan joylar ikkala jadvalda ham, Employees va Departments-da ham mavjud. Va ularni ajratish uchun biz maydonning nomini taxallus va nuqta bilan, ya'ni "emp.ID", "emp.Name", "dep.ID", "dep.Name".
Nima uchun qisqa taxalluslardan foydalanish qulayroq ekanini eslaymiz – chunki taxalluslarsiz bizning so'rovimiz quyidagicha ko'rinadi:
SELECT Employees.ID,Employees.Name,Employees.DepartmentID,Departments.ID,Departments.Name
FROM Employees
JOIN Departments ON Employees.DepartmentID=Departments.ID
Men uchun juda uzoq va yomonroq o'qildi, chunki maydonlarning nomlari jadvallarning takrorlanadigan nomlari orasida ingl.
Agar ism ikkinchi jadvalda takrorlanmagan bo'lsa-da, taxallussiz ismni belgilashingiz mumkin bo'lsa-da, ko'p sonli so'rovlarda, lekin men har doim ulanish uchun taxalluslardan foydalanishni tavsiya qilaman, chunki hech kim bir xil ismga ega bo'lgan maydon oxir-oqibat ikkinchi stolga qo'shilmaydi, keyin sizning so'rovingiz buziladi, bu maydon qaysi jadvalga tegishli ekanini tushunolmasligi uchun qasam ichish.
Faqat taxalluslardan foydalanib, biz jadvalni o'zi bilan bog'lashimiz mumkin. Keling, har bir xodim uchun, undan oldin qabul qilingan xodimning ma'lumotlarini olish vazifasi bor edi (jadval raqami birlikda kamroq farq qiladi). Keling, jadval raqamlari ketma-ket va teshiksiz beriladi, keyin biz buni quyidagicha qilishimiz mumkin:
SELECT
e1.ID EmpID1,
e1.Name EmpName1,
e2.ID EmpID2,
e2.Name EmpName2
FROM Employees e1
LEFT JOIN Employees e2 ON e1.ID=e2.ID+1 -- получить данные предыдущего сотрудника
Ya'ni, bu erda bir stol Employees, biz "E1" taxallusini va ikkinchi "e2"ni berdik.
JOIN
SELECT l.*,r.*
FROM LeftTable l
JOIN RightTable r ON l.LCode=r.RCode
LCode
|
LDescr
|
RCode
|
RDescr
|
2
|
L-2
|
2
|
B-2
|
3
|
L-3
|
3
|
B-3
|
Bu erda shartlar bajarilgan satrlarni birlashtirish qaytarildi (l.LCode=r.RCode)
Do'stlaringiz bilan baham: |