Este es el primero de dos vídeos donde donde aprenderemos sobre Álgebra Relacional El Álgebra Relacional es un lenguaje formal Es un álgebra que forma la base de lenguajes implementados como lo es SQL En este vídeo iremos aprendiendo las bases del Lenguaje de Consultas del Álgebra Relacional y un poco de los operadores más populares. En el segundo vídeo aprenderemos algunos operadores adicionales y algunas notaciones alternativas para el Álgebra Relacional. Ahora, recapitulemos primero de nuestro vídeo previo sobre consultas relacionales, que las consultas sobre bases de datos relacionales operan sobre relaciones(tablas) y que estas producen relaciones(tablas) como resultado Así, sí escribimos una consulta(query) que opere, digamos sobre las tres relaciones representadas aquí, el resultado de la consulta será una nueva relación(tabla) Y, de hecho, podemos hacer una consulta posterior sobre esta nueva relación o combinar la nueva relación con nuestras relaciones(tablas) previas Así que empecemos con el Álgebra Relacional Para los ejemplos en este vídeo estaremos usando una simple base de datos de admisión a universidades con tres relaciones(tablas) La primera relación, la relación de universidades, que contiene información sobre el nombre de la universidad, el estado y la cantidad de estudiantes (enrollment) La segunda relación, la relación de estudiantes que contiene un ID para cada estudiante, el nombre del estudiante, GPA y el tamaño de la preparatoria a la que ellos asistieron. Y finalmente, la tercera relación que contiene información sobre los registros de estudiantes a las universidades Específicamente, el ID del estudiante, el nombre de la universidad en donde se registraron, la carrera que solicitaron y la decisión de aceptados o no He subrayado las claves(llaves) de las tres relaciones Como un recordatorio, una clave(llave) es un atributo o un conjunto de atributos cuyos valores se garantiza serán únicos. Así, por ejemplo, estaremos asumiendo que el nombre de universidad sera único, que los IDs de los estudiantes serán unicos y que los estudiantes sólo se registraran a una carrera en particular por cada universidad una sola vez. Así tendremos una imagen de las tres relaciones en la parte inferior de la diapositiva durante el vídeo. La consulta más simple en el álgebra relacional es una consulta que es simplemente el nombre de una relación. Así, por ejemplo, podemos escribir una consulta, "estudiante"(student) y esta es una expresión valida en álgebra relacional. Sí corremos esta consulta en nuestra base de datos obtendremos como resultado una copia de la relación de estudiantes muy sencillo. Ahora lo que pasara después es que estaremos usando operadores del álgebra relacional para filtrar relaciones, rebanar relaciones y combinar relaciones Así que vayamos por esos operadores. El primer operador es el operador seleccionar. El operador seleccionar es usado para quitar ciertas filas de una relación El operador seleccionar se denota por Sigma con un sub-índice que es la condición que se usara para filtrar las filas que extraeremos de las relaciones Así que vayamos con tres ejemplos aquí. El primer ejemplo dice que queremos encontrar los estudiantes cuyo GPA es mayor que 3.7. Así que para escribir esa expresión en álgebra relacional, escribiremos Sigma el cual es el operador seleccionar y con la condición en el sub-índice que estaremos filtrando el GPA mayor a 3.7 -- y la relación sobre la que estamos buscando Así, esta expresión regresara un subconjunto de la tabla estudiantes conteniendo aquellas filas con el GPA mayor a 3.7. Sí queremos filtrar con dos condiciones, solo hacemos un "and" de las condiciones en el sub-índice del Sigma Así sí queremos, digamos, aquellos estudiantes cuyo GPA es mayor a 3.7 y cuyo tamaño de su preparatria sea menor a 1000, escribiremos, seleccionar GPA mayor a 3.7 Usamos un operador "and logico" con el simbolo ^ tamaño de la preparatoria menor a 1000, y la aplicamos sobre la relación de estudiantes. Y una vez más el resultado de esta será un subconjunto de la relación de estudiantes conteniendo las filas que satisfagan la condición. Sí queremos encontrar los registros para Stanford para la carrera CS, entonces estaremos realizando una condición de selección sobre la relación "Apply" Una vez más, escribimos Sigma y ahora en el sub-índice estará diciendo que el nombre de universidad sea Stanford y que la carrera sea CS Otra vez, el operador and ^, y que será aplicado sobre la relación "apply" y esta regresara como resultado, un subconjunto de la relación "apply" Así que el caso general del operador seleccionar es que tenemos a Sigma Tenemos una condición como un sub-índice y después tenemos un nombre de una relación. Y regresamos como resultado el subconjunto de la relación. Nuestro siguiente operador es el Operador Proyectar Mientras el Operador Seleccionar toma ciertas filas, el Operador Proyectar toma ciertas columnas. Así que digamos que estamos interesados en los registros a universidad, pero todo lo que queremos saber es la lista de los IDs y de la decisiones de aceptación. El operador proyectar se escribe usando el símbolo Griego Pi y como sub-índice sera la lista de nombres de columna que nos gustaría extraer. Así escribimos ID, lo siento. ID del estudiante(student ID), decisión(decision) y lo aplicamos a la relación "apply" Ahora lo que hemos obtendremos de regreso es una relación que solo tiene 2 columns Esta tendrá todas las tuplas de "apply", pero solo va a tener los IDs de los estudiantes y la columna decisión. Así que el caso general del Operador Proyectar es la proyección y después la lista de atributos, que puede ser cualquier cantidad de ellos y finalmente el nombre de la relación. Ahora, que si estamos interesados en obtener tanto filas como columnas al mismo tiempo. Así si queremos sólo algunas filas, y queremos sólo algunas columnas Ahora vamos a unir operadores Recuerda que las consultas relacionales producen relaciones. Así que podemos escribir un consulta digamos que el operador seleccionar de los estudiantes cuyos GPA son mayores a 3.7 Y esto es como lo hacemos podemos tomar la expresión entera la cual produce una relación y podemos aplicarle la proyección a esta, y podemos obtener como resultado el id del estudiante y el nombre del estudiante muy bien. Así que lo que de hecho vemos ahora es el caso general de los operadores selección y de la proyección que fueron bastante de lo que dije al inicio. Estuve engañándote un poquito Cuando escribimos el operador seleccionar, Este es un seleccionar(select) con la condición sobre cualquier expresión del álgebra relacional, y sí esta es muy grande podríamos querear poner paréntesis y de forma similar el operador proyección es una lista de atributos de cualquier expresión del álgebra relacional y podemos unirlos tantos como quereamos Podemos tener una selección sobre una proyección sobre una selección, una selección, una proyección y así sucesivamente. Ahora hablemos acerca de valores duplicados en los resultados de consultas del álgebra relacional Supongamos que necesitamos una lista de las carreras para las que personas se han registrado y la decisión para esas carreras. Así que escribimos la proyección de las carreras y la decisión sobre la relación "apply" Podrías pensar que cuando obtenemos el resultado de la consulta, vamos a obtener un montón de valores duplicados. Así tendremos CS si, CS si, CS no, EE si, EE no, y así sucesivamente. Puedes imaginar una enorme base de datos real de una aplicación va ha haber cientos de personas registradas para carreras y tendrán un si o no como decisión La semántica del álgebra relacional dice que los duplicados son siempre eliminados Así sí tu realizas una consulta que lógicamente tendría un montón de valores duplicados tu sólo obtienes un valor para cada resultado Esto es de hecho una pequeña diferencia con el lenguaje SQL Mientras SQL esta basado en lo que conocemos como multi-conjuntos o bolsas y eso significa que no eliminamos los duplicados, mientras que el álgebra relacional esta basado en conjuntos donde los duplicados son eliminados O bien hay un multi-conjunto o hay una mala definición del álgebra relacional por lo mientras, pero estaremos bien tan sólo considerando el conjunto álgebra relacional en estos vídeos. Nuestro primer operador que combina dos relaciones es el operador producto-cuz también conocido como el producto cartesiano Lo que este operador hace es tomar dos relaciones y un poco de pegamento para juntarlas a su esquema resultante es la unión de los esquemas de las dos relaciones y el contenido del resultado serán todas las combinaciones de las tuplas(filas) de esas relaciones. De hecho el conjunto normal del producto cruz es el que pudieras haber aprendido antes en la primaria Así que hablemos, digamos hacer el producto cruz de estudiantes y de "apply" sí hacemos este producto cruz, sólo para tener una imagen, voy a pegar estas dos relacionas para unirlas aquí. sí hacemos el producto cruz obtendremos como resultado una gran relación, aquí, la cual va a tener 8 atributos Los 8 atributos de los estudiantes y "apply" ahora el único pequeño truco es cuando pegamos dos relacionas para juntarlas algunas veces tendrán el mismo atrubuto duplicado y podemos ver que tendremos que tenemos SID en ambos lados así sólo como una convención de notación cuando el producto cruz es hecho y hay dos atributos que son nombrados igual A ellos se les antepone el nombre de la relación a la cual pertenecen así este sería referenciado en el producto cruz como student.SID donde este otro así sería referenciado como apply.SID De nuevo unimos, en el producto cartesiano, las dos relaciones con 4 atributos cada una. obtenemos como resultado 8 atributos Ahora hablemos obre el contenido de estos supongamos que la relación de estudiantes tiene S tuplas mientras que "apply" tiene 8(A) tuplas el resultado del producto cartesiano va a tener SxA tuplas va a tener una tupla por toda combinación de tuplas de la relación de estudiantes y de la relación "apply" Ahora, el producto cruz parece que podría no ser útil , pero lo que es interesante es que usamos el producto cruz junto con otros operadores Y veamos un gran ejemplo de esto Supongamos que queremos obtener el nombre y GPAs de los estudiantes con una tamaño de preparatoria mayor a 1000 y a aquellos que se registraron para CS y no fueron aceptados OK echemos un un vistazo. vamos a tener acceso a las filas de la tablas estudiantes y de "apply" con el fin de realizar consultas lo que vamos a hacer es que tomaremos los estudiantes que se registraron como punto de partida ahora tenemos una gran relación que contiene 8 atributos y todas esas tuplas que describimos previamente Pero ahora vamos a empezar a hacer cosas mas interesantes, porque lo que vamos a hacer es una gran selección sobre esta relación Y para la selección primero que todo es asegurarnos de que sólo combine las tuplas de estudiantes con las tuplas de "apply" que están referenciadas por el mismo studiante id Para hacerlo escribimos student.SID igual a apply.SID así hemos filtrado el resultado del producto cruz, sólo incluyendo combinaciones de estudiantes y registros de "apply" por parejas para hacer el conjunto Ahora que hemos hecho un pequeño adicional filtrado decimos que queremos que el tamaño de la preparatoria sea mayor a 1000, así usamos un operador "and" en la preparatoria queremos también los que se registraron a CS así que eso es un "and" y carrera igual a CS Vamos a obtener una bonita gran consulta aquí y finalmente queremos los que fueron rechazados así "and" decisión igual, sólo estamos usando R para rechazados así tenemos una gigantesca consulta. Esto nos da exactamente lo que queremos excepto por una cosa la cual es, como ya había dicho, todo lo que queremos es sus nombres y sus GPAs Así que para finalizar ponemos un gran paréntesis alrededor aquí y le aplicamos el operador proyección para obtener el nombre del estudiante y el GPA Y esto es una expresión del álgebra relacional que produce la consulta que hemos escrito en inglés Ahora que hemos visto como el producto cruz nos permite combinar tuplas y de que después podemos aplicarles condiciones de selección para obtener un resultado que tenga significado esto hace que el álgebra relacional incluya un operador llamado el "natural join" que es usado para exactamente el propósito descrito Lo que el natural join hace es que realiza el producto cruz pero después busca igualdad en los atributos que tengan el mismo nombre Así si configuramos nuestro esquema apropiadamente, por ejemplo que tenemos un id de estudiante y otro aquí significan la misma cosa y cuando aplicamos el producto cruz este sólo va a combinar las tuplas donde el id del estudiante sea el mismo Y aún mas, sí agregamos universidad, podemos ver que tenemos el nombre de universidad aquí y aquí también sí combinamos las tuplas de universidad y "apply" combinaremos sólo las tuplas que esten hablando de la misma universidad Ahora en adición, una cosa más que esto hace es quita esos atributos que tienen el mismo nombre así una vez que combinamos por ejemplo, estudiantes y "appy" con el "natural join" sólo combinaremos tuplas donde los SID de estudiante y los SID de "apply" sean el mismo Por lo que no necesitamos mantener dos copias de lo aquellas columnas porque los valores siempre serán los mismos así el operador natural join se escribe usando un símbolo como moño esa es tan sólo la convención lo encontraras en tus programas editores de texto, sí buscas cuidadosamente. así que hagamos algunos ejemplos. Regresemos a nuestra misma consulta donde estábamos buscando los nombres y GPAs de los estudiantes de grandes preparatorias quienes se registraron para la carrera CS y que fueron rechazados. Así que ahora en lugar de usar el producto cruz vamos a usar el natural join, el cual como dije se escribe con un símbolo similar a moño que nos permite hacer, una vez hecho el natural join, esto es que no tenemos que escribir la condición, que especifique la igualdad de esos dos atributos, porque este lo hará por si mismo y una vez que lo hemos hecho eso todo lo que necesitamos hace es aplicarlo al resto de nuestras condiciones. la cual fue que la preparatoria sea más grande que 1000 y que la carrera sea igual CS y que la decisión sea rechazados, otra vez llamaremos a eso R, después una vez que sólo hemos obtenido el nombre y GPAs, escribimos los nombres de estudiantes y GPA bien y ese es el resultado de la consulta usando un natural join así, como puedes ver este es un poco más simple que la original con el producto cruz y por configurar el esquema correctamente, el natural join puede ser útil Ahora agreguemos una complicación más a nuestra consulta Supongamos que sólo estamos interesados en los registros a universidades en las que la cantidad de alumnos sea mayor a 20,000 hasta ahora en nuestra expresión nos referimos a la relación de estudiantes y la de "apply" pero no hemos usado la relación de universidades pero sí queremos tener un filtro sobre la cantidad de alumnos, vamos a tener que traer la relación de universidades a escena esto podría volverse más fácil de lo que piensas Tan sólo borremos un par de nuestros parámetros aquí y lo que vamos a hacer es que vamos a juntar la relación de universidades, con las dos relaciones que ya tenemos Ahora técnicamente el natural join es un operador binario, las personas frecuentemente lo usan sin paréntesis porque es asociativo, Podríamos agregarlo y después estaría en buena forma Ahora que ya hemos juntado las tres relaciones y recordemos que el natural join automáticamente busca los atributos que comparten el mismo nombre muy específicamente, el nombre de la universidad aquí va a ser igual al nombre de universidad de la relación "apply" también Ahora una vez que hemos hecho esto, tenemos toda la información que necesitamos. Sólo tenemos que agregar una condición de filtro más, la cual es que la cantidad de alumnos de las universidades sea mayor a 20,000 y con esto, ya tenemos nuestra consulta Para resumir el natural join , el natural join combina relaciones Esto automáticamente pone valores iguales cuando los nombres de atributos son los mismos y después elimina las columnas duplicadas El natural join de hecho no agrega ningún poder expresivo al álgebra relacional podemos reescribir el natural join sin usar el producto cruz sólo permitanme reescribirla aquí sí tenemos, y ahora voy a usar el caso general de dos expresiones Una expresión , natural join con otra expresión, que es de hecho equivalente a hacer una proyección sobre el esquema de la primera expresión - sólo la llamare E1 ahora unión el esquema de la segunda expresión Esta es un unión real, así esto significa que sí tenemos dos copias sólo nos quedamos con una de ellas sobre la selección, Ahora vamos a poner todos los atributos compartidos de la primera expresión para ser igual a los atributos compartidos de la segunda Así sólo escribo E!, A1 igual a E2, A1 y E1, A2 iguales a E2.A2 Ahora estos son caso en los que una vez más, los atributos tiene el mismo nombre y así así que ponemos todo igual y esa es aplicada sobre la expresión 1 producto cruz 2 así otra vez, el natural join no nos va a dar poder expresivo adicional, pero es una muy conveniente notación El último operador que voy a cubrir en este vídeo es el operador Theta Join Al igual que el natural join, el Theta join es de hecho una abreviatura que no agrega poder expresivo al lenguaje Permitanme escribir esto El operador theta join toma dos expresiones y las combina con operador del símbolo de moño pero con un sub-índice theta Aquel Theta es una condición Esta condición en el estilo de las condiciones en el operador seleccionar y que este de hecho dice de hecho es muy simple es equivalente a aplicar la condición Theta al producto cruz de dos expresiones así podrías preguntarte por qué menciono el operador Theta join y la razón por la que lo menciono es porque la mayoria de las sistemas administradores de bases de datos implementan el theta join como una operación básica para combinar relaciones así el operador básico que toma dos relaciones, y que combina todas las tuplas pero que sólo mantiene las combinaciones que satisface la condición theta frecuentemente cuando le hablas a las personas quienes construyen sistemas de bases de datos o que usan bases de datos, cuando ellos usan la palabra join, ellos quieren decir el theta join así, concluyendo, el álgebra relacional es un lenguaje formal Este opera sobre conjuntos de relaciones y produce relaciones como resultado La consulta más simple es tan sólo el nombre de la relación y los operadores son usados para filtrar relaciones, rebanarlas o combinarlas Hasta ahora hemos aprendido sobre el operador seleccionar para seleccionar filas el operador proyección para seleccionar columnas, el operador producto cruz para combinar todo posible par de tuplas de las dos relaciones y después dos abreviaturas, el natural join el cual es una muy útil forma de combinar relaciones quitando ciertas columnas similares y el operador theta join. En el siguiente vídeo aprenderemos algunos operadores adicionales del álgebra relacional y también algunas notaciones alternativas para expresiones del álgebra relacional.