SQL insercions

De Cacauet Wiki
Salta a la navegació Salta a la cerca

Descarrega i crea la base de dades de l'institut amb l'arxiu Fitxer:Ufs.sql.

La base de dades de l'institut es diu UFs perquè a partir d'ara les matriculacions es faran amb Unitats Formatives (UFs) que son les diverses parts que composen una assignatura.

La base de dades ufs.sql està incomplerta i cal afegir informació que no està encara introduïda. La base de dades conté les assignatures de 1r curs de SMX (juntament amb algunes qualificacions dels alumnes) i cal que nosaltres introduïm les dades del segon curs. Les dades sobre les assignatures que manquen les podreu trobar aquí: currículum titulació CFGM SMX.

Entrada al sistema i inspecció de les taules

Primer de tot cal entrar dins la base de dades com sempre des del promp de Linux:

$> mysql -u <usuari> -p

Un cop a dins podem mirar les taules que conté i després examinar el contingut de cadascuna d'elles amb desc:

mysql> show tables;

el que hauria de mostrar les taules de la base de dades

+---------------+
| Tables_in_ufs |
+---------------+
| UFs           | 
| alumnes       | 
| assignatures  | 
| curs          | 
| especialitat  | 
| matricules    | 
| professors    | 
| titulacio     | 
| uf_matricula  | 
+---------------+
9 rows in set (0,00 sec)

Pel comentat al principi podem entendre que les taules que ens interessen son la d'assignatures i la de UFs.

mysql> desc assignatures;

el que ens mostrarà els camps (columnes) de la taula en qüestió:

+------------------+----------+------+-----+---------+----------------+
| Field            | Type     | Null | Key | Default | Extra          |
+------------------+----------+------+-----+---------+----------------+
| id_assignatura   | int(11)  | NO   | PRI | NULL    | auto_increment | 
| codi_assignatura | char(50) | YES  |     | NULL    |                | 
| nom              | char(50) | YES  |     | NULL    |                | 
| hores            | int(11)  | YES  |     | NULL    |                | 
| descripcio       | longblob | YES  |     | NULL    |                | 
| id_professor     | int(11)  | YES  | MUL | NULL    |                | 
| id_titulacio     | int(11)  | YES  | MUL | NULL    |                | 
| curs             | int(11)  | YES  |     | NULL    |                | 
+------------------+----------+------+-----+---------+----------------+

i podem inspeccionar la taula de UFs amb:

mysql> desc UFs

que ens donarà:

+----------------+-----------+------+-----+---------+----------------+
| Field          | Type      | Null | Key | Default | Extra          |
+----------------+-----------+------+-----+---------+----------------+
| id_uf          | int(11)   | NO   | PRI | NULL    | auto_increment | 
| id_assignatura | int(11)   | YES  | MUL | NULL    |                | 
| numero         | int(11)   | YES  |     | NULL    |                | 
| titol          | char(100) | YES  |     | NULL    |                | 
| hores          | int(11)   | YES  |     | NULL    |                | 
| descripcio     | text      | YES  |     | NULL    |                | 
+----------------+-----------+------+-----+---------+----------------+
6 rows in set (0,00 sec)

Inspecció de les dades de les taules

Per saber quines dades disposem podem fer un

mysql> SELECT * FROM assignatures;

Però les dades son massa grans i ens interessa veure-ho tot una mica més reduït. Millor si triem només els camps que ens calen:

mysql> SELECT id_assignatura,nom FROM assignatures;

Si volem mostrar només les dades de SMX podem fer-ho de dues maneres:

MÈTODE 1: (més senzill)

  • Esbrinem la id_titulacio que ens cal (inspeccionant les dades de la taula titulacio)
  • Fem el SELECT utiltizant aquesta id_titulacio en el WHERE (filtrant les dades de la titulació de SMX)

MÈTODE 2: (més complicat)

  • Realitzem un SELECT amb un JOIN per ajuntar les 2 taules i amb un WHERE per filtrar les dades de la titulació de SMX

Mètode 1 (sense JOIN)

Esbrinem la id_titulació del cicle formatiu de SMX:

mysql> SELECT * FROM titulacio;

I podem veure que la titulació que ens interessa és la de SMX, que té un id_titulacio=3'.

Ara podem anar a la taula de UFs i mostrar només les que ens interessen:

mysql> SELECT id_assignatura,nom FROM assignatures WHERE id_titulacio=3;

De la mateixa manera podem fer un llistat de les UFs d'una assignatura en concret, per exemple les de "Muntatge i manteniment d'equips", que correspon al nº d'assignatura "M1" de SMX i que si observem el resultat anterior podem veure que te una 'id_assignatura=1;

