30
INTRODUCCIÓN: EL LENGUAJE DE CONSULTA SQL. INTRODUCCIÓN: EL LENGUAJE DE CONSULTA SQL. La mayor parte de BD actuales son relacionales, mas específicamente sistemas SQL. La primera definición del SQL cuyo nombre original era SEQUEL fue realizada por Chamberlain y otros de IBM en el Research Laboratory de San José. La aplicación práctica construida a partir de esta definición 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 añadidos. Por tanto en este tema estudiaremos este lenguaje. LENGUAJE DE DEFINICIÓN DE DATOS (SQL estático). Esta constituido básicamente 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 notación BNF extendida. Esta notación utiliza unos símbolos que no son propios del SQL y cuyo significado es el siguiente: [] Indican opcionalidad. Lo que se sitúe 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 símbolo no terminal, es decir que requiere definición. Lo que hay a la izquierda de los puntos suspensivos puede repetirse cero o más veces. {} Agrupa elementos ::= Este símbolo se emplea para definir . En la descripción de las instrucciones de SQL todos los símbolos 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 instrucción la tienen todos los SGBD relacionales aunque con modificaciones respecto de la SQL ISO-92 CREATE [ {GLOBAL | LOCAL} TEMPORARY] TABLE <nombre de tabla> 1

SQL Comandos Ejemplos

Embed Size (px)

Citation preview

Page 1: SQL Comandos Ejemplos

INTRODUCCIÓN: EL LENGUAJE DE CONSULTA SQL.

INTRODUCCIÓN: EL LENGUAJE DE CONSULTA SQL.

La mayor parte de BD actuales son relacionales, mas específicamente sistemas SQL.

La primera definición del SQL cuyo nombre original era SEQUEL fue realizada por Chamberlain y otros deIBM en el Research Laboratory de San José.

La aplicación práctica construida a partir de esta definición 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 sedenominan 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 dicholenguaje con algunas modificaciones o añadidos. Por tanto en este tema estudiaremos este lenguaje.

LENGUAJE DE DEFINICIÓN DE DATOS (SQL estático).

Esta constituido básicamente por las siguientes sentencias: CREATE TABLE, CREATE VIEW, CREATEDOMAIN, CREATE ASSERTION, CREATE INDEX, ALTER TABLE, DROP TABLE, DROP VIEW,DROP INDEX.

En los siguientes apartados describiremos el lenguaje SQL empleando la notación BNF extendida. Estanotación utiliza unos símbolos que no son propios del SQL y cuyo significado es el siguiente:

[] Indican opcionalidad. Lo que se sitúe 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 símbolo no terminal, es decir que requiere definición.

Lo que hay a la izquierda de los puntos suspensivos puede repetirse cero o más veces.

{} Agrupa elementos

::= Este símbolo se emplea para definir .

En la descripción de las instrucciones de SQL todos los símbolos escritos en negrita se consideran terminalesy por tanto propios del SQL.

CREATE TABLE.

Se emplea para crear una tabla de la base de datos. Esta instrucción la tienen todos los SGBD relacionalesaunque con modificaciones respecto de la SQL ISO−92

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

1

Page 2: SQL Comandos Ejemplos

( <definición de columna> | <definición de restricción de tabla>[, <definición de columna> | <definición derestricción de tabla>]);

<definición de columna> ::= <nombre columna>{<tipo de dato>|<nombre dominio>}

[<cláusula de defecto>] [<restricción de columna>]

<tipo de dato>::= CHAR[ACTER] | SMALLINT | INTEGER | DECIMAL | NUMERIC

| REAL | FLOAT | DOUBLE PRECISION | CHARACTER VARYING

| DATE | TIME | BIT | TIMESTAMP | INTERVAL | BIT VARYING

<cláusula de defecto>::= DEFAULT {<literal>|<función de valor tiempo/fecha>

| USER | SYSTEM | NULL }

<restricción de columna>::= NOT NULL | <especificación de unicidad> |

<especificación de referencia> | <restricción de verificación>

<especificación 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 ]

<especificación de referencia>::=

<restricción de verificación>::= CHECK (<condición de búsqueda>)

NOTA: se utiliza para expresar una condición que deben cumplir un conjunto de

atributos de la tabla

<definición de restricción de tabla>::= [<nombre de definición de restricción>]

<especificación de unicidad> | <especificación de referencia> | <restricción de verificación>

Ejemplo

CREATE TABLE PROFESOR

( Cod_profe Char(5) PRIMARY KEY,

Nombre Char(15) NOT NULL,

2

Page 3: SQL Comandos Ejemplos

DNI Int NOT NULL,

Dirección Char(25) NOT NULL,

Materia Char(10),

Tipo Char NOT NULL,

Cód_profe_e Char(5),

Cód_area Char(5), NOT NULL,

Catedrático Bit,

FOREIGN KEY (Cód_profe_e) REFERENCES PROFESOR ON UPDATE CASCADE,

FOREIGN KEY (Cód_area) REFERENCES AREA ON UPDATE CASCADE,

CHECK( ( (Cód_prof_e = NULL) And (Catedrático =1)) Or ((Cód_prof_e = NOT NULL) And (Catedrático=0))

CHECK (Cód_profe <> Cód_profe_e)

);

CREATE DOMAIN

Se utiliza para crear un dominio, es decir un conjunto de valores que puede tomar un atributo o campo de unatabla. Es algo parecido a los tipos de datos definidos por el usuario en los lenguajes de programación. Estainstrucción no la soportan actualmente todos los SGBD, por ejemplo no la soporta Oracle ni SQLbase.

CREATE DOMAIN <nombre de dominio> [AS] <tipo de dato> [<cláusula de defecto>]

[<restricción de dominio>]

<restricción de dominio>::= [CONSTRAINT <nombre de restricción>]

<restricción de verificación> [<atributos de restricción>]

<atributos de restricción>::= {INITIALLY DEFERRED | INITIALLY INMEDIATE}

[[NOT] DEFERRABLE] |

[NOT] DEFERRABLE] {INITIALLY DEFERRED | INITIALLY INMEDIATE}

