SQL

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 25

JOINS

INNER JOIN
Consultar por cédula las materias matriculadas para un estudiante en un año y periodo.
SELECT e.Primer_Nombre,
tp.Nombre,
e.Numero_Documento,
a.Nombre,
s.Año,
s.Periodo
FROM estudiante e
INNER JOIN TipoDocumento tp
ON tp.Tipo_Documento_Id = e.Tipo_Documento_Id
INNER JOIN Matricula m
ON m.Estudiante_Id = e.Estudiante_Id
INNER JOIN OfertaAcademica oa
ON oa.Oferta_Academica_Id = m.Oferta_Academica_Id
INNER JOIN Asignatura a
ON a.Asignatura_Id = oa.Asignatura_Id
INNER JOIN Semestre s
ON s.Semestre_Id = oa.Semestre_Id
LEFT JOIN
Consultar las asignaturas y sus prerrequisitos de las tablas Asignatura (izquierda) y
AsignaturaPrerrequisito (derecha). Como es un Left Join, la consulta me traerá todas las
asignaturas de la tabla Asignatura y en el campo prerrequisito Id solo me traerá valor para las
asignaturas que tienen prerrequisito, para las demás este campo será nulo.
SELECT
a.ASIGNATURA_ID,
a.PROGRAMA_ID,
a.NOMBRE,
a.CREDITOS,
ap.PRERREQUISITO_ID
FROM ASIGNATURA a
LEFT JOIN ASIGNATURAPRERREQUISITO ap
ON a.ASIGNATURA_ID = ap.ASIGNATURA_ID
RIGHT JOIN
Si modifico la consulta anterior y ahora mi tabla Asignatura está a la derecha y mi tabla
AsignaturaPrerrequisito está a la izquierda, al hacer un Right Join, la consulta me traerá
exactamente los mismos resultados de la consulta anterior con Left Join, ya que me traerá
todos los resultados de la tabla de la derecha (Asignatura) y los prerrequisitos Id de la tabla de
la izquierda (AsignaturaPrerrequisito), dejando nulo para las asignaturas que no tienen
prerrequisito.

SELECT
a.ASIGNATURA_ID,
a.PROGRAMA_ID,
a.NOMBRE,
a.CREDITOS,
ap.PRERREQUISITO_ID
FROM ASIGNATURAPRERREQUISITO ap
RIGHT JOIN ASIGNATURA a
ON a.ASIGNATURA_ID = ap.ASIGNATURA_ID
FULL JOIN
Ya que el Full Join Me trae los requistros de ambas tablas (Derecha e izquierda), en este caso si
quiero consultar las asignaturas que los estudiantes tienen matriculadas en un semestre, los
resultados serán:
1. Las asignaturas que los estudiantes tienen matriculadas en un semestre.
2. Las asignaturas que no se encuentran matriculadas para ningún estudiante. En este
caso, la información de estudiante y semestre quedará vacía.
3. Los semestres para los cuales no haya ningun estudiante ni asignatura matriculada. En
este caso, la información de estudiante y asignatura quedará vacía.

SELECT e.Primer_Nombre,
e.Numero_Documento,
a.Nombre,
s.Año,
s.Periodo
FROM estudiante e
FULL JOIN Matricula m
ON m.Estudiante_Id = e.Estudiante_Id
FULL JOIN OfertaAcademica oa
ON oa.Oferta_Academica_Id = m.Oferta_Academica_Id
FULL JOIN Asignatura a
ON a.Asignatura_Id = oa.Asignatura_Id
FULL JOIN Semestre s
ON s.Semestre_Id = oa.Semestre_Id
CROSS JOIN
Si un Cross Join se utiliza sin un where, el resultado final será cada uno de los registros de la
primera tabla multiplicados por los registros de la segunda tabla. Para este ejemplo, voy a
mostrar para cada facultad las aulas disponibles, suponiendo que las aulas no pertenezcan a
una facultad sino a la Universidad en general.

SELECT
f.FACULTAD_ID,
f.NOMBRE,
a.UBICACION,
a.nombre
from FACULTAD f
CROSS JOIN AULA a
ORDER BY f.FACULTAD_ID
NATURAL JOIN
Este tipo de Join es muy similar al Inner Join, la diferencia es que las columnas utilizadas para
hacer la relación no se especifican en la consulta, sino que están implicitas al ser las mismas en
ambas tablas. Para este ejemplo, la table Asigunatura y AsignaturaPrerrequisito se relacionan
mediante la columna Asignatura_ID, entonces el Natural Join debe toma esa columna
implicitamente para hacer la relación.

