11 - Síntesis Fundamentos SQL

Resumen de la sección Fundamentos SQL.


A lo largo de las diez lecciones anteriores se ha trabajado con diversas consultas SQL que accedían a una sola tabla de la BD. El propósito de trabajar con una única tabla es el de mostrar sobre el caso más simple (sólo interviene una tabla), la funcionalidad de las principales cláusulas SQL que una consulta puede incorporar. Con ello se consigue que en todos los ejemplos el motor SQL deba recorrer la tabla una sola vez, lo que facilita entender qué papel juega cada cláusula SQL y cómo deben combinarse para explotar los datos de una tabla. Aprovechando los ejemplos se han ido mostrando sobre la marcha distintos recursos y funcionalidades que el lenguaje SQL proporciona. Se ha pretendido mostrar estos recursos bajo un contexto, para acompañarlos de una aplicación práctica que ayude a entender su cometido.


Resumen Tipos de Consultas SQL

A lo largo de estas lecciones se han estudiado dos tipos de consultas SQL que se diferencian claramente por el resultado que se obtiene:

  • Consultas SQL llanas:

    Son las consultas que seleccionan los campos de una tabla indicados en la cláusula SELECT, de los registros filtrados por la cláusula WHERE.

  • Consultas SQL de cálculo:

    Son las consultas que calculan los totales, o valores agregados de una tabla, indicados en la cláusula SELECT mediante funciones de agregado (SUM, MAX, AVG...), sobre los registros filtrados por la cláusula WHERE. Las filas de resultado colapsan en las agrupaciones indicadas en la cláusula GROUP BY, en cuyo caso, pueden ser filtrados por las condiciones establecidas en la cláusula HAVING.


Resumen Cláusulas y Preguntas de Construcción

Cada cláusula SQL está relacionada o responde a una pregunta de construcción:

  1. SELECT: ¿Qué datos nos piden?
  2. FROM: ¿Dónde están los datos?
  3. WHERE: ¿Qué requisitos deben cumplir los registros?
  4. GROUP BY: ¿Cómo deben agruparse los datos?
  5. HAVING: ¿Qué requisitos deben cumplir los cálculos de totalización?
  6. ORDER BY: ¿Por qué columnas debe ordenarse el resultado?

Para construir una consulta como mínimo deben intervenir las cláusulas SELECT y FROM, el resto dependerá de lo que se quiera obtener, pero en cualquier caso el orden en que cada cláusula aparece en una consulta SQL no puede cambiarse. La cláusula SELECT siempre será la primera, y ORDER BY, si interviene, siempre será la última.

Aunque en MariaDB es posible hacer consultas sin cláusula FROM cuando por ejemplo indicamos solo constantes en la cláusula SELECT, en otros SGBD como Oracle, debe intervenir forzosamente la cláusula FROM e indicar una tabla. Puede usar la tabla DUAL para este propósito si trabaja en Oracle.


Resumen Estructura General de una Consulta SQL

En general una consulta SQL tiene esta forma (las cláusulas no obligatorias se omiten si no se usan):


  select [distinct] CAMPO_S1 [as ALIAS_C1], ... , CAMPO_SN
    from TABLA_1 [as ALIAS_T1] , ... , TABLA_N 
   where CONDICIONES_WHERE
group by CAMPO_G1, ... , CAMPO_GN
  having CONDICIONES_HAVING
order by CAMPO_O1, ... , CAMPO_ON [asc|desc]
            

En la cláusula SELECT se establece la lista de campos que mostrará el resultado de la consulta, poniendo DISTINCT precediendo a la lista de campos se eliminan posibles registros duplicados que el resultado pueda devolver. Así mismo podemos rebautizar las columnas de resultado asignando un alias a cada campo.

En la cláusula FROM se establece la fuente de los datos, las tablas que intervienen en la consulta. Podemos aplicar alias a las tablas de una consulta para simplificar las referencias a sus campos.

En la cláusula GROUP BY se establecen los campos por los que se agruparán los totales a obtener. No tendría sentido usar esta cláusula si no se indican funciones de agregado (SUM, MAX, AVG, etc.) en la cláusula SELECT.

La condiciones establecidas en la cláusula WHERE tienen como propósito filtrar registros de la tabla, mientras que las condiciones de la cláusula HAVING filtran filas de resultados condicionando únicamente los datos calculados por las funciones de agregado (SUM, MAX, AVG, etc.). A efectos prácticos se considera que la cláusula HAVING solo puede intervenir en una consulta SQL si lo hace la cláusula GROUP BY, de lo contrario no tiene sentido.

La cláusula ORDER BY permite finalmente ordenar el resultado por diferentes columnas, y en sentido ascendente o descendente, antes de ser presentado.


Motor SQL - Orden Lógico de Ejecución

Desde un punto de vista lógico, el motor SQL no comienza su trabajo seleccionando las columnas, sino que sigue una secuencia estricta para construir el conjunto de resultados:

Diagrama del flujo de ejecución lógica en SQL

  1. FROM: En primer lugar, el motor debe identificar la fuente de los datos, localizando la tabla (o tablas) indicadas en la cláusula FROM.
  2. WHERE: A continuación, recorre todos los registros de la tabla y decide, en función de las condiciones de la cláusula WHERE, cuáles toma en consideración y cuáles descarta.
  3. GROUP BY: Sobre los registros que han superado el filtro anterior, y si la consulta lo solicita, el motor agrupa los datos según los campos especificados en la cláusula GROUP BY.
  4. HAVING: Una vez generados los grupos, se aplican los filtros a los valores agregados mediante las condiciones de la cláusula HAVING.
  5. SELECT: Es en este punto donde el motor finalmente reúne los campos indicados en la cláusula SELECT (proyección de columnas) de los datos ya procesados.
  6. ORDER BY: Por último, antes de presentar el resultado final, ordena las filas según las columnas definidas en la cláusula ORDER BY.

Si usted ha llegado hasta aquí le animo a que continué con el curso. En las siguientes lecciones se va a abordar lo que quizá es el mayor potencial de las bases de datos relacionales: la reunión de datos. Usted aprenderá a trabajar con múltiples tablas en una misma consulta SQL.


Ejercicio Propuesto: Control de Poker

Supongamos que usted tiene un amigo que es jugador de póquer, el pobre no sabe si sus ganancias en el juego son positivas o negativas porque no lleva un control sobre ello, por lo que usted se ofrece a gestionarle las ganancias. Le dice a su amigo que cuando acabe una sesión de juego le comunique a usted el dinero que ha ganado o perdido, entendiendo perdida como una ganancia o número en negativo.

Diseñe una tabla (campos y tipo de dato de cada campo) para registrar la información, y construya las consultas SQL que respondan a estas preguntas:

  1. ¿Cuales son las ganancias actuales?
  2. ¿Cuánto dinero se ganó durante el mes de marzo de 2009?
Ir a la Consola

Reseñas de la lección 11

Aún no hay reseñas para esta lección. ¡Sé el primero!