Publicado el Dejar un comentario

SQL intermedio: subconsultas en la cláusula SELECT.

En una entrada anterior vimos el uso de subconsultas en la clausula WHERE (condición) de un SELECT. En esta entrada veremos el uso de las subconsulta dentro de la cláusula SELECT.

Subconsultas (subqueries) en cláusula SELECT.

Veamos el siguiente ejemplo de un subconsulta dentro de la cláusula SELECT.

Subconsulta en cláusula SELECT.

La subconsulta obtiene la fecha máxima o más reciente de la fecha contratación de un puesto (Title) dado. La subconsulta en la cláusula SELECT por lo general debe ser una subconsulta escalar, debe regresar una sola fila y una sola columna, es decir un sólo valor en cada ejecución. La subconsulta se ejecutará una vez por cada fila que regrese la consulta externa. En el ejemplo, la subconsulta se ejecuta 8 veces, una por cada fila de la tabla Employee (empleado).

Subconsulta correlacionada.

La subconsulta del ejemplo, además de ser escalar, es decir que regresa un sólo valor por cada ejecución, también se dice que es de tipo correlacionada, es decir, es una subconsulta correlacionada. ¿ Qué significa esto? Significa que la subconsulta toma o necesita información de la consulta que la contiene, la cual recibe el nombre de consulta externa. Si observas, a la tabla Employee de la subconsulta se le ha asignado el alias “e2”, mientras que a la misma tabla pero de la consulta externa se le ha asignado el alias “e1”. Observa que la condición del WHERE de la subconsulta hace referencia a la columna “Title” de la consulta externa: “e1.Title = e2.Title”. Al ejecutar la consulta el valor de “e1.Title” cambiará de acuerdo al valor de la fila regresada por la consulta externa.

Vamos a hacer la consulta más precisa, como puedes observar , la combinación de “Puesto” (Title) y “Fecha de Contratación Máximo” [MAX(HireDate)]en algunas ocasiones aparece repetido. Agreguemos la cláusula DISTINCT al SELECT de la siguiente forma par ahacer más óptima la consulta:

Consulta optimizada.

Recuerda que la cláusula DISTINCT sirve para no presentar filas duplicadas en los resultados. Presenta sólo filas únicas. Ahora sólo aparece una fila para cada “Puesto” y su “Fecha Contratación Máxima”, de los 8 filas originales sólo quedaron 5.

En un próximo artículo, veremos el uso de las subconsultas en la cláusula FROM.

¡Hasta pronto!

Publicado el 1 comentario

SQL intermedio: subconsultas (subqueries).

En este artículo vamos a ver las instrucciones o sentencias SQL llamadas subconsultas (subqueries en inglés).

¿Qué es una subconsulta (subquery) SQL?

Una subconsulta, en SQL, es una sentencia SELECT anidada o dentro de otra sentencia SELECT. Observa el siguiente ejemplo:

Consulta con subconsulta.

Como puedes observar en el ejemplo anterior, existe dos sentencias SELECT, la segunda dentro de la cláusula WHERE del primer SELECT. La segunda sentencia recibe el nombre de subconsulta o subquery ya que se encuentra dentro de otra consulta SELECT.

Sunconsulta o subquery escalar.

Esta subconsulta o subquery recibe el nombre de “subconsulta escalar” debido a que sólo regresa un solo valor en una única fila. Si ejecutamos dicha subconsulta veremos que regresa lo siguiente:

Ejecución de la subconsulta.

Nos regresa el valor 8 que representa el “ArtistId” de la tabla Artist (artista) cuyo campo “Name” convertido a mayúsculas tiene el valor de “AUDIOSLAVE”. Los paréntesis que encierran la subconsulta son obligatorios, si no se colocan , la sentencia entera marcaría error al ejecutarla.

La primera consulta o sentencia SELECT toma el resultado o valor que arroja la subconsulta (el valor 8) y lo compara con los valores de la columna ArtisId de todas las filas de la tabla Album y regresa todas las columnas de la tabla Artist de aquellos registros o filas que hayan cumplan la condición (ArtisId igual a 8). Como muestran los resultados de la primera imagen.

Veamos ahora esta consulta:

Subconsulta multifila.

Subconsulta o query multilinea.

Esta subconsulta, a diferencia de la subconsulta escalar, regresa más de una fila. En este ejemplo la subconsulta regresa el valor de la columna “InvoiceId” de dos filas. Si ejecutamos la solamente la subconsulta obtendremos los siguientes resultados:

Resultados de la subconsulta.

Como podemos observar la subconsulta regresa dos filas, es decir hay dos filas en la tabla InvoiceLine (líneas de factura) que cumplen la condición “TrackId = 2”. La consulta regresa los valores de la columna “InvoiceId” (identificador de la factura) a la que pertenecen (1 y 214).

