aboutsummaryrefslogtreecommitdiff
path: root/semestre 4/db/3- SQL-base.typ
blob: d9e07bdb0624e789f520535e2066bdebb8bcd423 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#import "@local/template:1.0.0": *
#import "@local/callout:1.0.0": *

#show: doc.with(
  authors: (
    (name: "William Hergès", affiliation: "Sorbonne Université", email: "william@herges.fr"),
  ),
  page_title: "SQL base",
)

= Création d'une table

On utilise H2 comme DB.

```sql
CREATE TABLE <table> (
  <attr_name> <attr_type> [NOT NULL] [DEFAULT <attr_val>],
  <attr_name> <attr_type> [NOT NULL] [DEFAULT <attr_val>],
  <attr_name> <attr_type> [NOT NULL] [DEFAULT <attr_val>],
  ...
  <attr_name> <attr_type> [NOT NULL] [DEFAULT <attr_val>],
  <contrainte>,
  <contrainte>,
  <contrainte>
)
```

== Types

=== Alphanumériques

Alphanumériques~:
- `char(n)`, `character(n)`
- `varchar(n)`, `varying(n)`

$n$ vaut $1$ par défaut, peut aller de $1$ à $1048576$.

`char(n)` est une allocation statique -> tous les mots feront toujours $n$.

`varchar(n)` est une allocation dynamique -> les mots font au maximum $n$.

=== Numériques

Numériques~:
- `smallint`, `int` (ou `integer`), `bigint`
- `numeric(t,d)` ou `decimal(t,d)`
- `real`, `double precision`

`numeric(t,d)` ou `decimal(t,d)` représentent les nombres à virgule.
- `t` est le nombre total de chiffres (on ne compte pas le signe)
- `d` est le nombre de chiffres après la virgule (partie décimale)

`real`, `double precision` représentent les floatants.

=== Temps

`date` est la date calendaire (jour, mois, année).

`time` est le temps d'un jour (heure, minutes, secondes), peut contenir un fuseau horaire.

`timestamp` est la combinaison de `date` et de `time`.

=== Domaine

Définition d'un nouveau type à partir d'un type de base.

Associe éventuellement une contraine devant être évaluée à vrai ou inconnu pour être vérifiée.

```sql
CREATE DOMAIN <nom> AS <type> [<contrainte>];
```

Par exemple,
```sql
CREATE DOMAIN fin_semaine as TEXT CHECK (VALUE in ('sam', 'dim'));
CREATE DOMAIN sal_min as NUMERIC(7,2) CHECK (VALUE >= 10000);
```

== Contrainte

Est une condition devant être vérifiée par toutes les données.
Cela permet d'avoir une cohérence et de garder cette cohérence avec une mise à jour.

=== Type

Peut toucher rôle des clés~:
- identification des $n$-uplets
- chaque table possède au moins une clé (la primaire)
- vérification efficace avec des index

Peut toucher les données basiques~:
- _voir diapo_

=== Contraintes de clés

Clé candidate sont les attributs dont les valeurs sont distinctes pour tous les $n$-uplets.

Clé primaire est une clé candidate dont chacun des attributs est renseigné.
```sql
PRIMARY KEY(<attr>)
```

Clé étrange est un attribut dans les valeurs proviennent d'une clé candidate ou d'une clé primaire définie autre part.
(Peut être la même table.)
```sql
FOREIGN KEY <attr> REFERENCES <table>
```
Comme on n'a pas indique d'attributs, cela signifie que l'on réfère à la clé primaire.

=== Contraintes sur les données

_Voir le diapo_

=== CHECK et ASSERTION

_Voir le diapo_

== Modifier une table

=== Suppression

Pour supprimer une table~:
```sql
DROP TABLE <name> [IF EXISTS];
```

Si il existe des contraintes portant sur cette table, on peut les supprimer durant la suppression~:
```sql
DROP TABLE <name> IF EXISTS CASCADE;
```

=== Modification d'un champ

= Requêtes SQL simples

SQL provient de la fusion entre l'algèbre relationnelle et des tuples.

```sql
SELECT <projection>
FROM <table>
[WHERE <condition>]
```