4.5.1. Operadores lógicos
Los operadores lógicos son AND, OR y NOT. SQL utiliza una lógica booleana
de tres valores y la evaluación de las expresiones con estos operadores es la que
se muestra en la siguiente tabla:
4.5.2. Operadores de comparación
<
Menor que.
>
Mayor que.
<=
Menor o igual que.
>=
Mayor o igual que.
<=
Igual que.
<> !=
Distinto de.
a BETWEEN x AND y
Equivale a: a >= x AND a <= y
a NOT BETWEEN x AND y
Equivale a: a < x OR a > y
a IS NULL
Devuelve True si a es nulo.
a IS NOT NULL
Devuelve True si a es no nulo.
a IN (v1, v2, ...)
Equivale a: a = v1 OR a = v2 OR ...
4.5.3. Operadores matemáticos
+
Suma.
-
Resta.
*
Multiplicación.
/
División (si es entre enteros, trunca el resultado).
%
Resto de la división entera.
ˆ
Potencia (3ˆ2 = 9).
|/
Raíz cuadrada (|/25 = 5).
||/
Raíz cúbica (||/27 = 3).
!
Factorial (5! = 120).
!!
Factorial como operador prefijo (!!5 = 120).
@
Valor absoluto.
No se han incluido en esta lista los operadores que realizan operaciones
sobre tipos de datos binarios.
52
?3
4.5.4. Funciones matemáticas
ABS(x)
Valor absoluto de x.
SIGN(x)
Devuelve el signo de x (-1, 0, 1).
MOD(x,y)
Resto de la división entera de x entre y.
SQRT(x)
Raíz cuadrada de x.
CBRT(x)
Raíz cúbica de x.
CEIL(x)
Entero más cercano por debajo de x.
FLOOR(x)
Entero más cercano por encima de x.
ROUND(x)
Redondea al entero más cercano.
ROUND(x,n)
Redondea x a n dígitos decimales, si n es positivo.
Si n es negativo, redondea al entero más cercano a x
múltiplo de 10n.
TRUNC(x)
Trunca x.
TRUNC(x,n)
Trunca x a n dígitos decimales, si n es positivo.
Si n es negativo, trunca al entero más cercano por debajo de x
múltiplo de 10n.
Además de éstas, se suelen incluir otras muchas funciones para: calcular
logaritmos, convertir entre grados y radianes, funciones trigonométricas, etc.
Se aconseja consultar los manuales del SGBD que se esté utilizando, para
conocer las funciones que se pueden utilizar y cuál es su sintaxis.
4.5.5. Operadores y funciones de cadenas de caracteres
En SQL, las cadenas de caracteres se delimitan por comillas simples: ’abc’.
Los operadores y funciones para trabajar con cadenas son los siguientes:
cadena || cadena
Concatena dos cadenas.
cadena LIKE expr
Devuelve TRUE si la cadena sigue el patrón de la
cadena que se pasa en expr. En expr se pueden
utilizar comodines: _ para un solo carácter y%
para cero o varios caracteres.
LENGTH(cadena)
Número de caracteres que tiene la cadena.
CHAR_LENGTH(cadena)
Es la función del estándar equivalente a LENGTH.
POSITION(subcadena IN cadena)
Posición de inicio de la subcadena en la cadena.
SUBSTR(cadena, n [, long])
Devuelve la subcadena de la cadena que empieza
en la posición n (long fija el tamaño máximo de
la subcadena; si no se especifica, devuelve hasta el
final).
SUBSTRING(cadena FROM n [FOR long])
Es la función del estándar equivalente a SUBSTR:
devuelve la subcadena de la cadena que empieza
en la posición n (long fija el tamaño máximo de
la subcadena; si no se especifica, devuelve hasta
el final).
LOWER(cadena)
Devuelve la cadena en minúsculas.
UPPER(cadena)
Devuelve la cadena en mayúsculas.
BTRIM(cadena)
Elimina los espacios que aparecen por delante y
por detrás en la cadena.
LTRIM(cadena)
Elimina los espacios que aparecen por delante
(izquierda) en la cadena.
RTRIM(cadena)
Elimina los espacios que aparecen por detrás
(derecha) de la cadena.
BTRIM(cadena, lista)
Elimina en la cadena la subcadena formada sólo
por caracteres que aparecen en la lista, tanto por
delante como por detrás.
LTRIM(cadena, lista)
Funciona como BTRIM pero sólo por delante (iz-
quierda).
RTRIM(cadena, lista)
Funciona como BTRIM pero sólo por detrás (de-
recha).
TRIM(lado lista FROM cadena)
Es la función del estándar equivalente a BTRIM
si lado es BOTH, equivalente a LTRIM si lado
es LEADING y equivalente a RTRIM si lado es
TRAILING.
CHR(n)
Devuelve el carácter cuyo código ASCII viene
dado por n.
INITCAP(cadena)
Devuelve la cadena con la primera letra de cada
palabra en mayúscula y el resto en minúsculas.
LPAD(cadena, n, [, c])
Devuelve la cadena rellenada por la izquierda
con el carácter c hasta completar la longitud es-
pecificada por n (si no se especifica c, se rellena
de espacios). Si la longitud de la cadena es de
más de n caracteres, se trunca por el final.
RPAD(cadena, n, [, c])
Devuelve la cadena rellenada por la derecha con
el carácter c hasta completar la longitud especi-
ficada por n (si no se especifica c, se rellena de
espacios). Si la longitud de la cadena es de más
de n caracteres, se trunca por el final.
54
??
4.5.6. Operadores y funciones de fecha
El tipo de datos DATE tiene operadores y funciones, como el resto de tipos.1
En este apartado se muestran aquellos más utilizados, pero se remite al lector
a los manuales del SGBD que esté utilizando para conocer el resto.
En primer lugar se verán las funciones que permiten convertir entre dis-
tintos tipos de datos. Todas ellas tienen la misma estructura: se les pasa un
dato de un tipo, que se ha de convertir a otro tipo según el patrón indicado
mediante un formato.
TO_CHAR(dato, formato)
Convierte el dato de cualquier tipo a cadena de
caracteres.
TO_DATE(dato, formato)
Convierte el dato de tipo cadena a fecha.
TO_NUMBER(dato, formato) Convierte el dato de tipo cadena a número.
A continuación se muestran algunos de los patrones que se pueden especificar
en los formatos:
Conversiones fecha/hora:
HH
Hora del día (1:12).
HH12
Hora del día (1:12).
HH24
Hora del día (1:24).
MI
Minuto (00:59).
SS
Segundo (00:59).
YYYY
Año.
YYY
Últimos tres dígitos del año.
YY
Últimos dos dígitos del año.
Y
Último dígito del año.
MONTH
Nombre del mes.
MON
Nombre del mes abreviado.
DAY
Nombre del día.
DY
Nombre del día abreviado.
DDD
Número del día dentro del año (001:366).
DD
Número del día dentro del mes (01:31).
D
Número del día dentro de la semana (1:7 empezando en domingo).
WW
Número de la semana en el año (1:53).
W
Número de la semana en el mes (1:5).
Q
Número del trimestre (1:4).
1En PostgreSQL se puede escoger el modo de visualizar las fechas mediante SET
DATESTYLE. Para visualizar las fechas con formato día/mes/año se debe ejecutar la orden
SET DATESTYLE TO EUROPEAN, SQL;
55
?6
Conversiones numéricas:Bases de datos - UJI
Conversiones numéricas:
9
Dígito numérico.
S
Valor negativo con signo menos.
.
Punto decimal.
,
Separador de miles.
Cuando el formato muestra un nombre, utilizando en el patrón de forma
adecuada las mayúsculas y minúsculas, se cambia el modo en que se muestra
la salida. Por ejemplo, MONTH muestra el nombre del mes en mayúsculas, Month
lo muestra sólo con la inicial en mayúscula y month lo muestra todo en minús-
culas. Cualquier carácter que se especifique en el formato y que no coincida
con ningún patrón, se copia en la salida del mismo modo en que está escrito.
A continuación se muestran algunos ejemplos:
SELECT TO_CHAR(CURRENT_TIMESTAMP, ’HH12 horas MI m. SS seg.’);
SELECT TO_CHAR(CURRENT_DATE, ’Day, dd of month, yyyy’);
SELECT TO_NUMBER(’-12,454.8’,’S99,999.9’);
Las funciones de fecha más habituales son las siguientes:
CURRENT_DATE
Función del estándar que devuelve la fecha actual
(el resultado es de tipo DATE).
CURRENT_TIME
Función del estándar que devuelve la hora actual (el
resultado es de tipo TIME).
CURRENT_TIMESTAMP
Función del estándar que devuelve la fecha y hora
actuales (el resultado es de tipo TIMESTAMP).
EXTRACT(campo FROM dato)
Función del estándar que devuelve la parte del dato
(fecha u hora) indicada por campo. El resultado es
de tipo DOUBLE PRECISION. En campo se pueden es-
pecificar las siguientes partes:
day: día del mes (1:31)
dow: día de la semana (0:6 empezando en domingo)
doy: día del año (1:366)
week: semana del año
month: mes del año (1:12)
quarter: trimestre del año (1:4)
year: año
hour: hora
minute: minutos
second: segundos
A continuación se muestran algunos ejemplos de uso de estas funciones:
SELECT CURRENT_TIMESTAMP;
SELECT 365 - EXTRACT(DOY FROM CURRENT_DATE) AS dias_faltan;
SELECT EXTRACT(WEEK FROM TO_DATE(’24/09/2008’,’dd/mm/yyyy’));
Para sumar o restar días a una fecha se utilizan los operadores + y -. Por
ejemplo, para sumar siete días a la fecha actual se escribe: CURRENT_DATE+7.
56
?7
4.5.7. Función CASE
Los lenguajes de programación procedurales suelen tener sentencias con-
dicionales: si una condición es cierta entonces se realiza una acción, en caso
contrario se realiza otra acción distinta. SQL no es un lenguaje procedural;
sin embargo, permite un control condicional sobre los datos devueltos en una
consulta, mediante la función CASE.
A continuación se muestra un ejemplo que servirá para explicar el modo
de uso de esta función:
SELECT codart, precio,
CASE WHEN stock > 500 THEN precio*0.8
WHEN stock BETWEEN 200 AND 500 THEN precio*0.9
ELSE precio
END AS precio_con_descuento
FROM
articulos;
Esta sentencia muestra, para cada artículo, su código, su precio y un precio con
descuento que se obtiene en función de su stock: si el stock es superior a 500
unidades, el descuento es del 20% (se multiplica el precio por 0.8), si el stock
está entre las 200 y las 500 unidades, el descuento es del 10% (se multiplica el
precio por 0.9) y si no, el precio se mantiene sin descuento. La columna con el
precio de descuento se renombra (precio_con_descuento). La función CASE
termina con END y puede tener tantas cláusulas WHEN ...THEN como se precise.
4.5.8. Funciones COALESCE y NULLIF
La función COALESCE devuelve el primero de sus parámetros que es no
nulo. La función NULLIF devuelve un nulo si valor1 y valor2 son iguales; si
no, devuelve valor1. La sintaxis de estas funciones es la siguiente:
COALESCE( valor [, ...] )
NULLIF( valor1, valor2 )
Ambas funciones se transforman internamente en expresiones equivalentes con
la función CASE.
Por ejemplo, la siguiente sentencia:
SELECT codart, descrip,
COALESCE(stock, stock_min, -1)
FROM
articulos;
es equivalente a esta otra:
SELECT codart, descrip,
CASE WHEN stock IS NOT NULL THEN stock
WHEN stock_min IS NOT NULL THEN stock_min
ELSE -1 END
FROM
articulos;
Del mismo modo, la siguiente sentencia:
SELECT codart, descrip,
NULLIF(stock, stock_min)
FROM
articulos;
es equivalente a esta otra:
SELECT codart, descrip,
CASE WHEN stock=stock_min THEN NULL
ELSE stock END
FROM
articulos;
Hay que tener siempre mucha precaución con las columnas que aceptan nu-
los y tratarlos adecuadamente cuando se deba hacer alguna restricción (WHERE)
sobre dicha columna.
4.5.9. Ejemplos
Ejemplo 4.1 Se quiere obtener un listado con el código y la fecha de las fac-
turas del año pasado que pertenecen a clientes cuyo código está entre el 50 y
el 80. El resultado debe aparecer ordenado por la fecha, descendentemente.
Al consultar la descripción de la tabla de FACTURAS puede verse que la columna
fecha es de tipo DATE. Por lo tanto, para obtener las facturas del año pasado
se debe obtener el año en curso (CURRENT_DATE) y quedarse con aquellas cuyo
año es una unidad menor. El año de una fecha se obtiene utilizando la función
EXTRACT tal y como se muestra a continuación.
SELECT codfac, fecha
FROM
facturas
WHERE
EXTRACT(year FROM fecha) =
EXTRACT(year FROM CURRENT_DATE)-1
AND
codcli BETWEEN 50 AND 80
ORDER BY fecha DESC;
Ejemplo 4.2 Mostrar la fecha actual en palabras.
SELECT TO_CHAR(CURRENT_DATE,’Day, dd of month of yyyy’);
Al ejecutar esta sentencia se observa que quedan huecos demasiado grandes
entre algunas palabras:
Sunday
, 20 of july
of 2008
Esto es así porque para la palabra del día de la semana y la palabra del mes se
está dejando el espacio necesario para mostrar la palabra más larga que puede
ir en ese lugar. Si se desea eliminar los blancos innecesarios se debe hacer uso
de la función RTRIM.
SELECT RTRIM(TO_CHAR(CURRENT_DATE, ’Day’)) ||
RTRIM(TO_CHAR(CURRENT_DATE, ’, dd of month’)) ||
TO_CHAR(CURRENT_DATE, ’ of yyyy’);
Sunday, 20 of july of 2008
Ejemplo 4.3 Se quiere obtener un listado con los códigos de los vendedores
que han hecho ventas al cliente cuyo código es el 54.
La información que se solicita se extrae de la tabla de FACTURAS: el código de
vendedor de las facturas de dicho cliente. Puesto que el cliente puede tener
varias facturas con el mismo vendedor (codven no es clave primaria ni clave
alternativa en esta tabla), se debe utilizar el modificador DISTINCT.
SELECT DISTINCT codven
FROM
facturas
WHERE
codcli = 54;
Es muy importante saber de antemano cuándo se debe utilizar el modificador
DISTINCT.
4.6. Operaciones sobre conjuntos de filas

No hay comentarios:
Publicar un comentario