Por lo tanto el SELECT externo sería equivalente a esta consulta:

Consulta equivalente sin subconsulta multilínea.

Como puedes observar en el resultado de la consulta, los valores de la columna “CustomerId” (identificador del cliente) y el número de filas son los mismos que la consulta original que incluye la subconsulta multilínea. Recuerda que el operador IN de SQL espera una lista de valores cuando la expresión del lado izquierdo devuelve un sólo valor, por lo tanto la subconsulta deberá regresar valores de sólo una columna.

Subconsulta multilínea multicolumna.

Una subconsulta multilínea también puede regresar varias columnas. Veamos el siguiente ejemplo:

Subconsulta multilinea y multicolumna.

En este ejemplo la subconsulta regresa dos columnas: TrackId (el identificado de la pista de audio) y Quantity (la cantidad comparadas de esa pista) de cada una de las lineas de la factura con el identificador (InvoiceId) número 214. Si ejecutamos sólo la subconsulta obtenemos los siguientes resultados:

Ejecución de subconsulta multilinea y multicolumna.

Obtenemos los 9 artículos (pistas de música) que se adquirieron de la InvoiceId (factura o identificador de la factura) 214. El TrackId (identificador de la pista de música) y Quantity (la cantidad adquirida de cada pista) de dicha factura.

La consulta completa regresa las líneas de factura de otras facturas que no pertenezcan a la factura 214 y que coincidan con el identificador de la pista (TrackId) y la cantidad (Quantity) de las lineas de la factura 214.

En este artículo vimos el uso de subconsultas en la cláusula WHERE de un SELECT. En un siguiente artículo veremos cómo emplear la subconsultas en la cláusula FROM o en el mismo SELECT.

¡Hasta pronto!

Publicado el 3 comentarios

SQL básico. Funciones sobre cadenas de texto.

En esta sección veremos las funciones que se usan con cadenas de texto más comunes en sentencias SQL. Hay que notar que cada motor de base de datos implementa a veces sus propias funciones y con diferentes nombres. Veremos las más estandarizadas.

Antes de continuar veremos como trabajar directamente con literales, también llamadas constantes, en una sentencia SQL sin recurrir a un campo o columna de una tabla. Escribe y ejecuta el siguiente ejemplo:

Literales en un SELECT.

Como puedes observar, en la sentencia SELECT anterior no usamos ninguna tabla, no especificamos la cláusula FROM, por lo tanto no obtenemos los valores de columnas, si no que los valores los escribimos directamente en la instrucción SELECT. A estos valores escritos directamente se les llama “literales” o “constantes”. Ahora observa los resultados, muestra una sola fila con los valores literales o constantes que escribimos. Las literales texto (TEXT) se encierran entre comillas sencillas mientras que los numéricos se escriben tal cual.

Observa el encabezado de los resultados, los nombres de la columnas son una copia de las literales. Cuando usamos los campos de una tabla, por defecto coloca los nombres de las columnas como hemos visto hasta ahora en todos los ejemplos que hemos hecho. Existe una forma de cambiar el nombre de las columnas en los resultados y es lo que veremos enseguida.

Usando alias en una sentencia SQL.

Un alias es un nombre o apodo que le damos a nuestras columnas o tablas en una sentencia SQL para cambiar el nombre por defecto de estas.

Para columnas o literales usamos la siguiente sintaxis:

expresión AS alias-columna

Para tablas:

nombre-tabla AS alias-tabla

Volvamos a escribir el ejemplo que vimos anteriormente pero ahora asignándole un nombre o alias a las columnas:

Literales en un SELECT con ALIAS.

Observa ahora los encabezados de las columnas de los resultados, aparecen los nombres que le indicamos: texto y numero. Los nombres de los alias pueden contener espacios, pero para ello tenemos que ponerlos entre comillas dobles. Escribe y ejecuta el siguiente ejemplo:

Nombres de alis con espacios.

Observa que el alias “El texto” tiene un espacio, pero para ello lo tuvimos que encerrar entre comillas dobles. Si no lo hiciéramos, al ejecutar la sentencia, marcaría error.

A las columnas de una tabla también le podemos asignar alias. Escribe y ejecuta la siguiente sentencia:

Asignando alias a las columnas de columnas de una tabla.

Observa que a las columnas “id_producto”, “id_marca” e “id_categoria” les asignamos los alias o nombres “producto”, “marca” y “categoria” respectivamente.

Para ejemplificar las funciones vamos a utilizar literales o constantes. Pero las funciones igualmente funcionan con columnas de una tabla.

Funciones SQL sobre cadenas de texto.

