SQLShack (Română)

Dacă doriți să obțineți ceva semnificativ din date , aproape întotdeauna va trebui să vă alăturați mai multor tabele. În acest articol, vom arăta cum să faceți acest lucru folosind diferite tipuri de asocieri. Pentru a realiza acest lucru, vom combina INNER JOINs și LEFT JOINs. Deci, să începem.

Modelul

În imaginea de mai jos puteți vedea modelul existent. Este format din 6 tabele și l-am descris deja, mai mult sau mai puțin, în articolele anterioare.

Totuși, chiar și fără a descrie, dacă baza de date este modelată și prezentată într-un mod bun (alegerea cu înțelepciune a numelor, utilizarea convenției de numire, respectarea acelorași reguli de-a lungul întregului model, liniile / relațiile din schemă nu se suprapun mai mult decât este necesar), ar trebui să puteți pentru a concluziona unde puteți găsi datele de care aveți nevoie. Acest lucru este crucial, deoarece înainte de a vă alătura mai multor tabele, trebuie mai întâi să identificați aceste tabele.

Vom vorbi despre convenția de numire și sfaturile despre cum să gândiți atunci când scrieți interogări SQL, mai târziu în acest serie. Până acum, să trăim cu faptul că acest model este destul de simplu și îl putem face destul de ușor.

Ce știm până acum?

În această serie, am acoperit:

  • Noțiuni de bază legate de instrucțiunea SQL SELECT și
  • INNER JOIN și LEFT JOIN comparate

Vom folosi cunoștințele din ambele articole și combinați-le pentru a scrie instrucțiuni SELECT mai complexe care vor uni mai multe tabele.

Alăturați-vă mai multor tabele folosind INNER JOIN

Primul exemplu pe care îl vom analiza este modul de recuperare date din mai multe tabele folosind numai INNER JOIN-uri. Pentru fiecare exemplu, vom alege definiția problemei pe care trebuie să o rezolvăm și interogarea care face treaba. Deci, să începem cu prima problemă.

# 1 Trebuie să listăm toate apelurile cu ora de început și ora de sfârșit. Pentru fiecare apel, dorim să afișăm care a fost rezultatul, precum și numele și prenumele angajatului care a făcut acel apel. Ne vom sorta apelurile în funcție de ora de început ascendentă.

Înainte de a scrie interogarea, vom identifica tabelele pe care trebuie să le folosim. Pentru a face acest lucru, trebuie să stabilim ce tabele conțin datele de care avem nevoie și să le includem. De asemenea, ar trebui să includem toate tabelele de-a lungul drumului între aceste tabele – tabele care nu conțin date necesare, dar servesc drept relație între tabelele care o fac (nu este cazul aici).

Interogarea care efectuează lucrarea este dată mai jos:

Rezultatul interogării este dat mai jos:

Există câteva lucruri pe care aș dori să le subliniez aici:

  • Tabelele la care ne-am alăturat sunt aici deoarece datele avem nevoie se află în aceste 3 tabele
  • De fiecare dată când menționez orice atribut din orice tabel, folosesc format nume_tabel.nume_atribut (de exemplu, angajat.first_name). Deși nu este necesar, este o practică bună, deoarece uneori 2 sau mai multe tabele din aceeași interogare ar putea folosi aceleași nume de atribute și asta ar duce la o eroare
  • Am folosit INNER JOIN de 2 ori în ordine să se alăture 3 mese. Acest lucru va avea ca rezultat returnarea numai rândurilor cu perechi într-un alt tabel
  • Când utilizați numai INNER JOINs pentru a uni mai multe tabele, ordinea acestor tabele în combinații nu este importantă. Singurul lucru important este că utilizați condiții de înscriere adecvate după „ACTIVAT” (înscriere utilizând chei străine)

Deoarece toate apelurile au avut legătură cu angajatul și rezultatul apelului, am obține același rezultat dacă am folosit LEFT JOIN în loc de INNER JOIN.

Alăturați-vă mai multor tabele folosind LEFT JOIN