SELECT
ASIGNATURA_ID,
a.PROGRAMA_ID,
a.NOMBRE,
a.CREDITOS,
ap.PRERREQUISITO_ID
from ASIGNATURA a
NATURAL JOIN ASIGNATURAPRERREQUISITO ap
Order by a.PROGRAMA_ID
INNER JOIN….USING
Este tipo de Join es una combinación entre Inner Join y Natural Join, ya que las columnas para la
relación deben especificacarse pero no de ambas tablas como en el Inner Join, sino en el Using.
Para este ejemplo, consulto los programas y la facultad a la que pertenecen. Para esto uno las
dos tablas mediante el campo FACULTAD_ID que se encuentra en ambas.

SELECT
P.PROGRAMA_ID,
P.NOMBRE,
f.NOMBRE
from PROGRAMA P
INNER JOIN Facultad f USING (FACULTAD_ID)
COUNT
Consultar el número de asignaturas matriculadas para cada estudiante y sus respectivos
semestres.

SELECT e.Primer_Nombre,
COUNT (*) AS ASIGNATURAS_MATRICULADAS,
s.Año,
s.Periodo
FROM estudiante e
INNER JOIN Matricula m
ON m.Estudiante_Id = e.Estudiante_Id
INNER JOIN OfertaAcademica oa
ON oa.Oferta_Academica_Id = m.Oferta_Academica_Id
INNER JOIN Asignatura a
ON a.Asignatura_Id = oa.Asignatura_Id
INNER JOIN Semestre s
ON s.Semestre_Id = oa.Semestre_Id
Group By e.PRIMER_NOMBRE,
s.Año,
s.Periodo
SUM
Mostrar el número total de asignaturas matriculadas para un semestre (Año y periodo).
SELECT SUM(sub.ASIGNATURAS_MATRICULADAS) AS ASIGNATURAS_MATRICULADAS,
sub.AÑO,
sub.PERIODO
FROM (Select COUNT(m.MATRICULA_ID) AS ASIGNATURAS_MATRICULADAS,
s.AÑO AS AÑO,
s.PERIODO AS PERIODO
FROM estudiante e
INNER JOIN Matricula m
ON m.Estudiante_Id = e.Estudiante_Id
INNER JOIN OfertaAcademica oa
ON oa.Oferta_Academica_Id = m.Oferta_Academica_Id
INNER JOIN Semestre s
ON s.Semestre_Id = oa.Semestre_Id
GROUP BY e.PRIMER_NOMBRE, s.AÑO, s.PERIODO) sub
GROUP BY sub.AÑO,
sub.PERIODO
AVG
Consultar el promedio de la primera nota en todas la asignaturas matriculadas a cada
estudiante.
SELECT
e.PRIMER_NOMBRE,
AVG(n.PRIMERA_NOTA)
from NOTA n
INNER JOIN MATRICULA m
ON m.MATRICULA_ID = n.MATRICULA_ID
INNER JOIN ESTUDIANTE e
ON m.ESTUDIANTE_ID = e.ESTUDIANTE_ID
Group By e.PRIMER_NOMBRE
MIN
Obtener el menor número de asignaturas matriculadas.
SELECT MIN(sub.ASIGNATURAS_MATRICULADAS) AS ASIGNATURAS_MATRICULADAS
FROM (Select COUNT(m.MATRICULA_ID) AS ASIGNATURAS_MATRICULADAS
FROM estudiante e
INNER JOIN Matricula m
ON m.Estudiante_Id = e.Estudiante_Id
GROUP BY e.PRIMER_NOMBRE ) sub
MAX
Obtener el mayor número de asignaturas matriculadas.
SELECT MAX(sub.ASIGNATURAS_MATRICULADAS) AS ASIGNATURAS_MATRICULADAS
FROM (Select COUNT(m.MATRICULA_ID) AS ASIGNATURAS_MATRICULADAS
FROM estudiante e
INNER JOIN Matricula m
ON m.Estudiante_Id = e.Estudiante_Id
GROUP BY e.PRIMER_NOMBRE ) sub
PROCEDIMIENTOS ALMACENADOS
Procedimiento INSERTAR_FACULTAD
Datos actuales de la tabla facultad
SELECT
FACULTAD_ID,
NOMBRE
FROM FACULTAD

Procedimiento almacenado para insertar una facultad universitaria.


create or replace procedure "INSERTAR_FACULTAD"
(nombre_facultad IN VARCHAR2)
is
begin
INSERT INTO FACULTAD (NOMBRE) VALUES (NOMBRE_FACULTAD);
end;
Insertar facultad de educación mediante el procedimiento almacenado
BEGIN
INSERTAR_FACULTAD(NOMBRE_FACULTAD => 'Facultad de Educacion');
END;

Datos actuales de la tabla facultad


Procedimiento ELIMINAR_FACULTAD_POR_FACULTAD_ID

Procedimiento almacenado para eliminar una facultad universitaria por FACULTAR_ID


create or replace procedure "ELIMINAR_FACULTAD"
(id_facultad IN NUMBER)
is
begin
DELETE FROM FACULTAD WHERE FACULTAD_ID = id_facultad;
end;

Eliminar facultad de educación cuyo Id es 59


