¿Qué es un SGBD? · 2017. 5. 8. · Base de Datos sino un gestor de las mismas. Y es que a menudo...

97
¿Qué es un SGBD? Un SGBD (o por sus siglas: Sistema Gestor de Bases de Datos) es varias cosas a la vez: Consiste en una colección de datos interrelacionados y un conjunto de programas para acceder a dichos datos. Un SGBD es un software de propósito general que facilita el proceso de Definir, Construir y Manipular Bases de Datos. Se entiende por “Definir”: Especificar tipos, estructuras y restricciones. Se entiende por “Construir”: Guardar los datos en algún medio de almacenamiento. Se entiende por “Manipulación”: Uso de funciones para consultar y actualizar la BD. Coloquialmente se habla de un SGBD como de un “motor” o incluso “Base de Datos”, éste último término aplicado de manera incorrecta puesto que como se mencionó antes un SGBD no es una Base de Datos sino un gestor de las mismas. Y es que a menudo hay tres conceptos que se suelen confundir: Base de datos, Sistema de Base de Datos (o Sistema de Información) y Sistema Gestor de Bases de Datos, pero mientras la Base de Datos almacena la información y el SGBD la administra, el Sistema de Base de Datos es una aplicación hecha en cualquier entorno de desarrollo (Java, Delphi, C#) que se conecta al SGBD para consultar la información. La siguiente gráfica lo ejemplifica:

Transcript of ¿Qué es un SGBD? · 2017. 5. 8. · Base de Datos sino un gestor de las mismas. Y es que a menudo...

  • ¿Qué es un SGBD?

    Un SGBD (o por sus siglas: Sistema Gestor de Bases de Datos) es varias cosas a la vez:

    Consiste en una colección de datos interrelacionados y un conjunto de programas para acceder a dichos datos.

    Un SGBD es un software de propósito general que facilita el proceso de Definir, Construir y Manipular Bases de Datos.

    Se entiende por “Definir”: Especificar tipos, estructuras y restricciones.

    Se entiende por “Construir”: Guardar los datos en algún medio de almacenamiento.

    Se entiende por “Manipulación”: Uso de funciones para consultar y actualizar la BD.

    Coloquialmente se habla de un SGBD como de un “motor” o incluso “Base de Datos”, éste último término aplicado de manera incorrecta puesto que como se mencionó antes un SGBD no es una Base de Datos sino un gestor de las mismas. Y es que a menudo hay tres conceptos que se suelen confundir: Base de datos, Sistema de Base de Datos (o Sistema de Información) y Sistema Gestor de Bases de Datos, pero mientras la Base de Datos almacena la información y el SGBD la administra, el Sistema de Base de Datos es una aplicación hecha en cualquier entorno de desarrollo (Java, Delphi, C#) que se conecta al SGBD para consultar la información. La siguiente gráfica lo ejemplifica:

  • 2

    Los SGBD’s más importantes en el mercado

    Aún cuando en teoría existen otrosetc.), prácticamente todos los motores de uso común tienen como función gestionar Bases de Datos Relacionales, siendo los principales

    Oracle ® Oracle ® Corp.PostgreSQL PostgreSQL Glob.MS SQL Server ® Microsoft ®MySQL ® Sun MicrosystemsInformix ® IBM ® Corp.DB2 ® IBM ® Corp.InterBase ® Borland ® Corp.

    Aunque tradicionalmente Oracle se ha ganado el prestigio de ser mejor motor de Bases de Datos, otros han ido ganando bastante terreno, como MS SQL SePostgreSQL en el libre. MySQL ya es en la actualidad un motor comercial recién adquirido por Sun Microsystems, pero mantiene un esquema de licenciamiento dual, es decir, se puede utilizar el motor libremente pero no se tiene deExisten muchas controversias sobre que motor de base de datos es mejor pero es inútil entrar en discusión y solo queda recomendar aquel que más se apegue a las necesidades de una determinada organización. Todos los motores mencionados (y algunos que se nos

    más importantes en el mercado.

    Aún cuando en teoría existen otros modelos de datos (jerárquicos, orientados a objetos, rácticamente todos los motores de uso común tienen como función gestionar Bases de Datos

    Relacionales, siendo los principales:

    http://www.oracle.comPostgreSQL Glob. Dev. Group http://www.postgres.org

    http://www.microsoft.com/sql/default.mspxSun Microsystems http://www.sun.com/software/products/mysql/index.jsp

    http://www-306.ibm.com/software/data/informix/http://www-306.ibm.com/software/data/db2/http://www.codegear.com/products/interbase

    Aunque tradicionalmente Oracle se ha ganado el prestigio de ser mejor motor de Bases de Datos, otros han ido ganando bastante terreno, como MS SQL Server en el campo comercial y PostgreSQL en el libre. MySQL ya es en la actualidad un motor comercial recién adquirido por Sun Microsystems, pero mantiene un esquema de licenciamiento dual, es decir, se puede utilizar el motor libremente pero no se tiene derecho a soporte sin el pago de una cuotaExisten muchas controversias sobre que motor de base de datos es mejor pero es inútil entrar en discusión y solo queda recomendar aquel que más se apegue a las necesidades de una determinada organización. Todos los motores mencionados (y algunos que se nos

    rquicos, orientados a objetos, rácticamente todos los motores de uso común tienen como función gestionar Bases de Datos

    http://www.microsoft.com/sql/default.mspxhttp://www.sun.com/software/products/mysql/index.jsp

    306.ibm.com/software/data/informix/306.ibm.com/software/data/db2/

    http://www.codegear.com/products/interbase

    Aunque tradicionalmente Oracle se ha ganado el prestigio de ser mejor motor de Bases de rver en el campo comercial y

    PostgreSQL en el libre. MySQL ya es en la actualidad un motor comercial recién adquirido por Sun Microsystems, pero mantiene un esquema de licenciamiento dual, es decir, se puede utilizar el

    sin el pago de una cuota.Existen muchas controversias sobre que motor de base de datos es mejor pero es inútil entrar en discusión y solo queda recomendar aquel que más se apegue a las necesidades de una determinada organización. Todos los motores mencionados (y algunos que se nos escapan de la mente)

  • 3

    satisfacen la mayor parte de los requerimientos, siendo sutiles las diferencias entre ellos. Podemos resumir algunas características:

    Oracle es considerado un SGBD muy robusto e ideal para un gran corporativo, sin embargo, suele comportarse de manera algo torpe en modelos de pequeños a medianos, además de ser muy costoso. La versión Express es una versión ligera que puede utilizarse sin fines de lucro.

    PostgreSQL, por otro lado, ha demostrado últimamente tener un muy buen desempeño con un muy buen punto a su favor: es gratuito. Es también el que más se apega al estándar ANSI SQL.

    A partir de la versión 5.0, MySQL ya incorpora las características de un SGBD moderno y aunque no es completamente gratuito, el costo del licenciamiento es mucho muy inferior al de Oracle. De cualquier manera esto no es una limitante para un experto que pueda prescindir del soporte proporcionado por la licencia comercial.

    SQL Server 2005 se ha vuelto mucho más accesible y hasta existe una versión gratuita (la Express) si es que nuestras necesidades no fueran muy complejas; hay que remarcar la facilidad con que las aplicaciones .NET pueden conectarse a él.

    ¿Cúal utilizar en un ambiente académico?

    Las opiniones sobre este asunto suelen estar matizadas por muchos prejuicios. Algunos recomendarían Oracle por ser usado en grandes empresas, aunque en nuestro medio éstas suelen ser contadas. SQL Server ha incrementado su participación en el mercado debido a completa integración con las plataformas de Microsoft y es también una buena opción, la versión 2005 se apega más al ANSI SQL. PostgreSQL y MySQL son ideales si la institución educativa no cuenta con algún convenio con Oracle y Microsoft. De cualquier manera, cualquier SGBD ayuda al aprendizaje en la administración de las Bases de Datos y la decisión debería correr a cargo del profesor que imparte la materia de Bases de Datos. Los ejemplos de este tutorial se apegan en la medida de lo posible a PostgreSQL, Oracle y MS SQL Server 2005.

    Introducción

    Vamos a partir del modelo presentado en la figura 1.1, el cual muestra un esquema de Bases de Datos, que a su vez está formado por un conjunto de Esquemas de Relación (tablas) y un conjunto de Restricciones Estructurales (Llaves Primarias y Llaves Foráneas, principalmente). Dicho esquema está tomado del libro “Sistemas de Bases de Datos” de ELMASRI/NAVATHE, Segunda Edición.

  • 4

    Figura 1.1 Esquema de la Base de Datos “Compañía”

    La figura 1.2 (también tomada del libro de ELMASRI/NAVATHE)Entidad-Relación del esquema de la figura 1.1variar un poco en la cantidad de atributos de algunas entidades, pero las relaciones se mantienen básicamente igual.

    Figura 1.1 Esquema de la Base de Datos “Compañía”-

    (también tomada del libro de ELMASRI/NAVATHE) muestra además el de la figura 1.1. El esquema relacional resultante

    variar un poco en la cantidad de atributos de algunas entidades, pero las relaciones se mantienen

    -

    muestra además el diagrama. El esquema relacional resultante (ver Anexo) puede

    variar un poco en la cantidad de atributos de algunas entidades, pero las relaciones se mantienen

  • 5

    Figura 1.2 Diagrama Entidad

    ¿Qué es SQL?

    Un lenguaje de consulta es aquel en el que el usuario puede solicitar información de la base de datos. Suele ser de más alto nivel que los lenguajes de programación estándarprocedimentales y no procedimentales (o declarativos).

    En un lenguaje procedimental el usuario da instrucciones al sistema para que realice una serie de operaciones sobre la base de datos con el fin de obtener el resultado deseado.

    En un lenguaje no procedimental (o declasin dar un procedimiento concreto sobre cómo obtener esa información.

    SQL es un lenguaje de consulta no procedimental. El usuario solo tiene que especificar el resultado deseado, dejando que el SGBD se en

    Su nombre se deriva de Structured Query Language (Lenguaje Estructurado de Consultas).

    Representa la BD como una Colección de Relaciones.

    Figura 1.2 Diagrama Entidad-Relación para el esquema “Compañía”

    Un lenguaje de consulta es aquel en el que el usuario puede solicitar información de la base de datos. Suele ser de más alto nivel que los lenguajes de programación estándar

    no procedimentales (o declarativos).

    En un lenguaje procedimental el usuario da instrucciones al sistema para que realice una serie de operaciones sobre la base de datos con el fin de obtener el resultado deseado.

    En un lenguaje no procedimental (o declarativo) el usuario describe la información deseada sin dar un procedimiento concreto sobre cómo obtener esa información.

    SQL es un lenguaje de consulta no procedimental. El usuario solo tiene que especificar el resultado deseado, dejando que el SGBD se encargue de ejecutar la consulta.

    Su nombre se deriva de Structured Query Language (Lenguaje Estructurado de Consultas).

    Representa la BD como una Colección de Relaciones.

    para el esquema “Compañía”

    Un lenguaje de consulta es aquel en el que el usuario puede solicitar información de la base de datos. Suele ser de más alto nivel que los lenguajes de programación estándares, y se clasifican en

    En un lenguaje procedimental el usuario da instrucciones al sistema para que realice una serie de operaciones sobre la base de datos con el fin de obtener el resultado deseado.

    rativo) el usuario describe la información deseada sin dar un procedimiento concreto sobre cómo obtener esa información.

    SQL es un lenguaje de consulta no procedimental. El usuario solo tiene que especificar el cargue de ejecutar la consulta.

    Su nombre se deriva de Structured Query Language (Lenguaje Estructurado de Consultas).

  • 6

    Una Relación se visualiza como una tabla de valores.

    Cada Fila representa una colección de valores de datos relacionados entre sí.

    Dichos valores son hechos del mundo real. El nombre de la tabla y columnas ayudan a interpretar su significado.

    SQL se divide a su vez en otros sublenguajes:

    DDL (Data Definition Language). Lenguaje de definición de datos. Es un conjunto de operaciones que se aplican a los objetos de bases de datos (crear, modificar o eliminar).

    DCL (Data Control Language). Lenguaje de control de datos. Operaciones que permiten establecer permisos sobre los diferentes objetos de una bases de datos (otorgar, revocar).

    DML (Data Management Language). Lenguaje de Manipulación de Datos. Es un conjunto de operaciones que se aplican a los ejemplares de las bases de datos (insertar, borrar, actualizar o consultar los datos contenidos en una BD).

    Por el momento este tutorial no incluye ejemplos del DCL, pero se incorporarán para el próximo semestre. En cada uno de los ejemplos que se muestren se respetará el estándar ANSI SQL y estarán probados en el motor de Bases de Datos PostgreSQL, también conocido simplemente como Postgres (www.postgres.org).

    Inicialmente se ha hecho énfasis en las sentencias SELECT, de ahí los pocos ejemplos que se mostrarán de otras instrucciones. Sin embargo, posteriormente se añadirán más ejercicios de otras instrucciones.

  • 2 Operaciones del DDL

    Las instrucciones del DDL son:

    CREATE ALTER DROP

    Se utilizan para crear, modificar y eliminar cualquier objeto de Bases de Datos como: Bases de Datos, Esquemas, Tablas, Vistas, etc.

    Consulta 2.1

    Crear la base de datos tutorial.

    CREATE DATABASE tutorial;

    La base de datos pertenecerá al usuario que la creó. Una vez creada se debe conectar mediante el comando \c tutorial.

    Cuando se crea una base de datos, y de manera automática, se crea un esquema público (public) donde se almacenarán por omisión las tablas que definamos. El problema es que este esquema está accesible a todos los usuarios, por lo que los objetos creados dentro de él pueden ser manipulados fácilmente sin necesitar autorización (modificarlos y eliminarlos). Por seguridad, se recomienda crear un esquema para cada sistema de bases de datos. Los demás usuarios no solo no pueden acceder a los esquemas que creamos en nuestra base de datos, sino que tampoco pueden crear otros.

    CONSULTA 2.2

    Crear el esquema compania.

    CREATE SCHEMA compania;

    Esta consulta crea el esquema compania en la base de datos actual. Hay que recordar que en postgres un esquema permite ordenar de manera lógica un conjunto de objetos dentro de una base de datos. De esa manera en una base de datos pudiera haber más de una tabla con el mismo nombre pero en diferentes esquemas, utilizando la notación esquema.tabla para resolver cualquier ambigüedad, por ejemplo: nomina.empleado y almacen.empleado se refieren a dos tablas llamadas “empleado”, una dentro del esquema nomina y otra dentro del esquema almacen. Para otros motores como MySQL un esquema no es más que un sinónimo de Base de Datos. En Oracle no

  • 8

    existen los esquemas y en su lugar, se utilizan los nombres de los usuarios para diferenciar nombres ambiguos, por ejemplo: juan.empleado y miguel.empleado. Por eso es común que los nombres de los usuarios en Oracle sean nombres de sistemas: nomina, ventas, almacen, etc.

    CONSULTA 2.3Crear la tabla trabajador dentro del esquema compania.

    CREATE TABLE compania.trabajador( nombre VARCHAR(30) NOT NULL, nss CHAR(9) NOT NULL, fechan DATE NOT NULL, direccion VARCHAR(30), nd INT, PRIMARY KEY (nss));

    NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "trabajador_pkey" for table "trabajador"CREATE TABLE

    Como mencionamos anteriormente, si no se especifica el esquema la tabla se creará dentro del esquema “public”. VARCHAR, CHAR, DATE e INT son algunos de los tipos de datos que se pueden utilizar en SQL (ver http://www.postgresql.org/docs/8.2/interactive/datatype.html ). El modificador NOT NULL establece como obligatorio al campo en cuestión. Aunque la llave primaria se pudo haber definido en la misma línea donde el campo nss (nss CHAR(9) NOT NULL PRIMARY KEY), ANSI SQL recomienda que se haga al final, justo después de haber definido todas las columnas. El uso de NOT NULL en una columna que es llave primaria es redundant, ya que por definición los campos llaves son obligatorios.

    La nota devuelta al final de la instrucción indica la generación automática de un índice (index). Por omisión se crea un índice por cada llave.

    CONSULTA 2.4Renombrar la tabla compania.trabajador a compania.empleado.

    ALTER TABLE compania.trabajador RENAME TO empleado;

    La instrucción ALTER permite modificar un objeto de la base de datos, en este caso una tabla.

    CONSULTA 2.4Modificar el campo nd de la tabla compania.empleado para que sea obligatorio.

  • 9

    ALTER TABLE compania.empleado ALTER nd SET NOT NULL;

    CONSULTA 2.4Quitar el carácter de obligatorio al campo fechan de la tabla compania.empleado.

    ALTER TABLE compania.empleado ALTER fechan DROP NOT NULL;

    CONSULTA 2.5Modificar el campo direccion de la tabla compania.empleado para que en caso de que se desconozca el domicilio de un registro ingresado tome el de la empresa que es: “Vallarta 1234”.

    ALTER TABLE compania.empleado ALTER direccion SET DEFAULT ‘Vallarta 1234’;

    CONSULTA 2.3

    En la tabla compania.empleado agregar el campo “sexo” como un CHAR que pueda recibir 2 valores: “M” o “F”, siendo el valor por omisión “M”.

    ALTER TABLE compania.empleado ADD sexo CHAR DEFAULT 'M';ALTER TABLE compania.empleado ADD CHECK (sexo IN ('M','F'));

    La primera sentencia agrega el campo sexo de tipo CHAR estableciendo ‘M’ como valor por omisión (en caso de que al insertar un nuevo registro no se proporcione). La segunda agrega una restricción de tipo CHECK que se encarga de verificar que el carácter ingresado al dar de alta un nuevo registro sea ‘M’ o ‘F’.

    CONSULTA 2.4Establecer como obligatorio el campo ‘sexo’.

    ALTER TABLE compania.empleado ALTER sexo SET NOT NULL;

  • 10

    Esta instrucción solo se puede dar una vez que se haya proporcionado el valor del sexo a cada uno de los registros existentes, de lo contrario, al quedar nulos contradirían la definición misma.

    CONSULTA 2.6Eliminar el campo ‘direccion’ de la tabla compania.empleado.

    ALTER TABLE compania.empleado DROP direccion;

  • 11

    CONSULTA 2.7Crear la tabla empleado dentro del esquema compania.

    CREATE TABLE compania.departamento( nombred VARCHAR(15) NOT NULL, numerod INT NOT NULL, nssgte CHAR(9) NOT NULL, fechainicgte DATE, PRIMARY KEY (numerod), UNIQUE (nombred) );

    La restricción UNIQUE nos permite hacer que los valores de un determinado campo o columna no se repitan, sin tener necesidad de definir una llave primaria.

    CONSULTA 2.8Establecer el campo nd de la tabla compania.empleado como llave foránea que haga referencia al campo numerod de la tabla compania.departamento.

    ALTER TABLE compania.empleado ADD FOREIGN KEY (nd) REFERENCES compania.departamento(numerod);

    Esta instrucción será aceptada por el motor siempre y cuando haya sido creada previamente la tabla compania.departamento.

    CONSULTA 2.9Establecer el campo nssgte de la tabla compania.departamento como llave foránea que haga referencia al campo nss de la tabla compania.empleado.

    ALTER TABLE compania.departamento ADD FOREIGN KEY (nssgte) REFERENCES compania.empleado(nss);

    Al igual que en la consulta anterior, esta instrucción solo será aceptada si ya fue creada la tabla a la que se hace referencia.Además, con esta consulta se nos genera un problema adicional: No se puede añadir un registro a compania.departamento si no existe al menos un registro en compania.empleado al cual hacer referencia y al revés: No se puede añadir un registro a compania.empleado si no existe al menos un

  • 12

    registro en compania.departamento al cual hacer referencia. Por lo tanto, en este punto el motor no permitirá insertar ningún registro en ambas tablas. Esta instrucción debe posponerse.

    CONSULTA 2.10Eliminar la tabla compania.dependiente.

    DROP TABLE compania.dependiente CASCADE;

    La cláusula CASCADE es necesaria para borrar la tabla y todos los registros de otras tablas que hagan referencia a compania.dependiente.

  • 13

    3. OPERACIONES DEL DML

    Las instrucciones del DML son:

    INSERT

    DELETE

    UPDATE

    SELECT

    Se utilizan para insertar, eliminar, actualizar y consultar registros de una o más tablas de una base de datos.

    CONSULTA 3.1Añadir un departamento llamado ‘Ventas’ con número 1, dirigido por el empleado con número de seguro social ‘123456789’ a partir del 10 de octubre de 2002.

    INSERT INTO compania.departamento VALUES ('Ventas','1','123456789','2002-10-10');INSERT 0 1

    Cuando en algunas tablas se permitan los valores nulos y no se quiera ingresar todos los valores, simplemente se describen los campos insertados después del nombre de la tabla, por ejemplo:

    INSERT INTO compania.departamento (nombred, numerod) VALUES (‘Almacen’, ‘2’);INSERT 0 1

    CONSULTA 3.2Añadir al empleado ‘Juan Perez’ con numero de seguro social ‘123456789’ con fecha de nacimiento de 10 de octubre de 1980 y que pertenecerá al departamento número 1 (‘Ventas’ recién creado).

    INSERT INTO compania.empleado VALUES ('Juan Perez','123456789','1980-10-10','1');INSERT 0 1

    CONSULTA 3.3

  • 14

    Añadir un departamento llamado ‘Almacen’ con número 2, dirigido por el empleado con número de seguro social ‘987654321’ a partir del 11 de marzo de 2000.

    INSERT INTO compania.departamento VALUES ('Almacen','2','987654321','2000-03-11');INSERT 0 1

  • 15

    CONSULTA 3.4Hemos cometido un error al momento de ingresar a ‘Juan Pérez’ puesto que en realidad su fecha de nacimiento es del 10 de octubre de 1970 y no 1980. Para actualizar dicho registro:

    UPDATE compania.empleado SET fechan='1970-10-10' WHERE nss='123456789';UPDATE 1

    CONSULTA 3.5Para verificar el cambio anterior:

    SELECT * FROM compania.empleado;

    nombre | nss | fechan | nd | sexo------------+-----------+------------+----+------Juan Perez | 123456789 | 1970-10-10 | 1 | M

    (1 fila)

    CONSULTA 3.6Eliminar el departamento 2.

    DELETE FROM compania.departamento WHERE numerod=’2’;DELETE 1

    En esta instrucción hay que tener cuidado, pues si se omite la cláusula WHERE se eliminarán todos los registros de la tabla.

    La sentencia SELECT

    La sentencia SELECT es una de las más utilizadas y se utiliza para consultar una BD y obtener datos que cumplan un criterio específico.

    La sentencia SELECT tiene cinco cláusulas principales a elegir, sin embargo, FROM es la única obligatoria. Cada una da las cláusulas tiene una vasta selección de opciones, parámetros, etc. Todas se listan a continuación, aunque se ven con más detalle más adelante.

    Formato de la sentencia SELECT:

  • 16

    SELECT [ALL | DISTINCT] columna1[,columna2]FROM tabla1[,tabla2][WHERE "condiciones"][GROUP BY "lista-columnas"][HAVING "condiciones"][ORDER BY "lista-columnas" [ASC | DESC] ]

  • 17

    4. CONSULTAS “SELECT” SOBRE UNA TABLA

    CONSULTA 4.1Devolver el nombre, apellido y salario de la tabla compania.empleado:

    SELECT nombrep, apellido, salarioFROM compania.empleado;

    nombrep | apellido | salario-----------+-------------+----------JOAQUIN | GONZALEZ | 27000.00GUSTAVO | ALVAREZ | 30000.00INES | SANTOYO | 22000.00RAMON | NIETO | 38000.00JAIME | BOTELLO | 55000.00

    .........

    .........

    ISABEL | RODRIGUEZ | 27000.00PATRICIA | BERMUDEZ | 17000.00JAZMIN | VALDEZ | 48000.00FERNANDO | ROBLEDO | 27000.00LUIS | ROBLES | 13000.00

    (56 filas) (56 filas)

    Su equivalente es una proyección en algebra relacional: nombrep,apellido,salario (EMPLEADO)

    CONSULTA 4.2La cláusula WHERE permite establecer un criterio de búsqueda (predicado) utilizando un operador relacional:

    Operador Descripción= Igual Diferente de> Mayor que< Menor que>= Mayor o igual que

  • 18

    IN Si se conoce el valor exacto que se desea devolver para al menos una de las columnas

    Por ejemplo: devolver todos los valores de los empleados que ganan más de 20,000.

    SELECT *FROM compania.empleadoWHERE salario > 20000;

    nombrep | apellido | nss | fechan | dirección .....----------+-----------+-----------+------------+-------------------------- .....JOAQUIN | GONZALEZ | 723487645 | 1976-02-21 | Thiers 854 .....GUSTAVO | ALVAREZ | 528476291 | 1980-01-11 | Jesus Garcia 894 .....INES | SANTOYO | 281655645 | 1977-10-04 | Pedro Moreno 1765 .....RAMON | NIETO | 666884444 | 1952-09-15 | Independencia 35 .....JAIME | BOTELLO | 888665555 | 1937-11-10 | Mariano Escobedo 450 .....JOSE | SILVA | 123456789 | 1955-01-09 | Paseo Camelinas 731 .....CORNELIO | REYES | 749273822 | 1981-01-15 | Laureles 2745 .....LORENA | HERRERA | 552981673 | 1988-12-15 | Guadalupe 854 .....MARISA | RAZO | 492738495 | 1975-09-07 | Rumorosa 35 .....FEDERICO | VIZCARRA | 333445555 | 1945-12-08 | Valle 638 .....ISABEL | JIMENEZ | 878672843 | 1977-06-08 | Juarez 245 .....GRISELDA | JIMENEZ | 834572889 | 1981-04-03 | Av. Tacubaya 473 .....JAVIER | LOPEZ | 918264845 | 1985-12-15 | Revolucion 376 .....AHMED | JABBAR | 987987987 | 1959-03-29 | Dallas 980 .....ENRIQUE | RAMOS | 128763542 | 1980-02-05 | Alfonso Reyes 456 .....PATRICIA | GONZALEZ | 775833245 | 1966-07-01 | Paseo de los Orfebres 854 .....MARIO | PADILLA | 245892763 | 1966-12-20 | Aldama 765 .....HUGO | GOMEZ | 423675975 | 1956-08-18 | Americas 739 .....JULIAN | SOSA | 675645340 | 1969-07-16 | Madero 492 .....RUBEN | SANCHEZ | 672839456 | 1969-02-22 | Pedro Garza 3456 .....FERNANDA | GUTIERREZ | 472891286 | 1955-04-11 | Av. Guadalupe 3654 .....LUZ | GOMEZ | 466557975 | 1959-12-28 | Ciceron 739 .....MARTIN | ANDERSON | 482948739 | 1981-03-13 | Argentina 133 .....JOSEFA | ESPARZA | 378445358 | 1962-07-31 | Cancion 1450 .....ISABEL | RODRIGUEZ | 626491624 | 1962-10-21 | Morelos 625 .....JAZMIN | VALDEZ | 987654321 | 1941-06-20 | Guthemberg 291 .....FERNANDO | ROBLEDO | 487261987 | 1979-05-13 | Blv. Lazaro Cardenas .....

    (27 filas)

    Su equivalente es una selección en algebra relacional: salario > 20000 (EMPLEADO)

    CONSULTA 4.3

  • 19

    Devolver los valores de las columnas nombrep, apelllido y salario de la tabla compania.empleado, para todas las empleadas:

    SELECT nombrep, apellido, salarioFROM compania.empleadoWHERE sexo = ‘F’;

    nombrep | apellido | salario-----------+-----------+----------INES | SANTOYO | 22000.00LORENA | HERRERA | 21000.00MARISA | RAZO | 25000.00ALICIA | ZAPATA | 12000.00

    .........

    .........

    MARTHA | ORTEGA | 15000.00ISABEL | RODRIGUEZ | 27000.00PATRICIA | BERMUDEZ | 17000.00JAZMIN | VALDEZ | 48000.00

    (22 filas)

    Su equivalente en algebra relacional es una combinación de una proyección y una selección: nombrep,apellido,salario (sexo=’F’ (EMPLEADO))

    En SQL el orden de ejecución de las cláusulas en una consulta no es necesariamente de izquierda a derecha. En la consulta anterior es: FROM WHERE SELECT, es decir, primero se toma la tabla a procesar, después se seleccionan las filas en base a un criterio determinado (selección) y finalmente se devuelven solo las columnas elegidas (proyección).

    CONSULTA 4.4El predicado utilizado en la cláusula WHERE puede estar compuesto de una o más condiciones, unidas por uno o más operadores lógicos (AND, OR, NOT). Por ejemplo: Obtener la fecha de nacimiento y la dirección del empleado cuyo nombre es ‘JOSE SILVA’:

    SELECT fechan, direccionFROM compania.empleadoWHERE nombrep = ‘JOSE’ AND apellido = ‘SILVA’;

    fechan | direccion

  • 20

    ------------+---------------------1955-01-09 | Paseo Camelinas 731

    (1 fila)

    Su equivalente en algebra relacional: fechan,direccion (nombrep=’JOSE’ ^ ’apellido=’SILVA’ (EMPLEADO))

    El uso del operador AND en esta consulta (aunque no siempre es así) denota la presencia de una intersección (conjunción). Si llamamos A al conjunto de los empleados cuyo nombre de pila es ‘JOSE’ y B al conjunto de los empleados con apellido ‘SILVA’:

    CONSULTA 4.5Obtener los nombres y apellidos de los empleados que pertenecen al departamento 3 o al departamento 5:

    SELECT nombrep,apellidoFROM compania.empleadoWHERE nd=3 OR nd=5;

    nombrep | apellido-----------+-------------GUSTAVO | ALVAREZRAMON | NIETOGUILLERMO | BARBASALVADOR | VAZQUEZ

    ......

    ......

    JOSEFA | ESPARZAMARTHA | ORTEGAPATRICIA | BERMUDEZLUIS | ROBLES

    (28 filas)

  • 21

    Su equivalente en algebra relacional: nombrep,apellido (nd=3 ∨ nd=5 (EMPLEADO))El operador OR muchas veces es indicativo de una unión (disyunción):

    CONSULTA 4.5aObtener los nombres y apellidos de los empleados que pertenezcan al departamento 3 y no seanmujeres:

    SELECT nombrep,apellidoFROM compania.empleadoWHERE nd=3 AND sexo’F’;

    nombrep | apellido-----------+-------------GUSTAVO | ALVAREZGUILLERMO | BARBASALVADOR | VAZQUEZJAVIER | LOPEZENRIQUE | RAMOSJUAN | GONZALEZLORENZO | BARRAGANANGEL | ZAMBRANOPABLO | CASARRUBIASDANIEL | VAZQUEZLUIS | ROBLES

    (11 filas)

    Su equivalente en algebra relacional: nombrep,apellido (nd=3 ^ sexo’F’ (EMPLEADO))O bien: nombrep,apellido (nd=3 (EMPLEADO) — sexo=’F’ (EMPLEADO))

    En este ejemplo la combinación de los operadores AND y se utilizan para expresar una diferencia:

  • 22

    CONSULTA 4.6ALL y DISTINCT son palabras reservadas para elegir “todos” los registros, o los “únicos” o distintos registros en los resultados de una consulta. Si queremos obtener registros no repetidos en determinadas columnas, podemos usar la cláusula "DISTINCT". DISTINCT descartará los registros duplicados para las columnas especificadas después de la sentencia "SELECT". Por ejemplo: Devolver los salarios únicos en la tabla compania.empleado.

    SELECT DISTINCT salarioFROM compania.empleado;

    salario----------11000.0012000.0014000.0015000.0016000.00..................35000.0038000.0048000.0052000.0055000.00

    (25 filas)

    ALL desplegará "todos" los valores de las columnas especificadas, incluyendo los duplicados. La cláusula ALL es la usada por omisión, por lo que no es obligatorio escribirla. Algunos motores de bases de datos como postgres, ordenan la salida en forma ascendente al usar DISTINCT.

    CONSULTA 4.7DISTINCT checa que los registros no sean iguales en todas sus columnas. DISTINCT ON permite desplegar más de una columna basándose en una sola columna.

    SELECT DISTINCT ON(salario) apellido,salarioFROM compania.empleado;

  • 23

    apellido | salario----------+----------RAMIREZ | 11000.00CORONA | 12000.00ROBLES | 13000.00BARBA | 14000.00..................

    VIZCARRA | 45000.00VALDEZ | 48000.00JIMENEZ | 52000.00BOTELLO | 55000.00

    (25 filas)

    Esta consulta se muestra con fines ilustrativos, pues no es muy práctica ya que de haber más de un empleado con el mismo salario, solo se muestra el primero hallado. SELECT ON no es un estándar SQL (ANSI) y no se recomienda su uso porque puede llevar a resultados impredecibles.

    CONSULTA 4.8La cláusula ORDER BY permite mostrar los resultados en un orden específico, ya sea ascendente o descendente (ASC, DESC). Por ejemplo, mostrar los nombres, apellidos y salarios de todas las mujeres en orden descendente:

    SELECT nombrep, apellido, salarioFROM compania.empleadoWHERE sexo=’F’ORDER BY salario DESC;

    nombrep | apellido | salario-----------+-----------+----------ISABEL | JIMENEZ | 52000.00JAZMIN | VALDEZ | 48000.00LUZ | GOMEZ | 34000.00FERNANDA | GUTIERREZ | 30000.00PATRICIA | GONZALEZ | 29000.00

    .....

    .....

    IRMA | GALLEGOS | 14000.00ALICIA | ZAPATA | 12000.00CARMEN | CORONA | 12000.00LETICIA | RAMIREZ | 11000.00

    (22 filas)

  • 24

    ASC y DESC permiten definir la manera como se llevará a cabo el ordenamiento (ascendente y descendente. El valor por omisión es ASC y por lo tanto no es obligatorio escribirlo.

    CONSULTA 4.9En ORDER BY se puede establecer más de un criterio. Por ejemplo: mostrar el nombre, apellido, sexo y salario de todos los empleados que ganan más de 30,000 pesos, ordenados por sexo y salario.

    SELECT nombrep, apellido, sexo, salarioFROM compania.empleadoWHERE salario > 30000ORDER BY sexo, salario;

    nombrep | apellido | sexo | salario----------+----------+------+----------LUZ | GOMEZ | F | 34000.00JAZMIN | VALDEZ | F | 48000.00ISABEL | JIMENEZ | F | 52000.00AHMED | JABBAR | M | 35000.00MARIO | PADILLA | M | 38000.00RAMON | NIETO | M | 38000.00JOSE | SILVA | M | 42000.00FEDERICO | VIZCARRA | M | 45000.00JAIME | BOTELLO | M | 55000.00

    (9 filas)

    Primero se ordenan por sexo y después, dentro de cada grupo creado, se efectúa el ordenamiento por salario.

    CONSULTA 4.10Si en la consulta 4.9 se quisiera que el sexo apareciera ordenado en forma descendente y el salario en orden ascendente:

    SELECT nombrep, apellido, sexo, salarioFROM compania.empleadoWHERE salario > 30000ORDER BY sexo DESC, salario ASC;

    nombrep | apellido | sexo | salario----------+----------+------+----------AHMED | JABBAR | M | 35000.00RAMON | NIETO | M | 38000.00MARIO | PADILLA | M | 38000.00JOSE | SILVA | M | 42000.00

  • 25

    FEDERICO | VIZCARRA | M | 45000.00JAIME | BOTELLO | M | 55000.00LUZ | GOMEZ | F | 34000.00JAZMIN | VALDEZ | F | 48000.00ISABEL | JIMENEZ | F | 52000.00

    (9 filas)

    CONSULTA 4.11Mediante la cláusula LIMIT Se puede limitar el número de resultados mostrados por una consulta. Por ejemplo: mostrar el nombre, apellido y salario de 5 mujeres:

    SELECT nombrep, apellido, salarioFROM compania.empleadoWHERE sexo=’F’LIMIT 5;

    nombrep | apellido | salario-----------+-----------+----------INES | SANTOYO | 22000.00LORENA | HERRERA | 21000.00MARISA | RAZO | 25000.00ALICIA | ZAPATA | 12000.00GUADALUPE | GALINDO | 14000.00(5 filas)

    La consulta no sigue un orden determinado, simplemente se muestran los primeros 5 valores encontrados.

    CONSULTA 4.12Podemos combinar las cláusulas ORDER BY y LIMIT para mostrar los 5 salarios más altos:

    SELECT nombrep, apellido, salarioFROM compania.empleadoWHERE sexo=’F’ORDER BY salario DESCLIMIT 5;

    nombrep | apellido | salario----------+-----------+----------ISABEL | JIMENEZ | 52000.00JAZMIN | VALDEZ | 48000.00LUZ | GOMEZ | 34000.00FERNANDA | GUTIERREZ | 30000.00PATRICIA | GONZALEZ | 29000.00

    (5 filas)

  • 26

    Para encontrar los 5 salarios más bajos, solo hay que cambiar la clausula DESC por ASC (O simplemente omitirla).

    CONSULTA 4.13Si se quiere saber los “segundos” 5 salarios más altos utilizamos la cláusula OFFSET, que permite establecer un desplazamiento en la consulta:

    SELECT nombrep, apellido, salarioFROM compania.empleadoWHERE sexo=’F’ORDER BY salario DESCLIMIT 5OFFSET 5;

    nombrep | apellido | salario----------+-----------+----------ISABEL | RODRIGUEZ | 27000.00GRISELDA | JIMENEZ | 27000.00JOSEFA | ESPARZA | 25000.00MARISA | RAZO | 25000.00INES | SANTOYO | 22000.00

    (5 filas)

    CONSULTA 4.14IN es un tipo especial de operador utilizado en las cláusulas WHERE para verificar si existe un determinado valor entre una lista proporcionada. Por ejemplo: Obtener el número del seguro social de todos los empleados que trabajan en los proyectos 1,2 o 3.

    SELECT nsseFROM compania.trabaja_enWHERE nump IN (1,2,3);

    nsse-----------878672843774592713973624168862938865472891286239812752298234874137845983

    ..........

    ..........

  • 27

    659327184528476291825463817918264845552981673

    (49 filas)

    CONSULTA 4.15El operador NOT se puede utilizar para negar el valor de algunos otros operadores como IN. Por ejemplo: Obtener el número del seguro social de todos aquellos empleados que NO trabajan en los proyectos 1,2 o 3.

    SELECT nsseFROM compania.trabaja_enWHERE nump NOT IN (1,2,3);

    nsse-----------592745726

    466557975647758129156675267482948739987654321198347767

    .......

    .......

    459827165672839456675645340864523419567324572

    (54 filas)

    CONSULTA 4.16BETWEEN es también un tipo especial de operador utilizado en las cláusulas WHERE, y permite la selección de un rango de valores. Por ejemplo: Obtener el número del seguro social de todos los empleados que ganan entre 20,000 y 25,000 pesos.

  • 28

    SELECT nssFROM compania.empleadoWHERE salario BETWEEN 20000 AND 25000;

    nsse-----------281655645749273822552981673492738495156675267423675975675645340482948739378445358

    (9 filas)

    CONSULTA 4.17Con la cláusula AS se pueden definir “alias” tanto para columnas como para tablas:

    SELECT nss AS numero_seguro_socialFROM compania.empleadoWHERE salario BETWEEN 20000 AND 25000;

    numero_seguro_social----------------------281655645749273822552981673492738495156675267423675975675645340482948739378445358

    (9 filas)

    CONSULTA 4.18La cláusula LIKE checa si el valor de una cadena concuerda con un patrón dado. Ejemplo: Obtener todos los empleados que vivan en la calle Alcalde, sea de cualquier municipio.

    SELECT nombrep, apellidoFROM compania.empleadoWHERE direccion LIKE ‘%Alcalde%’;

  • 29

    nombrep | apellido----------+----------PATRICIA | BERMUDEZLUIS | ROBLES

    (2 filas)

    En un patrón, se usa el guión bajo (_) para checar cualquier carácter simple y el signo de porcentaje (%) para checar cualquier número de caracteres incluyendo cero. Se puede utilizar cualquier otro carácter, como una letra o un dígito, para checarse a sí mismos.

    CONSULTA 4.19Obtener los nombres y apellidos de todos los empleados en cuyo apellido tengan la letra ‘E’ como segundo caracter.

    SELECT nombrep, apellidoFROM compania.empleadoWHERE apellido LIKE ‘_E%’;

    nombrep | apellido----------+-----------CORNELIO | REYESLORENA | HERRERAJAVIER | MERCADOGERARDO | CEJARICARDO | FERREROESTHER | SERRANOMARIA | HERNANDEZPATRICIA | BERMUDEZ

    (8 filas)

  • 30

    CONSULTA 4.20IS NULL o IS NOT NULL son clausulas que nos permiten verificar si un campo es nulo o no. Ejemplo: Obtener los nombres y apellidos de los empleados que no tienen ningún supervisor.

    SELECT nombrep,apellidoFROM compania.empleadoWHERE nsssuper IS NULL;

    nombrep | apellido----------+----------JAIME | BOTELLOJOSE | SILVAFEDERICO | VIZCARRAISABEL | JIMENEZPATRICIA | GONZALEZLUZ | GOMEZJAZMIN | VALDEZ

    (7 filas)

    CONSULTA 4.21La cláusula CASE permite elegir que acción tomar en base al resultado de una consulta. Ejemplo:

    SELECT nombrep, apellido, salario, CASE WHEN salario35000 THEN 'Ganas mucho' ELSE 'No esta mal tu salario' END AS EvaluaFROM compania.empleado;

    nombrep | apellido | salario | evalua-----------+-------------+----------+------------------------JOAQUIN | GONZALEZ | 27000.00 | No esta mal tu salarioGUSTAVO | ALVAREZ | 30000.00 | No esta mal tu salarioINES | SANTOYO | 22000.00 | No esta mal tu salarioRAMON | NIETO | 38000.00 | Ganas muchoJAIME | BOTELLO | 55000.00 | Ganas muchoGUILLERMO | BARBA | 14000.00 | que poquito ganas

    ......

    ......

    PATRICIA | BERMUDEZ | 17000.00 | que poquito ganasJAZMIN | VALDEZ | 48000.00 | Ganas muchoFERNANDO | ROBLEDO | 27000.00 | No esta mal tu salarioLUIS | ROBLES | 13000.00 | que poquito ganas

  • 31

    (56 filas)

  • 32

    CONSULTA 4.22La vieja cláusula LIKE tiene muchas limitaciones en cuanto a las opciones disponibles. En lugar de ella se puede utilizar SIMILAR TO recomendada por el comité ANSI SQL y que ya se implementa en un buen número de motores de bases de datos, como postgres. La consulta 4.18:

    SELECT nombrep, apellidoFROM compania.empleadoWHERE direccion SIMILAR TO ‘%Alcalde%’;

    nombrep | apellido----------+----------PATRICIA | BERMUDEZLUIS | ROBLES

    (2 filas)

  • 33

    5. CONSULTAS SOBRE DOS O MÁS TABLAS

    CONSULTA 5.1Hasta el momento las consultas que hemos presentado solo han involucrado a elementos de una sola tabla y se han efectuado solamente operaciones de Proyección y Selección. Una operación importante es la de Producto Cartesiano que consiste en encontrar todas las combinaciones posibles entre los elementos de 2 o más tablas. Para efectuar dicha operación en SQL, simplemente se refieren las tablas en cuestión en la cláusula FROM. Por ejemplo: obtener el producto cartesiano de compania.proyecto y compania.trabaja_en:

    SELECT *FROM compania.proyecto, compania.trabaja_en;

    nombrepr | numerop | lugarp | numd | nsse | nump | horas------------------------+---------+-------------+------+-----------+------+-----ProductoX | 1 | Monterrey | 3 | 592745726 | 50 | 40.0ProductoY | 2 | Monterrey | 3 | 592745726 | 50 | 40.0ProductoZ | 3 | Guadalajara | 3 | 592745726 | 50 | 40.0Automatizacion | 10 | Monterrey | 5 | 592745726 | 50 | 40.0Reorganizacion | 20 | Mexico | 4 | 592745726 | 50 | 40.0Prestaciones | 30 | Guadalajara | 6 | 592745726 | 50 | 40.0Reestructuracion | 50 | Mexico | 1 | 592745726 | 50 | 40.0Implementacion SAP | 60 | Mexico | 2 | 592745726 | 50 | 40.0Impactos Ambientales | 70 | Morelia | 7 | 592745726 | 50 | 40.0

    ...........

    ...........

    ...........

    Reorganizacion | 20 | Mexico | 4 | 675645340 | 90 | 11.0Prestaciones | 30 | Guadalajara | 6 | 675645340 | 90 | 11.0Reestructuracion | 50 | Mexico | 1 | 675645340 | 90 | 11.0Implementacion SAP | 60 | Mexico | 2 | 675645340 | 90 | 11.0Impactos Ambientales | 70 | Morelia | 7 | 675645340 | 90 | 11.0Otimizacion de Insumos | 80 | Morelia | 5 | 675645340 | 90 | 11.0Reciclaje y Reuso | 90 | Morelia | 7 | 675645340 | 90 | 11.01133 filas)

  • 34

    CONSULTA 5.2Como se aprecia en la consulta anterior el producto cartesiano devuelve todas las combinaciones posibles entre ambas tablas. Si analizamos detenidamente el resultado notaremos que se forman filas sin coherencia entre los campos. Basta observar las primeras filas obtenidas, donde el atributo nsse (número de seguro social del empleado) se combina con todos los atributos de la relación compania.proyecto, cuando en realidad solo con algunos estaría relacionado. Para que adquieran sentido se tienen que eliminar aquellas filas que contienen valores no relacionados. Normalmente dicha relación se manifiesta a través de una llave primaria y una llave foránea. Para descartar las filas no relacionadas se seleccionan solamente aquellas en las que son iguales dichasllaves. En este ejemplo las columnas clave (llaves primaria y foránea) son: numerop y nump.

    SELECT *FROM compania.proyecto, compania.trabaja_enWHERE nump=numerop;

    Nombrepr | numerop | lugarp | numd | nsse | nump | horas-------------------+---------+-------------+------+-----------+------+-------Reestructuracion | 50 | Mexico | 1 | 592745726 | 50 | 40.0Reestructuracion | 50 | Mexico | 1 | 482948739 | 50 | 40.0Reestructuracion | 50 | Mexico | 1 | 834572889 | 50 | 40.0Reestructuracion | 50 | Mexico | 1 | 888665555 | 50 | 40.0Implementacion SAP | 60 | Mexico | 2 | 156675267 | 60 | 40.0

    .........

    .........

    Reciclaje y Reuso | 90 | Morelia | 7 | 459827165 | 90 | 24.0Reciclaje y Reuso | 90 | Morelia | 7 | 348726591 | 90 | 21.0Reciclaje y Reuso | 90 | Morelia | 7 | 487261987 | 90 | 17.0Reciclaje y Reuso | 90 | Morelia | 7 | 675645340 | 90 | 11.0103 filas)

    El resultado obtenido se conoce como “reunión” y en este ejemplo se refiere en realidad al número de horas que cada trabajador dedica a cada proyecto. Debido a que la condición que se establece en WHERE involucra a 2 tablas recibe el nombre de “condición de reunión” a diferencia de la condición de selección que involucra a columnas de una sola tabla. Las reuniones se utilizan para obtener datos relacionados que se encuentran en tablas diferentes. Normalmente no son de interés todas las columnas, por lo que la consulta podría quedar como:

    SELECT nsse, nombrepr, horasFROM compania.proyecto, compania.trabaja_enWHERE nump=numerop;

    nsse | nombrepr | horas-----------+------------------------+-------592745726 | Reestructuracion | 40.0482948739 | Reestructuracion | 40.0

  • 35

    834572889 | Reestructuracion | 40.0156675267 | Implementacion SAP | 40.0

    .........

    .........

    459827165 | Reciclaje y Reuso | 24.0348726591 | Reciclaje y Reuso | 21.0487261987 | Reciclaje y Reuso | 17.0675645340 | Reciclaje y Reuso | 11.0

    (103 filas)

    Su equivalente en algebra relacional:

    nsse, nombrepr, horas(nump=numerop (PROYECTO x TRABAJA_EN))Como se puede observar, una reunión es equivalente a calcular un producto cartesiano y después una selección. En la cláusula WHERE se establece la condición de reunión (nump=numerop).

    CONSULTA 5.3Si reunimos las tablas compania.empleado y compania.departamento en base a sus claves nss y nssgte (clave primaria en compania.empleado y clave foránea en compania.departamento, respectivamente), obtenemos información que tiene que ver con los supervisores y los departamentos que dirigen. Puede que solo sean de interés las columnas nombrep, apellido, nombred:

    SELECT nombrep, apellido, nombredFROM compania.empleado, compania.departamentoWHERE nss=nssgte;

    nombrep | apellido | nombred----------+----------+----------------------FEDERICO | VIZCARRA | INVESTIGACIONJAZMIN | VALDEZ | ADMINISTRACIONJAIME | BOTELLO | DIRECCIONLUZ | GOMEZ | CONTABILIDADISABEL | JIMENEZ | PRODUCCIONPATRICIA | GONZALEZ | PERSONALJOSE | SILVA | ESTUDIOS AMBIENTALES

    (7 filas)

    CONSULTA 5.4Las tablas compania.empleado y compania.departamento también se pueden reunir en base a sus claves nd y numerod (clave foránea en compania.empleado y clave primaria en compania.departamento, respectivamente), obteniendo información que tiene que ver con los empleados y los departamentos a los que pertenecen:

  • 36

    SELECT nombrep, apellido, nombredFROM compania.empleado, compania.departamentoWHERE nd=numerod;

    nombrep | apellido | nombred-----------+-------------+----------------------JOAQUIN | GONZALEZ | ADMINISTRACIONGUSTAVO | ALVAREZ | PRODUCCIONINES | SANTOYO | PERSONALRAMON | NIETO | INVESTIGACION

    .........

    .........

    PATRICIA | BERMUDEZ | PRODUCCIONJAZMIN | VALDEZ | ADMINISTRACIONFERNANDO | ROBLEDO | ESTUDIOS AMBIENTALESLUIS | ROBLES | PRODUCCION

    (56 filas)

    CONSULTA 5.5Obtener el nombre y la dirección de todos los empleados que pertenecen al departamento ‘Investigación’:

    SELECT nombrep, apellido, direccionFROM compania.empleado, compania.departamentoWHERE nombred = ‘INVESTIGACION’ AND numerod = nd;

    nombrep | apellido | direccion----------+-----------+------------------RAMON | NIETO | Independencia 35JOSEFA | ESPARZA | Cancion 1450HUGO | GOMEZ | Americas 739MARIA | HERNANDEZ | Allende 345MARIO | PADILLA | Aldama 765CORNELIO | REYES | Laureles 2745RAFAEL | SALGADO | Camichines 1763MARISA | RAZO | Rumorosa 35FEDERICO | VIZCARRA | Valle 638

    (9 filas)

    Su equivalente en algebra relacional:

    nombrep,apellido,direccion(nombred=’INVESTIGACION’ ^ numerod=nd (EMPLEADO xDEPARTAMENTO))Como se aprecia, en la cláusula WHERE se establecen dos condiciones: una condición de selección (nombred=’Investigación’) y una condición de reunión (numerod=nd).

  • 37

    CONSULTA 5.6Si ahora reunimos las tablas compania.departamento y compania.lugares_deptos en base a los atributos que las relacionan, encontraremos la información los departamentos y las ciudades donde tienen oficinas:

    SELECT nombred, lugardFROM compania.departamento, compania.lugares_deptosWHERE departamento.numerod=lugares_deptos.numerod;

    nombred | lugard----------------------+-------------DIRECCION | MexicoCONTABILIDAD | MexicoADMINISTRACION | MexicoPERSONAL | MexicoPRODUCCION | GuadalajaraPERSONAL | GuadalajaraPRODUCCION | MonterreyINVESTIGACION | MonterreyPERSONAL | MonterreyINVESTIGACION | MoreliaESTUDIOS AMBIENTALES | Morelia

    (11 filas)

    CONSULTA 5.7A continuación listamos a todos los proyectos y los departamentos que los controlan:

    SELECT nombrepr, nombredFROM compania.departamento, compania.proyectoWHERE numd=numerod;

    nombrepr | nombred------------------------+----------------------ProductoX | PRODUCCIONProductoY | PRODUCCIONProductoZ | PRODUCCIONAutomatizacion | INVESTIGACIONReorganizacion | ADMINISTRACIONPrestaciones | PERSONALReestructuracion | DIRECCIONImplementacion SAP | CONTABILIDADImpactos Ambientales | ESTUDIOS AMBIENTALESOtimizacion de Insumos | INVESTIGACIONReciclaje y Reuso | ESTUDIOS AMBIENTALES

  • 38

    (11 filas)

    CONSULTA 5.8Mostrar una lista de los empleados y sus dependientes, incluyendo su parentesco:

    SELECT nombrep, apellido, nombre_dependiente, parentescoFROM compania.empleado, compania.dependienteWHERE nss=nsse;

    nombrep | apellido | nombre_dependiente | parentesco-----------+-------------+--------------------+------------JAIME | BOTELLO | ALICIA | CONYUGEJAZMIN | VALDEZ | MARIO | CONYUGEFEDERICO | VIZCARRA | MARIA ELENA | CONYUGERAMON | NIETO | ADRIANA | CONYUGE

    .........

    .........

    LORENA | HERRERA | MARGARITA | PADRELORENA | HERRERA | RIGOBERTO | PADRELUIS | ROBLES | NESTOR | PADRE

    (101 filas)

  • 39

    CONSULTA 5.9Obtener un reporte de las horas trabajadas por cada empleado y los proyectos en los que las emplearon:

    SELECT nombrep, apellido, nump, horasFROM compania.empleado, compania.trabaja_enWHERE nss=nsseORDER BY nombrep,apellido;

    nombrep | apellido | nump | horas-----------+-------------+------+-------ADRIANA | TORRES | 3 | 28.0ADRIANA | TORRES | 2 | 12.0AHMED | JABBAR | 20 | 40.0ALICIA | ZAPATA | 20 | 40.0ANGEL | ZAMBRANO | 3 | 13.0ANGEL | ZAMBRANO | 1 | 10.0

    .........

    .........

    RUBEN | SANCHEZ | 30 | 40.0SALVADOR | VAZQUEZ | 2 | 16.0SALVADOR | VAZQUEZ | 3 | 24.0TERESA | MADRIGAL | 70 | 10.0TERESA | MADRIGAL | 90 | 30.0

    (103 filas)

    En este ejemplo resulta conveniente utilizar la cláusula ORDER BY con el fin de tener por bloques la información de cada empleado.

    CONSULTA 5.10Hemos visto que las reuniones nos permiten recuperar información relacionada entre dos tablas, a partir de una llave primaria y una llave foránea. Sin embargo, ¿Qué pasa cuando tenemos una relación unaria o recursiva en la cual los elementos relacionados (así como las llaves primaria y foránea) se encuentran en la misma tabla? En ese caso se pueden utilizar 2 alias para la misma tabla. Por ejemplo, para cada empleado, obtener su nombre de pila y apellido y el nombre de pila y apellido de su supervisor inmediato:

    SELECT e.nombrep, e.apellido, s.nombrep, s.apellidoFROM compania.empleado AS e, compania.empleado AS sWHERE e.nsssuper = s.nss;

    nombrep | apellido | nombrep | apellido-----------+-------------+----------+-----------JOAQUIN | GONZALEZ | JAZMIN | VALDEZGUSTAVO | ALVAREZ | ISABEL | JIMENEZ

  • 40

    INES | SANTOYO | PATRICIA | GONZALEZRAMON | NIETO | FEDERICO | VIZCARRAGUILLERMO | BARBA | ENRIQUE | RAMOS

    .........

    .........

    .........

    MARTHA | ORTEGA | GUSTAVO | ALVAREZISABEL | RODRIGUEZ | JOSE | SILVAPATRICIA | BERMUDEZ | FERNANDA | GUTIERREZFERNANDO | ROBLEDO | JOSE | SILVALUIS | ROBLES | GUSTAVO | ALVAREZ

    (49 filas)

    CONSULTA 5.11Obtener el nombre y apellido de cada empleado, la ciudad en la que vive y los proyectos disponibles en dicha ciudad:

    SELECT nombrep,apellido, ciudad,nombreprFROM compania.empleado, compania.proyectoWHERE ciudad=lugarpORDER BY nombrep,apellido;

    nombrep | apellido | ciudad | nombrepr-----------+-------------+-------------+------------------------ADRIANA | TORRES | Monterrey | ProductoXADRIANA | TORRES | Monterrey | AutomatizacionADRIANA | TORRES | Monterrey | ProductoYAHMED | JABBAR | Mexico | Implementacion SAPAHMED | JABBAR | Mexico | ReestructuracionAHMED | JABBAR | Mexico | Reorganizacion

    .........

    .........

    .........

    SALVADOR | VAZQUEZ | Monterrey | AutomatizacionSALVADOR | VAZQUEZ | Monterrey | ProductoYSALVADOR | VAZQUEZ | Monterrey | ProductoXTERESA | MADRIGAL | Morelia | Reciclaje y ReusoTERESA | MADRIGAL | Morelia | Impactos AmbientalesTERESA | MADRIGAL | Morelia | Otimizacion de Insumos

    (156 filas)

    Aquí también utilizamos la cláusula ORDER BY para agrupar los resultados por el nombre del empleado.

  • 41

    CONSULTA 5.12aComo se mencionó anteriormente, es posible reunir más de 2 tablas. Por ejemplo: para cada proyecto listar el número del proyecto, el número del departamento controlador y el apellido, la dirección y la fecha de nacimiento del gerente.

    SELECT numerop, numd, apellido, direccion, fechanFROM compania.proyecto, compania.departamento, compania.empleadoWHERE numd = numerod AND nssgte = nss;

    numerop | numd | apellido | direccion | fechan---------+------+----------+---------------------------+------------ 2 | 3 | JIMENEZ | Juarez 245 | 1977-06-08 70 | 7 | SILVA | Paseo Camelinas 731 | 1955-01-09 3 | 3 | JIMENEZ | Juarez 245 | 1977-06-08 90 | 7 | SILVA | Paseo Camelinas 731 | 1955-01-09 10 | 5 | VIZCARRA | Valle 638 | 1945-12-08 20 | 4 | VALDEZ | Guthemberg 291 | 1941-06-20 30 | 6 | GONZALEZ | Paseo de los Orfebres 854 | 1966-07-01 50 | 1 | BOTELLO | Mariano Escobedo 450 | 1937-11-10 60 | 2 | GOMEZ | Ciceron 739 | 1959-12-28 80 | 5 | VIZCARRA | Valle 638 | 1945-12-08 1 | 3 | JIMENEZ | Juarez 245 | 1977-06-08(11 filas)

    Su equivalente en algebra relacional:

    numerop, numd, apellido, direccion, fechan(numd=numerod ^ nssgte=nss (PROYECTO x DEPARTAMENTO x EMPLEADO))

    CONSULTA 5.12Similar al ejemplo anterior pero ahora para cada proyecto ubicado en ‘Guadalajara’ listar el número del proyecto, el número del departamento controlador y el apellido, la dirección y la fecha de nacimiento del gerente de ese departamento.

    SELECT numerop, numd, apellido, direccion, fechanFROM compania.proyecto, compania.departamento, compania.empleadoWHERE numd = numerod AND nssgte = nss AND lugarp = ‘Guadalajara’;

    numerop | numd | apellido | direccion | fechan---------+------+----------+------------- -------------+------------ 3 | 3 | JIMENEZ | Juarez 245 | 1977-06-08 30 | 6 | GONZALEZ | Paseo de los Orfebres 854 | 1966-07-01(2 filas)

  • 42

    Su equivalente en algebra relacional:

    numerop, numd, apellido, direccion, fechan(numd=numerod ^ nssgte=nss ^ lugarp=’Guadalajara’ (PROYECTO x DEPARTAMENTO x EMPLEADO))

    En estos dos últimos ejemplos hemos reunido tres relaciones, para encontrar la información solicitada. Nótese que las condiciones de reunión sirven como eslabones de una cadena, donde la condición de reunión numd=numerod reúne a las relaciones compania.proyecto y compania.departamento, y la condición de reunión nssgte=nss a las relaciones compania.departamento y compania.empleado. Cuando se reúnen dos relaciones se requiere una condición de reunión, cuando se reúnen tres, se requieren dos, cuando cuatro: tres y así sucesivamente. Aunque en este ejemplo aparecen tres condiciones, solo dos son de reunión y la tercera de selección. Es fácil deducir que en un esquema de n relaciones el mínimo de reuniones posibles es igual a n-1, de no ser así, la explicación sería que una o más relaciones no pertenecen en realidad al minimundo modelado.

    CONSULTA 5.13La cláusula INTERSECT permite devolver la intersección de 2 conjuntos de valores. Por ejemplo: encontrar todos los nombres de pila que existen tanto en empleados como en dependientes.

    SELECT nombrepFROM compania.empleadoINTERSECTSELECT nombre_dependienteFROM compania.dependiente;

    nombrep-----------ADRIANAALICIAANGELENRIQUE..................

    RAMONRICARDORODRIGOSALVADOR

    (29 filas)

    El nombre de la columna resultante es el de la primera consulta. Algunos motores, como postgresql, ordenan la salida de forma ascendente.

    CONSULTA 5.14Obtener la fecha de nacimiento y la dirección del empleado cuyo nombre es ‘JOSE SILVA’ (consulta 4.4):

  • 43

    SELECT fechan, direccionFROM compania.empleadoWHERE apellido = ‘SILVA’INTERSECTSELECT fechan, direccionFROM compania.empleadoWHERE nombrep = ‘JOSE’;

    fechan | direccion------------+---------------------1955-01-09 | Paseo Camelinas 731

    (1 fila)

    Su equivalente en algebra relacional:

    fechan,direccion (apellido=’SILVA’ (EMPLEADO)) ⋂ fechan,direccion (nombrep=’JOSE’ (EMPLEADO))Como se puede ver, cuando se trata de intersecciones entre conjuntos que pertenecen a una misma tabla, es más sencillo hacer uso del operador AND.

    CONSULTA 5.15La cláusula UNION permite devolver la unión de 2 conjuntos de valores. Por ejemplo: relacionar todos los nombres de pila de empleados y dependientes.

    SELECT nombrepFROM compania.empleadoUNIONSELECT nombre_dependienteFROM compania.dependiente;

    nombrep------------------ADRIANAAHMEDALFREDOALICIAALMA

    ......

    ......

    SALVADORSARASUSANATERESA

  • 44

    VALENTINAXIMENA

    (98 filas)

    Su equivalente en algebra relacional:

    nombrep (EMPLEADO) U nombre_dependiente (DEPENDIENTE)

    En la operación unión se eliminan los valores repetidos, por lo que no es necesario utilizar DISTINCT. Además, algunos motores como postgres ordenan los resultados.

  • 45

    CONSULTA 5.16Obtener los nombres y apellidos de los empleados que pertenecen al departamento 3 o al departamento 5 (consulta 4.5):

    SELECT nombrep,apellidoFROM compania.empleadoWHERE nd=3UNIONSELECT nombrep,apellidoFROM compania.empleadoWHERE nd=5;

    nombrep | apellido-----------+-------------ADRIANA | TORRESANGEL | ZAMBRANOCORNELIO | REYESDANIEL | VAZQUEZ

    ......

    ......

    PATRICIA | BERMUDEZRAFAEL | SALGADORAMON | NIETOSALVADOR | VAZQUEZ

    (28 filas)

    Su equivalente en algebra relacional:

    nombrep,apellido (nd=3 (EMPLEADO) U nombrep,apellido (nd=5 (EMPLEADO)

    Nótese como cuando se trata de uniones entre conjuntos que pertenecen a una misma tabla, es más sencillo hacer uso del operador OR.

    CONSULTA 5.17Preparar una lista con todos los números de los proyectos en los que participa un empleado de apellido ‘SILVA’, sea como trabajador o como gerente del departamento que controla el proyecto:

    SELECT numeropFROM compania.proyecto, compania.departamento, compania.empleadoWHERE numd = numerod AND nssgte = nss AND apellido = ‘SILVA’UNIONSELECT numeropFROM compania.proyecto, compania.trabaja_en, compania.empleadoWHERE numerop = nump AND nsse = nss AND apellido = ‘SILVA’;

  • 46

    numerop--------- 70 90(2 filas)

  • 47

    CONSULTA 5.18La cláusula EXCEPT permite devolver la diferencia de 2 conjuntos de valores. Por ejemplo: relacionar los nombres y apellidos de los empleados que no pertenecen al departamento 3.

    SELECT nombrep, apellidoFROM compania.empleadoEXCEPTSELECT nombrep, apellidoFROM compania.empleadoWHERE ND=3;

    nombrep | apellido-----------+-----------AHMED | JABBARALICIA | ZAPATACARMEN | CORONACORNELIO | REYES............RICARDO | FERRERORODRIGO | SANTANARUBEN | SANCHEZTERESA | MADRIGAL(37 filas)

    Su equivalente en algebra relacional:

    nombrep,apellido (EMPLEADO) — nombrep,apellido (nd=3 (EMPLEADO))

    Evidentemente, para conjuntos de elementos de la misma tabla, existen soluciones más simples, como:

    SELECT nombrep, apellidoFROM compania.empleadoWHERE ND3;

    Es en consultas más complejas (como en algunas subconsultas) donde la operación de diferencia se puede aprovechar, como veremos en posteriores ejemplos.

  • 48

    CONSULTA 5.19Obtener el nombre de todos los empleados que tienen un dependiente con el mismo nombre de pila y sexo que el empleado:

    SELECT e.nombrep, e.apellidoFROM compania.empleado AS e, compania.dependiente AS dWHERE e.nss = d.nsse AND e.nombrep = d.nombre_dependiente AND e.sexo = d.sexo;

    nombrep | apellido-----------+-----------MARISA | RAZOPEDRO | MACIASRODRIGO | SANTANAINES | SANTOYOGUILLERMO | BARBAANGEL | ZAMBRANOMARIO | PADILLAADRIANA | TORRESJUAN | GONZALEZMARIA | HERNANDEZJULIAN | SOSAISABEL | JIMENEZ

    (12 filas)

    Ahora hemos utilizado la clausula AS para definir alias para ambas tablas.

    CONSULTA 5.20Mostrar los salarios resultantes si cada empleado que trabaja en el proyecto ‘ProductoX’ recibe un aumento del 10%.

    SELECT nombrep, apellido, 1.1*salarioFROM compania.empleado, compania.trabaja_en, compania.proyectoWHERE nss=nsse AND nump=numerop AND nombrepr=’ProductoX’;

    nombrep | apellido | ?column?-----------+-------------+-----------FERNANDA | GUTIERREZ | 33000.000ANGEL | ZAMBRANO | 20900.000ISABEL | JIMENEZ | 57200.000GUADALUPE | GALINDO | 15400.000MARTHA | ORTEGA | 16500.000ESTHER | SERRANO | 17600.000PABLO | CASARRUBIAS | 18700.000GUSTAVO | ALVAREZ | 33000.000

  • 49

    LUIS | ROBLES | 14300.000JAVIER | LOPEZ | 33000.000LORENA | HERRERA | 23100.000

    (11 filas)

    Este ejemplo es muy especial. Como se puede apreciar los atributos requeridos se encuentran en una sola tabla: compania.empleado, sin embargo se requiere reunir dicha tabla con las de compania.proyecto y compania.trabaja_en para poder listar solo aquellos empleados que trabajan en el proyecto “ProductoX”. Además se puede apreciar el uso de operadores matemáticos en la clausula SELECT.

  • 50

    CONSULTA 5.21Obtener una lista de empleados y de los proyectos en los que trabajan, ordenados por departamento, y dentro de cada departamento, alfabéticamente por apellido y nombre.

    SELECT nombred, apellido, nombrep, nombreprFROM compania.empleado, compania.departamento, compania.trabaja_en, compania.proyectoWHERE nss=nsse AND nump=numerop AND numerod=ndORDER BY nombred, apellido, nombrep;

    nombred | apellido | nombrep | nombrepr---------------------+-------------+-----------+------------------------ADMINISTRACION | GONZALEZ | JOAQUIN | ReorganizacionADMINISTRACION | JABBAR | AHMED | ReorganizacionADMINISTRACION | ORTEGA | JAIME | ReorganizacionADMINISTRACION | VALDEZ | JAZMIN | ReorganizacionADMINISTRACION | ZAPATA | ALICIA | ReorganizacionCONTABILIDAD | CORONA | CARMEN | Implementacion SAPCONTABILIDAD | GOMEZ | LUZ | Implementacion SAPCONTABILIDAD | SANTANA | MIGUEL | Implementacion SAPCONTABILIDAD | SANTANA | RODRIGO | Implementacion SAPDIRECCION | ANDERSON | MARTIN | Reestructuracion........................................

    PRODUCCION | VAZQUEZ | SALVADOR | ProductoZPRODUCCION | VAZQUEZ | SALVADOR | ProductoYPRODUCCION | ZAMBRANO | ANGEL | ProductoXPRODUCCION | ZAMBRANO | ANGEL | ProductoZPRODUCCION | ZAMBRANO | ANGEL | ProductoY103 filas)

    CONSULTA 5.22Listar los nombres de pila de empleados que no se encuentran en la tabla de dependientes.

    (SELECT nombrepFROM compania.empleadoUNIONSELECT nombre_dependienteFROM compania.dependiente)EXCEPTSELECT nombre_dependienteFROM compania.dependiente;

    nombrep-----------AHMEDCARMENCORNELIO

  • 51

    DANIEL............PABLORAFAELRUBENTERESA(23 filas)

  • 52

    6. FUNCIONES AGREGADAS

    CONSULTA 6.1Las funciones agregadas se utilizan para efectuar cálculos a partir de los datos numéricos de las “columnas devueltas” por una sentencia SELECT. Básicamente resumen los resultados de una columna particular de ciertos datos seleccionados. Por ejemplo: devolver el promedio de todos los salarios de compania.empleado.

    SELECT AVG(salario)FROM compania.empleado;

    avg--------------------23642.857142857143(1 fila)

    Su equivalente en algebra relacional: ℑ AVG(salario) (EMPLEADO)A continuación una lista de las funciones agregadas más comunes:

    MIN Regresa el valor mínimo en una columna dadaMAX Regresa el valor máximo en una columna dadaSUM Regresa la suma de los valores numéricos en una columna dadaAVG Regresa el valor promedio de una columna dadaCOUNT Regresa el número total de valores en una columna dadaCOUNT(*) Regresa el número de filas en una columna dada

    CONSULTA 6.2La siguiente sentencia devolverá el número de filas de la tabla compania.empleado.

    SELECT count(*) AS “Num. Empleados”FROM compania.empleado;

    Num. Empleados---------------- 56(1 fila)

    Su equivalente en algebra relacional: ℑ COUNT(*) (EMPLEADO)

  • 53

    Como se mencionó en la consulta 4.17, la cláusula AS permite cambiar el nombre a una columna resultante. No es necesario utilizar comillas en el nombre, a menos que se quiera incluir espacios en blanco. Útil cuando queremos que el nombre de la columna calculada sea más descriptivo.

  • 54

    CONSULTA 6.3Obtener la suma de los salarios de todos los empleados, el salario máximo, el salario mínimo y el salario medio.

    SELECT SUM(salario), MAX(salario), MIN(salario), AVG(salario)FROM compania.empleado;

    sum | max | min | avg------------+----------+----------+--------------------1324000.00 | 55000.00 | 11000.00 | 23642.857142857143

    (1 fila)

    Su equivalente en algebra relacional:ℑ SUMA(salario), MAXIMO(salario), MINIMO(salario) (EMPLEADO)CONSULTA 6.4Obtener la suma de los salarios de todos los empleados del departamento ‘INVESTIGACION’, así como el salario máximo, el mínimo y el medio en dicho departamento.

    SELECT SUM(salario), MAX(salario), MIN(salario), AVG(salario)FROM compania.empleado, compania.departamentoWHERE nd=numerod AND nombred=’INVESTIGACION’;

    sum | max | min | avg-----------+----------+----------+--------------------254000.00 | 45000.00 | 17000.00 | 28222.222222222222

    (1 fila)

    CONSULTA 6.5Obtener el total de empleados de la compañía.

    SELECT COUNT(*)FROM compania.empleado;

    count------- 56(1 fila)

    CONSULTA 6.6Obtener el número de empleados del departamento ‘INVESTIGACION’.

  • 55

    SELECT COUNT(*)FROM compania.empleado, compania.departamentoWHERE nd=numerod AND nombred=’INVESTIGACION’;

    count------- 9(1 fila)

  • 56

    CONSULTA 6.7Contar el número de valores de salario distintos de la base de datos.

    SELECT COUNT(DISTINCT salario)FROM compania.empleado;

    count------- 25(1 fila)

    CONSULTA 6.8La cláusula GROUP BY se utiliza para agrupar los resultados obtenidos al aplicar una o más funciones agregadas. Por ejemplo: para cada departamento obtener el número de departamento, el número de empleados de ese departamento y el salario medio.

    SELECT nd, COUNT(*), AVG(salario)FROM compania.empleadoGROUP BY nd;

    nd | count | avg----+-------+-------------------- 7 | 8 | 23375.000000000000 6 | 7 | 19857.142857142857 5 | 9 | 28222.222222222222 4 | 5 | 27800.000000000000 3 | 19 | 21000.000000000000 2 | 4 | 20750.000000000000 1 | 4 | 30750.000000000000(7 filas)

    Las columnas referidas en la cláusula GROUP BY deben estar también en la cláusula SELECT, además de las funciones agregadas.

  • 57

    CONSULTA 6.9Para cada proyecto obtener el número y el nombre del proyecto, así como el número de empleados que trabajan en él.

    SELECT numerop, nombrepr, COUNT(*)FROM compania.proyecto, compania.trabaja_enWHERE numerop=numpGROUP BY numerop, nombrepr;

    numerop | nombrepr | count---------+------------------------+------- 30 | Prestaciones | 7 1 | ProductoX | 11 10 | Automatizacion | 9 3 | ProductoZ | 19 50 | Reestructuracion | 4 90 | Reciclaje y Reuso | 8 2 | ProductoY | 19 20 | Reorganizacion | 5 60 | Implementacion SAP | 4 70 | Impactos Ambientales | 8 80 | Otimizacion de Insumos | 9(11 filas)

    CONSULTA 6.10La cláusula HAVING permite filtrar el resultado de un agrupamiento. Para cada proyecto en el que trabajen más de 10 empleados, obtener el número y el nombre del proyecto, así como el número de empleados que trabajan en él.

    SELECT numerop, nombrepr, COUNT(*)FROM compania.proyecto, compania.trabaja_enWHERE numerop=numpGROUP BY numerop, nombreprHAVING COUNT(*)>10;

    numerop | nombrepr | count---------+-----------+------- 1 | ProductoX | 11 3 | ProductoZ | 19 2 | ProductoY | 19(3 filas)

    Se debe tener cuidado al usar HAVING pues se suele confundir su uso con el de WHERE. Mientras WHERE filtra la información antes de efectuar el agrupamiento, HAVING lo hace sobre los resultados ya agrupados. Así, el orden de ejecución en la consulta anterior es: FROM WHERE SELECT GROUP BY HAVING.

  • 58

  • 59

    CONSULTA 6.11Para cada proyecto obtener el número y el nombre del proyecto, así como el número de empleados del departamento 5 que trabajan en el proyecto.

    SELECT numerop, nombrepr, COUNT(*)FROM compania.proyecto, compania.trabaja_en, compania.empleadoWHERE numerop=nump AND nss=nsse AND nd=5GROUP BY numerop, nombrepr;

    numerop | nombrepr | count---------+------------------------+------- 10 | Automatizacion | 9 80 | Otimizacion de Insumos | 9(2 filas)

    CONSULTA 6.12Listar los nombres de los empleados que tienen 2 o más dependientes:

    SELECT nombrep,apellido, COUNT(nombre_dependiente) AS num_hijosFROM compania.empleado, compania.dependienteWHERE nsse=nssGROUP BY nombrep,apellidoHAVING COUNT(nombre_dependiente)>=2;

    nombrep | apellido | num_hijos-----------+-------------+-----------LORENA | HERRERA | 2LORENZO | BARRAGAN | 4MIGUEL | SANTANA | 5PEDRO | MACIAS | 2

    ......

    ......

    ISABEL | JIMENEZ | 3MARIO | PADILLA | 3MARTIN | ANDERSON | 2MARIA | HERNANDEZ | 2

    (29 filas)

  • 60

    7. REUNIONES “ANSI” (JOINS)

    Aunque las reuniones resueltas en las dos anteriores secciones generalmente funcionan, el comité de ANSI SQL recomienda el uso de la instrucción JOIN en lugar de efectuar un producto cartesiano seguido de una selección. La razón es que esta última combinación suele requerir más recursos al momento de implementarla en un motor de bases de datos comercial. Imaginemos tan solo el tener que calcular un producto cartesiano de 2 tablas con 10,000 registros y 20 columnas cada una. Dicho producto cartesiano produciría una tabla de 4 mil millones de registros. Supongamos ahora que mediante la combinación de una selección y una proyección obtenemos el resultado deseado en una tabla de 20 registros y 3 columnas. Obviamente que el costo es grande. El uso de la instrucción JOIN permite al motor abreviar recursos debido a la implementación de complejos algoritmos que alivian la carga en el uso de memoria y espacio temporal en disco.

    CONSULTA 7.1Obtener el nombre y la dirección de todos los empleados que pertenecen al departamento ‘Investigación’ (consulta 5.5):El ejemplo anterior se puede resolver mediante una reunión interna INNER JOIN (por ser el tipo JOIN más común se puede abreviar a simplemente JOIN):

    SELECT nombrep, apellido, direccionFROM compania.empleadoJOIN compania.departamentoON numerod = ndWHERE nombred = ‘INVESTIGACION’;

    nombrep | apellido | direccion----------+-----------+------------------RAMON | NIETO | Independencia 35CORNELIO | REYES | Laureles 2745RAFAEL | SALGADO | Camichines 1763MARISA | RAZO | Rumorosa 35FEDERICO | VIZCARRA | Valle 638MARIO | PADILLA | Aldama 765HUGO | GOMEZ | Americas 739MARIA | HERNANDEZ | Allende 345JOSEFA | ESPARZA | Cancion 1450

    (9 filas)

    Su equivalente en algebra relacional:

    nombrep,apellido,direccion(nombred=’INVESTIGACION’ (EMPLEADO⋈ numerod=nd DEPARTAMENTO))

  • 61

    CONSULTA 7.2Encontrar el número de horas que cada trabajador dedica a cada proyecto (la consulta 5.2):

    SELECT nsse, nombrepr, horasFROM compania.proyectoON compania.trabaja_enWHERE nump=numerop;

    nsse | nombrepr | horas-----------+------------------------+-------592745726 | Reestructuracion | 40.0482948739 | Reestructuracion | 40.0834572889 | Reestructuracion | 40.0888665555 | Reestructuracion | 40.0156675267 | Implementacion SAP | 40.0

    .........

    .........

    459827165 | Reciclaje y Reuso | 24.0348726591 | Reciclaje y Reuso | 21.0487261987 | Reciclaje y Reuso | 17.0675645340 | Reciclaje y Reuso | 11.0

    (103 filas)

    CONSULTA 7.3Obtener el nombre y la dirección de todos los empleados que pertenecen al departamento ‘Investigación’ (la consulta 5.5):

    SELECT nombrep, apellido, direccionFROM compania.empleadoJOIN compania.departamentoON numerod = ndWHERE nombred = ‘INVESTIGACION’;

    nombrep | apellido | direccion----------+-----------+------------------RAMON | NIETO | Independencia 35JOSEFA | ESPARZA | Cancion 1450HUGO | GOMEZ | Americas 739MARIA | HERNANDEZ | Allende 345MARIO | PADILLA | Aldama 765CORNELIO | REYES | Laureles 2745RAFAEL | SALGADO | Camichines 1763MARISA | RAZO | Rumorosa 35FEDERICO | VIZCARRA | Valle 638

  • 62

    (9 filas)

    Su equivalente en algebra relacional:

    nombrep,apellido,direccion(nombred=’INVESTIGACION’ (DEPARTAMENTO⋈ nd=numerod EMPLEADO))Como se aprecia, en la cláusula WHERE se establece una condición de selección (nombred=’Investigación’) mientras que en la cláusula ON se especifica una condición de reunión (numerod=nd).

    CONSULTA 7.4La consulta 5.12 pero con JOIN’s:

    SELECT numerop, numd, apellido, direccion, fechanFROM compania.empleadoJOIN compania.departamentoON nss=nssgteJOIN compania.proyectoON numd = numerodWHERE lugarp = ‘Guadalajara’;

    numerop | numd | apellido | direccion | fechan---------+------+----------+---------------------------+------------ 3 | 3 | JIMENEZ | Juarez 245 | 1977-06-08 30 | 6 | GONZALEZ | Paseo de los Orfebres 854 | 1966-07-01(2 filas)

    Su equivalente en algebra relacional:

    numerop, numd, apellido, direccion, fechan( lugarp=’Guadalajara’ (PROYECTO⋈ numd=numerod (DEPARTAMENTO⋈ nssgte=nss (EMPLEADO))))

    CONSULTA 7.5Obtener los nombres de los gerentes que tienen por lo menos un dependiente:

    SELECT DISTINCT nombrep, apellidoFROM compania.empleadoJOIN compania.departamentoON nss=nssgteJOIN compania.dependienteON nssgte=nsse;

    nombrep | apellido----------+----------

  • 63

    FEDERICO | VIZCARRAISABEL | JIMENEZJAIME | BOTELLOJAZMIN | VALDEZJOAQUIN | GONZALEZJOSE | SILVALUZ | GOMEZPATRICIA | GONZALEZ

    (8 filas)

  • 64

    CONSULTA 7.6Obtener el nombre de todos los empleados que tienen un dependiente con el mismo nombre de pila y sexo que el empleado (la consulta 5.19):

    SELECT e.nombrep, e.apellidoFROM compania.empleado AS e JOIN compania.dependiente AS dON e.nss = d.nsseWHERE e.nombrep = d.nombre_dependiente AND e.sexo = d.sexo;

    nombrep | apellido-----------+-----------MARISA | RAZOPEDRO | MACIASRODRIGO | SANTANAINES | SANTOYOGUILLERMO | BARBAANGEL | ZAMBRANOMARIO | PADILLAADRIANA | TORRESJUAN | GONZALEZMARIA | HERNANDEZJULIAN | SOSAISABEL | JIMENEZ

    (12 filas)

    CONSULTA 7.7Para cada empleado, obtener su nombre de pila y apellido y el nombre de pila y apellido de su supervisor inmediato (la consulta 5.10):

    SELECT e.nombrep as nombre_empleado, e.apellido as apellido_empleado, s.nombrep as nombre_supervisor, e.apellido as apellido_supervisorFROM compania.empleado eJOIN compania.empleado sON e.nsssuper = s.nss;

    nombre_empleado | apellido_empleado | nombre_supervisor | apellido_supervisor-----------------+-------------------+-------------------+---------------------JOAQUIN | GONZALEZ | JAZMIN | GONZALEZGUSTAVO | ALVAREZ | ISABEL | ALVAREZINES | SANTOYO | PATRICIA | SANTOYORAMON | NIETO | FEDERICO | NIETOGUILLERMO | BARBA | ENRIQUE | BARBA

    ......

    ......

  • 65

    MARTHA | ORTEGA | GUSTAVO | ORTEGAISABEL | RODRIGUEZ | JOSE | RODRIGUEZPATRICIA | BERMUDEZ | FERNANDA | BERMUDEZFERNANDO | ROBLEDO | JOSE | ROBLEDOLUIS | ROBLES | GUSTAVO | ROBLES

    (49 filas)

  • 66

    CONSULTA 7.8Para cada proyecto obtener el número y el nombre del proyecto, así como el número de empleados que trabajan en él (la consulta 6.9):

    SELECT numerop, nombrepr, COUNT(*)FROM compania.proyectoJOIN compania.trabaja_enON numerop=numpGROUP BY numerop, nombrepr;

    numerop | nombrepr | count---------+------------------------+------- 30 | Prestaciones | 7 1 | ProductoX | 11 10 | Automatizacion | 9 3 | ProductoZ | 19 50 | Reestructuracion | 4 90 | Reciclaje y Reuso | 8 2 | ProductoY | 19 20 | Reorganizacion | 5 60 | Implementacion SAP | 4 70 | Impactos Ambientales | 8 80 | Otimizacion de Insumos | 9(11 filas)

    CONSULTA 7.9Obtener la suma de los salarios de todos los empleados del departamento ‘INVESTIGACION’, así como el salario máximo, el mínimo y el medio en dicho departamento (la consulta 6.4):

    SELECT SUM(salario), MAX(salario), MIN(salario), AVG(salario)FROM compania.empleadoJOIN compania.departamentoON nd=numerodWHERE nombred=’INVESTIGACION’;

    sum | max | min | avg-----------+----------+----------+--------------------254000.00 | 45000.00 | 17000.00 | 28222.222222222222

    (1 fila)

    CONSULTA 7.10Obtener el número de empleados del departamento ‘INVESTIGACION’ (la consulta 6.6):

  • 67

    SELECT COUNT(*)FROM compania.empleadoJOIN compania.departamentoON nd=numerodWHERE nombred=’INVESTIGACION’;

    count------- 9(1 fila)

    CONSULTA 7.11Para cada proyecto en el que trabajen más de 10 empleados, obtener el número y el nombre del proyecto, así como el número de empleados que trabajan en él (la consulta 6.10):

    SELECT numerop, nombrepr, COUNT(*)FROM compania.proyectoJOIN compania.trabaja_enON numerop=numpGROUP BY numerop, nombreprHAVING COUNT(*)>10;

    numerop | nombrepr | count---------+-----------+------- 1 | ProductoX | 11 3 | ProductoZ | 19 2 | ProductoY | 19(3 filas)

    CONSULTA 7.12Para cada proyecto obtener el número y el nombre del proyecto, así como el número de empleados del departamento 5 que trabajan en el proyecto (la consulta 6.11):

    SELECT numerop, nombrepr, COUNT(*)FROM compania.proyectoJOIN compania.trabaja_enON numerop=numpJOIN compania.empleadoON nss=nsseWHERE nd=5GROUP BY numerop, nombrepr;

    numerop | nombrepr | count

  • 68

    ---------+------------------------+------- 10 | Automatizacion | 9 80 | Otimizacion de Insumos | 9(2 filas)

  • 69

    CONSULTA 7.13Listar los nombres de los empleados que tienen 2 o más dependientes (la consulta 6.12):

    SELECT nombrep,apellido, COUNT(nombre_dependiente) AS num_hijosFROM compania.empleadoJOIN compania.dependienteON nsse=nssGROUP BY nombrep,apellidoHAVING COUNT(nombre_dependiente)>=2;

    nombrep | apellido | num_hijos-----------+-------------+-----------LORENA | HERRERA | 2LORENZO | BARRAGAN | 4MIGUEL | SANTANA | 5PEDRO | MACIAS | 2

    ......

    ......

    ISABEL | JIMENEZ | 3MARIO | PADILLA | 3MARTIN | ANDERSON | 2MARIA | HERNANDEZ | 2

    (29 filas)

    CONSULTA 7.14Mostrar los salarios resultantes si cada empleado que trabaja en el proyecto ‘ProductoX’ recibe un aumento del 10% (la consulta 5.20):

    SELECT nombrep, apellido, 1.1*salarioFROM compania.empleadoJOIN compania.trabaja_enON nss=nsseJOIN compania.proyectoON nump=numeropWHERE nombrepr=’ProductoX’;

    nombrep | apellido | ?column?-----------+-------------+-----------ISABEL | JIMENEZ | 57200.000GUADALUPE | GALINDO | 15400.000MARTHA | ORTEGA | 16500.000ESTHER | SERRANO | 17600.000FERNANDA | GUTIERREZ | 33000.000ANGEL | ZAMBRANO | 20900.000

  • 70

    PABLO | CASARRUBIAS | 18700.000GUSTAVO | ALVAREZ | 33000.000LUIS | ROBLES | 14300.000JAVIER | LOPEZ | 33000.000LORENA | HERRERA | 23100.000

    (11 filas)

    Nótese la diferencia entre esta consulta y la 5.20. Aunque ambas devuelven el mismo resultado, la última es mucho más clara, pues separa las condiciones de reunión y selección en las cláusulas ON y WHERE.

  • 71

    CONSULTA 7.15Encontrar el nombre de todo empleado que sea en este momento gerente de algún departamento,el número de departamento y fecha en que tomó el puesto.

    SELECT nombred, fechainicgte, nombrep,apellidoFROM compania.departamentoRIGHT JOIN compania.empleadoON empleado.nss=departamento.nssgte;

    nombred | fechainicgte | nombrep | apellido----------------------+--------------+-----------+-------------EJEMPLO | 2000-10-03 | JOAQUIN | GONZALEZ

    | | GUSTAVO | ALVAREZ | | INES | SANTOYO | | RAMON | NIETODIRECCION | 1971-06-19 | JAIME | BOTELLO

    | | GUILLERMO | BARBAESTUDIOS AMBIENTALES | 2000-05-11 | JOSE | SILVA

    | | SALVADOR | VAZQUEZ | | CORNELIO | REYES | | LORENA | HERRERA | | RAFAEL | SALGADO | | MARISA | RAZO | | JORGE | FLORES | | JAVIER | MERCADO | | ALICIA | ZAPATA | | GUADALUPE | GALINDO | | FRANCISCO | ALCALA | | PEDRO | MACIAS | | IRMA | GALLEGOSINVESTIGACION | 1978-05-22 | FEDERICO | VIZCARRA

    | | GERARDO | CEJA | | JAIME | ORTEGA | | CARMEN | CORONAPRODUCCION | 2005-10-25 | ISABEL | JIMENEZ

    | | MIGUEL | SANTANA | | RODRIGO | SANTANA | | GRISELDA | JIMENEZ | | RICARDO | FERRERO | | TERESA | MADRIGAL | | JAVIER | LOPEZ | | AHMED | JABBAR | | ENRIQUE | RAMOSPERSONAL | 2006-01-01 | PATRICIA | GONZALEZ

    | | MARIO | PADILLA | | JUAN | GONZALEZ | | LORENZO | BARRAGAN

  • 72

    | | ESTHER | SERRANO | | HUGO | GOMEZ | | JULIAN | SOSA | | RUBEN | SANCHEZ | | FERNANDA | GUTIERREZCONTABILIDAD | 2004-03-20 | LUZ | GOMEZ

    | | MARIA | HERNANDEZ | | MARTIN | ANDERSON | | ADRIANA | TORRES | | ANGEL | ZAMBRANO | | PABLO | CASARRUBIAS | | DANIEL | VAZQUEZ | | JOSEFA | ESPARZA | | LETICIA | RAMIREZ | | MARTHA | ORTEGA | | ISABEL | RODRIGUEZ | | PATRICIA | BERMUDEZADMINISTRACION | 1985-07-01 | JAZMIN | VALDEZ

    | | FERNANDO | ROBLEDO | | LUIS | ROBLES(56 filas)

    CONSULTA 7.16Para cada empleado, obtener su nombre de pila y apellido y el nombre de pila y apellido de su supervisor inmediato.

    SELECT e.apellido as a_empleado, e.nombrep as nom_empleado, s.apellido as a_supervisor, s.nombrep as nom_supervisorFROM compania.empleado eLEFT JOIN compania.empleado sON e.nsssuper=s.nss;

    a_empleado | nom_empleado | a_supervisor | nom_supe-------------+--------------+--------------+---------GONZALEZ |