Bagly tablisa
Indi soraglarymyzy birneme çylşyrymlaşdyralyň. Maglumatlar binýadymyza täze tablisa task goşalyň — bu tablisada işgärlerimize berlen wezipeler bar. Görüp geçeliň, bu tablisada nähili ýazgylar bar:
SELECT * FROM task
Şeýle soragyň netijesi:
id | emploee_id | name | deadline |
---|---|---|---|
1 | 1 | Frontende ýaýdan ýerleri düzetmek | 2022-06-01 |
2 | 2 | Backendde ýaýdan ýerleri düzetmek | 2022-06-15 |
3 | 5 | Kofe satyn almak | 2022-07-01 |
4 | 5 | Kofe satyn almak | 2022-08-01 |
5 | 5 | Kofe satyn almak | 2022-09-01 |
6 | (NULL) | Ofisi arassalamak | (NULL) |
7 | 4 | Ömrüň hözirini görmek | (NULL) |
8 | 6 | Ömrüň hözirini görmek | (NULL) |
Bu tablisada jemi 4 kolonka bar:
- id — wezipäniň täsin belgisi (we tablisadaky setiriň);
- employee_id — wezipä bellän işgärimiziň employee tablisasyndaky ID belgisi;
- name — wezipesiniň ady we beýany;
- deadline — wezipäni ýerine ýetirmeli wagt.
Käbir çylşyrymly meselelerde üns beriň. N6 wezipäniň employee_id ýok, başymyzda hiç hili arassalaýyş hyzmaty ýok. Wezipe bar, ýerine ýetiriji ýok. Şeýle zatlar bolýar.
6-9 wezipelerde bellenen wagtlimiti ýok. Munuň ýaly ýagdaýlar, wezipe yzygiderli we erksiz ýerine ýetirilmeli bolsa, ýüze çykyp biler. Mysal üçin, ofis her gün arassalanmaly, ömrüň hözirini görmek hem her gün gerek :)
Eger bir tablisada başga bir tablisanyň ID-dan peýdalansa, şol tablisa bagly diýilýär.
Birnäçe tablisadan sorag
Task tablisasynda "Ömrüň hözirini görmek" diýen iki sany wezipe bar. Bu wagt hözirini kim görüji?
Bunun üçin SQL-de iki tablisadan sorag edip bolýar. Aslynda SQL-de bir wagtyň özünde islendik sany tablisadan sorag edip bolýar. Soragyň umumy görnüşi:
SELECT kolonalar FROM tablis1, tablis2, tablisN
Diňle! Eger birnäçe tablisadan sorag ýazsaň, netijede "dekart çarpmasy" diýilýän zat alarsyň. Birinji tablisanyň her bir setirine ikinji tablisanyň her bir setiri goşular we ş.m.
Edil Java dilinde şeýle sorag şeýle bolup biler:
for (String row1 : table1)
{
for (String row2 : table2)
{
System.out.println(row1 + row2);
}
}
Indi iki tablisadan birden öz soragymyzy ýazalyň we näme çykjakdygyny göreliň:
SELECT * FROM employee, task
Bu soragyň netijesi:
id | name | occupation | salary | age | id | emploee_id | name | deadline |
---|---|---|---|---|---|---|---|---|
1 | Iwanow Iwan | Programmist | 100000 | 25 | 1 | 1 | Frontende ýaýdan ýerleri düzetmek | 2022-06-01 |
2 | Petrow Petr | Programmist | 80000 | 23 | 1 | 1 | Frontende ýaýdan ýerleri düzetmek | 2022-06-01 |
3 | Iwanow Sergeý | Testirleýji | 40000 | 30 | 1 | 1 | Frontende ýaýdan ýerleri düzetmek | 2022-06-01 |
4 | Rabinowiç Moýşa | Derektor | 200000 | 35 | 1 | 1 | Frontende ýaýdan ýerleri düzetmek | 2022-06-01 |
5 | Kiriýenko Anastasýa | Ofis-menejer | 40000 | 25 | 1 | 1 | Frontende ýaýdan ýerleri düzetmek | 2022-06-01 |
6 | Waşka | pişik | 1000 | 3 | 1 | 1 | Frontende ýaýdan ýerleri düzetmek | 2022-06-01 |
1 | Iwanow Iwan | Programmist | 100000 | 25 | 2 | 2 | Backendde ýaýdan ýerleri düzetmek | 2022-06-15 |
2 | Petrow Petr | Programmist | 80000 | 23 | 2 | 2 | Backendde ýaýdan ýerleri düzetmek | 2022-06-15 |
3 | Iwanow Sergeý | Testirleýji | 40000 | 30 | 2 | 2 | Backendde ýaýdan ýerleri düzetmek | 2022-06-15 |
4 | Rabinowiç Moýşa | Derektor | 200000 | 35 | 2 | 2 | Backendde ýaýdan ýerleri düzetmek | 2022-06-15 |
5 | Kiriýenko Anastasýa | Ofis-menejer | 40000 | 25 | 2 | 2 | Backendde ýaýdan ýerleri düzetmek | 2022-06-15 |
Jemi 48 setirimiz bar, emma men diňe 11 setir görkezdim. Ýogsam ýer ýetmezdi.
Üns ber, üç zada:
- Birmeňzeş atlar bilen kolonlar: id. Employee tablisadan id we task tablisadan id.
- Her tablisanyň setirleri gaýtalanýar. Çep sütündäki ID 6-dan soň ID täzeden 1 bolýar.
- Manysy ýok setirlerimiz bar, mysal üçin, employee tablisadaky id 6-gä deň bolsa we şol setirde employee_id 1-gä deň bolsa.
Manysy ýok setirleri aýyrmak
Employee we task tablisalaryň ähli setirleriniň dekart çarpmasy bolan netijeli tablisamyzda setir örän köp.
Logika laýyklykda, employee_id 3-e diýen setir diňe employee tablisadan id 3-e diýen setir bilen birleşmelidir. Bu düşnüksizligi WHERE bilen düzedeliň.
Şeýle sorag ýazalyň:
SELECT * FROM employee, task WHERE emploee.id = task.emploee_id
Bu soragyň netijesi:
id | name | occupation | salary | age | id | emploee_id | name | deadline |
---|---|---|---|---|---|---|---|---|
1 | Iwanow Iwan | Programmist | 100000 | 25 | 1 | 1 | Frontende ýaýdan ýerleri düzetmek | 2022-06-01 |
2 | Petrow Petr | Programmist | 80000 | 23 | 2 | 2 | Backendde ýaýdan ýerleri düzetmek | 2022-06-15 |
4 | Rabinowiç Moýşa | Derektor | 200000 | 35 | 7 | 4 | Ömrüň hözirini görmek | (NULL) |
5 | Kiriýenko Anastasýa | Ofis-menejer | 40000 | 25 | 3 | 5 | Kofe satyn almak | 2022-07-01 |
5 | Kiriýenko Anastasýa | Ofis-menejer | 40000 | 25 | 4 | 5 | Kofe satyn almak | 2022-08-01 |
5 | Kiriýenko Anastasýa | Ofis-menejer | 40000 | 25 | 5 | 5 | Kofe satyn almak | 2022-09-01 |
6 | Waşka | pişik | 1000 | 3 | 8 | 6 | Ömrüň hözirini görmek | (NULL) |
Gowy habar — manysy ýok setirlerimiz ýok boldy: ilkinji sütün setirindäki id hemişe employee_id-e deň.
Erbet habar — hiç kime berilmedik wezipeler, mysal üçin, ofisi arassalamak ýaly wezipeler ýok boldy. Olaryň employee_id NULL-e deňdi, şonuň üçin WHERE ýerine ýetirenden soň aýryldy.
GO TO FULL VERSION