Samouczek dotyczący podzapytań SQL: Typy, skorelowane podzapytania i ISTNIEJĄ z przykładami
Podzapytanie to zapytanie zawarte w innym zapytaniu. Poznaj każdy typ i jego miejsce, zrozum właściwie skorelowane podzapytania i unikaj pułapki NOT IN, która po cichu nie zwraca żadnych wierszy.
- Podzapytanie to zapytanie zagnieżdżone w innym, a zapytanie zewnętrzne wykorzystuje jego wynik.
- Podzapytania mogą pojawiać się w
WHERE,FROM,SELECTiHAVING. - skorelowane podzapytanie odnosi się do zewnętrznego wiersza, więc jest logicznie oceniane w każdym wierszu.
- Preferuj
NOT EXISTSdoNOT IN, gdy możliwe są wartości NULL.
Odpowiedź na niektóre pytania wymaga dwóch kroków. „Które zamówienia są powyżej średniej?” wymaga najpierw znalezienia średniej, a następnie porównania z nią każdego zamówienia. Podzapytania SQL pozwalają zapisać oba kroki jako jedną instrukcję.
W tym samouczku omówiono każdy typ przy użyciu dwóch małych tabel. Uruchomiliśmy te zapytania w SQLite 3.50 i pokazane wyniki pochodzą z tego uruchomienia. Standardowa składnia podzapytań jest szeroko obsługiwana, a my wskazujemy miejsca, w których bazy danych się różnią.
Co to jest podzapytanie?
Podzapytanie, zwane także zapytaniem wewnętrznym lub zagnieżdżonym, to instrukcja SELECT umieszczona wewnątrz innej instrukcji, w nawiasach okrągłych. Koncepcyjnie zapytanie wewnętrzne generuje wynik, który następnie wykorzystuje zapytanie zewnętrzne.
SELECT id, total
FROM orders
WHERE total > (SELECT AVG(total) FROM orders);
Przykładowe tabele
CREATE TABLE customers (id INT, name TEXT, city TEXT);
CREATE TABLE orders (id INT, customer_id INT, total INT);
INSERT INTO customers VALUES
(1,'Asha','Pune'), (2,'Ben','Delhi'), (3,'Chitra','Pune'), (4,'Dev','Goa');
INSERT INTO orders VALUES
(101,1,1200), (102,1,800), (103,2,300), (104,3,2500), (105,3,100);
Pamiętaj, że Dev nie ma żadnych rozkazów. Ten szczegół ma znaczenie w przypadku kilku przykładów poniżej.
Rodzaje podzapytań w skrócie
| Wpisz | Powroty | Typowa lokalizacja | Typowi operatorzy |
|---|---|---|---|
| Skalar | Jedna wartość | WHERE, SELECT |
=, >, < |
| Wielorzędowe | Jedna kolumna, wiele wierszy | GDZIE |
IN, ANY, ALL |
| Tabela (pochodna) | Wiele kolumn i wierszy | OD |
Używany jak stół |
| Skorelowane | Zależy od zewnętrznego rzędu | WHERE, SELECT |
Dowolny i EXISTS |
Podzapytania skalarne
Podzapytanie skalarne zwraca dokładnie jedną wartość, więc można go używać wszędzie tam, gdzie pojedyncza wartość ma sens. Oto wcześniejsze zapytanie wraz z jego wynikiem. Średnia wszystkich zamówień wynosi 980:
SELECT id, total
FROM orders
WHERE total > (SELECT AVG(total) FROM orders);
-- 101 | 1200
-- 104 | 2500
Nie można było napisać WHERE total > AVG(total), ponieważ agregaty nie są dozwolone bezpośrednio w WHERE. Podzapytanie rozwiązuje ten problem, obliczając wartość osobno.
Co się stanie, jeśli podzapytanie „skalarne” zwróci kilka wierszy? Większość baz danych, w tym PostgreSQL, MySQL i SQL Server, zgłasza błąd. SQLite nie. W naszym teście po cichu użył tylko pierwszego wiersza, co mogło ukryć prawdziwy błąd, więc nie polegaj na tym zachowaniu.
W i NIE W
Gdy wewnętrzne zapytanie zwróci listę, użyj IN. Znajduje to klientów z co najmniej jednym zamówieniem powyżej 1000:
SELECT name FROM customers
WHERE id IN (SELECT customer_id FROM orders WHERE total > 1000);
-- Asha
-- Chitra
NOT IN robi odwrotnie i znajduje klientów, którzy nigdy nie zamawiali:
SELECT name FROM customers
WHERE id NOT IN (SELECT customer_id FROM orders);
-- Dev
To działa tutaj, ale NOT IN ma niebezpieczny przypadek Edge, który omówimy poniżej.
Podzapytania w OD
Podzapytanie w FROM działa jak tabela tymczasowa, często nazywana tabelą pochodną. Jest to przydatne, gdy trzeba dokonać dwukrotnej agregacji, jak w przypadku tego zapytania dotyczącego średnich wydatków na klienta w każdym mieście:
SELECT city, AVG(spent) AS avg_spent
FROM (
SELECT c.city, SUM(o.total) AS spent
FROM customers c
JOIN orders o ON o.customer_id = c.id
GROUP BY c.id, c.city
) AS per_customer
GROUP BY city;
-- Delhi | 300.0
-- Pune | 2300.0
Zapytanie wewnętrzne sumuje każdego klienta, a zapytanie zewnętrzne uśrednia te sumy. Nadawanie tabeli pochodnej aliasu jest dobrym zwyczajem, ponieważ wymagają tego niektóre bazy danych. Jeśli GROUP BY jest dla Ciebie nowy, zobacz GROUP SQL BY i HAVING.
Podzapytania w SELECT
Podzapytanie skalarne może również dodać kolumnę obliczeniową. Ten liczy zamówienia na klienta:
SELECT name,
(SELECT COUNT(*) FROM orders o WHERE o.customer_id = c.id) AS order_count
FROM customers c;
-- Asha | 2
-- Ben | 1
-- Chitra | 2
-- Dev | 0
Dev pojawia się z zerem. Sprzężenie wewnętrzne spowodowałoby całkowite porzucenie Deva, ponieważ Dev nie ma pasujących wierszy. Ten sam wynik można uzyskać za pomocą LEFT JOIN i GROUP BY, co wyjaśniamy w Wyjaśnienie złączy SQL.
Skorelowane podzapytania
Poprzedni przykład jest również skorelowany, ponieważ zapytanie wewnętrzne odwołuje się do c.id z zapytania zewnętrznego. Nieskorelowane podzapytanie może działać samodzielnie. Skorelowany nie może, ponieważ zależy od wartości z bieżącego zewnętrznego wiersza.
Spowoduje to wykrycie zamówień powyżej średniej tego samego klienta:
SELECT o.id, o.customer_id, o.total
FROM orders o
WHERE o.total > (
SELECT AVG(i.total)
FROM orders i
WHERE i.customer_id = o.customer_id
);
-- 101 | 1 | 1200
-- 104 | 3 | 2500
Oto jak to przeczytać. Dla zamówienia 101 wewnętrzne zapytanie uśrednia zamówienia klienta 1 (1200 i 800), co daje 1000. Ponieważ 1200 jest większe, wiersz zostaje zachowany. Dla rzędu 102 obowiązuje ta sama średnia, ale 800 nie jest większa, więc zostaje odrzucona. Pojedyncze zamówienie Klienta 2 jest równe jego własnej średniej, więc ono również zostaje odrzucone.
| Funkcja | Nieskorelowane | Skorelowane |
|---|---|---|
| Używa zewnętrznych wartości zapytania? | Nie | Tak |
| Czy może biegać samodzielnie? | Tak | Nie |
| Logiczne wykonanie | Raz | Raz na zewnętrzny rząd |
| Ryzyko wydajności | Zwykle niski | Może być wysoka na dużych stołach |
„Raz na wiersz” opisuje logikę, a optymalizatory zapytań często przepisują je na coś znacznie bardziej wydajnego. Mimo to warto zbadać wolno skorelowane podzapytanie. Indeks w wewnętrznej kolumnie, tutaj orders.customer_id, może mieć duże znaczenie. Zobacz Wyjaśnienie indeksów SQL.
ISTNIEJE I NIE ISTNIEJE
EXISTS zadaje pytanie tak lub nie: czy zapytanie wewnętrzne zwraca co najmniej jeden wiersz? Może zatrzymać się na pierwszym meczu, a to, co w środku wybierzesz, nie ma znaczenia, dlatego ludzie często piszą SELECT 1.
SELECT c.name FROM customers c
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.id);
-- Asha, Ben, Chitra
SELECT c.name FROM customers c
WHERE NOT EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.id);
-- Dev
Pułapka NOT IN NULL
Jest to jeden z najczęstszych błędów podzapytań. Stworzyliśmy tabelę z jednym prawdziwym identyfikatorem i jednym NULL, a następnie uruchomiliśmy dla niej oba formularze:
CREATE TABLE r (customer_id INT);
INSERT INTO r VALUES (1), (NULL);
SELECT name FROM customers
WHERE id NOT IN (SELECT customer_id FROM r);
-- (no rows at all)
SELECT c.name FROM customers c
WHERE NOT EXISTS (SELECT 1 FROM r WHERE r.customer_id = c.id);
-- Ben, Chitra, Dev
Dlaczego pierwszy nic nie zwraca? id NOT IN (1, NULL) oznacza id <> 1 AND id <> NULL. Każde porównanie z NULL jest raczej nieznane niż prawdziwe, więc cały warunek nigdy nie może być prawdziwy. Nie pojawia się żaden komunikat o błędzie ani ostrzeżenie, jest po prostu pusty wynik, który wygląda wiarygodnie.
Wskazówka: Domyślnie użyj NOT EXISTS dla zabezpieczeń przed połączeniami. Jeśli używasz NOT IN, dodaj WHERE customer_id IS NOT NULL wewnątrz podzapytania.
Podzapytanie vs JOIN vs CTE
Wiele zapytań można zapisać na więcej niż jeden sposób. Wcześniej znaleźliśmy klientów z dużym zamówieniem za pomocą IN. Oto ten sam wynik z połączeniem:
SELECT DISTINCT c.name FROM customers c
JOIN orders o ON o.customer_id = c.id AND o.total > 1000;
-- Asha
-- Chitra
Zwróć uwagę na DISTINCT. Sprzężenie może generować duplikaty, jeśli klient ma kilka dopasowań, podczas gdy IN i EXISTS nie.
| Użyj | Kiedy |
|---|---|
| DOŁĄCZ | Potrzebujesz kolumn z obu tabel |
| W lub ISTNIEJE | Wystarczy filtrować według tego, czy istnieje dopasowanie |
| Tabela pochodna | Najpierw musisz agregować, a to pozostaje krótkie |
| CTE | Logika składa się z kilku kroków lub jest używana więcej niż raz |
| Funkcja okna | Potrzebujesz figurki na grupę obok każdego rzędu |
Wydajność różni się w zależności od bazy danych i danych, a nowoczesne optymalizatory często tworzą podobne plany. Więc najpierw wybierz najczystszą formę, a następnie sprawdź EXPLAIN, jeśli okaże się, że jest powolny.
Typowe błędy
- Użyj
=z wynikiem wielowierszowym. UżyjINlub upewnij się, że wewnętrzne zapytanie zwróci jeden wiersz. - Użycie
NOT INw kolumnie dopuszczającej wartość null. Możesz po cichu utracić każdy wiersz. - Używanie niejasnych aliasów. W skorelowanych zapytaniach kwalifikuj każdą kolumnę, w przeciwnym razie może ona zostać powiązana z niewłaściwą tabelą.
- Głębokie zagnieżdżanie. Trzy poziomy są trudne do odczytania, więc przekonwertuj je na CTE.
- Dodanie
ORDER BYdo środka. Zwykle nie ma to wpływu na wynik zewnętrzny i niektóre bazy danych je odrzucają.
Podsumowanie
Podzapytania są naturalnym sposobem wyrażania pytań dwuetapowych. Zacznij od podzapytań skalarnych i IN, a następnie przećwicz podzapytania skorelowane, rozumując po jednym zewnętrznym wierszu na raz. I pamiętaj o NOT EXISTS, ilekroć możliwe są wartości NULL. Aby poćwiczyć, napisz jedno pytanie na trzy sposoby, z podzapytaniem, złączeniem i CTE, a następnie porównaj oba wyniki i czytelność.
Najczęstsze pytania
Co to jest podzapytanie w SQL?
Podzapytanie to instrukcja SELECT zagnieżdżona w innej instrukcji SQL, ujęta w nawiasy. Instrukcja zewnętrzna wykorzystuje swój wynik jako wartość, listę lub tabelę.
Co to jest skorelowane podzapytanie?
Jest to podzapytanie, które odwołuje się do kolumny z zapytania zewnętrznego. Zależy od bieżącego zewnętrznego rzędu, więc nie może działać samodzielnie.
Co jest szybsze, podzapytanie czy JOIN?
Zależy to od bazy danych i danych, a optymalizatory często tworzą podobne plany. Najpierw napisz najczystszą wersję, a następnie porównaj plany wykonania, jeśli wydajność ma znaczenie.
Jaka jest różnica między IN i EXISTS?
IN porównuje wartość z listą wyników. EXISTS sprawdza, czy w ogóle został zwrócony jakikolwiek wiersz. Zachowują się inaczej w przypadku wartości NULL, gdy są zanegowane.
Czy podzapytanie może zwrócić wiele kolumn?
Tak, gdy jest używany w FROM jako tabela pochodna, a niektóre bazy danych umożliwiają również porównania wierszy. Podzapytanie skalarne musi zwrócić tylko jedną kolumnę i jeden wiersz.
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ł →DevOpsPolecenia systemu Linux dla początkujących: niezbędny przewodnik po terminalu z przykładami
Polecenia systemu Linux dla początkujących, pogrupowane według zadań: nawigacja, pliki, przeglądanie logów, grep, potoki, uprawnienia, procesy i arc…
Przeczytaj artykuł →Automatyzacja testówSelenium kontra dramaturg: kluczowe różnice, porównanie kodu i wybór
Porównanie Selenium i Playwright: architektura, oczekiwanie, obsługa przeglądarki i języka, debugowanie, ten sam test w obu narzędziach, porady doty…
Przeczytaj artykuł →Testowanie oprogramowaniaPartycjonowanie równoważne: technika projektowania testów wyjaśniona na praktycznych przykładach
Wyjaśniono podział równoważny: jak znaleźć prawidłowe i nieprawidłowe partycje, sprawdzone przykłady dla grup wiekowych, hasła i kupony, przeprowadz…
Przeczytaj artykuł →Testowanie oprogramowaniaWażność a priorytet w testowaniu oprogramowania: różnice, macierz i rzeczywiste przykłady
Wyjaśniono ważność a priorytet w testowaniu oprogramowania: jasne definicje, czterokierunkowa macierz z przykładami, skale poziomów, kto ustawia każ…
Przeczytaj artykuł →Bazy danych i SQLSamouczek dotyczący podzapytań SQL: typy, skorelowane podzapytania i ISTNIEJĄ z przykładami
Samouczek dotyczący podzapytań SQL z zapytaniami, które wykonaliśmy: podzapytania skalarne, IN, FROM i SELECT, podzapytania skorelowane, EXISTS, puł…
Przeczytaj artykuł →Bazy danych i SQLWyjaśnienie transakcji SQL i ACID: COMMIT, ROLLBACK i poziomy izolacji
Transakcje SQL i ACID wyjaśnione za pomocą wykonanego przez nas przelewu bankowego: COMMIT, ROLLBACK, punkty zapisu, blokady, poziomy izolacji, brud…
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ł →