Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
SEMANA 6
SQL: lenguaje para la definición,
manipulación y control de bases
de datos relacionales III
Todos los derechos de autor son de la exclusiva propiedad de IACC o de los otorgantes de sus licencias. No está
permitido copiar, reproducir, reeditar, descargar, publicar, emitir, difundir, poner a disposición del público ni 1
ESTE
utilizarDOCUMENTO
los contenidos paraCONTIENE LAdeSEMANA
fines comerciales 6
ninguna clase.
2
ESTE DOCUMENTO CONTIENE LA SEMANA 6
ÍNDICE
3
ESTE DOCUMENTO CONTIENE LA SEMANA 6
SQL: LENGUAJE PARA LA DEFINICIÓN, MANIPULACIÓN Y
CONTROL DE BASE DE DATOS RELACIONALES III
OBJETIVOS ESPECÍFICOS
Emplear funciones de SQL para el trabajo con base de datos.
INTRODUCCIÓN
Durante esta semana de estudio se continuará con la profundización en el conocimiento de otras
funciones que ofrece SQL para el trabajo con números y caracteres, como lo son las funciones
matemáticas y de cadenas de caracteres, respectivamente.
A su vez, se abordará SELECT con múltiples tablas y subconsultas, otras de las fortalezas que ofrece
SQL.
Todos los temas que se explorarán durante la presente semana de estudio son de gran utilidad
para el trabajo con bases de datos, ya que permiten contar con nuevas herramientas para la
manipulación de los registros contenidos en ella.
4
ESTE DOCUMENTO CONTIENE LA SEMANA 6
1. FUNCIONES SQL
Tal como se ha visto en semanas anteriores, SQL ofrece una variedad de funciones que permiten
que el trabajo sea lo más completo posible. En esta semana, concretamente se abordarán
funciones matemáticas y funciones para cadenas de caracteres.
1.1.FUNCIONES MATEMÁTICAS
Las funciones matemáticas, o llamadas aritméticas por Ramos, Ramos y Montero (2006), son
aquellas que solo trabajan con valores numéricos y devuelven un valor igualmente numérico
según la función aplicada. Algunos autores clasifican como aritméticas las funciones de agregación
abordadas en semanas anteriores. A continuación, se verá un resumen de las funciones
matemáticas:
Función Propósito
ABS(n) Esta función devuelve el valor absoluto de “n”,
recordando que el valor absoluto siempre es un
número positivo.
CEIL(n) Esta función devuelve el valor entero
inmediatamente superior o igual a “n”.
FLOOR(n) Esta función devuelve el valor entero
inmediatamente inferior o igual a “n”.
MOD(m,n) Esta función devuelve el resto que se origina al
dividir el valor de “m” entre el valor de “n”.
NVL(valor, expresión) Esta función puede ser utilizada no solo con
valores numéricos, sino con cualquier valor que
sea del mismo tipo, se encarga de sustituir si el
“valor” es nulo por el dato que contenga
“expresión”, en el caso que “valor” no sea nulo,
retorna el valor almacenado allí.
POWER(m,exponente) Esta función devuelve el resultado de elevar
“m” al “exponente”.
ROUND(número,[,m]) Esta función retorna el número redondeado en
“m” decimales. El redondeo puede ser
negativo, por lo que la función lo hará a la
izquierda del punto decimal, si no se coloca
“m”, el número devuelto será un número
redondeado sin decimales.
SIGN(valor) Esta función se encarga de devolver el signo de
“valor”, si es negativo retorna _1, si es positivo
retorna 1.
SQRT(n) Esta función retorna la raíz cuadrada de “n”.
5
ESTE DOCUMENTO CONTIENE LA SEMANA 6
TRUNC(número, [m]) Esta función se encarga de retornar un cierto
número de dígitos, devuelve “número”
truncado a “m” decimales, el valor que se
coloque en “m” puede ser un valor negativo,
para lo cual trunca por la izquierda del punto
decimal, de no colocarse “m”, devuelve a
“número” sin decimales.
A continuación, se expondrán ejemplos para la siguiente tabla previamente creada y con datos
cargados:
6
ESTE DOCUMENTO CONTIENE LA SEMANA 6
Si se quisiera saber cuál es el número entero inmediatamente superior para todas las superficies
de las regiones, se haría lo siguiente:
7
ESTE DOCUMENTO CONTIENE LA SEMANA 6
Si se quisiera saber cuál es el número entero inmediatamente inferior para todas las superficies de
las regiones, se haría lo siguiente:
8
ESTE DOCUMENTO CONTIENE LA SEMANA 6
Si se quisiera devolver las superficies sin decimales y redondeadas, se haría lo siguiente:
9
ESTE DOCUMENTO CONTIENE LA SEMANA 6
1.1.FUNCIONES PARA CADENAS DE CARACTERES
Este tipo de funciones permiten realizar una serie de trabajos sobre las cadenas de caracteres de
acuerdo a lo que se necesite hacer. A continuación, se muestran algunas de las funciones para
cadenas de caracteres existentes:
Función Propósito
Esta función devuelve el carácter ASCII que
CHR(n)
corresponde al número “n”.
Esta función retorna “cad1” concatenada con
CONCAT(cad1, cad2)
“cad2”.
Esta función convierte a letras mayúsculas a
UPPER(cad)
“cad”.
Esta función convierte a letras minúsculas a
LOWER(cad)
“cad”.
Esta función permite agregar los caracteres
“cad2” a “cad1” por el lado izquierdo hasta una
LPAD(cad1,n[,cad2])
longitud total de “cad1” determinada por el
valor de “n”.
Esta función se encarga de convertir la primera
INITCAP(cad)
letra de “cad” a mayúscula
Esta función se encarga de eliminar los
LTRIM(cad [,set]) caracteres “set” ubicados a la izquierda de
“cad”.
Esta función permite agregar caracteres a
RPAD(cad1, n[,cad2]) “cad1” por el lado derecho hasta una longitud
determinada por el valor de “n”.
Esta función se encarga de eliminar los
RTRIM(cad[,set]) caracteres “set” ubicados a la derecha de
“cad”.
Esta función se encarga de sustituir los
REPLACE(cad,cadena_buscada
caracteres de “cadena_buscada” por
[,cadena_sustitucion] )
“cadena_sustitución”.
Esta función se encarga de retornar los
SUBSTR(cad, m[,n])
caracteres desde “m” contando “n” posiciones.
Esta función se encarga de buscar “cad1” en
TRANSLATE(cad1,cad2,cad3)
“cad2” y sustituirlos para devolver “cad3”.
Esta función devuelve la cantidad de caracteres
LENGTH(cad1)
que tiene “cad1”.
10
ESTE DOCUMENTO CONTIENE LA SEMANA 6
Por ejemplo, si se quisiera saber qué carácter ASCII representa el número 64, se haría lo siguiente:
SELECT CHAR(64);
Se obtendría lo siguiente:
Por otro lado, se tiene la siguiente tabla con los siguientes datos:
11
ESTE DOCUMENTO CONTIENE LA SEMANA 6
El resultado sería:
Se obtendría lo siguiente:
12
ESTE DOCUMENTO CONTIENE LA SEMANA 6
Si se quisiera agregar al resultado de la concatenación, la frase “EL NOMBRE DEL EMPLEADO ES”,
seguido del resultado de la concatenación, se haría lo siguiente:
Y se obtendría lo siguiente:
13
ESTE DOCUMENTO CONTIENE LA SEMANA 6
Fuente: material elaborado para esta asignatura (C. Zammarrelli, 2016).
http://goo.gl/DBsaQe
https://goo.gl/R6BUkM
14
ESTE DOCUMENTO CONTIENE LA SEMANA 6
2.1. PRINCIPALES USOS
La consulta SELECT con varias tablas se utiliza cuando es necesario mostrar en un solo reporte o
resultado datos contenidos en varias tablas, y de esta forma consolidar datos ubicados en varios
sitios.
2.2. EJEMPLOS
A continuación, se verá un ejemplo de SELECT con varias tablas, tomando en cuenta que una tabla
registra los datos de los clientes, otra registra las facturas de estos clientes, otra el detalle de
facturas y otra los productos. Las tablas serían:
15
ESTE DOCUMENTO CONTIENE LA SEMANA 6
Fuente: material elaborado para esta asignatura (C. Zammarrelli, 2016).
Y se obtendría lo siguiente:
Existe otra forma de hacer este tipo de consultas, que es utilizando para ello lo conocido como los
JOIN:
16
ESTE DOCUMENTO CONTIENE LA SEMANA 6
SELECT C.RUT, C.NOMBRE, C.APELLIDO, F.ID_FACTURA, F.FECHA, F.MONTO,
D.ID_PRODUCTO, P.DESCRIPCION,D.CANTIDAD, D.PRECIO
FROM CLIENTES C INNER JOIN FACTURAS F INNER JOIN DETALLE_FACTURAS D
INNER JOIN PRODUCTOS P
ON C.RUT = F.RUT_CLIENTE AND F.ID_FACTURA = D.ID_FACTURA AND
D.ID_PRODUCTO = P.ID_PRODUCTO AND C.RUT = '13756987-2';
El más conocido de los JOIN es el INNER, el cual devuelve los registros de las tablas involucradas y
que cumplen con la condición. Gráficamente puede ser entendido así:
INNER JOIN
Tabla 1 Tabla 2
Existe otra consulta JOIN, llamada LEFT JOIN, que devuelve todos los registros de la tabla de la
izquierda, más los que cumplen la condición descrita. Gráficamente se vería así:
LEFT JOIN
Tabla 1 Tabla 2
Por ejemplo, si se quisieran listar todos los clientes, tengan o no facturas, se podría hacer lo
siguiente:
17
ESTE DOCUMENTO CONTIENE LA SEMANA 6
SELECT CLIENTES.RUT, CLIENTES.NOMBRE, CLIENTES.APELLIDO,
FACTURAS.ID_FACTURA, FACTURAS.FECHA, FACTURAS.MONTO
FROM CLIENTES
LEFT JOIN FACTURAS
ON CLIENTES.RUT = FACTURAS.RUT_CLIENTE;
Obteniéndose lo siguiente:
Así como existe un JOIN para mostrar todos los datos de la tabla de la izquierda, más los datos que
cumplan con la condición, también se tiene una instrucción para mostrar los de la derecha. En este
caso se emplea RIGHT JOIN, que gráficamente se vería así:
RIGHT JOIN
Tabla 1 Tabla 2
18
ESTE DOCUMENTO CONTIENE LA SEMANA 6
SELECT CLIENTES.RUT, CLIENTES.NOMBRE, CLIENTES.APELLIDO,
FACTURAS.ID_FACTURA, FACTURAS.FECHA, FACTURAS.MONTO
FROM FACTURAS
RIGHT JOIN CLIENTES
ON CLIENTES.RUT = FACTURAS.RUT_CLIENTE;
Nótese que en el FROM se colocó primero FACTURAS y luego del RIGHT JOIN se colocó CLIENTES,
ya que de esta forma se obtienen todos los clientes (está a la derecha en la consulta) tengan o no
facturas asociadas (campos en null).
https://goo.gl/7WruY7
19
ESTE DOCUMENTO CONTIENE LA SEMANA 6
3. SUBCONSULTAS
Según Ramos, Ramos y Montero (2006), las subconsultas son aquellas sentencias SELECT que se
incluyen en otras cláusulas de una sentencia SELECT previa. Para esto, se debe delimitar entre
paréntesis la subconsulta, y esta se ejecutará primero que la consulta principal.
3.1. TIPOS
Los tipos de subconsultas varían de acuerdo a la cláusula en donde se encuentren. Se tienen:
dentro de un mismo SELECT, dentro de un WHERE y dentro del HAVING. Este último se explicará a
continuación.
Y se obtendría lo siguiente:
20
ESTE DOCUMENTO CONTIENE LA SEMANA 6
3.1.2. SUBCONSULTA EN CLÁUSULA WHERE
Este tipo de subconsulta va a permitir incluir en el WHERE algo que se quiera retornar
específicamente de otra consulta, es decir, basar la sentencia actual en el resultado obtenido en
otra sentencia SELECT. Por ejemplo, si se quisiera mostrar todos los clientes que tengan 1 o más
facturas, esta subconsulta se haría de la siguiente forma:
Si se observa, el resultado obtenido no se muestra al cliente “Nelson” ya que este no cuenta con
facturas registradas.
21
ESTE DOCUMENTO CONTIENE LA SEMANA 6
SELECT RUT_CLIENTE,SUM(MONTO) FROM FACTURAS
GROUP BY RUT_CLIENTE
Obteniendo lo siguiente:
En el caso de que solo se quisieran aquellas sumas de monto que superen los 10.000, es útil el
HAVING, dado que esta cláusula se usa en conjunto con el GROUP BY y permite delimitar esa
agrupación hecha. Para esto se haría lo siguiente:
Y se obtendría lo siguiente:
22
ESTE DOCUMENTO CONTIENE LA SEMANA 6
En el siguiente video se pueden observar ejemplos de
subconsultas en MySQL.
https://goo.gl/VBIAAt
COMENTARIO FINAL
Al finalizar la semana de estudio, se pudieron conocer primeramente las funciones matemáticas
que ofrece SQL, las cuales permiten el trabajo con aquellos datos de tipo numérico que se tengan
almacenados en la base de datos para así trabajar de una mejor forma o bien para cumplir los
requerimientos que se tengan en un determinado momento.
En cuanto a las cadenas de caracteres, el conocer las funciones para el trabajo con ellas, es de gran
utilidad, puesto que siempre va a ser necesario poder transformar o generar a partir de la data
almacenada en la base de datos nuevas cosas, que den repuesta de igual forma a las necesidades
que se tengan.
El tema de consultas con múltiples tablas, así como subconsultas, revisten gran importancia, dado
que nada se hace teniendo información en la base de datos que no pueda ser recuperada o
relacionada con alguna otra sin importar que se encuentren en diferentes tablas.
Conocer estos temas es muy útil para profesionales del área de informática, siendo también de
gran utilidad para el resto de asignaturas que se abordarán en la malla de estudios.
23
ESTE DOCUMENTO CONTIENE LA SEMANA 6
REFERENCIAS
Ramos, M.; Ramos, A. y Montero, F. (2006). Sistemas gestores de bases de datos. Madrid, España:
McGraw-Hill.
IACC (2016). SQL: Lenguaje para la definición, manipulación y control de base de datos relacionales
24
ESTE DOCUMENTO CONTIENE LA SEMANA 6
25
ESTE DOCUMENTO CONTIENE LA SEMANA 6