






































Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Base de datos contiene script y clases de estudio
Tipo: Apuntes
1 / 46
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!







































En los ejemplos utilizaremos el Esquema University:
Student(stuId, lastName, firstName, major, créditos)
Faculty(facId, name, departament, rank)
Class(classNumber, facId, schedule, room)
Enroll(stuId, classumber, grade)
Ejemplo 1. Combinación (Reunión) natural
Pregunta: Obtener las ID y nombres de todos los estudiantes que cursan ART 103 A.
Solución: Se usan dos tablas. Primero se busca en la tabla Enroll para registros donde el classNumber es ‘ART 103 A’. Luego se busca en la tabla Student los registros con valores stuId coincidentes, y se combinan dichos registros en una nueva tabla. A partir de esta tabla, se encuentran lastName y firstName. Esto es similar a la operación JOIN en el álgebra relacional. SQL permite hacer una operación combinación (reunión) natural del álgebra relacional, al nombrar las tablas involucradas y expresar en el predicado la condición que deben cumplir los registros en el campo común.
Consulta SQL:
SELECT Enroll.stuId, lastName, firstName
FROM Student, Enroll
WHERE ClassNumber = 'ART 103 A' AND Enroll.stuId = Student.stuId;
Ejemplo 4. Uso de alias
SELECT COPY1.classNumber, COPY1.schedule, COPY1.room, COPY2.classNumber, COPY2.schedule
FROM Class COPY1, Class COPY
WHERE COPY1.room = COPY2.room
AND COPY1.classNumber < COPY2.classNumber;
Observación: Se debe introducir los nombres calificados en la línea SELECT. Esto es necesario porque cada columna en la tabla Class ahora aparece dos veces, una vez en cada copia. Se agregó la segunda condición "COPY1.classNumber < COPY2.classNumber" para evitar incluir a cada curso consigo mismo, pues cada curso satisface el requisito de que se imparte en el mismo salón. También evita que aparezcan en el resultado registros con los dos cursos invertidos. De modo incidental se pueden introducir alias en cualquier SELECT aun cuando no se requieren.
Ejemplo 3. Combinación (Reunión) natural de tres tablas
Pregunta: Encontrar los números de curso y los nombres y especialidades de todos los estudiantes inscritos en los cursos impartidos por el miembro Faculty F110.
Solución: Como en el ejemplo anterior, se necesita empezar en la tabla Class para encontrar el classNumber de todos los cursos impartidos por F110. Luego se comparan éstos con los valores classNumber en la tabla Enroll para encontrar los valores stuId de todos los estudiantes en dichos cursos. Luego se busca en la tabla Student para encontrar los nombres y especialidades de todos los estudiantes inscritos en ellos.
Consulta SQL:
SELECT Enroll.classNumber, lastName firstName, major
FROM Class, Enroll, Student
WHERE facId = 'F110' AND
Class.classNumber = Enroll.classNumber AND
Enroll.stuId = Student.stuId;
Ejemplo 5. Combinación sin condición de igualdad
Pregunta: Encontrar todas las combinaciones de estudiantes y Faculty donde la especialidad del estudiante sea diferente del departamento del miembro Faculty.
Solución: Esta solicitud inusual es para ilustrar una combinación en la que la condición no sea una igualdad en un campo común. En este caso, los campos que se examinan, major y department, incluso no tienen el mismo nombre. Sin embargo, se les puede comparar ya que tienen el mismo dominio. Dado que no se dice cuáles columnas mostrar en el resultado, se usa su criterio.
Consulta SQL:
SELECT stuId, lastName, firstName, major, facId, name, department
FROM Student, Faculty
WHERE Student.major <> Faculty.department;
Ejemplo 4. Uso de alias
Pregunta: Obtener una lista de todos los cursos que se imparten en el mismo salón, con sus horarios y números de salón.
Solución: Esto requiere comparar la tabla Class consigo misma, y sería útil si hubiera dos copias de la tabla de modo que se podría usar una combinación (reunión). Pueden existir dos copias de una tabla al darle dos "alias", por ejemplo, COPY1 y COPY2. Los "alias" se introducen en la línea FROM al escribirlos inmediatamente después de los nombres de tabla reales.
Consulta SQL:
SELECT COPY1.classNumber, COPY1.schedule, COPY1.room, COPY2.classNumber, COPY2.schedule
FROM Class COPY1, Class COPY2 WHERE COPY1.room = COPY2.room AND COPY1.classNumber < COPY2.classNumber;
El concepto de tabla (o relación) predeterminado de concatenación (reunión) en una tabla concatenada es una concatenación (reunión) interna, en la que una tupla se incluye en el resultado si en la otra relación existe una tupla coincidente. Por ejemplo, en la consulta C 2 , que recupera el primer apellido del empleado y el primer apellido de su supervisor, en el resultado sólo se incluyen los empleados que tienen un supervisor, se excluyen las tuplas EMPLEADO cuyo valor para SuperDni es NULL. Si se necesita que se incluyan todos los empleados, debe utilizarse explícitamente una operación OUTER JOIN (reunión externa). En SQL, esto se manipula especificando explícitamente el OUTER JOIN en una tabla concatenada, como en la consulta C 2 B
C2B: SELECT E.Apellido 1 AS NombreDeEmpleado, S.Apellido 1 AS NombreDeSupervisor
FROM (EMPLEADO AS E LEFT OUTER JOIN EMPLEADO AS S ON E.SuperDni = S.Dni);
Las opciones disponibles para especificar las tablas concatenadas (combinadas o reunidas) en SQL son INNER JOIN (igual que JOIN), LEFT OUTER JOIN, RIGHT OUTER JOIN y FULL OUTER JOIN. En las tres últimas opciones puede omitirse la palabra clave OUTER. Si los atributos de concatenación tienen el mismo nombre, se puede especificar la variación de concatenación natural de las concatenaciones externas utilizando la palabra clave NATURAL antes que la operación (por ejemplo, NATURAL LEFT OUTER JOIN). La palabra clave CROSS JOIN se utiliza para especificar la operación PRODUCTO CARTESIANO. También se pueden anidar especificaciones de concatenación; es decir, una de las tablas de una concatenación puede ser una tabla concatenada. La consulta C siguiente: Por cada proyecto ubicado en Gijón, mostrar su número, el número del departamento que lo gestiona y el primer apellido, dirección y fecha de nacimiento del director del mismo, utilizando el concepto de una tabla concatenada siguiente C 3 A: SELECT NumProyecto, NumDptoProyecto, Apellido1, Dirección, FechaNac FROM ((PROYECTO JOIN DEPARTAMENTO ON NumDptoProyecto = NúmeroDpto) JOIN EMPLEADO ON DniDirector = Dni) WHERE UbicaciónProyecto = 'Gijón’;
En algunas consultas es preciso obtener valores existentes en la base de datos para usarlos en una condición de comparación. Tales consultas se pueden formular mediante consultas anidadas (subconsultas) que son consultas completas dentro de la cláusula WHERE de otra consulta, la cual se denomina consulta exterior. En general podemos tener varios niveles de consultas anidadas.
Ejemplo: Obtener los números de los proyectos en los que trabaja el empleado de apellido Silva
Select numerop
From proyecto
where numerop in (select num from trabaja_en, empleado
where nsse = nss and apellido = Silva);
El operador de comparación IN (en) compara un valor v con un conjunto (o multiconjunto) de valores V y produce el valor TRUE (verdadero) si v es uno de los elementos de V.
Siempre que una consulta anidada (subconsulta) hace referencia a un atributo de una tabla declarada en la consulta exterior, se dice que las dos consultas están correlacionadas. En este caso, la consulta anidada se evalúa una sola vez para cada tupla (o combinación de tuplas) en la consulta exterior.
Ejemplo: Obtener el nombre de pila y apellido de todos los empleados que tienen un dependiente con el mismo nombre de pila que el empleado
Select e.first_name, e.last_name
From employees e
Where e.employee_id in (select d.employee_id from dependiente d
Where d.employee_id = e.employee_id and
d.nombre = e.first_name);
Además del operador IN, podemos usar otros operadores de comparación para comparar un valor individual v (por lo regular un nombre de columna) con un conjunto V (por lo regular una consulta anidada o subconsulta). El operador = ANY (o = SOME ) devuelve TRUE si el valor v es igual a algún valor del conjunto V, y por tanto equivale a IN. Las palabras reservadas ANY y SOME tienen el mismo significado. Otros operadores que se pueden combinar con ANY (o SOME) incluyen >, >=, <, <= y < >. También es posible combinar la palabra reservada ALL (todas) con uno de estos operadores. Por ejemplo, la condición de comparación (v > ALL V) devuelve TRUE si el valor v es mayor que todos los valores del conjunto V
Ejemplo: Obtener el nombre de pila, apellido, nombre del trabajo y salario de los empleados cuyo salario es menor que cualquiera de los salarios de los empleados cuyo nombre de trabajo termina en REP y el nombre de trabajo de dichos empleados no termina en REP, ordenados por salario.
Select first_name, last_name, job_id, salary
From employees
Where salary < ANY (select salary from employees where job_id LIKE ‘%REP’) and job_id NOT LIKE ‘%REP’ order by salary;
Ejemplo: Obtener el nombre de pila, apellido, nombre del trabajo y salario de los empleados cuyo salario es mayor que todos los salarios de los empleados cuyo nombre de trabajo termina en CLERK, ordenados por salario.
Select first_name, last_name, job_id, salary from employees where salary
ALL (select salary from employees where job_id LIKE ‘%CLERK’) order by salary;
Función EXISTS y NOT EXISTS
Ejemplo: Obtener los nombres de pila y apellido de los empleados que no tienen dependientes.
Select e.first_name, e.last_name From employees e
Where NOT EXISTS (select * from dependiente d where d.employee_id = e.employee_id);
Ejemplo: Obtener todos los códigos de clientes que tengan una cuenta de depósito en todas las agencias localizadas en Santiago. Ejemplo del uso de la División (DIVIDE BY) del álgebra relacional:
Depósito[CodCliente, CodAgencia] DIVIDEBY (Agencia WHERE Ciudad = ‘Santiago’[CodAgencia])
Select DISTINCT DX.CodClie From Deposito DX
Where NOT EXISTS (select CodAgencia from Agencia where Ciudad = 'Santiago' MINUS select DISTINCT DY.CodAgencia from Deposito DY where DX.CodCliente = DY.CodCliente);
SQL cuenta con las funciones agregadas (cuenta), (suma), (máximo), (mínimo) y (promedio). La función COUNT devuelve el número de tuplas o valores especificados en una consulta. Las funciones SUM, MAX, MIN y AVG se aplican a un conjunto o multiconjunto de valores numéricos y devuelven, respectivamente, las suma, el valor máximo, el valor mínimo y el promedio de esos valores. Estas funciones se pueden usar en la cláusula SELECT o en una cláusula HAVING.
Ejemplo: Obtener el total de los empleados, la suma de sus salarios, el salario máximo, el salario mínimo y el salario promedio.
Select count(*), sum(salary), max(salary), min(salary), avg(salary)
From employees;
El argumento * de la función COUNT, especifica que se tienen que contar todas las filas para devolver el número total de filas de una tabla. Cuenta todas las filas, incluidas las que contienen valores NULL y duplicados.
Ejemplo: Obtener el número de valores de salarios distintos de los empleados. Select count(distinct salary) From employees;
El argumento DISTINCT especifica que COUNT devuelva el número de valores únicos (distintos) no NULL de la columna.