2. DDL - Definició de dades
El Llenguatge de Definició de Dades (DDL) de SQL permet definir els objectes de les nostres bases de dades. Amb ell podrem crear bases de dades, taules, claus, etc, així com crear vistes parcials de les taules i gestionar els diferents permisos per a cada usuari o grup d'usuaris, etc.
Nota
Potser varia un poc d'un SGBD a altre (tipus de dades, etc). Nosaltres ens basarem en el MySQL.
2.1. Instruccions sobre bases de dades
-
Per a mostrar les bases de dades que tenim:
SQL -
Per a crear una base de dades nova:
SQL -
Per a treballar amb una base de dades (que ja estiga creada):
SQL -
Per a consultar amb quina base de dades estem treballant:
SQL -
Per a eliminar una base de dades que ja no volem:
SQL
Abans de vore les instruccions sobre les taules, vorem primer els tipus de dades que accepta MySQL per a crear les columnes de les taules.
2.2. Tipus de dades
Alguns dels tipus de dades de MySQL són:
| Classificació | Tipus de dades | Descripció |
|---|---|---|
| ENTERS | TINYINT |
Enter entre -127 i 127 |
BOOL |
Igual que TINYINT. True=1. False=0 | |
SMALLINT |
Fins 65.535 | |
MEDIUMINT |
Fins 8 milions (+-) | |
INT o INTEGER |
Fins 4000 milions (+-) | |
BIGINT |
Fins 18 trilions (+-) | |
| DECIMALS | DECIMAL(m, d) |
|
FLOAT |
||
DOUBLE |
||
REAL |
||
| DATA I HORA | DATE |
Guarda dates en any-mes-dia (0000-00-00) |
TIME |
Guarda les hores en hora:minuts:segons (00:00:00). Amb la funció DATE_FORMAT() es pot mostrar en AM i PM. |
|
DATETIME o TIMESTAMP |
Data i hora. Format: any-mes-dia hora:minuts:segons (0000-00-00 00:00:00). | |
YEAR |
4 dígits | |
| TEXT | CHAR(n) |
Fins 255 caràcters abans de versió 5.03. Fins 65.000 en versions posteriors. |
VARCHAR(n) |
Ocupa menys que CHAR però les consultes són més lentes. | |
| ALTRES | BLOB |
Informació binària (imatges, sons...) |
2.3. Instruccions sobre taules
Mostrar informació de les taules existents
| SQL | |
|---|---|
Crear/modificar/eliminar les taules
| SQL | |
|---|---|
Ara vorem en detall estes últimes.
2.3.1. CREATE TABLE
Creació de taules sense claus
Nota
Els noms (de taules, camps, etc) han de començar per lletra i no poden contindre espais o caràcters de puntuació especials.
Creació de taules amb claus primàries i alternatives
Quan creem una taula, si volem indicar que un camp és clau primària utilitzarem PRIMARY KEY. Per a indicar que és clau alternativa, usarem: UNIQUE.
| SQL | |
|---|---|
La clau primària i/o les claus alternatives també es poden indicar després de l'última columna:
| SQL | |
|---|---|
En eixe cas, també podem posar noms a les restriccions (que han de ser únics en tota la base de dades). Una utilitat és poder esborrar després una restricció indicant el seu nom.
| SQL | |
|---|---|
Després podríem esborrar una restricció amb:
| SQL | |
|---|---|
O bé:
| SQL | |
|---|---|
Esta forma d'indicar les claus al final de la taula és necessària si volem indicar que una clau és composta. Per exemple:
Notes
AUTO_INCREMENT: si no indiquem el codi quan inserim una persona, automàticament li assignarà un més del màxim codi dels alumnes inserits.NOT NULL: per a impedir que un camp tinga valors nuls.DEFAULT: per a posar un valor per defecte.
Creació de taules amb claus alienes
Per a usar-les en MySQL cal crear les taules amb el motor InnoDB.
Motors d'emmagatzematge de MySQL
El motor d'emmagatzematge és la forma en què MySQL emmagatzema les taules. Els motors més importants són MyISAM i InnoDB (cadascun amb els seus avantatges i inconvenients).
Nosaltres utilitzarem InnoDB perquè suporta claus alienes i transaccions.
Per a especificar el motor s'indica al final de la creació de cada taula, amb la paraula ENGINE (o bé TYPE, és el mateix).
Si no s'especifica el motor en una taula, es crea amb MyISAM en versions de MySQL anteriors a la 5.5. En versions posteriors, el motor per defecte és InnoDB. Per a saber la versió de MySQL que tenim, podem vore-ho amb: show variables like 'version'
Una sentència SELECT pot barrejar diferents tipus de taules.
| SQL | |
|---|---|
En este exemple veiem com seria la definició d'una clau aliena composta:
| SQL | |
|---|---|
Notes
- També es pot posar un nom a la clau aliena, amb el
CONSTRAINT. -
És opcional indicar la columna de la taula referenciada (
cpo) a no ser que en la taula pare fóra clau alternativa (en compte de clau principal):SQL -
El motor MyISAM també permet establir les claus alienes, però no serveix de res: no fa control d'existència de les referències.
-
La clau aliena també es pot posar en la pròpia definició del camp en la taula, però no fa absolutament res (almenys en MySQL):
Només es posa com a "comentari per al programador" de que eixa columna fa referència a altra columna d'altra taula.
Exemple: funcionament de claus primàries i alienes
Omplim la taula pobles:
| SQL | |
|---|---|
Omplim la taula clients:
| SQL | |
|---|---|
Esborrem registre de la taula de pobles:
Accions associades a la clau aliena
Quan definim una clau aliena podem especificar que, si s'esborra un registre de la taula pare (la de pobles), que s'esborren també, automàticament, els registres relacionats de la taula filla (és a dir: que s'eliminen també els clients d'eixe poble).
O bé, podem indicar que, quan modifiquem un codi postal en la taula de pobles, que també es modifique eixe codi en els corresponents clients que tenien eixe poble.
Eixes dos coses (i més) es poden fer posant-ho en la restricció de clau aliena de la taula. Per exemple:
| SQL | |
|---|---|
Estes són les accions que podem fer en un ON DELETE o en un ON UPDATE:
- CASCADE: Els registres dependents també s'esborren o es modifiquen.
- SET NULL: Els registres dependents es posen a null (si no tenien la restricció de NOT NULL, clar).
- SET DEFAULT: Els registres dependents es posen al valor per defecte (si el tenien, clar). El motor InnoDB ho accepta, però sense cap efecte.
- RESTRICT: No deixa esborrar/modificar de la taula pare si té registres dependents. És l'opció per defecte (si no posem ON UPDATE o ON DELETE).
- NO ACTION: En MySQL fa exactament el mateix que RESTRICT. Ara bé, en altres SGBD com Oracle o PostgreSQL, el NO ACTION deixa esborrar/modificar de la taula pare però no fa res en els registres dependents. Això trencaria la definició de clau aliena, però el que fa realment és endarrerir les comprovacions de clau aliena per a quan acabe la transacció (ja vorem les transaccions més endavant).
Exercicis. CREATE DATABASE i CREATE TABLE (BD cultius)
1) Per a fer un estudi sobre els tipus de cultius que es donen en cada comarca del món, s'ha creat el següent esquema ER, amb el posterior esquema relacional:
Escriu les instruccions DDL necessàries per a crear la base de dades cultius amb les taules corresponents, tenint en compte que:
- Abans de crear una taula amb claus alienes, caldrà crear primer les taules de les quals depén. Si no, et donarà error quan intentes crear eixa taula.
- El codi dels tipus de cultius serà un
char(3). El codi de comarques unchar(5). La quantitat d'habitants (n_hab) serà un enter. Els altres camps seran unvarchar(30). - Caldrà indicar les claus alienes de forma que:
- Si modifiquem el codi d'un país o província en la taula de províncies, també haurà de canviar en la taula de comarques.
- Si modifiquem un codi de cultiu en la taula
tipus_cultius, també s'haurà de modificar en la taulacultivar. - Si esborrem un tipus de cultiu en la taula
tipus_cultius, també s'hauran d'esborrar els registres decultivarque tinguen eixe cultiu.
2.3.2. ALTER TABLE
S'utilitza per a modificar l'estructura (no les dades) d'una taula ja existent.
a) Canviar el nom d'una taula
| SQL | |
|---|---|
b) Afegir un camp
| SQL | |
|---|---|
Nota
El COLUMN és opcional en ADD, DROP, CHANGE i ALTER.
c) Eliminar un camp
| SQL | |
|---|---|
d) Modificar un camp
-
Canvi de nom (i/o del tipus de dades, de posició...):
-
Posar o llevar el valor per defecte:
e) Afegir claus o índexos
Nota
També podem posar el CONSTRAINT per a posar nom a les restriccions.
f) Esborrar claus o índexos
| SQL | |
|---|---|
2.3.3. DROP TABLE
| SQL | |
|---|---|
Exercicis. ALTER TABLE (BD empresa)
1) Per a practicar l'ALTER TABLE primer crearem una nova BD amb un parell de taules. Crea la base de dades de nom empresa amb les taules següents:
| Text Only | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
2) Fes que el camp num de la taula emp siga la clau principal.
3) Afegeix una nova columna anomenada salari a la taula emp, de tipus enter i amb la condició de no poder prendre valors nuls.
4) Incorpora la condició de que la columna dept de la taula emp és clau aliena respecte a la taula dept (camp codi). Fes que quan s'esborre un departament, també s'esborren els empleats associats a eixe departament.
5) Fes que la columna cap de la taula emp siga clau aliena, referenciant a la seua pròpia taula.
6) Intenta eliminar la columna cap de la taula emp.
7) Elimina la condició de que la columna codi de dept és clau primària.