SQL Chema Tema
SQL Chema Tema
En este manual en muchos apartados se indica la sintaxis de sentencias y cláusulas. Esta sintaxis sirve
para aprender a utilizar dichas sentencias y cláusulas, es decir, indica la forma en la que deben escribirse.
Ejemplo de sintaxis:
Los ejemplos sirven para escenificar una instrucción concreta, la sintaxis se utiliza para indicar la forma
de utilizar una sentencia o cláusula.
Para indicar la sintaxis de una sentencia se usan símbolos especiales. Los símbolos que utiliza este libro
(de acuerdo con la sintaxis que se utiliza normalmente en cualquier documentación de este tipo) son:
• PALABRA: Cuando en la sintaxis se utiliza una palabra en negrita y en azul, significa que es una
palabra que hay que escribir literalmente (aunque sin importar si en mayúsculas o minúsculas).
• Texto: El texto que aparece en color normal sirve para indicar que no hay que escribirlo
literalmente, sino que se refiere a un tipo de elemento que utiliza en la sentencia, por ejemplo,
una tabla, un nombre de columna, etc. Ejemplo:
Aquí el texto columna hay que cambiarlo por un nombre concreto de columna (nombre,
apellidos,...), al igual que tabla se refiere a un nombre de tabla concreto.
• [ ] (corchetes). Los corchetes sirven para encerrar texto que no es obligatorio en la instrucción,
es decir, para indicar una parte opcional.
• | (barra vertical). Este símbolo (|), la barra vertical, indica opción. Las palabras separadas con
este signo indican que se debe elegir una de entre todas las palabras.
• ... (puntos suspensivos) Indica que se puede repetir el texto anterior en la instrucción
continuamente (significaría, y así sucesivamente)
• {} (llaves) Las llaves sirven para indicar opciones mutuamente exclusivas pero obligatorias. Es
decir, opciones de las que sólo se puede elegir una opción, pero de las que es obligado elegir
una.
Ejemplo:
El ejemplo anterior indicaría que se debe elegir obligatoriamente el asterisco o un nombre de columna o
una expresión. Si las llaves del ejemplo fueran corchetes, entonces indicarían que incluso podría no
aparecer ninguna opción. Por otro lado, es obligatorio indicar al menos una tabla desde la que consultar,
pero puedes indicar dos o más tablas.
2. INTRODUCCIÓN
2.1. DEFINICIÓN
SQL es el lenguaje fundamental de los SGBD relacionales. Se trata de uno de los lenguajes más
utilizados de la historia de la informática. Es sin duda el lenguaje fundamental para manejar una
base de datos relacional.
SQL es un lenguaje declarativo en lo que lo importante es definir qué se desea hacer, por encima de
cómo hacerlo (que es la forma de trabajar de los lenguajes de programación de aplicaciones como C
o Java). Con este lenguaje se pretendía que las instrucciones se pudieran escribir como si fueran
órdenes humanas; es decir, utilizar un lenguaje lo más natural posible. De ahí que se le considere un
lenguaje de cuarta generación.
Se trata de un lenguaje que intenta agrupar todas las funciones que se le pueden pedir a una base
de datos, por lo que es el lenguaje utilizado tanto por administradores como por programadores o
incluso usuarios avanzados.
2.2. HISTORIA
El nacimiento del lenguaje SQL data de 1970 cuando E. F. Codd publica su libro: "Un modelo de
datos relacional para grandes bancos de datos compartidos". Ese libro dictaría las directrices de las
bases de datos relacionales. Apenas dos años después IBM (para quien trabajaba Codd) utiliza las
directrices de Codd para crear el Standard English Query Language (Lenguaje Estándar Inglés para
Consultas) al que se le llamó SEQUEL. Más adelante se le asignaron las siglas SQL (Standard Query
Language, lenguaje estándar de consulta) aunque en inglés se siguen pronunciando secuel. En
español se pronuncia esecuele.
En 1979 Oracle presenta la primera implementación comercial del lenguaje. Poco después se
convertía en un estándar en el mundo de las bases de datos avalado por los organismos ISO y ANSI.
En el año 1986 ANSI LO toma como lenguaje estándar de los SGBD relacionales. Un año después lo
adopta ISO, lo que convierte a SQL en estándar mundial como lenguaje de bases de datos
relacionales.
El proceso es el siguiente:
• Se comprueba que la sintaxis de la sentencia es correcta.
• Se comprueba consultado el diccionario de datos que los metadatos (nombre de columnas,
nombre de tablas, etc.) de la sentencia son correctos.
• Se optimiza la sentencia a fin de consumir los mínimos recursos posibles.
• Se ejecuta la sentencia y se muestra el resultado de la misma.
La razón de utilizar Oracle como base de trabajo se debe a su respeto por SQL estándar (aunque
desde luego no tan estricto como PostgreSQL), es decir, que no es excesivamente diferente; pero
fundamentalmente por ser el SGBD de referencia más importante desde hace ya muchos años. De
hecho, lo que Oracle aporta de novedoso en cada versión, acaba formando parte del estándar
futuro.
• FROM: cláusula que permite indicar la tabla o tablas donde vamos a consultar los datos.
• tabla n: tablas de la base de datos.
• *: para indicar que se quieren seleccionar todas las columnas de la/s tablas.
• columnasExpresiones: tiene a su vez esta sintáxis:
[DISTINCT] {col1 | exp1} [ [AS] alias] [,{col2 | exp2} [ [AS] alias] [,…] ]
donde:
Ejemplos:
/*Operador aritmético*/
SELECT nombre, precio,precio*1.16 FROM articulos;
/*Alias*/
SELECT nombre, precio, precio*1.16 AS precio_con_iva
FROM articulos;
[WHERE condición/es]
donde condición puede ser:
• Predicado de comparación:
Operando operador de comparación operando
(columna o expresión) (>, <, >=, <=, =, <>, !=) (columna, valor o
expresión)
Ejemplo:
/*Obtiene todos los tipos y modelos para los que precio es mayor a 3*/
SELECT Tipo, Modelo FROM Pieza
WHERE Precio>3;
• Predicado BETWEEN:
Columna BETWEEN valor1 AND valor2
Obtenemos las tuplas para las que el valor de la columna indicada está en el rango de
valores indicados por valor1 y valor2.
Ejemplo:
/*Obtiene los tipos, modelos y precios de aquellas piezas cuyo precio sea mayor o
igual a 3 y menor o igual a 8*/
SELECT tipo, modelo, precio FROM piezas
WHERE precio BETWEEN 3 AND 8;
• Predicado IN:
Columna IN(valor1, valor2, …)
Obtenemos las tuplas para las que el valor de la columna indicada está en la lista de valores.
Ejemplo:
/*Obtiene los tipos, modelos y precios de aquellas piezas cuyos precios sean 3, 5 u
8*/
SELECT tipo, modelo, precio FROM piezas
WHERE precio IN (3, 5, 8);
• Predicado LIKE:
Columna LIKE ‘cadena’
Obtenemos las tuplas para las que columna cumple la expresión indicada en cadena. En
‘cadena’ pueden usarse los comodines % y _.
o % hace referencia a una serie cualquiera de caracteres.
o _ hace referencia a un carácter cualquiera.
Ejemplo:
Muchas veces es equivalente usar el operador = y el LIKE con cadenas, pero se recomienda
acostumbrarse a usar siempre LIKE para cadenas y el operador = para números ya que con
el operador = no funcionan los comodines % y _.
• Predicado IS NULL:
Columna IS NULL
Ejemplo:
/*Obtiene el nombre y apellido de las personas para las que teléfono es nulo (no
está informado)*/
SELECT nombre, apellidos FROM personas
WHERE telefono IS NULL;
4.2.2. Predicados NOT
Los predicados BETWEEN, IN, LIKE Y IS NULL tienen sus correspondientes predicados opuestos,
usando la palabra NOT.
• NOT BETWEEN: Obtenemos las tuplas para las que el valor de la columna indicada NO está
en el rango de valores indicados por valor1 y valor2.
• NOT IN: Obtenemos las tuplas para las que el valor de la columna indicada NO está en la lista
de valores
• NOT LIKE: Obtenemos las tuplas para las que columna NO cumple la expresión indicada en
cadena.
• IS NOT NULL: Obtenemos las tuplas para las que el valor de columna NO es nulo.
Ejemplo:
/*Obtiene los tipos, modelos y precios de aquellas piezas cuyos precios no sean 3, 5 ni 8*/
SELECT tipo, modelo, precio FROM piezas
WHERE precio NOT IN (3, 5, 8);
/*Obtiene el nombre y apellido de las personas que tengan informado el campo teléfono*/
SELECT nombre, apellidos FROM personas
WHERE telefono IS NOT NULL;
Cuando hay que indicar varias condiciones se deben usar los operadores AND u OR:
Ejemplos:
El orden inicial de los registros obtenidos por un SELECT no es más que el orden en el que fueron
introducidos. Para ordenar en base a criterios más interesantes, se utiliza la cláusula ORDER BY. Sirve
por lo tanto para ordenar las tuplas devueltas.
En esa cláusula se coloca una lista de campos que indica la forma de ordenar. Se ordena primero por
el primer campo de la lista, si hay coincidencias por el segundo, si ahí también las hay por el tercero,
y así sucesivamente.
Se puede colocar las palabras ASC O DESC (por defecto se toma ASC). Esas palabras significan
ordenar ascendentemente (de la A a la Z, de los números pequeños a los grandes) o
descendentemente (de la Z a la A, de los números grandes a los pequeños) respectivamente.
Sintaxis:
[ORDER BY {col1 | expre1} [ASC | DESC] [, {col2 |exp2} [ASC | DESC]] [,...] ]
Ejemplo:
/*Muestra todos los empleados ordenado primero por edad y para los que tengan la misma
edad ordenados por sueldo*/
SELECT * FROM EMPLE
ORDER BY EDAD, SUELDO DESC;
4.4. FUNCIONES
Todos los SGBD implementan funciones para facilitar la creación de consultas complejas. Esas
funciones dependen del SGBD que utilicemos. Las que aquí se comentan son algunas de las que se
utilizan con Oracle.
Todas las funciones devuelven un resultado que procede de un determinado cálculo. La mayoría de
funciones precisan que se les envíe datos de entrada (parámetros o argumentos) que son necesarios
para realizar el cálculo de la función. Este resultado, lógicamente depende de los parámetros
enviados. Dichos parámetros se pasan entre paréntesis. La sintaxis para realizar una llamada (usarla)
a una función es:
nombreFunción[(parámetro1[, parámetro2,...])]
Si una función no precisa parámetros (como SYSDATE) no hace falta colocar los paréntesis.
Oracle proporciona una tabla llamada dual con la que se permiten hacer pruebas. Esa tabla tiene un
solo campo (llamado DUMMY) y una sola fila de modo que es ideal para hacer pruebas con
funciones. Por ejemplo la consulta SELECT SQRT(5) FROM DUAL; mostrará una celda con el
contenido de ese cálculo (la raíz cuadrada de 5).
En los siguientes apartados se describen algunas de las funciones más interesantes distinguiendo
entre funciones matemáticas, de cadenas de caracteres, de listas, de manejo de nulos y de manejo
de fechas.
4.4.1. Funciones matemáticas
Función Descripción
ROUND(n, decimales) Redondea el número al siguiente número con el número de decimales
indicado más cercano. ROUND(8.239,2) devuelve 8.24.
TRUNC(n, decimales) Los decimales del número se cortan para que sólo aparezca el número de
decimales indicado.
CEIL(n) Devuelve el techo de n: el menor de los enteros mayores a n.
FLOOR(n) Devuelve el suelo de n: el mayor de los enteros menores a n.
MOD(m,n) Devuelve el resto de la división entera de m entre n.
POWER(m,exponente) Devuelve la m elevado a exponente.
SQRT(n) Devuelve la raíz cuadrada de n.
SIGN(valor) Devuelve 1 si n es positivo, cero si vale cero y -1 si es negativo.
ABS(n) Devuelve el valor absoluto de n
Función Descripción
LOWER(texto) Convierte el texto a minúsculas.
UPPER(texto) Convierte el texto a mayúsculas.
INITCAP(texto) Coloca la primera letra de cada palabra del texto en mayúsculas.
RTRIM(texto) Elimina los espacios a la derecha del texto (si los tiene).
LTRIM(texto) Elimina los espacios a la izquierda del texto (si los tiene).
TRIM(texto) Elimina los espacios en blanco a la izquierda y la derecha del
texto.
TRIM(caracter FROM texto) Elimina del texto los caracteres indicados siempre que estén al
principio o al final de texto. Por ejemplo TRIM('h' FROM nombre)
elimina las haches de la columna nombre que estén a la izquierda
y a la derecha.
Si no lo encuentra devuelve 0.
REPLACE(texto, textoABuscar, Buscar el texto a buscar en un determinado texto y lo cambia por
[textoReemplazo]) el indicado como texto de reemplazo.
Si no se indica texto de reemplazo, entonces está función elimina
el texto a buscar.
LPAD(texto, anchuraMáxima, Rellena el texto a la izquierda con el carácter indicado para ocupar
[caracterDeRelleno]) la anchura indicada.
Ejemplo: LPAD(‘Hola‘,10,‘-‘)
Da como resultado:
------Hola
Función Descripción
GREATEST (valor1,valor2,...) Devuelve el mayor de los valores pasados como parámetros.
LEAST (valor1,valor2,...) Devuelve el menor de los valores pasados como parámetros.
Permiten definir valores a utilizar en el caso de que las expresiones tomen el valor nulo.
Función Descripción
NVL (valor,sustituto) Si valor es NULL devuelve sustituto y si no devuelve valor.
NVL2(valor,sustituto1, sustituto2) Devuelve sustituto1 si valor no es nulo. Si valor es nulo
devuelve sustituto2.
Función Descripción
SYSDATE Obtiene la fecha y hora actuales.
SYSTIMESTAMP Obtiene la fecha y hora actuales en formato TIMESTAMP (hasta
fracciones de segundo).
ADD_MONTHS(fecha, n) Añade a fecha el número de meses indicado por n.
MONTHS_BETWEEN(fecha1, Obtiene la diferencia en meses de las dos fechas (dará un número
fecha2) decimal, si el día no coincide).
NEXT_DAY(fecha, día) En día se puede indicar ‘Lunes’, ‘Martes’, etc. o 1, 2, etc. y te
devolverá el próximo día indicado a partir de la fecha indicada.
LAST_DAY(fecha) Obtiene el último día del mes de la fecha indicada. Devuelve una
fecha.
EXTRACT(valor FROM fecha) Valor puede ser day (día), month (mes) o year (año) y extrae el día,
mes o año de la fecha indicada (extrae un valor numérico).
GREATEST(fecha1, fecha2,..) Devuelve la fecha más actual la lista.
LEAST(fecha1, fecha2,..) Devuelve la fecha más antigua la lista.
ROUND(fecha, formato) Redondea la fecha según el formato indicado. El formato puede ser:
• 'YEAR': Redondea el año.
Devuelve: 01/01/18
Devuelve: 01/01/18
Devuelve: 01/10/17
Devuelve: 01/11/17
Devuelve: 18/10/17
Devuelve: 17/10/17
TRUNC(fecha, formato) Igual que el anterior pero trunca la fecha en lugar de redondearla.
Hay que tener en cuenta que a los valores de tipo fecha se les pueden sumar números y Oracle
lo interpretaría que esta suma es de días. Si tiene decimales entonces se suman días, horas,
minutos y segundos. Por otro lado, cuando hacemos una diferencia entre dos fechas Oracle
también nos devuelve un número de días entre ambas.
4.4.6. Funciones conversión
Oracle es capaz de convertir datos automáticamente a fin de que la expresión final tenga
sentido. En ese sentido son fáciles las conversiones de texto a número y viceversa. Ejemplos:
• TO_CHAR:
Obtiene un texto a partir de un número o una fecha. En especial se utiliza con fechas, ya
que de número a texto se suele hacer de forma implícita (automática).
En el caso de las fechas se indica el formato de conversión, que es una cadena de texto
que puede incluir estos símbolos y que marcará el aspecto de la fecha al convertirse:
Símbolo Significado
YY Año en formato de dos cifras.
YYYY Año en formato de cuatro cifras.
MM Mes en formato de dos cifras.
MON Las tres primeras letras del mes.
MONTH Nombre completo del mes.
DY Día de la semana en tres letras.
DAY Día completo de la semana.
D Día de la semana (del 1 al 7).
DD Día en formato de dos cifras.
DDD Día del año.
Q Semestre.
WW Semana del año.
AM Indicador AM.
PM Indicador PM.
HH12 Hora de 1 a 12.
HH24 Hora de 0 a 23.
MI Minutos (0 a 59).
SS Segundos (0 a 59).
SSSS Segundos desde medianoche.
/ . ,:;’- Separadores. Donde se pongan estos símbolos aparecerán en
el resultado.
Ejemplo:
Convierte textos en fechas. Como segundo parámetro se utilizan los códigos de formato
de fechas comentados anteriormente.
Ejemplo:
Por ejemplo, si tuviéramos que insertar en una tabla alumnos valores para una columna
de tipo DATE pues ser haría de la siguiente forma: