Академический Документы
Профессиональный Документы
Культура Документы
procedimientos
almacenados
Ahora que Mary puede tener acceso a la base de datos TestData, puede que desee
crear algunos objetos de base de datos, como una vista o un procedimiento
almacenado y concederle a Mary acceso a los mismos. Una vista es una instruccin
SELECT almacenada y un procedimiento almacenado es una o varias instrucciones
Transact-SQL que se ejecutan como un lote.
Las vistas se consultan como las tablas y no aceptan parmetros. Los
procedimientos almacenados son ms complejos que las vistas. Los procedimientos
almacenados pueden tener parmetros de entrada y salida y pueden contener
instrucciones para controlar el flujo del cdigo, como instrucciones IF y WHILE. Una
prctica recomendable de programacin es usar procedimientos almacenados para
realizar todas las tareas repetitivas en la base de datos.
Para este ejemplo, usar CREATE VIEW para crear una vista que seleccione solo dos
de las columnas de la tabla Products. A continuacin, usar CREATE PROCEDURE
para crear un procedimiento almacenado que acepta un parmetro de precio y
devuelve solo los productos cuyo costo es menor que el valor del parmetro
especificado.
Ejecute la instruccin siguiente para crear una vista muy sencilla que ejecuta
una instruccin SELECT y devuelve los nombres y los precios de nuestros
productos al usuario.
CREATE VIEW vw_Names
AS
SELECT ProductName, Price FROM Products;
GO
Pruebe la vista
Las vistas se tratan como tablas. Use una instruccin SELECT para tener
acceso a la vista.
SELECT * FROM vw_Names;
GO
Seguridad, nos pueden interesar que los usuarios tengan acceso a una parte de la
informacin que hay en una tabla, pero no a toda la tabla.
Comodidad, como hemos dicho el modelo relacional no es el ms comodo para visualizar
los datos, lo que nos puede llevar a tener que escribir complejas sentencias SQL, tener una
vista nos simplifica esta tarea.
Las vistas no tienen una copia fsica de los datos, son consultas a los datos que hay en las
tablas, por lo que si actualizamos los datos de una vista, estamos actualizando realmente la
tabla, y si actualizamos la tabla estos cambios sern visibles desde la vista.
Nota: No siempre podremos actualizar los datos de una vista, depender de la complejidad de
la misma (depender de si el conjunto de resultados tiene acceso a la clave principal de la tabla
o no), y del gestor de base de datos. No todos los gestores de bases de datos permiten
actualizar vistas, ORACLE, por ejemplo, no lo permite, mientras que SQL Server s.
VIEW, debiendo
CREATE VIEW
vAlquileres
AS
(
SELECT nombre, apellidos,
matricula
FROM tAlquileres, tClientes
WHERE ( tAlquileres.codigo_cliente
tClientes.codigo
VIEW
vAlquileres
AS
(
SELECT nombre, apellidos,
matricula, fx_alquiler, fx_devolucion
FROM tAlquileres, tClientes
WHERE ( tAlquileres.codigo_cliente
)
tClientes.codigo
Por ltimo podemos eliminar la vista a travs de la sentencia DROP VIEW. Para eliminar la
vista que hemos creado anteriormente se uitlizara:
DROP VIEW vAlquileres;
BEGIN
Todo el codigo puro de base de datos
END
Como probamos: Esto es lo ms fcil de realizar solo necesitamos lo siguiente: Escribimos
EXEC nombre_del_procedimiento ' variables',12,' variables'
Nota: Cabe destacar que no necesariamente se deben definir variables en el caso de un Select
* From solo pondremos EXEC y nombre del procedimiento
Vamos a realizar un ejemplo
Codigo: 001 ; Nombre: Patricia ; Apellido: Colimba ; Edad: 21; Universidad: UTN
Ejecutamos el procedimiento almacenado con los datos anteriores tomando en
consideracin que: los campos tipo int se envan sin comilla el resto dentro de comilla.
Para ejecutar el procedimiento almacenado escribimos EXEC + el nombre del
procedimiento + las variables si fuera el caso y clic en ejecutar
7.3 TRIGGERS
Un trigger( o desencadenador) es una clase especial de procedimiento
almacenado que se ejecuta automticamente cuando se produce un evento en el servidor de
bases de datos.
Los triggers pueden incluir cualquier nmero y clase de instruccin de Transact- SQL.
Desde el Trigger podremos obtener los datos de la fila que se ha modificado o aadido
utilizando inserted o deleted:
Trigger DML, se ejecutan cuando un usuario intenta modificar datos mediante un evento de
lenguaje de manipulacin de datos (DML). Los eventos DML son instrucciones INSERT,
UPDATE o DELETE de una tabla o vista.
Trigger DDL, se ejecutan en respuesta a una variedad de eventos de lenguaje de definicin
de datos (DDL). Estos eventos corresponden principalmente a instrucciones
CREATE, ALTER y DROP de Transact-SQL, y a determinados procedimientos
almacenados del sistema que ejecutan operaciones de tipo DDL. Trigger DML, se ejecutan
cuando un usuario intenta modificar datos mediante un evento de lenguaje de manipulacin
de datos (DML). Los eventos DML son instrucciones INSERT, UPDATE o DELETE de una
tabla o vista.
Ejemplo 1:
Como ejemplo crearemos un Trigger que avise al webmaster con un mail cuando un usuario se
da de alta en nuestro web, para crear el trigger solo se han de seguir los pasos arriba
indicados, como muestran las imgenes y el cdigo es el siguiente, haciendo Copy & Paste
funciona.
El funcionamiento del trigger es muy sencillo, declaramos dos variables, una para el mensaje
que se enviar en el mail y otra para obtener el ID del registro recin insertado y luego este
ID lo concatenamos al mensaje para envirselo al webmaster.
Exec master.dbo.xp_sendmail
@recipients = webmaster@dominio.com,
@subject = Nuevo usuario,
@message = @Mensaje
EJEMPLO 2:
Para indicar los triggers en esta base hacemos lo siguiente:
Podemos hacer dentro de nuestra base o creamos una Nueva Consulta, donde llamamos a
nuestra base:
use Biblioteca
y comenzamos realizando nuestros triggers asi:
--Trigger que inserta una fila historico cuando se borra un prestamo
/*4. Siempre que se borra una fila de la tabla PRESTAMO, se inserta en HISTORICO la
fila con los datos correspondientes al prestamo que se borra*/ create trigger
tr_delete_prestamo2
on PRESTAMO
after delete as declare
@a char(3),
@b smallint,
@c datetime,
@d smallint,
@e int,
@f datetime select
@a=DELETED.isbn,
@b=DELETED.copiaNro,
@c=DELETED.fechaPrestamo,
@d=DELETED.tituloNro,
@e=DELETED.usuarioNro,
@f=DELETED.fechaDebeDevolver from DELETED
insert into HISTORICO values(@a,@b,@c,@d,@e,@f,null,null,null)
Para ver el resultado tenemos que insertar a la tabla histrico lo siguiente:
insert into HISTORICO values(@a,@b,@c,@d,@e,@f,null,null,null) Luego llamamos a la tabla
histrico y prestamo
select * from historico select * from prestamo
Ejecutamos el triggers.
--VER VISTAS
/*
SOLO LOS DEL ROL DEL SISTEMA SYSADMIN, O DE EL ROL DE
BASE DE DATOS DB_OWNER,
DB_DLADMIN HACEN CONSULTAS
O BIEN AL TENER PERMINOS CREATE VIEW Y PERMISOS DE
SELECT EN LAS TABLAS A UTILIZAR
-NO SE PUEDE USAR COMPUTE COMPUTE BY
-NO SE PUEDE USAR ORDER BY SO SI SE USA TOP
-NO SE PUEDE HACER REFERENCIA A TABLAS TEMPORALES
-NO SE PUEDE HACER REFERENCIA A MAS DE 1024 COLUMNAS
-NO SE PUEDE COMBINAR CREATE VIEW EN OTRO LOTE
*/
ALTER VIEW
VIEW_SUPPLIER_PRODUCS
AS
SELECT S.SUPPLIERID,S.COMPANYNAME,S.CONTACTNAME
,P.PRODUCTID,P.PRODUCTNAME, P.UNITPR ICE
FROM SUPPLIERS AS S INNER JOIN PRODUCTS AS P
ON
S.SUPPLIERID=P.SUPPLIERID
GO
VARIAS TABLAS
INSERT PROVEEDORES_PRODUCTOS(COMPANYNAME,CONTACTNAME,CO
UNTRY,PRODUCTNAME,UNITPRICE)
VALUES('CARDENAS','VICTOR HUGO','GUATEMALA','LECHE EN
POLVO',788.00)
INSERT PROVEEDORES_PRODUCTOS(COMPANYNAME,CONTACTNAME,CO
UNTRY)
VALUES('CARDENAS','VICTOR HUGO','GUATEMALA')
--VISTAS DIVIDIDAS
-- ALL Incorpora todas las filas en los resultados,
incluidas las duplicadas.
--Si no se especifica lo contrario, se quitan las filas
duplicadas.
/*
WITH CHECK OPTION
WITH ENCRYPTION
SCHEMABINDING
VIEW_METADATA
1.
JUL
12
VISTAS
----- Vistas ---Una vista es una consulta especial que se emplea para registrar selecciones complejas o
que se usan frecuentemente.
Una vez creada la vista se puede realizar una seleccin de los datos como si fuera esta
una tabla e incluso se puede utilizar para definir procedimientos almacenados.
EJEMPLOS :
1. Crear una vista que liste 3 campos de clientes
as
select IdCliente,NombreCompaa,Pas from Clientes
go
3.
Crear
una
vista
liste NombreProducto,NombreCategora,PrecioUnidad,Suspendido
que
4. Utilizando la vista anterior , crear una vista que muestre el total de productos x
categoria
create view total_prodxcateg
as
select NombreCategora,COUNT(*)as Totalprodxcateg from v_productos
group by NombreCategora
go
5. Crear una vista que nos devuelva la cantidad de pedidos que tiene cada empleado
en
los
---aos 94,95 y 96
COUNT(*)from
v_empleado
YEAR(FechaPedido)=1995)as Ao_1995,
where
e.Nombre=c.Nombre
and
(select
COUNT(*)from
v_empleado
where
e.Nombre
=c.Nombre
and
YEAR(FechaPedido)=1996)as Ao_1996
from v_empleado c
group by Nombre
6. Crear una vista que presente el total de pedido que tiene cada compaia de envio
Add a comment
2.
3.
JUL
12
COMBINACION DE TABLAS
Hay
formas
de
hacerlo:
SELECT
FROM
NOMBRECATEGORA,NOMBREPRODUCTO
Productos
ON
INNER
JOIN
P.IdCategora
Categoras
=C.IdCategora
GO
-Segunda Forma : (WHERE)
SELECT
FROM
WHERE
NOMBRECATEGORA,NOMBREPRODUCTO
Productos
P
P.IdCategora
Categoras
=C.IdCategora
GO
NOMBRECATEGORA,NOMBREPRODUCTO
Productos
ON
P LEFT
OUTER
JOIN Categoras
P.IdCategora
=C.IdCategora
GO
---DERECHA ---> LISTA TODAS LA CATEGORAS QUE NO TIENES PRODUCTOS
SELECT
FROM
NOMBRECATEGORA,NOMBREPRODUCTO
Productos
ON
P RIGHT
OUTER
JOIN Categoras
P.IdCategora
=C.IdCategora
GO
---- COMPLETA ----> LISTA TODOS LOS PRODUCTOS CON SUS CATEGORAS,
PRODUCTOS QUE NO TIENE CATEGORAS
Y LAS CATEGORIAS QUE NO TIENEN PRODUCTOS
SELECT
FROM
ON
NOMBRECATEGORA,NOMBREPRODUCTO
Productos
P FULL
OUTER
JOIN Categoras
P.IdCategora
GO
Add a comment
4.
JUL
12
=C.IdCategora
create
database
ventas
go
use
ventas
go
Para crear la tabla tienda preguntamos si existe, si existe la borramos y la creamos
para evitar errores al momento de ejecutar varias veces
if
exists(select
from
sysobjects
drop
where
type
='u'
and
name
table
='Tienda')
Tienda
go
create
table
Tienda
(
IdTienda
int
identity(1,1)primary
NombreTienda
key,
varchar(30) not
Estado
null,
varchar(10)not
null)
go
nota
-
:
estoy
estableciendo
que
el
campo IdTienda
es
llave
primaria
- estoy estableciendo que el campo NombreTienda tiene que ser llenado obligatoriamente
al
momento
de
ingresar
un
nuevo
registro
table
TiendaProducto
go
create
table
TiendaProducto
(
IdTienda
IdProducto
Cantidad
int
not
int
not
int
null,
null,
)
go
-estoy
alter
asignando
table
dos
llaves
TiendaProducto
primarias
add
la
constraint
tabla
TiendaProducto
pk_TiendaProducto
primary
key(IdTienda,IdProducto)
-estoy relacionando el campo IdTienda que es llave primaria con el campo IdTienda
de
la
tabla
Tienda
Tienda(IdTienda)
relacionando
el
campo
campo IdProducto de
IdProducto que
es
llave
la
tabla
primaria con
el
Producto
if
exists(select
from
sysobjects
drop
where
type='u'
and
name
='Producto')
table
Producto
go
create
table
Producto
(
IdProducto
int
NombreProducto
identity(1,1)primary
char(30)
Precio
key,
not
Money
null,
not
null)
go
Creamos la tabla Empleado
if
exists(select
from
sysobjects
drop
where
type='u'
and
name
='Empleado')
table
Empleado
go
create
table
Empleado
(
IdEmpleado
int
Nombres
char(30)
Apellidos
-relaciono
IdTienda
go
identity(1,1)primary
key,
not
null,
varchar(30)not
el
campo
int
IdTienda
foreign
de
Empleado
key
null,
con
references
IdTienda
de
Tienda
Tienda(IdTienda))
sp_dbcmptlevel
authorization
on
exec
'ventas','90';
database
::ventas
to
sp_dbcmptlevel
Sa
'ventas','90';
go
Publicado 12th July 2012 por kevin lopez chavez
Add a comment
5.
JUL
12
SUBCONSULTAS
---- SUBCONSULTAS ---Una subconsulta es una consulta dentro de otra que se puede emplear para obtener
totales y seleccin de datos de tablas anidadas
EJEMPLOS
---CONTAR
select
LOS
CLIENTES
distinct
DE
Pas
:
UN
DETERMINADO PAS---
,(select
COUNT(*)
from
where
c2.Pas
as
from
Clientes
order
by
Clientes
c2
=c1.Pas)
total_clientes
c1
Pas
go
---SUMA
select
EL
PRECIO
DE
Nombrecategora,(select
UNA CATEGORA DE
SUM(PrecioUnidad)from
PRODUCTOS
---
Productos
where
p.IdCategora
c.IdCategora
from
)as
Suma_PrecioUnidad
Categoras
go
---CUENTA
LOS
PEDIDOS
DEL
CLIENTE
---
Pedidos_Del_Cliente
from
Clientes
go
---CLIENTES
select
where
QUE
SEAN
NombreCompaa
IdCliente
IN
(select
as
IdCliente
DE MXICO ---
Clientes
from
from
Clientes
where
Clientes
Pas='Mxico')
go
---CLIENTES
QUE
COMPRARON
select
NombreCompaa
(select
IdCliente
(select
IdPedido
(select
IdProducto
as
Clientes
from
from
from
EL PRODUCTO PEZ
from
Clientes
Pedidos
Productos
where
where
where
DetallesDepedidos
ESPADA
where
IdCliente
--in
IdPedido
in
IdProducto
in
NombreProducto='Pez
Espada')))
go
distinct
year(fechaPedido),(select
COUNT(*)
from
where
year(d.FechaPedido
year(p.FechaPedido
as
from
Pedidos
))
Pedidos_X_Ao
Pedidos
go
La sentencia SELECT
La sentencia SELECT nos permite consultar los datos almacenados en una tabla
de la base de datos.
El formato de la sentencia select es:
Veamos por partes que quiere decir cada una de las partes que conforman la
sentecia.
Significado
SELECT
ALL
Palabra clave que indica que la sentencia de SQL que queremos ejecutar es
de seleccin.
Indica que queremos seleccionar todos los valores.Es el valor por defecto y no
suele especificarse casi nunca.
FROM
WHERE
Especifica una condicin que debe cumplirse para que los datos sean
devueltos por la consulta. Admite los operadores lgicos AND y OR.
GROUP BY
HAVING
Especifica una condicin que debe cumplirse para los datosEspecifica una
condicin que debe cumplirse para que los datos sean devueltos por la
consulta. Su funcionamiento es similar al de WHERE pero aplicado al
conjunto de resultados devueltos por la consulta. Debe aplicarse siempre
junto a GROUP BY y la condicion debe estar referida a los campos contenidos
en ella.
ORDER BY
SELECT matricula,
marca,
modelo,
color,
numero_kilometros,
num_plazas
FROM tCoches
ORDER BY marca,modelo;
La palabra clave FROM indica que los datos sern recuperados de la tabla
tCoches. Podriamos haber especificado mas de una tabla, pero esto se ver en el
apartado de consultas combinadas.
Tambien podramos haber simplicado la consulta a travs del uso del comodin de
campos, el asterisco "*".
SELECT *
FROM tCoches
ORDER BY marca,modelo;
El uso del asterisco indica que queremos que la consulta devuelva todos los
campos que existen en la tabla.
[arriba]
La clusula WHERE
La clusula WHERE es la instruccin que nos permite filtrar el resultado de una
sentencia SELECT. Habitualmente no deseamos obtener toda la informacin
existente en la tabla, sino que queremos obtener slo la informacin que nos resulte
util es ese momento. La clusula WHERE filtra los datos antes de ser devueltos por
la consulta.
En nuestro ejemplo, si queremos consultar un coche en concreto debemos
agregar una clusula WHERE. Esta clusula especifica una o varias condiciones que
deben cumplirse para que la sentencia SELECT devuelva los datos. Por ejemplo,
para que la consulta devuelva slo los datos del coche con maricula M-1525-ZA
debemos ejecutar la siguiente sentencia:
SELECT matricula,
marca,
modelo,
color,
numero_kilometros,
num_plazas
FROM tCoches
WHERE matricula = 'M-1525-ZA';
Cuando en una clusula where queremos incluir un tipo texto,
debemos incluir el valor entre comillas simples.
SELECT matricula,
marca,
modelo,
color,
numero_kilometros,
num_plazas
FROM tCoches
WHERE matricula = 'M-1525-ZA'
OR matricula = 'M-2566-AA' ;
Adems una condicin WHERE puede ser negada a travs del operador
lgico NOT. La siguiente consulta devolver todos los datos de la tabla tCohes
menos el que tenga matricula M-1525-ZA.
SELECT matricula,
marca,
modelo,
color,
numero_kilometros,
num_plazas
FROM tCoches
WHERE NOT matricula = 'M-1525-ZA' ;
La clusula ORDER BY
Como ya hemos visto en los ejemplos anteriores podemos especificar el orden en
el que sern devueltos los datos a travs de la clusula ORDER BY.
SELECT matricula,
marca,
modelo,
color,
numero_kilometros,
num_plazas
FROM tCoches
ORDER BY marca ASC,modelo DESC;
SELECT matricula,
marca,
modelo,
color,
numero_kilometros,
num_plazas
FROM tCoches
ORDER BY 2;
Insertar datos.
Hasta ahora hemos visto como se almacenan los datos en una base de datos y
como consultar esos datos almacenados, pero no hemos visto como almacenar
dichos datos.
Para almacenar datos en una base de datos debemos insertar filas en las tablas.
Para ellos SQL pone a nuestra disposicin la sentencia INSERT.
[arriba]
Insercin de filas
El proceso de insercin de filas consiste en aadir a una tabla una o ms filas y
en cada fila todos o parte de sus campos.
Podemos distinguir dos formas de insertar filas:
Ninguna de las filas devueltas por la consulta debe infringir las reglas de
integridad de la tabla en la que vayamos a realizar la insercin.
Pongamos un ejemplo, vamos a crear una tabla con las diferentes marcas que
tenemos en la base de datos. La sentencia SQL para crear la tabla es la siguiente:
color)
values
('M2233FH',
'SEAT',
'LEON FR',
'ROJO');
INSERT INTO tCoches
(matricula,
marca
,
modelo
,
color)
values
('M1332FY',
'FORD',
'FIESTA',
'GRIS PLATA');
Ahora tenemos tres marcas diferentes en la tabla tCoches, y queremos
insertarlas en la tabla de marcas, para ello podemos realizar tres inserciones
individuales, pero que pasaria si no supieramos de antemano el nmero de
marcas?y si fueran unas cincuenta marcas?. Nos podriamos pasar el da entero
escribiendo sentencias insert into.
Afortunadamente podemos realizar una insercin multiple del siguiente modo:
MARCA
1 FORD
2 RENAULT
3 SEAT
La sentencia DELETE.
Para borrar datos de una tabla, debemos utilizar la sentencia DELETE.
La sentencia TRUNCATE
Para realizar un borrado completo de tabla debemos considerar la posibilidad de
utilizar la sentencia TRUNCATE, mucho ms rpida que DELETE.
La sintaxis de la sentencia TRUNCATE es la siguiente:
Actualizacin de datos.
La sentencia UPDATE.
Para la actualizacin de datos SQL dispone de la sentencia UPDATE. La
sentencia UPDATE permite la actualizacin de uno o varios registros de una nica
tabla. La sintaxis de la sentencia UPDATE es la siguiente
UPDATE <nombre_tabla>
SET <campo1> = <valor1>
{[,<campo2> = <valor2>,...,<campoN> = <valorN>]}
[ WHERE <condicion>];
Las siguientes sentencias actualizan los datos de la tabla tCoches con los valores
de la tabla tMarca obtenidos anteriormente en la pgina dedicada a la insercin de
datos.
UPDATE tCoches
SET marca = '1'
WHERE marca = 'FORD';
UPDATE tCoches
SET marca = '2'
WHERE marca = 'RENAULT';
UPDATE tCoches
SET marca = '3'
WHERE marca = 'SEAT';
Notese que los valores para el campo marca aparecen entrecomillados, ya que es
un campo de tipo varchar. Los valores con los que actualicemos los datos deben
ser del tipo del campo.
Un aspecto a tener en cuenta es que los campos que forman la primary key de
una tabla slo se podrn modificar si los registros no estn referenciados en
ninguna otra tabla. En nuestro caso slo podremos modificar la matrcula de un
coche si no tiene registros asociados en la tabla tAlquileres.
Esto puede causar poblemas, ya que podramos habernos equivocado al dar de alta
el coche en la tabla tCoches y detectar el error despues de alquilar el coche. En tal
caso tendramos dar de alta un nuevo coche con la matrcula correcta, actualizar los
registros de la tabla alquileres y por ltimo borrar el registro erroneo de la tabla
tCoches. Este proceso puede ser bastante complicado en el caso de
que existiran ms relaciones con la tabla. Se podra considerar que la clave primaria
de la tabla esta mal definida y que la matrcula no debe ser el elemento que
identifique el coche. Una alternativa seria crear un cdigo autonumrico para la
tabla tCoches que realizar las veces de clave primaria y crear un ndice nico para
la matrcula, este diseo tambien tiene sus "pegas", por lo que debemos decidir que
modelo utilizar, y seleccionar las claves primarias con sumo cuidado.
[arriba]
UPDATE <nombre_tabla>
SET <campo1> = <valor1> | <subconsulta1>
{[,<campo2> = <valor2> | <subconsulta2>
,...
, <campoN> = <valorN> | <subconsultaN>]}
[ WHERE <condicion>];
Como puede verse la sintaxis es practicamente igual a la sintaxis del la
sentencia UPDATE, con la salvedad de que podemos utilizar subconsultas en lugar
de valores al asignar los campos. De forma generica podemos decir que las
subconsultas son consultas SELECTincluidas dentro de otra sentencia SQL.
Las siguientes sentencias UPDATE son equivalentes:
El tipo de datos devuelto por la subconsulta debe ser del mismo tipo que el
campo al que estamos asignando el valor.
Combinacin interna
Combinacin externa
Uniones
[arriba]
Combinacin interna.
La combinacin interna nos permite mostrar los datos de dos o ms tablas a
travs de una condicin WHERE.
Si recordamos los ejemplos de los capitulos anteriores tenemos una tabla de
coches, en la que tenemos referenciada la marca a travs del cdigo de marca. Para
realizar la consulta combinada entre estas dos tablas debemos escribir una
consulta SELECT en cuya clasula FROM escribiremos el nombre de las dos tablas,
separados por comas, y una condicin WHERE que obligue a que el cdigo de
marca de la tabla de coches sea igual al cdigo de la tabla de marcas.
Lo ms sencillo es ver un ejemplo directamente:
SELECT tCoches.matricula,
tMarcas.marca,
tCoches.modelo,
tCoches.color,
tCoches.numero_kilometros,
tCoches.num_plazas
FROM tCoches, tMarcas
WHERE tCoches.marca = tMarcas.codigo
La misma consulta de forma "visual" ...
Demonos cuenta que hemos antepuesto el nombre de cada tabla a el nombre del
campo, esto no es obligatorio si los nombres de campos no se repiten en las tablas,
pero es acondajable para evitar conflictos de nombres entre campos. Por ejemplo, si
para referirnos al campo marca no anteponemos el nombre del campo la base de
datos no sabe si queremos el campo marca de la tabla tCoches, que contiene el
cdigo de la marca, o el campo marca de la tabla tMarcas, que contiene el nombre
de la marca.
Otra opcin es utilizar la clusula INNER JOIN. Su sintaxis es identica a la de una
consulta SELECT habitual, con la particularidad de que n la clusula FROM slo
aparece una tabla o vista, aadiendose el resto de tablas a travs de
clusulas INNER JOIN .
SELECT tCoches.matricula,
tMarcas.marca,
tCoches.modelo,
tCoches.color,
tCoches.numero_kilometros,
tCoches.num_plazas
FROM tCoches
INNER JOIN tMarcas ON tCoches.marca = tMarcas.codigo
La clusula INNER JOIN permite separar completamente las condiciones de
combinacin con otros criterios, cuando tenemos consultas que combinan nueve o
diez tablas esto realmente se agradece. Sin embargo muchos programadores no
son amigos de la clusula INNER JOIN, la razn es que uno de los principales
gestores de bases de datos, ORACLE, no la soportaba. Si nuestro porgrama debia
trabajar sobre bases de datos ORACLE no podiamos utilizar INNER JOIN. A partir
de la version ORACLE 9i oracle soporta la clusula INNER JOIN.
[arriba]
Combinacin Externa
La combinacin interna es excluyente. Esto quiere decir que si un registro no
cumple la condicin de combinacin no se incluye en los resultados. De este modo
en el ejemplo anterior si un coche no tiene grabada la marca no se devuelve en mi
consulta.
Segn la naturaleza de nuestra consulta esto puede ser una ventaja , pero en
otros casos significa un serio problema. Para modificar este comportamiento SQL
pone a nuestra disposicin la combinacin externa. La combinacin externa no es
excluyente.
La sintaxis es muy parecida a la combinacin interna,
SELECT tCoches.matricula,
tMarcas.marca,
tCoches.modelo,
tCoches.color,
tCoches.numero_kilometros,
tCoches.num_plazas
FROM tCoches
LEFT OUTER JOIN tMarcas ON tCoches.marca = tMarcas.codigo
Esta consulta devolver todos los registros de la tabla tCoches,
independientemente de que tengan marca o no. En el caso de que el coche no
tenga marca se devolver el valor null para los campos de la tabla tMarcas.
Visualmente (la consulta devuelve los datos en azul) ...
SELECT tCoches.matricula,
tMarcas.marca,
tCoches.modelo,
tCoches.color,
tCoches.numero_kilometros,
tCoches.num_plazas
FROM tCoches
RIGHT OUTER JOIN tMarcas ON tCoches.marca = tMarcas.codigo
Esta consulta devolver los registros de la tabla tCoches que tengan marca
relacionada y todos los registros de la tabla tMarcas, tengan algn registro en
tCoches o no.
Visualmente (la consulta devuelve los datos en azul) ...
[arriba]
Union
La clusula UNION permite unir dos o ms conjuntos de resultados en uno detras
del otro como si se tratase de una nica tabla. De este modo podemos obtener los
registros de mas de una tabla "unidos".
La sintaxis corresponde a la de varias SELECT unidas a travs de UNION, como
se muestra a continuacin:
Las consultas a unir deben tener el mismo nmero campos, y adems los
campos deben ser del mismo tipo.
SELECT tCoches.matricula,
tMarcas.marca,
tCoches.modelo,
tCoches.color,
tCoches.numero_kilometros,
tCoches.num_plazas
FROM tCoches
INNER JOIN tMarcas ON tCoches.marca = tMarcas.codigo
UNION
SELECT tMotos.matricula,
tMarcas.marca,
tMotos.modelo,
tMotos.color,
tMotos.numero_kilometros,
0
FROM tMotos
INNER JOIN tMarcas ON tMotos.marca = tMarcas.codigo;
Puede observarse el uso de la constante cero en la segunda lista de seleccin para
hacer coincidir el nmero y tipo de
campos que devuelve la consulta UNIO
Consultas agregadas
La clusula GROUP BY
La clausula GROUP BY combina los registros con valores idnticos en un nico
registro. Para cada registro se puede crear un valor agregado si se incluye una
funcin SQL agregada, como por ejemplo Sum o Count, en la instruccin SELECT.
Su sintaxis es:
La clusula HAVING
Una vez que GROUP BY ha combinado los registros, HAVING muestra cualquier
registro agrupado por la clusula GROUP BY que satisfaga las condiciones de la
clusula HAVING. Se utiliza la clusula WHERE para excluir aquellas filas que no
desea agrupar, y la clusula HAVING para filtrar los registros una vez agrupados.
HAVING es similar a WHERE, determina qu registros se seleccionan. Una vez
que los registros se han agrupado utilizando GROUP BY, HAVING determina cuales
de ellos se van a mostrar. HAVING permite el uso de funciones agregadas.
AVG
Calcula la media aritmtica de un conjunto de valores contenidos en un campo
especificado de una consulta. Su sintaxis es la siguiente
AVG(<expr>)
En donde expr representa el campo que contiene los datos numricos para los
que se desea calcular la media o una expresin que realiza un clculo utilizando los
datos de dicho campo. La media calculada por Avg es la media aritmtica (la suma
de los valores dividido por el nmero de valores). La funcin Avg no incluye ningn
campo Null en el clculo.
Count
Calcula el nmero de registros devueltos por una consulta. Su sintaxis es la
siguiente:
COUNT(<expr>)
En donde expr contiene el nombre del campo que desea contar. Los operandos
de expr pueden incluir el nombre de un campo de una tabla, una constante o una
funcin (la cual puede ser intrnseca o definida por el usuario pero no otras de las
funciones agregadas de SQL). Puede contar cualquier tipo de datos incluso texto.
Aunque expr puede realizar un clculo sobre un campo, Count simplemente
cuenta el nmero de registros sin tener en cuenta qu valores se almacenan en los
registros. La funcin Count no cuenta los registros que tienen campos null a menos
que expr sea el carcter comodn asterisco (*). Si utiliza un asterisco, Count calcula
el nmero total de registros, incluyendo aquellos que contienen campos null.
Count(*) es considerablemente ms rpida que Count(Campo). No se debe poner el
asterisco entre dobles comillas ('*').
Max, Min
Devuelven el mnimo o el mximo de un conjunto de valores contenidos en un
campo especifico de una consulta. Su sintaxis es:
MIN(<expr>)
MAX(<expr>)
En donde expr es el campo sobre el que se desea realizar el clculo. Expr pueden
incluir el nombre de un campo de una tabla, una constante o una funcin (la cual
puede ser intrnseca o definida por el usuario pero no otras de las funciones
agregadas de SQL).
Sum
Devuelve la suma del conjunto de valores contenido en un campo especifico de
una consulta. Su sintaxis es:
SUM(<expr>)
En donde expr respresenta el nombre del campo que contiene los datos que
desean sumarse o una expresin que realiza un clculo utilizando los datos de
dichos campos. Los operandos de expr pueden incluir el nombre de un campo de
una tabla, una constante o una funcin (la cual puede ser intrnseca o definida por
el usuario pero no otras de las funciones agregadas de SQL).