Files
sql/banque.vues.md

46 lines
2.0 KiB
Markdown
Raw Permalink Normal View History

2025-11-18 20:40:28 +01:00
# Les vues
Une vue SQL est un objet de la base de données qui représente le résultat dune requête SQL enregistrée.
Elle se comporte comme une table virtuelle : on peut la consulter avec SELECT comme une table, mais elle ne stocke pas de données.
La définition de la vue est enregistrée dans la base, et chaque fois quon interroge la vue, la base réexécute la requête sous-jacente.
2025-11-16 09:10:10 +01:00
```sql
create or replace view holder_detail as
select h.id, h.type,
case
2025-11-18 20:40:28 +01:00
when type = 'PERSON' then firstname || ' ' || lastname
when type = 'COMPANY' then c.name
when type = 'BANK' then b.name
2025-11-16 09:10:10 +01:00
end as nom,
case
2025-11-18 20:40:28 +01:00
when type = 'PERSON' then age(birthdate)
when type = 'COMPANY' then age(c.created_at)
2025-11-16 09:10:10 +01:00
end as age
from holder h
left join person p on p.id = h.id
left join company c on c.id = h.id;
2025-11-18 20:40:28 +01:00
left join bank b on b.id = h.id;
2025-11-16 09:10:10 +01:00
```
2025-11-19 07:12:57 +01:00
- `case when` est une expression conditionnelle SQL qui permet de retourner une valeur différente selon quune condition est vraie ou fausse, un peu comme une structure if/else dans un langage de programmation.
- `as` permet de donner un nom lisible à une colonne
- la fonction `age` affiche l'age en texte en se basant sur une date
- `left join` jointure optionnelle, prend tout ce qui est à gauche `holder`. Si il n' a pas de correspondance à droite (par exemple il n' a pas de `comapny` pour le type `PERSON`) alors les colonnes correspondantes à `compant` sont vides (<NULL>).
- `||` concatener deux chaines de caractères.
2025-11-16 09:10:10 +01:00
```sql
create or replace view account_detail as
select a.balance,
a.balance * ah.share as balance_currency,
a.balance * ah.share / latest_exchange_rate(a.currency_code, current_date),
a.currency_code,
hd.nom
from account a
join account_holder ah on ah.account_id = a.id
join holder_detail hd on ah.holder_id = hd.id;
```
2025-11-19 07:12:57 +01:00
2025-11-19 08:35:16 +01:00
- Utilisation d'une [fonction personnalisée](banque.functions.md) `latest_exchange_rate`
2025-11-19 07:12:57 +01:00
- `join` utilisation d'une jointure stricte. Seules les lignes avec correspondance exacte apparaissent.