You are on page 1of 18

Bases de Dades

Tema 7: SQL s el llenguatge estandar dANSI i dISO. Anys 70s els laboratoris Santa Teresa dIBM comencen a treballar en el System-R (Prototips de SGBD relacional). Aix prvoca la necessitat destudiar en el camp dels llenguatges relacionals Meitat dels 70s el projecte dna un primer llenguatge anomenat SEQUEL, que posteriorment passa a dir-se SQL(Structured Query Language) Finals dels 70s lSQL est molt acceptat per la gran majoria de les empreses. 1982 ANSI (American National Standard Institute) encarrega a un dels seus coites la definici dun llenguatge de BD 1986 SQL es converteix ene un llenguatge estandard dANSI 1987 SQL es converteix en estandard dISO (Internacional Standard Organization) 1989 T unarevisi i daqui surt lsql-1 o el SQL 89 1992Hi ha una altra revisi i daqu surt lSQL-2 o SQL-92 Nomenclatura: Parlem de Taules en comptes de Relacions Parlem de Columnes envers dAtributs Parlem de Files envers de Tuples Estructura: Les operacions de lSQL es diuen sentencies i estan formades per parts que es diuen clausules: Projecci de lAR -----------------------------SELECT codi_pro, nom_pro <-- clausula FROM productes <-- clausula WHERE preu>20 <-- clausula --------------Selecci de lAR

Les sentencies de Definici Les sentencies de definici serviran per definir la BD. (Crear lestructura, modificar-ne elements i esborrar-ne elements) Per crear BD, Taules, dominis, assessions i vistes es fa servir la sentencia CREATE Per modificar Taules i dominis es fa servir la sentencia ALTER Per esborrar BD, Taules, dominis, assecions i vistes es fa servir la sentencia DROP

Empleat Projecte departament

ciutat client

Empleat(codi_e, nom, cog, nom_dep, ciutat_dep, codi_proj) On { nom_dep, ciutat_dep } Projecte Departament(nom_dep, ciutat_dep, telefon) On { ciutat_dep } a client Ciutat(ciutat) Projecte(codi_p, nom, preu, data_inici, data_fi, codi_cli) On { codi_cli} client Client(codi_cli, nom, nif, adrea, telefon,ciuat) On {ciutat} a CIUTAT

Creaci duna BD CREATE DATABASE nomBD Esborrat duna BD DROP DATABASE nomBD Creaci dun esquema CREATE SCHEMA {nomesquema / AUTHORITATION usuari} [llista_elements_de_lesquema] Esborrat desquemes
2

DROP SCHEMA nom_esquema { RESTRICT /CASCADE } Sino cont cap sesborra encara element es pot qeu ni estigui buit esborrrar Creaci de Taula CREACI TABLE nom_taula ( definici:columna [,definici_columna,...] [,restricci de taula] ) Creaci Dominis CREATE DOMAIN nom_domini[AS]tipus_de_dades [definici_defecte] [restriccions_de_domini]
Nom_columna {tipus_dades/domini}[definici:defecte] [restriccio:columnes]

Default{literal/funci/NULL }

[CONSTRAINT nom_restriccio] CHECK(condicions)

