SQL UNION vs UNION ALL: Różnice, przykłady i przetestowana wydajność
Różnica między nimi to jedno słowo, ale zły wybór może po cichu dać ci błędną sumę. Zobacz oba na rzeczywistych danych, poznaj wspólne zasady i przeczytaj, co się stało, gdy zmierzyliśmy czas dla miliona wierszy.
UNIONłączy wyniki i usuwa zduplikowane wiersze.UNION ALLzachowuje każdy wiersz.- Deduplikacja kosztuje, więc obliczenia
UNION ALLsą zwykle szybsze. - Użycie
UNIONprzedSUMmoże po cichu usunąć rzeczywiste wartości i dać złą odpowiedź. - Domyślnie
UNION ALL, chyba że chcesz usunąć duplikaty.
Obydwa operatory nakładają na siebie wyniki dwóch zapytań, więc SQL UNION vs UNION ALL może wydawać się niewielkim wyborem. Tak nie jest. Jedno dodatkowe słowo zmienia zarówno wynik, jak i intensywność pracy bazy danych.
Uruchomiliśmy każde zapytanie w SQLite 3.50, a pokazane wyniki i czasy pochodzą z tych uruchomień. Podstawowym zachowaniem jest standardowy SQL w głównych bazach danych. Czasy będą się jednak różnić w zależności od Twojej bazy danych, danych i sprzętu, dlatego traktuj nasze czasy jako ilustrację.
Krótka odpowiedź
UNION łączy dwa zestawy wyników i zwraca tylko odrębne wiersze. UNION ALL łączy je i zwraca wszystko, łącznie z duplikatami. Na tym polega cała różnica, a reszta tego artykułu dotyczy tego, dlaczego jest to takie ważne.
UNION vs UNION ALL ramię w ramię
| Aspekt | UNIA | UNIA WSZYSTKICH |
|---|---|---|
| Zduplikowane wiersze | Usunięto | Zachowane |
| Dodatkowa praca | Muszę znaleźć duplikaty | Żadne |
| Zwykła prędkość | Wolniej | Szybciej |
| Powróciły rzędy | Tak samo lub mniej | Wszystkie |
| Bezpieczne przed SUM lub COUNT? | Często nie | Tak |
| Najlepsze dla | Unikalne listy | Łączenie danych, logów, sum |
Przykładowe dane
Wyobraź sobie sklep, który przechowuje zamówienia online i zamówienia w sklepie stacjonarnym w oddzielnych tabelach. Pamiętaj, że Asha ma dwa identyczne zamówienia online i jedno identyczne zamówienie w sklepie.
CREATE TABLE online_orders (customer TEXT, total INT);
CREATE TABLE store_orders (customer TEXT, total INT);
INSERT INTO online_orders VALUES ('Asha',100), ('Ben',200), ('Asha',100);
INSERT INTO store_orders VALUES ('Asha',100), ('Dev',300);
Zobacz różnicę
SELECT customer, total FROM online_orders
UNION
SELECT customer, total FROM store_orders;
-- Asha | 100
-- Ben | 200
-- Dev | 300
SELECT customer, total FROM online_orders
UNION ALL
SELECT customer, total FROM store_orders;
-- Asha | 100
-- Ben | 200
-- Asha | 100
-- Asha | 100
-- Dev | 300
Pięć wierszy wejściowych zamieniło się w trzy w przypadku UNION, a wszystkie pięć pozostało w UNION ALL. Warto zwrócić uwagę na dwie rzeczy:
UNIONusunął duplikaty z całego wyniku, łącznie z tymi z pierwszej tabeli. To nie tylko porównywanie między tabelami.- Wiersz liczy się jako duplikat tylko wtedy, gdy pasuje każda wybrana kolumna.
Jeśli naprawdę chcesz mieć odrębną listę, UNION jest dokładnie w porządku. Dzięki temu każdy klient, który kupił za pośrednictwem dowolnego kanału:
SELECT customer FROM online_orders
UNION
SELECT customer FROM store_orders;
-- Asha
-- Ben
-- Dev
Błędny-całkowity błąd
To jest powód, dla którego wybór jest naprawdę ważny. Załóżmy, że chcesz uzyskać całkowity przychód. Powyższe zamówienia sumują się do 800. Zobacz co daje każdy operator:
SELECT SUM(total) FROM (
SELECT total FROM online_orders
UNION
SELECT total FROM store_orders
);
-- 600
SELECT SUM(total) FROM (
SELECT total FROM online_orders
UNION ALL
SELECT total FROM store_orders
);
-- 800
Wersja UNION jest błędna o 200. Ponieważ wybraliśmy tylko kolumnę total, trzy oddzielne zamówienia o wartości 100 rupii wyglądały jak duplikaty i zwinęły się w jedno. Nie pojawia się żaden komunikat o błędzie, a liczba 600 wygląda na całkowicie wiarygodną liczbę. Tego typu cichy błąd może siedzieć w raporcie finansowym miesiącami.
Wskazówka: Dwa identycznie wyglądające wiersze mogą oznaczać dwa autentyczne zdarzenia. Zanim użyjesz UNION, zapytaj, czy identyczne wiersze oznaczają ten sam fakt zapisany dwukrotnie, czy też dwa różne fakty. W przypadku sprzedaży, płatności i wpisów do dziennika jest to zwykle druga pozycja.
Zasady, których muszą przestrzegać obaj
Obaj operatorzy mają takie same wymagania:
- Każde
SELECTmusi zwracać tę samą liczbę kolumn. - Kolumny są dopasowywane według pozycji, a nie według nazwy, dlatego należy zachować tę samą kolejność.
- Typy danych na każdej pozycji muszą być kompatybilne.
- Nazwy kolumn wynikowych pochodzą od pierwszego
SELECT. ORDER BYznajduje się na samym końcu i dotyczy całego wyniku.
Złamanie pierwszej zasady powoduje błąd. Oto wiadomość od SQLite:
SELECT customer, total FROM online_orders
UNION
SELECT customer FROM store_orders;
-- SELECTs to the left and right of UNION do not have
-- the same number of result columns
Druga zasada jest bardziej niebezpieczna, ponieważ może zawieść bez błędu. Jeśli zamienisz dwie kolumny tego samego typu, na przykład first_name i last_name, zapytanie zostanie uruchomione i dane wyjdą błędne. SQLite ma również swobodne podejście do typów, podczas gdy bazy danych takie jak PostgreSQL są bardziej rygorystyczne i mogą wymagać jawnego określenia CAST.
Oznacz źródło
Bardzo praktyczną sztuczką jest dodanie stałej kolumny pokazującej, skąd pochodzi każdy wiersz. Ponieważ etykiety są różne, wiersze z różnych tabel nie mogą być już traktowane jako duplikaty.
SELECT customer, total, 'online' AS channel FROM online_orders
UNION ALL
SELECT customer, total, 'store' FROM store_orders
ORDER BY customer, channel;
-- Asha | 100 | online
-- Asha | 100 | online
-- Asha | 100 | store
-- Ben | 200 | online
-- Dev | 300 | store
Gdy dane otrzymają etykietę, możesz je pogrupować, aby raportować sprzedaż według kanałów, korzystając z opcji GROUP BY. Jeśli chcesz połączyć kilka kroków, zawiń związek w CTE, aby był czytelny.
Wydajność: co wydarzyło się w naszym teście
Aby usunąć duplikaty, baza danych musi porównać wiersze, zwykle sortując je lub mieszając. UNION ALL może pominąć ten krok. Stworzyliśmy dwie tabele po 500 000 wierszy każda, zawierające losowe liczby od 0 do 50 000, więc duplikatów było mnóstwo. Każde zapytanie uruchamialiśmy kilka razy i utrzymaliśmy najlepszy czas.
Najpierw policzyliśmy wyniki, aby czas spędzony na wysyłaniu wierszy z powrotem do naszego programu nie miał wpływu na porównanie:
| Zapytanie zawinięte w COUNT(*) | Rzędy | Najlepszy czas |
|---|---|---|
| UNIA | 50,001 | 261 ms |
| UNIA WSZYSTKICH | 1,000,000 | Poniżej 1 ms |
Ogromna luka wynika częściowo z tego, że SQLite może obliczyć tę liczbę bez czytania każdego wiersza, więc proszę nie czytać tego jako „tysiące razy szybciej”. Pokazuje jednak podstawową ideę: UNION musiał wykonać prawdziwą pracę, a UNION ALL nie.
Następnie pobraliśmy wszystkie wiersze do Pythona i wynik się odwrócił:
| Zapytanie, pobieranie wszystkich wierszy | Powróciły rzędy | Najlepszy czas |
|---|---|---|
| UNIA | 50,001 | 277 ms |
| UNIA WSZYSTKICH | 1,000,000 | 392 ms |
W tym przypadku UNION ALL trwało dłużej, ponieważ dostarczyło dwadzieścia razy więcej wierszy. Deduplikacja nie jest tym, co ją spowalnia. Obsługa miliona wierszy była. Zatem uczciwą zasadą jest to, że obliczenia UNION ALL są tańsze dla bazy danych, ale wielkość wyniku też ma znaczenie. Wiele wykresów online redukuje to do „UNION ALL jest zawsze szybszy”, a nasz test pokazuje, dlaczego nie jest to takie proste.
Nie wybieraj też wyłącznie na podstawie prędkości. Wybierz operatora, który jako pierwszy podał poprawną odpowiedź, a następnie dostrój. Jeśli zapytanie działa wolno, przeczytaj nasz przewodnik po optymalizacji zapytań SQL.
Kiedy używać każdego z nich
Użyj UNION ALL, gdy:
- Łączysz dane z podobnych tabel, np. partycji miesięcznych.
- Później obliczysz sumy lub zliczenia.
- Wiadomo, że dane wejściowe nie mogą się nakładać.
- Duplikaty mają znaczenie, podobnie jak w dziennikach lub zapisach audytu.
Użyj UNION, gdy:
- Potrzebujesz unikalnej listy, takiej jak każdy adres e-mail w dwóch systemach.
- Nakładające się źródła podają ten sam fakt więcej niż jeden raz.
Traktuj UNION ALL jako wartość domyślną i używaj UNION celowo. Dodanie klauzuli WHERE do każdej gałęzi w celu wczesnego filtrowania pomaga w obu przypadkach.
PRZECIĘCIE i WYJĄTEK
Dwa powiązane operatory zbiorowe odpowiadają na różne pytania. W obu przypadkach obowiązują te same zasady dotyczące kolumn:
SELECT customer FROM online_orders
INTERSECT
SELECT customer FROM store_orders;
-- Asha (bought in both channels)
SELECT customer FROM online_orders
EXCEPT
SELECT customer FROM store_orders;
-- Ben (online only)
Oracle tradycyjnie używał MINUS zamiast EXCEPT, a obsługa tych operatorów różni się nieco w zależności od bazy danych i wersji.
UNIA kontra DOŁĄCZENIE
Często są one mylone, ale łączą dane w różnych kierunkach:
| Operacja | Kierunek | Wynik |
|---|---|---|
| UNIA | Pionowe | Dodaje więcej wierszy |
| DOŁĄCZ | Poziomy | Dodaje więcej kolumn |
Typowe błędy
- Używanie UNION z przyzwyczajenia. Może to kosztować prędkość lub usunięcie prawidłowych wierszy.
- Wybór zbyt małej liczby kolumn. Pominięcie identyfikatora powoduje, że różne wiersze wyglądają identycznie.
- Niezgodna kolejność kolumn. Wartości mogą trafić do niewłaściwej kolumny bez żadnego błędu.
- Dodanie ORDER BY do każdej gałęzi. Sortuj raz, na końcu.
- Użycie UNION do załatania złego złączenia. Jeśli w wyniku złączenia pojawiają się duplikaty, napraw to złączenie.
- Zakładając kolejność wyników. Bez
ORDER BYkolejność wierszy nie jest gwarantowana dla żadnego operatora.
Podsumowanie
Za każdym razem zadawaj jedno pytanie: czy identyczne wiersze są tym samym faktem, czy też faktami odrębnymi? Jeśli są one oddzielne lub jeśli nakładanie się nie jest możliwe, użyj UNION ALL. Jeśli potrzebujesz unikalnej listy, użyj UNION. Aby sprawdzić własne raporty, wyszukaj w swoim kodzie UNION w pobliżu SUM lub COUNT i potwierdź, że te sumy naprawdę są prawidłowe.
Najczęstsze pytania
Jaka jest różnica między UNION a UNION ALL?
UNION łączy dwa zestawy wyników i usuwa zduplikowane wiersze. UNION ALL łączy je i zachowuje każdy wiersz, łącznie z duplikatami.
Co jest szybsze, UNION czy UNION ALL?
UNION ALL jest zwykle tańszy w obliczeniach, ponieważ nie sprawdza duplikatów. Jak pokazał nasz test, zwrócenie znacznie większego wyniku może w dalszym ciągu zająć więcej czasu.
Czy UNION usuwa duplikaty w jednej tabeli?
Tak. Usuwa duplikaty z całego połączonego wyniku, w tym z identycznych wierszy, które pochodzą z tej samej tabeli.
Czy nazwy kolumn muszą pasować do UNII?
Nie. Kolumny są dopasowywane według pozycji, a wynik wykorzystuje nazwy z pierwszego SELECT. Liczba kolumn musi się zgadzać, a typy muszą być zgodne.
Czy mogę używać ORDER BY z UNION?
Tak, ale na samym końcu zestawienia umieść ORDER BY. Sortuje cały połączony wynik, a nie pojedynczą gałąź.
Ucz się dalej
Potrzebujesz pomocy przy testowaniu, WordPressie lub SEO?
Pomagamy zespołom dostarczać lepsze oprogramowanie i rozwijać ich witryny. Powiedz nam, nad czym pracujesz, a my zaproponujemy jasny następny krok.
Więcej poradników na testowanie, sztuczna inteligencja i nowoczesny rozwój
Podobał Ci się ten artykuł? Wybierz temat i przejdź bezpośrednio do naszych najnowszych tutoriali.
Wyjaśnienie halucynacji AI: dlaczego modele językowe tworzą rzeczy i jak je zmniejszyć
Wyjaśniono halucynacje AI: czym są, dlaczego powstają w modelach językowych, typowe typy, jak je zredukować za pomocą uziemień i podpowiedzi oraz pr…
Przeczytaj artykuł →DevOpsWyjaśnienie zmiennych środowiskowych: pliki .env, sekrety i konfiguracja wykonana prawidłowo
Zmienne środowiskowe wyjaśnione na przykładach Pythona, które przeprowadziliśmy: ich odczytywanie i ustawianie, dlaczego każda wartość jest ciągiem …
Przeczytaj artykuł →Tworzenie oprogramowaniaWyjaśnienie ograniczenia szybkości interfejsu API: algorytmy, nagłówki i obsługa błędów 429
Ograniczanie szybkości API wyjaśnione za pomocą przeprowadzonej przez nas symulacji: zasobnik tokenów, stałe okno, przesuwane okno, 429 odpowiedzi, …
Przeczytaj artykuł →Automatyzacja testówWyśmiewanie w Pythonie: unittest.mock, patch i błędy, które sprawiają, że testy kłamią
Wyśmiewanie w Pythonie za pomocą unittest.mock, przetestowane: Mock i zwracana wartość, efekt uboczny, łatanie tam, gdzie używana jest nazwa, specyf…
Przeczytaj artykuł →Testowanie oprogramowaniaWyjaśnienie zasięgu kodu: pokrycie linii i oddziału oraz co naprawdę oznacza 100%
Wyjaśnienie pokrycia kodu za pomocą prawdziwego pliku cover.py: pokrycie linii, gałęzi i warunków, przeczytanie raportu, dlaczego 100% pokrycia może…
Przeczytaj artykuł →Bazy danych i SQLDELETE vs TRUNCATE vs DROP w SQL: różnice, wycofywanie i kiedy używać każdego z nich
DELETE vs TRUNCATE vs DROP wyjaśnione za pomocą przetestowanego SQL: co każdy usuwa, wycofywanie, wyzwalacze, resetowanie tożsamości, prędkość i czy…
Przeczytaj artykuł →Bazy danych i SQLWyjaśnienie widoków SQL: tworzenie, używanie i unikanie pułapek wraz z przykładami
Widoki SQL wyjaśnione za pomocą zapytań, które uruchomiliśmy: tworzenie widoku, wyniki na żywo, ukrywanie kolumn, wydajność, widoki z możliwością ak…
Przeczytaj artykuł →Tworzenie oprogramowaniaInterfejs TypeScript a typ: rzeczywiste różnice, testowane za pomocą kompilatora
Interfejs TypeScript a typ, sprawdzony z prawdziwym kompilatorem: co oba mogą zrobić, co tylko jeden, łączenie deklaracji, rozszerzenia a przecięcia…
Przeczytaj artykuł →Tworzenie oprogramowaniaPython *args i **kwargs wyjaśnione: elastyczne funkcje z przejrzystymi przykładami
Python *args i **kwargs wyjaśnione za pomocą uruchomionego przez nas kodu: pakowanie i rozpakowywanie, kolejność parametrów, argumenty zawierające t…
Przeczytaj artykuł →Tworzenie oprogramowaniaFunkcje Lambda w Pythonie: składnia, rzeczywiste zastosowania i kiedy ich nie używać
Funkcje lambda w Pythonie wyjaśnione za pomocą uruchomionego przez nas kodu: składnia, sortowanie za pomocą klucza, mapa i filtr, domknięcia, pułapk…
Przeczytaj artykuł →Sztuczna inteligencjaKim są agenci AI? Jak one działają, dzięki prostej pętli agenta, którą możesz uruchomić
Kim są agenci AI? Prosty przewodnik po pętli agenta, narzędziach, pamięci i poręczach, z małą pętlą w Pythonie, którą uruchomiliśmy, prawdziwymi zag…
Przeczytaj artykuł →DevOpsMonitorowanie a obserwowalność: prawdziwa różnica z logami, wskaźnikami i śladami
Wyjaśnienie monitorowania a obserwowalności: znane i nieznane awarie, dzienniki, metryki i ślady, opis incydentu przy kasie, złote sygnały, OpenTele…
Przeczytaj artykuł →DevOpsWoluminy platformy Docker a mocowania powiązań: utrwalanie danych kontenera we właściwy sposób
Wyjaśniono woluminy Dockera a montowanie powiązań: dlaczego dane kontenera znikają, nazwane woluminy, montowanie powiązań, tmpfs, przykłady tworzeni…
Przeczytaj artykuł →Automatyzacja testówTDD vs BDD: kluczowe różnice, jedna funkcja zbudowana w obie strony i kiedy używać każdej z nich
TDD vs BDD wyjaśnione za pomocą jednej funkcji rabatowej zbudowanej w obie strony: refaktoryzacja czerwono-zielona z uruchomionym przez nas kodem, s…
Przeczytaj artykuł →Testowanie oprogramowaniaTestowanie akceptacyjne użytkownika (UAT): proces, lista kontrolna i rzeczywiste przykłady
Wyjaśniono testy akceptacyjne użytkownika: kto je przeprowadza, czym różni się od kontroli jakości, siedmioetapowy proces, szablon przypadku testowe…
Przeczytaj artykuł →Bazy danych i SQLWyjaśnienie wartości SQL NULL: IS NULL, COALESCE, NULLIF i pułapki, których należy unikać
Wartości SQL NULL wyjaśnione za pomocą zapytań, które wykonaliśmy: logika trójwartościowa, IS NULL, COALESCE, NULLIF, w jaki sposób agregacje, łącze…
Przeczytaj artykuł →Bazy danych i SQLInstrukcja SQL CASE WHEN: składnia, rzeczywiste przykłady i typowe błędy
SQL CASE WHEN wyjaśnione za pomocą zapytań, które uruchomiliśmy: proste i przeszukiwane formularze, kolejność warunków, elementy przestawne z SUM, s…
Przeczytaj artykuł →Tworzenie oprogramowaniaCo to jest JWT? Tokeny internetowe JSON wyjaśnione na przykładzie działania
Co to jest JWT? Wyjaśniono tokeny sieciowe JSON: trzy części, token zbudowany i zmodyfikowany w uruchomionym przez nas kodzie, JWT a sesje, pamięć m…
Przeczytaj artykuł →Tworzenie oprogramowaniaWyjaśnienie pętli zdarzeń JavaScript: stos wywołań, mikrozadania i liczniki czasu z przykładami
Pętla zdarzeń JavaScript wyjaśniona za pomocą uruchomionego przez nas kodu: stos wywołań, kolejki zadań i mikrozadań, dlaczego setTimeout 0 nie jest…
Przeczytaj artykuł →Tworzenie oprogramowaniaWyjaśnienie generatorów Pythona i wydajności: oszczędzaj pamięć dzięki prawdziwym przykładom
Generatory Pythona i wydajność wyjaśnione za pomocą uruchomionego przez nas kodu: sposób wstrzymywania i wznawiania, mierzone oszczędności pamięci, …
Przeczytaj artykuł →Sztuczna inteligencjaCzym są osady? Wyjaśnienie wektorów i podobieństwa cosinusa
Czym są osadzania? Prosty przewodnik po wektorach, podobieństwie cosinusów i wyszukiwaniu semantycznym, z małym przykładem, który przeprowadziliśmy,…
Przeczytaj artykuł →DevOpsWdrożenie niebiesko-zielone a kanaryjskie: różnice, kompromisy i sposób wyboru
Wyjaśniono wdrożenie Blue-Green vs Canary: sposób działania każdego z nich, koszty, ryzyko i wycofywanie zmian, przetestowane przez nas stabilne łąc…
Przeczytaj artykuł →Automatyzacja testówNiestabilne testy: co je powoduje i jak je naprawić na dobre
Niestabilne testy wyjaśnione w przeprowadzonych przez nas demonstracjach: główne przyczyny, sposób potwierdzenia i zdiagnozowania jednej z nich, odp…
Przeczytaj artykuł →Testowanie oprogramowaniaLoad Testing vs Stress Testing: Differences, Metrics and k6 Examples
Wyjaśniono testy obciążenia i testy warunków skrajnych: co dowodzi każdy z nich, testy szczytowe i nasiąkania, istotne metryki, dlaczego średnie wpr…
Przeczytaj artykuł →Testowanie oprogramowaniaPrzypadek testowy a scenariusz testowy: kluczowe różnice, przykłady i kiedy stosować każdy z nich
Wyjaśnienie przypadków testowych i scenariuszy testowych: jasne definicje, tabela obok siebie, jedna funkcja resetowania hasła zaczerpnięta ze scena…
Przeczytaj artykuł →Bazy danych i SQLOptymalizacja zapytań SQL: czytaj plany wykonania i napraw powolne zapytania z synchronizacją
Optymalizacja zapytań SQL przetestowana na milionie wierszy: przeczytaj plany wykonania, dodaj odpowiednie indeksy, napraw filtry niesargowalne, uży…
Przeczytaj artykuł →Bazy danych i SQLSQL UNION vs UNION ALL: różnice, przykłady i testowana wydajność
SQL UNION vs UNION ALL wyjaśnione na podstawie zapytań, które uruchomiliśmy: duplikaty, obie reguły są zgodne, prawdziwy błąd danych, zmierzona wyda…
Przeczytaj artykuł →Tworzenie oprogramowaniaSamouczek API pobierania JavaScript: GET, POST, obsługa błędów i limity czasu
Samouczek JavaScript Fetch API testowany na serwerze lokalnym: GET i POST, dlaczego 404 nie rzuca, pomocnik wielokrotnego użytku, ciągi zapytań, prz…
Przeczytaj artykuł →Tworzenie oprogramowaniaObsługa plików w Pythonie: odczyt, zapis, CSV, JSON i pathlib z przykładami
Obsługa plików w Pythonie wyjaśniona za pomocą uruchomionego przez nas kodu: tryby otwarte, czytanie dużych plików, CSV, JSON, pathlib, pliki binarn…
Przeczytaj artykuł →Tworzenie oprogramowaniaKlasy i obiekty Pythona: samouczek OOP z prawdziwymi przykładami
Klasy i obiekty Pythona objaśnione za pomocą uruchomionego przez nas kodu: __init__, metody, atrybuty klas i instancji, dziedziczenie, właściwości, …
Przeczytaj artykuł →Sztuczna inteligencjaCo to jest model dużego języka? Jak działają LLM, wyjaśnione bez szumu
Co to jest model dużego języka? LLM wyjaśnione prostym językiem: tokeny, osadzanie, uwaga, szkolenie, temperatura i okna kontekstowe, mała demonstra…
Przeczytaj artykuł →Tworzenie oprogramowaniaGit merge vs rebase: różnice, przykłady i kiedy czego używać
Git merge vs rebase wyjaśnione na prawdziwym wyniku logu, z tabelą porównawczą, złotą zasadą rebase i bezpiecznym procesem pracy zespołu.
Przeczytaj artykuł →Tworzenie oprogramowaniaPython list comprehension: składnia, przykłady i kiedy jej unikać
Python list comprehension wyjaśnione: składnia, filtrowanie, if-else, zagnieżdżone pętle, zmierzone czasy i sytuacje, w których zwykła pętla for jes…
Przeczytaj artykuł →Bazy danych i SQLSQL JOIN – wyjaśnienie z przykładami (Inner, Left, Right, Full)
Zrozum złączenia SQL krok po kroku na przykładowych tabelach i zapytaniach: INNER, LEFT, RIGHT, FULL, CROSS i SELF, plus typowe błędy i wskazówki wy…
Przeczytaj artykuł →