0% encontró este documento útil (0 votos)
32 vistas

007-Consultas SQL

Este documento proporciona una guía sobre la sentencia SQL SELECT, explicando su sintaxis y cláusulas como FROM, WHERE, GROUP BY y HAVING. También describe operadores lógicos, funciones de agregado, predicados como ALL, TOP y DISTINCT, y tipos de consultas como uniones internas y agrupamiento de registros.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
32 vistas

007-Consultas SQL

Este documento proporciona una guía sobre la sentencia SQL SELECT, explicando su sintaxis y cláusulas como FROM, WHERE, GROUP BY y HAVING. También describe operadores lógicos, funciones de agregado, predicados como ALL, TOP y DISTINCT, y tipos de consultas como uniones internas y agrupamiento de registros.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 15

Ing. Luyi Rodas Beltrán U.A.G.R.M. (F.I.CH.

MANUAL SQL
SENTENCIA: “SELECT”

Docente: Ing. Luyi Rodas B.

Año 2011
Ing. Luyi Rodas Beltrán U.A.G.R.M. (F.I.CH.)

Sintaxis de la sentencia SELECT:

SELECT nombres de las columnas

[INTO nueva Tabla destino para resultados del select_]

FROM origenTabla

[WHERE condición de Búsqueda]

[GROUP BY nombres de columnas por la cual Agrupar]

[HAVING condiciónBúsqueda para Group By ]

[ORDER BY nombre de columnas [ASC | DESC] ]

• SELECT: Se usa para listar las columnas de las tablas que se desean
ver en el resultado de una consulta. Esta cláusula no puede
omitirse.

• FROM: Lista las tablas que deben ser analizadas en la evaluación de


la expresión de la cláusula WHERE y de donde se listarán las
columnas enunciadas en el SELECT. Esta cláusula no puede omitirse

• WHERE: establece criterios de selección de ciertas filas en el


resultado de la consulta gracias a las condiciones de búsqueda. Si
no se requiere condiciones de búsqueda puede omitirse y el
resultado de la consulta serán todas las filas de las tablas
enunciadas en el FROM.

• GROUP BY: especifica una consulta sumaria. En vez de producir una


fila de resultados por cada fila de datos de la base de datos, una
consulta sumaria agrupa todas las filas similares y luego produce
una fila sumaria de resultados para cada grupo de los nombres de
columnas enunciado en esta cláusula. En otras palabras, esta
cláusula permitirá agrupar un conjunto de columnas con valores
repetidos y utilizar las funciones de agregación sobre las columnas
con valores no repetidas. Esta cláusula puede omitirse.

• HAVING: le dice al SQL que incluya sólo ciertos grupos producidos


por la cláusula GROUP BY en los resultados de la consulta. Al igual
que la cláusula WHERE, utiliza una condición de búsqueda para
especificar los grupos deseados. La cláusula HAVING es la encargada
de condicionar la selección de los grupos en base a los valores
resultantes en las funciones agregadas utilizadas debidas que la
cláusula WHERE condiciona solo para la selección de filas
individuales. Esta cláusula puede omitirse.
Ing. Luyi Rodas Beltrán U.A.G.R.M. (F.I.CH.)

• ORDER BY: permitirá establecer la columna o columnas sobre las


cuales las filas resultantes de la consulta deberán ser ordenadas.
Esta cláusula puede omitirse.

Operadores Lógicos

Operadores de Comparación
Ing. Luyi Rodas Beltrán U.A.G.R.M. (F.I.CH.)

Funciones de Agregado

Consultas con Predicado


El predicado se incluye entre la claúsula y el primer nombre del campo a
recuperar, los posibles predicados son:

ALL

Si no se incluye ninguno de los predicados se asume ALL. El Motor de


base de datos selecciona todos los registros que cumplen las condiciones
de la instrucción SQL. No se conveniente abusar de este predicado ya que
obligamos al motor de la base de datos a analizar la estructura de la
tabla para averiguar los campos que contiene, es mucho más rápido
indicar el listado de campos deseados.

 SELECT ALL FROM Empleados;


 SELECT * FROM Empleados;
Ing. Luyi Rodas Beltrán U.A.G.R.M. (F.I.CH.)

TOP

Devuelve un cierto número de registros que entran entre al principio o


al final de un rango especificado por una cláusula ORDER BY. Supongamos
que queremos recuperar los nombres de los 25 primeros estudiantes del
curso 1994:

SELECT TOP 25 Nombre, Apellido

FROM Estudiantes

ORDER BY Nota DESC;

Si no se incluye la cláusula ORDER BY, la consulta devolverá un conjunto


arbitrario de 25 registros de la tabla Estudiantes .El predicado TOP no
elige entre valores iguales. En el ejemplo anterior, si la nota media
número 25 y la 26 son iguales, la consulta devolverá 26 registros. Se
puede utilizar la palabra reservada PERCENT para devolver un cierto
porcentaje de registros que caen al principio o al final de un rango
especificado por la cláusula ORDER BY. Supongamos que en lugar de los 25
primeros estudiantes deseamos el 10 por ciento del curso:

SELECT TOP 10 PERCENT Nombre, Apellido

FROM Estudiantes

ORDER BY Nota DESC;

El valor que va a continuación de TOP debe ser un Integer sin signo. TOP
no afecta a la posible actualización de la consulta.

DISTINCT

Omite los registros que contienen datos duplicados en los campos


seleccionados. Para que los valores de cada campo listado en la
instrucción SELECT se incluyan en la consulta deben ser únicos.

Por ejemplo, varios empleados listados en la tabla Empleados pueden


tener el mismo apellido. Si dos registros contienen López en el campo
Apellido, la siguiente instrucción SQL devuelve un único registro:

SELECT DISTINCT Apellido FROM Empleados;

Con otras palabras el predicado DISTINCT devuelve aquellos registros


cuyos campos indicados en la cláusula SELECT posean un contenido
diferente. El resultado de una consulta que utiliza DISTINCT no es
actualizable y no refleja los cambios subsiguientes realizados por otros
usuarios.
Ing. Luyi Rodas Beltrán U.A.G.R.M. (F.I.CH.)

DISTINCTROW

Devuelve los registros diferentes de una tabla; a diferencia del


predicado anterior que sólo se fijaba en el contenido de los campos
seleccionados, éste lo hace en el contenido del registro completo
independientemente de los campo indicados en la cláusula SELECT.

SELECT DISTINCTROW Apellido FROM Empleados;

Si la tabla empleados contiene dos registros: Antonio López y Marta


López el ejemplo del predicado DISTINCT devuelve un único registro con
el valor López en el campo Apellido ya que busca no duplicados en dicho
campo. Este último ejemplo devuelve dos registros con el valor López en
el apellido ya que se buscan no duplicados en el registro completo.

Agrupamiento de Registros
Combina los registros con valores idénticos, en la lista de campos
especificados, en un único registro.

Para cada registro se crea un valor sumario si se incluye una función


SQL agregada, como por ejemplo Sum o Count, en la instrucción SELECT. Su
sintaxis es:

SELECT campos

FROM tabla

WHERE criterio GROUP BY campos del grupo

GROUP BY es opcional. Los valores de resumen se omiten si no existe una


función SQL agregada en la instrucción SELECT. 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.

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. A menos que contenga un dato Memo u Objeto OLE , un campo de
la lista de campos GROUP BY puede referirse a cualquier campo de las
tablas que aparecen en la cláusula FROM, incluso si el campo no esta
incluido en la instrucción SELECT, siempre y cuando la instrucción
SELECT incluya al menos una función SQL agregada.

Todos los campos de la lista de campos de SELECT deben o bien incluirse


en la cláusula GROUP BY o como argumentos de una función SQL agregada.
Ing. Luyi Rodas Beltrán U.A.G.R.M. (F.I.CH.)

SELECT Id_Familia, Sum(Stock)

FROM Productos

GROUP BY Id_Familia;

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.

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.

SELECT Id_Familia Sum(Stock)

FROM Productos

GROUP BY Id_Familia

HAVING Sum(Stock)=100 AND NombreProducto Like ‘BOS%’;

Consultas de Unión Internas


Las vinculaciones entre tablas se realiza mediante la cláusula INNER que
combina registros de dos tablas siempre que haya concordancia de valores
en un campo común. Su sintaxis es:

SELECT campos

FROM tb1 INNER JOIN tb2

ON tb1.campo1 comp tb2.campo2

En donde:

tb1, tb2: Son los nombres de las tablas desde las que se combinan los
registros.

campo1, campo2: Son los nombres de los campos que se combinan. Si no son
numéricos, los campos deben ser del mismo tipo de datos y contener el
mismo tipo de datos, pero no tienen que tener el mismo nombre.

Comp: Es cualquier operador lógico: =, <, , <=, =, o <.

Se puede utilizar una operación INNER JOIN en cualquier cláusula FROM.


Esto crea una combinación por equivalencia, conocida también como unión
interna. Las combinaciones Equi son las más comunes; éstas combinan los
registros de dos tablas siempre que haya concordancia de valores en un
campo común a ambas tablas. Se puede utilizar INNER JOIN con las tablas
Ing. Luyi Rodas Beltrán U.A.G.R.M. (F.I.CH.)

Departamentos y Empleados para seleccionar todos los empleados de cada


departamento. Por el contrario, para seleccionar todos los departamentos
(incluso si alguno de ellos no tiene ningún empleado asignado) se emplea
LEFT JOIN o todos los empleados (incluso si alguno no está asignado a
ningún departamento), en este caso RIGHT JOIN.

Si se intenta combinar campos que contengan datos Memo u Objeto OLE, se


produce un error. Se pueden combinar dos campos numéricos cualesquiera,
incluso si son de diferente tipo de datos. Por ejemplo, puede combinar
un campo Numérico para el que la propiedad Size de su objeto Field está
establecida como Entero, y un campo Contador.

El ejemplo siguiente muestra cómo podría combinar las tablas Categorías


y Productos basándose en el campo IDCategoria:

SELECT Nombre_Categoría, NombreProducto

FROM Categorias INNER JOIN Productos

ON Categorias.IDCategoria = Productos.IDCategoria;

En el ejemplo anterior, IDCategoria es el campo combinado, pero no está


incluido en la salida de la consulta ya que no está incluido en la
instrucción SELECT. Para incluir el campo combinado, incluir el nombre
del campo en la instrucción SELECT, en este caso,
Categorias.IDCategoria.

También se pueden enlazar varias cláusulas ON en una instrucción JOIN,


utilizando la sintaxis siguiente:

SELECT campos

FROM tabla1 INNER JOIN tabla2

ON tb1.campo1 comp tb2.campo1 AND

ON tb1.campo2 comp tb2.campo2) OR

