select nombre from profesores where categoria='aso6';



Documentos relacionados
ESQUEMA DE BASE DE DATOS ATROPELLOS

1. DML. Las subconsultas

LAS SUBCONSULTAS SQL SERVER Manual de Referencia para usuarios. Salomón Ccance CCANCE WEBSITE

CONSULTAS CON SQL. 3. Hacer clic sobre el botón Nuevo de la ventana de la base de datos. Aparecerá el siguiente cuadro de diálogo.

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

Codd propuso estos tres lenguajes como base teórica de cualquier lenguaje que quisiera cumplir con los requisitos formales del modelo.

El lenguaje SQL es un lenguaje estándar para el acceso y

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

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

SQL (Structured Query Language)

T12 Vistas y tablas temporales

Ecuaciones de primer grado con dos incógnitas

UNIDAD DE TRABAJO 2: BASES DE DATOS RELACIONALES

Cómo convertir texto de Word en una tabla de datos en Excel (todas las versiones)

COMANDOS DE SQL, OPERADORES, CLAUSULAS Y CONSULTAS SIMPLES DE SELECCIÓN

5- Uso de sentencias avanzadas

Base de datos en Excel

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

Consultas con combinaciones

Base de datos relacional

Matrices equivalentes. El método de Gauss

S.Q.L. (Lenguaje de Consulta Estructurada) Consultas Avanzadas. Sistemas de Bases de Datos II - ITS EMT CETP

SOLUCIÓN CASO GESTIÓN DE PERSONAL I

Un comité de la organización ANSI (American National Standards Institute) aborda la problemática del almacenamiento de datos para su procesamiento en


Lección 24: Lenguaje algebraico y sustituciones

Unidad I. 1.1 Sistemas numéricos (Binario, Octal, Decimal, Hexadecimal)

Introducción al álgebra relacional. Con ejemplos en SQL

Boletín de Problemas de la Asignatura II18 Bases de Datos. Ingeniería Informática Universitat Jaume I

Bases de datos relacionales y el modelo entidad-relación

4. Modelo Relacional: Manipulación de los datos.

EJERCICIOS RESUELTOS

SITEMA BINARIO, OCTAL Y HEXADECIMAL: OPERACIONES

OPERACIONES FUNDAMENTALES DEL ÁLGEBRA RELACIONAL. Bases de Datos Ingeniería de Sistemas y Computación Universidad Nacional de Colombia 2007

UNIDAD 6. POLINOMIOS CON COEFICIENTES ENTEROS

FICHEROS Y BASES DE DATOS (E44) 3º INGENIERÍA EN INFORMÁTICA. Tema 8. Elementos Básicos

Sistemas de numeración

Este es un ejemplo muy sencillo, un esquema de empleados que trabajan en proyectos, en una relación muchos a muchos.

CONSULTAS BASICAS EN SQL SERVER

BASES Y DIMENSIÓN. Propiedades de las bases. Ejemplos de bases.

Sub consultas avanzadas

En cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.

CASO PRÁCTICO DISTRIBUCIÓN DE COSTES

Consultas que conllevan el uso de igualdades para la concatenación de filas de varias tablas. El ejemplo anterior es una equijoin.

Toda base de datos relacional se basa en dos objetos

6- Combinación de tablas

OPTIMIZACIÓN DE CONSULTAS EN SQL. Análisis de Consultas y Transacciones Ajuste de Indices Ajuste de Consultas

Tema: SUBCONSULTAS Y CREACION DE VISTAS.

A25. Informática aplicada a la gestión Curso 2005/2006 Excel Tema 7. Funciones avanzadas de Excel II

Tema 4. Manipulación de datos con SQL

Antes de entrar a definir la forma normal de Boyce-Codd, necesitamos conocer qué se entiende por determinante.

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

Ku Information System Tutorial. Una consulta sencilla. Crear la consulta. Seleccionar el área de información. Decidir qué queremos ver

Anterior Sistemas binarios: Aritmética binaria Siguiente ARITMÉTICA BINARIA. Operaciones elementales con números binarios

Aproximación local. Plano tangente. Derivadas parciales.

Y tú, cómo mides tus campañas? Las claves para aumentar tus conversiones.

Tecnología de la Información y la Comunicación. Base de datos. Consultas

Fracción másica y fracción molar. Definiciones y conversión

Cómo crear experiencias de cliente con Social Media. Whitepaper

El control de la tesorería consiste en gestionar desde la aplicación los cobros y pagos generados a partir de las facturas de venta y de compra.

Cálculo Simbólico también es posible con GeoGebra

Qué son los monomios?

IV. DEFINICIÓN DE OBJETIVOS

Unidad. Lenguaje SQL. (Structured Query Language)

1.- INTRODUCCIÓN 2.- PARÁMETROS

A.1. Definiciones de datos en SQL

Una plantilla para automatizar la gestión de su presupuesto a casa con LibreOffice

Centro de Capacitación en Informática

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

Modelos y Bases de Datos

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

Análisis de los datos

UNION, INTERSECCION Y DIFERENCIA. SELECT TABLE Expresión con operador de reunión (SELECT * FROM PROFESOR) UNION (SELECT * FROM ESTUDIANTE)

QUÉ ES UNA BASE DE DATOS Y CUÁLES SON LOS PRINCIPALES TIPOS? EJEMPLOS: MYSQL, SQLSERVER, ORACLE, POSTGRESQL, INFORMIX (DV00204A)

PHP Perfect SQL v1.0 (SQL perfectas en PHP)

Unidad Didáctica. Códigos Binarios

x

Manual para la utilización de PrestaShop

El sistema decimal, es aquél en el que se combinan 10 cifras (o dígitos) del 0 al 9 para indicar una cantidad específica.

Manual de usuario para la parametrización de la integración Openbravo-Sugar

SISTEMAS DE NUMERACIÓN. Sistema de numeración decimal: = =8245,97

Áreas de datos. Análisis de datos

Esta extensión está obsoleta a partir de PHP 5.5.0, y será eliminada en el futuro

Manual de rol gestor de GAV para moodle 2.5

LABORATORIO Nº 2 GUÍA PARA REALIZAR FORMULAS EN EXCEL

Curso Excel Básico - Intermedio

Funciones Condicionales

Práctica 4 Diseño de circuitos con puertas lógicas.

T03 Expresiones de selección de filas

Criterios de Selección de Inversiones: El Valor Actual Neto y sus derivados *.

BREVE INTRODUCCIÓN AL SQL Aplicación al Programa Escuela Última actualización: 17/10/2000

Procedimientos para agrupar y resumir datos

BASES DE DATOS - Microsoft ACCESS 2007-

LAS CONSULTAS ACCESS Manual de Referencia para usuarios. Salomón Ccance CCANCE WEBSITE

Bases de datos en Excel

MANUAL DE AYUDA HERRAMIENTA DE APROVISIONAMIENTO

ESTÁNDAR DESEMPEÑO BÁSICO Recopila información, la organiza y la procesa de forma adecuada, utilizando herramientas tecnológicas.

Sintaxis: CURSOR nombre_cursor[(param1 [IN] tipo1,... )] IS consulta ;

28 = =

Transcripción:

1 de 10 17/05/2013 14:00 Lecciones SQL > T11 Conjuntos Operaciones de conjuntos y MySQL Un operador sobre conjuntos combina el resultado de dos sentencias select en un único resultado. Dependiendo del tipo de operación esas sentencias deberán cumplir unos requisitos en cuanto al resultado que dan. Los operadores de conjuntos definidos para el álgebra relacional, base sobre la que se cimenta SQL, son la unión, intersección, diferencia, producto cartesiano y división. En otros motores de base de datos se dispone de algunos operadores como UNION, INTERSECT y MINUS. Contenidos 1 Operaciones de conjuntos y MySQL 2 Unión 3 Intersección 4 Diferencia 5 Producto cartesiano 6 Concatenación natural 7 División 7.1 La división del álgebra relacional con EXISTS 7.2 Otros usos 7.3 Alternativas 7.4 Eficiencia En MySQL solo está disponible el operador UNION, aunque la operativa de los otros puede simularse con otros operadores de los que ya hemos visto unos cuantos. Unión Al utilizar el operador UNION entre dos sentencias select, el resultado final estará compuesto por todas aquellas filas que aparecen en el resultado de como mínimo una de las select. El operador UNION elimina filas duplicadas en el resultado final. El operador UNION ALL opera de igual modo que el operador UNION, pero no elimina filas duplicadas en el resultado final. Supongamos que queremos saber el de los profesores que son ASO6 o imparten asignaturas de 6 créditos. Veamos primero el resultado de cada consulta por separado. 1) Nombre de los profesores cuya categoría es ASO6. select from profesores where categoria='aso6'; 2) Nombre de los profesores que imparten asignaturas de 6 créditos. select where p.dni=i.dni and asignatura=codigo and creditos=6; Nombre de los profesores que son ASO6 o imparten asignaturas de 6 créditos.

select from profesores where categoria='aso6' UNION select where p.dni=i.dni and asignatura=codigo and creditos=6; La misma consulta pero solucionada con UNION ALL select from profesores where categoria='aso6' UNION ALL select where p.dni=i.dni and asignatura=codigo and creditos=6; Intersección Aunque no existe tal operador en MySQL, normalmente se puede sustituir por consultas ya conocidas. DNI de los profesores que imparten y preparan. IMPARTE[dni] (COORDINADORES[dni]) Lo que debería solucionarse como select dni from imparte INTERSECT select dni from prepara; en realidad, en MySQL, debemos expresarlo como: select distinct i.dni 2 de 10 17/05/2013 14:00

from imparte i, prepara pp where pp.dni=i.dni; dni 21111222 21333444 Se usa el modificador distinct para que la expresión sustituya realmente la operativa de la intersección: las operaciones de conjuntos no devuelven duplicados (al igual que union all es una extensión para que se puedan resolver cierto tipo de consultas que sí necesitan los duplicados). No obstante, lo usaremos o no dependiendo de si lo necesitamos o no. Diferencia El operador MINUS tampoco está implementado en MySQL pero es fácilmente sustituible por expresiones NOT IN. En todo caso, el resultado final estará compuesto sólo por aquellas filas que aparecen en el resultado de la primera select y no aparecen en el resultado de la segunda. Nombre de los profesores que son TEU y no imparten asignaturas de 6 créditos. PROFESORES donde categoría='teu' [] - (PROFESORES x IMPARTE x ASIGNATURA donde (PROFESORES.dni = IMPARTE.dni y codigo=asignatura y créditos=6) []) Lo que debería solucionarse como select from profesores where categoria='teu' MINUS select where p.dni=i.dni and asignatura=codigo and creditos=6; se soluciona así: select from profesores where categoria='teu' and NOT IN (select where p.dni=i.dni and asignatura=codigo and creditos=6); 3 de 10 17/05/2013 14:00

MANUEL PALOMAR Esta sería la consulta exactamente equivalente a la diferencia de conjuntos tal y como está definida en el álgebra relacional, con relaciones compatibles, pero esto es SQL, podemos simplificar la consulta y obtendremos el mismo resultado: select from profesores where categoria='teu' and dni NOT IN (select dni from imparte i, asignaturas where asignatura=codigo and creditos=6); Producto cartesiano En SQL, y como ya se ha dicho anteriormente, el producto cartesiano se realiza con una select "sin where". select dni, codigo from profesores, asignaturas dni codigo 21111222 DGBD 21222333 DGBD 21333444 DGBD 21111222 FBD 21222333 FBD 21333444 FBD 21111222 FP 21222333 FP 21333444 FP 21111222 HI 21222333 HI 21333444 HI 21111222 PC 21222333 PC 21333444 PC No obstante, el producto cartesiano, como cualquier otro tipo de consulta, puede filtrar las filas resultado a nuestra conveniencia. Dni de los profesores que imparten 2 o más asignaturas select distinct i1.dni from imparte i1, imparte i2 where i1.dni = i2.dni 4 de 10 17/05/2013 14:00

5 de 10 17/05/2013 14:00 and i1.asignatura!= i2.asignatura; Del producto cartesiano de una tabla por sí misma solo nos interesan las filas en las que el profesor "de la izquierda" es el mismo que el "de la derecha"; sí, además, las asignaturas son diferentes, la conclusión no puede ser otra que ese profesor cumple con la condición. Aunque para el ejemplo que hemos propuesto hay una forma más amigable de solucionar este enunciado, la que mostramos a continuación, el producto cartesiano es una opción que podemos utilizar cuando creamos conveniente select dni from imparte group by dni having count(*) >= 2; Nombre de los profesores que imparten asignaturas de 6 créditos y no son TEU. PROFESORES x IMPARTE x ASIGNATURA donde (PROFESORES.dni = IMPARTE.dni y codigo=asignatura y créditos=6) [] - (PROFESORES donde categoría='teu' []) select where p.dni=i.dni and asignatura=codigo and creditos=6 and NOT IN (select from profesores where categoria='teu'); Concatenación natural Este operador está implementado en MySQL y Oracle Database pero no es seguro que otros SGBD lo tengan implementado igualmente. Igual que en álgebra relacional, este operador asume que hay columnas comunes en dos tablas diferentes (en principio, que se llamen igual) y automatiza la reunión (join) en base a la igualdad de valores en estas columnas comunes. Dicho de otra forma: Todos los datos de profesores que imparten alguna asignatura y códigos de esas asignaturas. select p.dni, p., p.categoria, p.ingreso, i.asignatura from profesores p, imparte i where p.dni=i.dni; obtiene el mismo resultado que

6 de 10 17/05/2013 14:00 select * from profesores NATURAL JOIN imparte; En ambos casos la salida es la que se muestra a continuación. Nótese que solo se muestra una columna de "dni" (concretamente la de PROFESORES, la tabla a la izquierda del operador). dni categoria ingreso asignatura 21111222 TEU 1993-10-01 DGBD 21111222 TEU 1993-10-01 FBD 21333444 ASO6 1992-06-16 PC Su expresión en álgebra relacional sería: PROFESORES IMPARTE A pesar de la posible comodidad de uso de este operador hay que tener mucho cuidado, si no existen columnas comunes se devolverá un producto cartesiano. Otra fuente de resultados no esperados es que haya más columnas con idéntico de las deseadas. División La división como operador definido en el álgebra relacional nos da como resultado "algo que se relaciona con todos los que cumplen una condición". Por ejemplo, IMPARTE[asignatura, dni] (PROFESORES[dni]) Esta expresión daría como resultado los códigos de las asignaturas que son impartidas por todos los profesores de mi base de datos. No existe, la división, como tal operador en SQL por lo que debemos simularlo con exists. Exists es un operador de un único argumento y cuyo resultado es un valor de verdad, informa de la presencia o no de tuplas en una tabla. [NOT] EXISTS (orden select) El operador exists nos informa de si una subconsulta ha obtenido algún resultado: devuelve verdadero si hay al menos una tupla en la relación derivada y falso si la relación derivada es vacía. La división del álgebra relacional con EXISTS Uno de los posibles usos, aunque ciertamente confuso al principio, es el de resolver consultas del tipo "x hace algo con todos los y de nuestra base de datos". Supongamos una tabla adicional en nuestra BD Ejemplo, PREPARA, que es una relación muchos a muchos entre

