El comando PROJECT también opera sobre una sola tabla, pero produce un subconjunto vertical de la tabla, extrae los valores de columnas específicas, elimina duplicados y coloca los valores en una nueva tabla. De manera informal, su forma es
PROJECT nombreTabla OVER (nombreCol,. . . , nombreCol) [GIVING nombreTablaNueva]
o, simbólicamente,
[nombreTablaNueva =] ΠnombreCol, . . . , nombreCol(nombreTabla)
Para ilustrar la proyección sobre una sola columna, encuentre todas las diferentes especiali- dades que los estudiantes tienen mediante el comando
PROJECT Student OVER major GIVING Temp
o Temp = Πmajor(Student)
La tabla resultante, Temp, se parece a esto:
Temp major History Math Art CSC
Note que se obtienen todos los valores que aparecen en la columna major de la tabla Stu- dent, pero se eliminan los duplicados.
Cuando se proyecta sobre dos o más columnas, se eliminan los duplicados de las combina- ciones de valores. Por ejemplo, suponga que quiere encontrar el salón donde enseña cada docente. Podría hacerlo al usar el comando
PROJECT Class OVER (facd,room)
o
Esto da el resultado en una tabla sin nombre, facId room F101 H221 F105 M110 F115 H221 F110 H225
Aunque se tiene repetición en los valores del salón, pues H221 aparece dos veces, note que los valores de salón repetidos aparecen con diferentes valores facId. En tanto la combina- ción no aparezca antes, se agrega a la proyección. Note que la tercera y última filas de Class no contribuyen al resultado de la proyección, pues su combinación de valores para facId y room apareció anteriormente.
Es posible combinar las operaciones SELECT y PROJECT para obtener sólo columnas espe- cíficas de ciertas filas, pero hacerlo requiere dos pasos. Por ejemplo, suponga que quiere ver los nombres e ID de todas las especialidades en historia. Dado que sólo se quieren especiali- dades en historia, es necesario un SELECT, pero, como se quieren sólo ciertas columnas de dichos registros, se necesita un PROJECT. La consulta se puede expresar como
SELECT Student WHERE major = 'History' GIVING Temp
PROJECT Temp OVER (lastName, firstName, stuId) GIVING Result
Después de ejecutar el primer comando, se tiene la tabla
Temp:
stuId lastName firstName major credits S1001 Smith Tom History 90 S1005 Lee Perry History 3
El segundo comando se realiza sobre esta tabla temporal, y el resultado es
Result:
lastname firstname stuid Smith Tom S1001 Lee Perry S1005
Note que la operación PROJECT permitió invertir el orden de las dos columnas en el resul- tado final. Pudo haber escrito los comandos simbólicamente como
ΠlastName,firstName,stuId(σmajor='History'(Student))
Note que se pueden componer las operaciones usando el resultado de la primera como el argumento de la segunda. La tabla intermedia que resulta de la operación de selección, que se llamó Temp cuando se usó la sintaxis inglesa, no necesita un nombre cuando se usa nota- ción simbólica, pues la expresión se usa como un operando. Observe que no podría invertir el orden de SELECT y PROJECT. Si hubiera hecho PROJECT primero, tendría una tabla intermedia sólo con las columnas lastName, firstName y stuId, así que luego no podría intentar hacer una SELECT sobre major en la tabla intermedia, pues no contiene dicho atributo.
Producto y combinaciones (joins): combinación theta, equicombinación, combinación natural, semicombinación y combinación exterior Dadas dos tablas, A y B, se puede for-
mar su producto, A POR B o A × B, en forma muy parecida a como se formó el producto cartesiano de los conjuntos en la sección 4.3.2. A × B es una tabla formada al concatenar todas las filas de A con todas las filas de B. Sus columnas son las columnas de A seguidas por las columnas de B, y su ancho es el ancho de A más el ancho de B. Se puede producir en varias formas. Un método es usar un algoritmo de “bucle anidado”. Comience con la prime- ra fila de A, combínela con la primera fila de B, luego con la segunda fila de B y así por el estilo, hasta que se hayan formado todas las combinaciones de la primera fila de A con todas
las filas de B. Luego el procedimiento se repite para la segunda fila de A, luego la tercera fila, etc. Si A tiene x filas y B tiene y filas, entonces A POR B, escrito A × B, tiene x*y filas. Suponga que se forma el producto de Student y Enroll, escrito Student × Enroll. Esta tabla tendrá siete columnas, pero dos de ellas se llamarán stuId. Para distinguir estas dos use los nombres calificados de las tablas originales, Student.stuId y Enroll. stuId. El producto, que tiene 63 filas, se muestra en la figura 4.2.
Student.stuId lastname firstName major Enroll.stuId classNo grade
S1001 Smith Tom History S1002 ART103A D
S1001 Smith Tom History S1002 MTH103C B
S1001 Smith Tom History S1010 ART103A
S1001 Smith Tom History S1020 MTH101B A
S1001 Smith Tom History S1001 HST205A C
S1001 Smith Tom History S1002 CSC201A F
S1001 Smith Tom History S1010 MTH103C
S1001 Smith Tom History S1001 ART103A A
S1001 Smith Tom History S1020 CSC201A B
S1002 Chin Ann Math S1002 MTH103C B
S1002 Chin Ann Math S1010 ART103A
S1002 Chin Ann Math S1002 CSC201A F
S1002 Chin Ann Math S1010 MTH103C
S1002 Chin Ann Math S1002 ART103A D
S1002 Chin Ann Math S1001 HST205A C
S1002 Chin Ann Math S1001 ART103A A
S1002 Chin Ann Math S1020 MTH101B A
S1002 Chin Ann Math S1020 CSC201A B
S1005 Lee Perry History S1010 MTH103C
S1005 Lee Perry History S1001 HST205A C
S1005 Lee Perry History S1002 MTH103C B
S1005 Lee Perry History S1020 CSC201A B
S1005 Lee Perry History S1002 ART103A D
S1005 Lee Perry History S1010 ART103A
S1005 Lee Perry History S1020 MTH101B A
S1005 Lee Perry History S1001 ART103A A
S1005 Lee Perry History S1002 CSC201A F
S1010 Burns Edward Art S1002 ART103A D
S1010 Burns Edward Art S1001 HST205A C
S1010 Burns Edward Art S1002 CSC201A F
S1010 Burns Edward Art S1001 ART103A A
FIGURA 4.2
Student X Enroll
Student.stuId lastname firstName major Enroll.stuId classNo grade
S1010 Burns Edward Art S1002 MTH103C B
S1010 Burns Edward Art S1010 MTH103C
S1010 Burns Edward Art S1020 MTH101B A
S1010 Burns Edward Art S1020 CSC201A B
S1010 Burns Edward Art S1010 ART103A
S1013 McCarthy Owen Math S1010 ART103A
S1013 McCarthy Owen Math S1002 ART103A D
S1013 McCarthy Owen Math S1001 HST205A C
S1013 McCarthy Owen Math S1002 MTH103C B
S1013 McCarthy Owen Math S1020 CSC201A B
S1013 McCarthy Owen Math S1010 MTH103C
S1013 McCarthy Owen Math S1002 CSC201A F
S1013 McCarthy Owen Math S1001 ART103A A
S1013 McCarthy Owen Math S1020 MTH101B A
S1015 Jones Mary Math S1001 ART103A A
S1015 Jones Mary Math S1020 MTH101B A
S1015 Jones Mary Math S1001 HST205A C
S1015 Jones Mary Math S1020 CSC201A B
S1015 Jones Mary Math S1010 MTH103C
S1015 Jones Mary Math S1002 ART103A D
S1015 Jones Mary Math S1010 ART103A
S1015 Jones Mary Math S1002 CSC201A F
S1015 Jones Mary Math S1002 MTH103C B
S1020 Rivera Jane CSC S1001 HST205A C
S1020 Rivera Jane CSC S1002 ART103A D
S1020 Rivera Jane CSC S1010 ART103A
S1020 Rivera Jane CSC S1020 CSC201A B
S1020 Rivera Jane CSC S1001 ART103A A
S1020 Rivera Jane CSC S1002 CSC201A F
S1020 Rivera Jane CSC S1002 MTH103C B
S1020 Rivera Jane CSC S1020 MTH101B A
S1020 Rivera Jane CSC S1010 MTH103C
Student X Enroll
Con base en el producto de tablas se pueden definir varias operaciones. La más general se llama COMBINACIÓN THETA (theta join). La combinación theta se define como el resul- tado de realizar una operación SELECT sobre el producto. Por ejemplo, es posible que quie-
ra sólo las tuplas del producto donde el valor credits sea mayor que 50. Aquí, theta es >, y la consulta se escribiría como
Student TIMES Enroll WHERE credits > 50
Esto es equivalente a
Student TIMES Enroll GIVING Temp SELECT Temp WHERE credits > 50
o simbólicamente
σ credits>50 (Student × Enroll)
A veces se usa el símbolo Xθ para representar la combinación theta. Note que, para cuales-
quiera dos relaciones, X y Y, la combinación theta se define simbólicamente como
A Xθ B = σθ (A × B)
Dado que el producto es una operación lenta que requiere, en el ejemplo anterior, 63 conca- tenaciones, sería más eficiente realizar primero la selección y luego el producto, siempre que la secuencia de operaciones produzca el mismo resultado. Una forma más eficiente, que requiere sólo 18 concatenaciones, es:
SELECT Student WHERE credits > 50 GIVING Temp2
Temp2 TIMES Enroll
o,
(σcredits>50 (Student)) × Enroll
Aunque el producto es una operación válida, raramente se estaría interesado en formar concatenaciones de filas de Student con filas de Enroll que tengan un stuId diferente. Una operación más común que involucra el producto de tablas es aquella en donde se piden sólo aquellas filas del producto en las que los valores de las columnas comunes sean iguales. Cuando la theta es la igualdad en las columnas comunes, se tiene la EQUIJOIN (equicom- binación) de tablas. Para formar la equicombinación, entonces, comience con dos tablas que tengan una o más columnas en común. Compare cada tupla de la primera con cada tupla de la segunda y elija sólo aquellas concatenaciones en las que los valores en las colum- nas comunes sean iguales. La equicombinación de Student y Enroll se formaría al elegir las tuplas del producto con valores stuId coincidentes. La figura 4.3 muestra:
Student EQUIJOIN Enroll
que se escribe simbólicamente como