Generator widoku SQL (CREATE VIEW)
Złóż CREATE VIEW z kolumn, JOIN, WHERE i GROUP BY dla MySQL, PostgreSQL, SQL Server lub SQLite.
-
1Wprowadź dane
Wpisz treść, wklej tekst lub załaduj plik z dysku. -
2Kliknij przycisk
Narzędzie natychmiast przetworzy Twoje dane w przeglądarce. -
3Pobierz wynik
Skopiuj gotowy tekst lub zapisz plik na urządzeniu.
return "Wynik gotowy w 0.1s";
}
COUNT(*) AS orders_count. Przecinki dodamy sami.JOIN, grupowanie i opcje
Widok SQL
Instrukcja CREATE VIEW dla MySQL / MariaDB: 4 kolumny z tabeli users.
Baza danych
Kolumny
Złączenia JOIN
Linie SQL
CREATE VIEW
Do utworzenia widoku potrzebne jest uprawnienie CREATE VIEW (a przy OR REPLACE także DROP). Uruchom w phpMyAdmin, Adminerze lub kliencie mysql.
Polecenia po utworzeniu widoku
- SELECT * FROM `active_users_view` LIMIT 10; -- podgląd 10 wierszy
- SHOW CREATE VIEW `active_users_view`; -- definicja widoku
- DROP VIEW IF EXISTS `active_users_view`; -- usunięcie widoku
3 wyników
Składnia CREATE VIEW w popularnych bazach
| Baza | Cytowanie nazw | Nadpisanie widoku | WITH CHECK OPTION | Podgląd wierszy |
|---|---|---|---|---|
| MySQL / MariaDB | `nazwa` | CREATE OR REPLACE VIEW | tak (LOCAL lub CASCADED) | LIMIT 10 |
| PostgreSQL | "nazwa" | CREATE OR REPLACE VIEW (kolumny tylko dopisywane na końcu) | tak, dla widoków aktualizowalnych | LIMIT 10 |
| SQL Server | [nazwa] | CREATE OR ALTER VIEW (2016 SP1+) | tak | TOP 10 |
| SQLite | "nazwa" | DROP VIEW IF EXISTS + CREATE VIEW | nie (widoki tylko do odczytu) | LIMIT 10 |
Czym jest widok
Widok (VIEW) to zapisane pod nazwą zapytanie SELECT. Nie przechowuje danych: przy każdym odwołaniu baza wykonuje je na tabelach źródłowych. Upraszcza powtarzane zapytania z JOIN i pozwala dać komuś dostęp (GRANT SELECT) tylko do wybranych kolumn, np. bez haseł i adresów.
OR REPLACE czy DROP i CREATE
Bez nadpisywania CREATE VIEW kończy się błędem, gdy widok już istnieje. OR REPLACE (MySQL, PostgreSQL) i OR ALTER (SQL Server) zachowują nadane uprawnienia. SQLite nie ma takiej składni, dlatego generator dopisuje DROP VIEW IF EXISTS przed CREATE VIEW.
WITH CHECK OPTION w praktyce
Opcja odrzuca INSERT i UPDATE wykonane przez widok, jeśli zmieniony wiersz przestałby spełniać jego WHERE. Przykład: w widoku z status = 'active' nie ustawisz przez widok statusu „banned”. Działa tylko dla widoków aktualizowalnych: m.in. bez GROUP BY, DISTINCT i funkcji agregujących.
Wydajność widoku
Proste widoki baza łączy z zewnętrznym zapytaniem i używa indeksów tabel. Widoki z GROUP BY, DISTINCT lub UNION MySQL zwykle liczy w tabeli tymczasowej, więc filtr dopisany z zewnątrz nie zawsze skorzysta z indeksu. Gdy wynik ma być zapisany na dysku, PostgreSQL oferuje CREATE MATERIALIZED VIEW.
Oceń to narzędzie:
Powiązane narzędzia
Inne narzędzia, które mogą Ci się przydaćGenerator widoku SQL
Widok (VIEW) to zapytanie SELECT zapisane pod nazwą, którego używasz jak tabeli. Nie przechowuje danych: za każdym razem wykonuje zapytanie, więc zawsze zwraca aktualny wynik. Generator widoku SQL składa gotową instrukcję CREATE VIEW dla MySQL/MariaDB, PostgreSQL, SQL Server lub SQLite z nazwy widoku, tabeli źródłowej i kolumn, a opcjonalnie także z JOIN, WHERE, GROUP BY i HAVING.
Składnia CREATE VIEW
Domyślny przykład w narzędziu (MySQL) daje taki kod:
CREATE VIEW `active_users_view` AS
SELECT
id,
name,
email,
created_at
FROM `users`
WHERE status = 'active';
Ogólny wzór: CREATE [OR REPLACE] VIEW nazwa AS SELECT kolumny FROM tabela [JOIN …] [WHERE …] [GROUP BY …] [HAVING …] [WITH CHECK OPTION];
Zalety widoków
- ukrywają złożoność zapytań przed aplikacją,
- ograniczają dostęp do wybranych kolumn (GRANT SELECT na widoku zamiast na całej tabeli),
- upraszczają raportowanie i integracje,
- pozwalają zmienić logikę bez zmian w kodzie.
OR REPLACE i WITH CHECK OPTION
CREATE OR REPLACE VIEW (MySQL, PostgreSQL) i CREATE OR ALTER VIEW (SQL Server 2016 SP1 i nowszy) nadpisują istniejący widok bez jego usuwania i zachowują nadane uprawnienia. SQLite nie ma takiej składni, dlatego po zaznaczeniu opcji „Nadpisz istniejący widok” generator dopisuje przed CREATE VIEW polecenie DROP VIEW IF EXISTS. W PostgreSQL OR REPLACE pozwala tylko dopisywać kolumny na końcu listy; zmiana nazw lub typów istniejących kolumn wymaga DROP VIEW i ponownego utworzenia widoku.
WITH CHECK OPTION blokuje INSERT i UPDATE wykonane przez widok, jeśli zmieniony wiersz przestałby spełniać warunek WHERE widoku. Działa tylko w widokach aktualizowalnych. W SQLite widoki są tylko do odczytu, więc generator pomija tę opcję i informuje o tym w uwagach pod kodem.
Jak działa generator widoku SQL
Narzędzie nie łączy się z żadnym serwerem i nie wykonuje zapytań. Pobiera nazwę widoku, tabelę źródłową z opcjonalnym aliasem, listę kolumn (po jednej w linii, puste pole oznacza *) oraz warunki, a następnie składa z nich tekst SQL. Nazwy widoku i tabeli cytuje według wybranej bazy: `nazwa` w MySQL, [nazwa] w SQL Server, "nazwa" w PostgreSQL i SQLite; przyjmuje też zapis schemat.nazwa. Przecinki między kolumnami dodaje sam, a powtórzone słowo WHERE czy GROUP BY na początku pola i średnik na końcu usuwa.
Wszystko, co wpiszesz w formularzu, trafia do trzech bloków: SELECT (kolumny, wyrażenia, aliasy), FROM (tabela i złączenia JOIN) oraz WHERE, opcjonalnie GROUP BY i HAVING. Z nich powstaje definicja, którą baza zapisuje w słowniku danych.
Przy każdym odwołaniu do widoku baza rozwija zapisaną definicję i wykonuje zapytanie na tabelach źródłowych, dlatego wynik jest zawsze aktualny. Część baz, np. MySQL, potrafi scalić definicję z zapytaniem zewnętrznym (algorytm MERGE) albo wykonać ją jako tymczasową tabelę (TEMPTABLE) — na sam wynik to nie wpływa, zmienia się tylko sposób realizacji. Kolejność i nazwy kolumn widoku odpowiadają dokładnie kolejności z części SELECT, a przy braku aliasu dziedziczą nazwy kolumn źródłowych.
Pod gotowym kodem pojawiają się uwagi o typowych przyczynach błędów: SELECT * zamieniane na listę kolumn w chwili tworzenia widoku, funkcja agregująca bez GROUP BY, średnik wewnątrz pola, wielkie litery w nazwach w PostgreSQL czy WITH CHECK OPTION w widoku z agregacją. Dostajesz też trzy polecenia na później: podgląd 10 wierszy, odczyt definicji i DROP VIEW IF EXISTS. Cztery gotowe przykłady, w tym widok z JOIN i podsumowanie zamówień, wypełniają formularz jednym kliknięciem.
Przykład krok po kroku
- Tabela źródłowa orders ma 6 wierszy i kolumny id, customer_id, status, amount: (1, 10, 'paid', 120.00), (2, 11, 'new', 80.50), (3, 10, 'paid', 200.00), (4, 12, 'cancelled', 45.00), (5, 11, 'paid', 60.00), (6, 10, 'paid', 99.50).
- W formularzu wpisujesz nazwę paid_orders, tabelę orders, kolumny id, customer_id i amount (każdą w osobnej linii) oraz warunek status = 'paid'. Dla MySQL generator składa polecenie:
CREATE VIEW `paid_orders` AS SELECT id, customer_id, amount FROM `orders` WHERE status = 'paid'; - Uruchamiasz SELECT * FROM paid_orders; Baza filtruje 6 wierszy i zwraca 4: id 1, 3, 5 oraz 6. Wiersz 2 (status 'new') i wiersz 4 (status 'cancelled') odpadają, bo nie spełniają warunku widoku.
- Suma kolumny amount w widoku wynosi 120.00 + 200.00 + 60.00 + 99.50 = 479.50. To samo zapytanie na całej tabeli daje 605.00, a różnica 125.50 to suma dwóch odfiltrowanych wierszy (80.50 + 45.00).
- Dodajesz do orders nowy wiersz (7, 11, 'paid', 40.00) i nie zmieniasz definicji widoku. SELECT * FROM paid_orders zwraca teraz 5 wierszy, a suma rośnie do 519.50 (479.50 + 40.00) — dowód, że widok nie przechowuje danych, tylko wykonuje zapytanie na bieżąco.
- Zaznaczasz WITH CHECK OPTION, generujesz widok ponownie i próbujesz zapisać przez widok wiersz ze statusem 'new'. Baza odrzuci taką operację, bo nowy wiersz nie spełniałby warunku status = 'paid' zapisanego w widoku.
Elementy polecenia CREATE VIEW — ściągawka
| Element | Przykład zapisu | Do czego służy |
|---|---|---|
| CREATE VIEW | CREATE VIEW v AS SELECT ... | Tworzy nowy widok; jeśli nazwa już istnieje, baza zwróci błąd. |
| CREATE OR REPLACE VIEW | CREATE OR REPLACE VIEW v AS SELECT ... | Nadpisuje definicję istniejącego widoku w MySQL i PostgreSQL; w SQL Server odpowiednikiem jest CREATE OR ALTER VIEW. |
| WITH CHECK OPTION | ... WHERE status = 'paid' WITH CHECK OPTION | Blokuje zapisy przez widok, które wypadłyby z zakresu warunku WHERE. Brak w SQLite. |
| Aliasy kolumn | SELECT id AS identyfikator, amount AS kwota | Ustala nazwy kolumn widoku niezależnie od nazw w tabelach źródłowych. |
| JOIN w części FROM | FROM orders AS o JOIN customers c ON c.id = o.customer_id | Pozwala zbudować widok łączący dane z kilku tabel. |
| Agregacja z GROUP BY | SELECT customer_id, SUM(amount) FROM orders GROUP BY customer_id | Tworzy widok z podsumowaniami; każda kolumna nieagregowana musi trafić do GROUP BY. |
| SQL SECURITY | CREATE SQL SECURITY INVOKER VIEW v AS ... | Tylko MySQL/MariaDB: decyduje, czy uprawnienia sprawdzane są wobec twórcy widoku (DEFINER), czy wobec pytającego (INVOKER). Generator tego nie dopisuje. |
| DROP VIEW | DROP VIEW IF EXISTS v; | Usuwa widok; tabele źródłowe i ich dane pozostają nietknięte. |
Praktyczne wskazówki
- Nazywaj widoki od przeznaczenia. Przedrostek v_ lub końcówka _view porządkuje listę obiektów w bazie i od razu odróżnia widoki od tabel.
- Wypisuj kolumny jawnie zamiast SELECT *. Baza rozwija gwiazdkę na listę kolumn w chwili tworzenia widoku, więc kolumna dodana później do tabeli nie pojawi się w widoku. Jawna lista ułatwia też kontrolę nad danymi wrażliwymi.
- Trzymaj powtarzalny filtr w widoku: warunek status = 'active' wpisany raz nie musi być kopiowany do każdego zapytania aplikacji.
- Podczas pracy nad definicją nadpisuj widok przez OR REPLACE (lub OR ALTER) zamiast usuwać go i tworzyć od nowa. Unikniesz przerwy, w której widok nie istnieje, i nie stracisz nadanych uprawnień.
- Najpierw przetestuj samo SELECT, bez CREATE VIEW. Jeśli zwraca właściwe kolumny i właściwą liczbę wierszy, opakowanie go w widok jest już tylko formalnością.
- W SQL Server CREATE VIEW musi być jedyną instrukcją w partii: oddziel ją od innych poleceń separatorem GO.
Czego generator nie uwzględnia
- Nie zna Twojego schematu. Sprawdza tylko format nazw (litery łacińskie, cyfry i _, do 64 znaków), więc nie wie, czy tabela i kolumny istnieją ani czy typy danych się zgadzają. Literówka w nazwie ujawni się dopiero przy wykonaniu SQL.
- Nie weryfikuje uprawnień: prawo CREATE VIEW (a przy OR REPLACE w MySQL także DROP) zależy od konfiguracji serwera.
- Wyrażenia przepisuje dosłownie. Do wybranej bazy dopasowuje cytowanie nazw, składnię nadpisania i polecenia pomocnicze (LIMIT albo TOP), ale funkcje wpisane w kolumnach, WHERE czy JOIN, np. NOW(), DATEADD() lub INTERVAL, trafiają do kodu bez zmian. Oracle nie jest obsługiwany.
Najczęstsze pytania
Czy widok zajmuje miejsce na dysku?
Zwykły widok nie — przechowuje tylko definicję zapytania. Widok zmaterializowany (np. CREATE MATERIALIZED VIEW w PostgreSQL) zapisuje gotowy wynik, więc przyspiesza ciężkie zapytania, ale wymaga odświeżania i jego dane mogą być chwilowo nieaktualne.
Czy można indeksować widok?
Zwykły widok korzysta z indeksów tabel źródłowych. SQL Server pozwala zaindeksować widok (WITH SCHEMABINDING i unikalny indeks klastrowy), a w PostgreSQL indeks zakłada się na widoku zmaterializowanym. MySQL i SQLite indeksów na widokach nie obsługują.
Czym różni się widok SQL od tabeli?
Tabela przechowuje wiersze na dysku, a widok wyłącznie definicję zapytania. Odczyt z widoku jest wynikiem zapytania wykonywanego w momencie odwołania, więc dane są zawsze aktualne, ale każdy odczyt kosztuje tyle, ile zapytanie bazowe.
Czy można aktualizować dane przez widok?
W MySQL, PostgreSQL i SQL Server często tak: INSERT, UPDATE i DELETE działają, gdy widok odwołuje się do jednej tabeli i nie zawiera agregacji, GROUP BY ani DISTINCT. W SQLite widoki są tylko do odczytu, a zmiana danych wymaga wyzwalaczy INSTEAD OF.
Jak sprawdzić definicję istniejącego widoku?
W MySQL służy do tego SHOW CREATE VIEW, w PostgreSQL zapytanie do pg_views, w SQL Server procedura sp_helptext, a w SQLite tabela sqlite_master. Generator podaje gotowe polecenie dla wybranej bazy pod wygenerowanym kodem.
Czy CREATE VIEW działa tak samo w MySQL, PostgreSQL i SQL Server?
Podstawowa konstrukcja CREATE VIEW ... AS SELECT jest wspólna. Różnią się rozszerzenia: MySQL ma ALGORITHM i SQL SECURITY, MySQL i PostgreSQL używają CREATE OR REPLACE VIEW, SQL Server — CREATE OR ALTER VIEW, a SQLite nie ma ani nadpisania, ani WITH CHECK OPTION. Inne jest też cytowanie nazw.