Comandos SQL básicos en bases de datos (SELECT)

por | 16 mayo, 2017

En nuestros anteriores artículos mostramos como instalar y configurar una pequeña base de datos con PHPMyAdmin y MySQL, así pues, recomendamos dar un repaso a dichos artículos para tener clara la base sobre la que trabajaremos en este manual de SQL.

Para hacer más sencillo nuestro manual trabajaremos únicamente con dos tablas que serán ‘T_SENSOR‘ y ‘T_SENSOR_AUDIT‘, la primera representarán un listado de los sensores disponibles y conectados a nuestra Raspberry Pi, de la segunda obtendremos el muestreo de datos obtenidos con el paso del tiempo en dichos sensores.

Nota: Evidentemente todos los datos que usaremos de prueba serán de ejemplo, ni que decir que no disponemos aún de tomas de datos reales ni conexión directa a una Raspberry Pi conectada.

Antes de empezar queremos dar tres consejos sencillos:

  • No hay mejor consulta que la que no se ejecuta, es decir, una consulta en base de datos requiere cálculos, uso de memoria,… y hay que tener claro cuando necesitamos ejecutarla. Ejecutar la misma consulta o consultas semejantes muchas veces sin necesidad real afectará directamente al rendimiento de nuestro portal web o aplicación.
  • Simplificad las consulta en vuestro coco y construidlas poco a poco (vaya rima molona eh!), una consulta compleja puede tener más de 10, 20 y 100 líneas, si creáis dicha consulta de una sola atacada os complicará mucho la vida si hay algún simple error.
  • El lenguaje SQL puede ser complejo, así pues, traducid en vuestra mente la consulta en palabras sencillas como por ejemplo «Quiero saber cuales eran los sensores de temperatura que estaban activos el día 1 de enero de 2016».

Comenzamos pues con el manual megapropowerohmygodsoyelmasterdeluniverso de SQL:

1. Consultas (SELECT) SQL

1.1 Como construir una consulta

Todos los comandos SQL siguen un patrón fijo con parámetros obligatorios y opcionales, en el caso de la consulta la estructura es la siguiente:

SELECT <DATOS_DE_SALIDA> FROM <NOMBRE_TABLA> WHERE <EXPRESIÓN_DE_CONDICIÓN> ORDER BY <CAMPOS_DE_ORDENACIÓN> <TIPO_ORDENACIÓN>

  • Los argumentos del ejemplo marcados en rojo son siempre obligatorios en cualquier consulta
  • Los argumentos del ejemplo marcados en verde son opcionales
  • Los argumentos en negrita son comandos propios de SQL fijos e invariables, es decir, cualquier letra que agreguemos antes o después producirán un error en el comando (SSELECT, SELECTS, SELETS,…)
  • Los argumentos marcados entre <> serán variables, no obstante, deben seguir un patrón también definido en el lenguaje SQL para que puedan ser interpretados por la base de datos.
  • La definición de cada parámetro es el siguiente:
    • SELECT: Con este parámetro al principio del comando indicamos a la base de datos que deseamos hacer una consulta. En palabras llanas y traduciendo a lo loco en nuestra mente deberíamos interpretarlo como «Quiero selecciona» o «quiero buscar».
    • <DATOS DE SALIDA>: En esta parte del comando indicaremos que deseamos obtener ¿queremos un nombre, un apellido, la edad?… o en nuestras tablas de ejemplo ¿queremos el identificador del sensor, que tipo es, su estado,…?. En caso de querer obtener información de todos los campos de la tabla usaremos el carácter asterisco (*) como si de un comodín se tratara.
    • FROM: Este parámetro precederá al nombre de la tabla o tablas donde deseamos buscar, su traducción llana sería algo así como «buscando en…»
    • <NOMBRE_TABLA>: Como tengamos que explicar esto apaga y vámonos 😛 …. es broma … aquí indicaremos el nombre de la tabla o tabla donde buscar, en caso de tratarse de más de una tabla separaremos los nombres con una coma.
    • WHERE: Argumento opcional pero de uso casi obligatorio pues precede a las condiciones que deben cumplir los registros de buscamos y rara vez será la que ejecutemos una consulta sin buscar algo muy concreto.
    • <EXPRESIÓN_DE_CONDICIÓN>: Aquí está uno de los puntos fuertes de SQL, existen multitud de operadores para comparara, sumar, agrupar,… tantos que mostraremos en este artículo lo más básico básico y adjuntaremos un enlace a webs oficiales con más información. No es solo pereza… es que hay tantos que nos llevaría páginas y páginas explicarlos.
    • ORDER BY: Este comando opcional precederá al nombre del campo o campos por los que deseamos ordenar el listado resultante de la consulta.
    • <CAMPOS_DE_ORDENACIÓN>: Existe la opción de indicar varios campos en la ordenación separando estos con comas, en la mayoría de los casos únicamente ordenaremos por un único campo.
    • <TIPO_ORDENACIÓN>: La ordenación normalmente de aplica ascendente o descendente usando las palabras ASC y DESC. La ordenación nos permitirá listar los resultados de la A a la Z o viceversa en caso de textos, de números menores a mayores y viceversa, por fechas,…

