Consultas SQL INNER JOIN

Documentos relacionados
Operaciones con bases de

Capítulo 4. Realización de consultas

Ser capaces de realizar una consulta dentro de otra

SQL. Carlos A. Olarte BDI

1. DML. Las consultas multitabla

Consultas Complejas:

Lenguaje SQL en ABAP IV 1-19

VISUALIZACIÓN DE DATOS A PARTIR DE VARIAS TABLAS

Base de Datos. Docente: Ing. Francisco Rodríguez BASE DATOS. Resultados. Internet. Requerimientos

Ficheros y Bases de Datos Curso Primer Parcial. 7 de FEBRERO de Nombre:

Maestría en Bioinformática. Bases de Datos y Sistemas de Información SQL: SELECT. Ing. Alfonso Vicente, PMP

SQL (DML) Carlos A. Olarte Gestión y Modelación de SQL Datos (DML)

Unidad. Lenguaje SQL. (Structured Query Language)

Guía de ejercicios de SQL Prof. Mauricio E. Fernández N. Semestre Agosto-Diciembre de 2012

Unidad 7. CONSULTAS MULTITABLA

6- Combinación de tablas

UNIDAD 1.- PARTE 1 MANIPULACIÓN AVANZADA DE DATOS CON SQL. BASES DE DATOS PARA APLICACIONES. Xochitl Clemente Parra Armando Méndez Morales

Manipulación de datos en SQL

Unidad III: Lenguaje de manipulación de datos (DML) 3.1 Inserción, eliminación y modificación de registros

ORACLE 10g. Descripción A QUIEN VA DIRIGIDO?

Base de datos I Facultad de Ingeniería. Escuela de computación.

Tema 7. Elaboración de consultas básicas de selección. Lenguajes de bases de datos. SQL básico 15/12/2011

LENGUAJE DE CONSULTA ESTRUCTURADO (SQL)

Structured Query Language (SQL) Fundamentos de Bases de Datos InCo

Vistas en InformiX Sistemas de Bases de Datos II EMT CETP A/S Leonardo Carámbula

Sistemas de Datos Curso: Ernesto Chinkes. Subconsultas Stored Procedures - Triggers

Computación Web (Curso 2015/2016)

Bases de Datos 2. Teórico

ÍNDICE PRIMERA PARTE... 17

Procesamiento y Optimización de consultas Material Preliminar en preparación

Consultas con combinaciones

Bases de datos 1. Teórico: Algebra Relacional

Características del lenguaje SQL

SQL Server FEMEPA SQL Server 2000

Reporting (objeto Query)

Ejemplo de gestión de datos con SQL

Lenguaje de Consulta Estructurado S Q. Lenguaje de Consulta Estructurado. Wael Najjar /

Curso SQL Nivel Avanzado 1. Miguel Jurado García

8 SQL SERVER 2008 RA-MA

Curso Querying Microsoft SQL Server 2014 (20461)

ÍNDICE. Introducción... Capítulo 1. Novedades de Access

Álvaro Herrera Modelamiento Avanzado de Datos con PostgreSQL

8 MICROSOFT SQL SERVER 2008 R2. CURSO PRÁCTICO RA-MA

Bases de Datos SQL - Ejemplos

Tutorial de SQL - El comando SELECT

A.1. Definiciones de datos en SQL

SINTAXIS DE SQL-92. <definición de esquema >::= CREATE SCHEMA <cláusula de nombre de esquema> [ <elemento de esquema>... ]

Sql Basico. Seminar Introduction

GUIA DE EJERCICIOS PARA RESOLVER: SQL

Insertar Datos en Tablas

Access SQL: DDL y DML. Una empresa de Ingeniería precisa una base de datos para la gestión de sus proyectos.

Práctica A: Procedimientos para agrupar y resumir datos

MÓDULO 1: ORGANIZACIÓN Y ESTRUCTURA DE LA INFORMACIÓN. Tema 3: Interrogación y explotación de datos. Leire Aldaz, Begoña Eguía y Leire Urcola

Temario. Índices simples Árboles B Hashing

FUNCIONES EN SQL SERVER

m046a Curso Consultando SQL Server 2005/2008 con Transact-SQL, 15 h

ÍNDICE INTRODUCCIÓN...17

1. DML. Las subconsultas

LENGUAJE SQL. En Mysql se utiliza un subconjunto de SQL (update, insert into, delete, select, truncate,etc).

6.1 Introducción. Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 1

Ing. Santiago C. Pérez Laura Noussan Lettry Carlos Campos

Oracle Database: Introducción a SQL

CONSULTAS DE RESUMEN SQL SERVER Manual de Referencia para usuarios. Salomón Ccance CCANCE WEBSITE

