Universidad de Chile. Facultad de Cs. Fı́sicas y Matemáticas. Departamento de Ingenierı́a Industrial Curso: Aplicaciones de Bases de Datos para la Empresa y Minerı́a de Datos. Profesor: Richard Weber Profesor Auxiliar: Gastón L’Huillier Semestre: Otoño 2008 AUXILIAR 2 Consultas SQL 1. Structured Query Language (SQL) La sintaxis básica de consulta es la siguiente: SELECT [DISTINCT | ALL] {* | [column_expression [AS new_name]] [,...] } FROM table_name [alias] [, ...] [WHERE condition] [GROUP BY column_list] [ HAVING condition] [ORDER BY column_list] Donde, SELECT: Especifica las columnas (atributos) que se proyectarán en la consulta. FROM: Especifica las tablas que se usaran para la consulta. WHERE: Establece los filtros básicos sobre las tuplas. GROUP BY: Permite agrupar los datos sobre una columna. Esta columna debe estar incluı́da en el “SELECT”. HAVING: Permite generar filtros sobre los grupos de datos. (similar al WHERE) ORDER BY: Especifica el orden de los datos. 1 1.1. Otros comandos Además de los comandos presentados anteriormente, para el caso de MySQL se presenta un listado de comandos utilizados de manera frecuente. RLIKE: Permite comparar expresiones regulares entre dos variables. SUM: Función de agregación que permite calcular la suma de un conjunto de elementos numéricos. AVG: Función de agregación que permite calcular la promedio de un conjunto de elementos numéricos. COUNT: Función de agregación que permite contar un conjunto de elementos numéricos. CONCAT(A,B) : Función que concatena A con B, retornando la variable de tipo varchar AB. IF(condicion,then,else): Función lógica que permite evaluar una condición lógica, entregando como resultado then en caso de ser verdadera, o else en caso de ser falsa. YEAR(date): Función que retorna el año asociado a una determinada variable de tipo date. MONTH(date): Función que retorna el mes asociado a una determinada variable de tipo date. numero 1 <> numero 2 : Operador de desigualdad entre el numero 1 y el numero 2. 2. Problemas Las siguiente consultas fueron realizadas en base a la base de datos bd ctp1 in60e.sql disponible en material docente. 1. Una lista con las empresas, el nombre de contacto, el cargo y el teléfono de aquellos clientes cuyos contactos sean propietarios o gerentes. SELECT clientes.NombreCompania, clientes.NombreContacto, 2 clientes.CargoContacto, clientes.Telefono FROM clientes WHERE clientes.CargoContacto RLIKE ’propietario’ OR clientes.CargoContacto RLIKE ’gerente’ 2. Una lista con los destinatarios y el monto de sus pedidos para el año 1996. SELECT pedidos.Destinatario AS Destinatario, SUM(detalles_de_pedidos.PrecioUnidad* detalles_de_pedidos.Cantidad* (1-detalles_de_pedidos.Descuento)) AS SUMA FROM pedidos, detalles_de_pedidos WHERE detalles_de_pedidos.IdPedido = pedidos.IdPedido AND YEAR(pedidos.FechaPedido) = 1996 GROUP BY pedidos.Destinatario; 3. El promedio sobre todos los pedidos de los destinatarios para el año 1996. SELECT CONCAT(’a~ no’,ventas.year) as A~ no, AVG(ventas.SUMA) as Media FROM (SELECT pedidos.Destinatario AS Destinatario, YEAR(pedidos.FechaPedido) as year, SUM(detalles_de_pedidos.PrecioUnidad* detalles_de_pedidos.Cantidad* (1-detalles_de_pedidos.Descuento)) AS SUMA FROM pedidos, detalles_de_pedidos WHERE detalles_de_pedidos.IdPedido = pedidos.IdPedido AND YEAR(pedidos.FechaPedido) = 1996 GROUP BY pedidos.Destinatario) as ventas GROUP BY ventas.year; 4. Una lista con los nombres de los destinatarios, su dirección y ciudad, que posean en cada semestre del año 1997 un monto del pedido inferior al pedido en el año 1996. SELECT pedidos.Destinatario AS Destinatario, pedidos.DireccionDestinatario AS Direccion, pedidos.CiudadDestinatario AS Ciudad, 3 tabla_1996.SUMA_96 AS Monto_96, tabla_97_01.SUMA_97_01 AS Monto_97_01, tabla_97_02.SUMA_97_02 AS Monto97_02 FROM pedidos, (SELECT pedidos.Destinatario AS Destinatario, SUM(detalles_de_pedidos.PrecioUnidad* detalles_de_pedidos.Cantidad* (1-detalles_de_pedidos.Descuento)) AS SUMA_96 FROM pedidos, detalles_de_pedidos WHERE detalles_de_pedidos.IdPedido = pedidos.IdPedido AND YEAR(pedidos.FechaPedido) = 1996 GROUP BY pedidos.Destinatario) AS tabla_1996, (SELECT pedidos.Destinatario AS Destinatario, SUM(detalles_de_pedidos.PrecioUnidad* detalles_de_pedidos.Cantidad* (1-detalles_de_pedidos.Descuento)) AS SUMA_97_01 FROM pedidos, detalles_de_pedidos WHERE detalles_de_pedidos.IdPedido = pedidos.IdPedido AND YEAR(pedidos.FechaPedido) = 1997 AND MONTH(pedidos.FechaPedido) <=6 GROUP BY pedidos.Destinatario) AS tabla_97_01, (SELECT pedidos.Destinatario AS Destinatario, SUM(detalles_de_pedidos.PrecioUnidad* detalles_de_pedidos.Cantidad* (1-detalles_de_pedidos.Descuento)) AS SUMA_97_02 FROM pedidos, detalles_de_pedidos WHERE detalles_de_pedidos.IdPedido = pedidos.IdPedido AND YEAR(pedidos.FechaPedido) = 1997 AND MONTH(pedidos.FechaPedido) > 6 GROUP BY pedidos.Destinatario) AS tabla_97_02 WHERE pedidos.Destinatario LIKE tabla_1996.Destinatario AND tabla_1996.Destinatario LIKE tabla_97_01.Destinatario AND tabla_97_01.Destinatario LIKE tabla_97_02.Destinatario AND tabla_1996.SUMA_96 > tabla_97_01.SUMA_97_01 AND tabla_1996.SUMA_96 > tabla_97_02.SUMA_97_02 GROUP BY pedidos.Destinatario, pedidos.DireccionDestinatario, pedidos.CiudadDestinatario; 4