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 Dejar un comentario

Oracle SQL: reemplazar un texto por otro.

Para reemplazar un texto por otro en un campo o columna con SQL usamos la función REPLACE().

Función SQL en ORACLE para reemplazar texto.

La sintaxis de la función REPLACE() es la siguiente:

REPLACE(en-texto, texto-a-reemplazar, texto-de-reemplazo)

La función regresa un texto como resultado de reemplaza en en-texto el texto-a-reemplazar con el texto-de-reemplazo. Veamos un ejemplo para que quede más claro:

Función SQL REPLACE().

En el ejemplo anterior la función reemplaza todas las ocurrencias del texto “ho”, en el texto “horror ortográfico” con el texto letra “e”. Dando como resultado el texto “error ortográfico”.

Veamos este otro ejemplo:

Función REPLACE() con dos parámetros.

En el ejemplo omitimos el tercer parámetro que es el texto de reemplazo. Si éste parámetro se omite, todas las ocurrencias del texto a reemplazar son eliminadas del texto. En este caso todas las ocurrencias del guión (-) son eliminados del texto “-error ortográfico” dando como resultado “error ortográfico”.

Espero y les sea útil este artículo. ¡Hasta la próxima!

Publicado el Dejar un comentario

Oracle: rellenar a la derecha o izquierda con algún caracter un texto.

A veces necesitamos formatear una columna de un resultado de una consulta SQL en Oracle para que se muestre con una longitud fija. Es decir que el valor de la columna o campo sea de longitud fija en el resultado.

Formatear resultados de una consulta SQL con un caracter dado.

Para formatear la salida de una columna podemos usar las funciones RPAD o LPAD del motor de la base de datos Oracle.

Dicen que una imagen dice más que mil palabras así que dejo una imagen de la sentencia y el resultado:

Ejemplo de la funciones SQL RPAD() y LPAD() de Oracle.

¿Que está sucediendo? Bueno las funciones RPAD() y LPAD() de Oracle regresan un texto de una longitud fija. Ambas funciones aceptan tres parámetros, un texto, la longitud del texto resultante y un caracter con el que va a rellenar los espacios faltantes del texto dado para completar la longitud del texto final.

En el ejemplo anterior la función RPAD() recibe la constante o literal “Introducción”, el número 30 como la longitud del texto a devolver y el caracter punto (.) como el caracter de relleno. La longitud de la constante “Introducción” es de 12 caracteres, por lo tanto faltan 18 caracteres para completar los 30 que va a contener el texto resultante (30-12 = 18). RPAD() rellena con el caracter de relleno,en este caso punto (.) esos 18 caracteres faltantes y los coloca a la derecha del texto original quedando así:

Introducción………………

El texto “Introducción” y doce puntos a la derecha del texto. Precisamente la R es de la palabra inglesa RIGHT (derecha en español).

Una vez visto cómo funciona esta primera función, nos será fácil entender como funciona la segunda. LPAD() tiene el mismo funcionamiento, sólo que el relleno lo hará a la izquierda del texto original. La letra L es de la palabra inglesa LEFT (izquierda en español).

En el ejemplo anterior LPAD() regresará un texto de longitud 3:

..1

Dos puntos y el caracter 1. El resultado final de la instrucción SELECT es la concatenación (operador dos barras verticales o pipes [||] )de lo que regresan las funciones RPAD() y LPAD() y le asigna el alias “indice” a la columna resultante. El resultado final es:

Introducción………………..1

Espero y les sea útil.

¡Hasta pronto!