Está en la página 1de 30

INTRODUCCIN: EL LENGUAJE DE CONSULTA SQL..............................................................................3 LENGUAJE DE DEFINICIN DE DATOS (SQL ESTTICO).......................................................................3 CREATE TABLE.......................................................................................................................................................

3
Ejemplo........................................................................................................................................................................4

CREATE DOMAIN...................................................................................................................................................5 CREATE ASSERTION..............................................................................................................................................5


Ejemplo........................................................................................................................................................................5 Ejemplo........................................................................................................................................................................5

CREATE VIEW..........................................................................................................................................................5 CREATE INDEX .......................................................................................................................................................6


Ejemplo........................................................................................................................................................................6 Ejemplo........................................................................................................................................................................6

CREATE SYNONYM...............................................................................................................................................6 ALTER TABLE (SQL DE DB2).................................................................................................................................7


Ejemplo........................................................................................................................................................................7

DROP TABLE (SQL DE DB2)...................................................................................................................................7 DROP VIEW (SQL DE DB2).....................................................................................................................................7


Ejemplo........................................................................................................................................................................7 Ejemplo........................................................................................................................................................................7

DROP INDEX (SQL DE DB2)...................................................................................................................................7 DROP SYNONYM....................................................................................................................................................8 LENGUAJE DE MANIPULACIN DE DATOS (SQL DINMICO)..............................................................8 SELECT......................................................................................................................................................................8 Clusula GROUP BY (agrupar por)..............................................................................................................9 Clusula HAVING (con).................................................................................................................................9
Ejemplo........................................................................................................................................................................9 Ejemplo........................................................................................................................................................................9 Ejemplo........................................................................................................................................................................7

Clusula ORDER BY(Ordenar por).............................................................................................................10 SELECTINTO......................................................................................................................................................10


Ejemplo......................................................................................................................................................................10

UPDATE...................................................................................................................................................................11 DELETE....................................................................................................................................................................11 INSERT.....................................................................................................................................................................12


Ejemplos....................................................................................................................................................................12

FUNCIONES DE AGREGADOS (DE COLUMNAS)........................................................................................12 FUNCIN AVG (MEDIA ARITMTICA ).............................................................................................................................13 FUNCIN COUNT (CUENTA)........................................................................................................................................13
Ejemplo......................................................................................................................................................................13 Ejemplos....................................................................................................................................................................13

FUNCIN MAX............................................................................................................................................................14 FUNCIN MIN.............................................................................................................................................................14


Ejemplos....................................................................................................................................................................14 Ejemplos....................................................................................................................................................................14

FUNCIN SUM............................................................................................................................................................14
Ejemplos....................................................................................................................................................................15

TIPOS DE DATOS EN SQL....................................................................................................................................15


TIPO................................................................................................................................................................15

SQL3:EL NUEVO SQL.............................................................................................................................................17 PARTE 1: MARCO DE TRABAJO ........................................................................................................................................17 PARTE 2: FUNDACIN...................................................................................................................................................17 PARTE 3:SQL/CLI ....................................................................................................................................................17 PARTE 4: SQL/PSM (PERSISTENT STORED MODULES )..................................................................................................18
Extensiones para lenguaje procedural ......................................................................................................................18 Procedimientos almacenados y mltiples instrucciones..........................................................................................18 Procedimientos externos y llamadas a procedimientos............................................................................................18

PARTE 5: SQL/BINDINGS..............................................................................................................................................18 PARTE 6: SQL/XA......................................................................................................................................................18 Apuntes de SQL Pg. 1

PARTE 7:SQL/TEMPORAL ............................................................................................................................................19 SQL/MM (MULTIMEDIA )............................................................................................................................................19 EJERCICIOS DE SQL RESUELTOS...................................................................................................................20


Creacin de tablas.....................................................................................................................................20 Solucin.....................................................................................................................................................................20 Consultas simples................................................................................................................................21 Consultas de reunin (con filtrado WHERE) ....................................................................................21 SELECT * FROM PIEZAS WHERE P_NOMBRE LIKE 'B*';...............................................................................23 SELECT * FROM PROVEEDORES WHERE SITUACION < (SELECT MAX(SITUACION) AS MAXIMO FROM PROVEEDORES);............................................................................................................................................24 UPDATE PIEZAS SET COLOR='AMARILLO',PESO=PESO+5,P_CIUDAD='CUBA' WHERE P_CODIGO='P2';...........................................................................................................................................................26

EJERCICIOS PROPUESTOS.................................................................................................................................27
Creacin de la base de datos y las tablas en MySQL.......................................................................27 Consultas sencillas...............................................................................................................................28 Consultas con varias tablas.................................................................................................................28 Funciones de agregados (COUNT, SUM, etc)..................................................................................29 Consultas diversas...............................................................................................................................29 Subconsultas(SELECT dentro de SELECT)......................................................................................29 Exists....................................................................................................................................................30 Union....................................................................................................................................................30 Operaciones de actualizacin..............................................................................................................30

Apuntes de SQL Pg. 2

INTRODUCCIN: EL LENGUAJE DE CONSULTA SQL.


La mayor parte de BD actuales son relacionales, mas especficamente sistemas SQL. La primera definicin del SQL cuyo nombre original era SEQUEL fue realizada por Chamberlain y otros de IBM en el Research Laboratory de San Jos. La aplicacin prctica construida a partir de esta definicin se llam System R. Finalmente el ANSI y la ISO tomaron el SQL como norma y lo definieron como un standard. El SQL tiene dos partes bien diferenciadas: las sentencias que se utilizan par definir los datos que se denominan LDD y las que se emplean para manipularlos que se denominan LMD. En este capitulo se ver el SQL (ISO 9075 DE 1992). Todos los sistemas relacionales actuales utilizan dicho lenguaje con algunas modificaciones o aadidos. Por tanto en este tema estudiaremos este lenguaje.

LENGUAJE DE DEFINICIN DE DATOS (SQL esttico).


Esta constituido bsicamente por las siguientes sentencias: CREATE TABLE, CREATE VIEW, CREATE DOMAIN, CREATE ASSERTION, CREATE INDEX, ALTER TABLE, DROP TABLE, DROP VIEW, DROP INDEX. En los siguientes apartados describiremos el lenguaje SQL empleando la notacin BNF extendida. Esta notacin utiliza unos smbolos que no son propios del SQL y cuyo significado es el siguiente: [] | <> {} ::= Indican opcionalidad. Lo que se site dentro de los corchetes puede o no escribirse. Indica una alternativa. Se debe elegir entre lo que hay a la derecha de la barra o la izquierda. Lo que hay entre estos corchetes es un smbolo no terminal, es decir que requiere definicin. Lo que hay a la izquierda de los puntos suspensivos puede repetirse cero o ms veces. Agrupa elementos Este smbolo se emplea para definir .

En la descripcin de las instrucciones de SQL todos los smbolos escritos en negrita se consideran terminales y por tanto propios del SQL. CREATE TABLE. Se emplea para crear una tabla de la base de datos. Esta instruccin la tienen todos los SGBD relacionales aunque con modificaciones respecto de la SQL ISO-92

CREATE [ {GLOBAL | LOCAL} TEMPORARY] TABLE <nombre de tabla>


Apuntes de SQL Pg. 3

( <definicin de columna> | <definicin de restriccin de tabla>[, <definicin de columna> | <definicin de restriccin de tabla>]);

<definicin de columna> ::= <nombre columna>{<tipo de dato>|<nombre dominio>} [<clusula de defecto>] [<restriccin de columna>] <tipo de dato>::= CHAR[ACTER] | SMALLINT | INTEGER | DECIMAL | NUMERIC
| REAL | FLOAT | DOUBLE PRECISION | CHARACTER VARYING | DATE | TIME | BIT | TIMESTAMP | INTERVAL | BIT VARYING

<clusula de defecto>::= DEFAULT {<literal>|<funcin de valor tiempo/fecha> | USER | SYSTEM | NULL } <restriccin de columna>::= NOT NULL | <especificacin de unicidad> |

<especificacin de referencia> | <restriccin de verificacin>

<especificacin de unicidad>::= UNIQUE | PRIMARY KEY (<nombre columna> [, <nombre columna>] ) NOTA: UNIQUE se emplea para especificar las claves alternativas FOREIGN KEY (<nombre columna> [, <nombre columna>] ) REFERENCES <nombre tabla> [ (<nombre columna> [, <nombre columna>] ) ] [ { ON UPDATE | ON DELETE } CASCADE | SET NULL | SET DEFAULT ] <especificacin de referencia>::= <restriccin de verificacin>::= CHECK (<condicin de bsqueda>) NOTA: se utiliza para expresar una condicin que deben cumplir un conjunto de atributos de la tabla <definicin de restriccin de tabla>::= [<nombre de definicin de restriccin>] Ejemplo
CREATE TABLE PROFESOR ( Cod_profe Char(5) PRIMARY KEY, Nombre Char(15) NOT NULL, DNI Int NOT NULL, Direccin Char(25) NOT NULL, Materia Char(10), Tipo Char NOT NULL, Cd_profe_e Char(5), Cd_area Char(5), NOT NULL, Catedrtico Bit, FOREIGN KEY (Cd_profe_e) REFERENCES PROFESOR ON UPDATE CASCADE, FOREIGN KEY (Cd_area) REFERENCES AREA ON UPDATE CASCADE, Apuntes de SQL Pg. 4 <especificacin de unicidad> | <especificacin de referencia> | <restriccin de verificacin>

CHECK( ( (Cd_prof_e = NULL) And (Catedrtico =1)) NULL) And (Catedrtico =0)) CHECK (Cd_profe <> Cd_profe_e) );

Or

((Cd_prof_e = NOT

CREATE DOMAIN Se utiliza para crear un dominio, es decir un conjunto de valores que puede tomar un atributo o campo de una tabla. Es algo parecido a los tipos de datos definidos por el usuario en los lenguajes de programacin. Esta instruccin no la soportan actualmente todos los SGBD, por ejemplo no la soporta Oracle ni SQLbase. CREATE DOMAIN <nombre de dominio> [AS] <tipo de dato> [<clusula de defecto>] [<restriccin de dominio>] <restriccin de dominio>::= [CONSTRAINT <nombre de restriccin>] <restriccin de verificacin> [<atributos de restriccin>] <atributos de restriccin>::= {INITIALLY DEFERRED | INITIALLY INMEDIATE} [[NOT] DEFERRABLE] |
[NOT] DEFERRABLE] {INITIALLY DEFERRED | INITIALLY INMEDIATE}

Ejemplo CREATE DOMAIN C_PER CREATE DOMAIN C_BECA

Char(5); Char(5);

CREATE ASSERTION Se utiliza para establecer restricciones en la base de datos. Por ejemplo para que el sistema compruebe las cardinalidades mnimas o las condiciones que deben cumplir un conjunto de atributos pertenecientes a varias tablas. No est disponible en todos los SGBD CREATE ASSERTION <nombre de asercin><restriccin de verificacin> [<atributos de asercin>] Ejemplo Suponemos una base de datos que recoge informacin de cursos impartidos por profesores. Entonces para indicar al sistema que cada curso puede ser impartido por menos de cuatro profesores escribiramos, una vez creadas las tablas de la base de datos:
CREATE ASSERTION Profesor_curso CHECK NOT EXIST ( SELECT COUNT(*) FROM IMPARTE GROUP BY COD_CURSO HAVING COUNT(*)>=4)

CREATE VIEW Crea una vista de una tabla. Una vista es una tabla virtual que no se sustenta en sus propios datos almacenados y separados fsicamente. Lo que se almacena es la definicin de la vista en trminos de otras tablas en el diccionario de datos del sistema. CREATE VIEW <nombre de tabla> [(<nombre de columna> [,<nombre de columna>])
Apuntes de SQL Pg. 5

AS <expresin de consulta> [WITH CHECK OPTION] La clusula WITH CHECK OPTION indica que las operaciones de modificacin e insercin realizadas con la vista deben verificarse para garantizar que toda fila modificada o insertada cumpla la condicin definida en <expresin de consulta>. Ejemplo CREATE VIEW Buenos_proveedores AS SELECT S#, SITUACION, CIUDAD FROM PROVEEDORES WHERE SITUACION>15 WITH CHECK OPTION; Esto define una vista de la tabla PROVEEDORES denominada Buenos_proveedores de la cual slo se muestran filas compuestas por los campos S#, SITUACION, CIUDAD donde SITUACION>15. Cada vez que se intente modificar o introducir una fila en la tabla de proveedores a travs de esta vista se comprobar si el campo SITUACION tiene un valor mayor de 15 denegndose la operacin en caso contrario . CREATE INDEX Esta sentencia no forma parte del estndar SQL92 sin embargo la incluyen la mayora de los SGBD tales como Oracle, Informix, SQLServer, DB2, Access. En concreto aqu veremos la del SQL de DB2. Nos permite crear un ndice para una tabla basado en una o varias de sus columnas. CREATE [UNIQUE] INDEX <nombre de ndice> ON <nombre de tabla> (<nombre de columna> [ASC | DESC] [,<nombre de columna> [ASC | DESC]]) [CLUSTER] La clusula CLUSTER indica que se trata de un ndice de agrupamiento, es decir que el sistema sita los registros relacionados de forma lgica lo ms prximos posibles unos de otros en el soporte. La clusula UNIQUE se emplea para indicar que no se permite que dos registros de la tabla indicada tengan el mismo valor en el campo o combinacin de campos ndices. Esto sirve para que se cumpla la unicidad de las claves primarias en el sistema DB2. Ejemplo CREATE UNIQUE INDEX XS ON PROVEEDORES (S#); CREATE UNIQUE INDEX XP ON PIEZAS (P#) CLUSTER; CREATE SYNONYM Esta sentencia no forma parte del estndar SQL92 sin embargo la incorporan la mayora de las implementaciones. Crea un nombre de alias para una tabla o vista. El alias puede ser til para proporcionar un nombre corto para un nombre de tabla largo o para tratar la tabla a travs de su alias como si fuese una copia lo cual nos puede servir para unir una tabla consigo misma. CREATE SYNONYM <nombre de sinnimo> FOR {<nombre de tabla>|<nombre de vista}
Apuntes de SQL Pg. 6

Ejemplo CREATE SYNONYM CLIE FOR PROD.CLIE; ALTER TABLE (SQL de DB2) Esta sentencia no forma parte del SQL92 sin embargo la contemplan la mayora de los sistemas comerciales. Aade nuevas columnas a una tabla existente. ALTER TABLE <nombre de tabla> ADD <nombre de columna><tipo de dato> [NULL | NOT NULL] Ejemplo ALTER TABLE PROVEEDORES ADD DESCUENTO SMALLINT;

DROP TABLE (SQL de DB2) Esta sentencia no forma parte del estndar SQL92 aunque si la incluyen todas las implementaciones comerciales. Aqu veremos la sintaxis del sistema DB2. Esta instruccin destruye una tabla y todos sus ndices liberando el espacio que ocupaban. DROP TABLE <nombre de tabla> Ejemplo DROP TABLE CLIENTES; DROP VIEW (SQL de DB2) No forma parte del SQL92 aunque la incluyen todas las implementaciones comerciales. Esta sentencia elimina una vista. DROP VIEW <nombre de vista> Ejemplo DROP VIEW Buenos_proveedores; DROP INDEX (SQL de DB2) Destruye un ndice y libera el espacio ocupado por l. No forma parte del SQL92. DROP INDEX <nombre del ndice> Ejemplo DROP INDEX Cod_cliente;
Apuntes de SQL Pg. 7

DROP SYNONYM Destruye un sinnimo de una tabla o de una vista. No froma parte del SQL92. DROP SYNONONYM <nombre de sinnimo>

LENGUAJE DE MANIPULACIN DE DATOS (SQL dinmico)


En SQL92 la manipulacin de datos se hace bsicamente con las sentencias SELECT (seleccionar), UPDATE (actualizar), DELETE (borrar) e INSERT (insertar) que constituyen el lenguaje de manipulacin de datos bsico. SELECT Selecciona filas de una o ms tablas. <sentencia select>::= SELECT [ALL | DISTINCT ] <lista de seleccin> FROM { {<nombre de tabla> | <nombre de vista> } [<nombre de sinnimo>]}, [WHERE <condicin de bsqueda> ] [GROUP BY {<nombre de columna> | <nmero de columna>},] [HAVING <condicin de bsqueda>] [{INTERSECT | MINUS | UNION [ALL] } <sentencia select>] [[ORDER BY {{<nombre de columna | <nmero de columna>} [ASC | DESC] }, ] | [FOR UPDATE OF <nombre de columna>,]]
<lista de seleccin>::= {* | {<expresin> | <nombre de tabla>.<nombre de columna> | <nombre de columna> | <nombre de tabla>.* | <nombre de vista>.<nombre de columna> | <nombre de vista>.* | <nombre de sinonimo>.<nombre de columna> | <nombre de sinonimo>.*},}

La palabra clave DISTINCT indica que si existen filas idnticas, slo se mostrar una de ellas. Ejemplos SELECT S# FROM S WHERE Ciudad=PARIS AND Situacin > 20; SELECT S.*,P.* /*Selecciona todos los campos de las dos tablas S y P*/ FROM PROVEEDORES, PIEZAS WHERE PROVEEDORES.CIUDAD= PIEZAS.CIUDAD; >mostrar de la tabla de piezas el color y la ciudad de todas SELECT P_CIUDAD, COLOR (DISTINT) FROM PIEZAS ;

Apuntes de SQL Pg. 8

>mostrar las piezas rojas y verdes de una ciudad SELECT COLOR,P_CIUDAD FROM PIEZAS WHERE COLOR=VERDE OR COLOR=ROJO; Clusula GROUP BY (agrupar por) GROUP BY {<nombre de columna> | <nmero de columna>}, Esta clusula especifica las columnas usadas para formar grupos con las filas devueltas por la sentencia SELECT. Dentro de cada grupo todas las filas tienen el mismo valor en la o las columnas de GROUP BY. Si est precedida de la clusula WHERE el sistema agrupa las filas despus de aplicar la clusula WHERE. Todas las columnas de la <lista de seleccin> de la sentencia SELECT deben ser funciones de columna (AVG, COUNT, MAX, MIN, SUM) o formar parte de la clusula GROUP BY. Ejemplo Obtener la cantidad total suministrada de cada pieza SELECT P#, SUM(CANT) FROM SP GROUP BY P# Resultado: P# P1 P2 P3 P4 P5 P6 SUM(CANT) 600 1000 400 500 500 100

Tabla SP (P1, 100) (P1, 100) (P1, 100) (P1, 100) (P1, 100) (P1, 100)

Obsrvese que en la tabla de suministros SP a lo mejor hay seis filas de P1 coda una con una cantidad de 100 pero el resultado consiste en agruparlas por el cdigo de la pieza. Clusula HAVING (con) HAVING <condicin de bsqueda> Se utiliza para indicar que los grupos de filas agrupados por GROUP BY que se muestran deben cumplir la <condicin de bsqueda>. Por lo tanto si se especifica HAVING en una sentencia SELECT deber haberse especificado tambin GROUP BY o bien todas las columnas de la <lista de seleccin> de SELECT deben formarse con funciones de columna. HAVING es a los grupos lo que WHERE es a las filas.

Ejemplo Obtener los cdigos de las piezas que son suministradas por ms de un proveedor.
Apuntes de SQL Pg. 9

SELECT P# FROM SP GROUP BY P# HAVING COUNT(*) >1; Clusula ORDER BY(Ordenar por) ORDER BY {{<nombre de columna | nmero de columna>} [ASC | DESC], } Especifica el orden en que una sentencia SELECT devuelve las filas. Las filas se pueden ordenar por una columna de forma ascendente ASC o descendente DESC. Si se especifican ms de una columna en primer lugar se ordenan segn la primera columna especidicada y dentro de esta la segunda y dentro de la segunda la tercera y asi sucesivamente. Ejemplo Seleccionar los clientes cuya primera ficha de negocio fue 1988 y mostrarlos en orden ascendente por el cdigo postal: SELECT Nombre_Cliente, Direccin FROM CLIENTES WHERE Primera_fecha =1988 ORDER BY Cdigo_postal ASC; SELECTINTO Crea una tabla lgica de una fila a lo sumo y asigna los valores de las columnas de la fila a unas variables host especificadas. SELECT [ALL | DISTINCT ] <lista de seleccin> INTO {:<variable host>}, FROM { {<nombre de tabla> | <nombre de vista> } [<nombre de sinnimo>]}, [WHERE <condicin de bsqueda> ] [GROUP BY {<nombre de columna> | <nmero de columna>},] [HAVING <condicin de bsqueda>] NOTAS: Esta sentencia se utiliza slo dentro de un programa de aplicacin. La palabra clave EXEC SQL debe preceder a esta sentencia. Si existe ms de una fila como resultado de la sentencia entonces segenera un error Los tipos de las variables host deben coincidir con los de los campos de las columnas especificadas en <lista de seleccin>. Ejemplo En un programa C para almacenar el nmero de precios diferentes de artculos de un inventario actual en la variable declarada en el programa como int nmero_precios escribiramos: EXEC SQL SELECT COUNT (DISTINCT COSTE) INTO: nmero_precios
Apuntes de SQL Pg. 10

FROM INVENTARIO WHERE CANT >0; UPDATE Modifica las columnas seleccionadas de una tabla en todas las filas que satisfacen una condicin de bsqueda. UPDATE {<nombre de tabla> | <nombre de vista>} SET {<nombre de columna> = {<expresin> | NULL }}, [WHERE <condicin de bsqueda>] Ejemplo: Modifica slo las piezas cuyo cdigo es P2 actualizando los campos de color, peso y ciudad. UPDATE PIEZAS SET COLOR=AMBAR, PESO=PESO+5, CIUDAD=NULL WHERE P# = P2; UPDATE PIEZAS SET P_CIUDAD=PARIS WHERE P_CODIGO=P4 OR P_CODIGO=P6; SI QUEREMOS A LAS PIEZAS AZULES FABRICADAS EN PARIS INCREMENTARLE 4 UNIDADES DE PESO: UPDATE PIEZAS SET PESO=PESO+4 WHERE COLOR=AZUL AND P_CIUDAD=PARIS; SUPONEMOS Q VAMOS A CAMBIAR EL COLOR D TODAS LAS PIEZAS CUYO PESO SEA MAYOR IGUAL Q 17 A AMARILLO: UPDATE PIEZAS SET COLOR=AMARILLO WHERE PESO>=17;

DELETE Borra una o ms filas de una tabla o vista. Si no se especifica la clusula WHERE, se borran todas las filas de la tabla sealada en la clusula FROM. Si se especifica la clusula WHERE slo sern borradas aquellas filas que hagan la condicin de bsqueda verdadera. DELETE FROM { <nombre de tabla> | <nombre de vista>} [<nombre de alias>] [WHERE <condicin de bsqueda>] Ejemplo: Borrar todas las filas de tabla SP cuya CANT sea mayor que 30.
Apuntes de SQL Pg. 11

DELETE FROM SP WHERE CANT > 30;

INSERT Inserta una o ms filas nuevas dentro de la tabla o vista especificada. Cuando se utilice la clusula VALUES slo se insertar una fila. Si se utiliza una <sentencia select> el nmero de filas insertadas ser igual al devuelto por la <sentencia select>. INSERT INTO {<nombre de tabla> | <nombre de vista>} [({<nombre de columna>},)] { VALUES ({<literal> | :<variable host> | NULL },) | <sentencia select>} Ejemplos Insertar en la tabla de SUMINISTROS una nueva fila. INSERT INTO SUMINISTROS(S#, P#, CANT) VALUES (S20, P20, 1000); En este ejemplo se insertan unas filas obtenidas de la tabla de SUMINISTROS en una tabla temporal TEMP. INSERT INTO TEMP (P#, CANTTOTAL) SELECT P#, SUM(CANT) FROM SUMINISTROS GROUP BY P#;

FUNCIONES DE AGREGADOS (DE COLUMNAS)


SQL ofrece una serie de funciones que actan sobre el total de valores en una columna de alguna tabla y producen un slo valor como resultado. Estas funciones son la suma (SUM), la media (AVG), el mximo de un conjunto de valores (MAX), el mnimo (MIN) y el nmero de valores de una columna o cuenta (COUNT). Estas funciones se utilizan en consultas SELECT o en subconsultas. Una subconsulta es una consulta SELECT dentro de otra SELECT. Por ejemplo: SELECT JNOMBRE FROM J WHERE J# IN (SELECT J# FROM SPJ WHERE S#=S1);
Apuntes de SQL Pg. 12

Subconsulta

Funcin AVG (media aritmtica) La sintaxis es: AVG({[ALL] <expresin> | DISTINCT <nombre de columna>}) En una consulta SELECT o una subconsulta esta funcin crea una columna cuyo valor es el promedio numrico de los valores de la <expresin> o del <nombre de columna>. Se puede usar la clusula GOUP BY para crear el promedio de cada grupo de filas seleccionadas en las tablas o vistas subyacentes. Si se especifica la clusula DISTINCT entonces los valores duplicados en la columna no se tiene en cuenta a la hora de calcular el promedio. La clusula ALL si tiene en cuenta todos los valores, aunque esta es la opcin por defecto. Ejemplos Obtener el promedio del coste del inventario de artculos sin contar aquellos que no estn en stock. SELECT AVG(CANTIDAD*COSTE) FROM INVENTARIO WHWRE CANTIDAD >0; Calcular el promedio de la cantidad debida a cualquier vendedor que envi un acuenta en octubre. SELECT AVG(CANTDEBIDA) FROM CUENTASPAGAR WHER MESFACTURA = 10 AND CANTDEBIDA >0; Funcin COUNT (Cuenta) COUNT({ * | DISTINCT <nombre de columna>}) En una consulta SELECT o subconsulta esta funcin crea una columna cuyo valor es igual al nmero de filas de la tabla resultado o al nmero de valores distintos en <nombre columna>. Se puede utilizar la clusula GROUP BY para crear una cuenta por cada grupo de filas. Si se especifica la clusula DISTINCT entonces lo valores duplicados se eliminan de la cuenta. Ejemplo Obtener el nmero de clientes de cada provincia que hicieron negocio en una fecha posterior a 1985. SELECT COUNT(*) FROM CLIENTES
Apuntes de SQL Pg. 13

WHERE PRIMERFECHA > 1985 GROUP BY PROVINCIA; Funcin MAX MAX({[ALL] <expresion> | DISTINCT <nombre de columna>}) En una consulta o subconsulta crea una columna cuyo valor es el valor mximo de<expresin> o <nombre de columna>. Se puede utilizar la clusula GROPU BY para obtener el mximo de cada grupo de filas seleccionadas en las tablas o filas subyacentes Ejemplos Calcular la mxima cantidad debida a cualquier vendedor que envi una factura en Octubre. SELECT MAX (CANTDEBIDA) FROM CUENTASPAGAR WHERE MESFACTURA =10; Encontrar el artculo del inventario con el mximo coste SELECT MAX(CANT * COSTE) FROM INVENTARIO; Funcin MIN MIN({[ALL] <expresin> | DISTINCT <nombre de columna>}) Es igual que MAX pero en este caso se calcula el valor mnimo. Ejemplos Obtener la mnima cantidad que se le debe a cualquier vendedor que envi una factura en Octubre. SELECT MIN (CANTDEBIDA) FROM CUENTASPAGAR WHERE MESFACTURA =10; Encontrar el mnimo coste de cualquier artculo del inventario SELECT MIN(CANT * COSTE) FROM INVENTARIO; Funcin SUM SUM({[ALL] <expresin> | DISTINCT <nombre de columna>})
Apuntes de SQL Pg. 14

En una tabla lgica devuelta por una consulta o subconsulta crea una columna cuyo valor es la suma numrica de los valores de <expresin> o <nombre de columna>. Se puede utilizar la clusula GROUP BY para obtener la suma de cada grupo de filas.

Ejemplos Obtener la cantidad total debida a todos los vendedores que enviaron una factura en Octubre. SELECT SUM(CANTDEBIDA) FROM CUENTASPAGAR WHERE MESFACTURA = 10; Obtener el total del coste del ineventario de artculos SELECT SUM(CANT * COSTE) FROM INVENTARIO;

TIPOS DE DATOS EN SQL


En SQL92 son los siguientes (se debe consultar los tipos de datos para sistemas especificos como Oracle, DB2, etc): <tipo de dato>::= CHAR[ACTER] | SMALLINT | INTEGER | DECIMAL | NUMERIC
| REAL | FLOAT | DOUBLE PRECISION | CHARACTER VARYING | DATE | TIME | BIT | TIMESTAMP | INTERVAL | BIT VARYING

TIPO CHAR[ACTER](n) CHARACTER VARYING SMALLINT INTEGER DEC[IMAL](p,q) NUMERIC(p,q) FLOAT[(p)] REAL DOUBLE PRECISION DATE TIME TIMESTAMP INTERVAL BIT

DESCRIPCIN Cadena de caracteres de longitud fija n Cadena de caracteres de longitud variable. En las implementaciones reales se suele indicar la longitud mxima. As en DB sera VARCHAR(n). Nmero entero en el rango 32.768 a 32.767 Nmero entero con signo con un rango de 2.147.483.648 a 2.147.483.647 y sin signo de 0 a 4.294.967.295 Decimal empaquetado con un total de p dgitos de los cuales q hay a la derecha del punto decimal. Igual que DECIMAL Nmero de punto flotante con una precisin de p dgitos binarios Igual que FOLAT pero con una precisin definida por la implementacin. Igualque REAL pero con el doble de precisin. Fecha en formato aaaammdd Hora en formato hhmmss Marca de tiempo. Es una combinacin de fecha y hora con una precisin de microsegundos. Expresa diferencias entre fechas u horas Un bit

Apuntes de SQL Pg. 15

BIT VARYING

Cadena de bits de longitud variable.

Apuntes de SQL Pg. 16

SQL3:El nuevo SQL1


La versin actual estndar del SQL, la SQL/92, tiene su origen en la norma ISO 9075 de Julio de 1992. Actualmente la ISO y ANSI estn trabajando en una nueva versin del SQL denominada SQL3 cuyo objetivo final es convertir al SQL en un lenguaje computacional completo para la definicin y el manejo de objetos complejos. Esto incluye jerarquas de generalizacin y especializacin, herencia mltiple, tipos definidos por el usuario, triggers, aserciones, soporte para sistemas basados en el conocimiento, expresiones recursivas de consultas, herramientas de administracin de datos, herencia, polimorfismo, encapsulamiento, capacidades multimedia, etc. En 1993 la ISO y ANSI deciden crear mltiples comits de normalizacin para definir el SQL3. Cada uno de estos comits se encarga de un aspecto del nuevo SQL. Estos comits son los siguientes. Parte 1: marco de trabajo. Es una descripcin no tcnica de cmo es la estructura del nuevo SQL3 Parte 2: Fundacin. Es el ncleo de la nueva especificacin incluyendo nuevos tipos de datos, triggers, subtablas, tipos de datos abstractos(ADT), capacidades de orientacin de objetos, capacidades para definir operaciones complejas, almacenamiento de operaciones complejas en la base de datos, llamadas a procedimientos externos. Como vemos todo est muy relacionado con los modelos orientados a objetos. Por este motivo la mayor parte del trabajo se dedica a redefinir un modelo de objetos SQL-3 compatible con el modelo de objetos propuesto por el ODMG ( Object-oriented Database consortium). Un tipo de dato abstracto consiste en una coleccin de datos junto con unas operaciones que pueden realizarse sobre ellos y todo ello encapsulado y cuyos elementos pueden tener una visibilidad pblica, privada o protegida. En los lenguajes de programacin orientada a objetos TAD es una clase. En el nuevo SQL se tratara de definir una tabla junto con las operaciones que se puedan realizar sobre ella. Los atributos de la tabla seran los datos miembro y las operaciones seran las funciones miembro o mtodos. La herencia permitira as crear subtablas. La norma internacional debera estar terminada para mitad de 1999. Parte 3:SQL/CLI Es una interfase de programacin a nivel de llamadas (Call Level Innterface) para bases de datos SQL diseada para que las aplicaciones puedan acceder a las bases de datos. Se pretende normalizar: Una implementacin independiente de la interfase de programacin a nivel de llamadas para acceso a bases de datos SQL.

Este apartado ha sido sacado de la direccin de internet

actualizacin fue el 2 de Diciembre de 1999 Apuntes de SQL

http://www.jcc.com/SQLPages/jccs_sql.html que recoge el estado actual del SQL y cuya ltima

Pg. 17

Herramientas cliente-servidor para fcil acceso a bases de datos a travs de libreras de enlace dinmico. Soporte y fomento de un rico conjunto de herramientas cliente-servidor.

Este comit ha trabajado con gran rapidez y el estndar es el ISO/IEC 9075-3 terminado en 1995 y actualmente est trabajando para dar soporte a las nuevas caractersticas del SQL3. Parte 4: SQL/PSM (Persistent Stored Modules) Esta parte se dedica a incorporar al SQL extensiones para lenguaje procedural, procedimientos almacenados y mltiples instrucciones, procedimientos externos y llamadas a procedimientos. Extensiones para lenguaje procedural Consiste en incorporar al SQL caractersticas tpicas de los lenguajes de programacin estructurados: instrucciones de control de flujo: If-then-else, bucles, excepciones, instrucciones case, bloques Begin-end, declaracin de variables, etc Procedimientos almacenados y mltiples instrucciones Esto tiene grandes ventajas en los entornos cliente-servidor en los siguientes mbitos: Ejecucin ya que un procedimiento almacenado puede ejecutar mltiples instrucciones SQL reduciendo as la interaccin de la red con el cliente. Seguridad ya que un usuario puede dar derecho para llamar a un procedimiento almacenado que actualice una tabla o conjunto de tablas pero denegar el derecho para actualizar las tablas directamente sin el procedimiento. Cdigo compartido ya que el cdigo de un procedimiento almacenado no tiene que ser escrito y depurado para cada cliente que accede a la base de datos. Control ya que el procedimiento almacenado proporciona un nico punto de definicin y control para la lgica de la aplicacin. Procedimientos externos y llamadas a procedimientos Una de las capacidades mas deseadas es permitir la llamada a funciones y procedimientos externos escritos por el usuario. El objetivo es permitir que las bases de datos puedan utilizar un rico y numeroso conjunto de funciones definidas por el comit estndar. En la actualidad an no est terminada esta parte de la norma. Parte 5: SQL/Bindings Esta es la parte obligatoria del SQL compuesta por el LDD o parte esttico de definicin de datos y la parte dinmica de la manipulacin de datos LMD. En la actualidad hay que resolver la gran variedad de usos que los diferentes sistemas de bases de datos relacionales hacen tanto de la parte esttica como dinmica. Por otro lado el SQL-92 tiene una correspondencia en los tipos de datos con los lenguajes de programacin tradicionales pero no con los orientados a objetos que hay que resolver tambin. Parte 6: SQL/XA Este comit pretende normalizar una Interfase de Programacin de Aplicaciones (API) entre un gestor de transacciones global y un gestor de recursos SQL. La idea es que el gestor de recursos de SQL tenga soporte para el protocolo de compromiso de dos fases. El compromiso
Apuntes de SQL Pg. 18

de dos fases se basa en el avance al unsono de todos los agentes que intervienen en una transaccin o el retroceso al unsono de esos agentes si la transaccin no puede realizarse. En concreto se trabaja para especificar los parmetros de entrada y salida en trminos de tipos de datos SQL para las funciones de dicho protocolo desarrollado por X/Open. Parte 7:SQL/Temporal Se trata de aadir capacidades relacionadas con el tiempo al SQL. La idea es que se puedan realizar consultas a las bases de datos no slo en el estado o momento actual sino en estados previos de tiempo. Hay varias soluciones para que el nuevo SQL contemple la dimensin temporal: Aadir dos nuevos atributos INICIO y FINAL a las relaciones base que indiquen respectivamente los momentos en los cuales una tupla se inserta y elimina en el sentido lgico y no fsico. Por ejemplo, supongamos que se inserta un nuevo proveedor de cdigo S6 en el momento t1, entonces se crear una nueva tupla para S6 con NINICIO=t1 y FINAL=infinito. Si despus en el instante t2 la situacin (el atributo SITUACION) del proveedor S6 cambia se modificara la primera tupla de S6 haciendo FINAL= t2 y se insertara otra nueva tupla para S6 con INICIO=t2 y FINAL= infinito. Mediante relaciones anidadas (subtablas) en las cuales cada tupla de una relacin base incluyera un atributo especial, que sera la relacin anidada o subtabla que definiese la historia de esa tupla. Se trata por tanto de ponerse de acuerdo en el modelo a elegir. SQL/MM (Multimedia) Intenta normalizar libreras de clase para ciencias e ingeniera, procesamiento de documentos, mtodos para manejar objetos multimedia tales como imgenes, sonido, animacin, msica y vdeo. A su vez este comit ha sido dividido en 4 partes cada una de las cuales trata un aspecto diferente del SQL/MM.

Apuntes de SQL Pg. 19

EJERCICIOS DE SQL RESUELTOS Creacin de tablas


1.- A continuacin se presenta una muestra de valores de una base de datos compuesta por tres tablas de proveedores, proyectos y piezas. Los proveedores (tabla S) , las piezas (tabla P) y los proyectos (tabla J) se identifican respectivamente por un cdigo de proveedor (S#, un cdigo de pieza (P#) y un nmero o cdigo de proyecto (J#). El significado de una fila de la tabla de envis (tabla SPJ) es que el proveedor con cdigo S# enva la pieza con cdigo P# al proyecto con cdigo J# en la cantidad especificada en CANTIDAD. La combinacin S#P#J# identifica de forma nica cada fila de la tabla de envos. Escribir un conjunto de sentencias CREATE TABLE de SQL92 para esta base de datos. PCODI GO P1 P2 P3 P4 P5 P6 S# S1 S2 S3 S4 S5 J# J1 J2 J3 J4 J5 J6 J7 PNOMB RE Tuerca Perno Birlo Birlo Leva Engrane COLO R Rojo Verde Azul Rojo Azul Rojo PESO 12 17 17 14 12 19 PCIUDAD Londres Pars Roma Londres Pars Londres SCIUDAD Londres Pars Pars Londres Atenas S# S1 S1 S2 S2 S2 S2 S2 S2 S2 S2 S3 S3 S4 S4 S5 S5 S5 S5 S5 S5 S5 P# P1 P1 P3 P3 P3 P3 P3 P3 P3 P5 P3 P4 P6 P6 P2 P2 P5 P5 P1 P3 P4 J# J1 J4 J1 J2 J3 J4 J5 J6 J7 J2 J1 J2 J3 J7 J4 J2 J5 J7 J4 J4 J4
CANTIDAD

SNOMBRE Juan Antonio Mara Susana Felipe JNOMBRE Clasificador Perforadora Lectora Consola Terminal Cinta Impresora

SITUACION 20 10 30 20 30 JCIUDAD Pars Roma Atenas Atenas Londres Oslo Londres

200 700 800 200 100 100 500 300 500 150 125 200 200 300 8000 500 300 700 900 100 200

Solucin A) Sin dominios. B) Con dominios.

Apuntes de SQL Pg. 20

Consultas simples
2.- Obtener para todas las piezas, el nmero de pieza y su peso en gramos ( los pesos se dan en libras en la tabla P. Una libra = 454 gramos). SELECT P_CODIGO PESO * 454 FROM PIEZAS ; 3.- Obtener los datos completos de todos los proveedores SELECT * FROM PROVEEDORES; SELECT PR_CODIGO FROM PROVEEDORES 4,.- Obtener los nmeros de los proveedores de Pars cuya situacin sea mayor que 20. WHERE PR_CIUDAD = PARIS AND SITUATION > 20; OR PR_CIDUDAD = LONDRES; PR_CIUDAD = PARIS OR LONDRES; 5.- Obtener los cdigos de proveedor y situacin de proveedores de Pars en orden descendente por situacin. SELECT PR_CODIGO, SITUACION FROM PROVEEDORES WHERE PR_CIUDAD = PARIS OR BY SITUATION DESC; 6.- Obtener para todas las piezas, su cdigo y su peso en gramos ordenando el resultado por peso y dentro de peso por cdigo de pieza. SELECT P_CODIGO, P_NOMBRE, PESO * 454 AS PESO_ GRAMOS FROM PIEZAS ORDER BY PESO, P_CODIGO;

Consultas de reunin (con filtrado WHERE)


7.-Obtener todas las combinaciones de informacin de proveedores y piezas tales que el proveedor y la pieza en cuestin estn situados en la misma ciudad. SELECT PROVEEDORES.*, PIEZAS.* FROM PROVEEDORES, PIEZAS, WHERE PROVEEDORES. PR_CIUDAD=PIEZAS. P_CIUDAD; 8.- Obtener todas las combinaciones de informacin de proveedor y pieza donde la ciudad del proveedor siga a la ciudad de la pieza en orden alfabtico. SELECT PROVEEDORES.*, PIEZAS.* FROM PROVEEDORES, PIEZAS, WHERE PROVEEDORES. PR_CIUDAD>PIEZAS. P_CIUDAD; 9.- Obtener todas las combinaciones de informacin de proveedor y pieza donde el proveedor y la pieza en cuestin estn cosituados, es decir tengan la misma ciudad, pero omitiendo a los proveedores cuya situacin sea 20. SELECT PIEZAS.*, PROVEEDORES.* FROM PIEZAS, PROVEEDORES WHERE (((PIEZAS.P_CIUDAD)<[PROVEEDORES].[PR_CIUDAD]) AND ((PROVEEDORES.SITUACION)<>20)); 10.- Obtener todas las combinaciones de (s#,p#) tales que el proveedor y la pieza en cuestin estn cosituados.
Apuntes de SQL Pg. 21

SELECT PR.*, P.* FROM PIEZAS AS P, PROVEEDORES AS PR WHERE PR.PR_CIUDAD=P.P_CIUDAD;

11.- Obtener todas las parejas de nombres de ciudad tales que un proveedor situado en la primera ciudad suministre una pieza almacenada en la segunda ciudad. SELECT PR_NOMBRE, PR_CIUDAD, P_NOMBRE, P_CIUDAD FROM PROVEEDORES, PIEZAS, RELACION WHERE 'PROVEEDORES. PR_CODIGO=RELACION. PR_CODIGO AND PIEZAS. P_CODIGO=RELACION.P_CODIGO'; 12.- Obtener todas las parejas de nmeros de proveedor tales que los dos proveedores en cuestin estn cosituados.
SELECT PR1.PR_CODIGO,PR1.PR_NOMBRE,PR1.PR_CIUDAD,PR2.PR_CODIGO,PR2.PR_NOMBRE,P R2.PR_CIUDAD FROM PROVEEDORES PR1,PROVEEDORES PR2 WHERE PR1.PR_CIUDAD=PR2.PR_CIUDAD AND PR1.PR_CODIGO<>PR2.PR_CODIGO;

Funciones de agregados
13.- Obtener el nmero total de proveedores SELECT COUNT AS TOTALPROVEEDORES FROM PROVEEDORES 14.- Obtener el nmero total de proveedores y almacenarlo en una variable denominada total_proveedores SELECT COUNT (*) AS TOTAL_PROVEEDORES INTO TOTAL_PROVEEDORES FROM PROVEEDORES 15.- Obtener el nmero total de proveedores que suministran piezas en la actualidad B)_ SELECT DISTINCT PR1.PR_CODIGO,PR_NOMBRE FROM PROVEEDORES PR1,RELACION WHERE PR1.PR_CODIGO = RELACION.PR_CODIGO; C)_ SELECT DISTINCT PR1.P_CODIGO,PR_NOMBRE FROM PIEZAS PR1,RELACION WHERE PR1.P_CODIGO = RELACION.PR_CODIGO; 16.- Obtener el nmero de suministros de la pieza P2. A) SELECT COUNT (*) FROM RELACION WHERE P_CODIGO=P2; B) SELECT PIEZAS.P_CODIGO, PIEZAS.P_NOMBRE, COUNT(*) FROM RELACION, PIEZAS WHERE (PIEZAS.P_CODIGO=RELACION.P_CODIGO) GROUP BY PIEZAS.P_CODIGO, PIEZAS.P_NOMBRE; 17.- Obtener la cantidad total suministrada de la pieza P2. SELECT PIEZAS.P_CODIGO, PIEZAS.P_NOMBRE, SUM(CANTIDAD) FROM RELACION, PIEZAS WHERE (PIEZAS.P_CODIGO=RELACION.P_CODIGO) GROUP BY PIEZAS.P_CODIGO, PIEZAS.P_NOMBRE; 18.- Obtener el cdigo y la cantidad total suministrada de cada pieza.
SELECT PIEZAS.P_CODIGO, PIEZAS.P_NOMBRE, Sum(RELACION.CANTIDAD) AS PEDIDOS FROM RELACION, PIEZAS WHERE (((PIEZAS.P_CODIGO)=[RELACION].[P_CODIGO]))
Apuntes de SQL Pg. 22

GROUP BY PIEZAS.P_CODIGO, PIEZAS.P_NOMBRE;

19.- Obtener los cdigos de todas las piezas que son suministradas por ms de un proveedor. A) SELECT RELACION.P_CODIGO, Count(*) AS Expr1 FROM RELACION GROUP BY RELACION.P_CODIGO HAVING COUNT(*)>2; Nombre de la pieza, n de pedidos, total de piezas y la media de piezas: B) SELECT P_CODIGO, COUNT(*) AS PEDIDOS, SUM(CANTIDAD) AS TOTAL, AVG(CANTIDAD) AS MEDIA FROM RELACION GROUP BY RELACION.P_CODIGO HAVING COUNT(*)>2; C) SELECT RELACION.P_CODIGO, Count(*) AS Expr1, Avg(RELACION.CANTIDAD) AS NUMPEDIDOS, Avg(RELACION.CANTIDAD) AS MEDIAPIEZAS, Sum(RELACION.CANTIDAD) AS TOTALPIEZAS FROM RELACION GROUP BY RELACION.P_CODIGO HAVING (((Count(*))>2));

E) SELECT PIEZAS.P_CODIGO, PIEZAS.P_NOMBRE, COUNT(*) AS PEDIDOS, SUM(CANTIDAD) AS TOTAL, AVG(CANTIDAD) AS MEDIA FROM RELACION, PIEZAS WHERE PIEZAS.P_CODIGO=RELACION.P_CODIGO GROUP BY PIEZAS.P_CODIGO, PIEZAS.P_NOMBRE HAVING COUNT(*) >2;
20.- Obtener todas las piezas cuyos nombres comiencen con la letra B SELECT * FROM PIEZAS WHERE P_NOMBRE LIKE 'B*'; 21.- Obtener los cdigos de proveedores cuya situacin es nula SELECT * FROM PROVEEDORES WHERE SITUACION IS NULL; Obtener la fecha: (ejemplo) SELECT * FROM PROVEEDORES FECHA>=#31/05/2005#; WHERE FECHA>=#01/01/2005# AND

CON BETWEEN: SELECT * FROM PROVEEDORES WHERE FECHA BETWEEN #01/01/2005# AND #31/05/2005#; CON DATE VALUE: SELECT * FROM PROVEEDORES WHERE FECHA = DATEVALUE ('18/10/2004');

Subconsultas (SELECT dentro de SELECT)


22.- Obtener los nombres de los proveedores que suministran la pieza P2. SELECT PR_NOMBRE
Apuntes de SQL Pg. 23

FROM PROVEEDORES, RELACION WHERE P_CODIGO='P2' AND PROVEEDORES.PR_CODIGO=RELACION.PR_CODIGO; 23.- Obtener los nombres de los proveedores que por lo menos suministran una pieza de color rojo. A) SELECT P_CODIGO FROM PIEZAS WHERE COLOR='ROJO'; B) SELECT PR_CODIGO FROM RELACION WHERE P_CODIGO IN(SELECT P_CODIGO FROM PIEZAS WHERE COLOR='ROJO'); C) SELECT PR_NOMBRE FROM PROVEEDORES WHERE PR_CODIGO IN (SELECT PR_CODIGO FROM RELACION WHERE P_CODIGO IN(SELECT P_CODIGO FROM PIEZAS WHERE COLOR='ROJO')); D) SELECT PR_NOMBRE FROM PROVEEDORES,RELACION,PIEZAS WHERE RELACION.PR_CODIGO=PROVEEDORES.PR_CODIGO AND PIEZAS.P_CODIGO=RELACION.P_CODIGO AND PIEZAS.COLOR='ROJO'; 23.1. Codigo de proveedores que hayan sudministrado piezas rojas y verdes. SELECT PR_CODIGO FROM RELACION WHERE P_CODIGO IN(SELECT P_CODIGO FROM PIEZAS WHERE COLOR='ROJO' OR COLOR='VERDE'); 23.2 SELECT PR_CODIGO FROM PROVEEDORES WHERE PR_CODIGO IN (SELECT PR_CODIGO FROM RELACION WHERE P_CODIGO IN(SELECT P_CODIGO FROM PIEZAS WHERE COLOR='ROJO')) AND PR_CODIGO IN(SELECT PR_CODIGO FROM RELACION WHERE P_CODIGO IN(SELECT P_CODIGO FROM PIEZAS WHERE COLOR='VERDE')); 23.3 Obtener el nombre de los proveedores que han sudministrado alguna pieza de Pars y Roma. 23.4 Obtener los datos de las piezas que hayan sido sudministradas por algn proveedor de Atenas y de Londres.

24.- Obtener los cdigos de proveedores situados en la misma ciudad que el proveedor con cdigo S1. SELECT PR_CIUDAD FROM PROVEEDORES WHERE PR_CODIGO='S1'; SELECT * FROM PROVEEDORES WHERE PR_CIUDAD=(SELECT PR_CIUDAD FROM PROVEEDORES WHERE PR_CODIGO='S1'); 25.- Obtener los cdigos de proveedores cuya situacin sea menor que el valor mximo actual de situacin de la tabla S(PROVEEDORES) SELECT * FROM PROVEEDORES WHERE SITUACION < (SELECT MAX(SITUACION) AS MAXIMO FROM PROVEEDORES);

Consultas con EXISTS y NOT EXISTS


26.- Obtener los nombres de los proveedores que suministran la pieza P2
Apuntes de SQL Pg. 24

SELECT * FROM PROVEEDORES WHERE EXISTS (SELECT * FROM RELACION WHERE P_CODIGO='P2' AND PROVEEDORES.PR_CODIGO=RELACION.PR_CODIGO); 26.1.Datos de las piezas sudministradas por el proveedor S3 SELECT * FROM PIEZAS WHERE EXISTS (SELECT * FROM RELACION WHERE PR_CODIGO='S3' AND PIEZAS.P_CODIGO=RELACION.P_CODIGO); 27.- Obtener los nombres de los proveedores que no suministran la pieza P2 SELECT * FROM PROVEEDORES WHERE NOT EXISTS (SELECT * FROM RELACION WHERE P_CODIGO='P2' AND PROVEEDORES.PR_CODIGO=RELACION.PR_CODIGO); 28.- Obtener los nombres de los proveedores que suministran todas las piezas. SELECT * FROM PROVEEDORES WHERE NOT EXISTS (SELECT PIEZAS.* FROM PIEZAS WHERE NOT EXISTS (SELECT RELACION.* FROM RELACION WHERE PIEZAS.P_CODIGO=RELACION.P_CODIGO AND PROVEEDORES.PR_CODIGO=RELACION.PR_CODIGO)); 28.B. Sacar las piezas que no han sido sudministradas. SELECT PIEZAS.* FROM PIEZAS WHERE NOT EXISTS (SELECT RELACION.P_CODIGO FROM RELACION WHERE PIEZAS.P_CODIGO=RELACION.P_CODIGO); 28.C) SELECT PROVEEDORES.* FROM PROVEEDORES WHERE NOT EXISTS (SELECT RELACION.PR_CODIGO FROM RELACION WHERE PROVEEDORES.PR_CODIGO=RELACION.PR_CODIGO); 28.D.Obtener el nombre de la pieza que han sido sudministradas por todos los proveedores.

