SQL
SQL
SQL
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 ACTULIZAR_TELEFONO_ESTUDIANTE
Datos actuales de la tabla Estudiante
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;
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;
end;