ON tb1.campo3 comp tb2.campo3)];

También puede anidar instrucciones JOIN utilizando la siguiente


sintaxis:
Ing. Luyi Rodas Beltrán U.A.G.R.M. (F.I.CH.)

SELECT campos

FROM tb1 INNER JOIN

(tb2 INNER JOIN [( ]tb3

[INNER JOIN [( ]tablax [INNER JOIN ...)]

ON tb3.campo3 comp tbx.campox)]

ON tb2.campo2 comp tb3.campo3)

ON tb1.campo1 comp tb2.campo2;

Un LEFT JOIN o un RIGHT JOIN puede anidarse dentro de un INNER JOIN,


pero un INNER JOIN no puede anidarse dentro de un LEFT JOIN o un RIGHT
JOIN.

Ejemplo

SELECT DISTINCTROW Sum([Precio unidad] * [Cantidad]) AS [Ventas],


[Nombre] & " " & [Apellidos] AS [Nombre completo] FROM [Detalles de
pedidos], Pedidos, Empleados, Pedidos INNER JOIN [Detalles de pedidos]
ON Pedidos.[ID de pedido] = [Detalles de pedidos].[ID de pedido],
Empleados INNER JOIN Pedidos ON Empleados.[ID de empleado] = Pedidos.[ID
de empleado] GROUP BY [Nombre] & " " & [Apellidos];

Crea dos combinaciones equivalentes: una entre las tablas Detalles de


pedidos y Pedidos, y la otra entre las tablas Pedidos y Empleados. Esto
es necesario ya que la tabla Empleados no contiene datos de ventas y la
tabla Detalles de pedidos no contiene datos de los empleados. La
consulta produce una lista de empleados y sus ventas totales.

Si empleamos la cláusula INNER en la consulta se seleccionarán sólo


aquellos registros de la tabla de la que hayamos escrito a la izquierda
de INNER JOIN que contengan al menos un registro de la tabla que hayamos
escrito a la derecha. Para solucionar esto tenemos dos cláusulas que
sustituyen a la palabra clave INNER, estas cláusulas son LEFT y RIGHT.
LEFT toma todos los registros de la tabla de la izquierda aunque no
tengan ningún registro en la tabla de la izquierda. RIGHT realiza la
misma operación pero al contrario, toma todos los registros de la tabla
de la derecha aunque no tenga ningún registro en la tabla de la
izquierda.
Ing. Luyi Rodas Beltrán U.A.G.R.M. (F.I.CH.)

Consultas de Unión Externas


Se utiliza la operación UNION para crear una consulta de unión,
combinando los resultados de dos o más consultas o tablas
independientes. Su sintaxis es:

 [TABLE] consulta1 UNION [ALL] [TABLE]


 consulta2 [UNION [ALL] [TABLE] consultan [ ... ]]