1.2 Consulta básica en SQL

Denominaremos consulta básica a aquella que únicamente consulta en una tabla sin exceso de complicación en las condiciones de búsqueda

Un ejemplo claro sería el siguiente:

SELECT * FROM T_SENSOR_AUDIT

El resultado mostraría TODOS los registros de la tabla ‘T_SENSOR‘ sin excepción, no obstante, no suele ser lo común buscar todos los resultados sin ton ni son. A continuación mostraremos más consultas básicas y una «frase» con la que podríamos hacernos una idea de lo que buscamos.

  • Quiero saber el identificador de todos los sensores con estado ‘Activo’.

SELECT ROW_ID FROM T_SENSOR WHERE ESTADO = ‘Activo’

  • Quiero saber el identificador y el estado de todos los sensores de tipo ‘Temperatura’.

SELECT ROW_ID, ESTADO FROM T_SENSOR WHERE TIPO= ‘Temperatura’

  • Quiero saber el identificador, tipo de sensor y estado de todos los sensores de tipo ‘Humedad’ y ‘Temperatura’ ordenados por identificador de forma ascendente.

SELECT ROW_ID, TIPO, ESTADO FROM T_SENSOR WHERE TIPO IN (‘Humedad’, ‘Temperatura’) ORDER BY ROW_ID ASC

1.3 Consulta compleja en SQL:

Consideraremos una consulta compleja aquella que utilice dos o más tablas, expresiones de agrupación, operaciones como sumas,… Las consultas complejas siguen exactamente el mismo patrón que las anteriores, las diferencias esenciales serán las siguientes:

  • Podemos solicitar resultados combinados de todas las tablas
  • Las múltiples tablas se definen de forma consecutiva separándolas por comas
  • Es preciso definir «como vamos a asociar las distintas tablas» en las condiciones de búsqueda tras el parámetro WHERE, estas definiciones de relación son denominadas ‘JOIN‘.

En el siguiente ejemplo mostraremos como construir estas consultas:

SELECT <TABLA1>.<CAMPO_SALIDA_TABLA1>, <TABLA2>.<CAMPO_SALIDA_TABLA2> FROM <TABLA1>, <TABLA2> WHERE <TABLA1>.<PK_TABLA1> = <TABLA2>.<FK_TABLA2>

  • Los argumentos del ejemplo marcados en azul son obligatorios en cualquier consulta compleja
  • Los argumentos del ejemplo marcados en verde son las referencias correspondientes a la primera tabla
  • Los argumentos del ejemplo marcados en rojo son las referencias correspondientes a la segunda tabla
  • La definición de cada parámetro es el siguiente:
    • SELECT: Primer parámetro requerido en consultas.
    • <TABLA1>: Nombre de la primera tabla de la consulta.
    • <CAMPO_SALIDA_TABLA1>: Nombre del campo perteneciente a la primera tabla de la consulta.
    • <TABLA2>:  Nombre de la segunda tabla de la consulta
    • <CAMPO_SALIDA_TABLA2>: Nombre del campo perteneciente a la segunda tabla de la consulta.
    • FROM: Este parámetro precederá al nombre de la tabla o tablas donde deseamos buscar, su traducción llana sería algo así como «buscando en…»
    • WHERE: Argumento obligatorio en consultas compleja, tras este argumento como mínimo debe ser informada la relación o asociación entre ambas tablas (‘JOIN‘).
    • JOIN: Asociación de la ‘Primary key‘ de la tabla principal con la ‘Foreign key‘ de la segunda tabla.

