Versión de este documento: 1.0
Última versión disponible en: www.nachocabanes.com
Parece razonable suponer que quien quiere aprender SQL es porque ya tiene unos conocimientos elementales de bases de datos, y que entiende conceptos como tabla, campo, registro, etc. Aun así, las ideas básicas, prescindiendo de todo tipo de formalismos (incluso demasiado) son:
La forma habitual de representar una tabla es esta:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
En esta representación:
Daré sólo unas nociones básicas de SQL, dejando
de lado muchos aspectos más avanzados como la creación de
bases de datos y de tablas, las consultas agrupadas y los sub-queries.
SELECT campo1, campo2, ... campoN FROM tabla
Un primer ejemplo que mostrase ciertos campos de una tabla de clientes
podría ser:
SELECT nombre, apellidos, domicilio, localidad, provincia FROM clientes
Tanto las órdenes como los nombre de los campos y/o las tablas
se pueden escribir en mayúsculas o minúsculas, pero en este
manual se empleará mayúsculas para las órdenes de
SQL y minúsculas para los nombres de campos y/o tablas, a fin de
que se pueden distinguir con mayor facilidad.
Para mostrar todos los campos de una tabla, no hace falta enumerarlos
uno a uno, sino que se puede emplear el asterisco (*):
SELECT * FROM clientes
SELECT campo1, campo2, ... campoN FROM tabla WHERE condición
Un ejemplo que mostrase datos de clientes de Madrid podría
ser:
SELECT nombre, apellidos, domicilio, localidad, provincia FROM clientes WHERE localidad="Madrid"
Los operadores de comparación son los habituales en informática:
=, <, >, <= (menor o igual), >= (mayor o igual), <> (distinto
de, que se indica con un símbolo de "menor que" y otro de "mayor que").
Se pueden encadenar varias condiciones con AND (y), OR (ó), NOT
(no):
SELECT nombre, apellidos, FROM clientes WHERE localidad="Madrid" AND totalCompras > 500000
Para saber si un campo se ha dejado en blanco, no se deberá
mirar si es = 0, sino usar la condición IS NULL. Por ejemplo,
para saber de qué clientes no tenemos el teléfono haríamos:
SELECT nombre FROM clientes WHERE telefono IS NULL
Si se quieren los datos ordenados según algún campo,
se usa la cláusula ORDER BY:
SELECT nombre, apellidos, totalCompras FROM clientes ORDER BY totalCompras
En caso de que se quieran ordenar de mayor a menor, se añade
DESC después de ORDER BY:
SELECT nombre, apellidos, totalCompras FROM clientes ORDER BY totalCompras DESC
SELECT campo1, campo2, ... campoN FROM tabla1, tabla2, ... tablaN
Si coinciden nombres de campo en varias tablas, se escribe el nombre
de la tabla y un punto antes del nombre de la tabla, para evitar la ambigüedad:
SELECT cliente.nombre, vendedores.nombre FROM clientes, agentes
Es muy frecuente que se tomen datos de varias tablas relacionadas,
y esto en muchas bases puede obligarnos a indicar también una condición
que refleje esa relación:
SELECT cliente.nombre, vendedores.nombre FROM clientes, agentes WHERE agentes.codigo = clientes.codigoVendedor
O en un caso que emplee 3 tablas
SELECT artículos.titulo, revistas.título, nombre FROM artículos, revistas, autores WHERE artículos.codigoRev = revistas.codigo AND artículos.codigoAutor = autores.codigo
(en la última consulta no se ha indicado la tabla de la que
procede el campo "nombre" suponiendo que no hay ningún otro campo llamado
"nombre" en ninguna de las otras dos tablas).
SELECT SUM(totalCompras) FROM clientes
Se puede realizar más de una operación en la misma
consulta:
SELECT MAX(importe), SUM(importe), AVERAGE(importe) FROM clientes
No tiene sentido combinar datos resumidos como éstos y datos
detallados en una misma consulta: la siguiente consulta no sería
válida en muchos sistemas de bases de datos, y en otros mostraría
el nombre de cada cliente seguido del total de compras de todos ellos,
que se repetiría en cada ficha:
SELECT NOMBRE, SUM (totalCompras) FROM clientes
SELECT nombre, apellidos FROM clientes WHERE apellidos LIKE "Fer%"
La consulta anterior mostraría los cliente cuyo apellido
comience por "Fer". Si queremos buscar aquellos en cuya dirección
aparece la palabra "Madrid", usaríamos:
SELECT nombre, apellidos FROM clientes WHERE localidad LIKE "%Madrid%"
En algunos sistemas de gestión de bases de datos, puede emplearse
el asterisco (*) en vez del símbolo de tanto por ciento (%).
UPDATE tabla SET campo=valor
Por ejemplo, para que el campo "Iva" de todos los clientes tenga
el valor 16% podría ser:
UPDATE clientes SET iva=0.16
Si queremos que se modifiquen sólo los que cumplen cierta
condición, emplearemos WHERE. Por ejemplo, para que aquellos
clientes cuya localidad sea "Alicante" pasen a tener como localidad "Alicante
(España)" haríamos:
UPDATE clientes SET localidad="Alicante (España)" WHERE localidad="Alicante"
SELECT * FROM clientes
Nombre y domicilio de todos los clientes:
SELECT nombre, domicilio FROM clientes
Nombre y domicilio de los clientes de Alicante:
SELECT nombre, domicilio FROM clientes WHERE localidad = "Alicante"
Nombre y domicilio de los clientes que no sean de Alicante y que
hayan comprado productos por un importe total superior o igual a 500.000
pesetas:
SELECT nombre, domicilio FROM clientes WHERE localidad <> "Alicante" AND totalCompras >= 500000
Nombre y domicilio de los clientes que se apellidan López
(suponiendo que el apellido se haya guardado también dentro del
campo nombre):
SELECT nombre, domicilio FROM clientes WHERE nombre LIKE "%López%"
Nombre de los clientes de Madrid, ordenados de mayor a menor volumen
de compras:
SELECT nombre FROM clientes WHERE localidad = "Madrid" ORDER BY totalCompras DESC
Nombre del cliente de Madrid que mayor volumen de compras ha realizado:
SELECT nombre FROM clientes WHERE localidad = "Madrid" AND totalCompras = MAX(totalcompras)
Mayor importe de compras, menor y promedio de todos ellos:
SELECT MAX(totalcompras), MIN(totalcompras), AVERAGE(totalcompras) FROM clientes
Clientes para los que no se ha anotado el vendedor:
SELECT nombre FROM clientes WHERE codVendedor IS NULL
Escribir "(No indicado)" como número de Fax de aquellos clientes
cuyo Fax no se haya tecleado:
UPDATE clientes SET fax="(No indicado)" WHERE fax IS NULL
Multiplicar por 0.8 el valor actual de todos los productos
UPDATE productos SET valorActual = valorActual * 0.8