CREATE DOMAIN domini_ciutats AS CHARACTER(20) CONSTRAINT ciutats_valides CHECK(VALUE IN (Barcelona,Tarragon,Giroona) Modificaci de Dominis AFTER DOMINE nom_domini {acci_modificar_domini / acci_modificar_restricci}

{SET definicio_defecte / DROP DEFAULT}

{ADD restricci_domini / DROP CONSTRAINT nom_restrici}

ALTER DOMAIN domini_ciutat DROP CONSTRAINT ciutats_valides ALTER DOMAIN domini_ciutats ADD CONSTRAINT ciutats_valides CHECK(VALUE IN(Tarragona,Barcelona,Lleida,Girona)) CREATE TABLES Alumne (dni CHARACTER(9) PIMARY KEY, nom CHARACTE(20) NOT NULL, cog1 CHARACTE(15), cog2 CHARACTE(15), edat INTEGER CHECK>12, ciutat_naix domini_ciutats )

Esborrat de Dominis DROP DOMAIN nom_domini {RESTRICT / CASCADE}

Nomes esborra si no es fa servi en lloc

Esborra de totes formes i el substiitueix pel tipus de dades en el que esta bassat

DROP DOMAIN nom_ciutats CASCADE Definicions per defecte DEFAULT {literal/funcio/NULL} Restriccions de Columna Definicio_de_la_columna Nom_columna{tipus/domini} definicio_objecta restriccions_columna Restriccions de Taula Condicions que afecten a ms duna columna CREATE TABLE nom_taula ( Definicio_columna[definicio_columna...] Restriccions_taula ) Aplicaci de les politiques a pendre en cas desborrat i de modificaci duna columna Politiques: - Restricci - Actualitzaci en cascada - Anullaci FOREIG KEY (columna[columna...])REFERENES taula[(columna2[columna2...]) [ON DELETE {NO ACTION/CASCADE/SET DEFAULT/SET NULL}] [ON UPDATE { NO ACTION/CASCADE/SET DEFAULT/SET NULL}] NO ACTION es correspon amb la politica de restricci CASCADE es correspon amb la politica dactualitzaci en cascada SET DEFAULT es una variant de la anullaci que es posa el valor predefinit per defecte SET NULL es correspon amb la anulaci Assecions Restriccions que fan referencia a ms duna columna de ms duna taula

Creaci duna asseci CREATE ASSERTION (condicions) Esborrar asseci DROP ASSERTION nom_asseci Apunts webmaster Les assercions Son condicions que afecten a columnas de ms duna taula. CREATE ASSERTION nom_condici CHECK (condicions) DROP ASSERTION nom_condici MODIFICACI DE TAULES CREATE TABLE nom_taula (definici_columna [,definici columna,] [restriccions de columna]) ALTER TABLE nom_taula {accio_modificar_columna/ acci_modificar_restricci_taula} {ADD [COLUMN] definicio columna/ ALTER [COLUMN] nom_columna {SET definici_defecte/DROP DEFAULT}/ DROP[COLUMN] nom_columna{RESTRICT/CASCADE}}

{ADD restricci/ DROP CONSTRAINT restricci{RESTRICT/CASCADE}} ESBORRAT DUNA TAULA CROP TABLE nom_taula {RESTRICT/CASCADE}

La taula no sesborra si est Referenciada CREATE TABLE LLIBRE

esbirra en cascada

(ISBN CHARACTER(12) PRIMARY KEY, titol CHARACTER(40), autor CHARACTER(30)

edici INTEGER) ALTER TABLE llibre ADD any INTEGER agafem un atribut

ALTER TABLE llibre ALTER titol SET DEFAULT titol no disponible ALTER TABLE LLIBRE DROP edici RESTRICT esborrem un atribut

ALTER TABLE llibre ADD CONSTRAINT rest1 CHECK (any> -3000) ALTER TABLE llibre DROP rest1 CASCADE ALTER TABLE llibre ADD any INTEGER CHECK (any> -3000) Creaci de vistes Les vistes serveixen per implementar els esquemes externs CREATE VIEW nom_vista[(llista_columnes)] AS (consulta) [WITH CHECK OPTION] CREATE VIEW nombre_proj_per_client (codi,nombre_projecte) AS (SELECT c.codi_di, COUNT(*) FROM clients c, projectes p WHERE c.codi_cli=p.codi_client GROUP BY c.codi_di Les vistes no existeixen realment com a conjunt de valors enmagatzemats, sino que estan basades en les taules reals, que diem materialitzades Es pot afegir una fila a una vista? (son actualitzables?) Depen de la vista en contret. Codi_cli Nom_projectes 10 2 20 1 30 1 60 1 Implica: Afegir un nou client Codi_cli / nom_cli / NIF / adrea / ciutat / telefon 60 NULL NULL NULL NULL NULL Implica
6

Afegir un projecte ms: Codi_projecte / nom_projecte NULL NULL Codi_cli Nom_cli Nif 10 ECIGSA 359823759c 20 CME 342342342d 70 XXX 987073009f Introdum aquest client a la vista

/ preu / data / ... / codi_client NULL 60 Ciutat Barcelona Girona Barcelona Telefon 938974077 939864549 981746782 Adrea Arago 23 Valencia 43 Corcega 24

INSERT INTO clients_BCN_GIR VALUES (70,XX, 987073009f, Barcelona, Corcega 24, 981746782) Aix provoca que sactualitzi la taula CLIENTS Qu passa si intentem introduir en a vista un client de lleida? Llavors actuar la clausula WHIT CHECK OPTION que fa que es compleixi la condici de la consulta, en aquest cas, ciutat=Barcelona OR ciutat=Girona. Esborrar duna vista DROP VIEW nom_consulta {RESTRICT / CASCADE}

Sino est referenciada (potser per una altra vista) sesborra

Sesborren les referencies en cascada

Creaci duna vista CREATE INDEX nom_index ON {taula/vista}(nom_columna[{ASC/DESC}] [,nom_columna[{ASC/DESC}]....] CREATE INDEX nom_cli ON clients (nom_cli) CREATE INDEX empleats ON empleats (cognom_emple, nom_emple ESC) Afegir files a una taula INSERT INTO taula [(columnes)] VALUES ({valor/DEFAULD/NULL},....)

Sentencies de Manipulaci
Les sentncies de manipulaci son per introduir files, esborrar files i modificar valors en les columnes de les taules. Tamb es consideren les consultes amb totes les seves variants. INSERT insertar DELETE esborrar UPDATE modificar Inseci de files en una taula INSERT INTO nomtaula[(columnes)] {VALUES {valor/DEFAULT/NULL},.../consulta}
Ordenats per com es van crear

INSERT INTO clients VALUES(10,ECIGSA,372489860C,Arago,278,Barcelona,DEFAULT)


Ordenats com li diguem

INSERT INTO clients (nif, nom_cli,codi_cli, telefon, adrea,ciutat) VALUES(372489860C,ECIGSA,10,DEFAULT,Arago,278,Barcelona) Esborrat de files duna taula DELETE FROM nom_taula [WHERE condicions]
Esborra tot els empleats

DELETE FROM empleats


Esborra tot els empleat qu etenen 1 en el numero de porjetes

DELETE FROM empleats WHERE num_proj=1 Modificaci de vaors de les columnes duna taula UPDATE nom_taula SET columna={valor/expressi/DEFAULT/NULL} [,columna={valor/expressi/DEFAULT/NULL}...] [WHERE condicions]

UPDATE empleats SET sou=sou+100 WHERE num_project=1 Consultes a una BD relacional SELECT columna_a_seeccionar [[AS] columna_renombrada] FROM taula_a_consultar [[AS] taula_renombrada] [WHERE condicions] Operadors a utilitzar en la clusula WHERE: - operadors de comparaci: =, <, >, >=, <= - Operadors booleans (lgics): AND, OR, NOT SELECT DISTINCT columnes FROM taula [WHERE CONDICIONS] La paraula DISTINCT evita que surtin files repetides. Funcions dAgregaci Serveixen per fer les consultes dagrupaci:
COUNT Compta el total de files seleccionades COUNT(*)forma habitual compta totes les files COUNT(columna) compta totes les files que no tenen vaolr null en aquella columa COUNT(DISTINC columna)Compta totes les files que en aquella columna que no estan repetides i no son nulles Dna la suma dels valors (nmerics duna columna) SUM(columna) Dna el mnim de la columna especificada MIN(columna) Dna el mxim de la columna especificada MAX(Columna) Dna el valor promig de la columna especificada AVG (columna)

SUM MIN MAX AVG

Important: Si posem una funci dagregaci en la clasula SELECT, llavors no podem posar-hi altres atributs, a menys que aquests atributs es posin tamb en una clasula GROUP BY o HAVING. SELECT nom_dpt, ciutat_dpt, MAX(sou), MIN(sou), AVG(sou) FROM empleats GROUP BY nom_dpt,ciutat_dpt SELECT nom_dpt, ciutat_dpt, MAX(sou), MIN(sou) FROM empleats

GROUP BY nom_dpt,ciutat_dpt Subconsultes Una subconsulta s una consulta inclosa dintre duna clusula WHERE o HAVING duna altra consulta. Volem saber el nom i codi del projecte de preu major SELECT codi_proj, nom_proj FROM projectes WHERE preu=(Select MAX(preu) from projecte) Altres predicats Aquests predicats es fan servir dintre de la clasula WHERE i serveisen per donar ms facilitats i ms potncia a lhora destablir les condicions de selecci. 1) Predicat BETWEEN Serveix per preguntar si el valor duna columna est comprs entre dos lmits
SELECT columna FROM taula WHERE columna BETWEEN limit1 AND limit2

2) Predicat IN Serveix per preguntar si el valor duna columna est en una llista donada
SELECT columna FROM taula WHERE columna [NOT] IN (valor1,valor2,...)

3) Predicat LIKE Per veure si una columna de tipus carcter compleix alguna caracterstica determinada Podem fer servi carcters comod: __ (subratllat) Substitueix un nic carcter % (Tant percent) Substitueix una cadena de carcters (que pot ser buida) Busquem el nom i cognom dels empleats, el no dels quals comenci per j.
SELECT nom_empl, cognom_empl FROM empleats WHERE nom_empl LIKE J% SELECT nom_empl, cognom_empl FROM empleats WHERE nom_empl LIKE J_ _ _ _

(ha de tenir J + 4 lletres)

4) Predicat IS NULL Per veure si una columna t valor null (o si fem servir IS NOT NULL, per veure les que no son null).
SELECT columnes FROM taula