asignaturas y profesores, y que podría representar qué profesores intervienen en la preparación de cada asignatura. Su contenido es el que se muestra a continuación: Profesores que preparan todas las asignaturas. select from profesores p where not exists (select codigo from asignaturas a where not exists (select asignatura from prepara pp where pp.asignatura=a.codigo and p.dni=pp.dni) ) Vamos a reformular la consulta siguiendo las apariciones del operador exists dentro de las sucesivas órdenes select: "Nombre de los profesores tales que no hay ninguna asignatura que no prepare él". Supongamos que la forma que tiene el SGBD de resolver esta sentencia es la siguiente : 1. 2. 3. En la primera select recorremos la tabla de profesores. Para cada profesor de la anterior, la segunda select recorre la tabla de asignaturas. Para cada profesor y asignatura de las anteriores comprueba que el primero prepara la segunda. Otros usos El operador exists no se limita a consultas del tipo división en álgebra relacional. Por ejemplo, si partimos del ejemplo anterior pero eliminamos los modificadores NOT select from profesores p where exists (select codigo from asignaturas a where exists (select asignatura from prepara pp where pp.asignatura=a.codigo and p.dni=pp.dni) ) sería equivalente a " de los profesores que preparan alguna asignatura", que se soluciona mucho más fácil como 7 de 10 17/05/2013 14:00

select from profesores p, prepara pp where p.dni=pp.dni O si negamos solo uno de los exists Nombre de los profesores que no preparan todas las asignaturas (que existe al menos una asignatura que no prepara) select from profesores p where exists (select codigo from asignaturas a where not exists (select asignatura from prepara pp where pp.asignatura=a.codigo and p.dni=pp.dni) ) MANUEL PALOMAR Alternativas A veces, el resultado buscado permite otro tipo de soluciones. Nombre de los profesores que preparan todas las asignaturas. select from profesores p, prepara pp where p.dni = pp.dni group by p.dni, having count(*) = (select count(*) from asignaturas); Nombre de los profesores que no preparan ninguna asignatura. select from profesores p where not exists (select codigo from asignaturas a 8 de 10 17/05/2013 14:00

where exists (select asignatura from prepara pp where pp.asignatura=a.codigo and p.dni=pp.dni) ); select from profesores p where not exists (select asignatura from prepara pp where p.dni=pp.dni); Realmente, la alternativa más clara y fácil de entender es esta: select from profesores where dni NOT IN (select dni from prepara); MANUEL PALOMAR Eficiencia Aunque para la cantidad de filas que estamos manejando tanto en la BD Ejemplo como en TiendaOnLine la diferencia es irrelevante, el uso de exists puede ser adecuado para mejorar el rendimiento de ciertas consultas. Sea, por ejemplo: select distinct from profesores p, imparte i where p.dni = i.dni; En realidad, sólo nos interesa saber el de los profesores que imparten alguna asignatura, sin reparar en cuáles son esas asignaturas. Para eso, es mejor utilizar: select from profesores p where exists (select * from imparte where dni = p.dni); La ventaja de esta segunda consulta es que la subselect sólo necesita devolver una fila por cada profesor, mientras que la primera primero obtiene la concatenación de todos los códigos de asignatura con su profesor correspondiente y después proyecta sobre la columna. Podemos suponer un estado de la base de datos que contuviera 1000 asignaturas, y que los 3 profesores imparten todas las asignaturas: la primera consulta trabajaría con 3000 filas, mientras que la segunda no necesitaría más 9 de 10 17/05/2013 14:00

10 de 10 17/05/2013 14:00 de 3. No obstante, lo dicho aquí debe considerarse como un apunte sobre la necesidad en ciertos entornos de mejorar el rendimiento de aquellas consultas que son críticas por su frecuencia o por un gran volumen de datos, esto es, "ayudar" al optimizador de consultas.