Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Computación II
6º Semestre
Unidad 3: Síntesis y
Almacenamiento de datos
Clave
05142423/06142423
Índice
Presentación .................................................................................................................................... 3
Competencia específica ................................................................................................................... 3
Logros .............................................................................................................................................. 3
Validación ........................................................................................................................................ 3
Validación cruzada .......................................................................................................................... 4
Leave one-out .................................................................................................................................. 5
Bootstrap .......................................................................................................................................... 5
Base de datos ................................................................................................................................... 6
Panorama en los modelos de datos ................................................................................................. 7
Modelo relacional ............................................................................................................................ 8
Elementos entidad-relación ............................................................................................................ 8
Limitaciones..................................................................................................................................... 9
SQL ................................................................................................................................................ 10
Álgebra relacional ......................................................................................................................... 10
Estructura ...................................................................................................................................... 18
Consultas y subconsultas .............................................................................................................. 22
Actualizaciones y borrado ............................................................................................................. 25
Cierre de la unidad ........................................................................................................................ 29
Fuentes de consulta ....................................................................................................................... 29
Presentación
En esta unidad redondearemos el tema de la minería de datos con un par de aspectos sobre el
entrenamiento como lo es la validación del modelo, así como la regularización.
Competencia específica
Usar el modelo construido para presentar y almacenar la información para su futuro uso.
Logros
Validación
El desempeño de estos algoritmos depende enteramente de su entrenamiento, es decir, puede
estar determinado por la cantidad de iteraciones o que tan bien escogimos el conjunto de
entrenamiento. Esto induce una pregunta de forma directa. ¿Qué tan bueno fue el entrenamiento
del algoritmo? ¿Cómo se debe escoger un conjunto de entrenamiento para que el entrenamiento
sea bueno?
Es una práctica común que los algoritmos presentados en la unidad que para obtener un buen
desempeño su entrenamiento se conforme de dos fases: la de entrenamiento y la de prueba. En
algunos casos incluso hay una fase intermedia de optimización pero no es nuestro caso.
Para entrenar y probar los algoritmos requerimos dividir el conjunto en dos partes. La práctica
común dicta que 2/3 partes del conjunto se use para entrenar y el 1/3 restante para validar.
Si lo que se está haciendo es entrenar una red neuronal para abstraer una función cuyo dominio e
imagen es de los reales en los reales entonces se tiene un conjunto infinito de puntos que
proveerle para su entrenamiento y posterior validación. Pero como comúnmente lo que se va
hacer es estar usando conjuntos acotados es importante tomar en cuenta el siguiente aspecto del
entrenamiento: Los conjuntos de entrenamiento y prueba deben ser siempre ajenos.
Si usas el conjunto de entrenamiento como validación lo que estamos haciendo es provocar que
nuestro algoritmo se sobreentrene, es decir, estás incorporando el ruido que contenga este
conjunto dentro del modelo.
Para determinar numéricamente el error en que se está incurriendo una forma muy sencilla y
común de medir esto es midiendo la cantidad de ejemplos bien clasificados (o mal clasificados,
ya que estamos hablando de dos tipos de eventos independientes, los casos exitosos y los fallidos
tal cual sucede en un proceso de Bernoulli). La tasa de éxitos la definimos como
𝐶𝑎𝑠𝑜𝑠 𝑒𝑥𝑖𝑡𝑜𝑠
𝑓=
𝑁ú𝑚𝑒𝑟𝑜 𝑑𝑒 𝑐𝑎𝑠𝑜𝑠
y esta razón nos provee el porcentaje de éxito que podemos esperar de nuestros algoritmos una
vez entrenados.
Validación cruzada
A simple vista es fácil suponer que dividir al azar el conjunto de entrenamiento en dos
subconjuntos una solase podría ser víctimas de la mala suerte y dejar fuera todo un conjunto de
ejemplos que representen toda una categoría (tal vez una categoría que se represente por pocos
casos).
La forma en que atenuamos este error de muestreo es generar n subconjuntos muestreando sin
repetición el conjunto de entrenamiento. Esta n variedades son usadas después como conjunto de
entrenamiento y validación tomando n-1 conjuntos para entrenar y el último para validar.
La práctica usual dicta que n=10, es decir, que se parte el conjunto en 10 subconjuntos
muestreados aleatoriamente para usar 9 de ellos para entrenar y 1 para validar y que todo el
proceso de entrenamiento se haga por lo menos 10 veces.
Leave one-out
Este método para medir el error de nuestro algoritmo de entrenamiento, que se traduce como
Dejar Uno Fuera (DUF), presenta una variación respecto de la validación cruzada y la presenta al
ser un caso extremo de la misma. DUF es simplemente lo mismo que validación cruzada
únicamente que no hay ningún muestreo aleatorio para conformar los conjuntos de validación y
prueba.
Lo que hacemos con DUF es generar n variedades a partir del conjunto de entrenamiento, de la
misma forma que validación cruzada, usamos n-1 instancias para entrenar y la restante para
validar. La diferencia es que n es también la cardinalidad del conjunto de entrenamiento, es decir,
se ocupa n-1 ejemplos del conjunto de entrenamiento para entrenar y 1 para validar. Se repite el
proceso n veces, es decir, sobre cada una de las instancias del conjunto de entrenamiento.
La ventaja de este esquema es que no hay azar incluido en el muestreo, al ser determinístico
presente la ventaja del determinismo y del a optimalidad computacional. El problema que
presenta es que no se le puede estratificar el conjunto de entrenamiento de forma representativa.
Puedes usar este método para determinar el error en el que incurre tu algoritmo si confías en que
es suficientemente grande para atenuar errores de muestreo.
Bootstrap
Si no se está escogiendo una instancia con probabilidad 1/n entonces la probabilidad con la que
no estas escogiendo una instancia para conformar el nuevo conjunto de entrenamiento con
reemplazo es:
1 𝑛
(1 − ) = 𝑒 −1 = 0.368
𝑛
Esta es la probabilidad de que un ejemplo no sea escogido lo cual es bastante alto, lo que hace
que en un conjunto grande el error inducido al dejar fuera toda una categoría de ejemplos sea
bastante alta, es decir, el error presentado puede ser muy optimista.
Entonces ahora sabes que el conjunto de entrenamiento conformado con reemplazo contiene sólo
el 63% de los ejemplos del conjunto de entrenamiento original y por lo tanto la taza de error
cometida va a ser optimista, pero usas el factor de restitución conformada por el conjunto de
prueba de la siguiente forma
Y repites este procedimiento varias veces muestreando diferentes veces con reemplazo. Este es el
mejor método que puedes usar en un conjunto pequeño.
Base de datos
El desarrollo tecnológico conlleva dos aspectos, la cantidad de datos que se generan son, hoy en
día, inmensamente grandes, también porque los dispositivos de almacenamiento se abaratan año
con año lo que facilita la posibilidad de adquirir medios de almacenamiento masivo y por lo tanto
llenarlos de datos. Sin embargo, lo que queremos con estos datos no es únicamente guardarlos,
también queremos recuperarlos y como viste en la unidad pasada por rápidas que puedan ser las
computadoras existe siempre una forma extremadamente ineficiente de buscar en los datos.
Lo primero que tienes que definir es, que es lo que vas a guardar. Al modelar, cualquier tipo de
datos, tienes que distinguir una estructura discreta abstraída de la realidad. Entonces es por esto
que vas a distinguir entre entidades y relaciones entre ellas.
Una entidad u objeto puede ser cualquier cosa que puedas describir con un conjunto de
atributos. Por ejemplo una persona tiene un nombre, RFC, altura, preferencia política, u otra
característica que lo hace única y lo identifica con los demás, o bien pueden ser una anotación en
un partido de futbol mismo que consta de minuto en el que fue realizado, jugador que lo logró y
un jugador descrito por nombre, número, equipo, u otras. Las diferentes entidades se agrupan por
las relaciones existentes entre ellas, por ejemplo los goles son realizados por jugadores.
Cada elemento que pueda ser agrupado dentro del conjunto descrito por estas entidades y sus
correspondientes atributos la denominaremos registro. Si cada registro está representado
únicamente por un elemento se dice que la propiedad o conjunto de propiedades que lo
distinguen como único es una llave para esa entidad.
Denomina pues, como primera aproximación que una base de datos al sistema para agrupar una
o más de estas relaciones en algún dispositivo de almacenamiento. Y es que la definición de base
de datos concierne a estos diversos archivos así como a los diferentes tipos de usuarios que hacen
uso de ella.
UnADM | DCEIT | MT | MCOM2 6
Computación II
Unidad 3. Síntesis y almacenamiento de datos
Se distinguen tres tipos de usuarios de una base de datos: los administradores, los
programadores de sistemas, y los usuarios finales. Los usuarios finales son el tipo de usuario
menos sofisticado ya que usualmente el uso de la base de datos es transparente para él debido a
que interactúa con la misma a través de algún sistema programado por los programadores de
sistemas quienes pueden calificar como un nivel de sofisticación mayor al del usuario final, ya
que estos se encargan de definir las entidades donde se va a escribir en la base de datos. Un tanto
ajeno a estos dos tipos de usuarios que guardan una relación directa entre ellos está el
administrador de la base, quien es él que se encarga de administrar las transacciones y usuarios de
toda la base, los dos tipos de usuario anteriores dependen de las políticas de este último.
De hecho al sistema de base de datos que se define en el párrafo anterior se denomina más
precisamente como Sistema Manejador de Base de Datos (SMBD, o bien, las siglas en inglés
son DBMS que es como se referencia en todos los textos técnicos) y este es el que mantiene la
consistencia de los datos confiados a la base de datos a través de un sistema de archivos y un
lenguaje para tal efecto. Los SMDB constan de:
Otro aspecto importante que caracteriza a los SMBD es la independencia de los datos, un
concepto que determina el nivel de cohesión que tienen los programas que hacen uso de la base de
datos y la base datos específicamente. A modo de ejemplo puedes pensar en un sistema de nómina
y la base de datos donde se guarden los datos de dicho sistema. Si el sistema tiene un grado de
independencia muy bajo (dependencia alta) entonces cualquier modificación al sistema se va a ver
reflejada en el rediseño de la base, o cualquier falta de consistencia en la base se reflejará en el
funcionamiento del sistema de nómina. En el otro extremo, un nivel de independencia (datos muy
independientes) muy bajo requiere una gran cantidad de búsquedas y verificaciones lo que haría
un sistema muy lento. Entonces podemos inferir que el nivel de independencia tiene un nivel
óptimo que requiere ser buscado y determinado caso a caso.
Considerando los diferentes elementos que conforman una base de datos puedes destacar tres
modelos relevantes. El modelo jerárquico, que conceptualiza la información como una
estructura arbórea con un esquema de tal forma que las relaciones entre los datos se establecen
con un paradigma padre/hijo. Un nodo padre puede tener varios hijos pero un hijo sólo un padre.
El esquema de red en cambio, permite que cada nodo hijo tenga varios padres (y también varios
hijos) permitiendo así una representación más natural de las entidades modeladas.
Sin embargo, estos esquemas consideran que los datos tienen una relación jerárquica intrínseca,
relación que requiere tiempo de cómputo determinar y separar pero cuando consideramos una
gran cantidad de datos como los que pueden manejar empresas como Google, Facebook,
Microsoft, eBay, etcétera, así como las operaciones necesarias para realizar búsquedas cruzadas
en esta masa de datos y también las necesidades de escalabilidad en un entorno cambiante es
cuando la hipótesis de la estructura en los datos parece quedarse corta. Es en este contexto es que
aparece el paradigma NoSQL que tiene por objetivo responder a estas necesidades de acceso a
la información de forma eficiente dejando de lado algunas necesidades como puede ser la
ausencia del esquema intrínseco de los datos.
Modelo relacional
El modelado de datos, se mencionó con anterioridad, es una tarea que requiere un proceso de
abstracción en el que observarás un conjunto de entidades relacionadas entre sí y descritas por un
conjunto de atributos con un dominio específico. El paradigma de modelación de datos que
usaremos es el modelo relacional o entidad-relación.
Este se caracteriza por describir una relación en términos de relaciones entre diferentes dominios,
como por ejemplo, un número complejo está definido por dos enteros, cada uno de estos serían
pues atributos distintos y cada número un registro distinto. O también puedes pensar en términos
del ejemplo de sistema de nómina mencionado previamente, donde con facilidad se pueden
distinguir un conjunto variado de entidades distintas como pueden ser el empleado, el pago
quincenal, entre otros, y cada una de estas entidades tiene una descripción heterogénea de
dominios que van desde los números flotantes hasta las cadenas de texto.
Como dijimos, los Sistemas Manejadores de Bases de Datos constan de
- Una estructura de datos: En este caso es una relación o tabla.
- Un lenguaje para la definición de la estructura de datos.
- Un lenguaje para la manipulación de datos: Para este caso usaremos álgebra relacional
- Restricciones de seguridad e integridad.
Elementos entidad-relación
Una relación corresponde de forma informal a una tabla cuya definición está especificada por un
esquema de datos. Este consta de:
- Nombre de la relación o tabla.
- Conjunto de atributos nombrados específicamente.
- Un dominio 𝐷 al cual pertenece cada atributo.
Los dominios pueden ser atómicos, que corresponden a los tipos de datos usuales como enteros,
flotantes o booleanos. O bien pueden ser compuestos como puede ser un número telefónico (que
consta de números, paréntesis y guiones).
Una relación consta de dos partes principales. El encabezado o esquema (schema por su
traducción al inglés) que describe el conjunto de atributos que definen la relación, y el cuerpo de
la misma, que no es otra cosa que un conjunto de n-tuplas, se define como grado de la relación a
la cardinalidad del conjunto de atributos, en este caso n, y como cardinalidad de la relación a la
cantidad de tuplas agrupadas en esa relación. En el siguiente ejemplo se presentan estos conceptos.
La llave de una relación es el atributo (o conjunto de atributos) que hacen única a cada una de las
tuplas en la relación.
Ejemplo.
La relación empleado consta de los atributos (rfc, nombre, paterno, materno, puesto, sueldo)El
esquema de dicha relación es:
empleado(rfc, nombre, paterno, materno, puesto, sueldo)
Limitaciones
Todo modelo tiene una serie de limitantes que se derivan de su propia conceptualización. En este
caso te concentrarás en una estructura subyacente en los datos de tal forma y ahí es donde el
modelo relacional encuentra sus principales limitaciones ya que no toda la información está bien
estructurada.
Considerar que todos los datos se ajustan a una estructura bien definida es un requerimiento
suficientemente fuerte y de hecho no todos los tipos de datos lo cumplen, por ejemplo, los
siguientes tipos de datos
- Datos temporales y georreferenciados
- Datos multimedia
- Datos no estructurados / estructura débil
Algunas de las limitaciones relacionadas con el lenguaje que usa el modelo relacional para
manejar los datos, SQL, son:
- Incapacidad para hacer consultas recursivos. Todas las consultas que se hacen en SQL son
de tipo lineal en el sentido de que todos los valores que queramos presentar deben
recuperarse con anterioridad con otra consulta.
- Construir una consulta muy complicada (con muchas restricciones y llamando a varias
tablas) puede ser prohibitivo y complicado de construir
- Pero el modelo relacional tiene otros aspectos que se derivan del modelo mismo.
- Una entidad sobrevive únicamente si la definimos como una relación. Por ejemplo, si
tuviéramos una tabla Cliente que tuviera los campos calle, número, colonia, estado, esto
no conforma la dirección a menos de que la definamos como tal en una Relación.
- La atomicidad pensada en los tipos de datos que conforman las distintas relaciones
contribuye a que la conformación de consultas más complejas sea muy difícil de
computar.
SQL
Como se especifica en la sección anterior toda base de datos requiere de un lenguaje para
manejar los datos guardados. Para las bases de datos relacionales usarás el SQL. MySQL es una
implementación específica de este lenguaje (otras implementaciones son Sqlite y PostgresQL).
Examinarás los fundamentos del SQL en el Álgebra Relacional para después mostrar la estructura
general del lenguaje lo que nos va a permitir generar consultas.
Álgebra relacional
El Álgebra Relacional es la estructura que te va a permitir operar y manipular las diferentes
relaciones. Las operaciones que realicemos con las relaciones deberán resultar en una relación
también. Esta propiedad de cerradura la tiene el Álgebra Relacional.
A todas las expresiones del Álgebra relacional la denominarás query o consulta. Las operaciones
del Álgebra Relacional caen en cuatro diferentes conjuntos:
1. Operaciones Estándar: Unión, Intersección y Diferencia
2. Operaciones de Filtrado: Selección y Proyección
3. Operaciones para Combinar: Producto y Join
4. Operaciones Neutras: Renombrado de tablas
Estas operaciones, aunque limitadas, serán la base y las que más pueden usarse para extraer datos
de una base de datos.
Si 𝑅 y 𝑆 son un par de relaciones que cumplen con tener el mismo esquema, es decir, el mismo
conjunto de atributos. Las operaciones de unión, intersección y diferencia se definen de la forma
que sigue:
𝑃 𝑄
7638 Elena 45 m
5372 Andrés 21 h
8323 Ofelia 34 m
𝑃∪𝑄
3241 Juan 16 h
87 3 Alicia 78 m
𝑃−𝑄
Las operaciones de proyección y selección ayudan a filtrar relaciones imponiendo alguna condición
- Proyección: Se 𝑃 es una relación entonces la proyección de 𝑃, denotada como
𝜋𝑎1 ,𝑎2 ,…,𝑎𝑛 (𝑅), forma una nueva relación pero con una selección de los atributos que la
componen, a saber únicamente los atributos {𝑎1 , 𝑎2 , … , 𝑎𝑛 }. En otras palabras,
seleccionamos únicamente algunos de los atributos que constituyen 𝑃.
- Selección: Si 𝑄 es una relación válida entonces el operador de selección produce una nueva
relación pero seleccionando algunas tuplas (o registros) de 𝑃. La denominamos 𝜎𝐶 (𝑄)
donde 𝐶 es una condición lógica válida aplicable a 𝑄.
Ejemplo
Si 𝑃 es la misma relación antes definida, la proyección que toma únicamente los atributos si haces
la proyección de los atributos #empleado y sexo tendrías que hacerlo de la siguiente manera:
𝜋#𝑒𝑚𝑝𝑙𝑒𝑎𝑑𝑜,𝑒𝑑𝑎𝑑 (𝑃)
y el resultado sería
#empleado Edad
2343 35
3241 16
8723 78
8323 34
Y si haces la selección sobre la tabla 𝑅 = 𝑃 ∪ 𝑄 de todos los pasajeros que sean mayores de edad
la selección se especifica cómo.
𝜎𝑒𝑑𝑎𝑑≥18 (𝑅)
2343 Ernesto 35 h
8723 Alicia 78 m
7638 Elena 45 m
5372 Andrés 21 h
8323 Ofelia 34 m
𝜎𝑒𝑑𝑎𝑑≥18 (𝑅)
Un refinamiento más podría ser la proyección sobre la selección anterior para obtener únicamente
la edad y el sexo. Es decir, obtener la edad y el sexo de los pasajeros que sean mayores de edad
sobre la unión de 𝑃 ∪ 𝑄.
2343 35 h
8723 78 m
7638 45 m
5372 21 h
8323 34 m
Un refinamiento más sobre esa última relación sería seleccionar aquellos pasajeros que sean
mujeres. La expresión quedaría como
8723 78 m
7638 45 m
8323 34 m
Las operaciones con las que hemos trabajado hasta ahora nos permiten refinar los datos en alguna
relación, pero usualmente estarás trabajando con dos o más relaciones heterogéneas, entonces
requieres alguna operación que te permita conformar tablas donde no necesariamente ambas
contienen los mismos atributos, es decir vas a necesitar extender las relaciones con atributos
contenidos en otra relación., por ejemplo, nosotros tenemos una tabla pasajeros y otra destinos,
podríamos requerir conocer a que destino viajaron todos los pasajeros mayores de 60 años.
Cuando al extender tablas suele ser muy común que ambas compartan atributos y al hacer el
producto requieras que el resultado se restrinja a aquellos valores que son iguales en las
columnas compartidas. A esta operación lo llamamos join (más específicamente natural join
pero como no verás otro tipo puedes identificarlo únicamente como join).
Si 𝑅, 𝑆 son relaciones cuyos esquemas son
𝑅(𝑎1 , … , 𝑎𝑛 , 𝑟1 , … , 𝑟𝑚 )
𝑆(𝑎1 , … , 𝑎𝑛 , 𝑠1 , … , 𝑠𝑡 )
𝑅 ⋈ 𝑆(𝑎1, … , 𝑎𝑛 , 𝑟1 , … , 𝑟𝑚 , 𝑠1 , … , 𝑠𝑡 )
y las tuplas que lo conforman son el subconjunto de tuplas de 𝑅 × 𝑆 que cumplen con 𝑅. 𝑎1 =
𝑆. 𝑎1 , … , 𝑅. 𝑎𝑛 = 𝑆. 𝑎𝑛
Ejemplo.
Si tienes un par de relaciones 𝑃, 𝑄 definidas como se presenta a continuación, entonces su join sería
como se presenta en la última tabla, donde el atributo por el cuál se unen es V.
K V V A B K P.V Q.V A B
1 5 5 6 8 1 5 5 6 8
2 6 8 2 9 3 8 8 2 9
3 8
𝑃 𝑄 𝑃⋈𝑄
Otro ejemplo más práctico es el de una hipotética aerolínea. Si tenemos las tablas pasajeros, vuelos
y destinos cuyos esquemas son y tuplas son:
Pasajeros
Vuelos
El join que resulta de unir las relaciones pasajeros (P) y vuelos (V) a través del atributo (#vuelo)
queda como sigue
#pasajero P.#vuelo nombre edad sexo V.#vuelo origen destino salida arribo
En este punto puedes pensar en combinar los operadores de proyección para simplificar la
presentación del join recién hecho, por ejemplo, puedes quedarte únicamente con #pasajero,
P.#vuelo, nombre, edad, origen, destino, salida y arribo. La formulación de la proyección anterior
es:
𝜎𝑒𝑑𝑎𝑑>21 (𝑅)
Los datos no se muestran porque solo basta con contar a los 5 elementos que cumplen con esta
condición en el conjunto de tuplas recién presentado.
Nota: Los joins pueden ser por cualquier atributo, de hecho el Natural Join es un caso particular
de un Theta-Join que une tablas bajo cualquier restricción arbitraria. Para el ejemplo que acabas
de ver el Theta-Join fue sobre el atributo #vuelo y su expresión es con el símbolo ⋈𝐴 donde A es
el atributo por el que estamos uniendo. Para el ejemplo visto 𝜋𝐶 (𝑃 ⋈#𝑣𝑢𝑒𝑙𝑜 𝑉) obtiene
exactamente la misma relación.
Las operaciones de renombrado de tablas tienen como fin facilitar la manipulación de los
resultados obtenidos, de hecho las hemos estado usando, por ejemplo al renombrar la tabla vuelos
por V. No requieren mayor explicación por su trivialidad.
Estructura
Las implementaciones de SQL se basan en la especificación del mismo lenguaje. Este lenguaje se
va a encargar de todas las necesidades previstas en la especificación de las bases de datos para
sus lenguajes, esto es, el SQL se encargará de:
Definición de datos
Por ejemplo para nuestra base de datos que se llamará aerolínea la instrucción es
createdatabase aerolínea
Para crear las tablas o relaciones que la integran, cuyos nombres son vuelos, pasajeros y destinos
utilizarás la instrucción
Como puedes observar la lista de atributos va encerrada entre paréntesis y cada uno de estos se
define
< 𝑎𝑡𝑟𝑖𝑏𝑢𝑡𝑜 >∶= < 𝑛𝑜𝑚𝑏𝑟𝑒_𝑎𝑡𝑟𝑖𝑏𝑢𝑡𝑜 >< 𝑡𝑖𝑝𝑜_𝑑𝑒_𝑑𝑎𝑡𝑜 > [𝒏𝒐𝒕 𝒏𝒖𝒍𝒍]
Puedes ver que en la tabla anterior hay una instrucción que comienza con las palabras reservadas
“PRIMARY KEY” (al cual nos referiremos para abreviar como PK). Esta instrucción recibe el
nombre de un campo para el cual vas a identificar unívocamente a todos los registros de la tabla,
es decir, el nombre del campo asociado a PK debe ser único, por lo tanto id_destino no
puede repetirse en la tabla.
Los archivos que contienen estas instrucciones y las que insertan una serie de datos para probar las
puedes descargar el sitio, se llaman aerolínea.sql y aerolínea_datos.sql. La forma
de ejecutar estos archivos .sql desde el símbolo del sistema es la siguiente
Los archivos .sql son scripts que contienen instrucciones válidas de MySQL y se ejecutan línea
por línea.
Ambos archivos los puedes bajar de la carpeta Material de Apoyo correspondiente a la unidad 2.
En este caso puedes observar que después de la definición de PK hay dos instrucciones que
comienzan con CONSTRAINT. Estas líneas especifican una restricción sobre la base de datos,
cada una tiene un nombre (fk_destino y fk_origen) y después la restricción específica.
En ambos casos esa restricción es la aplicación de una llave foránea y lo que va a hacer es checar
la consistencia del campo especificado y en que tabla está ese valor, el último modificador dice
en qué casos va a checar la consistencia.
Es decir, el campo “origen” hace referencia a la tabla “destinos” en el campo de esta tabla
llamada “id_destino” y el chequeo se va a hacer cuando se hagan borrados o actualizaciones.
Automáticamente se hacen cuando se insertan datos.
Ahora, las tablas están compuestas por atributos con cierto dominio, para especificar cada uno de
estos
No olvides poner especial atención en que partes de código expuesto hay comas (,), puntos y
comas (;) o ningún carácter al final de la instrucción.
Manejo de datos
Dentro de las instrucciones para hacer el correcto manejo de datos se encuentran las instrucciones
INSERT, UPDATE y DELETE. Adicionalmente también están las instrucciones para alterar la
estructura de una tabla y esto lo puede lograr la instrucción ALTER.
Consultas
La consulta de los datos es la tarea más frecuente cuando se usa una base de datos. La instrucción
que puede hacer esto es la instrucción SELECT detallada en las siguientes secciones
Condiciones
Los operadores de comparación de SQL se definen en la siguiente tabla, podrás ver que incluimos
un operador denominado IS, este verifica que su argumento sea efectivamente un valor booleano,
por ejemplo IS TRUE regresa 1.
Función Operador
Igualdad =
Distinto <>
OR, || Disyunción
NOT, !
WHERE fecha_salida > WHERE destino = ’1’ WHERE país <> ‘Mèxico’
’2013-02-23’
(2) (3)
(1)
La razón por la que se está describiendo un apartado para WHERE es porque permite seleccionar
tuplas con el criterio especificado y esta selección de tuplas le sirve tanto a la instrucción
SELECT, como a UPDATE o DELETE.
Consultas y subconsultas
La instrucción más importante para SQL es la instrucción SELECT. Esta se encarga de mostrar los
datos requeridos en pantalla en forma de tablas.
Su sintaxis es
FROM <tablas>
[WHERE <condición>]
Es decir, el valor de <atributos> puede ser o bien un asterisco, o bien una lista de atributos
separados por comas, o bien una cada una de estas relaciones puede estar precedida por el nombre
de la relación terminada por un punto.
Si quieres la proyección sobre la tabla de pasajeros que recupera los atributos id_pasajero y sexo,
entonces las siguientes tres relaciones son equivalentes para la consulta
𝜋𝑖𝑑_𝑝𝑎𝑠𝑎𝑗𝑒𝑟𝑜,𝑠𝑒𝑥𝑜 (𝑝𝑎𝑠𝑎𝑗𝑒𝑟𝑜𝑠)
En la última instrucción utilizamos un alias para la tabla pasajeros en la que la renombramos como
P y así es como la referenciamos dentro de la consulta.
Si lo que queremos es hacer una selección sobre esa proyección en la que escojamos a todos los
hombres tenemos que hacer uso de la cláusula WHERE y fijar el valor sexo=’h’. La selección en
álgebra relacional queda como
Si lo que queremos es la proyección sobre los atributos id_vuelo, origen y destino de la tabla
vuelos pero siempre y cuando los vuelos salgan en el medio día su fórmula en el álgebra
relacional es
Cuya restricción es que el número de columnas en cada relación sea el mismo. Por ejemplo
Pero todas estas consultas están completamente limitadas a la selección y proyección sobre una
sola tabla. Si quisieras hacer el producto de dos relaciones entonces el átomo FROM debe
contener todas las relaciones de dónde vas a hacer nuestro producto. En un ejemplo anterior
seleccionas algunos valores sobre las relaciones pasajeros y vuelos. Si quisieras todo el producto
entre ambas relaciones, su fórmula en álgebra relacional queda como
𝑣𝑢𝑒𝑙𝑜𝑠 × 𝑝𝑎𝑠𝑎𝑗𝑒𝑟𝑜𝑠
Pero esto no sería de gran utilidad ya que estarías formando tuplas que no guardan relación
alguna entre ellas, recuerda que el producto de dos relaciones es el producto cruz entre ellas.
Algo de más utilizad es formar un WHERE en el que ligas un par de atributos entre ambas tablas,
por ejemplo
Así al restringir la consulta a restricciones en atributos de cada una de las tablas consultadas el
subconjunto de tuplas en la consulta será un poco más interesante que simplemente listarlas
todas. Pero como viste en la sección anterior, una forma de hacer un producto es hacer un natural
join.
Natural Joins
Si hacemos la consulta
Pero ligando los datos que son comunes entre ambas relaciones de la siguiente forma
Entonces restringirás nuestra consulta a todos aquellos pasajeros que realmente volaron en una
fecha dada. Esto es en esencia un natural join, pero MySQL se encarga de hacerlo con una
instrucción predestinada para tal efecto, y es la cláusula JOIN. Su uso se ilustra haciendo el join
anterior.
La sintaxis queda clara a partir de este ejemplo, en la cláusula FROM seleccionas la primera tabla
JOIN la segunda tabla con quien queramos relacionarla para después especificar la llave de cada
tabla por la que se hace el join. Si quieres extender ese resultado obtenido para cruzarla con los
detalles que nos puede ofrecer la tabla destinos entonces tenemos que hacer otro join, pero como
la tabla obtenida
Con esta consulta obtendrías todos los atributos comunes a las tuplas que tengan en común el
número de vuelo en las tablas vuelos y pasajeros y a su vez en común el id_destino en la tabla
destinos con el valor de origen en la tabla vuelos.
Actualizaciones y borrado
Las principales instrucciones para hacer la actualización de datos de datos en una tabla son las
instrucciones INSERT y UPDATE. Estas instrucciones tienen por finalidad el insertar y
actualizar datos en alguna tabla cuidando la integridad de los datos.
En este caso la lista de atributos debe ir en el mismo orden en el que están definidos la secuencia
de datos en la relación, por ejemplo, las tres sentencias que siguen insertan datos en las tablas
especificadas de forma correcta
Si los datos no existen entonces la secuencia de ejecución de estas tres instrucciones no lanzará
ningún error ya que en la tabla destinos el campo id_destino está marcado como llave
primaria, esto quiere decir que no puede existir otro destino que tome el valor 2 en el campo
id_destino. Como en la tabla vuelos el campo destino está marcado como llave foránea
(FOREIGN KEY) entonces la inserción del vuelo 435 (cuyo valor debe ser único por la misma
razón que en la tabla vuelos) será posible de llevarse a cabo. Para finalizar con la última
instrucción que también agrega una tupla que debe ser única según su llave id_pasajero pero
que también checa que el vuelo con id_vuelo = 435 exista ya que de otra manera se lanzará
un error de consistencia de datos.
Esta forma permite variar el orden en el que se pasan los datos a meter a la tabla. Por ejemplo
𝑼𝑷𝑫𝑨𝑻𝑬 < 𝑟𝑒𝑙𝑎𝑐𝑖ó𝑛 > 𝑺𝑬𝑻 < 𝑙𝑖𝑠𝑡𝑎_𝑎𝑡𝑟𝑖𝑏𝑢𝑡𝑜𝑠 > 𝑊𝐻𝐸𝑅𝐸 < 𝑝𝑟𝑒𝑑𝑖𝑐𝑎𝑑𝑜 >
+-------------+----------+-----------+------+------+
| id_pasajero | id_vuelo | nombre | edad | sexo |
+-------------+----------+-----------+------+------+
| 2343 | 334 | Ernesto | 35 | h |
| 3241 | 435 | Juan | 16 | h |
| 5372 | 334 | Andrés | 21 | h |
| 5372 | 435 | Andrés | 21 | h |
| 7638 | 443 | Elena | 45 | m |
| 8323 | 113 | Ofelia | 34 | m |
| 8323 | 116 | Ofelia | 21 | h |
| 8723 | 442 | Alicia | 78 | m |
+-------------+----------+-----------+------+------+
8 rows in set (0.00 sec)
Si quisieras actualizar a todos los pasajeros cuyo nombre es Ernesto por Ernestina y su sexo de
‘h’ a ‘m’ entonces la instrucción debería ser
+-------------+----------+-----------+------+------+
| id_pasajero | id_vuelo | nombre | edad | sexo |
+-------------+----------+-----------+------+------+
| 2343 | 334 | Ernestina | 35 | m |
| 3241 | 435 | Juan | 16 | h |
| 5372 | 334 | Andrés | 31 | h |
| 5372 | 435 | Andrés | 31 | h |
| 7638 | 443 | Elena | 45 | m |
| 8323 | 113 | Ofelia | 34 | m |
| 8323 | 116 | Ofelia | 31 | h |
| 8723 | 442 | Alicia | 78 | m |
+-------------+----------+-----------+------+------+
8 rows in set (0.00 sec)
Nota: UPDATE es una instrucción que puede alterar uno o todos los datos y que no
necesariamente requiere de un predicado WHERE para poder ser usado, esto quiere decir que la
instrucción
Va a cambiar todos los valores anteriores por valor_nuevo en el atributo c de la tabla t1. Si esto
no era lo que querías hacer es posible que pierdas información, tiempo, recursos y todo lo que
esto conlleva. Como consejo, cuando vayas a hacer una actualización en una tabla escribe
UPDATE WHERE
La última instrucción para actualizar la información en una tabla es la de borrado de tuplas, esta
instrucción es DELETE y su sintaxis es muy parecida a la de UPDATE.
Si la tabla de donde estás borrando la tupla tiene definida una llave foránea en otra tabla entonces
obtendrás un error de integridad en los datos, por ejemplo
Este error aparece principalmente porque el destino con id_destino=’1’ está referenciado en otra
tabla, particularmente la de vuelos, es por esto que no se nos permite borrarlo. Si en cambio no
existe ninguna referencia a la tupla que estás borrando en otra tabla entonces no hay problema
para hacerlo. Como el destino con id_destino=’5’ no está referenciado en ninguna otra tabla
entonces su borrado es directo.
Cierre de la unidad
Con esta unidad has terminado la asignatura de Computación II. Toda esta asignatura giró alrededor
de lo que son los datos, la información y como se manipulan y almacenan.
Este tipo de algoritmos puede ayudarte a indagar un poco más sobre conceptos como información,
aprendizaje computacional, teoría de la información, inteligencia computacional y minería de
datos. En general esta unidad acabas de ver un panorama más o menos ilustrativo de cómo es la
síntesis y almacenamiento de datos.
Fuentes de consulta
Witten, I. H. (2005). Data Mining: Practical machine learning tools and techniques. Morgan
Kaufmann.
Grassmann, W. K., &Tremblay, J. P. (1996). Logic and discrete mathematics(Vol. 1). Upper
Saddle River, New Jersey: Prentice Hall.
Garcia-Molina, H., Ullman, J. D., &Widom, J. (2000). Database system implementation (Vol.
654). Upper Saddle River, NJ:: Prentice Hall.