Ejemplo

CREATE DOMAIN C_PER Char(5);

CREATE DOMAIN C_BECA Char(5);

CREATE ASSERTION

3

Page 4: SQL Comandos Ejemplos

Se utiliza para establecer restricciones en la base de datos. Por ejemplo para que el sistema compruebe lascardinalidades mínimas o las condiciones que deben cumplir un conjunto de atributos pertenecientes a variastablas. No está disponible en todos los SGBD

CREATE ASSERTION <nombre de aserción><restricción de verificación>

[<atributos de aserción>]

Ejemplo

Suponemos una base de datos que recoge información de cursos impartidos por profesores. Entonces paraindicar al sistema que cada curso puede ser impartido por menos de cuatro profesores escribiríamos, una vezcreadas 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 almacenadosy separados físicamente. Lo que se almacena es la definición de la vista en términos de otras tablas en eldiccionario de datos del sistema.

CREATE VIEW <nombre de tabla> [(<nombre de columna> [,<nombre de columna>])

AS <expresión de consulta> [WITH CHECK OPTION]

La cláusula WITH CHECK OPTION indica que las operaciones de modificación e inserción realizadas conla vista deben verificarse para garantizar que toda fila modificada o insertada cumpla la condición definida en<expresión 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 sólo semuestran filas compuestas por los campos S#, SITUACION, CIUDAD donde SITUACION>15. Cada vez que

4

Page 5: SQL Comandos Ejemplos

se intente modificar o introducir una fila en la tabla de proveedores a través de esta vista se comprobará si elcampo SITUACION tiene un valor mayor de 15 denegándose la operación en caso contrario .

CREATE INDEX

Esta sentencia no forma parte del estándar SQL92 sin embargo la incluyen la mayoría de los SGBD talescomo 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 cláusula CLUSTER indica que se trata de un índice de agrupamiento, es decir que el sistema sitúalos registros relacionados de forma lógica lo más próximos posibles unos de otros en el soporte.

La cláusula UNIQUE se emplea para indicar que no se permite que dos registros de la tabla indicadatengan el mismo valor en el campo o combinación de campos índices. Esto sirve para que se cumplala 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 estándar SQL92 sin embargo la incorporan la mayoría de lasimplementaciones.

Crea un nombre de alias para una tabla o vista. El alias puede ser útil para proporcionar un nombre corto paraun nombre de tabla largo o para tratar la tabla a través de su alias como si fuese una copia lo cual nos puedeservir para unir una tabla consigo misma.

CREATE SYNONYM <nombre de sinónimo> FOR {<nombre de tabla>|<nombre de vista}

Ejemplo

CREATE SYNONYM CLIE FOR PROD.CLIE;

ALTER TABLE (SQL de DB2)

Esta sentencia no forma parte del SQL92 sin embargo la contemplan la mayoría de los sistemas comerciales.

Añade nuevas columnas a una tabla existente.

ALTER TABLE <nombre de tabla> ADD <nombre de columna><tipo de dato>

5

Page 6: SQL Comandos Ejemplos

[NULL | NOT NULL]

Ejemplo

ALTER TABLE PROVEEDORES ADD DESCUENTO SMALLINT;

DROP TABLE (SQL de DB2)

Esta sentencia no forma parte del estándar SQL92 aunque si la incluyen todas las implementacionescomerciales. Aquí veremos la sintaxis del sistema DB2.

Esta instrucción 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 eliminauna 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;

DROP SYNONYM

Destruye un sinónimo de una tabla o de una vista. No froma parte del SQL92.

DROP SYNONONYM <nombre de sinónimo>

LENGUAJE DE MANIPULACIÓN DE DATOS (SQL dinámico)

En SQL92 la manipulación de datos se hace básicamente con las sentencias SELECT (seleccionar), UPDATE(actualizar), DELETE (borrar) e INSERT (insertar) que constituyen el lenguaje de manipulación de datosbásico.

6

Page 7: SQL Comandos Ejemplos

SELECT

Selecciona filas de una o más tablas.

<sentencia select>::=

SELECT [ALL | DISTINCT ] <lista de selección>

FROM { {<nombre de tabla> | <nombre de vista> } [<nombre de sinónimo>]},

[WHERE <condición de búsqueda> ]

[GROUP BY {<nombre de columna> | <número de columna>},]

[HAVING <condición de búsqueda>]

[{INTERSECT | MINUS | UNION [ALL] } <sentencia select>]

[[ORDER BY {{<nombre de columna | <número de columna>} [ASC | DESC] }, ] |

[FOR UPDATE OF <nombre de columna>,]]

<lista de selección>::= {* | {<expresión> | <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 idénticas, sólo se mostrará una de ellas.

Ejemplos

SELECT S#

FROM S

WHERE Ciudad=`PARIS'

AND Situación > 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 ;

7

Page 8: SQL Comandos Ejemplos

>mostrar las piezas rojas y verdes de una ciudad

SELECT COLOR,P_CIUDAD FROM PIEZAS

WHERE COLOR='VERDE' OR COLOR='ROJO';

Cláusula GROUP BY (agrupar por)

GROUP BY {<nombre de columna> | <número de columna>},

Esta cláusula especifica las columnas usadas para formar grupos con las filas devueltas por la sentenciaSELECT. Dentro de cada grupo todas las filas tienen el mismo valor en la o las columnas de GROUP BY.

Si está precedida de la cláusula WHERE el sistema agrupa las filas después de aplicar la cláusula WHERE.

Todas las columnas de la <lista de selección> de la sentencia SELECT deben ser funciones de columna(AVG, COUNT, MAX, MIN, SUM) o formar parte de la cláusula GROUP BY.

Ejemplo

Obtener la cantidad total suministrada de cada pieza

SELECT P#, SUM(CANT)

FROM SP

GROUP BY P# Tabla SP

Resultado: P# SUM(CANT)

P1 600

P2 1000

P3 400

P4 500

P5 500

P6 100

Obsérvese que en la tabla de suministros SP a lo mejor hay seis filas de P1 coda una con una cantidad de 100pero el resultado consiste en agruparlas por el código de la pieza.

Cláusula HAVING (con)

HAVING <condición de búsqueda>

Se utiliza para indicar que los grupos de filas agrupados por GROUP BY que se muestran deben cumplir la<condición de búsqueda>. Por lo tanto si se especifica HAVING en una sentencia SELECT deberá haberseespecificado también GROUP BY o bien todas las columnas de la <lista de selección> de SELECT deben

8

Page 9: SQL Comandos Ejemplos

formarse con funciones de columna. HAVING es a los grupos lo que WHERE es a las filas.

Ejemplo

Obtener los códigos de las piezas que son suministradas por más de un proveedor.

SELECT P#

FROM SP

GROUP BY P#

HAVING COUNT(*) >1;

Cláusula ORDER BY(Ordenar por)

ORDER BY {{<nombre de columna | número de columna>} [ASC | DESC], }

Especifica el orden en que una sentencia SELECT devuelve las filas. Las filas se pueden ordenar por unacolumna de forma ascendente ASC o descendente DESC. Si se especifican más de una columna en primerlugar se ordenan según la primera columna especidicada y dentro de esta la segunda y dentro de la segunda latercera y asi sucesivamente.

Ejemplo

Seleccionar los clientes cuya primera ficha de negocio fue 1988 y mostrarlos en orden ascendente por elcódigo postal:

SELECT Nombre_Cliente, Dirección

FROM CLIENTES

WHERE Primera_fecha ='1988'

ORDER BY Código_postal ASC;

SELECTINTO

Crea una tabla lógica de una fila a lo sumo y asigna los valores de las columnas de la fila a unas variables hostespecificadas.

SELECT [ALL | DISTINCT ] <lista de selección>

INTO {:<variable host>},

FROM { {<nombre de tabla> | <nombre de vista> } [<nombre de sinónimo>]},

[WHERE <condición de búsqueda> ]

[GROUP BY {<nombre de columna> | <número de columna>},]

[HAVING <condición de búsqueda>]

9

Page 10: SQL Comandos Ejemplos

NOTAS:

Esta sentencia se utiliza sólo dentro de un programa de aplicación. La palabra clave EXEC SQL debepreceder a esta sentencia.

Si existe más 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 selección>.

Ejemplo

En un programa C para almacenar el número de precios diferentes de artículos de un inventario actual en lavariable declarada en el programa como int número_precios escribiríamos:

EXEC SQL

SELECT COUNT (DISTINCT COSTE)

INTO: número_precios

FROM INVENTARIO

WHERE CANT >0;

UPDATE

Modifica las columnas seleccionadas de una tabla en todas las filas que satisfacen una condición de búsqueda.

UPDATE {<nombre de tabla> | <nombre de vista>}

SET {<nombre de columna> = {<expresión> | NULL }},

[WHERE <condición de búsqueda>]

Ejemplo:

Modifica sólo las piezas cuyo código 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'

10

Page 11: SQL Comandos Ejemplos

WHERE P_CODIGO='P4' OR P_CODIGO='P6';

SI QUEREMOS A LAS PIEZAS AZULES FABRICADAS EN PARIS INCREMENTARLE 4 UNIDADESDE 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 MAYORIGUAL Q 17 A AMARILLO:

UPDATE PIEZAS SET COLOR='AMARILLO'

WHERE PESO>=17;

DELETE

Borra una o más filas de una tabla o vista. Si no se especifica la cláusula WHERE, se borran todas las filas dela tabla señalada en la cláusula FROM. Si se especifica la cláusula WHERE sólo serán borradas aquellas filasque hagan la condición de búsqueda verdadera.

DELETE FROM { <nombre de tabla> | <nombre de vista>} [<nombre de alias>]

[WHERE <condición de búsqueda>]

Ejemplo:

Borrar todas las filas de tabla SP cuya CANT sea mayor que 30.

DELETE

FROM SP

WHERE CANT > 30;

INSERT

Inserta una o más filas nuevas dentro de la tabla o vista especificada. Cuando se utilice la cláusula VALUESsólo se insertará una fila. Si se utiliza una <sentencia select> el número de filas insertadas será igual aldevuelto 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.

11

Page 12: SQL Comandos Ejemplos

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 actúan sobre el total de valores en una columna de alguna tabla yproducen un sólo valor como resultado. Estas funciones son la suma (SUM), la media (AVG), el máximo deun conjunto de valores (MAX), el mínimo (MIN) y el número de valores de una columna o cuenta (COUNT).

Estas funciones se utilizan en consultas SELECT o en subconsultas. Una subconsulta es una consultaSELECT dentro de otra SELECT. Por ejemplo:

SELECT JNOMBRE

FROM J

WHERE J# IN

(SELECT J#

FROM SPJ Subconsulta

WHERE S#='S1');

Función AVG (media aritmética)

La sintaxis es:

AVG({[ALL] <expresión> | DISTINCT <nombre de columna>})

En una consulta SELECT o una subconsulta esta función crea una columna cuyo valor es el promedionumérico de los valores de la <expresión> o del <nombre de columna>. Se puede usar la cláusula GOUP BYpara crear el promedio de cada grupo de filas seleccionadas en las tablas o vistas subyacentes.

Si se especifica la cláusula DISTINCT entonces los valores duplicados en la columna no se tiene en cuenta ala hora de calcular el promedio. La cláusula ALL si tiene en cuenta todos los valores, aunque esta es la opciónpor defecto.

12

Page 13: SQL Comandos Ejemplos

Ejemplos

Obtener el promedio del coste del inventario de artículos sin contar aquellos que no están 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;

Función COUNT (Cuenta)

COUNT({ * | DISTINCT <nombre de columna>})

En una consulta SELECT o subconsulta esta función crea una columna cuyo valor es igual al número de filasde la tabla resultado o al número de valores distintos en <nombre columna>. Se puede utilizar la cláusulaGROUP BY para crear una cuenta por cada grupo de filas.

Si se especifica la cláusula DISTINCT entonces lo valores duplicados se eliminan de la cuenta.

Ejemplo

Obtener el número de clientes de cada provincia que hicieron negocio en una fecha posterior a 1985.

SELECT COUNT(*)

FROM CLIENTES

WHERE PRIMERFECHA > 1985

GROUP BY PROVINCIA;

Función MAX

MAX({[ALL] <expresion> | distinct <nombre de columna>})

En una consulta o subconsulta crea una columna cuyo valor es el valor máximo de<expresión> o <nombre decolumna>. Se puede utilizar la cláusula GROPU BY para obtener el máximo de cada grupo de filasseleccionadas en las tablas o filas subyacentes

Ejemplos

13

Page 14: SQL Comandos Ejemplos

Calcular la máxima cantidad debida a cualquier vendedor que envió una factura en Octubre.

SELECT MAX (CANTDEBIDA)

FROM CUENTASPAGAR

WHERE MESFACTURA =10;

Encontrar el artículo del inventario con el máximo coste

SELECT MAX(CANT * COSTE)

FROM INVENTARIO;

Función MIN

MIN({[ALL] <expresión> | distinct <nombre de columna>})

Es igual que MAX pero en este caso se calcula el valor mínimo.

Ejemplos

Obtener la mínima cantidad que se le debe a cualquier vendedor que envió una factura en Octubre.

SELECT MIN (CANTDEBIDA)

FROM CUENTASPAGAR

WHERE MESFACTURA =10;

Encontrar el mínimo coste de cualquier artículo del inventario

SELECT MIN(CANT * COSTE)

FROM INVENTARIO;

Función SUM

SUM({[ALL] <expresión> | distinct <nombre de columna>})

En una tabla lógica devuelta por una consulta o subconsulta crea una columna cuyo valor es la suma numéricade los valores de <expresión> o <nombre de columna>. Se puede utilizar la cláusula GROUP BY para obtenerla 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

14

Page 15: SQL Comandos Ejemplos

WHERE MESFACTURA = 10;

Obtener el total del coste del ineventario de artículos

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 DESCRIPCIÓN

CHAR[ACTER](n) Cadena de caracteres de longitud fija n

CHARACTER VARYINGCadena de caracteres de longitud variable. En lasimplementaciones reales se suele indicar la longitudmáxima. Así en DB sería VARCHAR(n).

SMALLINT Número entero en el rango −32.768 a 32.767

INTEGERNúmero entero con signo con un rango de−2.147.483.648 a 2.147.483.647 y sin signo de 0 a4.294.967.295

DEC[IMAL](p,q)Decimal empaquetado con un total de p dígitos de loscuales q hay a la derecha del punto decimal.

NUMERIC(p,q) Igual que DECIMAL

FLOAT[(p)]Número de punto flotante con una precisión de pdígitos binarios

REALIgual que FOLAT pero con una precisión definida porla implementación.

DOUBLE PRECISION Igualque REAL pero con el doble de precisión.

DATE Fecha en formato aaaammdd

TIME Hora en formato hhmmss

TIMESTAMPMarca de tiempo. Es una combinación de fecha y horacon una precisión de microsegundos.

INTERVAL Expresa diferencias entre fechas u horas

BIT Un bit

BIT VARYING Cadena de bits de longitud variable.

SQL3:El nuevo SQL

La versión actual estándar del SQL, la SQL/92, tiene su origen en la norma ISO 9075 de Julio de 1992.Actualmente la ISO y ANSI están trabajando en una nueva versión del SQL denominada SQL3 cuyo objetivofinal es convertir al SQL en un lenguaje computacional completo para la definición y el manejo de objetos

15

Page 16: SQL Comandos Ejemplos

complejos. Esto incluye jerarquías de generalización y especialización, herencia múltiple, tipos definidos porel usuario, triggers, aserciones, soporte para sistemas basados en el conocimiento, expresiones recursivas deconsultas, herramientas de administración de datos, herencia, polimorfismo, encapsulamiento, capacidadesmultimedia, etc.

En 1993 la ISO y ANSI deciden crear múltiples comités de normalización para definir el SQL3. Cada uno deestos comités se encarga de un aspecto del nuevo SQL. Estos comités son los siguientes.

Parte 1ª: marco de trabajo.

Es una descripción no técnica de cómo es la estructura del nuevo SQL3

Parte 2ª: Fundación.

Es el núcleo de la nueva especificación incluyendo nuevos tipos de datos, triggers, subtablas, tipos de datosabstractos(ADT), capacidades de orientación 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 partedel trabajo se dedica a redefinir un modelo de objetos SQL−3 compatible con el modelo de objetos propuestopor el ODMG ( Object−oriented Database consortium).

Un tipo de dato abstracto consiste en una colección de datos junto con unas operaciones que pueden realizarsesobre ellos y todo ello encapsulado y cuyos elementos pueden tener una visibilidad pública, privada oprotegida. En los lenguajes de programación orientada a objetos TAD es una clase. En el nuevo SQL setrataría de definir una tabla junto con las operaciones que se puedan realizar sobre ella. Los atributos de latabla serían los datos miembro y las operaciones serían las funciones miembro o métodos. La herenciapermitiría así crear subtablas.

La norma internacional debería estar terminada para mitad de 1999.

Parte 3ª:SQL/CLI

Es una interfase de programación a nivel de llamadas (Call Level Innterface) para bases de datos SQLdiseñada para que las aplicaciones puedan acceder a las bases de datos. Se pretende normalizar:

Una implementación independiente de la interfase de programación a nivel de llamadas para acceso abases de datos SQL.

Herramientas cliente−servidor para fácil acceso a bases de datos a través de librerías de enlacedinámico.

Soporte y fomento de un rico conjunto de herramientas cliente−servidor.•

Este comité ha trabajado con gran rapidez y el estándar es el ISO/IEC 9075−3 terminado en 1995 yactualmente está trabajando para dar soporte a las nuevas características del SQL3.

Parte 4ª: SQL/PSM (Persistent Stored Modules)

Esta parte se dedica a incorporar al SQL extensiones para lenguaje procedural, procedimientos almacenados ymúltiples instrucciones, procedimientos externos y llamadas a procedimientos.

16

Page 17: SQL Comandos Ejemplos

Extensiones para lenguaje procedural

Consiste en incorporar al SQL características típicas de los lenguajes de programación estructurados:instrucciones de control de flujo: If−then−else, bucles, excepciones, instrucciones case, bloques Begin−end,declaración de variables, etc

Procedimientos almacenados y múltiples instrucciones

Esto tiene grandes ventajas en los entornos cliente−servidor en los siguientes ámbitos:

Ejecución ya que un procedimiento almacenado puede ejecutar múltiples instrucciones SQLreduciendo así la interacción de la red con el cliente.

Seguridad ya que un usuario puede dar derecho para llamar a un procedimiento almacenado queactualice una tabla o conjunto de tablas pero denegar el derecho para actualizar las tablasdirectamente sin el procedimiento.

Código compartido ya que el código de un procedimiento almacenado no tiene que ser escrito ydepurado para cada cliente que accede a la base de datos.

Control ya que el procedimiento almacenado proporciona un único punto de definición y control parala lógica de la aplicación.

Procedimientos externos y llamadas a procedimientos

Una de las capacidades mas deseadas es permitir la llamada a funciones y procedimientos externos escritospor el usuario. El objetivo es permitir que las bases de datos puedan utilizar un rico y numeroso conjunto defunciones definidas por el comité estándar.

En la actualidad aún 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 estático de definición de datos y la partedinámica de la manipulación de datos LMD.

En la actualidad hay que resolver la gran variedad de usos que los diferentes sistemas de bases de datosrelacionales hacen tanto de la parte estática como dinámica. Por otro lado el SQL−92 tiene unacorrespondencia en los tipos de datos con los lenguajes de programación tradicionales pero no con losorientados a objetos que hay que resolver también.

Parte 6: SQL/XA

Este comité pretende normalizar una Interfase de Programación de Aplicaciones (API) entre un gestor detransacciones global y un gestor de recursos SQL. La idea es que el gestor de recursos de SQL tenga soportepara el protocolo de compromiso de dos fases. El compromiso de dos fases se basa en el avance al unísono detodos los agentes que intervienen en una transacción o el retroceso al unísono de esos agentes si la transacciónno puede realizarse.

En concreto se trabaja para especificar los parámetros de entrada y salida en términos de tipos de datos SQLpara las funciones de dicho protocolo desarrollado por X/Open.

17

Page 18: SQL Comandos Ejemplos

Parte 7ª:SQL/Temporal

Se trata de añadir capacidades relacionadas con el tiempo al SQL. La idea es que se puedan realizar consultasa las bases de datos no sólo en el estado o momento actual sino en estados previos de tiempo. Hay variassoluciones para que el nuevo SQL contemple la dimensión temporal:

Añadir dos nuevos atributos INICIO y FINAL a las relaciones base que indiquen respectivamente losmomentos en los cuales una tupla se inserta y elimina en el sentido lógico y no físico. Por ejemplo,supongamos que se inserta un nuevo proveedor de código S6 en el momento t1, entonces se crearáuna nueva tupla para S6 con NINICIO=t1 y FINAL=infinito. Si después en el instante t2 la situación(el atributo SITUACION) del proveedor S6 cambia se modificaría la primera tupla de S6 haciendoFINAL= t2 y se insertaría otra nueva tupla para S6 con INICIO=t2 y FINAL= infinito.

Mediante relaciones anidadas (subtablas) en las cuales cada tupla de una relación base incluyera unatributo especial, que sería la relación 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 librerías de clase para ciencias e ingeniería, procesamiento de documentos, métodos paramanejar objetos multimedia tales como imágenes, sonido, animación, música y vídeo.

A su vez este comité ha sido dividido en 4 partes cada una de las cuales trata un aspecto diferente delSQL/MM.

EJERCICIOS DE SQL RESUELTOS

Creación de tablas

1.− A continuación se presenta una muestra de valores de una base de datos compuesta por tres tablas deproveedores, proyectos y piezas. Los proveedores (tabla S) , las piezas (tabla P) y los proyectos (tabla J) seidentifican respectivamente por un código de proveedor (S#, un código de pieza (P#) y un número o código deproyecto (J#). El significado de una fila de la tabla de envis (tabla SPJ) es que el proveedor con código S#envía la pieza con código P# al proyecto con código J# en la cantidad especificada en CANTIDAD. Lacombinación S#P#J# identifica de forma única cada fila de la tabla de envíos. Escribir un conjunto desentencias CREATE TABLE de SQL92 para esta base de datos.

Pcodigo PNOMBRE COLOR PESO PCIUDAD

P1 Tuerca Rojo 12 Londres

P2 Perno Verde 17 París

P3 Birlo Azul 17 Roma

P4 Birlo Rojo 14 Londres

P5 Leva Azul 12 París

P6 Engrane Rojo 19 Londres

S# SNOMBRE SITUACION SCIUDAD

S1 Juan 20 Londres

S2 Antonio 10 París

S3 María 30 París

18

Page 19: SQL Comandos Ejemplos

S4 Susana 20 Londres

S5 Felipe 30 Atenas

J# JNOMBRE JCIUDAD

J1 Clasificador París

J2 Perforadora Roma

J3 Lectora Atenas

J4 Consola Atenas

J5 Terminal Londres

J6 Cinta Oslo

J7 Impresora Londres

Solución

Sin dominios.• Con dominios.•

Consultas simples

2.− Obtener para todas las piezas, el número de pieza y su peso en gramos ( los pesos se dan en libras en latabla 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 números de los proveedores de París cuya situación sea mayor que 20.

WHERE PR_CIUDAD = PARIS AND SITUATION > 20; OR PR_CIDUDAD = LONDRES;

PR_CIUDAD = PARIS OR LONDRES;

5.− Obtener los códigos de proveedor y situación de proveedores de París en orden descendente por situación.

SELECT PR_CODIGO, SITUACION FROM PROVEEDORES

WHERE PR_CIUDAD = PARIS OR BY SITUATION DESC;

6.− Obtener para todas las piezas, su código y su peso en gramos ordenando el resultado por peso y dentro depeso por código de pieza.

SELECT P_CODIGO, P_NOMBRE, PESO * 454 AS

PESO_ GRAMOS FROM PIEZAS ORDER BY PESO, P_CODIGO;

Consultas de reunión (con filtrado WHERE)

19

Page 20: SQL Comandos Ejemplos

7.−Obtener todas las combinaciones de información de proveedores y piezas tales que el proveedor y la piezaen cuestión estén situados en la misma ciudad.

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

8.− Obtener todas las combinaciones de información de proveedor y pieza donde la ciudad del proveedor sigaa la ciudad de la pieza en orden alfabético.

SELECT PROVEEDORES.*, PIEZAS.* FROM PROVEEDORES, PIEZAS, WHERE PROVEEDORES.PR_CIUDAD>PIEZAS. P_CIUDAD;

9.− Obtener todas las combinaciones de información de proveedor y pieza donde el proveedor y la pieza encuestión estén cosituados, es decir tengan la misma ciudad, pero omitiendo a los proveedores cuya situaciónsea 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 cuestión esténcosituados.

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 ciudadsuministre 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 números de proveedor tales que los dos proveedores en cuestión esténcosituados.

SELECTPR1.PR_CODIGO,PR1.PR_NOMBRE,PR1.PR_CIUDAD,PR2.PR_CODIGO,PR2.PR_NOMBRE,PR2.PR_CIUDADFROM PROVEEDORES PR1,PROVEEDORES PR2 WHERE PR1.PR_CIUDAD=PR2.PR_CIUDAD ANDPR1.PR_CODIGO<>PR2.PR_CODIGO;

Funciones de agregados

20

Page 21: SQL Comandos Ejemplos

13.− Obtener el número total de proveedores

SELECT COUNT AS TOTALPROVEEDORES FROM PROVEEDORES

14.− Obtener el número total de proveedores y almacenarlo en una variable denominada total_proveedores

SELECT COUNT (*) AS TOTAL_PROVEEDORES INTO TOTAL_PROVEEDORES FROMPROVEEDORES

15.− Obtener el número total de proveedores que suministran piezas en la actualidad

B)_ SELECT DISTINCT PR1.PR_CODIGO,PR_NOMBRE FROM PROVEEDORES PR1,RELACIONWHERE PR1.PR_CODIGO = RELACION.PR_CODIGO;

C)_ SELECT DISTINCT PR1.P_CODIGO,PR_NOMBRE FROM PIEZAS PR1,RELACION WHEREPR1.P_CODIGO = RELACION.PR_CODIGO;

16.− Obtener el número 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 código 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]))

GROUP BY PIEZAS.P_CODIGO, PIEZAS.P_NOMBRE;

19.− Obtener los códigos de todas las piezas que son suministradas por más de un proveedor.

A) SELECT RELACION.P_CODIGO, Count(*) AS Expr1

21

Page 22: SQL Comandos Ejemplos

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) ASNUMPEDIDOS, Avg(RELACION.CANTIDAD) AS MEDIAPIEZAS, Sum(RELACION.CANTIDAD) ASTOTALPIEZAS

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 códigos de proveedores cuya situación es nula

SELECT * FROM PROVEEDORES WHERE SITUACION IS NULL;

·Obtener la fecha: (ejemplo)

SELECT * FROM PROVEEDORES WHERE FECHA>=#01/01/2005# AND FECHA>=#31/05/2005#;

22

Page 23: SQL Comandos Ejemplos

·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

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 FROMPIEZAS WHERE COLOR='ROJO');

C) SELECT PR_NOMBRE FROM PROVEEDORES WHERE PR_CODIGO IN (SELECT PR_CODIGOFROM RELACION WHERE P_CODIGO IN(SELECT P_CODIGO FROM PIEZAS WHERECOLOR='ROJO'));

D) SELECT PR_NOMBRE FROM PROVEEDORES,RELACION,PIEZAS WHERERELACION.PR_CODIGO=PROVEEDORES.PR_CODIGO ANDPIEZAS.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 PIEZASWHERE COLOR='ROJO' OR COLOR='VERDE');

23.2

SELECT PR_CODIGO FROM PROVEEDORES WHERE PR_CODIGO IN (SELECT PR_CODIGO FROMRELACION 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(SELECTP_CODIGO FROM PIEZAS WHERE COLOR='VERDE'));

23.3 Obtener el nombre de los proveedores que han sudministrado alguna pieza de París y Roma.

23.4 Obtener los datos de las piezas que hayan sido sudministradas por algún proveedor de Atenas y deLondres.

24.− Obtener los códigos de proveedores situados en la misma ciudad que el proveedor con código S1.

23

Page 24: SQL Comandos Ejemplos

SELECT PR_CIUDAD FROM PROVEEDORES WHERE PR_CODIGO='S1';

SELECT * FROM PROVEEDORES WHERE PR_CIUDAD=(SELECT PR_CIUDAD FROMPROVEEDORES WHERE PR_CODIGO='S1');

25.− Obtener los códigos de proveedores cuya situación sea menor que el valor máximo actual de situación dela tabla S(PROVEEDORES)

SELECT * FROM PROVEEDORES WHERE SITUACION < (SELECT MAX(SITUACION) AS MAXIMOFROM PROVEEDORES);

Consultas con EXISTS y NOT EXISTS

26.− Obtener los nombres de los proveedores que suministran la pieza P2

SELECT * FROM PROVEEDORES WHERE EXISTS (SELECT * FROM RELACION WHEREP_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 WHEREP_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 WHERENOT EXISTS (SELECT RELACION.* FROM RELACION WHEREPIEZAS.P_CODIGO=RELACION.P_CODIGO ANDPROVEEDORES.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 FROMRELACION WHERE PIEZAS.P_CODIGO=RELACION.P_CODIGO);

28.C)

SELECT PROVEEDORES.* FROM PROVEEDORES WHERE NOT EXISTS (SELECTRELACION.PR_CODIGO FROM RELACION WHEREPROVEEDORES.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);

24

Page 25: SQL Comandos Ejemplos

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 códigos de los proveedores que suministran por lo menos todas las piezas suministradas porel proveedor S2.

Operaciones de actualización

30.−Cambiar a amarillo el color de la pieza `P2', aumentar su peso en 5 e indicar que su ciudad esdesconocida (NULL).

UPDATE PIEZAS SET COLOR='AMARILLO',PESO=PESO+5,P_CIUDAD='CUBA' WHEREP_CODIGO='P2';

30.B.Proveedores cuya situación sea >=20 le vamos a tripiclar la situación:

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 año 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 París.

SELECT * FROM RELACION WHERE RELACION.PR_CODIGO IN (SELECT PR_CODIGO FROMPROVEEDORES WHERE PR_CIUDAD='PARIS');

32.−Poner a cero la cantidad enviada por todos los proveedores de Londres.

33.−Cambiar el código de proveedor `S2' a `S9'

Operaciones de eliminación

34.−Eliminiar el proveedor `S5'

35.−Eliminar todos los envíos cuya cantidad sea mayor que 300

25

Page 26: SQL Comandos Ejemplos

36.−Eliminar todos los envíos de los proveedores situados en Londres

Operaciones de inserción

37.−Añadir la pieza `P7' (ciudad, Atenas, peso, 24; nombre y color desconocidos por ahora) a la tabla P

38.−Añadir la pieza P8(nombre, cadena, color, rosa, peso, 14, ciudad, Niza) a la tabla P

39.−Insertar un nuevo envío con código de proveedor S20, código de pieza P20, código de proyecto J4 ycantidad 1000.

40.− Para cada pieza suministrada, obtener el número de pieza y la cantidad total suministrada y guardar elresultado en una tabla temporal de la base de datos

EJERCICIOS PROPUESTOS

Sobre la misma base de datos realizar los siguientes ejercicios

Creación de la base de datos y las tablas en MySQL

Con la orden CREATE DATABASE nombre_base_datos creese la base de datos que contendrá las tablasS, P, J y SPJ.

Con la orden USE nombre_base_datos hacer que la base de datos recién creada sea la actual para su uso.• Con un editor de textos simple como el bloc de notas de Windows escribir la orden SQL para crear las tablaS, P, J y SPJ y guardar el archivo con el nombre crea_s_p_j_spj.sql (los archivos que contieneninstrucciones que pueden ejecutarse se llaman scripts).

Con la orden SOURCE nombre_script o \. nombre_script ejecutar el script crea_s_p_j_spj.sql para crearlas tablas de la base de datos.

Con la orden SHOW TABLES comprobar la existencia de las tablas en la base de datos una vez creadas.• Con la orden DESC nombre_tabla comprobar los tipos de campos de cada tabla.• Si has escrito el script crea_s_p_j_spj.sql copiándolo de las instrucciones CREATE TABLE de losejercicios resueltos de los apuntes observarás en el ejercicio anterior que la clave primaria de la tabla S esde tipo char(5) mientras que en la tabla SPJ es de tipo char(2) y deben ser iguales pues de lo contrarioestamos violando la regla de integridad referencial para claves ajenas. Se trata de que modifiques ladefinición de las tablas de manera que todas las claves primarias y ajenas sean de tipo char(5). Para ello seutiliza la orden ALTER TABLE con la opción MODIFY cuya sintaxis en MySQL es la siguiente:

ALTER [IGNORE] TABLE tbl_name MODIFY [COLUMN] column_definition [FIRST | AFTERcol_name]

Crear un archivo con el bloc de notas de windows que tenga líneas de texto. Cada línea de texto será unafila de la tabla de piezas (P) y cada columna estará separada por el carácter tabulador. El archivo tendrá elsiguiente aspecto:

p1 tuerca rojo 12 Londres

p2 perno verde 17 París

p3 birlo azul 17 Roma

p4 birlo rojo 14 Londres

p5 leva azul 12 París

26

Page 27: SQL Comandos Ejemplos

p5 engrane rojo 19 Londres

Una vez creado el archivo se pide:

Guardarlo con el nombre tabla_p.sql (atención a la extensión)• Conectarse a MySQL y cargar el archivo en la tabla de piezas (P) de la base de datos antes creadautilizando el comando:

LOAD DATA LOCAL INFILE `../..ruta_archivo../..' INTO TABLE P;

NOTAS:

El comando anterior no funciona si en el archivo encuentra por ejemplo más de un tabulador y tampoco si elarchivo se ha creado escribiendo una fila y copiándola con CTRL−C y CTRL−V.

Realizar el mismo proceso que en el ejercicio anterior para crear y cargar el archivo tabla_s.sql.• Realizar el mismo proceso que en el ejercicio anterior para crear y cargar el archivo tabla_j.sql, pero ahorase creará dicho archivo con una hoja de calculo (excel) exportándola a un archivo de texto con el caráctertabulador como separador de columnas.

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

Obtener los detalles completos de todos los proyectos• Obtener los detalles completos de todos los proyectos de Londres• Obtener los códigos de provedores que suministran piezas al proyecto J1, ordenados por número código deproveedor.

Obtener todos los envíos en los cuales la cantidad está en el intervalo 300 a 700 inclusive• Obtener una lista de todas las combinaciones de color de pieza y ciudad de pieza eliminando todas lasparejas color de pieza y ciudad de pieza repetidas

Consultas con varias tablas

Obtener todas la tripletas (número de proveedor,número de pieza,número de proyecto) tales que elproveedor, la pieza y el proyecto estén todos a la vez en la misma ciudad (cosituados)

Lo mismo que el anterior pero que no estén todos cosituados• Obtener todas la tripletas (número de proveedor,número de pieza,número de proyecto) tales que elproveedor, la pieza y el proyecto estén todos a la vez en diferente ciudad

Obtener los números de piezas suministradas por algún (los) proveedor (es) de Londres• Obtener los números de piezas suministradas por un proveedor de Londres a un proyecto de Londres• Obtener todas las parejas de nombres de ciudad tales que un proveedor de la primera ciudad suministrepiezas a un proyecto de la segunda ciudad

Obtener los números de piezas suministradas a un proyecto por un proveedor en la misma ciudad que elproyecto

Obtener los números de los proyectos a los cuales suministra piezas por lo menos un proveedor situado enuna ciudad distinta que el proyecto

Obtener todas las parejas de números de piezas tales que algún proveedor suministre las dos piezasindicadas

Funciones de agregados (COUNT, SUM, etc)

27

Page 28: SQL Comandos Ejemplos

Obtener el número total de proyectos a los cuales sumnistra piezas el proveedor S1• Obtener la cantidad total de la pieza P1 suministrada por el proveedor S1• Para cada pieza suministrada a un proyecto, obtener el número de pieza, el número de proyecto y lacantidad total correspondiente

Obtener los números de las piezas suministradas a algún proyecto tales que la cantida promediosuministrada sea mayor que 20

Consultas diversas

Obtener todos los envíos para los cuales la cantidad no sea nula• Obtener los números de proyecto y ciudades en los cuales la segunda letra del nombre de ciudad sea una o.•

Subconsultas(SELECT dentro de SELECT)

Obtener los nombres de los proyectos a los cuales suministra piezas el proveedor S1• Obtener los colores de las piezas que sumininstra el proveedor S1• Obtener los números de las piezas suministradas a cualquier proyecto de Londres• Obtener los números de los proyectos que utilizan al menos una de las piezas suministradas por elproveedor S1

Obtener los códigos de proveedores que suministren por lo menos una de las piezas suministradas por almenos uno de los proveedores que suministran por lo menos una pieza roja

Obtener los números de proveedores cuya situación sea inferior a la del proveedor S1• Obtener los números de proyectos cuya ciudad sea la primera en la lista alfabética de las ciudades dondehay proyectos

Obtener los códigos de proyectos a los cuales se suministre la pieza P1 en una cantidad promedio mayorque la cantidad máxima en la cual se suministra alguna pieza del proyecto J1

Obtener los números de los proveedores que suministran la pieza P1 a algún proyecto en una cantidadmayor que la cantidad promedio enviada de la pieza P1 para ese proyecto

Exists

Repetir el ejercicio 23 utilizando EXISTS en la solución• Repetir el ejercicio 24 utilizando EXISTS en la solución• Obtener los números de los proyectos a los que no suministra ninguna pieza roja ninguno de losproveedores de Londres

Obtener los números de los proyectos para los cuales S1 es el único proveedor• Obtener los números de piezas suministradas a todos los proyectos de Londres• Obtener los números de proveedores que suministran la misma pieza a todos los proyectos• Obtener los números de los proyectos a los que se suministren por lo menos todas las piezas suministradaspor el proveedor S1

Union

Construir una lista ordenada de todas las ciudades en las cuales esté situado por lo menos un proveedor, unapieza o un proyecto

Mostrar el resultado de la siguiente selección:•

SELECT COLOR

FROM P

UNION

28

Page 29: SQL Comandos Ejemplos

SELECT COLOR

FROM P;

Operaciones de actualización

Cambiar a gris el color de todas las piezas• Eliminar todos los proyecto para los cuales no haya envios• Insertar un nuevo proveedor (S10) en la tabla S. El nombre y la ciudade son Salazar y Nueva York y lasituación todavía no se sabe

Construir una tabla con los números de piezas suministradas ya sea por un proveedor de Londres o a unproyecto d Londres

Construir una tabla con los números de proyectos situados en Londres o a los que suministre piezas algúnproveedor de Londres

Este apartado ha sido sacado de la dirección de internet

http://www.jcc.com/SQLPages/jccs_sql.html que recoge el estado actual del SQL y cuya última actualizaciónfue el 2 de Diciembre de 1999

Apuntes de SQL

Pág. 7

(P1, 100)

(P1, 100)

(P1, 100)

(P1, 100)

(P1, 100)

(P1, 100)

S# P# J# CANTIDAD

S1 P1 J1 200

S1 P1 J4 700

S2 P3 J1 800

S2 P3 J2 200

S2 P3 J3 100

S2 P3 J4 100

S2 P3 J5 500

S2 P3 J6 300

S2 P3 J7 500

S2 P5 J2 150

S3 P3 J1 125

S3 P4 J2 200

29

Page 30: SQL Comandos Ejemplos

S4 P6 J3 200

S4 P6 J7 300

S5 P2 J4 8000

S5 P2 J2 500

S5 P5 J5 300

S5 P5 J7 700

S5 P1 J4 900

S5 P3 J4 100

S5 P4 J4 200

30