10

WHERE columna IS [NOT] NULL SELECT nom_empl, cognom_empl FROM empleats WHERE nom_proj IS NULL

5) Predicat ANY/SOME i ALL Per veure si una columna compleix que totes les files (ALL) a algun delles (ANY i SOME) satisfan una condici. Volem els codi i noms dels projectes que tenen un preu que no s superat pel sou de cap dels empleats que el desenvolupa.
SELECT codi_proj, nom_proj FROM empleats WHERE preu > ALL (SELECT sou FROM empleats WHERE num_proj=codi_proj) SELECT codi_proj, nom_proj FROM empleats WHERE preu > SOME (SELECT sou FROM empleats WHERE num_proj=codi_proj) SELECT codi_proj, nom_proj FROM empleats WHERE preu > ANY (SELECT sou FROM empleats WHERE num_proj=codi_proj)

5) Predicat EXISTS (test dexistencia) Per veure si una subconsulta produeix alguna fila de resultats (Per veure si no produeix cap fila fem servir NOT EXISTS)
SELECT columnes FROM taula WHERE [NOT] EXISTS (subconsulta)

Ordenaci de les dades obtingudes en una consulta


SELECT columna FROM taula [WHERE condicions] ORDER BY columna_a_ordenar[DESC] [,columna_a_ordenar2[DESC]]