EXISTS y NOT EXISTS. Empleados que no trabajan en el proyecto 527.

ACERCA DE LOS AUTO RES... III AGRADECIMIENTOS... xi INTRODUCCION... Xl

UNIVERSIDAD NACIONAL DE INGENIERIA Dirección de Estudios de Posgrado y Educación Continua UNI-DEPEC

Bases de Datos Relacionales

Datos Agregados por medio de Funciones de Grupo. Copyright Oracle Corporation, All rights reserved.

Sistemas de Bases de Datos II

Vistas en MS SQL Server. Bases de Datos I Universidad Católica II Cuatrimestre

Base de Datos Oracle 10g: Introducción a SQL Código: D Duración: 5 días (40 horas)

: COMPUTACIÓN E INFORMATICA : Ingeniería de Software Ingeniería de Redes y Comunicaciones : Administración de Bases de Datos I : T-INF127

Ministerio de Educación. Base de datos en la Enseñanza. Open Office. Módulo 4: Diseñador de Consultas (+ info)

Primeramente estudiaremos la forma básica de la sentencia SELECT, que esta formado por:

Subconsultas Multi-Columna. Copyright Oracle Corporation, All rights reserved.

SQL (Structured Query Language)

CONSULTAS MULTITABLAS SQL SERVER Manual de Referencia para usuarios. Salomón Ccance CCANCE WEBSITE

SQL. Lenguaje de Consulta Estructurado. Curso básico de SQL (Leire Urcola Carrera)

Crear BD en. Isis Bonet Cruz, PhD

Bases de datos: Lenguaje de consultas SQL

BASES DE DATOS TEMA 4. SQL. UN LENGUAJE DE CONSULTA COMERCIAL PARA BASES DE DATOS RELACIONALES Contenidos generales

ÍNDICE INTRODUCCIÓN...13

CURSO TRANSACT SQL MANUAL TÉCNICO CURSO TRANSACT SQL MANUAL TÉCNICO 1

Ministerio de Educación. Base de datos en la Enseñanza. Open Office. Módulo 5: Informes

2.5.- El lenguaje estándar SQL

Formato para prácticas de laboratorio

Manual Práctico de SQL. ORIENTADO A SQL 7.0 Preparado por: Alvaro E. García alvaroegarcia@ubbi.com

Las operaciones más importantes disponibles en álgebra relacional son:

select nombre from profesores where categoria='aso6';

Entrarás a formar parte de nuestra bolsa de empleo a la que acuden las empresas en busca de nuestros alumnos.

BASES DE DATOS I CONSULTA DE DATOS

3ra. Parte. Bases de Datos Relacionales

CONSULTAS SIMPLES SQL SERVER Manual de Referencia para usuarios. Salomón Ccance CCANCE WEBSITE

Práctica 3: El lenguaje SQL (1ª parte). Programa de prácticas: (5ª sesión). Lenguaje SQL: manipulación de datos (consulta y actualización):

Análisis de Consultas

PROGRAMAS DE ESTUDIO FORMATO 7 INTRODUCCIÓN A SQL. Área de Formación Profesional

Consultas en JPA-QL. Sistemas de Persistencia de Objetos

1. Dadas las tablas ALUM y NUEVOS, insertar en la tabla ALUM los nuevos alumnos.

Tema 4. Manipulación de datos con SQL

Transcripción:

Consultas SQL INNER JOIN Inner join sólo produce los registros que coinciden en las dos tablas A y B. 2. INNER JOIN TablaB Full outer join produce el conjunto de todos los registros en las tablas A y B, con registros coincidentes en ambos lados cuando sea posible. Si no hay coincidencia, el lado que falta contendrá null. 2. FULL OUTER JOIN TablaB Left outer join produce el conjunto completo de registros de la tabla A, con los registros coincidentes (si están disponibles) en la tabla B. Si no hay coincidencia, el lado derecho contendrá null. 2. LEFT OUTER JOIN TablaB Para producir el conjunto de registros en la tabla A, pero no en la tabla B, usamos el mismo Left Outer Join, y luego excluimos los registros que no queremos del lado derecho mediante una cláusula Where. 2. LEFT OUTER JOIN TablaB

4. WHERE TablaB.id IS NULL Para producir el conjunto de registros únicos de la tabla A y la tabla B, usamos el mismo Full Outer Join, y luego excluimos los registros que no queremos de los dos lados mediante una cláusula Where. 2. FULL OUTER JOIN TablaB 4. WHERE TablaA.id IS NULL 5. OR TablaB.id IS NULL También hay un cross join, el cuál no puede ser expresado con un diagrama de Venn: 2. CROSS JOIN TablaB Esto une todo con todo, dando como resultado 4 x 4 = 16 filas, muchas más de las que teníamos en los conjuntos originales. Si haces unos simples cálculos, puedes ver por qué es un Join muy peligroso de ejecutar en tablas grandes. UNION El comando unión trabaja sobre los resultados de las consultas, nos sirve para unir las columnas resultantes. 1. SELECT * FROM tablaa 2. WHERE tablaa.nombre = Juan 3. UNION 4. SELECT * FROM tablab 5. WHERE tablab.nombre = Juan

GROUP BY La cláusula GROUP BY en SQL permite realizar agrupaciones de registros de una tabla. Examinemos la siguiente tabla que contiene datos de los empleados de una empresa. Si en esta tabla deseáramos calcular el salario medio de los empleados agrupados por oficio, deberíamos escribir una sentencia SQL que agrupara las filas con un mismo nombre de oficio. De cada uno de los grupos que se formen se aplicaría la función AVG sobre el campo salario. De la misma forma, si quisiéramos contar el número de empleados de cada departamento deberíamos realizar un agrupamiento de los empleados por el campo departamento. De cada uno de los grupos formados se aplicaría la función COUNT. La sintaxis básica de la cláusula GROUP BY en una sentencia SELECT es la siguiente: 1. SELECT campos 2. FROM tablas 3. WHERE condiciones 4. GROUP BY campo1, campo2, campo3... 5. ORDER BY campo1, campo2, campo3... La cláusula GROUP BY siempre va detrás de la cláusula WHERE (si es que la hay), y delante siempre de ORDER BY (si es que realizamos la ordenación de acuerdo un campo determinado). 1. SELECT oficio, AVG(salario) 3. GROUP BY oficio;

Se quiere calcular a continuación el número de empleados de cada departamento. En esta ocasión debemos realizar un agrupamiento de registros por el campo dept_no. De cada grupo que se forme debemos contar el número de registros que forman cada grupo. La sentencia SQL quedaría: 1. SELECT dept_no, COUNT(*) 3. GROUP BY dept_no 4. ORDER BY dept_no; Hemos empleado la cláusula ORDER BY para mostrar el resultado ordenado por número de departamento. La cláusula GROUP BY DEPT_NO obliga a COUNT a contar las filas que se han agrupado por cada departamento. Veamos otro ejemplo más. Queremos obtener por cada agrupamiento de departamento y oficio el salario medio. Es decir, por cada departamento queremos calcular el salario medio agrupado por oficio. En este caso debemos agrupar los registros por número de departamento, y dentro de cada departamento por oficio. 1. SELECT dept_no, oficio, AVG(salario) GROUP BY dept_no,oficio;

En una sentencia SELECT pueden aparecer juntos tanto la cláusula WHERE como la cláusula GROUP BY. Si quisiéramos calcular, por ejemplo, el salario medio de cada departamento sin tener en cuenta aquellos empleados que cobren menos de 1000 euros, la sentencia correcta en SQL sería: 1. SELECT dept_no, AVG(salario) 3. WHERE salario>=1000 4. GROUP BY dept_no; En este caso no se tiene en cuenta el empleado 1005 para realizar la media de salarios. HAVING La cláusula HAVING permite especificar condiciones a los agrupamientos realizados con GROUP BY. Del mismo modo que existe la cláusula WHERE para filas individuales en la sentencia SELECT, también se puede especificar una condición para grupos de registros. Al utilizar la cláusula HAVING no se incluyen aquellos grupos que no cumplan una determinada condición. La cláusula HAVING siempre va detrás de la cláusula GROUP BY y no puede existir sin ésta. Si queremos visualizar, por ejemplo, el salario medio de cada departamento pero sólo de aquellos cuyo salario medio sea mayor de 1200, la sentencia en SQL sería: 1. SELECT dept_no, AVG(salario) 3. GROUP BY dept_no 4. HAVING AVG(salario)>1200; Si, por ejemplo, queremos obtener el número de empleados de cada departamento pero sólo de aquellos que tengan más de 2 empleados, la manera correcta sería: 1. SELECT dept_no,count(*) 3. GROUP BY dept_no 4. HAVING COUNT(*)>2;