Función SQL UPPER().

Convierte la cadena de texto o texto a letras mayúsculas.

Sintaxis: UPPER(expresión-texto)

Recuerda que expresión-texto puede ser una literal o el nombre de una columna de una tabla la cual se quiere convertir a mayúsculas.

Ejecuta la siguiente instrucción y observa el resultado:

Función UPPER().

Función SQL LOWER().

Convierte el texto a minúsculas.

Sintaxis: LOWER(expresión-texto)

Ejecuta el siguiente ejemplo y observa el resultado:

Función LOWER().

Función SQL SUBSTRING().

Extrae una parte del texto.

Sintaxis: SUBSTRING(expresión-texto, a-partir-del-caracter, número-de-caracteres)

Ejecuta el ejemplo y revisa el resultado:

Función SUBSTRING().

En el ejemplo anterior, la función extrae del texto dado una parte de él, a partir del caracter en la posición 1, contando de izquierda a derecha y empezando a contar desde 1, en este caso la letra “p”, y a partir de ahí contando 7 caracteres a la derecha.

Si no se especifica el tercer parámetro de la función es decir, el “número-de-caractares“, entonces extrae “a-partir-del-caracter” y hasta el final del texto. Observa el ejemplo que extrae desde la posición 9 hasta el final del texto:

Función SUBSTRING() sin el tercer parámetro.

Función SQL LENGTH().

Obtiene la longitud (número de caracteres) del texto.

Sintaxis: LENGTH(expresión-texto)

Ejemplo:

Función LENGTH().

Los espacios también cuentan como caracteres.

Función SQL INSTR().

Busca o localiza la primera ocurrencia, de izquierda a derecha, de un texto dentro de otro texto y regresa el número de caracteres anteriores más uno o cero si no encuentra ninguna ocurrencia del texto a buscar.

Sintaxis: INSTR(texto, texto-a-localizar)

Veamos un ejemplo:

Función INSTR().

En el ejemplo, el texto a localizar “ext” se encuentra en la posición 11 del texto “palabra a extraer”. Si el texto a localizar no se encontrara en el texto, la función regresa un cero (0). Ejemplo:

Función INSTR() texto no encontrado.

Función SQL TRIM().

Remueve blancos o los caracteres especificados de ambos lados de un texto, sólo los espacios o caracteres de los extremos, y regresa el texto resultante.

Sintaxis: TRIM(texto, caracteres-a-remover)

Si el segundo parámetro, caracteres-a-remover, se omite, se remueve por defecto los caracteres espacio o blancos a ambos lados del texto. Veamos dos ejemplos:

Función TRIM() quitando espacios.
Función TRIM() quitando caracteres.

En el primer ejemplo de la función TRIM() omitimos el segundo parámetro de la función, por lo tanto la función remueve todos los espacios a la extrema derecha e izquierda del texto dado. Observe que no remueve los espacios intermedios, sólo los de los extremos. En los resultados se muestran tanto el texto con espacios removidos como el texto original.

En el segundo ejemplo incluimos el segundo parámetro, que son los caracteres que queremos remover de los extremos del texto dado. En este caso queremos remover todos los caracteres “+” (más) y “-” menos o guión. en los resultados se muestra el texto resultante.

Función SQL REPLACE().

Regresa un texto resultante de la sustitución de cada ocurrencia de un texto buscado dentro de un texto por un texto de reemplazo.

Sintaxis: REPLACE(texto, texto-a-reemplazar, texto-de-reemplazo);

Si el parámetro texto-de-reemplazo es un texto vacío (”), el texto-a-reemplazar se sustituye por nulos (nada). Observa los siguientes ejemplos:

Función REPLACE().
Función REPLACE() con texto vacío.

En el primer ejemplo, todas las letras o en el texto “Texto original” son sustituidas por la letra a. El el segundo ejemplo las letras o son eliminadas y no son sustituidas por nada ya que se especifica como reemplazo un texto vacío.

Función de concatenación.

Muchos motores de base de datos tienen la función CONCAT() para concatenar o unir textos, SQLite no implementa dicha función, en su lugar utiliza el operador de concatenación “||” (dos barras verticales).

Syntaxis: texto || texto

Escribe y ejecuta los siguientes ejemplos:

Concatenando dos textos.
Concatena tres textos.

En el primer ejemplo concatenamos dos literales textos, en el segundo ejemplo, se concatenan tres literales textos.

Nota: recuerda que en todas las funciones anteriormente vistas los textos literales o constantes que usamos pueden ser reemplazados por columnas o campos de una tabla.

En la siguiente sección veremos la funciones SQL aplicadas a números o matemáticas más usadas.

¡Hasta pronto!

IR A LA PAGINA DEL CURSO.