Scrierea interogărilor care utilizează LEFT JOIN nu diferă mult în comparație cu scrierea interogărilor folosind INNER JOIN. Rezultatul ar fi, desigur, diferit (cel puțin în cazurile în care unele înregistrări nu au o pereche în alte tabele).

Aceasta este problema pe care dorim să o rezolvăm.

# 2 Enumerați toate județele și clienții care au legătură cu aceste țări. Pentru fiecare țară afișați-vă numele în limba engleză, numele clientului orașului este situat, precum și numele clientului respectiv. Reveniți chiar și țările fără orașe conexe și clienți.

Tabelele care conțin date de care avem nevoie sunt în imaginea de mai jos:

În primul rând, să verifica rapid care este cont elementele acestor 3 tabele.

Putem observa două lucruri importante:

  • Deși fiecare oraș are o țară înrudită, nu toate țările au orașe înrudite (Spania & Rusia nu le are)
  • Același lucru reprezintă clienții.Fiecare client are valoarea city_id definită, dar sunt utilizate doar 3 orașe (Berlin, Zagreb & New York)

Să notăm mai întâi interogare folosind INNER JOIN:

Rezultatul interogării este prezentat în imaginea de mai jos:

7 județe și 6 orașe din baza noastră de date, dar interogarea noastră returnează doar 4 rânduri. Acesta este rezultatul faptului că avem doar 4 clienți în baza noastră de date. Fiecare dintre aceste 4 este legat de orașul său, iar orașul este legat de țară. Deci, INNER JOIN a eliminat toate aceste țări și orașe fără clienți. Dar cum să le includem și în rezultat?

Pentru a face acest lucru, vom folosi LEFT JOIN. Vom înlocui pur și simplu toate „INNER” cu „STÂNGA”, astfel încât interogarea noastră este următoarea:

Rezultatul este prezentat în imaginea de mai jos:

Puteți observa cu ușurință că acum avem toate țările, chiar și cele fără niciun oraș legat (Rusia & Spania), precum și toate orașe, chiar și cele fără clienți (Varșovia, Belgrad & Los Angeles). Cele 4 rânduri rămase sunt aceleași ca în interogarea utilizând INNER JOIN.

LEFT JOIN – ordinea tabelelor contează

Deși ordinea JOIN-urilor din INNER JOIN nu este importantă, la fel nu stă la JOIN STÂNGA. Când folosim LEFT JOIN pentru a uni mai multe tabele, este important să ne amintim că această îmbinare va include toate rândurile din tabelul din partea STÂNGA a JOIN. Să rearanjăm interogarea anterioară:

La început, ați putea spune cu ușurință, că această interogare și cea anterioară sunt aceleași (acest lucru este adevărat atunci când utilizați INNER JOIN). Am folosit aceleași tabele, ÎNREGISTRĂRI STÂNGA și aceleași condiții de înscriere. Să aruncăm o privire mai întâi asupra rezultatului:

Deci, ce s-a întâmplat aici? De ce avem 4 rânduri (aceleași 4 pe care le-am avut când am folosit INNER JOIN)?

Răspunsul este simplu și este legat de modul în care funcționează LEFT JOIN. Acesta ia primul tabel (client) și își unește toate rândurile (4 dintre ele) la tabelul următor (oraș). Rezultatul este de 4 rânduri, deoarece clientul ar putea aparține doar unui oraș. Apoi, alăturăm aceste 4 rânduri la următorul tabel (țară) și din nou avem 4 rânduri, deoarece orașul ar putea aparține doar unei țări.

Motivul pentru care nu ne-am alătura acestor 3 tabele în acest modul este dat de textul exemplului # 2. Interogarea este scrisă astfel încât să returneze 4 rânduri ar fi răspunsul la următoarele: Reveniți numele tuturor clienților, precum și orașele și țările în care se află. Returnați chiar și clienții fără orașe și țări conexe.

  • Notă: Când utilizați ÎNREGISTRARE STÂNGA, ordinea tabelelor din acea instrucțiune este importantă și interogarea va întoarce un rezultat diferit dacă modificați această comandă. Comanda depinde de fapt de ceea ce doriți să returnați ca rezultat.