28.E; Sacar los datos de los pedidos que la cantidad sea 100, 200 o 500. SELECT * FROM RELACION WHERE CANTIDAD IN(100,200,500); 28.F; Obtener los datos de las piezas que no han sido sudministradas con exists e in: SELECT * FROM piezas WHERE not exists (select * from relacion where piezas.p_codigo=relacion.P_codigo); SELECT * FROM PIEZAS WHERE P_CODIGO NOT IN (SELECT P_CODIGO FROM RELACION); 29.- Obtener los cdigos de los proveedores que suministran por lo menos todas las piezas suministradas por el proveedor S2.

Apuntes de SQL Pg. 25

Operaciones de actualizacin 30.-Cambiar a amarillo el color de la pieza P2, aumentar su peso en 5 e indicar que su ciudad es desconocida (NULL). UPDATE PIEZAS SET COLOR='AMARILLO',PESO=PESO+5,P_CIUDAD='CUBA' WHERE P_CODIGO='P2'; 30.B.Proveedores cuya situacin sea >=20 le vamos a tripiclar la situacin: UPDATE PROVEEDORES SET SITUACION=SITUACION*3 WHERE SITUACION=20; UPDATE PROVEEDORES SET SITUACION=SITUACION*3 WHERE SITUACION>20; 30.C A las piezas cuya fecha este dentro de este ao hay q decrementar el peso en 5 unidades UPDATE PIEZAS SET PESO = PESO-5 WHERE FECHA>=#1/17/2005# And FECHA<=#12/31/2005#; 30.D. Cambiar la ciudad cuya fecha sea: UPDATE PIEZAS SET P_CIUDAD='NEW YORK' WHERE FECHA=#13/10/2004#; 31.-Mostrar los pedidos realizados por proveedores de Pars. SELECT * FROM RELACION WHERE RELACION.PR_CODIGO IN (SELECT PR_CODIGO FROM PROVEEDORES WHERE PR_CIUDAD='PARIS'); 32.-Poner a cero la cantidad enviada por todos los proveedores de Londres. 33.-Cambiar el cdigo de proveedor S2 a S9

Operaciones de eliminacin
34.-Eliminiar el proveedor S5 35.-Eliminar todos los envos cuya cantidad sea mayor que 300 36.-Eliminar todos los envos de los proveedores situados en Londres

Operaciones de insercin
37.-Aadir la pieza P7 (ciudad, Atenas, peso, 24; nombre y color desconocidos por ahora) a la tabla P 38.-Aadir la pieza P8(nombre, cadena, color, rosa, peso, 14, ciudad, Niza) a la tabla P
Apuntes de SQL Pg. 26

39.-Insertar un nuevo envo con cdigo de proveedor S20, cdigo de pieza P20, cdigo de proyecto J4 y cantidad 1000. 40.- Para cada pieza suministrada, obtener el nmero de pieza y la cantidad total suministrada y guardar el resultado en una tabla temporal de la base de datos

EJERCICIOS PROPUESTOS
Sobre la misma base de datos realizar los siguientes ejercicios

Creacin de la base de datos y las tablas en MySQL