Como podréis observar en la estructura anterior, es preciso definir en los campos de salida y en la expresión ‘WHERE’ de donde procede cada campo, este formato nos ayudará a distinguir mejor de donde procede un campo en caso de que ambas tablas tengan campos con el mismo nombre (véase el ROW_ID).

A continuación mostraremos un ejemplo real distinguiendo con colores de que tabla procede cada argumento:

SELECT T_SENSOR.ROW_ID, T_SENSOR.TIPO, T_SENSOR_AUDIT.ESTADO, T_SENSOR_AUDIT.FECHA, T_SENSOR_AUDIT.TIPO FROM T_SENSOR, T_SENSOR_AUDIT WHERE T_SENSOR.ROW_ID = T_SENSOR_AUDIT.SENSOR_ID

La consulta del ejemplo mostraría en palabras llanas lo siguiente – «Quiero para cada sensor su identificador, tipo, estado en el instante de la auditoria, fecha de auditoria y tipo de auditoria». El resultado nos mostraría toooodas las capturas de datos que hemos hecho sobre todos nuestros sensores a lo largo del tiempo, en caso de que deseemos acotar un poco más la búsqueda deberíamos ampliar las condiciones o criterios de búsqueda tras la sentencia ‘WHERE‘.

La siguiente consulta mostrará los mismos resultados pero únicamente para sensores de temperatura, en palabras llanas sería «Quiero para cada sensor de ‘Temperatura‘ su identificador, tipo, estado en el instante de la auditoria, fecha de auditoria y tipo de auditoria»

SELECT T_SENSOR.ROW_ID, T_SENSOR.TIPO, T_SENSOR_AUDIT.ESTADO, T_SENSOR_AUDIT.FECHA, T_SENSOR_AUDIT.TIPO FROM T_SENSOR, T_SENSOR_AUDIT WHERE T_SENSOR.ROW_ID = T_SENSOR_AUDIT.SENSOR_ID AND T_SENSOR.TIPO = ‘Temperatura’

Fijaos que simplemente en una consulta cruzando dos tablas el texto es cada vez más largo y tedioso, podríamos evitar algo de texto usando los que se denominan ‘ALIAS’ sobre nuestras tablas. Un alias sería algo así como un nombre corto que reemplazaría al nombre de nuestra tabla, para usar un alias simplemente añadimos el nombre que queremos usar como alias tras el nombre de la tabla en la sentencia ‘FROM’. Un ejemplo sería el siguiente:

SELECT T1.ROW_ID, T1.TIPO, T2.ESTADO, T2.FECHA, T2.TIPO FROM T_SENSOR T1, T_SENSOR_AUDIT T2 WHERE T1.ROW_ID = T2.SENSOR_ID AND T1.TIPO = ‘Temperatura’

Personalmente, para aclararme las ideas, suelo escribir las consultas complejas dividiéndolas por partes de la siguiente forma:

SELECT
T1.ROW_ID,
T1.TIPO,
T2.ESTADO,
T2.FECHA,
T2.TIPO
FROM
T_SENSOR T1,
T_SENSOR_AUDIT T2
WHERE
T1.ROW_ID = T2.SENSOR_ID
AND T1.TIPO = ‘Temperatura’

Nota: Es posible que en esta consulta no tenga mucho sentido esta forma de organizarla, sin embargo, pensad que cuando trabajas con consulta sobre más de 20 tablas a la vez es preferible molestarse un poco e invertir un minuto en organizar la consulta y que sea mucho más comprensible y visual al ojo humano.

Hasta aquí el artículo de introducción a consultas SQL, continuaremos en nuestro próximo artículo afinando un poco las consultas para no mostrar datos duplicados.

Comparte esta página! Email this to someone
email
Share on Facebook
Facebook
0Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.