Datos actuales de la tabla facultad

Procedimiento ACTULIZAR_TELEFONO_ESTUDIANTE
Datos actuales de la tabla Estudiante

Procedimiento para actualizar el teléfono de un estudiante por su número de documento


create or replace procedure "ACTUALIZAR_TELEFONO_ESTUDIANTE"
(p_telefono IN NCHAR,
p_numero_documento IN NCHAR)
is
begin
UPDATE ESTUDIANTE
SET ESTUDIANTE.TELEFONO = p_telefono
WHERE ESTUDIANTE.NUMERO_DOCUMENTO = p_numero_documento;
end;

Actualizar el teléfono de la estudiante Luisa


BEGIN
ACTUALIZAR_TELEFONO_ESTUDIANTE(p_telefono => '3448889995566', p_numero_documento
=> '103433335');
END;

Datos actuales de la tabla estudiante. Teléfono de la estudiante Luisa actualizado.


Procedimiento ACTUALIZAR_NOTAS_ASIGNATURA
Procedimiento para actualizer las notas de un estudiante para una asignatura en específico.
create or replace procedure "ACTUALIZAR_NOTAS_ASIGNATURA"
(p_primera_nota IN NUMBER,
p_segunda_nota IN NUMBER,
p_numero_documento IN NCHAR,
p_asignatura_id IN NUMBER)
is
begin

UPDATE
(SELECT e.Primer_Nombre,
e.Numero_Documento,
a.Nombre,
n.Primera_nota,
n.Segunda_nota,
n.Nota_final,
a.ASIGNATURA_ID
FROM estudiante e
INNER JOIN Matricula m
ON m.Estudiante_Id = e.Estudiante_Id
INNER JOIN NOTA n
ON m.MATRICULA_ID = n.MATRICULA_ID
INNER JOIN OfertaAcademica oa
ON oa.Oferta_Academica_Id = m.Oferta_Academica_Id
INNER JOIN Asignatura a
ON a.Asignatura_Id = oa.Asignatura_Id
WHERE e.Numero_Documento = p_numero_documento and a.ASIGNATURA_ID =
p_asignatura_id
)t
SET t.PRIMERA_NOTA = p_primera_nota,
t.SEGUNDA_NOTA = p_segunda_nota,
t.NOTA_FINAL = (p_primera_nota + p_segunda_nota) / 2;
end;

Notas del estudiante Armando para la asignatura Diseño Web.


SELECT e.Primer_Nombre,
e.Numero_Documento,
a.Nombre,
n.Primera_nota,
n.Segunda_nota,
n.Nota_final
FROM estudiante e
INNER JOIN Matricula m
ON m.Estudiante_Id = e.Estudiante_Id
INNER JOIN NOTA n
ON m.MATRICULA_ID = n.MATRICULA_ID
INNER JOIN OfertaAcademica oa
ON oa.Oferta_Academica_Id = m.Oferta_Academica_Id
INNER JOIN Asignatura a
ON a.Asignatura_Id = oa.Asignatura_Id
WHERE e.Numero_Documento = 103458697 and a.ASIGNATURA_ID = 2

Se llama el procedimiento.
BEGIN
ACTUALIZAR_NOTAS_ASIGNATURA(p_primera_nota => 1, p_segunda_nota => 2,
p_numero_documento => '103458697', p_asignatura_id => 2);
END;

Datos después de corer el procedimiento


Procedimiento AGREGAR_NUEVO_ESTUDIANTE
Procedimiento que agrega un nuevo estudiante al sistema.
create or replace procedure "AGREGAR_NUEVO_ESTUDIANTE"
(programa_id IN NUMBER,
tipo_documento_id IN NUMBER,
numero_documento IN VARCHAR2,
primer_nombre IN VARCHAR2,
segundo_nombre IN VARCHAR2,
primer_apellido IN VARCHAR2,
segundo_apellido IN VARCHAR2,
telefono IN VARCHAR2,
correo IN VARCHAR2)
is
begin
INSERT INTO Estudiante
(Programa_Id
,Tipo_Documento_Id
,Numero_Documento
,Primer_Nombre
,Segundo_Nombre
,Primer_Apellido
,Segundo_Apellido
,Telefono
,Correo)
VALUES
(programa_id, programa_id, numero_documento, primer_nombre, segundo_nombre,
primer_apellido, segundo_apellido, telefono, correo);

end;

Se hace el llamado al stored procedure para agregar al estudiante Juan Esteban.


BEGIN
AGREGAR_NUEVO_ESTUDIANTE(programa_id => 5, tipo_documento_id => 3,
numero_documento => '1036589412', primer_nombre => 'Juan', segundo_nombre =>
'Esteban', primer_apellido => 'Suarez', segundo_apellido => 'Mesa', telefono => '5036874',
correo => 'juan.mesa @unad.edu.co');
END;

También podría gustarte