Database
 sql >> Baza danych >  >> RDS >> Database

Jak pisać złożone zapytania w SQL

Typowe zapytania w formacie tabeli SELECT * FROM czasami nie wystarczają. Gdy dane dla zapytania nie znajdują się w jednej tabeli, ale w kilku lub gdy konieczne jest określenie kilku parametrów wyboru naraz, będziesz potrzebować bardziej wyrafinowanych zapytań.

W tym artykule wyjaśnimy, jak tworzyć takie zapytania i podamy przykłady złożonych zapytań SQL.

Jak wygląda złożone zapytanie?

Najpierw zdefiniujmy warunki tworzenia zapytania SQL. W szczególności będziesz musiał użyć następujących parametrów wyboru:

  • nazwy tabel, z których chcesz wyodrębnić dane;
  • wartości pól, które muszą zostać zwrócone do pierwotnych po wprowadzeniu zmian w bazie danych;
  • relacje między tabelami;
  • warunki pobierania próbek;
  • pomocnicze kryteria wyboru (ograniczenia, sposoby prezentowania informacji, rodzaj sortowania).

Aby lepiej zrozumieć temat, rozważmy przykład wykorzystujący poniższe cztery proste tabele. Pierwsza linia to nazwa tabeli, która w złożonych zapytaniach pełni rolę klucza obcego. Rozważymy to szczegółowo na przykładzie:

Każda tabela ma wiersze związane z kilkoma innymi tabelami. Wyjaśnimy dalej, dlaczego jest to konieczne.

Spójrzmy teraz na podstawowe zapytanie SQL:

SELECT * FROM companies WHERE companies_name %STARTSWITH 'P';

%STARTSWIT predykat wybiera wiersze zaczynające się od określonego znaku/znaków.

Wynik wygląda tak:

Rozważmy teraz złożone zapytanie SQL:

SELECT 
	companies.companies_name,
	SUM(CASE WHEN call.id IS NOT NULL THEN 1 ELSE 0 END) AS calls,
	AVG(ISNULL(DATEDIFF(SECOND, calls.start_time, calls.end_time),0)) AS avgdifference
FROM companies 
LEFT JOIN offices ON offices.companies_id = companies.id
LEFT JOIN customers ON offices.id = customers.offices_id
LEFT JOIN calls ON calls.customers_id = customers.id
GROUP BY 
	companies.id,
	companies.companies_name
HAVING AVG(ISNULL(DATEDIFF(SECOND, calls.start_time, calls.end_time),0)) > (SELECT AVG(DATEDIFF(SECOND, calls.start_time, calls.end_time)) FROM calls)
ORDER BY calls DESC, companies.id ASC;

Wynikiem jest następująca tabela:

Tabela pokazuje firmy, odpowiednią liczbę połączeń telefonicznych i ich przybliżony czas trwania.

Ponadto wymienia tylko te nazwy firm, w których średni czas trwania połączenia jest dłuższy niż średni czas trwania połączenia w innych firmach.

Jakie są główne zasady tworzenia złożonych zapytań SQL?

Spróbujmy stworzyć uniwersalny algorytm do tworzenia złożonych zapytań.

Przede wszystkim musisz zdecydować się na tabele składające się z danych, które biorą udział w zapytaniu.

Powyższy przykład dotyczy firm i połączenia tabele. Jeśli tabele z wymaganymi danymi nie są ze sobą bezpośrednio powiązane, należy również uwzględnić tabele pośrednie, które je łączą.

Z tego powodu łączymy również tabele, takie jak biura i klientów , używając kluczy obcych. Dlatego każdy wynik zapytania z tabelami z tego przykładu zawsze będzie zawierał poniższe wiersze:

SELECT 
	...
FROM companies 
LEFT JOIN offices ON offices.companies_id = companies.id
LEFT JOIN customers ON offices.id = customers.offices_id
LEFT JOIN calls ON calls.customers_id = customers.id
...;

After that, you must test the correctness of the behavior in the following part of the query:

SELECT * FROM companies 
LEFT JOIN offices ON offices.companies_id = companies.id
LEFT JOIN customers ON offices.id = customers.offices_id
LEFT JOIN calls ON calls.customers_id = customers.id;