Consultes amb agrupaci de files duna taula


SELECT columnes FROM taula [WHERE condicions] [GROUP BY columnes_segons_les_quals_agrupen] [HAVING condicions_per_grups] [ORDER BY columna [DESC][, [ORDER BY columna [DESC]]

a) clausula GROUP BY serveix per agrupar segons les columnes que shi especifiqui. b) clausula HAVING serveix per posar les condicions que han de complir els grups. Equival al WHERE per dels grups.

11

Consultes amb ms duna taula


Podem tenir la necessitat de fer consultes en les que intervenen dades presents en diferents taules. 1) Combinaci. Dna com a resultat una taula a partir de dues taules especificades en la clasula FROM. SELECT columnes FROM taula1 JOIN taula2 ON condicions_combinaci [WHERE condicions]

una altra forma sintctica: SELECT columnes FROM taula1, taula2 WHERE condicions_combinaci [AND condicions] 2) Combinaci Natural. La combinaci natural es fa servir quan les dues taules a combinar tenen noms datributs comuns (s a dir, clau forana i clau primria tenen els maitexos noms) i volem utilitzar loperador digualtat en la condici de combinaci. SQL sencarrega digualar els atributs digual nom en ambdes taules, per la qual cosa no porta la clusula ON. No porta clusula ON ni SELECT columnes condicions de combinaci, ja FROM taula1 NATURAL JOIN taula2 que aquestes seran la igualtat [WHERE condicions] dels atributs de mateix nom en ambdes taules. Una altre format per la combinaci natural fa servir la clusula USING. SELECT columnes FROM taula1 JOIN taula2 USING (atributs repetit en ambdes taules) [WHERE condicions] 2) Combinacions Interna i Externa. La combinaci vista en el punt 1) correspon a la combinaci interna, s a dir combina les files duna taula amb les files de laltra taula que compleixen les condicions de combinaci, cosa que pot fer-nos perdre files interessants. La combinaci externa fa que en el resultat apareguin totes les files de la taula situada a lesquerra, a la dreta o dambdes taules. SELECT columnes FROM taula1 {LEFT/RIGHT/FULL} [OUTER] JOIN taula2 ON condicions_combinaci