En donde:

consulta1, consulta2, consultan

Son instrucciones SELECT, el nombre de una consulta almacenada o el


nombre de una tabla almacenada precedido por la palabra clave TABLE.

Puede combinar los resultados de dos o más consultas, tablas e


instrucciones SELECT, en cualquier orden, en una única operación UNION.
El ejemplo siguiente combina una tabla existente llamada Nuevas Cuentas
y una instrucción SELECT:

TABLE [Nuevas Cuentas]

UNION ALL

SELECT * FROM Clientes

WHERE [Cantidad pedidos]=1000;

Si no se indica lo contrario, no se devuelven registros duplicados


cuando se utiliza la operación UNION, no obstante puede incluir el
predicado ALL para asegurar que se devuelven todos los registros. Esto
hace que la consulta se ejecute más rápidamente. Todas las consultas en
una operación UNION deben pedir el mismo número de campos, no obstante
los campos no tienen porqué tener el mismo tamaño o el mismo tipo de
datos.

Se puede utilizar una cláusula GROUP BY y/o HAVING en cada argumento


consulta para agrupar los datos devueltos. Puede utilizar una cláusula
ORDER BY al final del último argumento consulta para visualizar los
datos devueltos en un orden específico.
Ing. Luyi Rodas Beltrán U.A.G.R.M. (F.I.CH.)

SELECT [Nombre de compañía], Ciudad FROM Proveedores WHERE

País = 'Brasil'

UNION

SELECT [Nombre de compañía], Ciudad FROM Clientes

WHERE País = "Brasil"

Recupera los nombres y las ciudades de todos proveedores y clientes de


Brasil

SELECT [Nombre de compañía], Ciudad FROM Proveedores WHERE País =


'Brasil'

UNION

SELECT [Nombre de compañía], Ciudad FROM Clientes WHERE País = 'Brasil'


ORDER BY Ciudad

Recupera los nombres y las ciudades de todos proveedores y clientes


radicados en Brasil, ordenados por el nombre de la ciudad

SELECT [Nombre de compañía], Ciudad FROM Proveedores WHERE País =


'Brasil'

UNION

SELECT [Nombre de compañía], Ciudad FROM Clientes WHERE País = 'Brasil'


UNION SELECT [Apellidos], Ciudad FROM Empleados WHERE Región = 'América
del Sur'

Recupera los nombres y las ciudades de todos los proveedores y clientes


de brasil y los apellidos y las ciudades de todos los empleados de
América del Sur

TABLE [Lista de clientes]

UNION

TABLE [Lista de proveedores]


Ing. Luyi Rodas Beltrán U.A.G.R.M. (F.I.CH.)

Recupera los nombres y códigos de todos los proveedores y clientes

SUBCONSULTAS

Una subconsulta es una instrucción SELECT anidada dentro de una


instrucción SELECT, SELECT...INTO, INSERT...INTO, DELETE, o UPDATE o
dentro de otra subconsulta.

Puede utilizar tres formas de sintaxis para crear una subconsulta:

comparación [ANY | ALL | SOME] (instrucción sql)

expresión [NOT] IN (instrucción sql)

[NOT] EXISTS (instrucción sql)

En donde:

comparación

Es una expresión y un operador de comparación que compara la expresión


con el resultado de la subconsulta.

expresión

Es una expresión por la que se busca el conjunto resultante de la


subconsulta.

instrucción sql

Es una instrucción SELECT, que sigue el mismo formato y reglas que


cualquier otra instrucción SELECT.

Debe ir entre paréntesis.

Se puede utilizar una subconsulta en lugar de una expresión en la lista


de campos de una instrucción SELECT o en una cláusula WHERE o HAVING. En
una subconsulta, se utiliza una instrucción SELECT para proporcionar un
conjunto de uno o más valores especificados para evaluar en la expresión
de la cláusula WHERE o HAVING.

Se puede utilizar el predicado ANY o SOME, los cuales son sinónimos,


para recuperar registros de la consulta principal, que satisfagan la
comparación con cualquier otro registro recuperado en la subconsulta.

El ejemplo siguiente devuelve todos los productos cuyo precio unitario