Alăturați-vă mai multor tabele folosind ambele – INNER JOIN & LEFT JOIN

Acest lucru este, de asemenea, posibil. Să mergem din nou cu un exemplu.

# 3 Întoarceți lista tuturor țărilor și orașelor care au perechi (excludeți țările la care niciun oraș nu face referință). Pentru astfel de perechi returnează toți clienții. Returnează chiar perechi care nu au un singur client.

Interogarea care face treaba este:

Rezultatul interogării este dat în imaginea de mai jos:

Puteți observa cu ușurință că nu avem țări fără niciun oraș înrudit (acestea erau Spania & Rusia). INNER JOIN a eliminat aceste rânduri. Totuși, avem citări fără clienți (Belgrad, Los Angeles & Varșovia). Acesta este rezultatul faptului că am folosit LEFT JOIN între tabelele oraș și client.

Concluzie

Când trebuie să vă alăturați mai multor tabele, aveți INNER & LEFT JOIN la dispoziția dvs. (DREAPTA ÎMPREUNĂ este rar utilizată și poate fi ușor înlocuită cu LEFT JOIN). Ce alăturare pe care o veți utiliza depinde direct de sarcina pe care trebuie să o rezolvați și veți avea sentimentul pe parcurs. În articolele viitoare, vom discuta despre modul de gândire și organizare atunci când trebuie să scrieți interogări mai complexe.

Cuprins

Aflați SQL: CREATE DATABASE & Operații CREATE TABLE

Learn SQL: INSERT INTO TABLE

Learn SQL: Primary Key

Learn SQL: Foreign Key

Learn SQL: SELECT statement

Learn SQL: INNER JOIN vs LEFT JOIN

Learn SQL: SQL Scripts

Learn SQL: Tipuri de relații

Learn SQL: Join multiple tables

Learn SQL: Aggregate Functions

Learn SQL: How to Write a Complex SELECT Interogare

Aflați SQL: baza de date INFORMATION_SCHEMA

Aflați SQL: Tipuri de date SQL

Aflați SQL: Teoria setului

Learn SQL: User-Defined Functions

Learn SQL: User-Defined Stored Procedures

Learn SQL: SQL Views

Learn SQL: SQL Triggers

Learn SQL: Practice SQL Queries

Learn SQL: SQL Exemple de interogare

Aflați SQL: creați manual un raport folosind interogări SQL

Aflați SQL: Funcții de dată și oră SQL Server

Aflați SQL: creați rapoarte SQL Server utilizând funcții de dată și oră

Aflați SQL: tabele pivot SQL Server

Learn SQL: SQL Server export to Excel

Learn SQL: Introducere în buclele SQL Server

Learn SQL: SQL Server Cursors

Aflați SQL: Cele mai bune practici SQL pentru ștergerea și actualizarea datelor

Aflați SQL: Convenții de numire

Aflați SQL: Lucrări legate de SQL

Learn SQL: Non-Equi Joins in SQL Server

Learn SQL: SQL Injection

  • Autor
  • Postări recente
Emil este un profesionist în baze de date cu peste 10 ani de experiență în tot ceea ce privește bazele de date . De-a lungul anilor, a lucrat în industria IT și financiară și acum lucrează ca freelancer.
Angajamentele sale din trecut și prezent variază de la proiectarea și codificarea bazelor de date până la predare, consultanță și scriere despre baze de date. De asemenea, să nu uităm, BI, creând algoritmi, șah, filatelie, 2 câini, 2 pisici, 1 soție, 1 bebeluș …
Îl poți găsi pe LinkedIn
Vezi toate mesajele lui Emil Drkusic

Ultimele mesaje ale lui Emil Drkusic (vezi toate)
  • Learn SQL: SQL Injection – 2 noiembrie 2020
  • Learn SQL: Non-Equi Joins in SQL Server – 29 septembrie 2020
  • Learn SQL: Locuri de muncă legate de SQL – 1 septembrie 2020

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *