6.1 Introducción - felipealanis.org ITD/Fundamentos de Bases de Datos... · “control” fuera de...

73
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 1 6.1 Introducción SQL es más amigable para el usuario, a diferencia de Algebra Relacional, Aunque está basado principalmente en él. Es el lenguaje comercial más popular. Es el lenguaje estándar de las Bases de Datos Relacionales. Significa Structured Query Language Su nombre original era SEQUEL desarrollado como parte del proyecto del sistema R de IBM. Sequential English QUEry Language

Transcript of 6.1 Introducción - felipealanis.org ITD/Fundamentos de Bases de Datos... · “control” fuera de...

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 1

6.1 Introducción

SQL es más amigable para el usuario,

a diferencia de Algebra Relacional,

Aunque está basado principalmente en él.

Es el lenguaje comercial más popular.

Es el lenguaje estándar de las Bases de Datos

Relacionales.

Significa Structured Query Language

Su nombre original era SEQUEL desarrollado

como parte del proyecto del sistema R de IBM.

Sequential English QUEry Language

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 2

6.1 Introducción

SQL es parte del Lenguaje de Manipulación de

Datos (DML) y no a la inversa como a veces

se dice.

DML consta de instrucciones para añadir,

modificar, eliminar, datos a la base de datos,

además de las instrucciones de consulta

correspondientes a SQL.

Otro lenguaje importante de los manejadores

de Bases de Datos es DDL (Lenguaje de

Definición de Datos) que es el lenguaje que

permite crear o modificar el esquema de una

BD.

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 3

Una consulta en SQL consta de tres cláusulas: select, from y where

… Select

… From

… Where

No confundamos select con la operación seleccionardel álgebra relacional, de hecho la discrepancia es unerror desde la creación de SQL.

X

Equivale a:

6.1 Introducción

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 4

6.3 Estructura Básica

Pruebe estas consultas en cualquier un DBMS (SQL

Server, MySQL, etc)

6.2 Estructura Básica

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 6

6.2 Estructura Básica

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 7

6.2 Estructura Básica

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 8

6.2 Estructura Básica

Esta es la expresión más simple para resolver este problema, ya que solo se emplea un operador de cada tipo. Las expresiones de las páginas siguientes, son más complejas y además, no cumplen con el núcleo de SQL estándar

select nombre,fechafrom Alumnos,InasistAlumwhere hora='16:00' and Alumnos.IdAlumno=InasistAlum.IdAlumno

6.2 Estructura Básica

select nombre,fechafrom (select IdAlumno,nombre from Alumnos),InasistAlumwhere hora='16:00' and Alumnos.IdAlumno=InasistAlum.IdAlumno

Pruebe la expresión de abajo y lea la explicación de la

página 12

6.2 Estructura Básica

select nombre,fechafrom (select IdAlumno,nombre from Alumnos),

(select * from InasistAlum where hora='16:00')where Alumnos.IdAlumno=InasistAlum.IdAlumno

Pruebe la expresión de abajo y lea la explicación de la

página 12

6.2 Estructura Básica

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 12

Puede verificar sus expresiones de consulta en:https://www.eversql.com/sql-syntax-check-validator/

• Expresiones de consulta anidadas como las anteriores deben tener un nombre asignado para que cumplan con el SQL Standard Core (Núcleo del SQL estándar).

• El estándar de SQL proporciona las especificaciones que el lenguaje debe cumplir para asegurar sobre todo la portabilidad, eficiencia y facilidad de uso.

• Algunos DBMS’s cumplen con el estándar, pero por mercadotecnia, añaden una serie de variantes fuera del estándar que no necesariamente tendrán otros DBMS’s. Si se usan, se puede perder la capacidad de portabilidad.

6.2 Estructura Básica

6.2 Estructura Básica

Para adecuar las expresiones anteriores al estándar, hay que usar el equivalente en SQL a la operación Renombrar del Álgebra Relacional.

