Professional Documents
Culture Documents
Consultes bàsiques
Contingut
Introducció .................................................................................................................................... 2
Orígens i evolució del llenguatge SQL ....................................................................................... 2
Tipus de sentències SQL ............................................................................................................ 3
SQL allotjat ................................................................................................................................ 4
Tipus de dades............................................................................................................................... 4
Tipus de dades string................................................................................................................. 5
El tipus CHAR [(longitud)] ...................................................................................................... 5
El tipus VARCHAR (longitud).................................................................................................. 6
Tipus de dades numèriques ...................................................................................................... 6
Els tipus de dades INTEGER ................................................................................................... 6
Tipus FLOAT, REAL i DOUBLE ................................................................................................. 6
Tipus de dades DECIMAL i NUMERIC .................................................................................... 7
Tipus de dades per a moments temporals (dates).................................................................... 7
El tipus de dada DATE............................................................................................................ 7
El tipus de dada DATETIME ................................................................................................... 8
Consultes simples .......................................................................................................................... 8
Sentència SELECT (Consulta) ..................................................................................................... 9
Clàusules SELECT i FROM ........................................................................................................ 10
Clàusula ORDER BY .................................................................................................................. 11
Clàusula WHERE ...................................................................................................................... 12
BETWEEN valor1 AND valor2 .............................................................................................. 13
IN ......................................................................................................................................... 13
LIKE ...................................................................................................................................... 14
IS NULL................................................................................................................................. 14
Operadors lògics...................................................................................................................... 15
Funcions d'Agregat (valors resum).............................................................................................. 16
Maneig dels valors nuls ........................................................................................................... 19
Ús de DISTINCT en les funcions de totals ................................................................................ 19
SQL. Consultes bàsiques
Introducció
En aquesta unitat, "Llenguatge SQL. Consultes bàsiques ", farem els primers passos en el
coneixement del llenguatge SQL de consultes.
El DQL (Data Query Language) ho formen les instruccions capaces de consultar les dades de les
taules.
La introduirem en els tipus de dades que pot gestionar i en el disseny de consultes senzilles en
la base de dades. Després passarem a ampliar el nostre coneixement sobre el llenguatge SQL
per a aprofitar la potència que dona en l'àmbit de la consulta d'informació. Així, per exemple,
aprendrem a ordenar la informació, a agrupar-la efectuant filtrats per a reduir el nombre de
resultats, combinar resultats de diferents consultes És a dir, que aquest llenguatge és una
meravella que possibilita efectuar qualsevol tipus de consulta sobre una base de dades per a
obtindre la informació desitjada.
Per a adquirir un bon coneixement del llenguatge SQL, és necessari que aneu reproduint en el
vostre ordinador tots els exemples incorporats en el text, i també la realització de les activitats
i els exercicis.
La millor manera d'iniciar l'estudi del llenguatge SQL és executar consultes senzilles en la base
de dades. Abans, no obstant això, ens convé conéixer els orígens i evolució que ha tingut aquest
llenguatge, els diferents tipus de sentències SQL existents (subdivisió del llenguatge SQL), així
com els diferents tipus de dades (Números, dates, cadenes ...) que ens podem trobar
emmagatzemades en les bases de dades, encara que ja ho vam veure en el tema anterior. I,
llavors, ja ens podrem iniciar en l'execució de consultes simples.
Una vegada comprovada l'eficiència del model relacional i del llenguatge SQL, es va iniciar una
dura carrera entre diferents marques comercials. Així, tenim:
SQL. Consultes bàsiques
• IBM comercialitza diversos productes relacionals amb el llenguatge SQL: System / 38 en 1979,
SQL / DS en 1981, i DB2 en 1983.
• Relational Programari, Inc. (Actualment, Oracle Corporation) crea la seua pròpia versió de
SGBD relacional per a la Marina dels EUA, la CIA i altres. En l'estiu de 1979 llança Oracle V2
(versió 2) per a les computadores VAX (Les grans competidores de l'època amb les
computadores d'IBM).
El llenguatge SQL va evolucionar (cada marca comercial seguia el seu propi criteri) fins que els
principals organismes d'estandardització van intervindre per a obligar als diferents SGBD
relacionals implementar una versió comuna del llenguatge i, així, en 1986 l'ANSI (American
National Standards Institute) publica l'estàndard SQL-86, que en 1987 és ratificat per l'ISO
(Organització Internacional per a la Normalització, o International Organization for
Standardization en anglés).
1986 revisió SQL-86 (SQL-87 / SQL1) Publicat per l’ANSI en 1986, i ratificat per ISO en 1987.
2006 SQL:2006
1. Sentències destinades a la definició de les dades (LDD), que permeten definir els objectes
(taules, camps, valors possibles, regles d'integritat referencial, restriccions ...).
2. Sentències destinades al control sobre les dades (LCD), que permeten concedir i retirar
permisos sobre els diferents objectes de la base de dades.
3. Sentències destinades a la consulta de les dades (DQL), que permeten accedir a les dades en
manera consulta.
SQL. Consultes bàsiques
4. Sentències destinades a la manipulació de les dades (LMD), que permeten actualitzar la base
de dades (altes, baixes i modificacions).
En alguns SGBD no hi ha distinció entre LC i LMD, i únicament es parla de LMD per a les consultes
i actualitzacions. De la mateixa manera, a vegades s'inclouen les sentències de control (LCD)
juntament amb les de definició de dades (LDD).
No té gens d'importància que s'incloguen en un grup o que siguen un grup propi: és una simple
classificació.
SQL allotjat
Les sentències SQL poden presentar, no obstant això, una segona sintaxi, sintaxi allotjada,
consistent en un conjunt de sentències que són admeses dins d'un llenguatge de programació
anomenat llenguatge amfitrió.
Així, podem trobar LC i LMD que poden allotjar-se en llenguatges de tercera generació com a C,
Cobol, Fortran ..., i en llenguatges de quarta generació. Els SGBD solen incloure un llenguatge de
tercera generació que permet allotjar sentències SQL en xicotetes unitats de programació
(funcions o procediments). Així, el SGBD Oracle incorpora el llenguatge PL / SQL, el SGBD
SQLServer incorpora el llenguatge Transact-SQL, el SGBD MySQL 5.x segueix la sintaxi SQL 2003
per a la definició de rutines de la mateixa manera que el SGBD DB2 d'IBM.
Tipus de dades
L'evolució anàrquica que ha seguit el llenguatge SQL ha fet que cada SGBD haja pres les seues
decisions quant als tipus de dades permeses. Certament, els diferents estàndards SQL que han
anat apareixent han marcat una certa línia i els SGBD s'acosten, però tampoc poden deixar de
fer costat als tipus de dades que han proporcionat al llarg de la seua existència, ja que hi ha
moltes bases de dades repartides pel món que les utilitzen.
De tot això hem de deduir que, a fi de treballar amb un SGBD, hem de conéixer els principals
tipus de dades que facilita (numèriques, alfanumèriques, moments temporals ...) i hem de fer-
ho centrant-nos en un SGBD concret (la nostra elecció ha sigut MySQL) tenint en compte que la
resta de SGBD també incorpora tipus de dades similars i, en cas d'haver de treballar, sempre
haurem de donar una ullada a la documentació que cada SGBD facilita.
Cada valor manipulat per un SGBD determinat correspon a una mena de dada que associa un
conjunt de propietats al valor. Les propietats associades a cada tipus de dada fan que un SGBD
concret tracte de manera diferent els valors de diferents tipus de dades.
SQL. Consultes bàsiques
En el moment de creació d'una taula, cal especificar un tipus de dada per a cadascuna de les
columnes. En la creació d'una acció o funció emmagatzemada en la base de dades, cal especificar
un tipus de dada per a cada argument. L'assignació correcta de la mena de dada és fonamental
perquè els tipus de dades defineixen el domini de valors que cada columna o argument pot
contindre. Així, per exemple, les columnes de tipus DONA'T no podran acceptar el valor '30 de
febrer 'ni el valor 2 ni la cadena Hola.
MySQL és el SGBD amb el qual es treballa en aquests materials i el llenguatge SQL de MySQL el
descrit.
Podeu trobar més informació referent a això en el manual de referència Capítol 11. Tipus de
columna.
Aquest tipus especifica una cadena de longitud fixa (indicada per longitud) i, per tant, MySQL
assegura que tots els valors emmagatzemats en la columna tenen la longitud especificada. Si
s'insereix una cadena de longitud més curta, MySQL la farcida amb espais en blanc fins a la
longitud indicada. Si s'intenta inserir una cadena de longitud més llarga, es trunca.
La longitud mínima i per defecte (no és obligatòria) per a una columna de tipus CHAR és d'1
caràcter, i la longitud màxima permesa és de 255 caràcters.
SQL. Consultes bàsiques
Per a indicar la longitud, és necessari especificar-la amb un número entre parèntesi, que indica
el nombre de caràcters, que tindrà l'string . Per exemple: CHAR (10).
Aquest tipus especifica una cadena de longitud variable que pot ser, com a màxim, la indicada
per longitud, valor que és obligatori introduir.
Els valors de tipus VARCHAR emmagatzemen el valor exacte que indica l'usuari sense afegir
espais en blanc. Si s'intenta inserir una cadena de longitud més llarga, VARCHAR retorna un
error.
La longitud màxima d'aquesta mena de dades és de 65.535 caràcters. La longitud es pot indicar
amb un número, que indica el nombre de caràcters màxim que contindrà l'string . Per exemple:
VARCHAR (10).
Podríem fer una classificació dels tipus numèrics entre ENTERS i REALS. Hi ha diferents tipus en
funció dels valors admesos (pots consultar el manual). Per a simplificar, nosaltres utilitzarem els
següents:
Els tipus de dades senceres admeten l'especificació del nombre de dígits que cal mostrar d'un
valor concret, utilitzant la sintaxi: INT (N), sent N el nombre de dígits visibles.
Així, doncs, si s'especifica una columna de tipus INT (4), en el moment de seleccionar un valor
concret, es mostraran només 4 dígits. Cal tindre en compte que aquesta especificació no
condiciona el valor emmagatzemat, tan sols fixa el valor que cal mostrar.
FLOAT, REAL i DOUBLE són els tipus de dades numèriques que emmagatzemen valors numèrics
reals (és a dir, que admeten decimals).
Els tipus FLOAT, REAL o DOUBLE PRECISION admeten que especifiquen els dígits de la part
sencera (E) i els dígits de la part decimal (D, que poden ser 30 com a màxim, i mai més grans que
E-2). La sintaxi per a aquesta especificació seria:
• FLOAT (E, D)
• REAL (D, A)
DECIMAL i NUMERIC són els tipus de dades reals de punt fix que admet MySQL.
Els valors en punt fix no s'emmagatzemaran mai de manera arredonida, és a dir, que si cal
emmagatzemar un valor en un espai que no és adequat, emetrà un error.
Aquest tipus de dades permeten assegurar que el valor és exactament el que s'ha introduït. No
s'ha arredonit. Per tant, es tracta d'una mena de dades molt adequat per a representar valors
monetaris, per exemple.
Tots dos tipus de dades permeten especificar el total de dígits (T) i la quantitat de dígits decimals
(D), amb la següent sintaxi:
DECIMAL (T, D)
NUMERIC (T, D)
DATE permet emmagatzemar dates. El format d'una data en MySQL és 'AAAAMM-DD ', en el
qual AAAA indica l'any expressat en quatre dígits, MM indica el mes expressat en dos dígits i DD
indica el dia expressat en dos dígits.
La data mínima suportada pel sistema és '1000-01-01'. I la data màxima admissible en MySQL és
'9999-12-31'.
SQL. Consultes bàsiques
Consultes simples
Una vegada ja coneixem els diferents tipus de dades que ens podem trobar emmagatzemats en
una base de dades (nosaltres ens hem centrat en MySQL, però en la reste de SGBD és similar),
estem en condicions d'iniciar l'explotació de la base de dades, és a dir, de començar la gestió de
les dades. Evidentment, per a poder gestionar dades, prèviament s'ha d'haver definit les taules
que han de contindre les dades, i per a poder consultar dades hi ha haver-los introduït abans.
L'aprenentatge del llenguatge SQL s'efectua, no obstant això, en sentit invers; és a dir,
començarem coneixent les possibilitats de consulta de dades sobre taules ja creades i amb dades
ja introduïdes. Necessitem, no obstant això, conéixer l'estructura de les taules que s'han de
gestionar i les relacions existents entre elles.
Per exemple, la figura 1.1 mostra el disseny de l'esquema Empresa, implementat amb la utilitat
modeling del programari MySQL Workbench, que utilitza una notació molt intuïtiva:
SQL. Consultes bàsiques
• Els atributs que no admeten valors nuls van precedits de un símbol que està totalment acolorit.
• Els atributs que admeten valor nul van precedits de un símbol que està marcat a soles el seu
contorn.
• Els atributs que formen part de una Clau Aliena porten el símbol en roig.
• Les interrelacions 1: N indiquen amb una línia que acaba amb tres branques al costat de
l'entitat interrelacionada en el costat N.
• L'opcionalidad s'indica amb un cercle al costat de l'entitat opcional i l'obligatorietat amb una
xicoteta línia perpendicular a la interrelació.
• Si situeu el ratolí sobre una de les línies, marcarà la Clau Primària d'una de les taules i la seua
corresponent Clau Aliena en l'altra.
La sentència SELECT consta de diferents apartats que se solen denominar clàusules. Dos
d'aquests apartats són sempre obligatoris (SELECT i FROM) i són els primers que presentarem.
La resta de clàusules han d'utilitzar-se segons els resultats que es vulguen obtindre.
SQL. Consultes bàsiques
[ ] (claudàtors). Els claudàtors serveixen per a tancar text que no és obligatori en la instrucció.
És a dir, per a indicar una part opcional de la instrucció.
| (barra vertical). Aquest símbol (|), la barra vertical, indica opció disyuntiva. Quan hi ha
diferents paraules o seccions en la instrucció separades per la barra, s'està indicant que només
podrem triar una de les opcions (són opcions, per tant, excloents).
... (punts suspensius) Indica que la secció anterior als punts suspensius, es pot repetir una vegada
i una altra.
{} (claus) Les claus serveixen per a indicar seccions obligatòries. Normalment s'usa amb la barra
vertical per a indicar que només es pot triar una opció, però és obligatori triar una.
La clàusula FROM permet especificar les taules (també podrien ser vistes: view) en les quals cal
anar a buscar les columnes o sobre les que es calcularan els valors resultants de les expressions.
Una sentència SQL es pot escriure en una única línia, però per a fer la sentència més llegible
solen utilitzar diferents línies per a les diferents clàusules.
La sintaxi més simple de la sentència SELECT utilitza aquestes dues clàusules de manera
obligatòria:
FROM nom_taula
On:
DISTINCT fa que no es mostren projeccions duplicades afecta a tot el que hi ha darrere. Només
es pot usar una vegada immediatament després de SELECT
Expressió: una expressió vàlida en SQL és un: literal o un valor derivat d'aplicar operadors o
funcions en els quals poden participar diferents columnes o valors literals.
I també funcions. Aquestes es divideixen en blocs segons siguen els seus paràmetres o el valor
que retornen. Així tenim:
SELECT *
FROM PRODUCTE
FROM EMP
Projecta 3 columnes: la primera és el resultat d'aplicar una funció (UPPER), la segona és un camp
pur i la tercera el resultat d'un càlcul. La 3a columna porta un àlies per a la capçalera ‘SALARI
MESUAL’ (si l'àlies té espais en blanc és necessari posar-ho entre cometes simples).
El llenguatge SQL permet donar un nom alternatiu (àlies) a cada columna. Cal tindre en compte
el següent:
Si l'àlies està format per diverses cadenes (hi ha espais en blanc), és necessari posar-ho entre
cometes.
Clàusula ORDER BY
La clàusula order by que permet ordenar el resultat de la consulta.
Poden especificar-se diversos criteris. L'ordre dels criteris determinarà l'ordenació: s'aplica el
primer criteri i dins del primer el segon….
Per exemple:
FROM EMP
Els criteris d'ordenació no tenen per què estar definits sobre les projeccions del SELECT; poden
estar definits sobre qualsevol columna. No obstant això, si estan definits sobre columnes
projectades en el SELECT, podem fer referència a les mateixes pel número d'ordre en què es
projecten.
FROM EMP
order by 2 DESC, 1
Clàusula WHERE
La clàusula WHERE s'afig darrere de la clàusula FROM amb el que ampliem la sintaxi de la
sentència SELECT:
from taula
[where <condició>];
La clàusula WHERE permet establir els criteris de selecció sobre les files generades per la clàusula
FROM.
Una condició és una expressió que s'avalua a vertader o fals per a cadascuna de les files. Per a
generar condicions podem utilitzar, entre altres, els següents operadors de comparació:
SQL. Consultes bàsiques
L'operador BETWEEN ens permet obtindre dades que es troben entre dos valors determinats
(incloent els dos extrems).
Es pot usar per a qualsevol tipus de dades encara que per a cadenes no té molt de sentit. La
utilitzarem només per a expressions numèriques i dates.
L'ordre dels valors és important: s'ha de posar primer el menor AND el major.
Exemple:
FROM EMP
L'operador NOT BETWEEN ens permet obtindre els valors que són menors estrictes que el més
xicotet i majors estrictes que el més gran. Exemple:
FROM EMP
IN
L'operador IN ens permet obtindre files que tinguen en la columna algú del valors de la llista:
Exemple:
SQL. Consultes bàsiques
SELECT COGNOM
FROM EMP
LIKE
L'operador LIKE s'usa sobretot amb textos i dates permet obtindre registres el valor dels quals
en un camp complisca una condició textual. LIKE utilitza una cadena que pot contindre aquests
símbols formant un patró:
SELECT COGNOM
FROM EMP
-- Selecció dels empleats que el seu COGNOM conté la lletra ‘R’ i acaba en ‘O
SELECT COGNOM
FROM EMP
IS NULL
La clàusula IS NULL retorna “vertader” si una expressió conté el valor nul, i “Fals” en cas contrari.
La clàusula IS NOT NULL retorna “vertader” si una expressió NO conté un nul, i “Fals” en cas
contrari.
Exemples:
SELECT *
FROM EMP
SELECT *
FROM EMP
Operadors lògics
Podem realitzar condicions complexes a partir de condicions simples enllaçant-les amb
operadors lògics.
FROM EMP
FROM EMP
MOLT IMPORTANT:
AND té precedència sobre OR. La precedència es pot modificar amb parèntesi. És àlgebra
booleana (de Boole). Així, per la propietat distributiva, les expressions següents són equivalents:
AND OR
C1 C2 C1 AND C2 C1 C2 C1 OR C2
F F F F F F
F V F F V V
V F F V F V
V V V V V V
Les funcions de càlcul amb grups són les encarregades de realitzar càlculs en vertical (usant
dades de diferents files) en lloc d'en horitzontal (usant dades procedents de la mateixa fila en la
qual veiem el resultat).
Quan fem una consulta de valors resumeixen el resultat és una ÚNICA FILA I NOMÉS PODEM
PROJECTAR FUNCIONS D'AGREGAT.
Són valors resultat d'un conjunt de files (les que passen el filtre del WHERE). No podem en
aqueixa mateixa consulta projectar valors individuals de files (encara que l'execució no d'error).
SQL. Consultes bàsiques
Si ho penseu, és lògic. Per exemple: en una mateixa pregunta (consulta) jo no puc preguntar
quants sou en classe i quin és el cognom. Si estic consultant valors d'un conjunt, no té sentit
consultar valors individuals.
Les funcions de càlculs de totals per a dades agrupades són les següents:
Funció Significat
Compta els elements (files) d'un grup que tenen valor (no tenen valor
NULL) en la expressió.
Si lo que volem es contar les files de un grup: Se sol indicar un asterisc
(COUNT(*))en lloc d'una expressió; el compte seria el mateix que si
fiquem una expressió que tinga valor per a totes les files del grup
COUNT(expressió)
Cal tindre en compte que aquesta funció ignora els valors nuls a l'hora
de comptar, per la qual cosa l'expressió COUNT(telefon) retorna la
quantitat de files que tenen valor en el camp telefon. No compta una
fila si té NULL en el camp o expressió corresponent.
Expressió pot ser de QUALSEVOL TIPUS
Suma els valors de l'expressió (sol valors numèrics)
SUM(expressió)
Expressió només pot ser de TIPUS NUMÈRIC
Calcula la mitjana aritmètica sobre l'expressió indicada (sol valors
AVG(expressió) numèrics)
Expressió només pot ser de TIPUS NUMÈRIC
Mínim valor que pren l'expressió indicada
MIN(expressió)
Expressió pot ser de QUALSEVOL TIPUS
Màxim valor que pren l'expressió indicada
MAX(expressió)
Expressió pot ser de QUALSEVOL TIPUS
Calcula la desviació estàndard (sol valors numèrics)
STDDEV(expressió)
Expressió només pot ser de TIPUS NUMÈRIC
Calcula la variància (sol valors numèrics)
VARIANCE(expressió)
Expressió només pot ser de TIPUS NUMÈRIC
Totes elles requereixen treballar amb grups (més endavant s'explica com agrupar files).
Si no s'indiquen grups, les funcions treballen sobre totes les files seleccionades (l'origen de les
quals són les taules del FROM i que compleixen les condicions del WHERE).
SQL. Consultes bàsiques
Una consulta és com una pregunta i ha de tindre sentit. Per exemple: no tindria sentit preguntar
quants alumnes hi ha en l'institut i el seu cognom; o bé preguntem per valors individuals dels
alumnes (de cadascú dels alumnes) o preguntem per valors resum de tot el grup d'alumnes.
Quan fem una consulta amb funcions d'agregat obtenim una sola fila per cada grup i només
és possible projectar funcions d'agregat o valors comuns a tot el grup (criteris d'agrupació).
Retornaria 10 i 10, ja que hi ha 10 treballadors en la taula i totes les files tenen valor en el atribut
salari.
Retornaria 7 ja que hi ha sols 7 files en la taula treballadors que tenen valor en el atribut telefon
Les consultes anteriors només tenen una columna però podem projectar les columnes que
desitgem. Per exemple:
La funció COUNT, se sol usar amb asterisc (*) com a objecte de càlcul, la qual cosa fa que
compte files independentment del seu contingut. Si usem una expressió, com
COUNT(telefon), no comptaria les files que tinguen un telefon nul en elles.
Les funcions anteriors admeten que anteposem el terme DISTINCT abans de l'expressió.
D'aqueix forma, només es tenen en compte els valors diferents. Per exemple: