Descripción de los conceptos y la sintaxis de las combinaciones
El método más fundamental y común para combinar datos de varias tablas consiste en usar una operación JOIN. Algunas usuarios creen que JOIN es una cláusula independiente en una instrucción SELECT, pero otros la consideran parte de la cláusula FROM. En este módulo, se considerará principalmente parte de la cláusula FROM. En este módulo, se describirá cómo la cláusula FROM de una instrucción SELECT de T-SQL crea tablas virtuales intermedias que se consumirán en fases posteriores de la consulta.
La cláusula FROM y las tablas virtuales
Si conoce el orden lógico de las operaciones que se realizan cuando SQL Server procesa una consulta, sabe que la cláusula FROM de una instrucción SELECT es la primera que se procesa. Esta cláusula determina qué tabla o tablas serán el origen de las filas de la consulta. FROM puede hacer referencia a una sola tabla o reunir varias tablas como origen de datos para la consulta. Puede pensar en la cláusula FROM como lo que crea y rellena una tabla virtual. Esta tabla virtual contendrá la salida de la cláusula FROM y la usarán las cláusulas de la instrucción SELECT que se apliquen más adelante, como la cláusula WHERE. A medida que agrega funcionalidad adicional a una cláusula FROM, como operadores de combinación, será útil pensar que los elementos de la cláusula FROM agregan o quitan filas de la tabla virtual.
La tabla virtual creada por una cláusula FROM es solo una entidad lógica. En SQL Server, no se crea ninguna tabla física, ni persistente ni temporal, para contener los resultados de la cláusula FROM, ya que se pasa a la cláusula WHERE u otros elementos de la consulta.
La tabla virtual creada por la cláusula FROM contiene datos de todas las tablas combinadas. Puede ser útil pensar en los resultados como conjuntos y conceptualizar los resultados de la combinación como un diagrama de Venn.
A lo largo de su historia, el lenguaje T-SQL se ha expandido para reflejar los cambios en los estándares del American National Standards Institute (ANSI) para el lenguaje SQL. Uno de los puntos más importantes donde se aprecian estos cambios es en la sintaxis de las combinaciones de una cláusula FROM. En el estándar ANSI SQL-89, las combinaciones se especifican mediante la inclusión de varias tablas en la cláusula FROM en una lista separada por comas. Cualquier filtrado para determinar qué filas se incluyen se realiza en la cláusula WHERE, de la siguiente manera:
SELECT p.ProductID, m.Name AS Model, p.Name AS Product
FROM SalesLT.Product AS p, SalesLT.ProductModel AS m
WHERE p.ProductModelID = m.ProductModelID;
Esta sintaxis sigue siendo compatible con SQL Server, pero debido a la complejidad de representar los filtros para combinaciones complejas, no se recomienda. Además, si se omite accidentalmente una cláusula WHERE, las combinaciones de estilo ANSI SQL-89 pueden convertirse fácilmente en productos cartesianos y devolver un número excesivo de filas de resultados, lo que genera problemas de rendimiento y posiblemente resultados incorrectos.
Al aprender a escribir consultas de varias tablas en T-SQL, es importante comprender el concepto de productos cartesianos. En matemáticas, un producto cartesiano es el producto de dos conjuntos. El producto de un conjunto de dos elementos y otro de seis es un conjunto de 12 elementos (6 x 2). Cada uno de los elementos de un conjunto se combina con los del otro. En el ejemplo siguiente, hay un conjunto de nombres con dos elementos y un conjunto de productos con tres. El producto cartesiano combina cada nombre con cada producto, lo que genera seis elementos.
En las bases de datos, un producto cartesiano es el resultado de combinar cada una de las fila de una tabla con las de otra. El producto de una tabla con 10 filas y otra con 100 es un conjunto de resultados con 1000 filas. El resultado subyacente de una operación JOIN es un producto cartesiano, pero para la mayoría de las consultas de T-SQL, un producto cartesiano no es el resultado deseado. En T-SQL, un producto cartesiano se produce cuando dos tablas de entrada se combinan sin tener en cuenta ninguna relación entre ellas. Sin información sobre las relaciones, el procesador de consultas de SQL Server devolverá todas las combinaciones de filas posibles. Aunque este resultado puede tener algunas aplicaciones prácticas, como la generación de datos de prueba, no suele ser útil y puede tener graves implicaciones en el rendimiento.
Con la aparición del estándar ANSI SQL-92, se ha agregado compatibilidad con las palabras clave JOIN y ON. T-SQL también admite esta sintaxis. Las combinaciones se representan en la cláusula FROM mediante el operador JOIN adecuado. La relación lógica entre las tablas, que se convierte en un predicado de filtro, se especifica en la cláusula ON.
En el ejemplo siguiente se vuelve a formular la consulta anterior con la sintaxis más reciente:
SELECT p.ProductID, m.Name AS Model, p.Name AS Product
FROM SalesLT.Product AS p
JOIN SalesLT.ProductModel AS m
ON p.ProductModelID = m.ProductModelID;
Nota:
La sintaxis de ANSI SQL-92 dificulta la creación de productos cartesianos accidentales. Una vez que se ha agregado la palabra clave JOIN, se producirá un error de sintaxis si falta una cláusula ON, a menos que JOIN se especifique como CROSS JOIN.