select nombre,fechafrom (select IdAlumno,nombre from Alumnos) Alum2,InasistAlum where hora='16:00' and Alum2.IdAlumno=InasistAlum.IdAlumno

select nombre,fechafrom (select IdAlumno,nombre from Alumnos) Alum2,

(select * from InasistAlum where hora='16:00') Inasist2where Alum2.IdAlumno=Inasist2.IdAlumno

Renombrar

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 14

select distinct Materias.nombre from Materias, Materias Mat2where Materias.nombre=Mat2.nombre andMaterias.IdMateria<>Mat2.IdMateria

Renombrar

Materias.nombre (Materias.nombre=Mat2.nombreMaterias.IdMateriaMat2.IdMateria (

Materias X Mat2(Materias) ) )

6.2 Estructura Básica

select Alumnos.nombre,Alumnos.domicilio from Alumnos,(select * from Alumnos Alum2 where control='96042121') where Alumnos.colonia=Alum2.colonia and Alumnos.IdAlumno<>Alum2.IdAlumno

no cumple con el Núcleo de SQL estándar ...

6.2 Estructura Básica

select Alumnos.nombre,Alumnos.calle,Alumnos.numero from Alumnos,Alumnos Alum2 where Alum2.control='96042121' and Alumnos.colonia=Alum2.colonia and Alumnos.IdAlumno<>Alum2.IdAlumno

Esta expresión cumple con el Núcleo de SQL estándar

6.2 Estructura Básica

Los DBMS’s cuentan con atributos tipo fecha, por lo que hay que usar una función para obtener por separado cada una de las partes de la fecha:

select nombre,day(FechaNac) from Alumnos where month(FechaNac)=3

union

select nombre,day(FechaNac) from Maestros where month(FechaNac)=3

Los nombres de las funciones day, month, year pueden variar en

cada DBMS

6.2 Estructura Básica

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 18

Pruebe la expresión de consulta de la página anterior añadiendo lo que

está en color rojo:

select nombre,day(FechaNac) as dia from Alumnos where

month(FechaNac)=3

union

select nombre,day(FechaNac) as dia from Maestros where

month(FechaNac)=3

6.2 Estructura Básica

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 19

En vez de:

select * from Materias where creditos>=6 and creditos<=8

Puede escribirse:

select * from Materias where creditos between 6 and 8

Se busca que SQL se parezca más al lenguaje natural para facilidad del usuario

El Operador BETWEEN permite simplificar consultas que contienen una cláusula where que especifica que cierto atributo se encuentre dentro de un rango de

valores.

6.2 Estructura Básica

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 20

select distinct IdAlumno from InasistAlum where

fecha between '2001/03/06' and '2001/03/08'

6.2 Estructura Básica

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 21

Operador LIKE

Es útil cuando no es posible resolver consultas aunque los atributos tengan dominio atómico.

Se aplica a atributos char empleando los símbolos % y _ para representar secciones del valor del atributo.

Caracter % (representa una subcadena de cualquier tamaño dentro del valor del atributo)

Caracter _ (representa a cualquier carácter dentro del valor del atributo)

6.2 Estructura Básica

Encontrar a los alumnos que tienen un número de control que no corresponde al I.T.D. (valor distinto de '04' en las posiciones

3 y 4).

select * from Alumnos where control not like '_ _04%'

Esta consulta no sería resuelta tan fácilmente si el atributo “control” fuera de tipo numérico.

6.2 Estructura Básica

select * from Maestros where Calle like 'C%'

select Nombre from Maestros

where Nombre like '_o%'

6.2 Estructura Básica

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 24

select * from Materias where nombre like '%datos%'

select * from Materias where nombre like '%DATOS%'

6.2 Estructura Básica

Encontrar los nombres de los alumnos que viven en la calle “Real”.

select nombre from Alumnos where domicilio like '%Real%'

