2. Una vez que el cliente sabe lo que va a pedir, se acerca a caja, hace su pedido, da
su nombre, cancela y recibe una boleta acompañada de un comprobante para
recoger su pedido.
3. Luego de unos minutos de espera se anuncia por los parlantes al cliente que su
pedido está listo, este debe acercarse a la barra con su comprobante a recoger su
pedido.
Reglas de negocio
Las reglas de negocio son el conjunto de condiciones que la empresa pone para por
realizar sus transacciones con sus clientes.
En el diseño de bases de datos se usan primero los modelos conceptuales para lograr una
descripción de alto nivel de los procesos que comprende el restaurante de comida rápida.
1. EL MODELO CONCEPTUAL
El modelo conceptual básicamente se representa a través de los Modelos Entidad-
Relación(MER) que se basa en la percepción del mundo real y comprende la
identificación de entidades, atributos y sus relaciones todo representado en el modelo
entidad - relación.
iENTIDAD : ARTICULO
DESCRIPCION : Artículos que son solicitados por los clientes para su consumo.
ENTIDAD : EMPLEADO
DESCRIPCION : Personal del restaurante que brinda el servicio a los clientes
ENTIDAD : PEDIDO
DESCRIPCION : Pedidos realizados por los clientes, que puede consistir en un
solo artículo o varios.
ENTIDAD : DETALLEPEDIDO
DESCRIPCION : Detalle de cada uno de los pedidos realizados por los clientes
del restaurante.
ENTIDAD : PROMOCION
DESCRIPCION : Promociones en forma de descuentos que se aplicarán a los
clientes de acuerdo a volumen de consumo.
ENTIDAD : PARAMETRO
DESCRIPCION : Parámetros necesarios para la gestión de información de
Artículos, empleados y Pedidos.
ENTIDAD : CATEGORIA
ATRIBUTOS
- Id Categoría
- Nombre Categoría
- Prefijo Categoría
- Contador Categoría
ENTIDAD : ARTICULO
ATRIBUTOS
- Id Artículo
- Nombre Artículo
- Precio Artículo
ENTIDAD : EMPLEADO
ATRIBUTOS
- Id empleado
- Apellido Empleado
- Nombre Empleado
- Teléfono empleado
ENTIDAD : PEDIDO
ATRIBUTOS
- Id Pedido
- Cliente
- Fecha
- Monto
- Descuento
- IGV
- Total
ENTIDAD : DETALLEPEDIDO
ATRIBUTOS
- Cantidad
- Precio Venta
- Subtotal
ENTIDAD : PROMOCION
ATRIBUTOS
- Id Promoción
- Monto Mínimo
- Monto Máximo
- Porcentaje
ENTIDAD : PARAMETRO
ATRIBUTOS
- Campo
- Valor
ENTIDAD : ARTICULO
ATRIBUTO CLAVE : Id Artículo
DESCRIPCION : Los artículos están identificados por un código de artículo único.
Para generar el código del artículo es necesario tener en cuenta
la categoría a la cual pertenece, para determinar el número
correlativo que le corresponde.
TIPO : CLAVE PRIMARIA
ENTIDAD : EMPLEADO
ATRIBUTO CLAVE : Id empleado
DESCRIPCION : Los empleados están identificados por un código de empleado
único.
TIPO : CLAVE PRIMARIA
ENTIDAD : PEDIDO
ATRIBUTO CLAVE : Id Pedido
DESCRIPCION : Cada pedido de cliente tiene un número correlativo que lo
identifica.
TIPO : CLAVE PRIMARIA
ENTIDAD : DETALLEPEDIDO
ATRIBUTO CLAVE : Id Pedido
Id Artículo
DESCRIPCION : En este caso la clave primaria está formada por atributos de la
entidad Pedido y la entidad Artículo.
TIPO : CLAVES FORANEAS
ENTIDAD : PROMOCION
ATRIBUTO CLAVE : Id Promoción
DESCRIPCION : Las promociones ofertadas están identificadas cada una por un
número correlativo único.
TIPO : CLAVE PRIMARIA
ENTIDAD : PARAMETRO
ATRIBUTO CLAVE : Campo
DESCRIPCION : Atributo clave que garantizará que no se repitan los números
correlativos para los atributos de Categoría, Artículo, Empleado
y Pedido.
TIPO : CLAVE PRIMARIA
Entidad: Promoción
Clave Primaria: IdPromocion
Comentario:
Esta clave primaria se utiliza para identificar cada fila de la tabla, no tiene otra
finalidad.
En esta entidad se grabaran los valores mínimos y máximos para aplicar los
descuentos según la promoción de la empresa
Creación de tablas
Creación de tablas desde el usando Transact-SQL
La instrucción CREATE TABLE es la que nos permite crear nuevas tablas, antes de
ejecutar esta instrucción debe asegurarnos de estar ubicados en la base de datos
correcta, para nuestro caso FastFood.
Para seleccionar una base de datos tenemos el BD en la barra de herramientas, como
se muestra en el gráfico.
Sintaxis:
CREATE TABLE nombre_tabla
(nombre_columna1 propiedades [restricciones],
Nombre_columna2 propiedades [restricciones],…)
Donde:
Propiedades
Especifica el tipo de dato, si permite valores nulos, o si es una columna
IDENTITY.
Restricciones
Especifica una restrincion para el contenido de la tabla, ya sea a nivel de la tabla
o a nivel de la columna.
Como por ejemplo ilustrativo veremos la instrucción para crear la tabla
Categoria
CREATE TABLE categoría
Idcategoria int IDENTITY,
NomCategoria varchar(25) NOT NULL,
Prefijo char(3) NOT NULL,
Contador int NOT NULL
Ingreso de datos
El ingreso de datos se puede realizar:
En el Administrador Corporativo, haciendo clic con el boton secundario del
mouse sobre la tabla y ejecutando el comando Abrir tabla.
Con la instrucción INSERT INTO de Transact-SQL
En nuestro caso lo haremos con la instrucción INSERT INTO
Sintaxis:
INSERT INTO nombre_tabla (lista_columnas)
VALUES (lista_datos)
Donde:
Nombre_tabla
Especifica la tabla donde se insertan los datos
Lista_columnas
Especifica las columnas donde se insertan los datos
Lista_datos
Especifica los datos que se insertaran en las columnas
En las columnas que tienen la propiedad IDENTITY no se pueden insertar datos, ya que
el valor para estas columnas lo genera el motor de base de datos.
Como ejemplo ilustrativo veremos un script que permite insertar datos en la tabla
categoría.
Insert Into Categoria (NomCategoria, Prefijo, Contador)
Values (`Bebidas’,’BEB’,5)
Insert Into Categoria (NomCategoria, Prefijo, Contador)
Values (`Carnes’,’CAR’,1)
Insert Into Categoria (NomCategoria, Prefijo, Contador)
Values (`Pollo’,’POL’,1)
Insert Into Categoria (NomCategoria, Prefijo, Contador)
Values (`Postres’,’POS’,1)
Insert Into Categoria (NomCategoria, Prefijo, Contador)
Values (`Combos’,’COM’,6)
Observe usted que no se indica valores para la columna IdCategoria, debido a que tiene
la propiedad IDENTITY, lo que quiere decir que su valor lo genera el motor de base de
datos.
Para cargar datos de prueba en la base de datos usted debe cargar el script que se
encuentra en el archivo CargaDatos.SQL y ejecutarlo.
El archivo CargaDatos.SQL se encuentra en la carpeta BD.
Actualizar Datos
Es frecuente la actualización de datos en la base de datos, esta operación también la
podemos realizar desde Administrador Corporativo y con instrucciones Transact-SQL.
En nuestro caso lo veremos utilizando la instrucción Transact-SQL Update.
Sintaxis:
UPDATE nombre_tabla
SET nombre_columna=expresión [,…]
WHERE condition
Donde:
Nombre_tabla
Especifica la tabla que queremos utilizar
Nombre_columna
Especifica la columna que queremos actualizar su valor
Expresión
Representa el nuevo valor que tomara la columna
[,…]
Indica que puede actualizar varias columnas en una misma instrucción
Condición
Especifica la condición que deben cumplir las filas que se van a actualizar
Como ejemplo ilustrativo vamos a suponer que el precio del artículo de código
BEB00003 se ha incrementado en 0.5 nuevos soles, la instrucción que realiza la
actualización es:
UPDATE Artículo
SET PreArticulo= PreArticulo + 0.5
WHERE IdArticulo=’BEB00005’
Eliminar Datos
Otra tarea frecuente es la eliminación de datos, esta tarea también se puede realizar
desde el Administrador Corporativo o con instrucciones Transact-SQL. Al igual que en
casos anteriores nos ocuparemos de la instrucción Transact-SQL.
Sintaxis:
DELETE FROM nombre_tabla
WHERE condición
Donde:
Nombre_tabla
Especifica la tabla donde se eliminaran los datos
Condición
Indica la condición que deben cumplir las filas que serán eliminadas.
Para poder ilustrar su uso, supondremos que deseamos eliminar el artículo de código
BEB00003, la instrucción que realiza esta tarea es:
DELETE FROM Artículo
WHERE IdArticulo=’BEB00003’
Si no incluye la cláusula WHERE se eliminaran todas las filas de la tabla
Creacion de expresiones
Las expresiones se utilizan en el lenguaje SQL, para calcular valores que son de una
base de datos y para calcular valores utilizados en la búsqueda de la base de datos. Por
ejemplo para mostrar el numero de factura y el total de compras anotaría:
SELECT IdPedido, Monto*1.18
FROM Pedido
Idpedido
1 59.000000
2 94.400000
3 118.000000
4 153.400000
5 94.400000
6 59.000000
7 118.00000
8 153.400000
9 94.400000
10 188.800000
Usando funciones
También puede incluir funciones en la construcción de expresiones, por ejemplo para
mostrar el numero de factura y el mes de las ventas realizadas el dia de hoy.
SELECT IdPedido, DATENAME(month, Fecha)
FROM Pedido
WHERE fecha=GETDATE()
IdPedido Mes
------------ ---------
1 Enero
2 Enero
3 Enero
4 Enero
5 Enero
IdPedido Igv
------------ ---------
1 9.0
2 14.4
3 18.0
4 23.4
5 14.4
6 9.0
Podemos proporcionarle formato a la salida, vea el siguiente ejemplo:
SELECT
LEFT(RTRIM(ApeEmpleado)+REPLICATE(` ´,30)30)+
Telefono
FROM Empleado
---------------------- --------------
Fernandez Rodriguez440-1222
Almanza Olguin 456-5999
Aguilar Rojas 459-8126
Quinehea Tenorio 870-3519
Pazos Saavedra 870-3519
Pereda Chavez None
Otro ejemplo:
SELECT
NomEmpleado-SPACE(2)*REVERSE(NonEmpleado)
FROM Empleado
-----------------------------
Mariela aleiraM
Karla alraK
Jesus suseJ
Patrticia aicirtaP
Juan nauJ
Jose esoJ
Fecha en_dos_dias
---------------------------- -----------------------------
2000-01-05 000000000 2000-01-07 000000000
2000-01-05 000000000 2000-01-07 000000000
2000-01-10 000000000 2000-01-12 000000000
2000-01-15 000000000 2000-01-17 000000000
2000-01-20 000000000 2000-01-22 000000000
2000-02-05 000000000 2000-02-07 000000000
Falta de datos
Pusto que una base de datos es generalmente un modelo de una situación del mundo
real, ciertos datos pueden inevitablemente faltar, ser deconocidos o no ser aplicables.
Suponga que al emitir un pedido el empleado olvido anotar su código, el pedido quedaría
registrado, pero la columna IdEmpleado quedaría vacio, aquí es donde podemos aplicar
el valor nulo.
Un valor nulo en un indicador que le dice a SQL (y al usuario) que el dato falta o no es
aplicable. Por conveniencia, un dato que falta normalmente se dice que tiene el valor
NULL, pero el valor NULL no es valor de dato real como 0 o ` ´.En vez de ello, es una
señal, o un recordatorio de que el valor de datos falta o es desconocido.
Para la creación de la tabla Empleado, se definen los campos Id del Empleado, Apellidos
y Nombres de carácter opcional puesto que problamente haya socios que no lo posean
o que luego se pueden ingresar.
CREATE TABLE Empleado(
Idempleado char(5) NOT NULL
Apeempleado varchar(20) NOT NULL
Nomempleado varchar(20) NOT NULL
Teléfono varchar(8) NULL
En base a la tabla anterior, podemos obtener una serie de datos por ejemplo que socios
no tienen teléfono:
SELECT IdEmpleado,
NomEmpleado
FROM Empleado
WHERE Telefono IS NULL
idEmpleado NomEmpleado
---------------- --------------------
E0006 Jose
La forma negada del valor nulo es:IS NOT NULL encuentra los empleados que tengan
reistrado su numero de teléfono:
SELECT IdEmpleado,
NomEmpleado
FROM Empleado
WHERE Telefono IS NOT NULL
ideEmpleado NomEmpleado
E0001 Mariela
E0002 Karla
E0003 Jesus
E0004 Patricia
E0005 Juan
Condicionando el resultado
SELECT campos
FROM tabla
WHERE condición
La clusula WHERE incluye una condición de búsqueda que especifica las filas a
recuperar. Conceptualmente, SQL recorre cada fila de la tabla, una a una, y aplica la
condición de búsqueda puede producir uno de tres resultados:
Si la condición de búsqueda es TRUE (verdadero), la fila se incluye en los
resultados de la columna.
Si la condición de búsqueda es FALSE (falsa), la fila se excluye de los resultados
de la consulta.
Si la condición de búsqueda tiene un valor NULL (desconocido), la fila se excluye
de los resultados de la consulta.
Básicamente, la condición de búsqueda actúa como un filtro para las filas de la tabla.
Las filas que satisfacen la condición de búsqueda atraviesan el filtro y forman parte de
los resultados de la consulta. Las filas que no satisfacen la condición de búsqueda son
atrapadas por el filtro y quedan excluidas de los resultados de la consulta.
Por ejemplo para obtener la lista de artículo con precio menor a 10 soles anotaríamos:
SELECT NomArticulo, PreArticulo
FROM Articulo
WHERE PreArticulo < 10
NomArticulo PreArticulo
----------------------------- ------------
Gaseosa (mediana) 2.0000
Gaseosa (1 litro) 3.5000
Gaseosa (1.5 litro) 4.5000
Cerveza Cristal (chica) 5.0000
Combo económico 7.9900
SQL calcula y compara los valores de dos expresiones, SQL por cada fila de datos. Las
expresiones pueden ser tan simples como un nombre de una columna o una constante,
o pueden ser expresiones aritméticas más complejas. SQL ofrece seis modos diferentes
de comparar las dos expresiones.
BETWEEN Examina si el valor de una expresión cae dentro de un rango especificado
de valores.
IN comprueba si el valor de una expresión se corresponde con uno de un
conjunto de valores
LIKE Comprueba si el valor de una columna que contiene datos de cadena de
cracteres se corresponde a un patrón especificado
ISNULL Comprueba si una columna tiene un valor NULL (desconocido)
AND Y lógico
OR O lógico
NOT Negacion
Si la comparación se da en una tabla primaria como la tabla Empleado y la condición
se aplica a la columna que es una clave primaria, el test aisla una solo fila
de la tabla, produciendo una sola fila de resultados, como es este ejemplo:
Reupera los datos del empleado con Id ``E0005´´
SELECT IdEmpleado,
NomEmpleado
FROM Empleado
WHERE IdEmpleado=``E0005´´
IdEmpleado NomEmpleado
---------------- --------------------
E0005 Juan
Este tipo de consulta es el fundamento de los programas de recuperación de base de
datos basadas en formularios. El usuario introduce un numero de cliente en el
formulario, y el programa utiliza el numero para construir y ejecutar una consulta. Luego
visualiza los datos recuperados en el formulario.
Muestra los Id de los empleados que han emitido pedidos antes del 06/01/2000
SELECT IdEmpleado,
Fecha
FROM Pedido
WHERE fecha <=`06/01/2000´
IdEmpleado fecha
---------------- --------------------
E0001 2000-01-01 00 00 000
E0001 2000-01-04 00 00 000
E0002 2000-01-03 00 00 000
E0003 2000-01-04 00 00 000
E0005 2000-01-05 00 00 000
E0002 2000-01-05 00 00 000
Una lista de los pedidos que no las hayas emitido el empleado E0005
SELECT UdPedido, IdEmpleado
FROM Pedido
WHERE IdEmpleado!=È0005´
IdPedido IdEmpleado
------------ ----------------
1 E0001
2 E0001
3 E0002
4 E0003
6 E0002
7 E0006
9 E0003
10 E0004
Caracteres comodin
En el parámetro LIKE puede incorporar caracteres comodin que susttituyan a un
carácter o un grupo de ellos, estos caracteres comodin son:
% Sustituyen a un grupo de caracteres
_(subrayado) Sustituye un carácter simple
[] Algún carácter de los especificado en un rango
[^] Algún carácter menos el especificado en el rango
IdEmpleado NomEmpleado
--------------- -------------------
E0003 Jesus
E0005 Juan
E0006 Jose
Una lisata de vendedores, donde la segunda letra del nombre sea `A´
SELECT NomEmpleado
FROM Empleado
WHERE NomEmpleado LIKE `_A%´
NomEmpleado
-------------------
Mariela
Karla
Patricia
Una lista de empleados, donde la primera letra del nombre pueda ser M, N, O u P y la
segunda `A´:
SELECT NomEmpleado
FROM Empleado
WHERE NomEmpleado LIKE `[MP]A%´
NomEmpleado
--------------------
Mariela
Patricia
Una lista de empleados, donde la primera letra del nombre sea `J´ y la segunda no sea
`U´:
SELECT NomEmpleado
FROM Empleado
WHERE NomEmpleado LIKE `J[^U]%´
NomEmpleado
--------------------
Jesús
Jose
En algunos casos los resultados de la consulta pueden ser un único valor, como en el
siguiente ejemplo ¿Cuáles son las ventas promedio del articulo A07?
SELECT SUM (Monto)
FROM Pedido
WHERE IdEmpleado=`E0005´
Este resultado sigue siendo una table, aunque sea tan pequeña que solo conste de una
fila y una columna.
Finalmente, es posible que una consulta produzca cero filas de resultados, como en este
ejemplo:
Liste los artículos cuyo precio sea mayor a 5000
SELECT IdArticulo,
NomArticulo
FROM Articulo
WHERE PreArticulo>5000
IdArticulo NomArticulo
------------ ----------------
Incluso en esta situación, el resultado de la consulta sigue siendo una tabla. Se trata de
una tabla vacia con dos columnas y cero filas.
IdEmpleado
----------------
E0001
E0001
E0002
E0003
E0005
E0002
E0006
E0005
E0003
E0004
E0001
E0002
E0003
E0005
E0006
E0002
E0001
E0003
E0002
E0004
E0001
E0001
El resultado tiene filas repetidas ya que hay pedidos donde figura un empleado mas de
una vez. Se pueden eliminar las filas duplicadas de los resultados de la consulta
insertando la palabra clave DISTINCT en la sentencia SELECT justo antes de la lista de
selección. He aquí una versión de la consulta anterior que produce es resultados
deseados:
SELECT DISTINCT IdEmpleado
FROM Pedido
IdEmpleado
---------------
E0001
E0002
E0003
E0004
E0005
E0006
Conceptualmente, SQL efectua esta consulta generando primero un conjunto completo
de resultados(cinco filas) y eliminando luego las filas que son duplicados exactos de
alguna otra para formar los resultados finales. La palabra clave DISTINCT puede ser
especificada con independencia de los contenidos de la lista SELECT.
Si se omite la palabra clave DISTINCT, SQL no elimina las filas duplicadas.
IdPedido Monto
------------ ------------
8 130 0000
10 160 0000
16 100 0000
19 130 0000
21 100 0000
Para negar esta expression solo debe anteponer el operador NOT a BETWEEN, por
ejemplo:
SELECT IdPedido,
Monto
FROM Pedido
WHERE Monto NOT BETWEEN 100 AND 200
IdPedido Monto
----------- ------------
1 50 0000
2 80 0000
17 50 0000
20 80 0000
La expresión especificada en BETWEEN puede ser cualquier expresión SQL válida,
pero en la practica generalmente es tan solo un nombre de columna, como en los
ejemplos anteriores.
Para el caso de campos que contienen valores NULL, se define las siguientes raglas en
la clausula BETWEEN.
Si la expresión de la condición produce en valor NULL, o si ambas expresiones
definitorias del rango producan valores NULL, la condición BETWEEN devuelve
un resultado NULL.
Si la expresión que define el extreno inferior del rango produce un valor NULL,
la condición BETWEEN devuelve FALSE si el valor de la condición es superior
al limite superior y NULL en caso contrario.
Si la expresión que define el extremo superior del rango produce un valor NULL,
la condición BETWEEN devuelve FALSE si el valor de la condición en menor
que el limite inferior, y NULL en caso contrario.
Antes de confiar en este comportamiento, es buena idea axperimentar con el DBMS.
Merece la pena advertir que la condición BETWEEN no añade realmente potencia
expresiva a SQL, ya que puede ser expresado mediante dos condiciones de
comparación. La condición de rango:
A BETWEEN B AND C
Es completamente a:
(A=B) AND (A=C)
Sin embargo, la condición BETWEEN es un modo mas sencillo de expresar una
condición de búsqueda cuando se esta pensando en términos de un rango de valores.
Caso OR:
OR TRUE FALSE NULL
TRUE TRUE TRUE TRUE
FALSE TRUE FALSE NULL
NULL TRUE NULL NULL
Caso NOT:
NOT TRUE FALSE NULL
FALSE TRUE NULL
Un ejemplo:listar los pedidos emitidas por los vendedores V03, V07 y V14, que hayan
hecho ventas entre abril y julio o los días martes, jueves, sábado.
SELECT IdPedido, IdEmpleado
DATENAME(dw, Fecha),
DATENAME(mm, Fecha)
FROM Pedido
WHERE IdEmpleado IN (`E001´, `E003´) AND
(DATEPART(dw, Fecha) IN (2, 4,6) OR
DATEPART(mm, Fecha) BETWEEN 4 AND 7)
IdPedido IdEmpleado
------------ ---------------- ----------- -----------
11 E0001 Sabado Enero
17 E0001 Jueves Enero
18 E0003 Jueves Enero
21 E0001 Sabado Febrero
Ordenando el resultado de una consulta
SELECT*
FROM tabla
[WHERE condicion]
[ORDER BY campo]
Al igual que las filas en una table en la base de datos las filas de los resultados de una
consulta no están dispuestas en ningún orden particular. Se puede pedir a SQL que
ordene los resultados de un a consulta incluyendo la clausula ORDER BY en la
sentencia SELECT.
La clausula ORDER BY, seguidas de una lista de especificaciones de ordenación
separadas por comas. Por ejemplos, podemos ordenar los pedidos según el Id del
vendedor y luego por la fecha:
SELECT IdEmpleado,
Fecha,
IdPedido
FROM Articulo
ORDER BY IdEmpleado, Fecha
IdEmpleado Fecha IdPedido
---------------- ----------------------------- --------------
E0001 2000-01-05 00 00 00 000
E0001 2000-01-20 00 00 00 000
E0001 2000-04-15 00 00 00 000
E0001 2000-04-20 00 00 00 000
E0002 2000-01-05 00 00 00 000
E0002 2000-02-05 00 00 00 000
E0002 2000-02-10 00 00 00 000
E0002 2000-03-10 00 00 00 000
E0003 2000-01-05 00 00 00 000
E0004 2000-02-10 00 00 00 000
E0003 2000-03-15 00 00 00 000
La primera especificación de ordenación (IdEmpleado) es la clave de ordenación mayor,
las que le sigan (Fecha, en este caso) son progresivamente claves de ordenación
menores, cuando dos filas de resultados tienen los mismos valores para las claves
mayores utilizando la clausula ORDER BY se puede solicitar la ordenación en secuencia
ascendente o descendente y se puede ordenar con respecto a cualquier elemento en la
lista de selección de la consulta.
Por omisión SQL ordena los datos en consecuencia ascendente, también puede incluir
la palabra clave ASC para especificar el orden ascendente. Para solicitar ordenación en
secuencia descendente, se incluye la palabra clave DESC en la especificación de
ordenación como en este ejemplo
SELECT IdArticulo NomArticulo
PreArticulo
FROM Articulo
ORDER BY PreArticulo DESC, NomArticulo
IdArticulo NomArticulo PreArticulo
COM00004 Combo familiar 28 9900
COM00005 Combo para dos 16 9900
COM00003 Combo especial 13 9900
COM00001 Combo económico 7 9900
BEB00004 Cerveza cristal(chica) 5 0000
BEB00003 Gaseosa (1.5 litro) 4 5000
BEB00001(mediana) 2 0000
Si la columna de resultados de la consulta utilizada para ordenación es una columna
calculada no tiene nombre de columna que se pueda emplear en una especificación de
ordenación. En este caso debe especificarse un numero de columna en lugar de un
nombre como en este ejemplo:
SELECT IdPedido,
Diferencia=DATEDIFF(mm, fecha, GETDATE())
FROM Pedido
ORDER BY 2
IdPedido Diferencia
----------- -----------
71 5
51 6
52 6
21 7
2 8
3 8
Estos resultados están ordenados por la segunda columna. Combinando números de
columna, nombres de columna, ordenaciones ascendentes y ordenaciones
descendentes, se pueden especificar ordenaciones bastante complejas de los
resultados de una consulta, como el siguiente ejemplo final:
SELECT IdPedido, IdEmpleado,
Igv=STR(Monto*0.18, 7.2)
FROM Pedido
ORDER BY IdEmpleado ASC, 3 DESC
Para que SQL elimine valores duplicados de una columna antes de aplicarle una función
de columna use la palabra clave DISTINCT.
Por ejemplo si unteresa averiguar cual es el articulo mas caro anotaríamos:
SELECT MAX(PreArticulo)
FROM Articulo
--------------
28 9900
SELECT SUM(Monto)
FROM Pedido
WHERE IdEmpleado=`E0002´
-------------
1790 0000
SELECT COUNT(*)
FROM Empleado
--------------
6
Para averiguar a cuantos clientes diferentes se ha vendido algún articulo, anotaríamos:
SELECT COUNT(DISTINCT Cliente)
FROM Pedido
------------
20
Cualquiera de las ordenes siguientes indican cuantos Empleados tienen teléfono:
SELECt COUNT (telefono)
FROM Empleado
WHERE Telefono <> NULL
SELECT COUNT(*)
FROM Empleado
WHERE Telefono<> NULL
-----------
5
Aclaremos el ejemplo anterior, determinaremos cuantos pedidos se han emitido en el
mes de febrero:
SELECT COUNT (IdPedido)
FROM Pedido
WHERE DATEPART(mm, fecha)=2
----------
20
Observe que la función COUNT () ignora los valores de los datos en la columna;
somplemente cuenta cuantos datos hay. En consecuencia, no importa realmente que
columna se especifica como argumento de la función COUNT (). El ultimo ejemplo
podría haberse escrito igualmente:
SELECT COUNT (IdEmpleado)
FROM Pedido
WHERE DATEPART(mm, fecha)=2
Resulta mas practico solucionar el ejemplo anterior mediante la función COUNT (*) que
cuenta filas en lugar de valores de datos. He aquí la misma consulta, reescrita una vez
utilizar la función COUNT (*)
SELECT COUNT (*)
FROM Pedido
WHERE DATEPART(mm, fecha)=2
Consultas Agrupadas
Las consultas anteriores que incluyen funciones de columna en una expression, generan
un simple numero para una table como un total al final del informe. Puede ampliar la
capacidad de estas funciones realizando el calculo sobre grupos específicos de datos
al igual que los subtotales de un informe.
SELECT campos
FROM tablas
WHERE condición
GROUP BY expression
La clausula WHERE excluye los registros que no cumplen con la condicion. La clausula
GROUP BY genera grupos para un único valor de acuerdo a la expresión especificada,
si ha incluido en la lista de campos funciones de columna, la acción de estos será sobre
los grupos formados.
Cual es el total por ventas efectuadas?
SELECT SUM(Monto)
FROM Pedido
-------------
7280 0000
Cual es el total de ventas realizado por cada empleado?
SELECT IdEmpleado,
Total=SUM(Monto)
FROM Pedido
GROUP BY IdEmpleado
IdEmpleado total
-------------- ----------------
E0001 1340 0000
E0002 1790 0000
E0003 1670 0000
E0004 940 0000
E0005 960 0000
E0006 580 0000
La primera consulta es una consulta sumaria como la de los ejemplos anteriores. La
segunda produce varias filas sumarias una fila por cada grupo, sumarizando el total por
cada empleado:
Cuantos pedidos ha sido atendido por cada empleado?
SELECT IdEmpleado
Atendidos=COUNT(*)
FROM Pedido
GROUP BY IdEmpleado
IdEmplado Atendidos
-------------- -------------
E0001 16
E0002 20
E0003 16
E0004 8
E0005 12
E0006 8
IdPedido
------------ ------------------- --------------
4 Total por dedido 130 0000
10 Total por dedido 160 0000
13 Total por dedido 130 0000
26 Total por dedido 230 0000
30 Total por dedido 160 0000
39 Total por dedido 190 0000
52 Total por dedido 150 0000
58 Total por dedido 180 0000
83 Total por dedido 260 0000
88 Total por dedido 190 0000
Indexando
Puede indexar las tablas, para acelerar el acceso a una columna de uso frecuente,
donde por ejemplo se realiza frecuentes búsquedas.
En SQL Server se sugiere no abusar de los índices, es decir su implementación debe
planificarse con cuidado, ya que va en perjuicio del rendimiento cuando hay operaciones
de actualización, por cada una de estas operaciones debe regenerarse cada índice. Su
uso adecuado puede incrementar la velocidad de recuperación de datos en las
consultas.
CREATE [UNIQUE][CLUSTERED | NONCLUSTERED]
INDEX nombre_indice
ON tabla (campo)
Solo puede crear un índice el usuario que creo la tabla (es decir su propietario, en SQL
Server se le dice dbo: data base awner). Esto no es definitivo, ya que el administrador
del sistema puede remover la categoría dbo de un usuario y cedérsela a otro.
Tipos de Indice
Clustered Ordena físicamente la tabla según el campo especificado, es decir el
índice cambia el orden físico.Solo puede haber un índice de este tipo por
cada tabla.
No clustered Ordena lógicamente la tabla según el campo especificado, la tabla no
queda afectado físicamente, el índice solo sirve de guía para presentar
los resultados.Puede crear tantos indeces de este tipo como sea
necesario.
IdArticulo SubTotal
---------------------------
BEB00001 15 0000
BEB00002 40 0000
BEB00003 36 0000
BEB00004 45 0000
COM00001 24 0000
COM00002 33 0000
COM00004 58 0000
Análogamente, la segunda parte de la peticion puede satisfacerse con la consulta
siguiente:
Listar todos los artículos donde el precio del artículo no exceda los 50 soles.
SELECT IdArticulo,
PreArticulo
FROM Articulo
WHERE PreArticulo<50
IdArticulo PreArticulo
------------- ----------------
BEB00001 2 0000
BEB00002 3 5000
BEB00003 4 5000
COM00001 7 9900
COM00002 10 9900
COM00003 13 9900
COM00004 28 9900
La operacion UNION produce una unica table de reesultados que combina las filas de
la primera consulta con las filas de los resultados de la segunda consulta. La sentencia
SELECT que especifica la operación UNION tiene el siguiente aspecto:
Listar los artículos, y el total de unidades vendidas con la condición que el precio del
articulo sea inferior a 300 soles o una lista de artículos donde el precio del articulo no
exceda los 50 soles.
SELECT IdArticulo,
SUM(PreVente*Cantidad)
FROM DetallePedido
WHERE PreVenta<300
GROUP BY IdArticulo
UNION
SELECT IdArticulo,
PreArticulo,
FROM Articulo
WHERE PreArticulo<50
Hay varias restricciones sobre las table que pueden combinarse con una operacion
UNION:
Ambas tablas deben contener el mismo numero de columnas.
El tipo de datos de cada columna en la primera tabla debe ser el mismo que el
tipo de datos de la columna correspondiente en la segunda tabla.
Ninguna de las dos tablas pueden estar ordenadas con la clausula ORDER BY.
Sin embargo, los resultados combinados pueden der ordenados.
Observese que los nombres de columna de las dos consultas combinadas mediante una
UNION no tienen que ser idénticos. En el ejemplo anterior, la primera tabla de resultados
tenia columnas de nombre IdArticulo y SUM(PreVenta*Cantidad), mientras que la
segunda tabla de resultados tenia columnas de nombre IdArticulo y PreArticulo. Puesto
que las columnas de las dos tablas pueden tener nombres diferentes, las columnas de
los resultados producidos por la operación UNION están sin designar.
Habíamos señalado que por defecto la orden UNION omite las filas repetidas, si
deseramos mostrar todas las filas anotaríamos:
SELECT IdArticulo
SUM(PreVenta*Cantidad)
FROM DetallePedido
WHERE PreVenta<300
GROUP BY IdArticulo
UNION ALL
SELECT IdArticulo,PreArticulo
SELECT IdArticulo
WHERE PreArticulo<50
Observe que la gestion por omission de fila duplicadas para la operacion UNION y para
la sentencia SELECT simple son exactamente opuestas. Para la sentencia SELECT,
SELECT ALL (duplicados retenidos) es el comportamiento por omisión. Para eliminar
filas duplicadas, debe especificarse explícitamente SELECT DISTINCT. Para la
operación UNION, UNION (duplicados eliminados) es el proceso por omisión. Para
retener filas duplicadas, debe especificarse explícitamente UNION ALL.
La eliminación de filas duplicadas en los resultados de la consulta e un proceso que
consume mucho tiempo,especialmente si los resultados contienen un gran numero de
filas. Si usted sabe, basándose en las consultas indiiduales implicadas, que la operación
UNION no puede producir filas duplicadas, debería utilizar específicamente la operación
UNION ALL, ya que la consulta se ejecutara mucho mas rápidamente.
La clusula ORDER BY no puede aparecer en ninguna de las dos sentencias SELECT
combinadas por una operación UNION.
No tendría mucho sentido ordenar los dos conjuntos de resultados de ninguna manera,
ya que estos se dirigen directamente a la operación UNION y nunca son visibles al
usuario. Sin embargo, el conjunto combinado de los resultados de la consulta
producidos por la operación UNION pueden ser ordenados especificando una clausula
ORDER BY después de la segunda sentencia SELECT. Ya que las columnas
producidas por la operación UNION no tienen nombres, la clausula ORDER BY debe
especificar las columnas por numero.
Listar los artículos, y la cantidad total de unidades vendidas con la condición que el
precio del articulo sea inferior a 300 soles o una lista de artículos donde el precio del
articulo no exceda los 50 soles.
SELECT IdArticulo,
SUM(PreVenta)
FROM DetallePedido
WHERE PreVenta<300
GROUP BY IdArticulo
UNION
SELECT IdArticulo,
PreArticulo
FROM Articulo
WHERE PreArticulo<50
ORDER BY 2
Veamos un ejemplo:
Para comprender mejor las facilidades que SQL proporciona para consultas multiabla lo
mejor es comenzar con una petición simple que combina datos de dos tablas fiferentes:
obtenga una lista de las Pedido emitidas con su respectivo total e Igv (tablas Pedido y
DetallePedido)
Usando la sintaxis de SQL ANSI:
SELECT DetallePedido.IdPedido,
Subatotal=STR(PreVenta*Cantidad, 7.2).
Igv= STR(PreVenta*Cantidad*0.18, 7.2)
FROM Pedido INNER JOIN DetallePedido
ON Pedido.IdPedido=DetallePedido.IdPedido
Usando la sintaxis de SQL Server:
SELECT DetallePedido. IdPedido,
subtotal=STR(PreVenta*Cantidad, 7.2),
igv =STR(PreVenta*Cantidad*0.18, 7.2)
FROM Pedido, DetallePedido
WHERE Pedido.IdPedido=DetallePedido.IdPedido