es mayor que el de cualquier producto vendido con un descuento igual o
mayor al 25 por ciento.:
Ing. Luyi Rodas Beltrán U.A.G.R.M. (F.I.CH.)

SELECT * FROM Productos

WHERE PrecioUnidad ANY

(SELECT PrecioUnidad FROM DetallePedido WHERE Descuento = 0 .25);

El predicado ALL se utiliza para recuperar únicamente aquellos registros


de la consulta principal que satisfacen la comparación con todos los
registros recuperados en la subconsulta. Si se cambia ANY por ALL en el
ejemplo anterior, la consulta devolverá únicamente aquellos productos
cuyo precio unitario sea mayor que el de todos los productos vendidos
con un descuento igual o mayor al 25 por ciento. Esto es mucho más
restrictivo.

El predicado IN se emplea para recuperar únicamente aquellos registros


de la consulta principal para los que algunos registros de la
subconsulta contienen un valor igual. El ejemplo siguiente devuelve
todos los productos vendidos con un descuento igual o mayor al 25 por
ciento:

SELECT * FROM Productos

WHERE IDProducto IN

(SELECT IDProducto FROM DetallePedido WHERE Descuento = 0.25);

Inversamente se puede utilizar NOT IN para recuperar únicamente aquellos


registros de la consulta principal para los que no hay ningún registro
de la subconsulta que contenga un valor igual.

El predicado EXISTS (con la palabra reservada NOT opcional) se utiliza


en comparaciones de verdad/falso para determinar si la subconsulta
devuelve algún registro.

Se puede utilizar también alias del nombre de la tabla en una


subconsulta para referirse a tablas listadas en la cláusula FROM fuera
de la subconsulta.

El ejemplo siguiente devuelve los nombres de los empleados cuyo salario


es igual o mayor que el salario medio de todos los empleados con el
mismo título. A la tabla Empleados se le ha dado el alias T1:

SELECT Apellido, Nombre, Titulo, Salario

FROM Empleados AS T1

WHERE Salario = (SELECT Avg(Salario) FROM Empleados WHERE T1.Titulo =


Empleados.Titulo) ORDER BY Titulo;
Ing. Luyi Rodas Beltrán U.A.G.R.M. (F.I.CH.)

En el ejemplo anterior, la palabra reservada AS es opcional.

SELECT Apellidos, Nombre, Cargo, Salario

FROM Empleados

WHERE Cargo LIKE "Agente Ven*" AND Salario ALL (SELECT Salario FROM

Empleados WHERE (Cargo LIKE "*Jefe*") OR (Cargo LIKE "*Director*"));

Obtiene una lista con el nombre, cargo y salario de todos los agentes de
ventas cuyo salario es mayor que el de todos los jefes y directores.

SELECT DISTINCTROW NombreProducto, Precio_Unidad

FROM Productos

WHERE (Precio_Unidad = (SELECT Precio_Unidad FROM Productos WHERE

Nombre_Producto = "Almíbar anisado");

Obtiene una lista con el nombre y el precio unitario de todos los


productos con el mismo precio que el almíbar anisado.

SELECT DISTINCTROW Nombre_Contacto, Nombre_Compañia, Cargo_Contacto,

Telefono FROM Clientes WHERE (ID_Cliente IN (SELECT DISTINCTROW

ID_Cliente FROM Pedidos WHERE Fecha_Pedido = ‘04/1/93’ < ‘07/1/93’);

Obtiene una lista de las compañías y los contactos de todos los clientes
que han realizado un pedido en el segundo trimestre de 1993.

SELECT Nombre, Apellidos FROM Empleados AS E WHERE EXISTS

(SELECT * FROM Pedidos AS O WHERE O.ID_Empleado = E.ID_Empleado);

Selecciona el nombre de todos los empleados que han reservado al menos


un pedido.
Ing. Luyi Rodas Beltrán U.A.G.R.M. (F.I.CH.)

SELECT DISTINCTROW Pedidos.Id_Producto, Pedidos.Cantidad,

(SELECT DISTINCTROW Productos.Nombre FROM Productos WHERE

Productos.Id_Producto = Pedidos.Id_Producto) AS ElProducto FROM

Pedidos WHERE Pedidos.Cantidad 150 ORDER BY Pedidos.Id_Producto;

Recupera el Código del Producto y la Cantidad pedida de la tabla


pedidos, extrayendo el nombre del producto de la tabla de productos.

También podría gustarte