12

[WHERE condicions]

3) Combinacions amb ms de dues taules. Si necessitem implicar en la consulta dades de ms de dues taules hem dencadenar operacions JOIN. SELECT columnes FROM ( (taula1 JOIN taula2 ON condicions_combinaci) JOIN taula3 ON condicions_combinaci) JOIN taula4 ON condicions_combinaci ... [WHERE condicions]

4) La Uni. Correspon a la operaci uni de la teroria de conjunts. Sha daplicar entre taules compatibles (mateix nombre datribus i dominis coincidents) SELECT columnes FROM taula1 [WHERE condicions] UNION [ALL] SELECT columnes FROM taula2 [WHERE condicions]

5) Lintersecci Correspon a la operaci intersecci de la teroria de conjunts. Sha daplicar entre taules compatibles (mateix nombre datribus i dominis coincidents). SELECT columnes FROM taula1 [WHERE condicions] INTERSECT [ALL] SELECT columnes FROM taula2 [WHERE condicions] Tanmateix hi ha alguns Sistemes Gestors de Bases de Dades que no admeten la clasula INTERSECT i sha dimplementar amb la clasula EXISTS SELECT columnes FROM taula1

13

WHERE EXISTS (SELECT * FROM taula2 WHERE condicions)

6) La Diferncia Correspon a la operaci diferncia de la teroria de conjunts. Sha daplicar entre taules compatibles (mateix nombre datribus i dominis coincidents). SELECT columnes FROM taula1 [WHERE condicions] EXCEPT SELECT columnes FROM taula2 [WHERE condicions] Tanmateix hi ha alguns Sistemes Gestors de Bases de Dades que no admeten la clasula EXCEPT i sha dimplementar amb la clasula NOT EXISTS SELECT columnes FROM taula1 WHERE NOT EXISTS (SELECT * FROM taula2 WHERE condicions)

Exercicis proposats: Base de dades dexemple: Departaments (nom-dpt, ciutat-dpt, telfon) Clients (codi-cli, nom-cli, nif, adrea, ciutat, telfon) Projectes (codi-proj, nom-proj, preu, data-inici, data-prev-fi, data-fi, codi-client) on {codi-client} referencia a CLIENTS Empleats (codi-empl, nom-empl, cognom-empl, sou, nom-dpt, ciutat-dpt, num-proj) on {nom-dpt, ciutat-dpt} referencia a DEPARTAMENTS i {num-proj} referencia a PROJECTES
departaments nom_dpt clients codi_cli

empleats

projectes
14

ciutat_dpt nom_proj codi_proj

codi_client

Activitat 1. Exercicis proposats: 1. Obtingueu els codis i els noms i cognoms dels empleats ordenats alfabticament de manera descendent per cognom i, en cas de repeticions, per nom. 2. Consulteu el codi i el nom dels projectes dels clients que sn de Barcelona. 3. Obtingueu els noms i les ciutats dels departaments que treballen en els projectes nmero 3 i nmero 4. 4. De tots els empleats que perceben un sou d'entre 5 i 8 milions, busqueu-ne els codis d'empleat i els noms dels projectes que tenen assignats. 5. Busqueu el nom, la ciutat i el telfon dels departaments on treballen els empleats del projecte GESCOM. 6. Obtingueu els codis i els noms i cognoms dels empleats que treballen en els projectes de preu ms alt. 7. Esbrineu quin s el sou ms alt de cada departament. Concretament, cal donar el nom i la ciutat del departament i el sou ms gran. 8. Obtingueu els codis i els noms dels clients que tenen ms d'un projecte contractat. 9. Esbrineu els codis i els noms dels projectes en qu tots els empleats que hi estan assignats tenen un sou superior a 3 milions de pessetes. 10. Busqueu els noms i les ciutats dels departaments que no tenen cap empleat assignat.