El resultado de esta consulta no es satisfactorio.

6.2 Estructura Básica

Los esquemas que cuentan con todos los atributos con dominio atómico, facilitan la obtención de consultas precisas. Observe que no se requiere usar LIKE.

select nombre from Alumnos where calle='Real'

6.2 Estructura Básica

Cláusula Order by

Obtener una relación de los alumnos ordenada en base a la colonia.

select * from Alumnos order by Colonia

o

select * from Alumnos order by 7

6.2 Estructura Básica

Cláusula Order by

Obtener una relación con el domicilio y nombre de los alumnos ordenada en primer lugar por la colonia, en 2º lugar

por la calle y por último números exterior e interior.

select Colonia,Calle,NumeroExt,NumeroInt,Nombre

from Alumnos

order by Colonia,Calle,NumeroExt,NumeroInt

Añada tuplas con colonia y calle iguales para observar el efecto de la expresión.

6.2 Estructura Básica

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 29

6.3 Funciones de Agrupación

Operan sobre grupos de tuplas.

Funciones:

Avg(atributo).

Calcula la media de los valores de un atributo

numérico para un grupo de tuplas.

Min(atributo).

Determina el valor menor de un atributo de un

grupo de tuplas.

Max(atributo).

Determina el valor mayor de un atributo de un

grupo de tuplas.

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 30

6.3 Funciones de Agrupación

Funciones:

Sum(atributo).

Calcula la suma de todos los valores de un

atributo de un grupo de tuplas.

Count(atributo) o Count(*).

Cuenta el número de tuplas que hay en un grupo.

Antes de "atributo" puede ir la palabra “distinct”.

Se debe indicar el criterio de agrupación usando la

cláusula group by.

En la tabla resultante aparecerá una tupla por cada

grupo formado.

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 31

6.3 Funciones de Agrupación

Contar el número de materias

select count(*) from Materiasselect count(nombre) from Materiasselect count(creditos) from Materias

Contar el número distinto de créditos de las materias

select count(distinct creditos) from Materias

Al no llevar group by, se formará solo un grupo (con todas las tuplas).

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 32

Número de alumnos que vive en cada colonia.

select colonia,count(*) from Alumnos group by colonia

Número de tuplas de cada grupo (en este caso con la misma

colonia).

Relación de los motivos de inasistencia y el total de inasistencias por cada motivo ordenada en forma descendente por el total.

select motivo,count(*) from InasistAlumgroup by motivo order by 2 desc

6.3 Funciones de Agrupación

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 33

Igual a la anterior (que se muestra aquí abajo) pero en larelación resultante solo incluir los motivos mayores a 1inasistencia.

select motivo,count(*) from InasistAlumgroup by motivo order by 2 desc

select motivo,count(*) from InasistAlumgroup by motivo having count(*)>1order by 2 desc

select motivo,count(*) as faltas from InasistAlumgroup by motivo having faltas>1order by faltas desc

6.3 Funciones de Agrupación

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 34

Número de inasistencias en total de cada alumno.

select IdAlumno,count(*) as faltas from InasistAlum

group by IdAlumno order by faltas desc

Número de inasistencias de cada alumno por mes, ordenadas de más a menos considerando solo las inasistencias por motivos deportivos.

select IdAlumno,month(fecha) as mes,count(*) as faltas

from InasistAlum where motivo="Deportes"

group by IdAlumno,mes order by faltas desc

6.3 Funciones de Agrupación

Número de inasistencias en total de cada alumno y número de días en los que tuvo faltas ordenado en primer lugar en base al número total de

días en los que tuvo faltas.

select IdAlumno, count(*) as TotFaltas ,

count(distinct fecha) as TotDias

from InasistAlum group by IdAlumno

order by TotDias desc,TotFaltas desc

6.3 Funciones de Agrupación

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 36

Encontrar el número máximo de créditos.

select max(creditos) from Materias

Número mínimo de créditos.

select min(creditos) from Materias

Número de créditos promedio de todas las materias.

select avg(creditos) from Materias

o

select sum(creditos)/count(*) from Materias

6.3 Funciones de Agrupación

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 37

6.4 Consultas sobre Múltiples Tablas6.4.1 Subconsultas

Diferencia

La operación minus era parte del SQL original pero se hizo innecesaria por la incorporación del operador de

conjuntos in (not in se emplea en vez de minus).

Ejemplo: Números de Control de alumnos que no son maestros (el esquema no contiene una tabla Personas).

Como en el Núcleo de SQL Estándar no se permiten subconsultas en from, para apegamos a la expresión en Algebra Relacional de la página anterior, se puede crear

una Vista.

create view CurpSoloAlumnos as

select curp from Alumnos

where curp not in (select curp from Maestros)

select Alumnos.control from Alumnos, CurpSoloAlumnos

where Alumnos.curp= CurpSoloAlumnos.curp

6.4.1 Subconsultas

Diferencia

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 39

Sin embargo no es necesaria la complejidad de la

expresión anterior ya que el operador in (usado en

este caso con not) nos permite expresar consultas

como esa de manera más simple:

select control from Alumnos

where curp not in (select curp from Maestros)

6.4.1 Subconsultas

Diferencia

Unos ejemplos más:

select paterno,materno,nombre from Alumnos

where curp not in (select curp from Maestros)

select paterno,materno,nombre from Personas

where IdPersona

not in (select IdPersona from Maestros)

Esta última expresión resultará en todas las personas que no son maestros (no solo los alumnos)

6.4.1 Subconsultas

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 41

Encontrar el número de créditos mayor de la relación

materias.

Si no tuvieramos: select max(creditos) from Materias

Probablemente trataríamos de apegarnos a la expresión:

creditos(Materias)

- Materias.creditos(Materias.creditos<Materias2.creditos(Materias X

Materias2(Materias)))

select distinct creditos from Materias where creditos not in (select Materias.creditos from Materias,Materias Mat2 where Materias.creditos<Mat2.creditos)

6.4.1 Subconsultas

Desde luego lo mejor es usar funciones de agrupación (que acabamos de estudiar páginas atrás):

select max(creditos) from Materias

Y para obtener los nombres y claves de las materias con mayor número de creditos, la expresión en SQL sería

simple:

select nombre,clave from Materias

where creditos in (select max(creditos) from Materias)

6.4.1 Subconsultas

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 43

La misma función de la operación intersect se logra mediante el operador de conjuntos in

(Aunque algunos DBMS’s incluyen intersect por mercadotecnia, no pertenece al Núcleo de SQL Estándar)

Encontrar las IdPersona de aquellos maestros que son también alumnos.

IdPersona(Maestros) IdPersona(Alumnos)

select IdPersona from Maestros

where IdPersona in (select IdPersona from Alumnos)

6.4.1 Subconsultas

Intersección

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 44

6.4.1 Subconsultas

Operador in

Alumnos con el primer apellido de “la lista”

select nombre,paterno,materno from Alumnos

where paterno

in (select min(paterno) from Alumnos)

Lista de los alumnos más jóvenes de toda la escuela

select paterno,materno,nombre from Alumnos

where fechanac

in (select max(fechanac) from Alumnos)

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 45

4.4.1 Subconsultas

Operadores para comparación de Conjuntos

Consulta: Encontrar el número de créditos mayor de la

relación materias

(usando el operador de comparación de conjuntos all)

select distinct creditos from Materias

where creditos>=all (select creditos from Materias)

x >=all y significa: elatributo x sea mayor oigual a todos loselementos del conjunto y

>all no produciría ningúnresultado (en esta consultaparticular) ya que no hayun valor mayor a sí mismo.

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 46

4.4.1 SubconsultasOperadores para comparación de Conjuntos

Consulta:

Obtener las claves y nombres de las materias con

menor número de créditos:

select clave,nombre from Materias

where creditos<=all (select creditos from Materias)

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 47

4.4.1 Subconsultas

Consulta:

Encontrar a todos los Profesores que sean de menor edad

que al menos un Alumno.

select * from Maestros

where fechanac>some(select fechanac from Alumnos)

x > some y significa: el valordel atributo x sea mayor almenos a uno de los elementosdel conjunto y

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 48

No existe en el Núcleo de SQL estándar (al menos al

momento de escribir estas notas) un operador equivalente a

la división del Algebra Relacional

4.4.1 SubconsultasDivisión

Ejemplo:

Encontrar la Id de aquellos maestros que han asistido a todos los cursos de actualización impartidos.

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 49

SQL (Visual Fox):

select IdMaesAsist,NombreCurs from CursosActualizacion into dbf r1

select distinct NombreCurs from CursosActualizacion into dbf r2

select distinct IdMaesAsist from r1 into dbf temp1

select * from temp1,r2 into dbf temp2

select distinct IdMaesAsist from temp2 where IdMaesAsist+NombreCurs ;

not in (select IdMaesAsist+NombreCurs from r1) into dbf temp3

select * from temp1 where IdMaesAsist not in (select * from temp3)

drop table r1

drop table r2

drop table temp1

drop table temp2

drop table temp3

4.4.1 SubconsultasDivisión

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 50

Puede escribirse un programa, utilizando código SQL, en el lenguaje del DBMS(Este ejemplo es de Visual Fox):

local m_fecha1

local m_fecha2

set date french

set century on

clear

m_fecha1 = ctod('')

m_fecha2 = ctod('')

@0,0 say 'Este Programa obtiene los datos de los profesores que han asistido'

@1,0 say ‘a todos los cursos de actualización impartidos durante cierto período’

@3,0 say 'Fecha Inicial:' get m_fecha1

@4,0 say 'Fecha Final:' get m_fecha2

read

if lastkey()=27

return

endif

4.4.1 SubconsultasDivisión

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 51

select IdMaesAsist,NombreCurs from CursosActualizacion ;

where (Fechaini>=m_fecha1) and (Fechaini<=m_fecha2);

into dbf r1

select distinct NombreCurs from CursosActualizacion ;

where (Fechaini>=m_fecha1) and (Fechaini<=m_fecha2);

into dbf r2

select distinct IdMaesAsist from r1 into dbf temp1

select * from temp1,r2 into dbf temp2

select distinct IdMaesAsist from temp2 ;

where IdMaesAsist+NombreCurs not in ;

(select IdMaesAsist+NombreCurs from r1) into dbf temp3

select * from temp1 where IdMaesAsist not in (select * from temp3) ;

into dbf temp4

select IdMaesAsist,Nombre from temp4,Maestros ;

where temp4.IdMaesAsist=Maestros.IdMaestro

4.4.1 SubconsultasDivisión

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 52

close all

drop table r1

drop table r2

drop table temp1

drop table temp2

drop table temp3

drop table temp4

Se crea el programa con MODIFY COMMAND

<nombre> ............. y se ejecuta con

DO <nombre>

4.4.1 SubconsultasDivisión

4.4.1 Subconsultas

División

Modifique el programa anterior para resolver el problema siguiente:

Encontrar las Id de los grupos que tienen sesiones todos los días laborables de la

semana.

4.4.2 Operadores JOIN

select * from Alumnos inner join InasistAlumon Alumnos.IdAlumno=InasistAlum.IdAlumno

• inner (interno) es una palabra opcional, join por si solo implica una junta.

• La expresión de arriba (con inner join o join unicamente) equivale exactamente a:

select * from Alumnos,InasistAlum where Alumnos.IdAlumno=InasistAlum.IdAlumno

4.4.2 Operadores JOIN

select * from Alumnos left outer join InasistAlumon Alumnos.IdAlumno=InasistAlum.IdAlumno

• outer (externo) es una palabra opcional, ya que left o right implican una junta (join) externa.

• left signfica que deben aparecer todas las tuplas de la relación de la izquierda aunque no tengan tuplas correspondientes de la relación de la derecha.

• right significa que deben aparecer todas las tuplas de la relación de la derecha aunque no tengan tuplas correspondientes a la relacion de la izquierda.

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 56

4.4.2 Operadores JOIN

select Alumnos.Control,Nombre,InasistAlum.Fecha from Alumnos left join InasistAlum on Alumnos.IdAlumno=InasistAlum.IdAlumno order by 3

Se obiene una relación que contiene una lista de todos los alumnos, hayan tenido o no inasistencias, ordenada por la fecha de

inasistencia

Observe que esta consulta con right join no tendría sentido, de hecho

equivale a join ya que no hay tuplas en InasistAlum que no correspondan

a ningún Alumno.

4.4.2 Operadores JOIN

4.4.2 Operadores JOIN

select IdMaestro,IdMateria,IdPeriodo,Paquete,Horariofrom Grupos,GposMaeswhere Grupos.IdGrupo=GposMaes.IdGrupo

select IdMaestro,IdMateria,IdPeriodo,Paquete,Horariofrom Grupos left join GposMaeson Grupos.IdGrupo=GposMaes.IdGrupo

Con la consulta con from se obiene una relación que incluye solo los grupos que tienen profesor asignado, con left join se obtiene una lista de todos los grupos, tengan

profesor o no.

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 59

natural join es una característica que no pertenece al núcleo de SQL estándar ….

Aunque algunos DBMS’s lo incluyen como un equivalente al Producto Natural

Por lo tanto, hay que usar, como siempre, un producto cartesiano, una selección y una proyección.

Con las Vistas (que veremos posteriormente) se pueden simplificar las consultas sin necesidad de

natural join.

4.4.2 Operadores JOIN

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 60Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 60

4.5 Vistas

La creación de vistas permite al DBA, poner adisposición de los usuarios sofisticados y de losprogramadores, los datos de una forma másconveniente, simplificando los esquemas.

Lo anterior se refiere a que, de acuerdo a los criteriosde diseño, los datos se encuentran dispersos en variastablas pero conviene mostrarlos en la menor cantidadde tablas posible, para simplificar la obtención deconsultas.

En realidad, hasta al mismo DBA se le facilita lamanipulación de los datos usando este concepto.

Las vistas se crean a partir de expresiones deconsulta, por lo tanto, son consultas.

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 61

Ejemplo:

Un buen esquema para datos de maestros y alumnos podría ser el siguiente, pero para manipular más fácilmente los datos, conviene crear vistas adecuadas para reunir los atributos de personas con alumnos y personas con maestros.

4.5 Vistas

IdPersona Nombre Apellidos Calle Numero FechaNac Teléfono CURP

1 Parejita López Zarco 123 07-02-1981 819-27-37 L1

2 Johannes Gutenberg Negrete 650 12-01-1901 823-15-00 G2

3 Benito Juárez Patoni 100 31-03-1982 800-25-25 J4

4 Luis Pasteur Patoni 234 20-03-1850 818-04-11 P1

5 Padre Abraham Oriente 347 11-04-1890 818-98-75 A0

6 José Revueltas Negrete 1002 24-03-1982 803-17-13 R7

7 Lorena Ochoa Fresno 1410 23-06-1981 800-06-06 O1

8 Aristóteles De Tesalónica Pino Suárez 542 23-07-1905 801-00-00 A1

9 Pyotr Ilich Tchaikovski Zaragoza 471 13-08-1920 874-65-02 T4

10 Sandro Botticelli Juárez 870 07-09-1919 830-77-55 B9

Tabla PERSONAS

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 62Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 62

Ejemplos vistas:

create view DatosAlumnos as

select idAlumno,control,

concat(nombre,' ',apellidos) NombreCompleto,

concat_ws(' ',calle,numext,concat('Int.',numint),concat('Col.',colonia)) Domicilio,

fechanac,curp

from alumnos,personas

where alumnos.idpersona=personas.idpersona order by idalumno

|

select * from DatosAlumnos

Una vista como esta hace innecesario el producto natual, ya que cuando deseemos ver combinados los datos de las tablas Alumnos y Personas, solo debemos usar la Vista DatosAlumnos como si fuera una tabla

idAlumno control NombreCompleto Domicilio fechaNac curp

1 98042151 Pato Lucas Zarco 123 Col.Centro 1981-07-02 LP11

2 97041587 Atomic Ant Negrete 1002 Col.Fracc. del Lago 1982-03-24 AA22

3 97043014 Mickey Mouse Fresno 1410 Col.Real del Prado 1981-06-23 MM33

4 96042121 Johnny Bravo Patoni 100 Col.Centro 1982-03-31 BJ44

5 96044350 Robin Hood Aquiles Serdán 1102 Col.Nueva Vizcaya 1979-03-20 RH99

6 97111432 Oso Yogui Victoria 345 Col.Centro 1980-04-11 OY88

7 98042012 Hércules Real 300 Int.1 Col.Olimpo 1981-09-24 HH66

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 63Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 63

create view DatosMaestros as

select idMaestro,rfc,concat(nombre,' ',apellidos) NombreCompleto,

concat_ws(' ',calle,numext,concat('Int.',numint),concat('Col.',colonia)) Domicilio,

fechanac,curp

from maestros,personas

where maestros.idpersona=personas.idpersona

order by idmaestro

select * from DatosMaestros

4.5 Vistas

idMaestro rfc NombreCompleto Domicilio fechanac curp

1 X1 Xavier Lopez Chabelo Templo Atenea 111 Col.Chapultepec 1961-12-17 X11

2 A2 Aristóteles Coliseo 122 Int.1 Col.Tesalónica 1965-11-20 A22

3 T4 Pyotr Ilich Tchaikovski Insurgentes 1000 Col.Kremlin 1964-05-03 T44

4 R9 Robin Hood Aquiles Serdán 1102 Col.Nueva Vizcaya 1979-03-20 RH99

5 B3 Sandro Botticelli Via Benneto 343 Col.Roma 1963-03-29 B33

6 F7 José Ramón Fernández Amarilla 3221 Col.Coapa 1953-07-31 F77

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 64Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 64

4.5 Vistas

create view InasistenciasAlumnos as

select IdInasistAlum,fecha,hora,motivo,

DatosAlumnos.idalumno,control,nombreCompleto,

domicilio,fechanac,curp

from InasistAlum,DatosAlumnos

where InasistAlum.idalumno=DatosAlumnos.idalumno

IdInasistAlum fecha hora motivo idAlumno control nombreCompleto domicilio fechanac curp

1 2001-03-05 16:00:00 Deportes 1 98042151 Pato Lucas Zarco 123 Col.Centro 1981-07-02 LP11

2 2001-03-06 16:00:00 Enfermedad 1 98042151 Pato Lucas Zarco 123 Col.Centro 1981-07-02 LP11

3 2001-03-07 16:00:00 Injustificada 1 98042151 Pato Lucas Zarco 123 Col.Centro 1981-07-02 LP11

4 2001-03-08 16:00:00 Injustificada 1 98042151 Pato Lucas Zarco 123 Col.Centro 1981-07-02 LP11

5 2001-03-01 09:00:00 Enfermedad 3 97043014 Mickey Mouse Fresno 1410 Col.Real del Prado 1981-06-23 MM33

6 2001-03-01 10:00:00 Injustificada 3 97043014 Mickey Mouse Fresno 1410 Col.Real del Prado 1981-06-23 MM33

7 2001-03-01 11:00:00 Injustificada 3 97043014 Mickey Mouse Fresno 1410 Col.Real del Prado 1981-06-23 MM33

8 2001-03-09 16:00:00 Enfermedad 4 96042121 Johnny Bravo Patoni 100 Col.Centro 1982-03-31 BJ44

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 65Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 65

4.5 Vistas

Cuando se abre una vista, en ese momento se realiza la consulta correspondiente.La redundancia aparente no afecta de ninguna

manera ya que internamente el nombre, domicilio, etc etc solo se encuentran una vez en la base de datos, por cada persona.Algunos DBMS’s permiten a los usuarios hacer

modificaciones a través de las vistasMás sencillo para el usuario ya que los atributos los

tiene en sola “tabla”.Ideales para el DBA ya que puede diseñar

correctamente con todas las tablas necesarias pero manipular los datos usando pocas “tablas”.

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 66Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 66

4.5 Vistas

Algunos otros ejemplos:

select nombreCompleto,fecha

from InasistenciasAlumnos where hora='16:00'

select * from InasistenciasAlumnos order by control

where motivo=“Injustificada”

select control,domicilio,nombreCompleto,count(*) Total

from InasistenciasAlumnos

group by control order by total desc

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 67

4.6 Manipulación de la Base de Datos

create database Itd

use Itd

create table Alumnos (IdAlumno int auto_increment primary key,control char(8) unique,curp char(18) unique)paterno char(20),materno char(20),nombre char(20),calle char(15),numeroExt numeric(8),numeroInt char(6),colonia char(15),fechaNac date )

La llave primaria permite

establecer integridad referencial

Comandos de DDL

Nombre de la Base de Datos

Los comandos se referirán a esta Base de Datos

El DBMS impedirá que se añadan tuplas con

valores iguales en las llaves

únicas

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 68

4.6 Manipulación de la Base de Datos

create table Materias (IdMateria int auto_increment primary key,

Clave char(4) unique, nombre char(20),creditos numeric(2),horasTeori numeric(2),horasPrac numeric(2))

create table Califics (IdAlumno int references Alumnos,IdMateria int references Materias,

oport char(1),resultado numeric(3),primary key (IdAlumno,IdMateria))

IdAlumno e IdMateria son foreign keys

(llaves foráneas)

Mediante esta sintaxis, se

establece integridad referencial.

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 69

alter table Alumnos add tutor char (30)select * from Alumnos

alter table Alumnos modify column tutor char(45)select * from Alumnos

alter table Alumnos drop tutorselect * from Alumnos

4.6 Manipulación de la Base de Datos

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 70

Comandos DML

INSERT (Añadir tuplas).

insert into <tabla> values (<lista de valores>)

Ejemplo:

insert into Materias values ( 0,'1215', 'Dibujo',4,0,4 )

4.6 Manipulación de la Base de Datos

Un cero instruye a MySQL que IdMateria tome el consecutivo

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 71Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 71

delete from <relación> where <expresión>

Ejemplo:

Eliminar la inasistencias de los alumnos que tuvieron solo una

delete from InasistAlum where IdAlumno in

(select IdAlumno from InasistAlum

group by IdAlumno having count(*)=1)

Si su DBMS no soporta esta sintáxis, hay que guardar la subconsulta en una tabla

temporal para poder completarla

4.6 Manipulación de la Base de Datos

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 72

Update <relación>

set <expresión asignación> where <condición>

update Materias

set creditos=HorasTeo*3+HorasPra*2

where clave like '18%'

4.6 Manipulación de la Base de Datos

Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 73

update Califics

set resultado = resultado - 1

where IdAlumno in

(select IdAlumno from InasistAlum

group by IdAlumno having count(*)>2)

4.6 Manipulación de la Base de Datos