Si queremos ordenar la salida ordenada descendentemente por número de empleados emplearíamos la cláusula ORDER BY. 1. SELECT dept_no,count(*) 3. GROUP BY dept_no 4. HAVING COUNT(*)>2 5. ORDER BY COUNT(*) DESC; La cláusula WHERE y la cláusula HAVING pueden aparecer juntas en la misma sentencia SQL. La cláusula HAVING es similar a la cláusula WHERE, pero trabaja con grupos de filas en vez que con filas individuales de una tabla. Si quisiéramos calcular, por ejemplo, el salario medio de cada departamento sin tener en cuenta aquellos empleados que cobren menos de 1000 euros, y además no queremos que en resultado se visualicen aquellos departamentos cuyo salario sea menor que 1200, la sentencia correcta en SQL sería: 1. SELECT dept_no, AVG(salario) 3. WHERE salario>1000 4. GROUP BY dept_no 5. HAVING AVG(salario)>1200; SENTENCIAS ANIDADAS La gerencia te pide que expongas en un reporte un resumen de las compras y ventas de los artículos en el último mes, donde compares lado a lado, cuantos se vendieron, cuantos se compraron por artículo, quedando quizás algo por el estilo:

ID Articulo Descripcion Compras Ventas 001 Camisa XXX XXX 002 Pantalon XXX XXX 003 Blusa XXX XXX Parece algo sencillo y no muy difícil de realizar, pero es típico que en el diseño de tu base de datos hayas dejado por separado una entidad para compras y una entidad para ventas, por lo que tendríamos los siguientes entidades: Lo primero que se nos podría ocurrir es una consulta donde proyectáramos "todos" vs "todos" para obtener conjunto de datos deseados: 1. SELECT Ventas.IDArticulo, 2. SUM(compras.Cantidad) AS SumaCompras, 3. SUM(ventas.cantidad) AS SumaVentas 4. FROM Compras 5. FULL JOIN Ventas 6. ON Ventas.IdArticulo = Compras.IdArticulo 7. GROUP BY Ventas.idarticulo INTO CURSOR cresumen A primera vista parece buena la idea, sumamos todas las cantidades de compras, todas las cantidades de ventas de una mezcla de todos los registros, no? Pero sabrás que pasa?: No funciona, ya que obtendremos datos que nada tienen que ver, primeramente porque se están cualificando las tuplas de la tabla ventas contra las tuplas de la tabla compras, pero nótese que hay algunos IDs que están en una, pero que no están en la otra, dándonos el siguiente resultado:

Podrás comentar, "Ya casi", solo me faltó el código 002 que es de la tabla compras que no estaba en la tabla ventas, en efecto es así, puedes seguir intentando cambiar las cláusulas por LEFT JOIN, RIGTH JOIN, cambiar Ventas.Articulo = Compras.IdArticulo por Compras.IdArticulo = Ventas.Articulo en lo correspondiente a la cláusula ON (de los operadores de proyección), pero obtendrás diferentes resultados que seguirán sin ser los que esperabas. Inclusive, puedes llegar a pensar que tal vez el operador de igualdad sale sobrando, e intentas una más para ver si funciona: 1. SELECT ventas.idarticulo, 2. SUM(ventas.cantidad) AS TotalVentas, 3. SUM(compras.cantidad) AS TotalCompras 4. FROM ventas,compras 5. GROUP BY ventas.idarticulo 6. INTO CURSOR creporte Y tenemos el siguiente resultado: Que sucedió?, lamentablemente al hacerlo de esta forma se está utilizando implícitamente un operador de igualdad entre las entidades (INNER JOIN), y eso sin tomar en cuenta que la suma no son lo que debería tener, por lo que tampoco obtenemos lo que queremos. Entonces? Qué es lo que debemos hacer?, la solución es sencilla, el uso de subconsultas.

Resulta ser que el álgebra de conjunto (que es la teoría que sustenta a la práctica de el lenguaje SQL) tiene un pequeño "truco" para normalizar este pequeño desperfecto en lo que parece no tener solución. Esto se le llaman subconsultas (mas adelante veremos que otros nombres se les conoce). En el párrafo anterior se hace mención a un tema que es base de esto, la normalización, en vez de intentar proyectar las columnas que serán calculadas (en nuestro ejemplo se sumaron, pero bien pudieron haber sido contadas) para llegar al resultado inmediato, debemos crear un conjunto de datos intermedio, el cual, nos servirá para ahora si proyectarlo correctamente: 1. SELECT idarticulo, 0000 as ncompras, Cantidad as nventas 2. FROM Ventas 3. UNION 4. SELECT idarticulo, Cantidad as ncompras, 0000 as nventas 5. FROM Compras 6. INTO CURSOR cresumen Con el query anterior obtendremos un conjunto de datos normalizados como el que sigue: Aquí se hará uso de lo que se le denomina sentencias anidadas, en donde tenemos varias partes clave. 1. SELECT idarticulo, 2. SUM(nCompras) as TotalCompras, 3. SUM(nVentas) as TotalVentas 4. FROM cresumen 5. GROUP BY idarticulo 6. INTO CURSOR creporte Quedando como sigue: