Módulo IV: Consultas Básicas y Avanzadas Ejecución de Consultas Básicas Consultas de Múltiples Tablas Técnicas Avanzadas © Maximiliano Odstrcil - 1 Ejecución de Consultas Básicas Recuperación de Datos Formato de un ResultSet Modificación de Datos © Maximiliano Odstrcil - 2 Recuperación de Datos Uso de la sentencia SELECT Especificación de columnas Uso de la cláusula WHERE Condiciones de búsqueda de WHERE © Maximiliano Odstrcil - 3 Uso de la sentencia SELECT La sentencia SELECT se usa para recuperar los datos. SELECT SELECT [ALL [ALL || DISTINCT] DISTINCT] <<lista_selección lista_selección>> FROM FROM {<tabla_fuente>} {<tabla_fuente>} [,… [,…nn]] WHERE WHERE <<predicado_búsqueda predicado_búsqueda>> lista_selección: especifica las columnas a devolver. FROM: indica la tabla origen de los datos. WHERE: especifica las filas a devolver: Se puede restringir el número de filas usando operadores de comparación, cadenas y operadores lógicos. © Maximiliano Odstrcil - 4 Especificación de columnas (1) La lista de selección contiene las columnas, expresiones, variables o constantes a listar. Consideraciones: La lista de selección devuelve los resultados en el orden listado. Los nombres de las columnas se separan con comas. El (*) devuelve todas las columnas (evitar su uso). © Maximiliano Odstrcil - 5 Especificación de columnas (2) USE USE Northwind Northwind SELECT SELECT EmployeeID, EmployeeID, LastName, LastName, FirstName, FirstName, Title Title FROM FROM Employees Employees EmployeeID EmployeeID LastName LastName FirstName FirstName Title Title 11 22 33 44 55 66 77 88 99 Davolio Davolio Fuller Fuller Leverling Leverling Peacock Peacock Buchanan Buchanan Suyama Suyama King King Callahan Callahan Dodsworth Dodsworth Nancy Nancy Andrew Andrew Janet Janet Margaret Margaret Steven Steven Michael Michael Robert Robert Laura Laura Anne Anne Sales SalesRepresentative Representative Vice VicePresident, President,Sales Sales Sales SalesRepresentative Representative Sales SalesRepresentative Representative Sales SalesManager Manager Sales SalesRepresentative Representative Sales SalesRepresentative Representative Inside InsideSales SalesCoordinator Coordinator Sales SalesRepresentative Representative © Maximiliano Odstrcil - 6 Uso de la cláusula WHERE (1) Con la cláusula WHERE se pueden obtener filas específicas basadas en una condición de búsqueda (limita el número de filas devueltas por la sentencia SELECT). Sólo se devuelven las filas que cumplen con los criterios especificados en la cláusula. © Maximiliano Odstrcil - 7 Uso de la cláusula WHERE (2) Consideraciones: Los datos char, nchar, varchar, nvarchar, text, datetime y smalldatetime van entre comillas simples (SQL Server). En lo posible se deben emplear condiciones de búsqueda positivas. © Maximiliano Odstrcil - 8 Uso de la cláusula WHERE (3) USE USE Northwind Northwind SELECT SELECT EmployeeID, EmployeeID, FROM FROM Employees Employees WHERE WHERE EmployeeID EmployeeID == EmployeeID EmployeeID 55 © Maximiliano Odstrcil - 9 LastName, LastName, FirstName, FirstName, Title Title 55 LastName LastName FirstName FirstName Buchanan Buchanan Steven Steven Title Title Sales SalesManager Manager Condiciones de búsqueda de WHERE En una cláusula WHERE se puede usar lo siguiente: Descripción Condición de Búsqueda Comparadores =, >, <, >=, <= y <> Comparadores de Cadena LIKE y NOT LIKE - % Operadores Lógicos AND, OR, NOT Rango de Valores BETWEEN y NOT BETWEEN Lista de Valores IN y NOT IN Valores desconocidos IS NOT e IS NOT NULL © Maximiliano Odstrcil - 10 Comparadores Comparan columnas, expresiones, variables constantes entre sí. Usar condiciones positivas (son más rápidas). SELECT SELECT LastName, LastName, City City FROM FROM Employees Employees WHERE WHERE Country Country == 'USA' 'USA' LastName LastName Davolio Davolio Fuller Fuller Leverling Leverling Peacock Peacock Callahan Callahan © Maximiliano Odstrcil - 11 City City Seattle Seattle Tacoma Tacoma Kirkland Kirkland Redmond Redmond Seattle Seattle y Comparadores de Cadena (1) Se puede usar el operador LIKE en combinación con caracteres especiales para seleccionar filas comparando cadenas de caracteres. Consideraciones: Todos los caracteres en el patrón son significantes, incluidos los espacios antes y después. LIKE puede ser usado con los tipos de datos char, nchar, varchar, nvarchar o datetime. © Maximiliano Odstrcil - 12 Comparadores de Cadena (2) Caracteres especiales: Caracter Descripción % Cualquier cadena de 0 o más caracteres _ Cualquier caracter [] Cualquier caracter del conjunto [^] Cualquier caracter menos los del conjunto © Maximiliano Odstrcil - 13 Comparadores de Cadena (3) Ejemplos: LIKE 'BR%': todos los nombres que empiecen con BR. LIKE '_er': palabras de tres letras terminadas en er. LIKE '[VB]%': palabras que empiecen en V o B. LIKE '[0-3][^0]': números que comiencen con 0,1,2 o 3 y cuyo segundo número no sea 0. © Maximiliano Odstrcil - 14 Comparadores de Cadena (4) USE USE Northwind Northwind SELECT SELECT CompanyName CompanyName FROM FROM Customers Customers WHERE WHERE CompanyName CompanyName LIKE LIKE '%Restaurant%' '%Restaurant%' CompanyName CompanyName GROSELLA-Restaurante GROSELLA-Restaurante Lonesome LonesomePine PineRestaurant Restaurant Tortuga TortugaRestaurante Restaurante © Maximiliano Odstrcil - 15 Operadores Lógicos Combinan expresiones. El orden de evaluación es NOT, AND y OR. Admiten paréntesis. SELECT SELECT ProductID, ProductID, ProductName, ProductName, SupplierID, SupplierID, UnitPrice UnitPrice FROM FROM Products Products WHERE WHERE (ProductName (ProductName LIKE LIKE 'T%' 'T%' OR OR ProductID ProductID == 46) 46) AND AND (UnitPrice (UnitPrice >> 16.00) 16.00) ProductID ProductID 14 14 29 29 62 62 © Maximiliano Odstrcil - 16 ProductName ProductName Tofu Tofu Thüringer ThüringerRostbratwurst Rostbratwurst Tarte Tarteau ausucre sucre SupplierID SupplierID 66 12 12 29 29 UnitPrice UnitPrice 23.25 23.25 123.79 123.79 49.3 49.3 Rango de Valores (1) BETWEEN: se usa para devolver filas cuyos valores de búsqueda se encuentran dentro de un rango. Consideraciones: La inclusión de los valores de los extremos del intervalo depende del SGBDR. Es mejor usar BETWEEN que dos comparadores (<= y >=) Evitar el uso de NOT BETWEEN por su baja performance. Evitar el uso con valores de fecha ya que hay que tener en cuenta la hora (por defecto medianoche 00:00:00). © Maximiliano Odstrcil - 17 Rango de Valores (2) USE USE Northwind Northwind SELECT SELECT ProductName, ProductName, UnitPrice UnitPrice FROM FROM Products Products WHERE WHERE UnitPrice UnitPrice BETWEEN BETWEEN 10 10 AND AND 20 20 ProductName ProductName Chai Chai Chang Chang Aniseed AniseedSyrup Syrup Genen GenenShouyu Shouyu Pavlova Pavlova Sir SirRodney’s Rodney’sScones Scones .. .. .. © Maximiliano Odstrcil - 18 UnitPrice UnitPrice 18 18 19 19 10 10 15.5 15.5 17.45 17.45 10 10 .. .. .. Lista de Valores (1) La condición IN se utiliza para devolver filas cuyos valores de búsqueda pertenezcan a un conjunto dado. Consideraciones: Se pueden reemplazar por series de expresiones OR. No incluir el valor nulo en el conjunto (resultados inesperados). El uso de NOT IN disminuye la performance. © Maximiliano Odstrcil - 19 Lista de Valores (2) USE USE Northwind Northwind SELECT SELECT CompanyName, CompanyName, Country Country FROM FROM Suppliers Suppliers WHERE WHERE Country Country IN IN ('Japan', ('Japan', 'Italy') 'Italy') CompanyName CompanyName Tokyo TokyoTraders Traders Mayumi’s Mayumi’s Formaggi FormaggiFortini Fortinis.r.l. s.r.l. Pasta PastaButtini Buttinis.r.l. s.r.l. © Maximiliano Odstrcil - 20 Country Country Japan Japan Japan Japan Italy Italy Italy Italy Valores desconocidos (1) Una columna tiene el valor nulo si no se ingresó valor alguno. Un valor nulo no equivale a la cadena vacía ni a 0. Se usa IS NULL para devolver filas cuyos valores de búsqueda sean nulos. © Maximiliano Odstrcil - 21 Valores desconocidos (2) Consideraciones: Los valores nulos hacen fallar a todas las comparaciones. Se define la posibilidad de agregar nulos en las columnas en la sentencia CREATE TABLE. Usar IS NOT NULL para devolver filas con valores conocidos. © Maximiliano Odstrcil - 22 Valores desconocidos (3) USE USE Northwind Northwind SELECT SELECT CompanyName, CompanyName, Fax Fax FROM FROM Suppliers Suppliers WHERE WHERE Fax Fax IS IS NULL NULL CompanyName CompanyName Exotic ExoticLiquids Liquids New NewOrleans OrleansCajun CajunDelights Delights Tokyo TokyoTraders Traders Cooperativa Cooperativade deQuesos Quesos‘Las ‘LasCabras’ Cabras’ .. .. .. © Maximiliano Odstrcil - 23 Fax Fax NULL NULL NULL NULL NULL NULL NULL NULL Formato de un ResultSet Orden de los Datos Eliminación de Duplicados Cambio de Nombres a las Columnas Uso de Constantes © Maximiliano Odstrcil - 24 Orden de los Datos (1) La cláusula ORDER BY ordena las filas devueltas en orden ascendente (ASC) o descendente (DESC). Consideraciones: No se garantiza un orden determinado sin ORDER BY. Por defecto se ordena ascendentemente (ASC). Las columnas por las que se ordenan no necesitan aparecer en la lista de selección. Se puede ordenar por columnas o expresiones y referirse a las mismas por su número de orden en la lista de selección. © Maximiliano Odstrcil - 25 Orden de los Datos (2) SELECT SELECT ProductID, ProductID, ProductName, ProductName, CategoryID, CategoryID, UnitPrice UnitPrice FROM FROM Products Products ORDER ORDER BY BY CategoryID, CategoryID, UnitPrice UnitPrice DESC DESC productid productid 38 38 43 43 22 .. .. .. 63 63 88 61 61 .. .. .. productname productname Cote Cotede deBlaye Blaye Ipoh IpohCoffee Coffee Chang Chang categoryid categoryid 11 11 11 Vegie-spread 22 Vegie-spread Northwoods NorthwoodsCranberry CranberrySauce Sauce 22 Sirop 22 Siropd'érable d'érable © Maximiliano Odstrcil - 26 unitprice unitprice 263.5 263.5 46 46 19 19 43.9 43.9 40 40 28.5 28.5 Eliminación de Duplicados (1) La cláusula DISTINCT permite eliminar filas duplicadas. Consideraciones: La combinación de valores en la lista de selección es la que determina la desigualdad entre filas. Solo se muestra un elemento de todas las filas que tienen la misma combinación de valores de la lista de selección. DISTINCT no ordena, para ello se debe usar ORDER BY. © Maximiliano Odstrcil - 27 Eliminación de Duplicados (2) USE USE Northwind Northwind SELECT SELECT DISTINCT DISTINCT Country Country FROM FROM Suppliers Suppliers ORDER ORDER BY BY Country Country © Maximiliano Odstrcil - 28 Country Country Australia Australia Brazil Brazil Canada Canada Denmark Denmark Finland Finland France France Germany Germany Italy Italy Japan Japan Netherlands Netherlands Norway Norway Singapore Singapore Spain Spain Sweden Sweden UK UK USA USA Cambio de Nombres a las Columnas (1) La cláusula AS permite crear alias a las columnas de manera que resulten más legibles o bien den nombres a las expresiones. Consideraciones: Por defecto, se muestran los nombres de las columnas. Encerrar los alias entre comillas simples si incluyen espacios. Se pueden crear alias para expresiones. Se puede omitir la cláusula AS y dejar un espacio entre la expresión y el alias. © Maximiliano Odstrcil - 29 Cambio de Nombres a las Columnas (2) USE USE Northwind Northwind SELECT SELECT FirstName FirstName AS AS First, First, LastName LastName AS AS Last, Last, EmployeeID EmployeeID AS AS 'Employee 'Employee ID:' ID:' FROM FROM Employees Employees First First Nancy Nancy Andrew Andrew Janet Janet Margaret Margaret Steven Steven Michael Michael Robert Robert Laura Laura Anne Anne © Maximiliano Odstrcil - 30 Last Last Davolio Davolio Fuller Fuller Leverling Leverling Peacock Peacock Buchanan Buchanan Suyama Suyama King King Callahan Callahan Dodsworth Dodsworth Employee EmployeeID: ID: 11 22 33 44 55 66 77 88 99 Uso de Constantes Las constantes o literales son letras, números o símbolos. SELECT SELECT FirstName, FirstName, LastName, LastName, 'Identification 'Identification Number:', Number:', EmployeeID EmployeeID FROM FROM Employees Employees FirstName FirstName Nancy Nancy Andrew Andrew Janet Janet Margaret Margaret Steven Steven Michael Michael Robert Robert Laura Laura Anne Anne © Maximiliano Odstrcil - 31 LastName LastName Davolio Davolio Fuller Fuller Leverling Leverling Peacock Peacock Buchanan Buchanan Suyama Suyama King King Callahan Callahan Dodsworth Dodsworth EmployeeID EmployeeID Identification IdentificationNumber: Number: Identification IdentificationNumber: Number: Identification IdentificationNumber: Number: Identification IdentificationNumber: Number: Identification IdentificationNumber: Number: Identification IdentificationNumber: Number: Identification IdentificationNumber: Number: Identification IdentificationNumber: Number: Identification IdentificationNumber: Number: 11 22 33 44 55 66 77 88 99 Modificación de Datos Inserción de Filas Borrado de Filas Modificación de Filas © Maximiliano Odstrcil - 32 Inserción de Filas (1) La sentencia INSERT agrega filas a una tabla. INSERT INSERT VALUES VALUES [INTO] [INTO] tabla tabla [(lista_columnas)] [(lista_columnas)] (lista_valores) (lista_valores) || DEFAULT DEFAULT VALUES VALUES Consideraciones: Usar la lista de columnas para forzar el orden de los valores. Especificar los datos a ingresar luego de la palabra VALUES. El orden y tipo de datos deben coincidir con los de la tabla. La sentencia INSERT falla si se violan las constraints o Reglas. © Maximiliano Odstrcil - 33 Inserción de Filas (2) USE USE Northwind Northwind INSERT INSERT Customers Customers (CustomerID, (CustomerID, CompanyName, CompanyName, ContactName, ContactName, ContactTitle, ContactTitle, Address, Address, City, City, Region, Region, PostalCode, PostalCode, Country, Country, Phone, Phone, Fax) Fax) VALUES VALUES ('PECOF', ('PECOF', 'Pecos 'Pecos Coffee Coffee Company', Company', 'Michael 'Michael Dunn', Dunn', 'Owner', 'Owner', '1900 '1900 Oak Oak Street', Street', 'Vancouver', 'Vancouver', 'BC', 'BC', 'V3F 'V3F 2K1', 2K1', 'Canada', 'Canada', '(604) '(604) 555-3392', 555-3392', '(604) '(604) 555-7293') 555-7293') © Maximiliano Odstrcil - 34 Inserción de Filas (3) Cuando se insertan filas a una tabla, se pueden emplear las cláusulas DEFAULT o DEFAULT VALUES. Consideraciones sobre DEFAULT: Se inserta un valor nulo para aquellas columnas que no tienen definido un valor por efecto y admiten valores nulos. Si la columna no admite valores nulos ni tiene valor por defecto, la sentencia fallará. No se puede usar DEFAULT para columnas del tipo IDENTITY. INSERT INSERT VALUES VALUES © Maximiliano Odstrcil - 35 Shippers Shippers (CompanyName, (CompanyName, Phone) Phone) ('Kenya ('Kenya Coffee Coffee Co.', Co.', DEFAULT) DEFAULT) Inserción de Filas (4) DEFAULT VALUES permite insertar toda una fila por defecto en la tabla. Consideraciones: En columnas con tipos de datos timestamp o propiedad IDENTITY, se inserta el siguiente valor apropiado. Se puede usar DEFAULT VALUES para generar datos de prueba y poblar tablas de manera sencilla. No disponible para MySQL. INSERT INSERT Clientes Clientes DEFAULT DEFAULT VALUES VALUES © Maximiliano Odstrcil - 36 Inserción de Filas (5) Si la columna tiene valores por defecto o acepta valores nulos, se puede omitir el nombre en la sentencia INSERT. Consideraciones: Listar sólo los nombres de columnas para los cuales haya valores (no listar las columnas IDENTITY). Las columnas no nombradas adoptarán el valor por defecto. Especificar el valor nulo escribiendo NULL (sin comillas). © Maximiliano Odstrcil - 37 Inserción de Filas (6) Agregando Agregandonuevos nuevosdatos datos USE USE Northwind Northwind INSERT INSERT Shippers Shippers (CompanyName) (CompanyName) VALUES VALUES ('Fitch ('Fitch && Mather') Mather') Verificando Verificandonuevos nuevosdatos datos USE USE Northwind Northwind SELECT SELECT ** FROM FROM Shippers Shippers WHERE WHERE CompanyName CompanyName == 'Fitch 'Fitch && Mather' Mather' Permite valores nulos © Maximiliano Odstrcil - 38 ShipperID ShipperID CompanyName CompanyName Phone Phone 37 37 Fitch Fitch&&Mather Mather NULL NULL Borrado de Filas (1) La sentencia DELETE: Borra una o más filas de una tabla. Se puede limitar las filas a borrar (WHERE). Cada fila borrada se registra en el RT como una transacción. SQL Server: DELETE DELETE Orders Orders WHERE WHERE DATEDIFF(MONTH, DATEDIFF(MONTH, GETDATE(), GETDATE(), ShippedDate) ShippedDate) >= >= 66 MySQL: DELETE DELETE FROM FROM Orders Orders WHERE WHERE DATEDIFF(CURDATE(), DATEDIFF(CURDATE(), ShippedDate) ShippedDate) // 30 30 >= >= 6; 6; © Maximiliano Odstrcil - 39 Borrado de Filas (2) La sentencia TRUNCATE TABLE: Se usa para borrar todas las filas de una tabla, reteniendo su estructura y sus objetos asociados. Se ejecuta mucho más rápido que DELETE ya que no se registra en el Registro de Transacciones. Si la tabla tiene una columna IDENTITY, vuelve el valor de la semilla al valor inicial. TRUNCATE TRUNCATE TABLE TABLE Orders Orders © Maximiliano Odstrcil - 40 Modificación de Filas (1) La sentencia UPDATE modifica los datos existentes de las filas de las tablas. UPDATE UPDATE Products Products SET SET UnitPrice UnitPrice == (UnitPrice (UnitPrice ** 1.1) 1.1) © Maximiliano Odstrcil - 41 Modificación de Filas (2) Consideraciones: Las filas a modificar se especifican en la cláusula WHERE. Los valores nuevos se especifican con la cláusula SET. Los valores ingresados deben ser del mismo tipo de las columnas a modificar y no deben violar las constraints y Reglas. Se pueden cambiar los datos de una tabla a la vez. Se pueden usar expresiones basadas en columnas de la tabla u otras tablas, variables y constantes. © Maximiliano Odstrcil - 42 Consultas de Múltiples Tablas Combinación de Múltiples Tablas Combinación de Varios Resultsets Creación de Tabla desde Resultset © Maximiliano Odstrcil - 43 Combinación de Múltiples Tablas Introducción a Joins Uso de Inner Joins Uso de Outer Joins Uso de Cross Joins Joins de más de dos tablas Join de una tabla con sí misma © Maximiliano Odstrcil - 44 Introducción a Joins (1) Se unen (join) tablas para producir un conjunto simple de resultados que incorpora filas de dos o más tablas. SELECT SELECT lista_selección lista_selección FROM FROM tabla1 tabla1 [INNER|LEFT|RIGHT|OUTER] [INNER|LEFT|RIGHT|OUTER] JOIN JOIN tabla2 tabla2 ON ON condición_join condición_join La cláusula JOIN especifica qué tablas son las que se unen y cómo se unen. La cláusula ON especifica las columnas en común que tienen las tablas. © Maximiliano Odstrcil - 45 Introducción a Joins (2) Consideraciones: Especificar las condiciones del join basadas en las claves primarias y propagadas de las tablas. Si la tabla tiene una clave compuesta, se deben referenciar todas las columnas luego de la palabra ON. Si los nombres de las columnas son los mismos en las tablas, usar el formato nombre_tabla.nombre_columna. Limitar el número de tablas en un join ya que también aumenta el tiempo de proceso de la consulta. © Maximiliano Odstrcil - 46 Uso de Inner Joins (1) Los Inner Joins combinan tablas comparando los valores en las columnas comunes a ambas tablas y devolviendo sólo las filas que cumplen con la condición. Consideraciones: Los inner joins son los joins por defecto (se puede omitir “inner”) Especificar las columnas a listar en el ResultSet incluyéndolas en la lista de selección con los nombres cualificados. Si se incluye WHERE, se restringe el nº de filas devueltas. No usar el valor nulo como condición del join. No se garantiza un orden en el resultado (usar ORDER BY). © Maximiliano Odstrcil - 47 Uso de Inner Joins (2) SELECT SELECT buyer_name, buyer_name, sales.buyer_id, sales.buyer_id, qty qty FROM FROM Buyers Buyers INNER INNER JOIN JOIN Sales Sales ON Buyers.buyer_id = Sales.buyer_id ON Buyers.buyer_id = Sales.buyer_id Buyers Sales buyer_name buyer_name buyer_id buyer_id Adam 11 AdamBarr Barr Sean 22 SeanChai Chai Eva 33 EvaCorets Corets Erin 44 ErinO’Melia O’Melia buyer_id buyer_id prod_id prod_id qty qty 11 22 15 15 11 33 55 44 11 37 37 33 55 11 11 44 22 1003 1003 Resultado buyer_name buyer_name buyer_id buyer_id qty qty Adam 11 15 AdamBarr Barr 15 11 Adam 55 AdamBarr Barr Erin 44 37 ErinO’Melia O’Melia 37 Eva 33 11 EvaCorets Corets 11 Erin 44 1003 ErinO’Melia O’Melia 1003 © Maximiliano Odstrcil - 48 Uso de Outer Joins (1) Los Left o Right Joins combinan filas desde dos tablas que satisfacen la condición del join más las filas de la tabla izquierda o derecha que no la satisfacen. Se usan para obtener los datos que están en una tabla adicionando los que están en la otra, si es que están. Consideraciones: A LEFT JOIN B = B RIGHT JOIN A No usar valores nulos en la condición del join. Usar los Outer Joins entre dos tablas preferentemente. Se puede abreviar omitiendo la palabra “Outer”. © Maximiliano Odstrcil - 49 Uso de Outer Joins (2) SELECT SELECT buyer_name, buyer_name, sales.buyer_id, sales.buyer_id, qty qty FROM Buyers LEFT OUTER JOIN Sales FROM Buyers LEFT OUTER JOIN Sales ON ON Buyers.buyer_id Buyers.buyer_id == Sales.buyer_id Sales.buyer_id Buyers Sales buyer_name buyer_name buyer_id buyer_id Adam 11 AdamBarr Barr Sean 22 SeanChai Chai Eva 33 EvaCorets Corets Erin 44 ErinO’Melia O’Melia buyer_id buyer_id prod_id prod_id qty qty 11 22 15 15 11 33 55 44 11 37 37 33 55 11 11 44 22 1003 1003 © Maximiliano Odstrcil - 50 Resultado buyer_name buyer_name buyer_id buyer_id qty qty Adam 11 15 AdamBarr Barr 15 Adam 11 55 AdamBarr Barr Erin 44 37 ErinO’Melia O’Melia 37 33 Eva 11 EvaCorets Corets 11 Erin 44 1003 ErinO’Melia O’Melia 1003 Sean NULL SeanChai Chai NULL NULL NULL Uso de Cross Joins (1) Los Cross Joins realizan el producto cartesiano de dos tablas (no requieren columnas en común). Consideraciones: Son raramente usados en una BD normalizada, aunque se los utiliza para poblar rápidamente tablas para pruebas. Cardinalidad(A Cross Join B) = Cardinalidad(A) *Cardinalidad(B) © Maximiliano Odstrcil - 51 Uso de Cross Joins (2) SELECT SELECT buyer_name, buyer_name, qty qty FROM FROM Buyers Buyers CROSS CROSS JOIN JOIN Sales Sales Buyers buyer_id buyer_id 11 22 33 44 buyer_name buyer_name Adam AdamBarr Barr Sean SeanChai Chai Eva EvaCorets Corets Erin ErinO’Melia O’Melia © Maximiliano Odstrcil - 52 Sales buyer_id buyer_id prod_id prod_id qty qty 11 22 15 15 11 33 55 44 11 37 37 33 55 11 11 44 22 1003 1003 Resultado buyer_name buyer_name Adam AdamBarr Barr Adam AdamBarr Barr Adam AdamBarr Barr qty qty 15 15 55 37 37 Adam AdamBarr Barr Adam AdamBarr Barr Sean SeanChai Chai Sean SeanChai Chai Sean SeanChai Chai Sean SeanChai Chai Sean SeanChai Chai Eva EvaCorets Corets Eva EvaCorets Corets ...... 11 11 1003 1003 15 15 55 37 37 11 11 1003 1003 15 15 55 ...... Joins de más de dos tablas (1) Es posible unir más de dos tablas, ya que cada tabla en un join tiene alguna columna en común con otra tabla. Consideraciones: A join B join C = (A join B) join C = D join C, con D = A join B. Se deben tener tablas relacionadas con claves foráneas. Se deben considerar las claves compuestas en los joins. Se puede incluir una cláusula WHERE para limitar las filas. El número de cláusulas joins es siempre uno menor al número de tablas participantes. Los joins son conmutativos. © Maximiliano Odstrcil - 53 Joins de más de dos tablas (2) SELECT SELECT buyer_name, buyer_name, prod_name, prod_name, qty qty FROM Buyers JOIN Sales FROM Buyers JOIN Sales ON ON Buyers.buyer_id Buyers.buyer_id == Sales.buyer_id Sales.buyer_id JOIN Produce JOIN Produce ON ON Sales.prod_id Sales.prod_id == Produce.prod_id Produce.prod_id Buyers buyer_id buyer_id buyer_name buyer_name 11 Adam AdamBarr Barr 22 Sean SeanChai Chai 33 Eva EvaCorets Corets 44 Erin ErinO’Melia O’Melia Sales buyer_id buyer_id prod_id prod_id qty qty 11 22 15 15 11 33 55 33 4 11 37 37 44 3 55 11 11 22 4 22 1003 1003 Resultado buyer_name prod_name buyer_name prod_name qty qty Erin Apples 37 ErinO’Melia O’Melia Apples 37 Adam Pears 15 AdamBarr Barr Pears 15 Erin Pears 1003 ErinO’Melia O’Melia Pears 1003 Adam Oranges 55 AdamBarr Barr Oranges Eva EvaCorets Corets © Maximiliano Odstrcil - 54 Peaches Peaches 11 11 Produce prod_id prod_id prod_name prod_name 11 Apples Apples 22 Pears Pears 33 Oranges Oranges 44 Bananas Bananas 55 Peaches Peaches Join de una tabla con sí misma (1) Se realiza para encontrar filas que tengan valores en común con otras filas de la misma tabla. Consideraciones: Hay que especificar alias de la tabla para referenciar dos copias de la misma tabla (se las trata como dos tablas separadas). Cuando se generan las filas, al cumplir las condiciones del ON dos veces, se generan repetidas. Se soluciona aplicando en el WHERE una condición de desigualdad para eliminarlas. © Maximiliano Odstrcil - 55 Join de una tabla con sí misma (2) SELECT SELECT a.buyer_id a.buyer_id AS AS buyer1, buyer1, a.prod_id, a.prod_id, b.buyer_id AS buyer2 b.buyer_id AS buyer2 FROM Sales FROM Sales aa JOIN JOIN Sales Sales bb ON ON a.prod_id a.prod_id == b.prod_id b.prod_id WHERE a.buyer_id WHERE a.buyer_id >> b.buyer_id b.buyer_id Sales a Sales b buyer_id buyer_id prod_id prod_id qty qty 11 22 15 15 11 33 55 44 11 37 37 33 55 11 11 44 22 1003 1003 buyer_id buyer_id prod_id prod_id qty qty 11 22 15 15 11 33 55 44 11 37 37 33 55 11 11 44 22 1003 1003 Resultado buyer1 buyer1 prod_id prod_id buyer2 buyer2 44 22 11 © Maximiliano Odstrcil - 56 Combinación de Varios ResultSets (1) El operador UNION combina los resultados de dos o más sentencias SELECT en un solo ResultSet. sentencia_select sentencia_select UNION UNION [ALL] [ALL] sentencia_select... sentencia_select... Se lo usa cuando los datos residen en diferentes ubicaciones y no pueden ser accedidos en una sola consulta. © Maximiliano Odstrcil - 57 Combinación de Varios ResultSets (2) SQL Server: MySQL: © Maximiliano Odstrcil - 58 Combinación de Varios ResultSets (3) Consideraciones: Los resultados deben tener el mismo tipo de datos, número y orden de columnas en la lista de selección. Automáticamente se remueven las filas duplicadas, a menos que se emplee la cláusula ALL. El resultado se devuelve en cualquier orden. Para que salga ordenado se debe emplear ORDER BY. © Maximiliano Odstrcil - 59 Creación de Tabla desde Resultset (1) Se puede crear una nueva tabla en base al resultado de una consulta mediante la sentencia SELECT INTO (SQL Server) o CREATE SELECT (MySQL). Nueva tabla en base a una consulta (SQL Server): SELECT SELECT ProductName ProductName AS AS Products, Products, UnitPrice UnitPrice AS AS Price Price INTO INTO PriceTable PriceTable FROM FROM Products Products Nueva tabla en base a una consulta (MySQL): CREATE CREATE TABLE TABLE PriceTable PriceTable SELECT SELECT ProductName, ProductName, UnitPrice UnitPrice FROM FROM Products; Products; © Maximiliano Odstrcil - 60 Creación de Tabla desde Resultset (2) Consideraciones: Siempre se crea una tabla y se inserta el Resultset en la misma. Todas las columnas deben tener nombre (usar alias). En SQL Server se debe tener el permiso select into/bulk copy. Al crear la tabla se puede especificar que la misma sea temporaria. Una tabla temporaria brinda un espacio de trabajo para resultados intermedios. © Maximiliano Odstrcil - 61 Creación de Tabla desde Resultset (3) En SQL Server se pueden tener tablas temporales: Locales (#): el espacio que ocupan es liberado cuando se termina la sesión que las creó. Globales (##): el espacio que ocupan es liberado cuando termina la última sesión abierta en el servidor. En el caso de MySQL, las tablas temporales sólo pueden ser locales. © Maximiliano Odstrcil - 62 Creación de Tabla desde Resultset (4) Tabla temporal en base a una consulta (SQL Server): SELECT SELECT ProductName ProductName AS AS Products, Products, UnitPrice UnitPrice AS AS Price Price INTO INTO #PriceTable #PriceTable FROM FROM Products Products Tabla temporal en base a una consulta (MySQL): CREATE CREATE TEMPORARY TEMPORARY TABLE TABLE PriceTable PriceTable SELECT SELECT ProductName, ProductName, UnitPrice UnitPrice FROM FROM Products; Products; © Maximiliano Odstrcil - 63 Técnicas Avanzadas EXISTS y NOT EXISTS Modificación de Datos © Maximiliano Odstrcil - 64 EXISTS y NOT EXISTS (1) Definiciones: Subconsulta: consulta anidada dentro de otra. Subconsulta correlacionada: subconsulta que utiliza los valores de la consulta externa. La subconsulta se evalúa una vez por cada fila procesada por la consulta externa. © Maximiliano Odstrcil - 65 EXISTS y NOT EXISTS (2) Se pueden usar las cláusulas EXISTS y NOT EXISTS para determinar la existencia de filas. Formato: [NOT] EXISTS subconsulta Ejemplo: SELECT SELECT LastName, LastName, EmployeeID EmployeeID FROM FROM Employees Employees ee WHERE WHERE EXISTS EXISTS (SELECT (SELECT ** FROM FROM Orders Orders WHERE WHERE e.EmployeeID e.EmployeeID == Orders.EmployeeID Orders.EmployeeID AND OrderDate = '9/5/97') AND OrderDate = '9/5/97') © Maximiliano Odstrcil - 66 EXISTS y NOT EXISTS (3) Consideraciones: Devuelven un valor TRUE o FALSE basado en la existencia. La consulta externa prueba la existencia de filas que la subconsulta interna retorna (no produce datos). © Maximiliano Odstrcil - 67 Modificación de Datos Uso de la sentencia INSERT..SELECT Borrado de filas basadas en otras tablas Modificación de filas basadas en otras tablas © Maximiliano Odstrcil - 68 Uso de la sentencia INSERT..SELECT (1) Para agregar filas a una tabla existente, se pueden emplear las sentencias INSERT ... SELECT: INSERT INSERT Customers Customers SELECT SELECT SUBSTRING(FirstName, SUBSTRING(FirstName, 1, 1, 3) 3) ++ SUBSTRING(LastName, SUBSTRING(LastName, 1, 1, 2), 2), LastName, FirstName, Title, NULL LastName, FirstName, Title, NULL FROM Employees FROM Employees INSERT INSERT Customers Customers SELECT CONCAT(SUBSTRING(FirstName,1,3),SUBSTRING(LastName,1,2)), SELECT CONCAT(SUBSTRING(FirstName,1,3),SUBSTRING(LastName,1,2)), LastName,FirstName,Title,NULL,NULL,NULL,NULL,NULL,NULL,NULL LastName,FirstName,Title,NULL,NULL,NULL,NULL,NULL,NULL,NULL FROM FROM Employees; Employees; © Maximiliano Odstrcil - 69 Uso de la sentencia INSERT..SELECT (2) Se puede insertar el resultado de una consulta, por más compleja que ésta sea. Consideraciones: Se agregan todas las filas que satisfacen la condición del SELECT. Las columnas de la tabla destino deben tener tipos de datos compatibles a la lista de selección. Se debe determinar la existencia de valores por defecto o valores nulos en caso de omitir alguna columna. Siempre se agregan filas a una tabla solamente. © Maximiliano Odstrcil - 70 Borrado de filas basadas en otras tablas (1) Para borrar filas basadas en datos almacenados en otras tablas, se puede usar DELETE con joins o subconsultas: SQL Server: DELETE DELETE FROM FROM [Order [Order Details] Details] FROM Orders o JOIN [Order FROM Orders o JOIN [Order Details] Details] od od ON o.OrderID = od.OrderID ON o.OrderID = od.OrderID WHERE WHERE OrderDdate OrderDdate == '4/14/1998' '4/14/1998' © Maximiliano Odstrcil - 71 Borrando filas basadas en otras tablas (2) Si se emplea una subconsulta: SQL Server: DELETE DELETE FROM FROM [Order [Order Details] Details] WHERE OrderID IN WHERE OrderID IN (SELECT (SELECT OrderID OrderID FROM FROM Orders Orders WHERE WHERE OrderDate OrderDate == '4/14/1998') '4/14/1998') MySQL: DELETE DELETE FROM FROM `Order `Order Details` Details` WHERE OrderID IN WHERE OrderID IN (SELECT (SELECT OrderID OrderID FROM FROM Orders Orders WHERE WHERE OrderDate OrderDate == '1998/4/14'); '1998/4/14'); © Maximiliano Odstrcil - 72 Modific. de filas basadas en otras tablas (1) Para modificar filas basadas en datos almacenados en otras tablas, se puede usar UPDATE con joins o subconsultas. UPDATE UPDATE Products Products SET UnitPrice SET UnitPrice == UnitPrice UnitPrice ++ 22 FROM FROM Products Products JOIN JOIN Suppliers Suppliers ON ON Products.SupplierID Products.SupplierID == Suppliers.SupplierID Suppliers.SupplierID WHERE WHERE Suppliers.Country Suppliers.Country == 'USA' 'USA' Consideraciones: Nunca se modifica la misma fila dos veces en una sentencia UPDATE. Esta restricción permite el ahorro de mucho tiempo. Usar la cláusula FROM en la sentencia UPDATE. © Maximiliano Odstrcil - 73 Modificando filas basadas en otras tablas (2) UPDATE UPDATE Products Products SET SET UnitPrice UnitPrice == UnitPrice UnitPrice ++ 22 WHERE WHERE SupplierID SupplierID IN IN (SELECT SupplierID (SELECT SupplierID FROM FROM Suppliers Suppliers WHERE WHERE Country Country == 'USA') 'USA') Consideraciones: La subconsulta se ejecuta una vez para cada fila que va a ser modificada. La subconsulta retorna un único valor. Si la subconsulta no puede retornar un único valor, se pueden usar las cláusulas: IN, EXISTS, ANY y ALL. Considerar el uso de funciones agregadas con subconsultas correlacionadas ya que nunca se calculan los valores 2 veces. © Maximiliano Odstrcil - 74
© Copyright 2024