Połączona tabela sugeruje trzy najważniejsze punkty:

  • Zwróć uwagę na listę pól po SELECT. Operacja odczytu danych z połączonych tabel wymaga określenia nazwy tabeli, która ma zostać połączona w nazwa pole.
  • Twoje złożone zapytanie zawsze będzie zawierało główną tabelę (firmy ). Większość pól jest z niego odczytywana. Załączona tabela w naszym przykładzie wykorzystuje trzy tabele – biura , klienci i połączenia . Nazwa jest określana po operatorze JOIN.
  • Oprócz określenia nazwy drugiej tabeli, pamiętaj o określeniu warunku wykonania łączenia. Omówimy ten warunek dalej.
  • Kwerenda wyświetli tabelę z dużą liczbą wierszy. Nie ma potrzeby publikowania go tutaj, ponieważ wyświetla wyniki pośrednie. Jednak zawsze możesz sam sprawdzić jego wyniki. Jest to bardzo ważne, ponieważ pomaga uniknąć błędów w ostatecznym wyniku.

Przyjrzyjmy się teraz tej części zapytania, która porównuje czas trwania połączeń w każdej firmie i między wszystkimi firmami. Musimy obliczyć średni czas trwania wszystkich połączeń. Użyj następującego zapytania:

SELECT AVG(DATEDIFF(SECOND, calls.start_time, calls.end_time)) FROM calls

Pamiętaj, że użyliśmy DATEDIFF funkcja wyprowadzająca różnicę pomiędzy podanymi okresami. W naszym przypadku średni czas trwania połączenia wynosi 335 sekund.

Teraz dodajmy do zapytania dane o połączeniach ze wszystkich firm.

SELECT 
	companies.companies_name,
	SUM(CASE WHEN calls.id IS NOT NULL THEN 1 ELSE 0 END) AS calls,
	AVG(ISNULL(DATEDIFF(SECOND, calls.start_time, calls.end_time),0)) AS avgdifference
FROM companies 
LEFT JOIN offices ON offices.companies_id = companies.id
LEFT JOIN customers ON offices.id = customers.offices_id
LEFT JOIN calls ON calls.customers_id = customers.id
GROUP BY 
	companies.id,
	companies.companies_name
ORDER BY calls DESC, companies.id ASC;

W tym zapytaniu

  • SUMA (W PRZYPADKU, KIEDY call.id NIE JEST NULL, TO 1 JESZCZE 0 KONIEC) – aby uniknąć niepotrzebnych operacji, podsumowujemy tylko istniejące połączenia – gdy liczba połączeń w firmie nie jest zerowa. Jest to bardzo ważne w przypadku dużych tabel z możliwymi wartościami null.
  • ŚREDNIA (ISNULL (DATEDIFF (DRUGA, wywołania.start_time, wywołania.end_time), 0)) – zapytanie jest identyczne z powyższym zapytaniem AVG. Jednak tutaj używamy ISNULL operatora, który zastępuje NULL na 0. Jest to konieczne dla firm, które w ogóle nie dzwonią.

Nasze wyniki:

Prawie skończyliśmy. Powyższa tabela przedstawia listę firm, odpowiadającą im liczbę połączeń dla każdej z nich oraz średni czas trwania połączenia w każdej z nich.

Pozostało tylko porównać liczby z ostatniej kolumny ze średnim czasem trwania wszystkich połączeń ze wszystkich firm (335 sekund).

Jeśli wpiszesz zapytanie, które przedstawiliśmy na samym początku, wystarczy dodać POSIADAJĄC części, dostaniesz to, czego potrzebujesz.

Zdecydowanie zalecamy dodawanie komentarzy w każdym wierszu, aby nie pomylić się w przyszłości, gdy będziesz musiał poprawić niektóre istniejące złożone zapytania SQL.

Ostateczne myśli

Chociaż każde złożone zapytanie SQL wymaga indywidualnego podejścia, niektóre zalecenia są odpowiednie do przygotowania większości takich zapytań.

  • określ, które tabele będą uczestniczyć w zapytaniu;
  • tworzyć złożone zapytania z prostszych części;
  • sprawdzić dokładność zapytań sekwencyjnie, w częściach;
  • przetestuj dokładność zapytania za pomocą mniejszych tabel;
  • wpisz szczegółowe komentarze do każdej linii zawierającej operand, używając symboli „-”.

Specjalistyczne narzędzia znacznie ułatwiają tę pracę. Wśród nich polecamy skorzystać z Query Builder – narzędzia wizualnego, które w trybie wizualnym pozwala znacznie szybciej konstruować nawet najbardziej złożone zapytania. To narzędzie jest dostępne jako samodzielne rozwiązanie lub jako część wielofunkcyjnego dbForge Studio dla SQL Server.

Mamy nadzieję, że ten artykuł pomógł Ci wyjaśnić ten konkretny problem.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wszystko, co musisz wiedzieć o normalizacji baz danych

  2. Wskazówki dotyczące blokad odczytu/zapisu w zależności od poziomu izolacji transakcji w MSSQL

  3. Projekt bazy danych

  4. Niespodzianki wydajnościowe i założenia :Arbitralne TOP 1

  5. 7 najważniejszych zadań wymagających SQL