Introducción
Lenguaje artificial de cierta complejidad que permite el manejo y procesamiento del contenido de la base de datos. En la práctica puede consistir en un subconjunto de instrucciones de otro lenguaje informático. Las aplicaciones que trabajan sobre la base de datos se programan en un lenguaje de programación (C, Cobol, …) insertando en el código fuente sentencias del DML. Al utilizar un DML se deben especificar los datos que serán afectados por las sentencias del lenguaje. Un DML puede tener o no procedimientos, según sea necesario especificar ademáns cónmo deben obtenerse esos datos. Los DML con procedimientos tienen sentencias de control de flujo como bucles o condicionales. Los DML sin procedimientos son conocidos también como declarativos.

Consultas de Selección
Las consultas de selección se utilizan para indicar al motor de datos que devuelva información de las bases de datos, esta información es devuelta en forma de conjunto de registros que se pueden almacenar en un objeto recordset. Este conjunto de registros es modificable.
Consultas básicas
La sintaxis básica de una consulta de selección es la siguiente:
|
1 2 |
SELECT Campos FROM Tabla |
En donde campos es la lista de campos que se deseen recuperar y tabla es el origen de los mismos, por ejemplo:
|
1 |
SELECT Nombre, Telefono FROM Clientes |
Esta consulta devuelve un recordset con el campo nombre y teléfono de la tabla clientes.
Ordenar los registros
Adicionalmente se puede especificar el orden en que se desean recuperar los registros de las tablas mediante la claúsula ORDER BY Lista de Campos. En donde Lista de campos representa los campos a ordenar. Ejemplo:
|
1 2 3 |
SELECT CodigoPostal, Nombre, Telefono FROM Clientes ORDER BY Nombre |
Esta consulta devuelve los campos CodigoPostal, Nombre, Telefono de la tabla Clientes ordenados por el campo Nombre.
Se pueden ordenar los registros por mas de un campo, como por ejemplo:
|
1 2 3 |
SELECT CodigoPostal, Nombre, Telefono FROM Clientes ORDER BY CodigoPostal, Nombre |
Incluso se puede especificar el orden de los registros: ascendente mediante la claúsula (ASC -se toma este valor por defecto) ó descendente (DESC)
|
1 2 3 |
SELECT CodigoPostal, Nombre, Telefono FROM Clientes ORDER BY CodigoPostal DESC, Nombre ASC |
El predicado DISTINCT
El predicado 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:
|
1 2 |
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.
Selección Condicional, Operadores de Comparación y Lógicos
Selección Condicional
La cláusula WHERE se utiliza para determinar qué registros de las tablas enumeradas en la cláusula FROM aparecerán en los resultados de la instrucción SELECT. Depués de escribir esta cláusula se deben especificar las condiciones expuestas a continuación. Si no se emplea esta cláusula, la consulta devolverá todas las filas de la tabla. WHERE es opcional, pero cuando aparece debe ir a continuación de FROM.
Operadores de Comparación
Hay nueve operadores de comparación en SQL:
= Igual
<> Distinto
< Menor
> Mayor
<= Menor Igual
<= Mayor Igual
between Utilizado para especificar un intervalo de valores.
like Utilizado en la comparación de un campo contra un patrón
in Utilizado para verificar la existencia de un valor dentro de un conjunto de valores
El operador Between
Para indicar que deseamos recuperar los registros según el intervalo de valores de un campo emplearemos el operador Between cuya sintaxis es:
|
1 |
campo [Not] Between valor1 And valor2 |
En este caso la consulta devolvería los registros que contengan en “campo” un valor incluido en el intervalo valor1, valor2 (ambos inclusive). Si anteponemos la condición Not devolverá aquellos valores no incluidos en el intervalo.
|
1 2 3 4 |
SELECT * FROM Pedidos WHERE CodPostal BETWEEN 28000 and 28999 |
El Operador Like
Se utiliza para comparar una expresión de cadena con un modelo en una expresión SQL. Su sintaxis es:
|
1 |
expresión Like modelo |
En donde expresión es un patrón contra el que se compara expresión. Se puede utilizar el operador like para encontrar valores en los campos que coincidan con el modelo especificado. Por modelo puede especificar un valor completo (“Ana María”), o se pueden utilizar caracteres comodín para encontrar un rango de valores (Like “An%”).
El operador like se puede utilizar en una expresión para comparar un valor de un campo con una expresión de cadena. Por ejemplo, si introduce Like “C%” en una consulta SQL, la consulta devuelve todos los valores de campo que comiencen por la letra C. En una consulta con parámetros, puede hacer que el usuario escriba el modelo que se va a utilizar.
|
1 2 3 4 5 |
SELECT * FROM pet WHERE name LIKE ‘b%’; SELECT * FROM pet WHERE name LIKE ‘%fy’; SELECT * FROM pet WHERE name LIKE ‘%w%’; |
El Operador in
Este operador devuelve aquellos registros cuyo campo indicado coincide con alguno de los valores que se encuentran una lista explicitada. Su sintaxis es:
|
1 |
expresión [Not] In(valor1, valor2, . . .) |
|
1 2 3 4 |
SELECT * FROM Pedidos WHERE Provincia IN (“Santa Fe”, “Cordoba”, “Buenos Aires”) |
Operadores Lógicos
Hay tres operadores lógicos en SQL:
AND Es el “y” lógico. Evalua dos condiciones y devuelve un valor de verdad sólo si ambas son ciertas.
OR Es el “o” lógico. Evalúa dos condiciones y devuelve un valor de verdar si alguna de las dos es cierta.
NOT Negación lógica. Devuelve el valor contrario de la expresión.
Agrupamiento de Registros
GROUP BY
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:
|
1 |
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.
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.
|
1 |
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.
|
1 2 3 4 |
SELECT Carrera, Count(*) FROM Alumnos GROUP BY Carrera HAVING Count(*)>100 |
Esta consulta lista las carreras que tengan más de 100 alumnos.
Función de Agregación: AVG
Calcula la media aritmética de un conjunto de valores contenidos en un campo especificado de una consulta. Su sintaxis es la siguiente
|
1 |
Avg(expr) |
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.
|
1 2 3 |
SELECT Avg(Gastos) as Promedio FROM Pedidos WHERE Gastos > 100 |
Esta consulta lista el promedio de gastos calculado sobre los pedidos en los que se gastó más de 100.
Función de Agregación: COUNT
Calcula el número de registros devueltos por una consulta. Su sintaxis es la siguiente:
|
1 |
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.
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. 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).
|
1 2 |
SELECT Cont(*) as Total FROM Pedidos |
Esta consulta lista la cantidad de Pedidos.
|
1 |
Funciones de Agregación: MAX y 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:
|
1 2 |
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.
|
1 2 3 |
SELECT Min(Gastos) as ElMinimo FROM Pedidos WHERE Pais = “España” |
|
1 2 3 |
SELECT Max(Gastos) as ElMaximo FROM Pedidos WHERE Pais = “España” |
Función de Agregación: SUM
Devuelve la suma del conjunto de valores contenido en un campo especifico de una consulta. Su sintaxis es:
|
1 |
Sum(expr) |
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.
|
1 2 |
SELECT Sum(PrecioUnidad * Cantidad) as Total FROM DetallePedido |
LIMIT
Limitar el numero de resultados, la cláusula LIMIT permite limitar el número de filas devueltas:
|
1 |
SELECT * FROM gente LIMIT 3 |
La cláusula LIMIT puede usarse para restringir el número de registros retornados por el comando SELECT. LIMIT tiene uno o dos argumentos numéricos, que deben ser enteros positivos (incluyendo cero).
Con dos argumentos, el primer argumento especifica el desplazamiento del primer registro a retornar. El desplazamiento del registro inicial es 0 (no 1):
|
1 |
SELECT * FROM table LIMIT 5,10; # devolvería Filas entre 6-15 |
Operadores Lógicos IN y EXISTS
IN
Determina si un valor dado coincide con algún valor de una subconsulta o lista. Su sintaxix es:
|
1 |
WHERE {Campo | Expresión} [ NOT ] IN ( Sub-Consulta | Constantes [, Constantes, ... n] ) |
El resultado del operador lógico IN es un valor booleano, es decir Verdadero o Falso, para cada valor de Campo que se encuentre ( o no ) en la sub-consulta.
EXISTS
Especifica una subconsulta para probar la existencia de filas. Su sintaxis es la siguiente:
|
1 |
WHERE [NOT] EXISTS ( Sub - Consulta ) |
La subconsulta en realidad no produce ningún dato, al igual que IN devuelve el valor Verdadero o Falso.
El ejemplo siguiente compara dos consultas que son semánticamente equivalentes. La primera consulta utiliza EXISTS y la segunda consulta utiliza IN. Ambas consultas devuelven la misma información.
|
1 2 3 4 5 6 7 |
SELECT DISTINCT Nombre_Editor FROM Editores E WHERE EXISTS ( SELECT * FROM Titulos T WHERE T.IdEditor = E.IdEditor AND T.Tipo=”Negocios” ) |
|
1 2 3 4 5 6 |
SELECT DISTINCT Nombre_Editor FROM Editores WHERE IdEditor IN ( SELECT IdEditor FROM Titulos WHERE T.Tipo=”Negocios” ) |
Consultas multitabla
Cuando usamos varias tablas tenermos 3 metodos basicos de relación.
Puedo sacar información de varias tablas simplemente referenciando el nombre y el campo unidos por un punto
|
1 |
where tabla1.campo1 = tabla2.campo2. |
Es importantante no olvidar si estamnos buscando un dato de una seleccion concreta de una de las tablas debemos unirlas.
|
1 |
where tabla1.id = tabla2.id |
Por lo que la consulta quedaría
|
1 |
where tabla1.campo1 = tabla2.campo2 AND tabla1.id = tabla2.id |
ALIAS
Si queremos abreviar la sentencia podemos hacer uso de un alias
|
1 2 3 |
SELECT A.nombre, B.empresa..... FROM tabla1 A, tabla2 B WHERE A.campo1 = B.campo2 AND A.id = B.id |
INNER JOIN
Para unir tablas el método más efectivo es unir sus campos clave con inner join.

|
1 2 3 |
Select Empresas.Nombre,Servicios.Servicio from Empresas inner join Servicios on Servicios.IdEmpresa=Empresas.Id; |
De este modo estamos enlazando las dos tablas por su campo clave, y asi podemos consultar sus datos como si de “una sola tabla se tratara“, lo pongo entrecomillado pues igualmente tendremos que referenciar los datos con su monbre de tabla o alias más el nombre del campo separados por un punto.
SUBSELECT (Predicados Compuestos)
Hemos visto como podemos recuperar datos haciendo un select de una tabla, pues ese resultado podemos comparlo con otra selecion Select realizado a la misma u otra tabla.
Ejemplo:
Obtener por orden alfabético los empleados que tengan un sueldo igual o mayor en más de un 50% al sueldo del empleado apellidado García (si existiera más de un valor en la subconsulta, se produciría un error).
An error has occurred. Please try again later. |