Sunteți pe pagina 1din 22

No duplicados, no nulos

No duplicados, no nulos
Ya se vio que:
Las relaciones no contienen tuplas duplicadas, por que el cuerpo de una relacion es un conjunto (de tuplas ) y los conjuntos en matemticas no contienen duplicados. Las relaciones no contienen nulos, ya que las tuplas no contienen nulos.

No duplicados, no nulos
Evitar los duplicados:
Al transformar ciertas expresiones, y por tanto ciertas optimizaciones, que serian validos si SQL fuera relacional pero por la presencia de duplicados no lo son.

Ejemplo:

No duplicados, no nulos
Consideremos el query:
Obtener el numero de parte que sea screw o que sea proporcionado por el proveedor S1 o ambos.

No duplicados, no nulos
1.- SELECT P.PNO FROM P WHERE P.PNAME = 'Screw' OR P.PNO IN ( SELECT SP.PNO FROM SP WHERE SP.SNO = 'S1' ) Resultado:

No duplicados, no nulos
2.- SELECT SP.PNO FROM SP WHERE SP.SNO = 'S1' OR SP.PNO IN ( SELECT P.PNO FROM P WHERE P.PNAME = 'Screw' ) Resultado:

No duplicados, no nulos
3.- SELECT P.PNO
FROM P, SP WHERE ( SP.SNO = 'S1' AND SP.PNO = P.PNO ) OR P.PNAME = 'Screw Resultado

No duplicados, no nulos
4.- SELECT SP.PNO
FROM P, SP WHERE ( SP.SNO = 'S1' AND SP.PNO = P.PNO ) OR P.PNAME = 'Screw Resultado:

No duplicados, no nulos
5.- SELECT DISTINCT P.PNO
FROM P WHERE P.PNAME = 'Screw' UNION ALL SELECT SP.PNO FROM SP WHERE SP.SNO = 'S1 Resultado:

No duplicados, no nulos
El hecho es que diferentes formulaciones de expresiones producen diferentes resultados distintos con respecto a su grado de duplicidad, esto no sucede si se tienen cuidado con la duplicidad . Si no se cuida la duplicidad, entonces hay que tener extremo cuidado con la formulacin de querys para producir el resultado esperado.

Evitando duplicados en SQL


El modelo relacional no considera los duplicados. Si tu tabla base tienen una clave primaria, entonces lo duplicados no se presentan en tu tabla. Sin embargo ciertas expresiones SQL pueden generar duplicados:
SELECT ALL UNION ALL VALUES (Llamando al constructor de tablas)

Evitando duplicados en SQL


En SELECT y UNION , DISTINCT puede ser especificada.
En la clausula SELECT despus del SELECT. En una union, interseccin o diferencia despues de la palabra UNION, INTERSECT y EXCEPT respectivamente.

Evitando duplicados en SQL


Recomendacin:
Asegrate de saber cuando SQL elimina duplicados sin que se especifique. En el caso que lo tengas que especificar, asegrate saber que sucede si no lo haces. En el caso que sea importante usa DISTINCT.

Evitar nulos
Se asume que cualquier comparacin con al menos un valor nulo es desconocido en lugar de un valor Cierto o Falso. Se asume que esta familiarizado con tablas de verdad de 3 valores para los operadores lgicos NOT, AND y OR (T=TRUE, F=FALSE, U=UNKNOWN):

Evitar nulos.

Evitar nulos
El punto fundamental es que ciertos queries en particular, producen resultados que son correctos acorde a los 3 valores lgicos, pero no son correctos en el mundo real.

Evitar nulos
Ejemplo: Considere la siguiente base de datos y considere el query:
Obtener el par (SNO,PNO) para las ciudades del proveedor y productos sean distintas o bien que la ciudad de producto no sea paris o ambas.

Evitar nulos
El query queda como sigue:
SELECT S.SNO, P.PNO FROM S, P WHERE S.CITY <> P.CITY OR P.CITY <> 'Paris'

Evitar nulos
Ahora centramos en la condicin:
( S.CITY <> P.CITY ) OR ( P.CITY <> 'Paris' )

Para los datos que tenemos en la base de datos, la expresin se evalua como desconocido OR desconocido, lo cual se reduce a desconocido. SQL solo recupera datos de las condiciones que se evalan verdadero, y no para falso ni desconocido.

Evitar nulos
Para el producto P1 le corresponde una ciudad en el mundo real. El valor nulo en ciudad no representa un valor real. Para cualquier valor real es la ciudad de Paris o no es la ciudad de Paris. En caso que sea la ciudad de Paris queda:
( 'London' <> 'Paris' ) OR ( 'Paris' <> 'Paris' )

En caso que no lo sea:


( 'London' <> xyz ) OR ( xyz <> 'Paris' )

Evitar nulos
Ambos casos la expresin se evala como verdadero. La expresin siempre da verdadero con ciudades del mundo real, y debe devolver el par (S1,P1). Pero en el caso que la ciudad tenga nulo, no devuelve el par (S1,P1)

Evitar nulos
Otro ejemplo que podemos considerar:
SELECT PNO FROM P WHERE CITY = CITY

S-ar putea să vă placă și