Вы находитесь на странице: 1из 24

1.

264 Tema 7

Introduccin a SQL
Lenguaje de consulta estructurado (SQL)

Tema 7:
SELECT, INSERT, DELETE y UPDATE.
Relaciones.
Tema 8:
Subconsultas.
Vistas (tablas virtuales).
Indexados.
Transacciones.
Seguridad.
Rendimiento.
SQL
El lenguaje de consulta estructurado (SQL) se utiliza para:
La definicin de datos: tablas y vistas (tablas virtuales).
La recuperacin de datos: por parte del usuario (consultas por un
motivo concreto) o de un programa.
La manipulacin de datos: un usuario o programa puede aadir,
borrar o modificar los datos.
El control de acceso.
La comparticin de datos: por usuarios concurrentes.
Mantener la integridad de los datos: mediante la definicin de
restricciones de integridad.
No es un lenguaje completo como Java, Visual Basic o C++:
SQL es un sublenguaje de unos 30 comandos.
Por lo general, va insertado en otro lenguaje o herramienta para
el acceso a bases de datos.
SQL presenta varias incoherencias; los valores NULL causan problemas.
Es transportable entre distintos sistemas operativos y, en cierto modo,
tambin entre distribuidores.
Aspectos que varan entre las distintas
implementaciones de SQL
Los cdigos de errores.
Los tipos de datos que soportan (fecha/hora, moneda,
variaciones de cadenas).
Las tablas del sistema: sobre la estructura de la base
de datos en s.
El SQL interactivo.
La interfaz de programacin: ningn distribuidor
sigue el estndar.
El SQL dinmico: utilizado por las herramientas de
consulta y de redaccin de informes.
Algunas variaciones con respecto al estndar definidas
por el fabricante.
La inicializacin, apertura y conexin de la base de datos.
Comandos bsicos de SQL

Tipos bsicos:
SELECT
INSERT
UPDATE
DELETE
SELECT es el ms importante y complejo.
Se utiliza para:
Por separado, para recuperar datos (de formularios,
informes, consultas y programas).
Como parte de INSERT, para crear nuevas filas.
Como parte de UPDATE, para actualizar filas.
Como parte de DELETE, para eliminar filas.
La instruccin SELECT de SQL
La instruccin SELECT est compuesta por
varios comandos. Se utiliza para obtener
columnas y/o filas de una o ms tablas o
vistas. Los comandos deben seguir un orden:
SELECT columnas.
FROM tabla o vista.
INTO nueva tabla.
WHERE se crea una relacin o filas especficas.
GROUP BY condiciones de agrupacin (columnas).
HAVING propiedades del grupo (filas especficas).
ORDER BY criterios de ordenacin.
Ejemplo de tablas
NumPedido Clien Prod Cant Importe Dto
1 211 Excavadora 7 31.000,00$ 0,2
Pedidos 2 522 Remachadora 2 4.000,00$ 0,3
3 522 Gra 1 500.000,00$ 0,4

NumClien Empresa RepClien LimitCredit


211 Connor Co 89 50.000,00$
Clientes 522 AmaratungaEnterprise 89 40.000,00$
890 Feni Fabricators 53 1.000.000,00$

NumRep Nombre OfiRep Cupo Ventas


RepVentas 53 Bill Smith 1 100.000,00$ 0,00$
89 Jen Jones 2 50.000,00$ 130.000,00$
Oficinas
NumOfi Ciudad Estado Region Objetivo Ventas Telf
1 Denver CO West 3.000.000,00$ 130.000,00$ 970.586.3341
2 New York NY East 200.000,00$ 300.000,00$ 212.942.5574
57 Dallas TX West 0,00$ 0,00$ 214.781.5342
Ejemplo de esquema

Pedidos Oficinas
Clientes RepVentas
NumPedido NumRep
Prod NumClien NumRep Ciudad
Cant Empresa Nombre Region
Importe LimitCredit Cupo Objetivo
NumClien (FK) (IE) NumRep (FK) (IE) Ventas Ventas
Dto NumRep (FK) (IE) Estado
Telf
Consultas SQL: SELECT
Obtener un listado de los representantes de ventas:
SELECT Nombre, Ventas, Cupo FROM RepVentas;
Calcular la cantidad en la que cada representante
supera o no llega al cupo:
SELECT Nombre, Ventas, Cupo, (Ventas-Cupo) FROM
RepVentas;
Averiguar cules son los que menos trabajan:
SELECT Nombre, Ventas, Cupo, (Ventas-Cupo) FROM
RepVentas WHERE Ventas < Cupo;

NumRep Nombre OfiRep Cupo Ventas


53 Bill Smith 1 100.000,00$ 0,00$
89 Jen Jones 2 50.000,00$ 130.000,00$
Consultas SQL: calcular, insertar,
eliminar y actualizar
Calcular el promedio de ventas:
SELECT AVG(Importe) FROM Pedidos;
Calcular el promedio de ventas a un cliente:
SELECT AVG(Importe) FROM Pedidos WHERE Clien = 211;
Aadir una oficina:
INSERT INTO Oficinas (NumOfi, Ciudad, Region, Objetivo,
Ventas) VALUES (55, Dallas, West, 200000, 0);
Eliminar un cliente:
DELETE FROM Clientes WHERE Empresa = Connor Co;
Aumentar un lmite de crdito:
UPDATE Clientes
SET LimitCredit = 75000 WHERE Empresa = Amaratunga
Enterprises;
SELECT: * y duplicados

Seleccionar todas las columnas (campos):


SELECT * FROM Oficinas;
Filas duplicadas: la consulta mostrar dos
entradas con "West":
SELECT Region FROM Oficinas;
Eliminar duplicados:
SELECT DISTINCT Region FROM Oficinas;
(El asistente de MS Access utiliza el comando
no estndar DISTINCTROW, que es diferente de
DISTINCT cuando hay relaciones).
NULL

Los valores NULL evalan a FALSO (NOT TRUE)


en todos los casos:
Insertar NuevoRep con Cupo NULL (en blanco o vaco).
Las dos consultas siguientes no mostrarn todos
los representantes de ventas:
SELECT Nombre FROM RepVentas WHERE Ventas > Cupo;
SELECT Nombre FROM RepVentas WHERE Ventas<= Cupo;
Un nuevo representante con Cupo NULL no aparecer
en ninguna de las dos listas.
Comprobar los NULLS:
SELECT Nombre FROM RepVentas WHERE Cupo IS NULL;
Operadores SELECT
SELECT * FROM <tabla>
WHERE Dto*Importe > 50000; (Pedidos)
WHERE Cupo BETWEEN 50000 AND 100000; (RepVentas)
El rango es inclusivo (>=50000 y <=100000)
WHERE Estado IN (CO, UT, TX); (Oficinas)
WHERE NumRep IS NOT NULL; (RepVentas)
WHERE Telf NOT LIKE 21%; (Oficinas)
El SQL estndar tiene slo 2 comodines:
% cualquier cadena de cero o ms caracteres (* en Access).
_ cualquier caracter individual (? en Access).
La mayora de las bases de datos tienen diferentes
comodines adicionales. En MS Access:
? (cualquier caracter individual),
* (cualquier nmero de caracteres),
# (cualquier dgito individual),
[list] cualquier caracter individual de la lista,
[!list]
SELECT: COUNT y GROUP BY
PiezaID Distribuidor
123 A
234 A
Piezas 345 B
362 A
2345 C
3464 A
4533 C
Nmero de piezas del distribuidor A:
SELECT COUNT(*) FROM Piezas WHERE Distribuidor = A;
Resultado: 4.
Nmero de piezas de cada distribuidor:
SELECT Distribuidor, COUNT(*) AS CuentaPiezas FROM Piezas
GROUP BY Distribuidor;
Resultado: Distribuidor CuentaPiezas
A 4
B 1
C 2
Ejercicios