a) Con la orden CREATE DATABASE nombre_base_datos creese la base de datos que contendr las tablas S, P, J y SPJ. b) Con la orden USE nombre_base_datos hacer que la base de datos recin creada sea la actual para su uso. c) Con un editor de textos simple como el bloc de notas de Windows escribir la orden SQL para crear las tabla S, P, J y SPJ y guardar el archivo con el nombre crea_s_p_j_spj.sql (los archivos que contienen instrucciones que pueden ejecutarse se llaman scripts). d) Con la orden SOURCE nombre_script o \. nombre_script ejecutar el script crea_s_p_j_spj.sql para crear las tablas de la base de datos. e) Con la orden SHOW TABLES comprobar la existencia de las tablas en la base de datos una vez creadas. f) Con la orden DESC nombre_tabla comprobar los tipos de campos de cada tabla. g) Si has escrito el script crea_s_p_j_spj.sql copindolo de las instrucciones CREATE TABLE de los ejercicios resueltos de los apuntes observars en el ejercicio anterior que la clave primaria de la tabla S es de tipo char(5) mientras que en la tabla SPJ es de tipo char(2) y deben ser iguales pues de lo contrario estamos violando la regla de integridad referencial para claves ajenas. Se trata de que modifiques la definicin de las tablas de manera que todas las claves primarias y ajenas sean de tipo char(5). Para ello se utiliza la orden ALTER TABLE con la opcin MODIFY cuya sintaxis en MySQL es la siguiente:
ALTER [IGNORE] TABLE tbl_name MODIFY [COLUMN] column_definition [FIRST | AFTER col_name]

Apuntes de SQL Pg. 27

h) Crear un archivo con el bloc de notas de windows que tenga lneas de texto. Cada lnea de texto ser una fila de la tabla de piezas (P) y cada columna estar separada por el carcter tabulador. El archivo tendr el siguiente aspecto: p1 p2 p3 p4 p5 p5 tuerca perno birlo birlo leva engrane rojo verde azul rojo azul rojo 12 17 17 14 12 19 Londres Pars Roma Londres Pars Londres

Una vez creado el archivo se pide: Guardarlo con el nombre tabla_p.sql (atencin a la extensin) Conectarse a MySQL y cargar el archivo en la tabla de piezas (P) de la base de datos antes creada utilizando el comando:
LOAD DATA LOCAL INFILE ../..ruta_archivo../.. INTO TABLE P;

NOTAS: El comando anterior no funciona si en el archivo encuentra por ejemplo ms de un tabulador y tampoco si el archivo se ha creado escribiendo una fila y copindola con CTRL-C y CTRL-V. i) Realizar el mismo proceso que en el ejercicio anterior para crear y cargar el archivo tabla_s.sql. j) Realizar el mismo proceso que en el ejercicio anterior para crear y cargar el archivo tabla_j.sql, pero ahora se crear dicho archivo con una hoja de calculo (excel) exportndola a un archivo de texto con el carcter tabulador como separador de columnas. k) Realizar el mismo proceso que el ejercicio anterior para crear y cargar el archivo tabla_spj.sql. Los siguientes ejercicios pueden hacerse indistintamente en Access o en MySQL.

Consultas sencillas
1. Obtener los detalles completos de todos los proyectos 2. Obtener los detalles completos de todos los proyectos de Londres 3. Obtener los cdigos de provedores que suministran piezas al proyecto J1, ordenados por nmero cdigo de proveedor. 4. Obtener todos los envos en los cuales la cantidad est en el intervalo 300 a 700 inclusive 5. Obtener una lista de todas las combinaciones de color de pieza y ciudad de pieza eliminando todas las parejas color de pieza y ciudad de pieza repetidas

Consultas con varias tablas

Apuntes de SQL Pg. 28

6. Obtener todas la tripletas (nmero de proveedor,nmero de pieza,nmero de proyecto) tales que el proveedor, la pieza y el proyecto estn todos a la vez en la misma ciudad (cosituados) 7. Lo mismo que el anterior pero que no estn todos cosituados 8. Obtener todas la tripletas (nmero de proveedor,nmero de pieza,nmero de proyecto) tales que el proveedor, la pieza y el proyecto estn todos a la vez en diferente ciudad 9. Obtener los nmeros de piezas suministradas por algn (los) proveedor (es) de Londres 10. Obtener los nmeros de piezas suministradas por un proveedor de Londres a un proyecto de Londres 11. Obtener todas las parejas de nombres de ciudad tales que un proveedor de la primera ciudad suministre piezas a un proyecto de la segunda ciudad 12. Obtener los nmeros de piezas suministradas a un proyecto por un proveedor en la misma ciudad que el proyecto 13. Obtener los nmeros de los proyectos a los cuales suministra piezas por lo menos un proveedor situado en una ciudad distinta que el proyecto 14. Obtener todas las parejas de nmeros de piezas tales que algn proveedor suministre las dos piezas indicadas

Funciones de agregados (COUNT, SUM, etc)


15. Obtener el nmero total de proyectos a los cuales sumnistra piezas el proveedor S1 16. Obtener la cantidad total de la pieza P1 suministrada por el proveedor S1 17. Para cada pieza suministrada a un proyecto, obtener el nmero de pieza, el nmero de proyecto y la cantidad total correspondiente 18. Obtener los nmeros de las piezas suministradas a algn proyecto tales que la cantida promedio suministrada sea mayor que 20

Consultas diversas
19. Obtener todos los envos para los cuales la cantidad no sea nula 20. Obtener los nmeros de proyecto y ciudades en los cuales la segunda letra del nombre de ciudad sea una o.

Subconsultas(SELECT dentro de SELECT)


21. Obtener los nombres de los proyectos a los cuales suministra piezas el proveedor S1 22. Obtener los colores de las piezas que sumininstra el proveedor S1 23. Obtener los nmeros de las piezas suministradas a cualquier proyecto de Londres 24. Obtener los nmeros de los proyectos que utilizan al menos una de las piezas suministradas por el proveedor S1 25. Obtener los cdigos de proveedores que suministren por lo menos una de las piezas suministradas por al menos uno de los proveedores que suministran por lo menos una pieza roja 26. Obtener los nmeros de proveedores cuya situacin sea inferior a la del proveedor S1 27. Obtener los nmeros de proyectos cuya ciudad sea la primera en la lista alfabtica de las ciudades donde hay proyectos 28. Obtener los cdigos de proyectos a los cuales se suministre la pieza P1 en una cantidad promedio mayor que la cantidad mxima en la cual se suministra alguna pieza del proyecto J1
Apuntes de SQL Pg. 29

29. Obtener los nmeros de los proveedores que suministran la pieza P1 a algn proyecto en una cantidad mayor que la cantidad promedio enviada de la pieza P1 para ese proyecto

Exists
30. Repetir el ejercicio 23 utilizando EXISTS en la solucin 31. Repetir el ejercicio 24 utilizando EXISTS en la solucin 32. Obtener los nmeros de los proyectos a los que no suministra ninguna pieza roja ninguno de los proveedores de Londres 33. Obtener los nmeros de los proyectos para los cuales S1 es el nico proveedor 34. Obtener los nmeros de piezas suministradas a todos los proyectos de Londres 35. Obtener los nmeros de proveedores que suministran la misma pieza a todos los proyectos 36. Obtener los nmeros de los proyectos a los que se suministren por lo menos todas las piezas suministradas por el proveedor S1

Union
37. Construir una lista ordenada de todas las ciudades en las cuales est situado por lo menos un proveedor, una pieza o un proyecto 38. Mostrar el resultado de la siguiente seleccin: SELECT COLOR FROM P UNION SELECT COLOR FROM P;

Operaciones de actualizacin
39. Cambiar a gris el color de todas las piezas 40. Eliminar todos los proyecto para los cuales no haya envios 41. Insertar un nuevo proveedor (S10) en la tabla S. El nombre y la ciudade son Salazar y Nueva York y la situacin todava no se sabe 42. Construir una tabla con los nmeros de piezas suministradas ya sea por un proveedor de Londres o a un proyecto d Londres 43. Construir una tabla con los nmeros de proyectos situados en Londres o a los que suministre piezas algn proveedor de Londres

Apuntes de SQL Pg. 30