Tema 3
Fundamentos de SQL
Introducción
• SQL. Structured Query Language. 1970 Codd.
Consultas, actualizaciones, definicion de datos y
control en BD.
• Para administradores, desarrolladores y usuarios.
• Se especifica que se quiere, no donde ni como.
• Interactivamente, introduciendo las órdenes desde
terminal, se obtienen resultados.
• Embebido en PL/SQL o Java, por ejemplo.
Tipos de Sentencias SQL
• DML
– SELECT, UPDATE, DELETE, INSERT
• DDL
– CREATE, DROP, ALTER TABLE.
– CREATE,….., VIEW.
– CREATE,…., INDEX.
– CREATE, …., SYNONYM
• DCL
– GRANT, REVOKE (conceder, suprimir privilegios)
– COMMIT, ROLLBACK
Proceso de sentencia por SGBD
1. Análisis. Errores sintácticos.
2. Valida la sentencia. Comprueba que
existan las tablas, columnas referenciadas,
privilegios del usuario.
3. Optimiza la sentencia.
4. Genera un plan de aplicación para la
sentencia. Genera código ejecutable.
5. Ejecuta el plan de aplicación.
Tipos de Datos en SQL
VARCHAR2(tamaño), cadenas long variable, max 4000 bytes
CHAR(tamaño) cadenas long fija, max 2000 bytes
NUMBER(precision, escala)
LONG, cadenas long variable, max 2 gigabytes
DATE, fechas, siglo/año/mes/dia/hora/minutos/segundos
RAW(tamaño), cadenas de bytes, máximo 2000bytes.
LONG RAW, graficos, sonidos, 2 gigabytes.
ROWID, cadena hexadecimal, direccion de fila en tabla.
CLOB, NCLOB, BLOB,
Operadores en SQL
Aritméticos. +, -, *, /
SELECT ename, sal + NVL(comm, 0)
FROM emp;
Comparación. =, >, >=, <, <=, <>, !=
Lógicos. NOT, AND , OR
SELECT ename, job, sal
FROM emp
WHERE sal > 2000 AND job = ‘CLERK’;
iSQL*Plus
• Version web del SQL*Plus, se instala en el
servidor con la BD.
• Permite ejecutar sentencias SQL y PL/SQL a
través de un navegador web en el que se indica la
dirección URL del servidor.
• Las salidas se generan en formato HTML.
• Conectamos, abrimos navegador web ( Internet
Explorer) y escribimos la URL
• http://nombre_servidor:5560/isqlplus, nos pide
usuario, contraseña y cadena de conexión
iSQL*Plus
• Área de trabajo, varios hipervínculos en la parte
superior, botones en la parte inferior.
• Ejecutar
• Cargar fichero comandos .sql
• Guardar fichero comandos .sql
• Cancelar
• Limpiar
• Desconectar
• Preferencias
• Ayuda
• Historial.
Consulta de datos
SELECT [ALL | DISTINCT]
[colum1, ..column | *]
FROM tabla1, .., tablan
[WHERE condicion]
[ORDER BY colum1 [DESC | ASC],
colum1 [DESC | ASC],…]
;
Consulta de datos
• FROM, obligatoria, se especifican las tablas
donde está la información necesaria.
– SELECT * FROM emp;
• Si el usuario no es propietario de las tablas
– SELECT * FROM usuario.emp;
• Se puede poner alias a las tablas
– SELECT * FROM emp e;
Consulta de datos
• WHERE condición
– expresión operador expresión
• Operadores
– IN, NOT IN, BETWEEN, NOT BETWEEN, LIKE
• Condiciones múltiples
– AND, OR, NOT y ( )
• SELECT ename FROM EMP where SAL > 1000;
– WHERE (SAL > 1000) AND (COMM IS NOT NULL)
– WHERE (comm IS NULL) AND (UPPER(ENAME)
=‘MARY’)
Consulta de datos
• ORDER BY colum [ASC |DESC], …
– Por defecto es ASC.
– SELECT ename FROM emp ORDER BY sal *
12;
• si tiene 2 o más criterios de ordenación, el
principal es el más a la izquierda y dentro de este
los siguientes.
SELECT ename, job, sal * 12 AS salario_anual
FROM emp
ORDER BY job ASC, sal * 12 DESC;
Consulta de datos
• ALL, recupera todas las filas, opción por
defecto.
• DISTINCT, recupera las filas distintas.
SELECT DISTINCT deptno
FROM emp;
SELECT DISTINCT sal
FROM emp;
Proyección
SELECT [ALL|DISTINCT]
colum1, ..column
FROM tabla1,…tablan;
Todas las columnas
SELECT empno, ename,…
FROM EMP;
SELECT * FROM emp;
Algunas columnas
SELECT deptno, dname from dept;
Selección de filas
• Es necesaria la clausula: WHERE condicion.
SELECT ename, job, mgr
FROM emp
WHERE deptno = 10
ORDER BY job, ename;
SELECT *
FROM emp
WHERE job = ‘CLERK’ AND deptno = 10
ORDER BY deptno, ename;
ALIAS a columnas
• Si el nombre (aparece como cabecera ) de la
columna resulta demasiado largo, corto o
críptico, se puede hacer uso de los alias.
SELECT ename “nombre empleado”,
dname “nombre departamento”
FROM emp e, dept d
WHERE e.deptno = d.deptno;
Comparación de cadenas
=, para comparar cadenas enteras.
Si deseamos los empleados que empiezan
por‘P’, usaremos LIKE y los comodines
% cualquier cadena de 0 o más caracteres.
- Cualquier carácter en la posición donde se
encuentre el –
En c. WHERE columna LIKE ‘cadena_car’
Comparación de cadenas
LIKE ‘ANALYST’
LIKE ‘M%’
LIKE ‘%X%’
LIKE ‘_ _M’
LIKE ‘N _’
LIKE ‘_ R%’
Se distinguen mayúsculas de las minúsculas
NULL, NOT NULL
NULL, columna vacía
SELECT ename
FROM emp
WHERE comm IS NULL;
NOT NULL, columna llena
SELECT ename
FROM emp
WHERE comm IS NOT NULL;
Pertenencia a un conjunto
• Operador IN. comprueba si una expresión pertenece o no a
un conjunto de valores.
• Formato:
Expresion [NOT] IN ( lista de valores)
SELECT ename
FROM emp
WHERE deptno IN (10, 20);
SELECT ename FROM emp
WHERE deptno NOT IN (30, 40);
Pertenencia a un rango
• BETWEEN, comprueba si un valor o no está
comprendido en un rango de valores.
• Formato:
Expresion [NOT] BETWEEN valor_inicial
AND valor_final
SELECT ename FROM emp
WHERE sal BETWEEN 1000 and 2000;
SELECT ename FROM emp WHERE sal
NOT BETWEEN 1000 AND 2000;
Combinación AND, OR y NOT
• Orden de prioridad en la evaluación :
NOT AND OR
SELECT ename, sal, deptno from emp
WHERE sal > 2000
AND (deptno = 10 OR deptno = 20);
La misma sin paréntesis que significaría?
Como sería con IN?
Subconsultas
Consultas que forman parte de WHERE en
otra SELECT
SELECT …………… FROM ………
WHERE columna
operador_comparacion
(SELECT ….
WHERE…
);
Subconsultas
Obtén los nombres de los empleados con el
mismo oficio que Gil.
SELECT job FROM emp
WHERE ename = ‘Gil’;
SELECT ename FROM emp
WHERE job = ‘ANALYST’;
SELECT ename FROM emp
WHERE job = (SELECT job FROM emp
WHERE ename = ‘Gil’);
Ejercicio
• Muestra nombre, oficio, salario y fecha de
ingreso de los empleados que tengan el
mismo oficio que JAMES o que tengan un
salario mayor o igual que MILLER.
Condiciones de búsqueda en subconsultas
• Las subconsultas aparecen como parte de
una condición de búsqueda de una cláusula
WHERE o HAVING.
• Las condiciones de búsqueda son:
– Test de comparación en subconsultas(<, >..)
– Test de pertenencia a un conjunto de valores
(IN).
– Test de existencia (EXISTS, NO EXISTS).
– Test de comparación cuantificada (ANY, ALL).
Condiciones de búsqueda en subconsultas
Test de comparación en subconsultas(<, >, =,
>=, <=, <>, !=). Compara el valor de una expresión
con un valor único producido por una subconsulta.
SELECT ename
FROM emp
WHERE job = (SELECT job
FROM emp
WHERE ename = ‘JAMES’);
Condiciones de búsqueda en subconsultas
Test de pertenencia a un conjunto de valores
(IN). Comprueba el valor de una expresión
con uno de los valores producido por una
Subconsulta.
SELECT ename
FROM emp
WHERE job IN (SELECT job
FROM emp
WHERE deptno = 20);
Condiciones de búsqueda en subconsultas
Test de existencia (EXISTS, NO EXISTS).
Examina si una subconsulta produce alguna fila
de resultado(TRUE o FALSE)
SELECT dname
FROM dept
WHERE EXISTS (SELECT *
FROM emp
WHERE emp.deptno =
dept.deptno);
Condiciones de búsqueda en subconsultas
Test de comparación cuantificada (ANY,
ALL). Se usan junto a <, >..
ANY, compara el valor de una expresión con
cada uno del conjunto de valores producido
por una subconsulta, si alguna de las
comparaciones devuelve TRUE, ANY
devuelve TRUE, si la subconsulta no
devuelve nada, devolverá FALSE.
Condiciones de búsqueda en subconsultas
ANY, ejemplo
SELECT *
FROM emp
WHERE sal = ANY
(SELECT sal
FROM emp
WHERE deptno = 30);
Condiciones de búsqueda en subconsultas
ALL, compara el valor de una expresión con
cada uno del conjunto de valores producido
por una subconsulta, si todas las
comparaciones devuelven TRUE, ALL
devuelve TRUE, en caso contrario, devolverá
FALSE.
Condiciones de búsqueda en subconsultas
ALL, ejemplo.
SELECT *
FROM emp
WHERE sal < ALL
(SELECT sal
FROM emp
WHERE deptno = 30);
Subconsultas que generan valores simples
Devuelven una fila o valor simple, se usan <,
>.., si la subconsulta produce más de un valor
se origina un error.
SELECT ename
FROM emp
WHERE job = (SELECT job
FROM emp
WHERE deptno = 20);
Subconsultas que generan listas de valores
Devuelven más de una fila o más de un valor,
usaremos el operador IN en la c. WHERE.
SELECT ename
FROM emp
WHERE job IN (SELECT job
FROM emp
WHERE deptno = 20);
Ejemplo
Visualizar los datos de los empleados que trabajan
en DALLAS o CHICAGO
SELECT *
FROM emp
WHERE deptno IN
(SELECT deptno
FROM dept
WHERE loc IN
(‘DALLAS’, ‘CHICAGO’));
Ejemplo
Consulta los nombres y oficios de los empleados del
departamento 20 cuyo oficio sea igual al de cualquiera de
los empleados del departamento SALES.
SELECT ename, job
FROM emp
WHERE deptno = 20
AND job IN (SELECT job
FROM emp
WHERE deptno = (SELECT deptno
FROM dept
WHERE dname =‘SALES’));
Ejemplo
Consulta los apellidos de los empleados con
el mismo oficio y salario que JAMES.
SELECT ename, sal
FROM emp
WHERE (job, sal) =
(SELECT job, sal
FROM emp
WHERE ename = ‘JAMES’);
Ejemplo
El mismo de otra forma
SELECT ename, sal
FROM emp
WHERE job =(SELECT job
FROM emp
WHERE ename = ‘JAMES’)
AND sal =(SELECT sal
FROM emp
WHERE ename = ‘JAMES’);
Combinación de tablas
A veces las consultas necesitan datos de 2 o
más tablas, se indican a continuación de
FROM.
Formato:
SELECT columnas de las tablas
FROM tabla1, tabla2…
WHERE tabla1.columna1 =
tabla2.columna2;
Combinación de tablas
Reglas:
Se pueden unir tantas tablas como deseemos.
En SELECT se pueden citar columnas de
todas las tablas.
Si hay columnas con el mismo nombre en
varias tablas, se pueden especificar como:
Nombre_tabla.nombre_columna.
La condicion de combinación se especifica en
WHERE. Si se omite se obtiene el producto
cartesiano.
Combinación de tablas
Consultar nombre de empleados, salario,
nombre del departamento al que pertenecen y
localidad de este.
SELECT ename, sal, dname, loc
FROM emp e, dept d
WHERE e.deptno = d.deptno;
Ejercicios
• Visualiza los nombres de los empleados con
un salario entre 500 y 1000, cuyo oficio sea
MANAGER.
• Visualiza los nombres de los departamentos
que no tengan empleados.
• Visualiza los nombres de los departamentos
que tengan algún empleado.
Funciones en SQL
• Funciones: Se usan con expresiones y
actúan con valores de columnas, variables
y ctes. Se usan en cláusulas SELECT,
WHERE Y ORDER BY.
• Hay 5 tipos:
– Aritméticas.
– De cadena de caracteres.
– De manejo de fechas.
– De conversión.
– Otras funciones.
Funciones aritméticas
• De valores simples:
ABS(n)= Devuelve el valor absoluto de (n).
CEIL(n)=Obtiene el valor entero inmediatamente superior o igual a "n".
FLOOR(n) = Devuelve el valor entero inmediatamente inferior o igual a "n".
MOD (m, n)= Devuelve el resto resultante de dividir "m" entre "n".
NVL (valor, expresión)= Sustituye un valor nulo por otro valor.
POWER (m, exponente)= Calcula la potencia de un numero.
ROUND (numero [, m])= Redondea números con el numero de decimales indicado.
SIGN (valor)= Indica el signo del "valor".
SQRT(n)= Devuelve la raíz cuadrada de "n".
TRUNC (numero, [m])= Trunca números para que tengan una cierta cantidad de decimales
VARIANCE (valor)= Devuelve la varianza de un conjunto de valores.
Ejemplos
SELECT ename, sal, ABS(sal - 10000) from emp;
SELECT CEIL(20.3), CEIL(16), CEIL(-20.3), CEIL(-16) FROM DUAL ;
SELECT FLOOR(20.3), FLOOR(16), FLOOR(-20.3), FLOOR(-16)
FROM DUAL ;
SELECT MOD(11,4), MOD(10, -15), MOD(-10, -3), MOD(10.4, 4.5)
FROM DUAL;
SELECT SAL, COMM, (SAL + NVL(COMM, 0)) FROM EMP;
SELECT POWER(2, 4), POWER(2, -4), POWER(3.5, 2.4),
POWER(4.5, 2) FROM DUAL;
SELECT ROUND(1.56, 1), ROUND(1.56), ROUND(1.2234, 2),
ROUND(1.2676, 3) FROM DUAL;
SELECT ROUND(145.5, -1), ROUND(145.5, -2), ROUND(145.5, -3),
ROUND(141, -1), ROUND(145, -1) FROM DUAL;
Ejemplos
SELECT SIGN(-10), SIGN(10) FROM DUAL;
SELECT SQRT(25), SQRT(25.6) FROM DUAL;
SELECT TRUNC(1.5634, 1), TRUNC(1.1684, 2),
TRUNC(1.662) FROM DUAL;
SELECT TRUNC(187.98, -1), TRUNC(187.98, -2),
TRUNC(187.98, -3) FROM DUAL;
Funciones aritméticas
Funciones de grupos de valores:
AVG(n)= Calcula el valor medio de "n" ignorando los valores nulos.
COUNT (* | Expresión)= Cuenta el numero de veces que la
expresión evalúa algún dato con valor no nulo. La opción "*" cuenta
todas las filas seleccionadas.
MAX (expresión)= Calcula el máximo.
MIN (expresión)= Calcula el mínimo.
SUM (expresión)= Obtiene la suma de los valores de la expresión.
Ejemplos
SELECT AVG(SAL) FROM EMP WHERE DEPTNO = 10;
SELECT COUNT(*) FROM EMP;
SELECT COUNT(COMM) FROM EMP;
SELECT MAX(SAL) FROM EMP;
SELECT MAX(ENAME) FROM EMP;
SELECT MIN(SAL) FROM EMP;
SELECT MIN(ENAME) FROM EMP;
SELECT SUM(SAL) FROM EMP;
SELECT VARIANCE(SAL) FROM EMP;
SELECT COUNT(DISTINCT(JOB)) FROM EMP;
Funciones aritméticas
Funciones de listas.
GREATEST (valor1, valor2…)= Obtiene el
mayor valor de la lista.
LEAST (valor1, valor2…)= Obtiene el
menor valor de la lista.
Ejemplos
SELECT ENAME,
GREATEST(SAL, NVL(COMM, 0)),
LEAST(SAL, NVL(COMM, 0))
FROM EMP;
Funciones de cadenas de caracteres
CHR(n) = Devuelve el carácter cuyo valor en binario es
equivalente a "n".
CONCAT (cad1, cad2)= Devuelve "cad1" concatenada con "cad2".
LOWER (cad)= Devuelve la cadena "cad" en minúsculas.
UPPER (cad)= Devuelve la cadena "cad" en mayúsculas.
INITCAP (cad)= Convierte la cadena "cad" a tipo titulo.
LPAD (cad1, n[,cad2])= Añade caracteres a la izquierda de la
cadena hasta que tiene una cierta longitud.
RPAD (cad1, n[,cad2])= Añade caracteres a la derecha de la
cadena hasta que tiene una cierta longitud.
Funciones de cadenas de caracteres
LTRIM (cad [,set])= Suprime un conjunto de caracteres a la izquierda de la
cadena.
RTRIM (cad [,set])= Suprime un conjunto de caracteres a la derecha de la
cadena.
REPLACE (cad, cadena_busqueda [, cadena_sustitucion])= Sustituye
un carácter o caracteres de una cadena con 0 o mas caracteres.
SUBSTR (cad, m [,n])= Obtiene parte de una cadena.
TRANSLATE (cad1, cad2, cad3)= Convierte caracteres de una cadena en
caracteres diferentes, según un plan de sustitución marcado por el usuario.
Ejemplos
SELECT CHR(75), CHR(65) FROM DUAL;
SELECT CONCAT('El nombre es: ', ename) FROM EMP;
SELECT LOWER('oRACLe Y sql'), UPPER('oRACLe Y sql'),
INITCAP('oRACLe Y sql') FROM DUAL;
SELECT LPAD(ENAME, 20, '.'), RPAD(ENAME, 20, '.') FROM EMP;
SELECT LTRIM(' HOLA'), RTRIM(' ADIOS') FROM DUAL;
SELECT REPLACE ('BLANCO Y NEGRO', 'O', 'AS') FROM DUAL;
SELECT SUBSTR(ENAME, 1, 1) FROM EMP;
SELECT TRANSLATE('LOS PILARES DE LA TIERRA', 'AEIOU', 'aeiou')
FROM DUAL;
SELECT TRANSLATE('LOS PILARES DE LA TIERRA', 'LAEIOU', '1')
FROM DUAL;
Funciones que devuelven valores numéricos
ASCII(cad)= Devuelve el valor ASCII de la
primera letra de la cadena "cad".
INSTR (cad1, cad2 [, comienzo [,m]])= Permite una búsqueda de
un conjunto de caracteres en una cadena pero no suprime ningún
carácter después.
LENGTH (cad)= Devuelve el numero de caracteres de cad.
Ejemplos
SELECT ASCII('A') FROM DUAL;
SELECT INSTR('II VUELTA CICLISTA A
TALAVERA', 'TA', 3,2) FROM DUAL;
SELECT INSTR('II VUELTA CICLISTA A
TALAVERA', 'A', -1) FROM DUAL;
SELECT ENAME, LENGTH(ENAME) FROM
EMP;
Funciones para manejo de fechas
SYSDATE= Devuelve la fecha del sistema.
ADD_MONTHS (fecha, n)= Devuelve la fecha "fecha" incrementada en "n"
meses.
LAST_DAY (fecha)= Devuelve la fecha del último día del mes que contiene
"fecha".
MONTHS_BETWEEN (fecha1, fecha2)= Devuelve la diferencia en meses
entre las fechas "fecha1" y "fecha2".
NEXT_DAY (fecha, cad)= Devuelve la fecha del primer día de la semana
indicado por "cad" después de la fecha indicada por "fecha".
Ejemplos
SELECT SYSDATE FROM DUAL;
SELECT ENAME, HIREDATE,
ADD_MONTHS(HIREDATE, 12) FROM EMP
WHERE DEPTNO = 10;
SELECT ENAME, HIREDATE,
LAST_DAY(HIREDATE) FROM EMP
WHERE DEPTNO = 10;
SELECT MONTHS_BETWEEN(SYSDATE,
HIREDATE) FROM EMP;
SELECT NEXT_DAY(SYSDATE, 'JUEVES')
FROM DUAL;
Funciones de conversión
TO_CHAR= Transforma un tipo DATE ó NUMBER en
una cadena de caracteres.
TO_CHAR(fecha, ‘formato’)
TO_CHAR(numero, ‘formato’)
TO_DATE= Transforma un tipo NUMBER ó CHAR en
DATE.
TO_DATE (cadena, ‘formato’)
TO_NUMBER= Transforma una cadena de caracteres
en NUMBER.
TO_NUMBER (cadena [, ‘formato’])
Ejemplos
SELECT TO_CHAR(HIREDATE, 'month DD,
YYYY') FROM EMP WHERE DEPTNO = 10;
SELECT TO_CHAR(HIREDATE, 'mon ddd, yyyy') FROM
EMP WHERE DEPTNO = 10;
ALTER SESSION SET NLS_DATE_FORMAT =
'DD/month/YYYY HH24 :MI :SS';
SELECT SYSDATE FROM DUAL;
ALTER SESSION SET NLS_DATE_LANGUAGE = French;
SELECT TO_CHAR(SYSDATE, ' "HOY ES " DAY " , " DD " DE "
MONTH " DE " YYYY') AS FECHA FROM DUAL;
Ejemplos
ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '/*';
SELECT TO_CHAR(12345.67, '999G999D999') FROM DUAL;
ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ', .';
ALTER SESSION SET NLS_CURRENCY = 'PESETAS';
SELECT TO_CHAR(123, 'L999') FROM DUAL;
SELECT TO_NUMBER('-123456'), TO_NUMBER('123,99', '999D99')
FROM DUAL;
SELECT TO_NUMBER('123.456', '99G999')
FROM DUAL; * NO SALE*
ALTER SESSION SET NLS_DATE_FORMAT = 'DD/MM/YYYY';
SELECT TO_DATE('01012006') FROM DUAL;
SELECT TO_CHAR(TO_DATE('01012006', 'DDMMYYYY'), 'MONTH') FROM DUAL;
Otras funciones
DECODE(var, val1, cod1…valor_defecto)
Sustituye un valor por otro y sino el valor por
Defecto.
VSIZE(expresion). El nº de bytes que
ocupa una expresión.
USER. Devuelve el nombre del usuario
actual.
UID. Devuelve el identificador Oracle del usuario
actual.