Cul es el lmite medio de crdito de los


clientes con un lmite de crdito inferior a
1.000.000$?
Cuntas oficinas de ventas hay en la regin
West?
Aumentar un 30% el precio de las excavadoras
en todos los pedidos.
Eliminar cualquier representante de ventas
con cupo NULL.
Soluciones

Cul es el lmite medio de crdito de los clientes


con un lmite de crdito inferior a 1.000.000$?
SELECT AVG(LimitCredit) FROM Clientes WHERE
LimitCredit < 1000000;
Cuntas oficinas de ventas hay en la regin West?
SELECT Count(*) FROM Oficinas WHERE Region= 'West;
Aumentar un 30% el precio de las excavadoras en
todos los pedidos:
UPDATE Pedidos SET Importe= Importe*1.3 WHERE Prod=
'Excavadora';
Eliminar cualquier representante de ventas con cupo
NULL:
DELETE FROM RepVentas WHERE Cupo IS NULL;
Relaciones
El modelo relacional permite obtener datos de diferentes
tablas para formar nuevas e imprevistas interrelaciones.
Las interrelaciones se vuelven explcitas al manipular
los datos: cuando se consulta la base de datos, no
cuando se crea.
Esto es muy importante; permite la extensibilidad de las bases
de datos. La FAA nunca pens que sus datos se utilizaran en
el 1.264 junto con los del DOT, una tabla de cdigos postales
y algunas tablas de nuevos pedidos. Es reutilizar!
Se puede relacionar cualquier columna de una tabla con
cualquiera de otra mientras coincidan los tipos de datos y la
operacin tenga sentido. No es necesario que sean campos clave,
aunque suelen serlo.
Buenas relaciones:
La columna relacionada suele ser un campo clave: ya sea clave
primaria o secundaria.
Las columnas relacionadas deben tener tipos de datos
compatibles.
Las de valor Null nunca se relacionan.
Relaciones
Obtener un listado de todos los pedidos, en el que figuren el nmero
de pedido y la cantidad y el nombre y lmite de crdito del cliente:
La tabla pedidos contiene el nmero de pedido y la cantidad, pero no
los nombres ni los lmites de crdito de los clientes.
La tabla clientes contiene los nombres de los clientes y su lmite de
crdito, pero no la informacin de los pedidos.
SELECT NumPedido, Importe, Empresa, LimitCredit FROM
Clientes, Pedidos WHERE Clien = NumClien;
(SQL estndar)
SELECT NumPedido, Importe, Empresa, LimitCredit FROM Clientes
INNER JOIN Pedidos ON Clientes.Nmclien = Pedidos.Clien;
(Access)
NumPedido Clien Prod Cant Importe Dto
1 211 Bulldozer 7 31.000,00$ 0,2
2 522 Riveter 2 4.000,00$ 0,3
3 522 Crane 1 500.000,00$ 0,4

Relacin NumClien Empresa RepClien LimitCredit


211 Connor Co 89 50.000,00$
522 Amaratunga Enterprises 89 40.000,00$
890 Feni Fabricators 53 1.000.000,00$
Relacin entre 3 tablas
Obtener un listado de los pedidos de ms de 25.000
dlares, en el que figure el nombre del vendedor que
atendi el pedido y el del cliente que lo realiz:
SELECT NumPedido, Importe, Empresa, Nombre FROM Pedidos,
Clientes, RepVentas WHERE Clien = NumClien AND RepClien
= NumRep AND Importe >= 25000; (SQL estndar)
NumPedido Clien Prod Cant Importe Dto
1 211 Excavadora 7 31.000,00$ 0,2
2 522 Remachadora 2 4.000,00$ 0,3
3 522 Gra 1 500.000,00$ 0,4
NumClien Empresa RepClien LimitCredit
211 Connor Co 89 50.000,00$
522 Amaratunga Enterprises 89 40.000,00$
890 Feni Fabricators 53 1.000.000,00$

NumRep Nombre OfiRep Cupo Ventas


53 Bill Smith 1 100.000,00$ 0,00$
89 Jen Jones 2 50.000,00$ 130.000,00$
NumPedido Importe Empresa Nombre
Resultado: 1 34.000,00$ Connor Co Jen Jones
3 500.000,00$ AmaratungaEnterprise Jen Jones
Comentarios sobre las relaciones
Sintaxis en MS Access del ejemplo anterior:
SELECT NumPedido, Importe, Empresa, Nombre
FROM RepVentas INNER JOIN (Clientes
INNER JOIN Pedidos ON Clientes.NumClien =
Pedidos.Clien) ON RepVentas.NumRep =
Clientes.RepClien WHERE Importe >= 25000;
Resulta un poco confuso; utilizaremos la herramienta
consulta de MS Access para obtener el cdigo SQL.
Tener cuidado al utilizar * en las relaciones:
Hace referencia a todas las columnas de todas las tablas
implicadas en la relacin.
Si un campo tiene el mismo nombre en las tablas
que se relacionan hay que cualificar su nombre:
Utilizar tabla1.nombrecampo, tabla2.nombrecampo
Clientes.NumClien, Pedidos.Importe, etc.
Relaciones dentro de la propia tabla
NumEmp Nombre Posicion Enc
105 Mary Smith Analista 104
109 Jill Jones Analista senior 107
104 Sally Silver Encargado 111
107 Pat Brown Encargado 111
111 Eileen Howe Presidente

Queremos un listado de los analistas y sus encargados:


Encargado podra ser una clave secundaria de la tabla Encargados
pero, en este caso, tiene que ser clave "secundaria" de la propia
tabla Empleados.
Intento 1:
SELECT Nombre, Nombre FROM Empleados, Empleados WHERE
Enc = NumEmp; (SQL estndar)
Es errnea porque hace referencia a la tabla Empleados dos veces.
Si eliminamos la segunda referencia tampoco sera correcta; esta
consulta busca las filas en las que una persona es su propio
encargado y eso no es lo que queremos.
Relaciones dentro de la propia tabla
NumEmp Nombre Posicion Enc
105 Mary Smith Analista 104
109 Jill Jones Analista senior 107
104 Sally Silver Encargado 111
107 Pat Brown Encargado 111
111 Eileen Howe Presidente

Intento 2: pretender que hay 2 copias de la tabla


Empleados, una llamada Emp y la otra Enc:
SELECT Emp.Nombre, Enc.Nombre FROM Emp, Enc WHERE
Emp.Enc = Enc.NumEmp; (SQL estndar)
SQL permite hacer esto mediante el uso de alias. Vlido:
SELECT Emp.Nombre, Enc.Nombre FROM Empleados Emp,
Empleados Enc WHERE Emp.Enc = Enc.NumEmp; (SQL estndar)
SELECT Emp.Nombre, Enc.Nombre FROM Empleados AS Emp
INNER JOIN Empleados AS Enc ON Emp.Enc = Enc.NumEmp; (Access)
En realidad slo es necesario que utilicemos 1 alias (Enc).
Ejercicios

Obtener un listado de los nombres de los clientes


cuyo lmite de crdito es superior al cupo de su
representante de ventas. Listar tambin el lmite
de crdito y el cupo.
Obtener un listado de los nombres y nmeros de
telfono de los representantes.
Soluciones

Obtener un listado de los nombres de los clientes cuyo


lmite de crdito es superior al cupo de su representante
de ventas. Listar tambin el lmite de crdito y el cupo:
SELECT LimitCredit, Cupo, Empresa FROM RepVentas
INNER JOIN Clientes ON RepVentas.NumRep =
Clientes.RepClien WHERE LimitCredit > Cupo;
Obtener un listado de los nombres y nmeros de
telfono de los representantes:
SELECT Nombre, Telf FROM Oficinas INNER JOIN
RepVentas ON Oficinas.NumOfi = RepVentas.OfiRep;

Вам также может понравиться