15

Activitat 2. Exercicis proposats: 1) Volem saber el nom i el NIF del(s) client(s) que hagi demanat un projecte que est assignat algun empleat que tingui un sou ms gran que 8 milions. 2) Creeu una vista on es pugui veure el codi i nom dels clients amb el nom del projecte que han demanat 3) Digueu quins son els empleats (digueu el nom i cognom) que guanyen ms que la mitjana. 4) Esbrineu quin s el sou promig de cada departament.

5) Digueu el nom del(s) projecte(s) que el sou promig dels empleats que hi treballen sigui superior a 6 milions. 6) 7) 8) 9) 10) Digueu quin s el nom del client que ha pagat ms per un projecte Creeu un ndex per la taula empleats sobre cognom_empl i nom_empl Digueu el nom dels clients que no tenen cap projecte contractat. Digueu quin s el departament que t un promig de sous ms elevat. Digueu quins empleats (nom i cognom) no treballen en cap projecte.

Bases de Dades 16

Sentencies de Control
Shan destablir mecanismes de control per resoldre problemes de concurrncia dusuaris i per garantir la seguretat de la base de dades. Les transaccions Serveixen per evitar problemes de concurrncia dusuaris. Existeix una sentncia per iniciar una transacci: SET TRANSACTION {READ ONLY / READ WRITE} Amb READ ONLY podem fer consultes per no podem actualitzar la BD. Utilitzem READ WRITE per tal dactualitzar la BD La transacci ha dacabar amb una daquestes sentncies: {COMMIT / ROLLBACK} COMMIT executa tota la transacci. ROLLBACK desf els canvis i deisxa la BD com estava abans de comenar la transacci. SET TRANSACTION READ WRITE UPDATE empleats SET sou = sou + 100000 WHERE num-proj = 3 COMMIT Les autoritzacions i desautoritzacions Serveixen per garantir la seguretat de la BD. El propietari t tots el privilegis, per SQL ofereix sentncies per a autoritzar i desautoritzar a altres usuaris 1) Autoritzacions GRANT privilegis ON objecte TO usiaris [WITH GRANT OPTION] a) privilegis: ALL PRIVILEGES tots els privilegis sobre lobjecte especificat USAGE s de lobjecte especificat SELECT consultes INSERT [(columnes)] insercions. Es pot concretar quines columnes UPDATE [(columnes)] modificacions. Es pot concretar quines columnes DELETE esborrats REFERENCES [(columnes)] referncia de lobjecte en restriccions dintegritat. Es pot concretar quines columnes b) objectes: DOMAIN domini [TABLE] nom_taula
Bases de Dades 17

nom_vista c) usuaris: PUBLIC tothom llista didentificdadors dusuaris d) Lopci WITH GRANT OPTION permet que lusuari al qual autoritzem pugui autoritzar a daltres usuaris, amb els mateix privilegis amb el quals ha estat autoritzat. 2) Desautoritzacions REVOKE [GRANT OPTION FOR] privilegis ON objecte FROM usuaris {RESTRICT / CASCADE} a) Privilegis, objecte i usuaris son els mateixos que per la sentncia GRANT. b) Lopci GRANT OPTION FOR es fa servir en el cas que volgussim desautoritzar el dret a autoritzar. c) Lopci CASCADE fa que, si un usuari al qual hem autoritzat, ell a la seva vegada, ha autoritzar a daltres queden tots desautoritzats de cop. d) Lopci RESTRICT no ens permet desautoritzar a un usuari si aquest ha autoritzat a daltres.

Bases de Dades 18

You might also like