0:00:00.048,0:00:01.062 Este es el primero de dos 0:00:01.062,0:00:04.086 vídeos donde donde aprenderemos sobre Álgebra Relacional 0:00:04.086,0:00:07.034 El Álgebra Relacional es un lenguaje formal 0:00:07.034,0:00:09.001 Es un álgebra que forma 0:00:09.001,0:00:12.006 la base de lenguajes implementados como lo es SQL 0:00:12.006,0:00:14.001 En este vídeo iremos 0:00:14.001,0:00:15.011 aprendiendo las bases del 0:00:15.011,0:00:19.043 Lenguaje de Consultas del Álgebra Relacional y un poco de los operadores más populares. 0:00:19.043,0:00:20.067 En el segundo vídeo aprenderemos 0:00:20.067,0:00:22.039 algunos operadores adicionales y algunas 0:00:22.039,0:00:26.036 notaciones alternativas para el Álgebra Relacional. 0:00:26.036,0:00:28.013 Ahora, recapitulemos primero de 0:00:28.013,0:00:29.086 nuestro vídeo previo sobre consultas 0:00:29.086,0:00:31.062 relacionales, que las consultas sobre 0:00:31.062,0:00:33.066 bases de datos relacionales operan sobre 0:00:33.066,0:00:36.097 relaciones(tablas) y que estas producen relaciones(tablas) como resultado 0:00:36.097,0:00:38.005 Así, sí escribimos una consulta(query) 0:00:38.005,0:00:39.008 que opere, digamos sobre las tres 0:00:39.008,0:00:41.071 relaciones representadas aquí, el 0:00:41.071,0:00:44.073 resultado de la consulta será una nueva relación(tabla) 0:00:44.073,0:00:46.012 Y, de hecho, podemos 0:00:46.012,0:00:47.075 hacer una consulta posterior sobre esta 0:00:47.075,0:00:49.036 nueva relación o combinar la 0:00:49.036,0:00:52.035 nueva relación con nuestras relaciones(tablas) previas 0:00:52.035,0:00:54.051 Así que empecemos con el Álgebra Relacional 0:00:54.051,0:00:56.017 Para los ejemplos en 0:00:56.017,0:00:57.029 este vídeo estaremos 0:00:57.029,0:01:00.093 usando una simple base de datos de admisión a universidades con tres relaciones(tablas) 0:01:00.093,0:01:02.013 La primera relación, la relación de 0:01:02.013,0:01:03.086 universidades, que contiene información sobre el 0:01:03.086,0:01:06.086 nombre de la universidad, el estado y la cantidad de estudiantes (enrollment) 0:01:06.086,0:01:08.002 La segunda relación, la relación de 0:01:08.002,0:01:10.005 estudiantes que contiene un ID 0:01:10.005,0:01:11.071 para cada estudiante, el nombre del estudiante, 0:01:11.071,0:01:14.053 GPA y el tamaño de la preparatoria a la que ellos asistieron. 0:01:14.053,0:01:16.002 Y finalmente, la tercera relación que contiene 0:01:16.002,0:01:18.079 información sobre los registros de estudiantes a las universidades 0:01:18.079,0:01:20.005 Específicamente, el ID del estudiante, el 0:01:20.005,0:01:21.065 nombre de la universidad en donde se 0:01:21.065,0:01:22.088 registraron, la carrera 0:01:22.088,0:01:25.089 que solicitaron y la decisión de aceptados o no 0:01:25.089,0:01:28.069 He subrayado las claves(llaves) de las tres relaciones 0:01:28.069,0:01:30.073 Como un recordatorio, una clave(llave) es 0:01:30.073,0:01:31.079 un atributo o un conjunto de 0:01:31.079,0:01:33.031 atributos cuyos valores 0:01:33.031,0:01:35.056 se garantiza serán únicos. 0:01:35.056,0:01:36.084 Así, por ejemplo, estaremos 0:01:36.084,0:01:38.037 asumiendo que el nombre de universidad sera único, 0:01:38.037,0:01:40.033 que los IDs de los estudiantes serán unicos y que 0:01:40.033,0:01:41.091 los estudiantes sólo se registraran a 0:01:41.091,0:01:46.022 una carrera en particular por cada universidad una sola vez. 0:01:46.022,0:01:47.028 Así tendremos una 0:01:47.028,0:01:48.007 imagen de las tres relaciones en 0:01:48.007,0:01:52.038 la parte inferior de la diapositiva durante el vídeo. 0:01:52.038,0:01:54.017 La consulta más simple en el álgebra 0:01:54.017,0:01:55.051 relacional es una consulta 0:01:55.051,0:01:57.062 que es simplemente el nombre de una relación. 0:01:57.062,0:01:58.085 Así, por ejemplo, podemos 0:01:58.085,0:02:01.021 escribir una consulta, "estudiante"(student) y esta 0:02:01.021,0:02:04.022 es una expresión valida en álgebra relacional. 0:02:04.022,0:02:05.036 Sí corremos esta consulta en 0:02:05.036,0:02:07.002 nuestra base de datos obtendremos como 0:02:07.002,0:02:09.058 resultado una copia de la relación de estudiantes 0:02:09.058,0:02:11.003 muy sencillo. 0:02:11.003,0:02:12.068 Ahora lo que pasara después 0:02:12.068,0:02:13.085 es que estaremos usando 0:02:13.085,0:02:15.074 operadores del álgebra relacional 0:02:15.074,0:02:19.092 para filtrar relaciones, rebanar relaciones y combinar relaciones 0:02:19.092,0:02:23.041 Así que vayamos por esos operadores. 0:02:23.041,0:02:26.006 El primer operador es el operador seleccionar. 0:02:26.006,0:02:27.077 El operador seleccionar es usado 0:02:27.077,0:02:30.008 para quitar ciertas filas de una relación 0:02:30.008,0:02:31.067 El operador seleccionar se denota por 0:02:31.067,0:02:33.067 Sigma con un sub-índice que 0:02:33.067,0:02:35.012 es la condición que se usara para 0:02:35.012,0:02:37.004 filtrar las filas que extraeremos de las relaciones 0:02:37.004,0:02:40.028 Así que vayamos con tres ejemplos aquí. 0:02:40.028,0:02:41.005 El primer ejemplo dice que 0:02:41.005,0:02:42.066 queremos encontrar los estudiantes 0:02:42.066,0:02:44.019 cuyo GPA es mayor que 3.7. 0:02:44.019,0:02:45.096 Así que para escribir esa 0:02:45.096,0:02:47.059 expresión en álgebra relacional, escribiremos 0:02:47.059,0:02:48.078 Sigma el cual es 0:02:48.078,0:02:50.059 el operador seleccionar y con 0:02:50.059,0:02:51.077 la condición en el sub-índice que 0:02:51.077,0:02:54.053 estaremos filtrando el GPA mayor a 0:02:54.053,0:02:58.054 3.7 -- y la relación sobre la que estamos buscando 0:02:58.054,0:03:00.069 Así, esta expresión regresara 0:03:00.069,0:03:02.001 un subconjunto de la tabla 0:03:02.001,0:03:04.001 estudiantes conteniendo aquellas filas 0:03:04.001,0:03:07.003 con el GPA mayor a 3.7. 0:03:07.003,0:03:08.003 Sí queremos filtrar con dos 0:03:08.003,0:03:09.057 condiciones, solo hacemos 0:03:09.057,0:03:12.043 un "and" de las condiciones en el sub-índice del Sigma 0:03:12.043,0:03:13.098 Así sí queremos, digamos, aquellos estudiantes 0:03:13.098,0:03:15.029 cuyo GPA es mayor a 3.7 0:03:15.029,0:03:16.094 y cuyo tamaño de su preparatria 0:03:16.094,0:03:18.051 sea menor a 1000, 0:03:18.051,0:03:23.007 escribiremos, seleccionar GPA mayor a 3.7 0:03:23.007,0:03:24.096 Usamos un operador 0:03:24.096,0:03:27.007 "and logico" con el simbolo ^ 0:03:27.007,0:03:28.003 tamaño de la preparatoria menor a 0:03:28.003,0:03:32.021 1000, y la aplicamos sobre la relación de estudiantes. 0:03:32.021,0:03:33.051 Y una vez más el resultado de 0:03:33.051,0:03:34.087 esta será un subconjunto de la 0:03:34.087,0:03:37.035 relación de estudiantes conteniendo las filas que satisfagan la condición. 0:03:37.035,0:03:39.042 Sí queremos encontrar 0:03:39.042,0:03:41.029 los registros para Stanford para 0:03:41.029,0:03:42.007 la carrera CS, entonces 0:03:42.007,0:03:45.052 estaremos realizando una condición de selección sobre la relación "Apply" 0:03:45.052,0:03:46.087 Una vez más, escribimos Sigma 0:03:46.087,0:03:48.066 y ahora en el sub-índice 0:03:48.066,0:03:49.079 estará diciendo que el nombre 0:03:49.079,0:03:54.077 de universidad sea Stanford y que la carrera sea CS 0:03:54.077,0:03:57.006 Otra vez, el operador and ^, y 0:03:57.006,0:03:59.039 que será aplicado sobre 0:03:59.039,0:04:01.033 la relación "apply" y 0:04:01.033,0:04:02.081 esta regresara como 0:04:02.081,0:04:06.063 resultado, un subconjunto de la relación "apply" 0:04:06.063,0:04:07.081 Así que el caso general del 0:04:07.081,0:04:10.058 operador seleccionar es que tenemos a Sigma 0:04:10.058,0:04:12.028 Tenemos una condición como un 0:04:12.028,0:04:14.056 sub-índice y después tenemos un nombre de una relación. 0:04:14.056,0:04:17.019 Y regresamos como resultado el subconjunto de la relación. 0:04:17.019,0:04:21.049 Nuestro siguiente operador es el Operador Proyectar 0:04:21.049,0:04:23.021 Mientras el Operador Seleccionar toma ciertas filas, 0:04:23.021,0:04:26.071 el Operador Proyectar toma ciertas columnas. 0:04:26.071,0:04:28.011 Así que digamos que 0:04:28.011,0:04:29.088 estamos interesados en los registros a universidad, 0:04:29.088,0:04:30.084 pero todo lo que queremos saber es 0:04:30.084,0:04:34.027 la lista de los IDs y de la decisiones de aceptación. 0:04:34.027,0:04:35.072 El operador proyectar se escribe 0:04:35.072,0:04:37.084 usando el símbolo Griego Pi 0:04:37.084,0:04:39.042 y como sub-índice sera 0:04:39.042,0:04:42.015 la lista de nombres de columna que nos gustaría extraer. 0:04:42.015,0:04:43.091 Así escribimos ID, lo siento. 0:04:43.091,0:04:46.075 ID del estudiante(student ID), decisión(decision) y 0:04:46.075,0:04:49.077 lo aplicamos a la relación "apply" 0:04:49.077,0:04:51.006 Ahora lo que hemos obtendremos 0:04:51.006,0:04:54.027 de regreso es una relación que solo tiene 2 columns 0:04:54.027,0:04:55.041 Esta tendrá todas las 0:04:55.041,0:04:56.067 tuplas de "apply", pero 0:04:56.067,0:04:57.098 solo va a tener 0:04:57.098,0:05:00.071 los IDs de los estudiantes y la columna decisión. 0:05:00.071,0:05:02.032 Así que el caso general del 0:05:02.032,0:05:04.005 Operador Proyectar es la 0:05:04.005,0:05:05.091 proyección y después 0:05:05.091,0:05:07.061 la lista de atributos, que puede ser 0:05:07.061,0:05:13.002 cualquier cantidad de ellos y finalmente el nombre de la relación. 0:05:13.002,0:05:14.069 Ahora, que si estamos interesados en 0:05:14.069,0:05:16.092 obtener tanto filas como columnas al mismo tiempo. 0:05:16.092,0:05:18.015 Así si queremos sólo algunas 0:05:18.015,0:05:20.095 filas, y queremos sólo algunas columnas 0:05:20.095,0:05:23.008 Ahora vamos a unir operadores 0:05:23.008,0:05:26.017 Recuerda que las consultas relacionales producen relaciones. 0:05:26.017,0:05:27.065 Así que podemos escribir un 0:05:27.065,0:05:29.031 consulta digamos que el 0:05:29.031,0:05:31.012 operador seleccionar de los 0:05:31.012,0:05:33.011 estudiantes cuyos GPA son mayores a 3.7 0:05:33.011,0:05:35.099 Y esto es como lo hacemos 0:05:35.099,0:05:37.044 podemos tomar 0:05:37.044,0:05:39.014 la expresión entera la cual produce una 0:05:39.014,0:05:40.047 relación y podemos 0:05:40.047,0:05:42.066 aplicarle la proyección a esta, y 0:05:42.066,0:05:43.096 podemos obtener como resultado el id del 0:05:43.096,0:05:49.076 estudiante y el nombre del estudiante 0:05:49.076,0:05:50.017 muy bien. 0:05:50.017,0:05:51.088 Así que lo que de hecho vemos 0:05:51.088,0:05:54.031 ahora es el caso general 0:05:54.031,0:05:55.075 de los operadores selección y 0:05:55.075,0:05:58.008 de la proyección que fueron bastante de lo que dije al inicio. 0:05:58.008,0:05:59.058 Estuve engañándote un poquito 0:05:59.058,0:06:01.021 Cuando escribimos el operador 0:06:01.021,0:06:03.075 seleccionar, Este es un seleccionar(select) 0:06:03.075,0:06:06.007 con la condición sobre cualquier 0:06:06.007,0:06:07.056 expresión del álgebra 0:06:07.056,0:06:08.095 relacional, y sí esta es 0:06:08.095,0:06:09.093 muy grande podríamos querear 0:06:09.093,0:06:11.008 poner paréntesis 0:06:11.008,0:06:13.098 y de forma similar el operador proyección es 0:06:13.098,0:06:16.021 una lista de atributos de 0:06:16.021,0:06:18.061 cualquier expresión del álgebra relacional 0:06:18.061,0:06:20.061 y podemos unirlos tantos como quereamos 0:06:20.061,0:06:22.024 Podemos tener una selección sobre una proyección sobre 0:06:22.024,0:06:24.037 una selección, una selección, una proyección y así sucesivamente. 0:06:24.037,0:06:27.072 Ahora hablemos acerca 0:06:27.072,0:06:31.044 de valores duplicados en los resultados de consultas del álgebra relacional 0:06:31.044,0:06:33.007 Supongamos que necesitamos 0:06:33.007,0:06:34.036 una lista de las carreras para 0:06:34.036,0:06:37.007 las que personas se han registrado y la decisión para esas carreras. 0:06:37.007,0:06:37.092 Así que escribimos la 0:06:37.092,0:06:40.063 proyección de las carreras 0:06:40.063,0:06:45.058 y la decisión sobre la relación "apply" 0:06:45.058,0:06:46.007 Podrías pensar que cuando obtenemos 0:06:46.007,0:06:49.053 el resultado de la consulta, vamos a obtener un montón de valores duplicados. 0:06:49.053,0:06:51.082 Así tendremos CS si, CS 0:06:51.082,0:06:54.057 si, CS no, EE si, EE no, y así sucesivamente. 0:06:54.057,0:06:55.072 Puedes imaginar una 0:06:55.072,0:06:57.056 enorme base de datos real de una aplicación 0:06:57.056,0:06:59.007 va ha haber cientos de 0:06:59.007,0:07:02.038 personas registradas para carreras y tendrán un si o no como decisión 0:07:02.038,0:07:04.003 La semántica del álgebra 0:07:04.003,0:07:08.033 relacional dice que los duplicados son siempre eliminados 0:07:08.033,0:07:09.046 Así sí tu realizas una consulta 0:07:09.046,0:07:10.068 que lógicamente tendría un 0:07:10.068,0:07:11.098 montón de valores duplicados 0:07:11.098,0:07:14.049 tu sólo obtienes un valor para cada resultado 0:07:14.049,0:07:16.063 Esto es de hecho una pequeña diferencia con el lenguaje SQL 0:07:16.063,0:07:18.034 Mientras SQL esta basado en 0:07:18.034,0:07:20.048 lo que conocemos como multi-conjuntos o 0:07:20.048,0:07:21.093 bolsas y eso significa 0:07:21.093,0:07:24.003 que no eliminamos los duplicados, mientras 0:07:24.003,0:07:26.017 que el álgebra relacional esta basado 0:07:26.017,0:07:29.019 en conjuntos donde los duplicados son eliminados 0:07:29.019,0:07:30.071 O bien hay un multi-conjunto o hay una 0:07:30.071,0:07:32.067 mala definición del álgebra relacional 0:07:32.067,0:07:33.082 por lo mientras, pero estaremos bien 0:07:33.082,0:07:38.000 tan sólo considerando el conjunto álgebra relacional en estos vídeos. 0:07:38.000,0:07:39.086 Nuestro primer operador que combina dos 0:07:39.086,0:07:41.075 relaciones es el operador producto-cuz 0:07:41.075,0:07:43.098 también conocido como el producto cartesiano 0:07:43.098,0:07:45.022 Lo que este operador hace es 0:07:45.022,0:07:46.054 tomar dos relaciones y un poco de 0:07:46.054,0:07:48.006 pegamento para juntarlas a 0:07:48.006,0:07:49.082 su esquema resultante 0:07:49.082,0:07:50.082 es la unión de los 0:07:50.082,0:07:52.065 esquemas de las dos relaciones y 0:07:52.065,0:07:54.005 el contenido del resultado serán todas 0:07:54.005,0:07:56.045 las combinaciones de las tuplas(filas) de esas relaciones. 0:07:56.045,0:07:57.095 De hecho el conjunto normal 0:07:57.095,0:07:59.001 del producto cruz es el que 0:07:59.001,0:08:01.025 pudieras haber aprendido antes en la primaria 0:08:01.025,0:08:03.001 Así que hablemos, digamos 0:08:03.001,0:08:06.086 hacer el producto cruz de estudiantes y de "apply" 0:08:06.086,0:08:08.004 sí hacemos este 0:08:08.004,0:08:09.008 producto cruz, sólo para 0:08:09.008,0:08:11.062 tener una imagen, voy a pegar 0:08:11.062,0:08:14.004 estas dos relacionas para unirlas aquí. 0:08:14.004,0:08:15.000 sí hacemos el 0:08:15.000,0:08:16.035 producto cruz obtendremos como 0:08:16.035,0:08:18.038 resultado una gran relación, aquí, la cual 0:08:18.038,0:08:20.028 va a tener 8 atributos 0:08:20.028,0:08:21.091 Los 8 atributos de los estudiantes y "apply" 0:08:21.091,0:08:24.012 ahora el único 0:08:24.012,0:08:25.046 pequeño truco es 0:08:25.046,0:08:27.049 cuando pegamos dos relacionas para juntarlas 0:08:27.049,0:08:28.007 algunas veces tendrán el mismo atrubuto 0:08:28.007,0:08:31.012 duplicado y podemos ver que tendremos que tenemos SID en ambos lados 0:08:31.012,0:08:33.049 así sólo como una convención de notación 0:08:33.049,0:08:35.014 cuando el producto cruz es hecho 0:08:35.014,0:08:36.061 y hay dos atributos que son nombrados igual 0:08:36.061,0:08:39.042 A ellos se les antepone el nombre de la relación a la cual pertenecen 0:08:39.042,0:08:40.071 así este sería referenciado 0:08:40.071,0:08:42.018 en el producto cruz como 0:08:42.018,0:08:44.026 student.SID donde este otro 0:08:44.026,0:08:45.052 así sería referenciado 0:08:45.052,0:08:48.045 como apply.SID 0:08:48.045,0:08:49.092 De nuevo unimos, 0:08:49.092,0:08:51.033 en el producto cartesiano, las dos relaciones 0:08:51.033,0:08:53.011 con 4 atributos cada una. 0:08:53.011,0:08:55.056 obtenemos como resultado 8 atributos 0:08:55.056,0:08:57.069 Ahora hablemos obre el contenido de estos 0:08:57.069,0:09:00.011 supongamos que la relación de estudiantes 0:09:00.011,0:09:02.037 tiene S tuplas 0:09:02.037,0:09:04.017 mientras 0:09:04.017,0:09:05.008 que "apply" tiene 8(A) tuplas 0:09:05.008,0:09:07.048 el resultado del 0:09:07.048,0:09:08.079 producto cartesiano va a 0:09:08.079,0:09:10.071 tener SxA tuplas 0:09:10.071,0:09:12.074 va a tener una tupla 0:09:12.074,0:09:14.068 por toda combinación de tuplas 0:09:14.068,0:09:19.004 de la relación de estudiantes y de la relación "apply" 0:09:19.004,0:09:20.075 Ahora, el producto cruz parece 0:09:20.075,0:09:21.081 que podría no 0:09:21.081,0:09:23.012 ser útil , pero lo que es 0:09:23.012,0:09:24.052 interesante es que usamos 0:09:24.052,0:09:26.092 el producto cruz junto con otros operadores 0:09:26.092,0:09:28.097 Y veamos un gran ejemplo de esto 0:09:28.097,0:09:30.061 Supongamos que queremos 0:09:30.061,0:09:32.065 obtener el nombre y GPAs de los 0:09:32.065,0:09:33.099 estudiantes con una tamaño de preparatoria 0:09:33.099,0:09:35.035 mayor a 1000 y a aquellos que se 0:09:35.035,0:09:37.099 registraron para CS y no fueron aceptados 0:09:37.099,0:09:40.001 OK echemos un un vistazo. 0:09:40.001,0:09:41.062 vamos a tener acceso 0:09:41.062,0:09:43.015 a las filas de la tablas estudiantes y de "apply" 0:09:43.015,0:09:45.038 con el fin de realizar consultas 0:09:45.038,0:09:46.006 lo que vamos a hacer es que 0:09:46.006,0:09:49.098 tomaremos los estudiantes que se registraron como punto de partida 0:09:49.098,0:09:51.065 ahora tenemos 0:09:51.065,0:09:53.051 una gran relación que contiene 0:09:53.051,0:09:57.032 8 atributos y todas esas tuplas que describimos previamente 0:09:57.032,0:09:58.036 Pero ahora vamos a 0:09:58.036,0:10:00.005 empezar a hacer cosas mas interesantes, porque 0:10:00.005,0:10:01.042 lo que vamos a hacer es 0:10:01.042,0:10:03.072 una gran selección sobre esta relación 0:10:03.072,0:10:04.095 Y para la selección primero que todo 0:10:04.095,0:10:06.005 es asegurarnos 0:10:06.005,0:10:08.000 de que sólo combine las tuplas de estudiantes con 0:10:08.000,0:10:11.003 las tuplas de "apply" que están referenciadas por el mismo studiante id 0:10:11.003,0:10:12.003 Para hacerlo escribimos 0:10:12.003,0:10:15.069 student.SID igual 0:10:15.069,0:10:17.009 a apply.SID 0:10:17.009,0:10:18.095 así hemos filtrado el resultado 0:10:18.095,0:10:20.009 del producto cruz, sólo 0:10:20.009,0:10:22.006 incluyendo combinaciones de estudiantes y registros 0:10:22.006,0:10:24.054 de "apply" por parejas para hacer el conjunto 0:10:24.054,0:10:26.085 Ahora que hemos hecho un pequeño adicional filtrado 0:10:26.085,0:10:28.004 decimos que queremos 0:10:28.004,0:10:29.008 que el tamaño de la preparatoria sea 0:10:29.008,0:10:31.004 mayor a 1000, así 0:10:31.004,0:10:33.083 usamos un operador "and" en la preparatoria 0:10:33.083,0:10:35.034 queremos también los que se registraron 0:10:35.034,0:10:37.008 a CS así que eso es un "and" y carrera igual a CS 0:10:37.008,0:10:40.013 Vamos a obtener una bonita gran consulta aquí 0:10:40.013,0:10:41.026 y finalmente queremos los que 0:10:41.026,0:10:42.099 fueron rechazados así "and" decisión 0:10:42.099,0:10:47.032 igual, sólo estamos usando R para rechazados 0:10:47.032,0:10:50.009 así tenemos una gigantesca consulta. 0:10:50.009,0:10:51.093 Esto nos da exactamente lo que 0:10:51.093,0:10:53.017 queremos excepto por una cosa 0:10:53.017,0:10:56.015 la cual es, como ya había dicho, todo lo que queremos es sus nombres y sus GPAs 0:10:56.015,0:10:57.008 Así que para finalizar ponemos un 0:10:57.008,0:10:59.031 gran paréntesis alrededor aquí y 0:10:59.031,0:11:00.009 le aplicamos 0:11:00.009,0:11:02.091 el operador proyección para obtener 0:11:02.091,0:11:06.033 el nombre del estudiante y el GPA 0:11:06.033,0:11:07.074 Y esto es una expresión 0:11:07.074,0:11:09.073 del álgebra relacional que produce la consulta 0:11:09.073,0:11:12.066 que hemos escrito en inglés 0:11:12.066,0:11:13.049 Ahora que hemos visto como 0:11:13.049,0:11:14.085 el producto cruz nos permite 0:11:14.085,0:11:16.094 combinar tuplas y de que después 0:11:16.094,0:11:18.007 podemos aplicarles condiciones de selección para 0:11:18.007,0:11:21.023 obtener un resultado que tenga significado 0:11:21.023,0:11:22.076 esto hace que el álgebra relacional 0:11:22.076,0:11:24.003 incluya un operador llamado 0:11:24.003,0:11:25.009 el "natural join" que es 0:11:25.009,0:11:27.076 usado para exactamente el propósito descrito 0:11:27.076,0:11:29.036 Lo que el natural join hace es 0:11:29.036,0:11:31.001 que realiza el producto cruz 0:11:31.001,0:11:33.082 pero después busca igualdad 0:11:33.082,0:11:35.099 en los atributos que tengan el mismo nombre 0:11:35.099,0:11:36.088 Así si configuramos nuestro 0:11:36.088,0:11:38.077 esquema apropiadamente, por ejemplo 0:11:38.077,0:11:40.066 que tenemos un id de estudiante y otro aquí 0:11:40.066,0:11:42.024 significan la misma cosa 0:11:42.024,0:11:43.005 y cuando aplicamos el 0:11:43.005,0:11:45.048 producto cruz este sólo 0:11:45.048,0:11:48.049 va a combinar las tuplas donde el id del estudiante sea el mismo 0:11:48.049,0:11:49.089 Y aún mas, sí agregamos 0:11:49.089,0:11:51.021 universidad, podemos 0:11:51.021,0:11:54.015 ver que tenemos el nombre de universidad aquí y aquí también 0:11:54.015,0:11:56.025 sí combinamos las tuplas de universidad y "apply" 0:11:56.025,0:11:59.096 combinaremos sólo las tuplas que esten hablando de la misma universidad 0:11:59.096,0:12:01.032 Ahora en adición, una cosa más 0:12:01.032,0:12:02.043 que esto hace es 0:12:02.043,0:12:06.005 quita esos atributos que tienen el mismo nombre 0:12:06.005,0:12:07.091 así una vez que combinamos 0:12:07.091,0:12:09.034 por ejemplo, estudiantes y "appy" 0:12:09.034,0:12:11.034 con el "natural join" sólo 0:12:11.034,0:12:13.059 combinaremos tuplas donde los 0:12:13.059,0:12:16.084 SID de estudiante y los SID de "apply" sean el mismo 0:12:16.084,0:12:17.089 Por lo que no necesitamos mantener dos 0:12:17.089,0:12:19.029 copias de lo aquellas 0:12:19.029,0:12:23.021 columnas porque los valores siempre serán los mismos 0:12:23.021,0:12:25.058 así el operador natural join 0:12:25.058,0:12:28.012 se escribe usando un símbolo como moño 0:12:28.012,0:12:30.066 esa es tan sólo la convención 0:12:30.066,0:12:34.004 lo encontraras en tus programas editores de texto, sí buscas cuidadosamente. 0:12:34.004,0:12:37.005 así que hagamos algunos ejemplos. 0:12:37.005,0:12:38.066 Regresemos a nuestra misma 0:12:38.066,0:12:39.096 consulta donde estábamos buscando 0:12:39.096,0:12:42.004 los nombres y GPAs de los estudiantes 0:12:42.004,0:12:45.039 de grandes preparatorias quienes se registraron para la carrera CS y que fueron rechazados. 0:12:45.039,0:12:46.078 Así que ahora en lugar de usar 0:12:46.078,0:12:47.089 el producto cruz vamos a 0:12:47.089,0:12:51.095 usar el natural join, el cual como dije se escribe con un símbolo similar a moño 0:12:51.095,0:12:53.038 que nos permite 0:12:53.038,0:12:54.078 hacer, una vez hecho el natural join, 0:12:54.078,0:12:56.001 esto es que no tenemos 0:12:56.001,0:12:57.064 que escribir la condición, que especifique 0:12:57.064,0:12:59.023 la igualdad de esos dos 0:12:59.023,0:13:01.093 atributos, porque este lo hará por si mismo 0:13:01.093,0:13:03.015 y una vez que lo hemos hecho eso 0:13:03.015,0:13:04.004 todo lo que necesitamos hace es 0:13:04.004,0:13:05.005 aplicarlo al resto de nuestras condiciones. 0:13:05.005,0:13:06.061 la cual fue que la preparatoria 0:13:06.061,0:13:08.076 sea más grande que 1000 y que la carrera 0:13:08.076,0:13:11.008 sea igual CS y que la decisión 0:13:11.008,0:13:14.011 sea rechazados, otra vez 0:13:14.011,0:13:16.017 llamaremos a eso R, después 0:13:16.017,0:13:17.036 una vez que sólo hemos obtenido el nombre 0:13:17.036,0:13:19.098 y GPAs, escribimos los 0:13:19.098,0:13:24.000 nombres de estudiantes y GPA 0:13:24.000,0:13:24.027 bien 0:13:24.027,0:13:26.063 y ese es el resultado de la consulta usando un natural join 0:13:26.063,0:13:27.077 así, como puedes ver este es un 0:13:27.077,0:13:29.009 poco más simple que la original 0:13:29.009,0:13:30.065 con el producto cruz y por configurar 0:13:30.065,0:13:33.099 el esquema correctamente, el natural join puede ser útil 0:13:33.099,0:13:37.001 Ahora agreguemos una complicación más a nuestra consulta 0:13:37.001,0:13:38.064 Supongamos que sólo estamos interesados 0:13:38.064,0:13:41.077 en los registros a universidades en las que la cantidad de alumnos sea mayor a 20,000 0:13:41.077,0:13:43.048 hasta ahora 0:13:43.048,0:13:44.007 en nuestra expresión nos referimos a 0:13:44.007,0:13:46.011 la relación de estudiantes y la de "apply" 0:13:46.011,0:13:48.066 pero no hemos usado la relación de universidades 0:13:48.066,0:13:50.034 pero sí queremos tener un 0:13:50.034,0:13:51.061 filtro sobre la cantidad de alumnos, vamos a tener 0:13:51.061,0:13:55.016 que traer la relación de universidades a escena 0:13:55.016,0:13:57.089 esto podría volverse más fácil de lo que piensas 0:13:57.089,0:13:59.055 Tan sólo borremos un par 0:13:59.055,0:14:01.065 de nuestros parámetros aquí y lo que 0:14:01.065,0:14:02.071 vamos a hacer es que 0:14:02.071,0:14:04.021 vamos a juntar 0:14:04.021,0:14:07.047 la relación de universidades, con las dos relaciones que ya tenemos 0:14:07.047,0:14:11.049 Ahora técnicamente el natural 0:14:11.049,0:14:13.093 join es un operador binario, las personas 0:14:13.093,0:14:15.051 frecuentemente lo usan sin paréntesis 0:14:15.051,0:14:16.008 porque es asociativo, 0:14:16.008,0:14:20.012 Podríamos agregarlo y después estaría en buena forma 0:14:20.012,0:14:22.043 Ahora que ya hemos juntado las tres relaciones 0:14:22.043,0:14:24.031 y recordemos que el natural join automáticamente 0:14:24.031,0:14:27.035 busca los atributos que comparten el mismo nombre 0:14:27.035,0:14:29.035 muy específicamente, el nombre 0:14:29.035,0:14:30.049 de la universidad aquí va a ser 0:14:30.049,0:14:33.008 igual al nombre de universidad de la relación "apply" también 0:14:33.008,0:14:36.046 Ahora una vez que hemos hecho esto, tenemos toda la información que necesitamos. 0:14:36.046,0:14:37.061 Sólo tenemos que agregar una 0:14:37.061,0:14:39.002 condición de filtro más, la cual es 0:14:39.002,0:14:42.029 que la cantidad de alumnos de las universidades sea mayor a 20,000 0:14:42.029,0:14:47.059 y con esto, ya tenemos nuestra consulta 0:14:47.059,0:14:48.093 Para resumir el 0:14:48.093,0:14:52.025 natural join , el natural join combina relaciones 0:14:52.025,0:14:54.078 Esto automáticamente pone valores iguales 0:14:54.078,0:14:55.098 cuando los nombres de atributos 0:14:55.098,0:14:58.098 son los mismos y después elimina las columnas duplicadas 0:14:58.098,0:15:01.011 El natural join de hecho no 0:15:01.011,0:15:04.007 agrega ningún poder expresivo al álgebra relacional 0:15:04.007,0:15:08.069 podemos reescribir el natural join sin usar el producto cruz 0:15:08.069,0:15:10.091 sólo permitanme reescribirla aquí 0:15:10.091,0:15:12.025 sí tenemos, y ahora voy 0:15:12.025,0:15:14.049 a usar el caso general de dos expresiones 0:15:14.049,0:15:17.033 Una expresión , natural join 0:15:17.033,0:15:19.007 con otra expresión, que es 0:15:19.007,0:15:21.075 de hecho equivalente a hacer 0:15:21.075,0:15:23.009 una proyección sobre el 0:15:23.009,0:15:25.086 esquema de la primera 0:15:25.086,0:15:27.031 expresión - sólo 0:15:27.031,0:15:29.005 la llamare E1 ahora unión 0:15:29.005,0:15:30.092 el esquema de la segunda expresión 0:15:30.092,0:15:32.028 Esta es un unión real, así esto 0:15:32.028,0:15:33.053 significa que sí tenemos dos copias 0:15:33.053,0:15:36.009 sólo nos quedamos con una de ellas 0:15:36.009,0:15:39.004 sobre la selección, Ahora vamos 0:15:39.004,0:15:40.072 a poner todos los atributos compartidos 0:15:40.072,0:15:42.004 de la primera expresión para 0:15:42.004,0:15:44.013 ser igual a los atributos compartidos de la segunda 0:15:44.013,0:15:45.056 Así sólo escribo E!, A1 0:15:45.056,0:15:48.028 igual a E2, A1 0:15:48.028,0:15:54.072 y E1, A2 iguales a E2.A2 0:15:54.072,0:15:57.005 Ahora estos son caso en los que 0:15:57.005,0:16:00.075 una vez más, los atributos tiene el mismo nombre y así 0:16:00.075,0:16:02.053 así que ponemos todo igual 0:16:02.053,0:16:04.084 y esa es aplicada sobre 0:16:04.084,0:16:07.083 la expresión 1 producto cruz 2 0:16:07.083,0:16:10.007 así otra vez, el natural join 0:16:10.007,0:16:12.013 no nos va a dar 0:16:12.013,0:16:18.098 poder expresivo adicional, pero es una muy conveniente notación 0:16:18.098,0:16:20.026 El último operador que voy a 0:16:20.026,0:16:23.002 cubrir en este vídeo es el operador Theta Join 0:16:23.002,0:16:24.005 Al igual que el natural join, el Theta join es 0:16:24.005,0:16:28.008 de hecho una abreviatura que no agrega poder expresivo al lenguaje 0:16:28.008,0:16:28.083 Permitanme escribir esto 0:16:28.083,0:16:30.005 El operador theta join toma 0:16:30.005,0:16:32.067 dos expresiones y las combina 0:16:32.067,0:16:34.087 con operador del símbolo de moño 0:16:34.087,0:16:37.001 pero con un sub-índice theta 0:16:37.001,0:16:39.005 Aquel Theta es una condición 0:16:39.005,0:16:40.072 Esta condición en el estilo 0:16:40.072,0:16:43.096 de las condiciones en el operador seleccionar 0:16:43.096,0:16:45.072 y que este de hecho dice 0:16:45.072,0:16:47.031 de hecho es muy simple 0:16:47.031,0:16:49.053 es equivalente a aplicar 0:16:49.053,0:16:51.036 la condición Theta al 0:16:51.036,0:16:53.067 producto cruz de dos expresiones 0:16:53.067,0:16:55.000 así podrías preguntarte por qué 0:16:55.000,0:16:56.033 menciono el operador Theta join 0:16:56.033,0:16:57.094 y la razón por la que 0:16:57.094,0:16:59.056 lo menciono es porque la mayoria 0:16:59.056,0:17:01.077 de las sistemas administradores de bases de datos implementan 0:17:01.077,0:17:03.007 el theta join como una operación básica 0:17:03.007,0:17:05.022 para combinar relaciones 0:17:05.022,0:17:07.006 así el operador básico que 0:17:07.006,0:17:08.087 toma dos relaciones, y que combina todas las tuplas 0:17:08.087,0:17:10.058 pero que sólo mantiene las combinaciones 0:17:10.058,0:17:12.057 que satisface la condición theta 0:17:12.057,0:17:13.063 frecuentemente cuando le hablas 0:17:13.063,0:17:15.019 a las personas quienes construyen sistemas de bases de datos o que 0:17:15.019,0:17:16.064 usan bases de datos, cuando ellos 0:17:16.064,0:17:21.019 usan la palabra join, ellos quieren decir el theta join 0:17:21.019,0:17:25.037 así, concluyendo, el álgebra relacional es un lenguaje formal 0:17:25.037,0:17:27.004 Este opera sobre conjuntos de 0:17:27.004,0:17:29.048 relaciones y produce relaciones como resultado 0:17:29.048,0:17:30.093 La consulta más simple es tan sólo 0:17:30.093,0:17:32.017 el nombre de la relación y 0:17:32.017,0:17:33.067 los operadores son usados 0:17:33.067,0:17:36.073 para filtrar relaciones, rebanarlas o combinarlas 0:17:36.073,0:17:37.098 Hasta ahora hemos aprendido 0:17:37.098,0:17:40.000 sobre el operador seleccionar para seleccionar filas 0:17:40.000,0:17:41.078 el operador proyección para seleccionar 0:17:41.078,0:17:43.058 columnas, el operador producto cruz 0:17:43.058,0:17:45.084 para combinar todo posible 0:17:45.084,0:17:46.086 par de tuplas de las dos 0:17:46.086,0:17:48.029 relaciones y después dos 0:17:48.029,0:17:50.002 abreviaturas, el natural join 0:17:50.002,0:17:51.071 el cual es una muy útil forma de combinar 0:17:51.071,0:17:53.096 relaciones quitando ciertas columnas similares 0:17:53.096,0:17:56.097 y el operador theta join. 0:17:56.097,0:17:58.019 En el siguiente vídeo aprenderemos 0:17:58.019,0:18:00.005 algunos operadores adicionales del álgebra 0:18:00.005,0:18:01.058 relacional y también algunas notaciones 0:18:00.789,0:18:04.789 alternativas para expresiones del álgebra relacional.