Tutorial SQL
Tutorial SQL
Introducción SQL
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.
El lenguaje SQL
Introducción a SQL
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.
Tipos de datos.
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.
Operadores
Operadores SQL
Aritméticos + Suma
- Resta
* Producto
/ División
** ^ Exponenciación
Relacionales < Menor que
<= Menor o igual que
> 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
NOT lógicos se evaluan de izquierda a derecha.
Concatenación + Se emplea para unir datos de tipo alfanúmerico.
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.
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
Predicados
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.
Tablas
Nomenclatura
Creación de tablas
Modificación de tablas
Eliminación de tablas.
Nomenclatura
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.
arriba
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.
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.
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.
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.
Ejemplo:
ALTER TABLE tCoches
ADD num_plazas integer null default 5;
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.
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.
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
Eliminación de tablas.
Podemos eliminar una tabla de una base de datos mediante la instruccion DROP
TABLE.
La instrucción DROP TABLE elimina de forma permanente la tabla y los datos en ella
contenida.
Si intentamos eliminar una tabla que tenga registros relacionados a través de una clave
externa la instrucción DROP TABLE fallará por integridad referencial.
Indices
Introducción a los índices.
Creación de índices
Lenguaje de definición de datos (II)
Definición de Índices
Un índice es una estructura de datos que permite acceder a diferentes filas de una misma
tabla a través de un campo (o campos clave).
[arriba]
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. Este es un aspecto muy importante de cara al rendimiento de las
operaciones de escritura, ya que además de escribir los datos en la tabla se escribiran
también en el indice. Un número elevado de índices hará más lentas estas operaciones.
Sin embargo, salvo casos excepcionales, el beneficio que aportan los indices compensa
(de largo) esta penalización.
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.
Vistas
Vistas
Creación de vistas.
Sinónimos
Vistas
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.
arriba
Creación de vistas.
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.
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:
arriba
Sinónimos
Un sinónimo es un nombre alternativo que identifica una tabla en la base de datos. Con
un sinónimo se pretende normalmente simplificar el nombre original de la tabla, aunque
también se suelen utilizar para evitar tener que escribir el nombre del propietario de la
tabla.
arriba
Consulta de datos.
El proceso más importate que podemos llevar a cabo en una base de datos es la
consulta de los datos. De nada serviría una base de datos si no
puedieramos consultarla. Es además la operación que efectuaremos con mayor
frecuencia.
[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
ALL
suele especificarse casi nunca.
DISTINCT Indica que queremos seleccionar sólo los valores distintos.
FROM 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 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
WHERE
por la 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
GROUP BY
con 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.
HAVING Su funcionamiento es 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
ORDER BY expresarse con ASC (orden ascendente) y DESC (orden descendente). El valor
predeterminado es ASC.
SELECT matricula,
marca,
modelo,
color,
numero_kilometros,
num_plazas
FROM tCoches
ORDER BY marca,modelo;
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
SELECT matricula,
marca,
modelo,
color,
numero_kilometros,
num_plazas
FROM tCoches
WHERE matricula = 'M-1525-ZA';
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' ;
[arriba]
La cláusula ORDER BY
SELECT matricula,
marca,
modelo,
color,
numero_kilometros,
num_plazas
FROM tCoches
ORDER BY marca ASC,modelo DESC;
SELECT matricula,
marca,
modelo,
color,
numero_kilometros,
num_plazas
FROM tCoches
ORDER BY 2;
[arriba]
Insertar datos.
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.
Sólo podremos omitir un campo al efectuar una inserción cuando este acwepte
valores nulos.
[arriba]
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.
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.
Si omitimos algún par " campo-valor " en la sentencia INSERT, pueden ocurrir
varias cosas:
[arriba]
La sentencia INSERT permite tambien insertar varios registros en una tabla. Pare ello
se utiliza una combinación de la sentencia INSERT junto a una sentencia SELECT. El
resultado es que se insertan todos los registros devueltos por la consulta.
Para poder utilizar la inserción multiple de filas se deben cumplir las siguientes normas:
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:
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.
Como resultado obtenemos un registro en la tabla tMarcas por cada marca de la tabla
tCoches. El campo codigo se ha generado automáticamente ya que está definido como
identidad.
CODIGO MARCA
1 FORD
2 RENAULT
3 SEAT
Ahora deberiamos cambiar los datos de la tabla tCoches, para guardar el código de la
marca en lugar de su descripción, pero para ello necesitamos saber como modificar un
dato grabado ... Es momento de pasar al siguiente punto, la actualización de datos.
Borrado de datos.
La sentencia DELETE.
[ WHERE <condicion>];
Cuando trabajemos con la sentencia DELETE debemos tener en cuenta las siguientes
consideraciones:
La sentencia TRUNCATE
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>
SET <campo1> = <valor1>
{[,<campo2> = <valor2>,...,<campoN> = <valorN>]}
[ WHERE <condicion>];
Las siguientes sentencias actualizan los datos de la tabla tCoches con los valores de la
tabla tMarca obtenidos anteriormente en la página dedicada a la inserción de datos.
UPDATE tCoches
SET marca = '1'
WHERE marca = 'FORD';
UPDATE tCoches
SET marca = '2'
WHERE marca = 'RENAULT';
UPDATE tCoches
SET marca = '3'
WHERE marca = 'SEAT';
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]
Uso de subconsultas con UPDATE
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 qué 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>
SET <campo1> = <valor1> | <subconsulta1>
{[,<campo2> = <valor2> | <subconsulta2>
,...
, <campoN> = <valorN> | <subconsultaN>]}
[ WHERE <condicion>];
La opcion alter column es propia de SQL Server. Para modificar el tipo de datos de
una tabla debemos consultar la ayuda del gestor de bases de datos.
Consultas combinadas.
Combinación interna
Combinación externa
Uniones
[arriba]
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.
SELECT tCoches.matricula,
tMarcas.marca,
tCoches.modelo,
tCoches.color,
tCoches.numero_kilometros,
tCoches.num_plazas
FROM tCoches, tMarcas
WHERE tCoches.marca = tMarcas.codigo
SELECT tCoches.matricula,
tMarcas.marca,
tCoches.modelo,
tCoches.color,
tCoches.numero_kilometros,
tCoches.num_plazas
FROM tCoches
INNER JOIN tMarcas ON tCoches.marca = tMarcas.codigo
[arriba]
Combinación Externa
SELECT tCoches.matricula,
tMarcas.marca,
tCoches.modelo,
tCoches.color,
tCoches.numero_kilometros,
tCoches.num_plazas
FROM tCoches
LEFT OUTER JOIN tMarcas ON tCoches.marca = tMarcas.codigo
SELECT tCoches.matricula,
tMarcas.marca,
tCoches.modelo,
tCoches.color,
tCoches.numero_kilometros,
tCoches.num_plazas
FROM tCoches
RIGHT OUTER JOIN tMarcas 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.
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".
SELECT tCoches.matricula,
tMarcas.marca,
tCoches.modelo,
tCoches.color,
tCoches.numero_kilometros,
tCoches.num_plazas
FROM tCoches
INNER JOIN tMarcas ON tCoches.marca = tMarcas.codigo
UNION
SELECT tMotos.matricula,
tMarcas.marca,
tMotos.modelo,
tMotos.color,
tMotos.numero_kilometros,
0
FROM tMotos
INNER JOIN tMarcas ON tMotos.marca = tMarcas.codigo;
Puede observarse el uso de la constante cero en la segunda lista de
selección para hacer coincidir el número y tipo de
campos que devuelve la consulta UNION.
Consultas agregadas
La cláusula GROUP BY
La cláusula HAVING
AVG
Count
Max, Min
Sum
Consultas agregadas
La cláusula GROUP BY
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.
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
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.
Count
COUNT(<expr>)
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 ('*').
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>)
MAX(<expr>)
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).
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).
Subconsultas
Definición de subconsultas.
Referencias externas
Anidar subconsultas
Utilizacion de subconsultas con UPDATE
La función EXISTS
Subconsultas
Definición de subconsultas.
Una subconsulta es una sentencia SELECT que aparece dentro de otra sentencia
SELECT. Normalmente se utilizan para filtrar una clausula WHERE o HAVING con
el conjunto de resultados de la subconsulta, aunque también pueden utilizarse en la lista
de selección.
Una subconsulta tiene la misma sintaxis que una sentencia SELECT normal
exceptuando que aparece encerrada entre paréntesis.
Referencias externas
Cuando se ejecuta una consulta que contiene una subconsulta con referencias
externas, la subconsulta se ejecuta por cada fila de la consulta principal.
SELECT CO_EMPLEADO,
NOMBRE,
(SELECT MIN(FECHA_NOMINA)
FROM NOMINAS
WHERE CO_EMPLEADO = EMPLEADOS.CO_EMPLEADO) PRIMERA_NOMINA
FROM EMPLEADOS;
Anidar subconsultas
SELECT CO_EMPLEADO,
EMPLEADOS
FROM EMPLEADOS
WHERE CO_EMPLEADO IN (SELECT CO_EMPLEADO
FROM NOMINAS
WHERE ESTADO IN ( SELECT ESTADO
FROM ESTADOS_NOMINAS
WHERE EMITIDO = 'S'
AND PAGADO = 'N')
)
SELECT CO_EMPLEADO,
NOMBRE
FROM EMPLEADOS
WHERE ESTADO IN (SELECT ESTADO
FROM ESTADOS
WHERE ACTIVO = 'S')
SELECT CO_EMPLEADO,
NOMBRE
FROM EMPLEADOS, ESTADOS
WHERE EMPLEADOS.ESTADO = ESTADOS.ESTADO
AND ESTADOS.ACTIVO = 'S'
La función EXISTS
EXISTS es una función SQL que devuelve veradero cuando una subconsulta retorna
al menos una fila.
SELECT CO_CLIENTE,
NOMBRE
FROM CLIENTES
WHERE EXISTS ( SELECT *
FROM MOROSOS
WHERE CO_CLIENTE = CLIENTES.CO_CLIENTE
AND PAGADO = 'N')
La función EXISTS puede ser utilizada en cualquier sentencia SQL váida, SELECT,
UPDATE, INSERT o DELETE.