Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Visninger | Nogle Yderligere Emner
SQL-optimering og Forespørgselsfunktioner

Visninger

Stryg for at vise menuen

I det forrige kapitel nævnte vi et objekt kaldet view i forbindelse med brugerrettigheder. Lad os nu se nærmere på dette objekt.

Et view i SQL er en virtuel tabel, der er baseret på resultatet af en SQL-forespørgsel. Den indeholder rækker og kolonner ligesom en rigtig tabel, og felterne i et view er felter fra en eller flere rigtige tabeller i databasen.
Views anvendes af flere grunde, herunder forenkling af komplekse forespørgsler, forbedring af sikkerhed ved at begrænse adgangen til specifikke data og præsentation af data i et bestemt format.

Nøglefunktioner ved Views

  • Virtuel tabel: et view gemmer ikke data fysisk. Det henter sine data fra de tabeller, det er baseret på (kaldet basistabeller);
  • Forenkling af komplekse forespørgsler: views kan forenkle komplekse SQL-forespørgsler ved at indkapsle dem i et enkelt view. Dette gør det lettere at arbejde med komplekse joins og aggregeringer;
  • Sikkerhed: views kan begrænse adgangen til specifikke rækker eller kolonner af data og dermed øge sikkerheden. Brugere kan få adgang til viewet uden at få adgang til de underliggende basistabeller;
  • Konsistens: views kan præsentere et konsistent, uændret interface, selv når den underliggende databasestruktur ændres.

Implementering

Vi opretter et view kaldet account_activity_view baseret på vores BankAccounts og UserLogs tabeller, som viser kontonummer, kontohavers navn, saldo og den seneste handling på kontoen.

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;
Forespørgselsbeskrivelse
expand arrow
  1. CREATE VIEW account_activity_view AS

Denne erklæring opretter et view med navnet account_activity_view, som kombinerer information fra tabellen bankaccounts med den seneste aktivitet fra tabellen userlogs. Det giver et overblik over kontohavere, deres aktuelle saldo og deres seneste handling.

  1. Hoved-SELECT-sætning:

    • ba.accountnumber: Vælger kontonummeret fra tabellen bankaccounts.
    • ba.accountholder: Vælger kontohaverens navn fra tabellen bankaccounts.
    • ba.balance: Vælger saldoen fra tabellen bankaccounts.
    • ul.action AS latest_action: Vælger den seneste handling fra tabellen userlogs og giver den aliaset latest_action.
    • ul.timestamp AS latest_action_time: Vælger tidsstemplet for den seneste handling og giver det aliaset latest_action_time.
  2. FROM-sætning:

    • bankaccounts ba: Hovedtabellen er bankaccounts, og den får aliaset ba.
  3. LEFT JOIN-sætning:

    • Underforespørgslen henter den seneste handling for hver konto.
    • SELECT DISTINCT ON (accountnumber): Sikrer unikke kontonumre og vælger kun den seneste post pr. konto.
    • ORDER BY accountnumber, timestamp DESC: Sorterer posterne efter kontonummer og derefter efter tidsstempel i faldende rækkefølge for at få den seneste handling.
  4. Join-betingelse:

    • ul ON ba.accountnumber = ul.accountnumber: Sammenkæder resultatet af underforespørgslen med tabellen bankaccounts baseret på kontonummeret.

Nu kan dette view anvendes i andre forespørgsler uden at skulle genskabe den komplekse forespørgsel med joins, blot ved at bruge det oprettede view som en almindelig tabel.

Note
Bemærk

Selvom vi kan bruge viewet som en almindelig tabel, er det faktisk ikke en fysisk tabel! Dataene i viewet gemmes ikke på disken. I stedet bliver viewets forespørgsel udført, hver gang vi bruger viewet, og de resulterende data anvendes i hovedforespørgslen.

question mark

Hvilket af følgende udsagn beskriver bedst sikkerhedsaspektet ved views?

Vælg det korrekte svar

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 3. Kapitel 6

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

Visninger

I det forrige kapitel nævnte vi et objekt kaldet view i forbindelse med brugerrettigheder. Lad os nu se nærmere på dette objekt.

Et view i SQL er en virtuel tabel, der er baseret på resultatet af en SQL-forespørgsel. Den indeholder rækker og kolonner ligesom en rigtig tabel, og felterne i et view er felter fra en eller flere rigtige tabeller i databasen.
Views anvendes af flere grunde, herunder forenkling af komplekse forespørgsler, forbedring af sikkerhed ved at begrænse adgangen til specifikke data og præsentation af data i et bestemt format.

Nøglefunktioner ved Views

  • Virtuel tabel: et view gemmer ikke data fysisk. Det henter sine data fra de tabeller, det er baseret på (kaldet basistabeller);
  • Forenkling af komplekse forespørgsler: views kan forenkle komplekse SQL-forespørgsler ved at indkapsle dem i et enkelt view. Dette gør det lettere at arbejde med komplekse joins og aggregeringer;
  • Sikkerhed: views kan begrænse adgangen til specifikke rækker eller kolonner af data og dermed øge sikkerheden. Brugere kan få adgang til viewet uden at få adgang til de underliggende basistabeller;
  • Konsistens: views kan præsentere et konsistent, uændret interface, selv når den underliggende databasestruktur ændres.

Implementering

Vi opretter et view kaldet account_activity_view baseret på vores BankAccounts og UserLogs tabeller, som viser kontonummer, kontohavers navn, saldo og den seneste handling på kontoen.

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;
Forespørgselsbeskrivelse
expand arrow
  1. CREATE VIEW account_activity_view AS

Denne erklæring opretter et view med navnet account_activity_view, som kombinerer information fra tabellen bankaccounts med den seneste aktivitet fra tabellen userlogs. Det giver et overblik over kontohavere, deres aktuelle saldo og deres seneste handling.

  1. Hoved-SELECT-sætning:

    • ba.accountnumber: Vælger kontonummeret fra tabellen bankaccounts.
    • ba.accountholder: Vælger kontohaverens navn fra tabellen bankaccounts.
    • ba.balance: Vælger saldoen fra tabellen bankaccounts.
    • ul.action AS latest_action: Vælger den seneste handling fra tabellen userlogs og giver den aliaset latest_action.
    • ul.timestamp AS latest_action_time: Vælger tidsstemplet for den seneste handling og giver det aliaset latest_action_time.
  2. FROM-sætning:

    • bankaccounts ba: Hovedtabellen er bankaccounts, og den får aliaset ba.
  3. LEFT JOIN-sætning:

    • Underforespørgslen henter den seneste handling for hver konto.
    • SELECT DISTINCT ON (accountnumber): Sikrer unikke kontonumre og vælger kun den seneste post pr. konto.
    • ORDER BY accountnumber, timestamp DESC: Sorterer posterne efter kontonummer og derefter efter tidsstempel i faldende rækkefølge for at få den seneste handling.
  4. Join-betingelse:

    • ul ON ba.accountnumber = ul.accountnumber: Sammenkæder resultatet af underforespørgslen med tabellen bankaccounts baseret på kontonummeret.

Nu kan dette view anvendes i andre forespørgsler uden at skulle genskabe den komplekse forespørgsel med joins, blot ved at bruge det oprettede view som en almindelig tabel.

Note
Bemærk

Selvom vi kan bruge viewet som en almindelig tabel, er det faktisk ikke en fysisk tabel! Dataene i viewet gemmes ikke på disken. I stedet bliver viewets forespørgsel udført, hver gang vi bruger viewet, og de resulterende data anvendes i hovedforespørgslen.

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 3. Kapitel 6
some-alt