SQL. (Structure Query Language)
SQL. (Structure Query Language)
Desde esta opción vamos a tratar los temas relacionados con SQL ANSI 92, que es el standar SQL , ya que luego
extinten variantes como T-SQL (Transact-SQL) y PL/SQL (Procedure Language / SQL) que serán tratados en sus
propias opciones.
SQL propociona metodos para definir la base datos, para manipular la información y para gestionar los permisos de
acceso a dicha información.
Para que un gestor de bases de datos sea consisderado como relacional, debe soportar SQL, independientemente
de las caracteristicas particulares que dicho gestor pueda aportar.
Introducción a SQL
SQL es el lenguaje de consulta universal para bases de datos.
Los mandatos de SQL se dividen en tres grandes grupos diferenciados, los cuales serán tratados por separado y
que unicamente se presentan aqui a modo introductorio.
• DDL(Data Definition Language), es el encargado de la definición de Bases de Datos, tablas, vistas e índices
entre otros.
Son comandos propios de este lenguaje:
CREATE TABLE
CREATE INDEX
CREATE VIEW
CREATE SYNONYM
• DCL (Data Control Laguage), encargado de la seguridad de la base de datos, en todo lo referente al control de
accesos y privilegios entre los usuarios.
Son comandos propios de este lenguaje:
GRANT
REVOKE
SQL admite una variada gama de tipos de datos para el tratamiento de la información contenida en las tablas, los
tipos de datos pueden ser númericos (con o sin decimales), alfanuméricos, de fecha o booleanos(si o no).Según el
gestor de base de datos que estemos utilizando los tipos de datos varian, pero se reducen basicamente a los
expuestos anteriormente, aunque en la actualidad casi todos los gestores de bases de datos soportan un nuevo tipo,
el BLOB (Binary Large Object), que es un tipo de datos especial destinado a almacenar archivos, imágenes ...
Dependiendo de cada gestor de bases de datos el nombre que se da a cada uno de estos tipos puede variar.
Básicamente tenemos los siguientes tipos de datos.
arriba
Operadores
Los operadores se pueden definir como combinaciones de caracteres que se utilizan tanto para realizar
asignaciones como comparaciones entre datos.
Operadores SQL
Aritméticos + Suma
- Resta
* Producto
/ División
** ^ Exponenciación
Relacionales < Menor que
Menor o igual que
Page 3 of 27
<=
> Mayor que
>= Mayor o igual que
<> != Distinto
!< No menor que
!> No mayor que
Lógicos AND Los operadores lógicos permiten comparar expresiones lógicas
OR devolviendo siempre un valor verdadero o falso.Los operadores lógicos
NOT se evaluan de izquierda a derecha.
Concatenación + Se emplea para unir datos de tipo alfanúmerico.
arriba
Palabras Clave
Las palabras clave son identificadores con un significado especial para SQL, por lo que no pueden ser utilizadas
para otro proposito distinto al que han sido pensadas.
SQL dispone de muy pocas órdenes, pero de multiples pálabras clave, lo que le convierten en un lenguaje sencillo
pero tremendamente potente para llevar a cabo su función.
Palabras Clave
ALL AND ANY ASC
AVG BEGIN BY CHAR
CHECK CLOSE COUNT COMMIT
CREATE CURSOR DECIMAL DECLARE
DELETE DESC DISTINCT DEFAULT
EXISTS FETCH FLOAT FOR
FROM GRANT GROUP HAVING
IN INDEX INSERT INTEGER
INTO LIKE MAX MIN
NOT NUMERIC ON OPEN
OR ORDER REVOKE ROLLBACK
SELECT SET SUM TABLE
UNION UNIQUE UPDATE USER
VALUES VIEW WHERE WITH
arriba
Funciones Agregadas
Las funciones agregadas proporcionan a SQL utilidades de cálculo sobre los datos de las tablas.
Estas funciones se incorporan en las consultas SELECT y retornan un único valor al operar sobre un grupo de
registros.
Funciones Agregadas
MAX() Devuelve el valor máximo.
MIN() Devuelve el valor mínimo.
SUM() Devuelve el valor de la suma de los valores del campo.
COUNT() Devuelve el número de filas que cumplen la condición
AVG() Devuelve el promedia de los valores del campo
arriba
Predicados
Page 4 of 27
Los predicados son condiciones que se indican en claúsula WHERE de una consulta SQL.
Predicados SQL
BETWEEN...AND Comprueba que al valor esta dentro de un intervalo
LIKE Compara un campo con una cadena alfanumérica. LIKE admite el uso de
caracteres comodines
ALL Señala a todos los elementos de la selección de la consulta
ANY Indica que la condición se cumplirá si la comparación es cierta para al menos
un elemento del conjunto.
EXISTS Devuelve un valor verdadero si el resultado de una subconsulta devuelve
resultados.
IN Comprueba si un campo se encuentra dentro de un determinado rango. El
rango puede ser una sentencia SELECT.
No se preocupe si no entiende el significado de alguno de los terminos que hemos presentado aquí, pronto veremos
ejemplos que nos aclararán las cosas, de momento nos vale con saber que existen.
Tablas
El lenguaje de definición de datos (DDL, Data Definition Language) es el encargado de permitir la descripcion de los
objetos que forman una base de datos.
Nomenclatura
La sintaxis empleada para la sentencias en las diferentes páginas esta basada en la notación EBNF. Vamos a ver el
significado de algunos simbolos.
Símbolo Significado
Encierran parámetros de una orden que el usuario debe sustituir al escribir dicha orden por los
<>
valores que queramos dar a los parámetros.
[] Indica que su contenido es opcional.
{} Indica que su contenido puede repetirse una o mas veces.
Separa expresiones. Indica que pueden emplearse una u otra expresión pero no más de una a la
|
vez.
Además las palabras clave aparecen en mayúscula negrita y los argumentos en minúscula cursiva.
La sintaxis de una sentencia tendrá un aspecto como este:
Creación de tablas
En el modelo relacional la información de una base de datos se almacena en tablas. Para saber más sobre las tablas
y como se almacena la información el ellas vea la introducción a bases de datos.
La creación de la base de datos debe comenzar por con la creación de una o más tablas. Para ello utilizaremos la
sentencia CREATE TABLE.
La sintaxis de la sentencia es la siguiente:
Ejemplo:
Vamos a simular una base de datos para un negocio de alquiler de coches, por lo que vamos a
empezar creando una tabla para almacenar los coches que tenemos.
Nota:Podemos posicionar el ratón encima de cada palabra para ver su significado.
En este ejemplo creamos una tabla llamada tCoches con cinco campos (matricula, marca,
modelo, color, numero_kilometros).
Notese que se han omitido las tildes y los espacios a proposito. Nunca cree campos que
contengan caracteres especificos de un idioma (tildes, eñes, ...) ni espacios.
Las claves primarias y externas (o foraneas) se pueden implementar directamente a través de la instrucción CREATE
TABLE, o bien se pueden agregar a través de sentencias ALTER TABLE.
Cada gestor de bases de datos implementa distintas opciones para la instrucción CREATE TABLE, pudiendo
especificarse gran cantidad de parámetros y pudiendo variar el nombre que damos a los tipos de datos, pero la
sintaxis standart es la que hemos mostrado aquí. Si queremos conocer más acerca de las opciones de CREATE
TABLE lo mejor es recurrir a la documentación de nuestro gestor de base de datos.
arriba
Modificación de tablas
En ocasiones puede ser necesario modificar la estructura de una tabla, comúnmente para añadir un campo o
reestricción. Para ello disponemos de la instruccción ALTER TABLE.
ALTER TABLE nos va a permitir:
En este ejemplo añadimos el campo num_plazas a la tabla tCoches que habiamos creado en
el apartado anterior.
Para añadir una clave primaria vamos a crear una tabla de cliente y le añadiremos la clave primaria ejecutando una
sentencia alter table:
Creamos la tabla clientes y le añadimos una reestricción primary key a la que damos el
nombre PK_tClientes en el campo codigo.
Solo podemos modificar una única tabla a la vez con ALTER TABLE, para modificar más de
una tabla debemos ejecutar una sentencia ALTER TABLE por tabla.
Para añadir una clave externa (o foranea) necesitamos una tercera tabla en nuestra estructura. Por un lado tenemos
la tabla tCoches y la tabla tClientes, ahora vamos a crear la tabla tAlquileres que será la encargada de "decirnos" que
clientes han alquilado un coche.
Bien, en este código creamos la tabla tAlquileres, y luego mediante una sentencia ALTER
TABLE añadimos una clave primaria llamada PK_tAlquileres en el campo codigo, una clave
externa llamada FK_Clientes referenciada al codigo de la tabla tClientes, y por último otra clave
externa llamada FK_Coches referenciada al campo matricula de la tabla tCoches.
Nota:Cuando creamos una clave externa el campo referenciado y el que sirve de referencia deben ser del mismo tipo de datos.
Si somos observadores nos daremos cuenta que los campos que sirven de referencia a las
claves foraneas son las claves primarias de sus tablas. Sólo podemos crear claves externas
que referencien claves primarias.
Al igual que ocurria con la sentencia CREATE TABLE cada gestor de bases de datos implementa sus mejoras, siendo
la mejor forma de conocerlas recurrir a la documentación del gestor de bases de datos.
En principio, para borrar columnas de una tabla debemos:
1. Crear una tabla con la nueva estructura.
2. Transferir los datos
3. Borrar la tabla original.
y digo en principio, porque como ya hemos comentado según el gestor de bases de datos con el que trabajemos
podremos realizar esta tarea a través de una sentencia ALTER TABLE.
arriba
Page 7 of 27
Eliminación de tablas.
Podemos eliminar una tabla de una base de datos mediante la instruccion DROP TABLE.
[arriba]
Para entender lo que es un índice debemos saber primero como se almacena la información internamente en las
tablas de una base de datos. Cada tabla se divide en páginas de datos, imaginemos un libro, podriamos escribirlo en
"una sola hoja enorme" al estilo pergamino egipcio, o bien en páginas a las que podemos acceder rápidamente a
traves de un índice. Está idea es la que se aplica en el mundo de las bases de datos, la información esta guardada en
una tabla (el libro) que tiene muchas hojas de datos (las páginas del libro), con un índice en el que podemos buscar la
información que nos interesa.
• Leemos todo el diccionario hasta encontrar la palabra, con lo que nos habremos leido el diccionario enterito
(¡seguro que aprenderiamos un montón!)
• Buscamos en el índice en que página está la letra z, y es en esa página donde buscamos.
Ni que decir tiene que la opción dos es la correcta, y es de este modo como se utiliza un índice en las bases de
datos, se define el ínidice a través de un campo (o campos) y es a partir de este punto desde donde de busca.
Los índices se actualizan automáticamente cuando realizamos operaciones de escritura en la base de datos.
arriba
Creación de índices
La creación de índices, como ya hemos visto, permite acelerar las consultas que se realizan en la base de datos.
CREATE INDEX;
DROP INDEX;
La pálabra clave UNIQUE especifica que que no pueden existir claves duplicadas en el índice.
ASC | DESC especifican el criterio de ordenación elegido, ascendente o descendente, por defecto
es ascendente.
Ejemplo: En el apartado dedicado a la definición de tablas creamos la tabla tClientes, este ejmplo
crea un índice único en el campo NIF. Esto nos permitirá buscar mucho mas rápido por el campo
NIF y nos asegurará que no tengamos dos NIF iguales.
En el modelo de datos relacional la forma de guardar la información no es la mejor para ver los datos
Una vista es una consulta, que refleja el contenido de una o más tablas, desde la que se puede acceder a los datos
como si fuera una tabla.
Dos son las principales razones por las que podemos crear vistas.
• Seguridad, nos pueden interesar que los usuarios tengan acceso a una parte de la información que hay en una
tabla, pero no a toda la tabla.
• Comodidad, como hemos dicho el modelo relacional no es el más comodo para visualizar los datos, lo que nos
puede llevar a tener que escribir complejas sentencias SQL, tener una vista nos simplifica esta tarea.
Las vistas no tienen una copia física de los datos, son consultas a los datos que hay en las tablas, por lo que si
actualizamos los datos de una vista, estamos actualizando realmente la tabla, y si actualizamos la tabla estos cambios
serán visibles desde la vista.
Nota: No siempre podremos actualizar los datos de una vista, dependerá de la complejidad de la misma (dependerá de si el cojunto de resultados tiene
acceso a la clave principal de la tabla o no), y del gestor de base de datos. No todos los gestores de bases de datos permiten actualizar vistas, ORACLE, por
ejemplo, no lo permite, mientrar que SQL Server si.
arriba
Creación de vistas.
Para crear una vista debemos utilizar la sentencia CREATE VIEW, debiendo proporcionar un nombre a la vista y
una sentencia SQL SELECT válida.
Ejemplo:Crear una vista sobre nuestra tabla alquileres, en la que se nos muestre el nombre y
apellidos del cliente en lugar de su código.
Si queremos, modificar la definición de nuestra vista podemos utilizar la sentencia ALTER VIEW, de
forma muy parecida a como lo haciamos con las tablas. En este caso queremos añadir los
campos fx_alquiler y fx_devolucion a la vista.
Por último podemos eliminar la vista a través de la sentencia DROP VIEW. Para eliminar la vista
que hemos creado anteriormente se uitlizaría:
Sinónimos
Un sinónimo es un nombre alternativo que identifica un tabla en la base de datos. Con un sinónimo se pretende
normalmente simplicar el nombre original de la tabla, aunque tambien se suelen utilizar para evitar tener que escribir
el nombre del propietario de la tabla.
No todas las bases de datos soportan los sinónimos.
Para crear un sinónimo hay uque utilizar la sentencia CREATE SYNONYM especificando el nombre que deseamos
utilizar como sinónimo y la tabla para la que estamos creando el sinónimo.
[arriba]
La sentencia SELECT
La sentencia SELECT nos permite consultar los datos almacenados en una tabla de la base de datos.
Veamos por partes que quiere decir cada una de las partes que conforman la sentecia.
Significado
Palabra clave que indica que la sentencia de SQL que queremos ejecutar es de
SELECT
selección.
Indica que queremos seleccionar todos los valores.Es el valor por defecto y no suele
ALL
especificarse casi nunca.
DISTINCT Indica que queremos seleccionar sólo los valores distintos.
Indica la tabla (o tablas) desde la que queremos recuperar los datos. En el caso de que
exista más de una tabla se denomina a la consulta "consulta combinada" o "join". En las
FROM
consultas combinadas es necesario aplicar una condición de combinación a través de
una cláusula WHERE.
Especifica una condición que debe cumplirse para que los datos sean devueltos por la
WHERE
consulta. Admite los operadores lógicos AND y OR.
Especifica la agrupación que se da a los datos. Se usa siempre en combinación con
GROUP BY
funciones agregadas.
Especifica una condición que debe cumplirse para los datosEspecifica una condición que
debe cumplirse para que los datos sean devueltos por la consulta. Su funcionamiento es
HAVING similar al de WHERE pero aplicado al conjunto de resultados devueltos por la consulta.
Debe aplicarse siempre junto a GROUP BY y la condicion debe estar referida a los
campos contenidos en ella.
Presenta el resultado ordenado por las columnas indicadas. El orden puede expresarse
ORDER BY con ASC (orden ascendente) y DESC (orden descendente). El valor predeterminado es
ASC.
Para formular una consulta a la tabla tCoches (creada en el capítulo de tablas) y recuperar los campos matricula,
marca, modelo, color, numero_kilometros, num_plazas debemos ejecutar la siguiente consulta. Los datos seran
devueltos ordenados por marca y por modelo en orden ascendente, de menor a mayor.
SELECT matricula,
marca,
modelo,
color,
numero_kilometros,
num_plazas
FROM tCoches
ORDER BY marca,modelo;
Page 11 of 27
La palabra clave FROM indica que los datos serán recuperados de la tabla tCoches. Podriamos haber especificado
mas de una tabla, pero esto se verá en el apartado de consultas combinadas.
Tambien podríamos haber simplicado la consulta a través del uso del comodin de campos, el asterisco "*".
SELECT *
FROM tCoches
ORDER BY marca,modelo;
El uso del asterisco indica que queremos que la consulta devuelva todos los campos que existen en la tabla.
[arriba]
La cláusula WHERE
La cláusula WHERE es la instrucción que nos permite filtrar el resultado de una sentencia SELECT. Habitualmente
no deseamos obtener toda la información existente en la tabla, sino que queremos obtener sólo la información que
nos resulte util es ese momento. La cláusula WHERE filtra los datos antes de ser devueltos por la consulta.
En nuestro ejemplo, si queremos consultar un coche en concreto debemos agregar una cláusula WHERE. Esta
cláusula especifica una o varias condiciones que deben cumplirse para que la sentencia SELECT devuelva los datos.
Por ejemplo, para que la consulta devuelva sólo los datos del coche con maricula M-1525-ZA debemos ejecutar la
siguiente sentencia:
SELECT matricula,
marca,
modelo,
color,
numero_kilometros,
num_plazas
FROM tCoches
WHERE matricula = 'M-1525-ZA';
Cuando en una cláusula where queremos incluir un tipo texto, debemos incluir el valor entre comillas simples.
Además, podemos utilizar tantas condiciones como queramos, utilizando los operadores lógicos AND y OR . El
siguiente ejemplo muestra una consulta que devolverá los coches cuyas matriculas sean M-1525-ZA o bien M-2566-
AA.
SELECT matricula,
marca,
modelo,
color,
numero_kilometros,
num_plazas
FROM tCoches
WHERE matricula = 'M-1525-ZA'
OR matricula = 'M-2566-AA' ;
Además una condición WHERE puede ser negada a través del operador lógico NOT. La siguiente consulta
devolverá todos los datos de la tabla tCohes menos el que tenga matricula M-1525-ZA.
SELECT matricula,
marca,
modelo,
color,
numero_kilometros,
num_plazas
FROM tCoches
WHERE NOT matricula = 'M-1525-ZA' ;
Podemos tambien obtener las diferentes marcas y modelos de coches ejecutando la consulta.
Page 12 of 27
La cláusula ORDER BY
Como ya hemos visto en los ejemplos anteriores podemos especificar el orden en el que serán devueltos los datos
a través de la cláusula ORDER BY.
SELECT matricula,
marca,
modelo,
color,
numero_kilometros,
num_plazas
FROM tCoches
ORDER BY marca ASC,modelo DESC;
Como podemos ver en el ejemplo podemos especificar la ordenación ascendente o descendente a través de las
palabras clave ASC y DESC. La ordenación depende del tipo de datos que este definido en la columna, de forma que
un campo númerico será ordenado como tal, y un alfanúmerico se ordenará de la A a la Z, aunque su contenido sea
númerico. De esta forma el valor 100 se devuelve antes que el 11.
También podemos especificar el en la cláusula ORDER BY el índice númerico del campo dentro del la sentencia
SELECT para la ordenación, el siguiente ejemplo ordenaría los datos por el campo marca, ya que aparece en
segundo lugar dentro de la lista de campos que componen la SELECT.
SELECT matricula,
marca,
modelo,
color,
numero_kilometros,
num_plazas
FROM tCoches
ORDER BY 2;
El resto de opciones que podemos especificar al construir sentencias SELECT se irán presentando en los
siguientes capitulos de este tutorial.
Hasta ahora hemos visto como se almacenan los datos en una base de datos y como consultar esos
datos almacenados, pero no hemos visto como almacenar dichos datos.
Para almacenar datos en una base de datos debemos insertar filas en las tablas. Para ellos SQL pone
a nuestra disposición la sentencia INSERT.
[arriba]
Inserción de filas
El proceso de inserción de filas consiste en añadir a una tabla una o más filas y en cada fila todos o
parte de sus campos.
[(<campo1>[,<campo2>,...])]
values
(<valor1>,<valor2>,...);
Como se puede observar la sentencia tiene dos partes claramente diferenciadas, por un lado la propia
INSERT INTO seguida de la lista de campos en los que queremos insertar los datos, y por otro la lista de
valores que queremos insertar en los campos. La mejor forma de ver esto es a través de un ejemplo.
(matricula,
marca ,
modelo ,
color ,
numero_kilometros)
values
('M1111CA',
'RENAULT',
'MEGANE TR100',
'NEGRO DIAMANTE',
78000);
Nota:Hemos utilizado el color rojo para los datos de tipo texto, entrecomillados con la comilla simple, y el azul para
los numericos.
Con esta sentencia INSERT creamos un registro en la tabla tCoches con los valores especificados, es
decir, la matricula tendrá el valor M-1111-CA, la marca será RENAULT y así sucesivamente.
¿Que ocurriría si ya existiera un coche con la matricula M-1111-CA? Se producirá un error, porque
hemos definido la clave primaria en el campo matricula, y como hemos visto la clave primaria debe ser
única.
Si omitimos algún par " campo-valor " en la sentencia INSERT, pueden ocurrir varias cosas:
(matricula,
marca ,
modelo ,
color)
values
('M1111CA',
'RENAULT',
'MEGANE TR100',
'NEGRO DIAMANTE');
[arriba]
[(<campo1>[,<campo2>,...])]
SELECT
[(<campo1>[,<campo2>,...])]
FROM
<nombre_tabla_origen>;
Para poder utilizar la inserción multiple de filas se deben cumplir las siguientes normas:
• La lista de campos de las sentencias insert y select deben coincidir en número y tipo de datos.
• Ninguna de las filas devueltas por la consulta debe infringir las reglas de integridad de la tabla en la
que vayamos a realizar la inserción.
Pongamos un ejemplo, vamos a crear una tabla con las diferentes marcas que tenemos en la base de
datos. La sentencia SQL para crear la tabla es la siguiente:
CREATE TABLE tMarcas
TABLE
marca varchar(255),
);
Nota: Hemos incluido la función identity para el campo codigo, esta función es propia de SQL Server e indica que
el código se genera automáticamente cada vez que se inserta un registro con un valor autonumérico. Praticamente
todos los gestores de bases de datos dan la opción del campo autonumerico o incremental, si bien el modo varias.
Para SQL Server utilizaremos la funcion identity, para ORACLE las secuencias ...
Una vez que tenemos creada la tabla de marcas vamos a insetar otro par de registros en la tabla de
coches, para ello utilizamos una sentencia insert into para una única fila.
(matricula,
marca ,
modelo ,
color)
values
('M2233FH',
'SEAT',
'LEON FR',
'ROJO');
(matricula,
marca ,
modelo ,
color)
values
('M1332FY',
'FORD',
'FIESTA',
'GRIS PLATA');
Ahora tenemos tres marcas diferentes en la tabla tCoches, y queremos insertarlas en la tabla de
marcas, para ello podemos realizar tres inserciones individuales, pero ¿que pasaria si no supieramos de
antemano el número de marcas?¿y si fueran unas cincuenta marcas?. Nos podriamos pasar el día entero
escribiendo sentencias insert into.
Afortunadamente podemos realizar una inserción multiple del siguiente modo:
Page 16 of 27
INSERT INTO tMarcas
(marca)
Borrado de datos.
La sentencia DELETE.
[ WHERE <condicion>];
El siguiente ejemplo ilustra el uso de la sentencia DELETE. Es buena idea especificar en la sentencia WHERE los
campos que forman la clave primaria de la tabla para evitar borrar datos que no queramos eliminar.
Cuando trabajemos con la sentencia DELETE debemos tener en cuenta las siguientes consideraciones:
Actualización de datos.
La sentencia UPDATE.
Para la actualización de datos SQL dispone de la sentencia UPDATE. La sentencia UPDATE permite la
actualización de uno o varios registros de una única tabla. La sintaxis de la sentencia UPDATE es la siguiente
UPDATE nombre_tabla>
UPDATE <
[ WHERE <condicion>];
Las siguientes sentencias actualizan los datos de la tabla tCoches con los valores de la tabla tMarca
optenidos anteriormente en la página dedicada a la inserción de datos.
UPDATE tCoches
UPDATE
SET marca
SET = '1'
UPDATE tCoches
UPDATE
SET marca
SET = '2'
SET marca
SET = '3'
Notese que los valores para el campo marca aparecen entrecomillados, ya que es un campo de tipo varchar. Los
valores con los que actualicemos los datos deben ser del tipo del campo.
Un aspecto a tener en cuenta es que los campos que forman la primary key de una tabla sólo se podrán modificar
si los registros no están referenciados en ninguna otra tabla. En nuestro caso sólo podremos modificar la matrícula de
un coche si no tiene registros asociados en la tabla tAlquileres.
Esto puede causar poblemas, ya que podríamos habernos equivocado al dar de alta el coche en la tabla tCoches y detectar el error despues de alquilar el
coche. En tal caso tendríamos dar de alta un nuevo coche con la matrícula correcta, actualizar los registros de la tabla alquileres y por último borrar el
registro erroneo de la tabla tCoches. Este proceso puede ser bastante complicado en el caso de que existiran más relaciones con la tabla. Se podría
considerar que la clave primaria de la tabla esta mal definida y que la matrícula no debe ser el elemento que identifique el coche. Una alternativa seria crear
un código autonumérico para la tabla tCoches que realizará las veces de clave primaria y crear un índice único para la matrícula, este diseño tambien tiene
sus "pegas", por lo que debemos decidir que modelo utilizar, y seleccionar las claves primarias con sumo cuidado.
[arriba]
El uso de subconsultas es una técnica avanzada de consulta que veremos con detalle más adelante, pero que
tratamos aquí de forma introductoria.
Hasta ahora hemos actualizado los datos con valores que conocemos de antemano, ¿pero que ocurre cuando esos
datos deben tomarse de otra tabla de la base de datos?.Podríamos diseñar un programa que recorriera toda la tabla y
buscará el valor adecuado para cada registro y lo actualizase. Sin duda es una solución, y en ocasiones casí la
única, pero es una solución cara y compleja que además exige que conozcamos algún otro lenguaje de
programación. Para estos casos podemos utilizar subconsultas con la sentencia UPDATE.
La sintaxis es la siguiente:
UPDATE <nombre_tabla>
UPDATE
SET
SET <campo1> = <valor1> | <subconsulta1>
,...
[ WHERE <condicion>];
Como puede verse la sintaxis es practicamente igual a la sintaxis del la sentencia UPDATE, con la salvedad de que
podemos utilizar subconsultas en lugar de valores al asignar los campos. De forma generica podemos decir que las
subconsultas son consultas SELECT incluidas dentro de otra sentencia SQL.
SET marca
SET = '1'
Page 19 of 27
SET marca
SET = '2'
SET marca
SET = '3'
SET marca
SET = (SELECT
SELECT CODIGO FROM tMarcas
Por cada registro de la tabla tCoches se ejecutará la subconsulta, actualizando el campo marca a el valor del
código de la marca en la tabla tMarcas.
Habitualmente cuando necesitamos recuperar la información de una base de datos nos encontramos con que dicha
información se encuentra repartida en varias tablas, referenciadas a través de varios códigos. De este modo si
tuvieramos una tabla de ventas con un campo cliente, dicho campo contendría el código del cliente de la tabla de
cliente.
Sin embargo está forma de almacenar la información no resulta muy util a la hora de consultar los datos. SQL nos
proporciona una forma facil de mostrar la información repartida en varias tablas, las consultas combinadas o JOINS.
Combinación interna.
La combinación interna nos permite mostrar los datos de dos o más tablas a través de una condición WHERE.
Si recordamos los ejemplos de los capitulos anteriores tenemos una tabla de coches, en la que tenemos
referenciada la marca a través del código de marca. Para realizar la consulta combinada entre estas dos tablas
debemos escribir una consulta SELECT en cuya claúsula FROM escribiremos el nombre de las dos tablas,
separados por comas, y una condición WHERE que obligue a que el código de marca de la tabla de coches sea igual
al código de la tabla de marcas.
Lo más sencillo es ver un ejemplo directamente:
SELECT tCoches.matricula,
tMarcas.marca,
tCoches.modelo,
tCoches.color,
tCoches.numero_kilometros,
tCoches.num_plazas
Demonos cuenta que hemos antepuesto el nombre de cada tabla a el nombre del campo, esto no es obligatorio si
los nombres de campos no se repiten en las tablas, pero es acondajable para evitar conflictos de nombres entre
campos. Por ejemplo, si para referirnos al campo marca no anteponemos el nombre del campo la base de datos no
sabe si queremos el campo marca de la tabla tCoches, que contiene el código de la marca, o el campo marca de la
tabla tMarcas, que contiene el nombre de la marca.
Otra opción es utilizar la cláusula INNER JOIN. Su sintaxis es identica a la de una consulta SELECT habitual, con
la particularidad de que én la cláusula FROM sólo aparece una tabla o vista, añadiendose el resto de tablas a través
de cláusulas INNER JOIN .
SELECT [ALL
ALL | DISTINCT ]
FROM <nombre_tabla>
ORDER BY <nombre_campo>|<indice_campo> [ASC
[ORDER ASC | DESC]
DESC
SELECT tCoches.matricula,
tMarcas.marca,
tCoches.modelo,
tCoches.color,
tCoches.numero_kilometros,
tCoches.num_plazas
FROM tCoches
Combinación Externa
La combinación interna es excluyente. Esto quiere decir que si un registro no cumple la condición de combinación
no se incluye en los resultados. De este modo en el ejemplo anterior si un coche no tiene grabada la marca no se
devuelve en mi consulta.
Según la naturaleza de nuestra consulta esto puede ser una ventaja , pero en otros casos significa un serio
problema. Para modificar este comportamiento SQL pone a nuestra disposición la combinación externa. La
combinación externa no es excluyente.
La sintaxis es muy parecida a la combinación interna,
SELECT [ALL
ALL | DISTINCT ]
FROM <nombre_tabla>
ORDER BY <nombre_campo>|<indice_campo> [ASC
[ORDER ASC | DESC]
DESC
SELECT tCoches.matricula,
tMarcas.marca,
tCoches.modelo,
tCoches.color,
tCoches.numero_kilometros,
tCoches.num_plazas
FROM tCoches
SELECT tCoches.matricula,
tMarcas.marca,
tCoches.modelo,
tCoches.color,
tCoches.numero_kilometros,
tCoches.num_plazas
FROM tCoches
RIGHT OUTER JOIN tMarcas
JOIN ON tCoches.marca = tMarcas.codigo
Esta consulta devolverá los registros de la tabla tCoches que tengan marca relacionada y todos los registros de la
tabla tMarcas, tengan algún registro en tCoches o no.
Visualmente (la consulta devuelve los datos en azul) ...
Page 23 of 27
[arriba]
Union
La cláusula UNION permite unir dos o más conjuntos de resultados en uno detras del otro como si se tratase de
una única tabla. De este modo podemos obtener los registros de mas de una tabla "unidos".
La sintaxis corresponde a la de varias SELECT unidas a través de UNION, como se muestra a continuación:
SELECT [ALL
ALL | DISTINCT ]
FROM <nombre_tabla>
SELECT [ALL
ALL | DISTINCT ]
FROM <nombre_tabla>
ORDER BY <nombre_campo>|<indice_campo> [ASC
[ORDER ASC | DESC]
DESC
• Las consultas a unir deben tener el mismo número campos, y además los campos deben ser del mismo tipo.
• Sólo puede haber una única clausula ORDER BY al final de la sentencia SELECT.
El siguiente ejemplo muestra el uso de UNION
Page 24 of 27
SELECT tCoches.matricula,
tMarcas.marca,
tCoches.modelo,
tCoches.color,
tCoches.numero_kilometros,
tCoches.num_plazas
FROM tCoches
INNER JOIN tMarcas
JOIN ON tCoches.marca = tMarcas.codigo
UNION
SELECT tMotos.matricula,
tMarcas.marca,
tMotos.modelo,
tMotos.color,
tMotos.numero_kilometros,
0
FROM tCoches
INNER JOIN tMarcas
JOIN ON tCoches.marca = tMarcas.codigo;
Consultas agregadas
La cláusula GROUP BY
La clausula GROUP BY combina los registros con valores idénticos en un único registro. Para cada registro se
puede crear un valor agregado si se incluye una función SQL agregada, como por ejemplo Sum o Count, en la
instrucción SELECT. Su sintaxis es:
SELECT [ALL
ALL | DISTINCT ]
[{,<funcion_agregado>}]
FROM <nombre_tabla>|<nombre_vista>
[{,<nombre_tabla>|<nombre_vista>}]
ORDER BY <nombre_campo>|<indice_campo> [ASC
[ORDER ASC | DESC]
DESC
[{,<nombre_campo>|<indice_campo> [ASC
ASC | DESC ]}]]
GROUP BY es opcional. Si se utiliza GROUP BY pero no existe una función SQL agregada en la instrucción
SELECT se obtiene el mismo resultado que con una consulta SELECT DISTINCT. Los valores Null en los campos
GROUP BY se agrupan y no se omiten. No obstante, los valores Null no se evalúan en ninguna de las funciones SQL
agregadas.
Todos los campos de la lista de campos de SELECT deben incluirse en la cláusula GROUP BY o como argumentos
de una función SQL agregada.
FROM tCoches
La cláusula HAVING
Una vez que GROUP BY ha combinado los registros, HAVING muestra cualquier registro agrupado por la cláusula
GROUP BY que satisfaga las condiciones de la cláusula HAVING. Se utiliza la cláusula WHERE para excluir aquellas
filas que no desea agrupar, y la cláusula HAVING para filtrar los registros una vez agrupados.
HAVING es similar a WHERE, determina qué registros se seleccionan. Una vez que los registros se han agrupado
utilizando GROUP BY, HAVING determina cuales de ellos se van a mostrar. HAVING permite el uso de funciones
agregadas.
FROM tCoches
HAVING SUM(numero_kilometros)>100000
SUM
En el ejemplo anterior, no se cuentan los datos para todas las marcas menos "BMW", una vez que se han contado,
se evalua HAVING, y el conjunto de resultados devuelve solo aquellos modelos con más de 100.000 km.
AVG
Calcula la media aritmética de un conjunto de valores contenidos en un campo especificado de una consulta. Su
sintaxis es la siguiente
AVG <expr>)
AVG(
Page 26 of 27
En donde expr representa el campo que contiene los datos numéricos para los que se desea calcular la media o una
expresión que realiza un cálculo utilizando los datos de dicho campo. La media calculada por Avg es la media
aritmética (la suma de los valores dividido por el número de valores). La función Avg no incluye ningún campo Null en
el cálculo.
FROM tCoches
Count
COUNT <expr>)
COUNT(
En donde expr contiene el nombre del campo que desea contar. Los operandos de expr pueden incluir el nombre
de un campo de una tabla, una constante o una función (la cual puede ser intrínseca o definida por el usuario pero no
otras de las funciones agregadas de SQL). Puede contar cualquier tipo de datos incluso texto.
Aunque expr puede realizar un cálculo sobre un campo, Count simplemente cuenta el número de registros sin tener
en cuenta qué valores se almacenan en los registros. La función Count no cuenta los registros que tienen campos null
a menos que expr sea el carácter comodín asterisco (*). Si utiliza un asterisco, Count calcula el número total de
registros, incluyendo aquellos que contienen campos null. Count(*) es considerablemente más rápida que Count
(Campo). No se debe poner el asterisco entre dobles comillas ('*').
SELECT COUNT(*)
COUNT FROM tCoches;
SELECT marca, COUNT(modelo)
COUNT
FROM tCoches
GROUP BY marca;
SELECT marca, COUNT(DISTINCT
COUNT DISTINCT modelo)
FROM tCoches
GROUP BY marca;
Max, Min
Devuelven el mínimo o el máximo de un conjunto de valores contenidos en un campo especifico de una consulta.
Su sintaxis es:
MIN <expr>)
MIN(
MAX <expr>)
MAX(
Page 27 of 27
En donde expr es el campo sobre el que se desea realizar el cálculo. Expr pueden incluir el nombre de un campo
de una tabla, una constante o una función (la cual puede ser intrínseca o definida por el usuario pero no otras de las
funciones agregadas de SQL).
, MAX(numero_kilometros)
MAX
FROM tCoches
Sum
Devuelve la suma del conjunto de valores contenido en un campo especifico de una consulta. Su sintaxis es:
SUM <expr>)
SUM(
En donde expr respresenta el nombre del campo que contiene los datos que desean sumarse o una expresión que
realiza un cálculo utilizando los datos de dichos campos. Los operandos de expr pueden incluir el nombre de un
campo de una tabla, una constante o una función (la cual puede ser intrínseca o definida por el usuario pero no otras
de las funciones agregadas de SQL).
FROM tCoches