Fem, doncs, un llistat de les UFs de l'assignatura d'Equips:

mysql> SELECT * FROM UFs WHERE id_assignatura=1;

Mètode 2 (amb JOIN)

Podem saber directament la correspondència entre titulacions i assignatures amb la consulta:

mysql> SELECT titulacio.titulacio, assignatures.nom, assignatures.id_assignatura
    -> FROM titulacio INNER JOIN assignatures
    -> ON titulacio.id_titulacio=assignatures.id_titulacio;

I si volem saber, a més, filtrar les que corresponen a "SMX" podem fer:

mysql> SELECT titulacio.titulacio, assignatures.nom, assignatures.id_assignatura
    -> FROM titulacio INNER JOIN assignatures
    -> ON titulacio.id_titulacio=assignatures.id_titulacio
    -> WHERE titulacio.titulacio LIKE "%SMX%";

Introducció de dades amb INSERT

La sintaxi complerta de la comanda SQL INSERT la podeu trobar aquí.


Haurem de comprovar, assignatura per assignatura, si té les seves corresponents UFs. Si alguna assignatura no té les UFs introduïdes, mirarem de l'arxiu de currículum de la titulació de SMX i introduïrem les dades corresponents.

Per exemple, la primera assignatura que trobem que no disposa de UFs és la que té per id_assignatura=5 ("Sistemes operatius en xarxa").

Si mirem les dades del currículum trobarem que aquesta assignatura té les següents UFs:

  • UF 1: Instal·lació i configuració de sistemes operatius en xarxa propietaris.
    Serveis de directori i gestió de dominis: 29 hores.
  • UF 2: Instal·lació i configuració de sistemes operatius en xarxa lliures.
    Serveis de directori i gestió de dominis: 30 hores.
  • UF 3: Compartició de recursos en xarxa i seguretat en sistemes lliures i propietaris: 24 hores.
  • UF 4: Integració de sistemes lliures i propietaris: 24 hores.


Així, el que hem de fer és introduïr les dades de les 4 UFs a taula "UFs" (òbviament). Hem de recordar que l'assignatura que anem a introduïr té per id_assignatura=5, ja que aquesta dada ens és imprescindible per introduïr correctament les dades a la taula. Com que és una FK (Foreign Key) no podem posar qualsevol cosa en aquesta columna, només quelcom que existiexi a la taula relacionada d'assignatures.


MOLT IMPORTANT: Abans de poder fer un INSERT has de tenir molt clar quins camps té la taula. Per mostrar els camps ho pots fer amb:

mysql> desc UFs;

La primera que entrarem serà la UF1. Aquesta té les següents dades:

  • id_uf: és un camp autonumèric que MySQL posarà sol de manera automàtica (no cal, doncs, que introduïm aquest dada).
  • id_assignatura: 5 (ho sabem al haver inspeccionat la taula "assignatures").
  • número UF: 1 (els números s'introdueixen tal qual, sense cometes).
  • Títol de la UF: "Instal·lació i configuració de sistemes operatius en xarxa propietaris" (les cadenes de caràcters es posen sempre entre cometes dobles).
  • Número d'hores de la UF: 29
  • Descripció: de moment ho deixarem buit.


Versió amb INSERT ... VALUES ...

Recordem la sintaxi complerta de la comanda INSERT. Simplificant, tenim:

INSERT INTO <nom_taula> (<columna1>, <columna2>, etc.)
VALUES (<valor_col1>, <valor_col2>, etc.)

La comanda resultant serà:

mysql> INSERT INTO UFs (id_assignatura,numero,titol,hores)
    -> VALUES (5,1,"Instal·lació i configuració de sistemtemes operat en xarxa propietaris",29);

Com podem veure, a la llista de camps (columnes) no hem posat ni la id_uf (ja que és autonumèric i ho fa automàticament la base de dades) ni la descripció (la podrem omplir més tard amb un UPDATE).

Versió amb INSERT ... SET ...

Hi ha una versió alternativa del INSERT utilitzant la partícula SET enlloc de la VALUES. Aquesta és:

INSERT INTO <nom_taula>
SET <col1>=<val1>, <col2>=<val2>, etc.

Per introduïr la 2a UF de l'assignatura ho farem amb aquestra altra sintaxi:

mysql> INSERT INTO UFs
    -> SET id_assignatura=5, numero=2,
    -> titol="Instal·lació i configuració de sistemes operatius en xarxa lliures.",
    -> hores=30;