Views
Veeg om het menu te tonen
In het vorige hoofdstuk noemden we een object genaamd view bij het bespreken van gebruikersrechten. Laten we dit object nu in meer detail bekijken.
Een view in SQL is een virtuele tabel die is gebaseerd op het resultaat van een SQL-query. Het bevat rijen en kolommen, net als een echte tabel, en de velden in een view zijn velden uit één of meer echte tabellen in de database.
Views worden om verschillende redenen gebruikt, waaronder het vereenvoudigen van complexe queries, het verhogen van de beveiliging door de toegang tot specifieke gegevens te beperken, en het presenteren van gegevens in een specifiek formaat.
Belangrijkste kenmerken van views
- Virtuele tabel: een view slaat geen gegevens fysiek op. De gegevens worden afgeleid van de tabellen waarop de view is gebaseerd (de zogenaamde basistabellen);
- Vereenvoudigen van complexe queries: views kunnen complexe SQL-queries vereenvoudigen door ze te kapselen in één enkele view. Dit maakt het eenvoudiger om te werken met complexe joins en aggregaties;
- Beveiliging: views kunnen de toegang tot specifieke rijen of kolommen van gegevens beperken, wat de beveiliging verhoogt. Gebruikers kunnen toegang krijgen tot de view zonder toegang te krijgen tot de onderliggende basistabellen;
- Consistentie: views kunnen een consistent, onveranderd interface presenteren, zelfs wanneer het onderliggende databaseschema verandert.
Implementatie
We zullen een view maken genaamd account_activity_view op basis van onze BankAccounts en UserLogs tabellen die het rekeningnummer, de naam van de rekeninghouder, het saldo en de meest recente actie op de rekening toont.
1234567891011121314151617181920212223242526-- Create a view that shows account details along with their latest action CREATE OR REPLACE VIEW account_activity_view AS SELECT ba.account_number, -- Select the account number from the bankaccounts table ba.account_holder, -- Select the account holder's name from the bankaccounts table ba.balance, -- Select the balance from the bankaccounts table ul.action AS latest_action, -- Select the latest action from the userlogs table (alias as latest_action) ul.timestamp AS latest_action_time -- Select the timestamp of the latest action (alias as latest_action_time) FROM BankAccounts ba -- Main table: bankaccounts LEFT JOIN ( -- Subquery to get the most recent action for each account SELECT DISTINCT ON (account_number) account_number, -- Select the account number action, -- Select the action timestamp -- Select the timestamp FROM UserLogs ORDER BY account_number, -- Order by account number timestamp DESC -- Order by timestamp in descending order to get the latest action ) ul ON ba.account_number = ul.account_number; -- Join the subquery result with bankaccounts on account number -- Get data from the view SELECT * FROM account_activity_view;
CREATE VIEW account_activity_view AS
Deze instructie maakt een view met de naam account_activity_view die informatie uit de tabel bankaccounts combineert met de laatste activiteit uit de tabel userlogs. Het biedt een overzicht van rekeninghouders, hun huidige saldo en hun laatste actie.
-
Hoofd-
SELECT-clausule:ba.accountnumber:Selecteert het rekeningnummer uit de tabelbankaccounts.ba.accountholder:Selecteert de naam van de rekeninghouder uit de tabelbankaccounts.ba.balance:Selecteert het saldo uit de tabelbankaccounts.ul.action AS latest_action:Selecteert de laatste actie uit de tabeluserlogsen geeft deze de aliaslatest_action.ul.timestamp AS latest_action_time:Selecteert het tijdstip van de laatste actie en geeft deze de aliaslatest_action_time.
-
FROM-clausule:bankaccounts ba:De hoofdtafel isbankaccounts, met het aliasba.
-
LEFT JOIN-clausule:- De subquery haalt de meest recente actie voor elke rekening op.
SELECT DISTINCT ON (accountnumber):Zorgt voor unieke rekeningnummers, waarbij alleen de meest recente invoer per rekening wordt geselecteerd.ORDER BY accountnumber, timestamp DESC:Sorteert de invoeren op rekeningnummer en vervolgens op tijdstip in aflopende volgorde om de laatste actie te verkrijgen.
-
Join-voorwaarde:
ul ON ba.accountnumber = ul.accountnumber:Voegt het resultaat van de subquery samen met de tabelbankaccountsop basis van het rekeningnummer.
Deze view kan nu in andere queries worden gebruikt zonder de complexe query met joins opnieuw te hoeven schrijven, door simpelweg de aangemaakte view als een gewone tabel te gebruiken.
Hoewel we de view kunnen gebruiken als een reguliere tabel, is het eigenlijk geen fysieke tabel! De gegevens in de view worden niet op de schijf opgeslagen. In plaats daarvan wordt de query van de view uitgevoerd telkens wanneer we de view gebruiken, en de resulterende gegevens worden gebruikt in de hoofdquery.
Bedankt voor je feedback!
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.