Anda di halaman 1dari 36

CASO PRÁCTICO

DE IMPLEMENTACION DE UNAS BASE DE DATOS PARA UN RESTAURANTE DE


COMIDA RAPIDA
FastFood Restaurant es una empresa que brinda servicio de comida rápida, donde la
atención al cliente se describe en los siguientes pasos:
1. El cliente antes de hacer su pedido tiene la opción de revisar la carta, donde los
productos que se ofrecen están clasificados, por ejemplo: Bebidas, Carnes, Postres,
etc.

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.

En estos momentos todo el procedimiento de atención al cliente es manual por lo que


se tienen los siguientes problemas:
1. Atención lenta
2. Control de ingresos manual, por lo que el cierre de caja lleva muchas horas.
3. La elaboración de informes para el gerente es lenta ya que todo tipo de resumen del
día es manual.
4. No existe ningún tipo de estadística para la toma de decisiones futuras.

El restaurante atiende un promedio de 20 personas por hora con tendencia a aumentar,


por lo que se hace necesario implementar un sistema computarizado soportado en una
base de datos en SQL.

Reglas de negocio
Las reglas de negocio son el conjunto de condiciones que la empresa pone para por
realizar sus transacciones con sus clientes.

Para el caso las condiciones son mínimas y se enumeran a continuación:


1. El pago debe ser al contado y en efectivo
2. Solo se acepta moneda nacional
3. Existe una promoción en base al monto de consumo, ésta promoción consiste en un
descuento cuyo porcentaje se detalla a continuación:
Monto Monto Porcentaje
mínimo máximo De
descuento
0.1 30.0 0
30.1 50.0 3
50.1 100.0 5
100.1 500.0 8
500.1 1000.0 10
Los montos están expresados en nuevos soles

Todo proceso de implementación de una base de datos comprende básicamente: El


Modelo Conceptual, El Modelo Lógico y el Modelo Físico.

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.

1.1. Identificación de Entidades


En primer lugar identificaremos las entidades participantes en este caso práctico:
ENTIDAD : CATEGORIA
DESCRIPCION : Categoría al que pertenece cada producto.

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.

1.2. Identificación de Atributos para cada una de las Entidades de la Base de


Datos

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

1.3. Atributos Clave y Tipo de Clave para cada Entidad


ENTIDAD : CATEGORIA
ATRIBUTO CLAVE : Id Categoría
DESCRIPCION : Los artículos están agrupados por categoría y cada categoría
está identificada por un número correlativo.
TIPO : CLAVE PRIMARIA

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

1.4. Diagrama Entidad Relación

Modelo Lógico de la Base de Datos


Para llegar a un modelo lógico de la base de datos es necesario antes realizar algunos
pasos por la característica de este libro solo los mencionare.
1. Recoger información de las personas que trabajan en la empresa
2. Recoger una copia de los diferentes tipos de documentos que utiliza la empresa
3. Informarse de las proyecciones que la empresa tiene para el futuro
4. Identificar las entidades y sus relaciones
5. Identificar los atributos de cada entidad
6. Normalizar el modelo
7. Desnormalizar el modelo
En este caso son pocos pasos y aparentemente sencillos, pero es importante comentar
que en muchas empresas se requiere de personal altamente calificado y con experiencia
para realizar el análisis, cuyos factores pueden ser:
1. Tamaño de la empresa
2. Volumen de información
3. Reglas de negocios bastante complejos, etc.
A continuación se muestra el modelo lógico que se ha diseñado para nuestro caso, lo
que se quiere con este modelo es que sea útil y a la vez fácil de entender.

Estandarización de la base de datos


Debemos tener en cuenta que cuando realizamos el modelo de una base de datos
cumpla con un mínimo de objetivos básicos, que los explico a continuación:
1. Debe almacenar toda la información de la actividad de la empresa para la cual
se está diseñada
2. No debe guardar información redundante. Hay que casos en los que es
necesario para facilitar otras operaciones, pero debe ser bien analizado
3. Debe ser de fácil mantenimiento. Las inserciones, actualizaciones y
modificaciones no deben ser complejas desde el punto de vista de la
programación
4. Debe ser de fácil consulta. Si deseamos obtener cierta información debe ser en
base a una consulta sencilla, o en todo caso las operaciones a realizar no deben
ser complejas, en algunos casos no se puede evitar la complejidad, pero hay
que tratar de minimizarla
Generalmente el desarrollo de un sistema recae sobre un equipo, cuando hablamos
sobe estandarización de las base de datos, nos referimos al conjunto de criterios que
asume el equipo de trabajo como normas para el desarrollo del sistema.
Esto quiere decir que no todos los equipos de trabajo tienen los mismos estándares,
puede que coincidan en alguno de ellos, pero no es una norma.
Estandarizar una base de datos trae muchas ventajas, y algunas de ellas son:
1. Todas las personas del equipo desarrollan el sistema asumiendo los mismos
criterios
2. Si alguien del equipo tiene que retirarse por alguna razón, cualquier otra persona
del equipo puede reemplazarlo
3. Es fácil que una persona nueva se integre al equipo
Recomendaciones Utilizadas
1. El nombre de las entidades debe estar en singular
2. Los nombres de las columnas deben ser únicos en toda la Base de Datos, salvo
en las columnas que corresponden a Claves Foráneas
3. No usar espacios en blanco, letras acentuadas, la letra ñ, ni subrayado al dar
nombre a las tablas y columnas
4. Usar un prefijo para los atributos, cuando sea necesario. Por ejemplo el atributo
Nombre se repite en las entidades categoría, Articulo y Empleado, para
diferenciarlo utilizamos NomCategoria, NomArticulo y NomEmpleado, tal como
lo puede apreciar en el modelo lógico.
Descripción de las Claves Primarias
A continuación pasaremos a describir las claves primarias de cada una de las tablas y
los criterios que se han tenido en cuenta para su regla de formación.
Entidad: Categoría
Clave Primaria: IdCategoria
Comentario:
Los artículos están agrupados por categoría, y cada categoría está identificada
por un número correlativo
Además cada categoría tiene un prefijo y su propio contador los cuales se utilizan
para generar el código de cada artículo.
Por ejemplo la categoría que corresponde a bebidas su prefijo es BEB y los
artículos tienen los siguientes códigos BEB00001, BEB00003, etc.
Entidad: Articulo
Clave Primaria: IdArticulo
Comentario
Para generar el código del artículo es necesario tener en cuenta la categoría a
la cual pertenece, para determinar el prefijo y el número correlativo que le
corresponde.
Por ejemplo si pertenece a la categoría de combos su prefijo es COM00002,
COM00003, etc.
Entidad: Empleado
Clave Primaria: IdEmpleado
Comentario:
Para generar el código del empleado se debe seguir el siguiente formato E####,
por ejemplo E0001, E0002, E0003, etc. El correlativo se controla en la tabla
Parámetro.
Entidad: Pedido
Clave Primaria: IdPedido
Comentario:
Cada pedido tiene un número correlativo que lo identifica, en este caso también
es controlado en la tabla Parámetro.
Otra alternativa para el valor de esta clave es que sea de auto incremento, en
SQL Server sería una columna Identity, la ventaja es que no debemos
preocuparnos por su valor por lo que determina el motor de base de datos, pero
la desventaja está en que muchas veces se imprime sobre un documento
enumerado, y me parece que tener una tabla Parámetro que controle el numero
correlativo seria la alternativa mas adecuada.
Entidad: DetallePedido
Clave Primaria: IdPedido, IdArticulo
Comentario:
Monto Monto Porcentaje
En este caso la clave primaria esta
mínimo máximo De
formada por dos columnas, y los valores
descuento
de estas columnas se obtienen
0.1 30.0 0
de las entidades Pedido y Artículo.
Esta clave 30.1 50.0 3 primaria garantiza que
en un pedido no se repita un artículo.
50.1 100.0 5
Entidad: Parámetro
Clave Primaria: 100.1 500.0 8 Campo
Comentario:
500.1 1000.0 10
Esta clave primaria garantiza que
no se repitan los parámetros. Los parámetro que tenemos en esta entidad y un
ejemplo de los valores que pueda tener se muestra a continuación:
Campo Valor
IdEmpleado 10
IdPedido 500
Es importante mencionar que la tabla Parámetro tiene códigos disponibles
Que el parámetro IdEmpleado tenga valor 10, significa que hay registrados 9
empleados, y si ingresamos uno nuevo, su código debe ser E0010 y el valor del
parámetro se incrementaría en uno, o sea su nuevo valor seria 11.
Que el parámetro IdPedido tenga valor 500, significa que se han despachado
499 pedidos, y un nuevo pedido tendría el número 500 y el valor del parámetro
se incrementaría en uno, o sea su nuevo valor seria 501.

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

Por ejemplo, si el consumo de un cliente es de 80 nuevos soles, tendrá un


descuento de 5%, o sea debe pagar 76 nuevos soles más el IGV.
Modelo Físico de la Base de Datos
Después de haber desarrollado el modelo lógico, debemos seleccionar el motor de base
de datos para seleccionar los tipos de datos adecuados y la nulidad de cada una de las
columnas.
En nuestro case utilizaremos SQL Server como servidor de bases de datos, y el modelo
obtenido se muestra en la página siguiente.
Usted encontrara en la carpeta BD el archivo FastFood.ER1 con el modelo desarrollado
en Erwin 3.0.
En el siguiente tópico describimos brevemente como utilizar Erwin para desarrollar un
modelo de base de datos y como generar el script para ejecutarlo en SQL Server o
conectarnos con la base de datos y crear las tablas respectivas.

Creación de la base de datos utilizando Transact-SQL


Transact-SQL es el lenguaje de SQL Server, para crear una base de datos debemos
utilizar la instrucción CREATE DATABASE.
Para poder ejecutar instrucciones Transact-SQL debemos utilizar el Analizador de
Consultas
Sintaxis:
CREATE DATABASE nombre_base_datos
PRIMARY (NAME=nombre_logico_data,
FILENAME=’ubicación_y_nombre_archivo’,
SIZE=tamaño_en_MB,
MAXSIZE=tamaño_maximo_en_MB,
FILEGROWTH=incremento_crecimiento)
LOG ON (NAME=nombre_logico_log,
FILENAME=’ubicación_y_nombre_archivo’,
SIZE=tamaño_en_MB,
MAXSIZE=tamaño_maximo_en_MB,
FILEGROWTH=incremento_crecimiento)
Donde:
 nombre_base_datos
Es el nombre de la nueva base de datos. Los nombres de base de datos deben
ser únicos en un servidor y deben seguir las reglas de los identificadores.
 nombre_logico_data, nombre_logico_log
Es el nombre a utilizar cuando en una sentencia Transact-SQL se tiene que
hacer referencia al archivo de datos o al archivo de log respectivamente. Estos
nombres deben ser únicos en la base de datos.
 ubicación_y_nombre_archivo
Es una cadena que incluye la ruta y el nombre del archivo. La ruta debe
especificar una carpeta existente en el servidor en el que está instalado SQL.
 tamaño_en_MB
Especifica el tamaño del archivo
 tamaño_maximo_en_MB
Es el máximo tamaño que puede alcanzar el archivo si se requiriera de espacio
adicional
 incremento_crecimiento
Es la cantidad de espacio que se añade al archivo cada vez que se necesita
espacio adicional. Se puede especificar en MB o en porcentaje
Ahora procederemos a crear nuestra base de datos, para lo cual asumiremos que SQL
Server está instalado en la siguiente carpeta C:\MSSQL7, la instrucción quedaría así:
CREATE DATABASE FastFood
ON
PRIMARY (NAME=FastFood_data,
FILENAME=’\mssql7\data\FastFood.mdf’,
SIZE=8,
MAXSIZE=10
FILEGROWTH=25%)
LOG ON
(NAME=FastFood_log,
FILENAME=’c:\mssql7\data\FastFood.ldf’,
SIZE=3,
MAXSIZE=5,
FILEGROWTH=1MB)
Después de escribir la instrucción, para ejecutarla haga clic en el botón Ejecutar
Consulta o presionar la tecla F5.

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

Creación de Claves Primarias


La creación de claves primarias se puede realizar:
 En el diseñador de tablas, si la tabla ya esta creada haga clic con el boton
secundario en ella y ejecute el comando Diseñar tabla.
 Con la instrucción CREATE TABLE al momento de crear una tabla con Transact-
SQL.
 Con la instrucción ALTER TABLE si la tabla ya esta creada y queremos utilizar
con Transact-SQL.
En esta acasion nos acuparemos de la instrucción ALTER TABLE
Sintaxis:
ALTER TABLE nombre_tabla
ADD PRIMARY KEY (lista_columnas)
Donde:
 Nombre_tabla
Es la tabla donde se va ha definir la clave primaria.
 Lista_columnas
Es la columna o lista de columnas separadas por coma, que forman la clave
primaria
Como ejemplo ilustrativo veremos la creacion de la clave primaria de la tabla Categoría
ALTER TABLE categoría
ADD PRIMARY KEY (idcategoria)
Creación de claves foráneas
Una clave foránea es una restricción que proporciona integridad referencial a los datos
de la columna. Las restricciones FOREIGN KEY requieren que cada valor de la columna
exista en una columna especificada de la tabla a la que se hace referencia.
La creación de claves foráneas se puede realizar:
 En el diseñador de tablas si la tabla ya está creada haga clic con el botón
secundario en ella y ejecute el comando Diseñar tabla.
 Con la instrucción CREATE TABLE al momento de crear una tabla con Transact-
SQL
 Con la instuccion ALTER TABLE si la tabla ya está creada y queremos utilizar
Transact-SQL.
En esta ocasión nos acuparemos de la instrucción ALTER TABLE
Sintaxis:
ALTER TABLE nombre_tabla
ADD FOREIGN KEY (lista_columnas)
REFERENCES nombre_tabla_referencia
Donde:
 Nombre_tabla
Es el nombre de la tabla en la que se está definiendo la restricción FOREIGN
KEY.
 Lista_columnas
Es una columna o lista de columnas de la tabla a la que hace referencia la
restricción FOREIGN KEY
 Nombre_tabla_referencia
Es el nombre de la tabla a la que hace referencia la restricción FOREIGN KEY
Ilustraremos su uso creando la clave foránea de la tabla articulo que hace referencia a
la tabla categoría.
ALTER TABLE articulo
ADD FOREIGN KEY (idcategoria)
REFERENCES categoria
Para crear toda la estructura de la base de datos usted debe cargar el script que se
encuentra en el archive CreaTablas.SQL y ejecutarlo
El archivo CreaTablas.SQL se encuentra en la carpeta BD

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

Consultar Datos de la Base de Datos


Esta es quizá la tarea que más realiza una aplicación a la base de datos. Para realizar
una consulta a la base de datos debemos ejecutar la instrucción SELECT. A
continuación veremos la sintaxis básica de esta instrucción.
Sintaxis:
SELECT lista_columnas
FROM nombre_tabla
WHERE condijo
Donde:
 Lista_columnas
Especifica las columnas que deseamos consultar, estas deben estar separadas
por comas.
 Nombre_tabla
Indica la tabla que queremos consultar
 Condición
Especifica la condición que deben cumplir las filas que queremos consultar.
Por ejemplo si queremos ver el contenido de la tabla artículo, la consulta es:
SELECT*FROM Articulo
Si queremos consultar los artículos cuyo precio es mayor de 10 Nuevos Soles, la
consulta es:
SELECT*FROM Articulo
WHERE PreArticulo>10
Si queremos consultar los articulos cuyo precio está entre 10 y 20 Nuevos Soles, la
consulta es:
SELECT*FROM Articulo
WHERE PreArticulo BETTWEEN 10 AND 20
Si queremos consultar los artículos cuyo nombre comienza con la letra C, la consulta
es:
SELECT*FROM Articulo
WHERE NomArticulo LIKE ´C%´
En el siguiente capítulo se profundizara esta parte del lenguaje Transact-
SQL.
Generando consultas
En SQL la instrucción que permite recuperar información de una Base de Datos se llama
SELECT. La sintaxis más breve es la siguiente:
SELECT*tabla
[WHERE condición]
El símbolo asterisco, señala que se recuperaran todos los campos de la tabla, por
ejemplo para recuperar los datos de todos los artículos anotaríamos:
SELECT*FROM Articulo
Idarticulo Idcategoria NomArticulo PreArticulo

BEB00001 1 Gaseosa(mediana) 2.0000


BEB00002 1 Gaseosa(1 litro) 3.5000
BEB00003 1 Gaseosa(1.5 litros) 4.5000
BEB00004 1 Cerveza 5.000
Cristal(chica)
COM00001 5 Combo económico 7.9900
COM00002 5 Combo personal 10.9900
COM00003 5 Combo especial 13.9900
COM00004 5 Combo familiar 28.9900
COM00005 5 Combo para dos 16.9900

La selección de todas las columnas es muy adecuada en modo interactivo. Debería


evitarse en el modo de programación, ya que cambios en la estructura de la tabla puede
hacer que un programa falle. Por ejemplo, supongamos que la tabla Empleado, fuera
suprimida de la base de datos y luego recreada con sus columnas reordenadas y con
una nueva séptima columna añadida. Al ejecutar la aplicación, la orden SELECT*FROM
Empleado, devolverá 7 campos, al hacer referencia la apliccion a un campo, es probable
que arrojese un mensaje de error. Estas dificultades pueden evitarse si se precisa los
campos necesarios en la orden SELECT, para esto contamos con las sintaxis siguiente:
SELECT campos
FROM tablas
[WHERE condición]
Las columnas resultado de la sentencia SELECT por lo general son campos, aunque
tambien puede ser:una constant, especificando que el mismo valor constant va a
aparecer en todas las filas de los resultados de la consulta o una expresión SQL,
indicando la orden SQL que debe calcular el valor a colocar en los resultados, según el
estilo especificado por la expresión. Por ejemplo si solo se requiere el nombre y el id de
cada Articulo, anotaría:

SELECT NomArticulo, PreArticulo


FROM Articulo
NomArticulo PreArticulo
Gaseosa(mediana) 2.0000
Gaseosa(1 litro) 3.5000
Gaseosa(1.5 litro) 4.5000
Cerveza 5.0000
Cristal(chica)
Combo económico 7.9900
Combo personal 10.9900
Combo especial 13.9900
Combo familiar 28.9900
Combo para dos 16.9900

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

Puede crear expresiones haciendo uso de cualquiera de las siguientes cuatro


operaciones aritméticas suma (X+Y), resta (X-Y), multiplicación (X*Y) Y división (X/Y) .
también pueden utilizar paréntesis para formar expresiones más complicadas, como la
siguiente: (precio*1.18)-(factor/0.5). en este caso, los paréntesis no son necesarios, ya
que la multiplicación y la división tienen una precedencia superior a la suma y la resta.
Sin embargo, deberían utilizarse siempre paréntesis para lograr que las expresiones no
sean ambiguas. Además los paréntesis incrementan la legibilidad de la sentencia y
hacen que sea mas fácil de mantener.

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

Cuando se incluye columnas calculadas en u resultado, conviene asignarle u nombre,


así podremos llamarlo desde nuestro programa.
SELECT IdPedido. Mes=DATENAME(month, fecha)
FROM Pedido
WHERE fecha=GETDATE()
IdPedido Mes
------------ ---------
1 Enero
2 Enero
3 Enero
4 Enero
5 Enero
Las funciones internas también suelen utilizarse para reformatear los datos. Por
ejemplo, podemos mostrar el IGV de las ventas con redondeo a una cifra decimal:
SELECT
Idpedido,
Igv= STR (ROUND (Monto*0.18,1),7,1)

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

La siguiente instrucción muestra la diferencia en meses de la fecha de venta respecto a


la fecha actual:
SELECT Fecha,
Días=DATEDIFF(month, fecha, GETDATE())
FROM Pedido
Fecha dias
---------------------------- --------
2000-01-05 000000000 8
2000-02-05 000000000 7
2000-02-20 000000000 7
2000-03-05 000000000 6
2000-03-05 000000000 6
2000-04-05 000000000 5
2000-04-05 000000000 5
2000-04-05 000000000 5
2000-04-20 000000000 5
2000-04-20 000000000 5
Aquí tenemos una consulta donde se muestra la fecha incrementando en 2 dias
SELECT Fecha,
En_dos_dias=DATEADD(day, 2, fecha)
FROM Pedido

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

Ahora se muestra la fecha en caracteres:


SELECT Fecha,
En_letras=DATENAME(dw, fecha)+`´
+STR(DATEPART(dd,fecha),2)+
`de´+DATENAME(mm, fecha)+
`de´+STR(DATEPART(yy,fecha),4)
FROM Pedido
Fecha en_letras
2000-01-05 000000000 miércoles, 5 de enero de 2000
2000-01-10 000000000 lunes, 10 de enero de 2000
2000-01-15 000000000 sábado, 15 de enero de 2000
2000-01-15 000000000 sábado, 15 de enero de 2000
2000-01-20 000000000 jueves, 20 de enero de 2000
2000-02-15 000000000 martes, 15 de febrero de 2000
2000-02-15 000000000 martes, 15 de febrero de 2000
2000-04-20 000000000 jueves, 20 de abril de 2000
2000-04-20 000000000 jueves, 20 de abril de 2000

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

Los operadores que se pueden usar para especificar la condición son:


=, <, >
<=, >=,
<>, ¡=,
¡<, ¡>

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

Los caratesres comodines pueden aparecer en cualquier luhar de la cadena patrón y


puede haber caracteres comodines dentro de una misma cadena
Para obtener una lisa de empleados cuyo nombre comience con la letra `J´:
SELECT IdEmpleado,
NomEmpleado
FROM Empleado
WHERE NomEmpleado LIKE `J%

IdEmpleado NomEmpleado
--------------- -------------------
E0003 Jesus
E0005 Juan
E0006 Jose

La lista de empleados, donde la inicial del nombre comience con


SELECT IdEmpleado
NomEmpleado
FROM Empleado
WHERE NomEmpleado
IdEmpleado NomEmpleado
---------------- --------------------
E0005 Juan
Una lista de artículos, donde la cadena `NA´ estaba contenida como parte de la
descripción:
SELECT NomArticulo
FROM Articulo
WHERE NomArticulo LIKE `%pe%´
NomArticulo
-----------------
Combo personal
Combo especial

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.

Evitando filas repetidas


Si una consulta incluye la clave primaria de una tabla en su lista de selección, entonces
cada fila de resultados será única (ya que la clave primaria tiene un valor diferente en
cada fila). Si no se incluye la clave primaria en los resultados, pueden producirse filas
duplicadas. Por ejemplo, supongamops que se hace la siguiente petición: muestre los
Id de los empleados que emitieron pedidos.
SELET IdEmpleado
FROM Pedido

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.

Parámetro de rango (Between)


El parámetro de rango comprueba si un valor de dato se encuentra entre dos valores
especificados.
Observe el siguiente ejemplo:
Por ejemplo si se desea lalista de los pedidos atendidos entre el 10 de enero al 10 de
febrero anotaríamos:
SELECT IdPedido
Fecha
FROM Pedido
WHERE fecha BETWEEN `10/01/2000´
AND `10/02/2000´
IdPedido Fecha
------------ ---------------------------
6 2000-01-10 00 00 00 000
7 2000-01-10 00 00 00 000
8 2000-01-10 00 00 00 000
9 2000-01-10 00 00 00 000
10 2000-01-10 00 00 00 000
11 2000-01-15 00 00 00 000
12 2000-01-15 00 00 00 000
13 2000-01-15 00 00 00 000
14 2000-01-15 00 00 00 000
15 2000-01-15 00 00 00 000
16 2000-01-20 00 00 00 000
17 2000-01-20 00 00 00 000
18 2000-01-20 00 00 00 000
19 2000-01-20 00 00 00 000
20 2000-01-20 00 00 00 000
21 2000-02-05 00 00 00 000
22 2000-02-05 00 00 00 000
23 2000-02-05 00 00 00 000
El paramtro BETWEEN incluye los valores extremos del rango, por ejemplo si el campo
de budqueda es Fecha, luego de BETWEEN deberá anotar el valor inferior, luego AND
seguido del valor superior.
SELECT IdPedido,
Monto
FROM Pedido
WHERE Monro BETWEEN 100 AND 200

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.

Parametro de pertenencia (IN)


Examina si un valor de dato coincide con uno de una lista de valores objetivo. He aquí
varias consultas que utilizan el test de pertenencia a conjunto:
Lista los pedidos emitidos por los empleados E0004 y E0002
SELECT IdPedido,
IdEmpleado
FROM Pedido
WHERE IdEmpleado IN (`E0004´,`E0002´)
IdPedido IdEmpleado
----------- ----------------
3 E0002
10 E0004
12 E0002
20 E0004
23 E0002
Halla todos los pedidos emitidos un lunes, miércoles o viernes
SELECT IdPedido
Fecha
DATENAME (dw,Fecha)
FROM Pedido
WHERE DATEPERT(dw,Fecha) IN(1,3,5)
--------- -------------------------------------- -------------
1 2000-01-05 00 00 00 000 Miercoles
4 2000-01-05 00 00 00 000 Miercoles
8 2000-01-10 00 00 00 000 Lunes
56 2000-03-10 00 00 00 000 Viernes
Se puede comprobar si el valor del dato no corresponde a ninguno de los valores
objetivos utilizando la forma NOT IN del test de pertenencia a conjunto. La expresión
condición indicada puede ser cualquier expresión SQL, pero generalmente es tan solo
un nombre de columna, como en los ejemplos precedentes. Si la expresión de condición
produce un valor NULL, la expresión IN devuelve NULL.
Todos los elementos en la lista de valores objetivo deben tener el mismo tipo de datos,
y ese tipo debe ser comparable al tipo de datos de la expresión de la condición. Al igual
que el caso BETWEEN, el caso no añade potencia expresiva a SQL, ya que la condición
de búsqueda.
X IN (A, B, C)
Es completamente equivalente a:
(X=A) OR (X=B) OR (X=C)
Sin embargo, la clausula IN ofrece un modo mucho mas eficiente de expresar la
condicion de busqueda, especialmente si el conjunto contiene mas de unos pocos
valores. La clausula IN no especifica un limite máximo al número de elementos que
pueden aparecer en la lista de valores, y la mayoría de las implementaciones
comerciales tampoco establecen un limite superior explicito.
Cuando deba especificar múltiples condiciones en una consulta, tendrá que usar los
aperadores lógicos AND, OR y NOT, las siguientes tablas les sera de mucha ayuda:
Caso AND:
AND TRUE FALSE NULL
TRUE TRUE FALSE NULL
FALSE FALSE FALSE NULL
NULL NULL NULL NULL

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

IdPedido IdEmpleado Igv


72 E0001 28 80
21 E0001 18 00
19 E0002 23 40
36 E0002 9 00
18 E0003 28 80
10 E0004 28 80
90 E0004 18 00

Usando funciones de columna


SQL permite efectuar una serie de cálculos en las tablas de una base de datos, mediante
un conjunto de funciones de columna. Una función de columna SQL acepta una columna
entera de datos como argumentos y produce un único dato resultado del calculo sobre
la columna.
Para realizar cálculos con columnas puede usar las siguientes funciones:
Función Descripción
AVG([ALL/DISTINCT] exp) Retorna el promedio de una expresión
columna numérica
COUNT([ALL/DISTINCT]exp) Numero de valores que hay en una
expresión columna
COUNT (*) Numero de filas seleccionadas
MAX(exp) El valor mas alto que hay en una
expresión columna
MIN(exp) Eñ menor valor que hay en una expresión
columna
SUMA([ALL/DISTINCT]exp) Devuelve la suma de la expresión
columna numerica

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

El resultado será un cursor con un solo registro


Para calcular el total por las ventas del articulo `E0002´ anotaríamos:

SELECT SUM(Monto)
FROM Pedido
WHERE IdEmpleado=`E0002´
-------------
1790 0000

Para averiguar cuantos articulos hay en la tabla Articulos anotariamos:

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

Cuantos pedidos ha emitido cada vendedor en el mes de enero?


SELECT IdEmpleado,
NumPedidos=COUNT(*)
FROM Pedido
WHERE DATEPART (mm, fecha)=1
GROUP BY IdEmpleado
IdEmpleado NumPedidos
--------------- --------------
E0001 4
E0002 5
E0003 4
E0004 2
E0005 3
E0006 2
SQL puede agrupar los resultados de consulta en base a contenidos de dos o mas
columnas. Por ejemplo, supogamos que se desea agrupar los pedidos por cada mes y
por cada empleado. Esta consulta agrupa los datos basándose en ambos criterios:
SELECT Mes=DATEPART (mm, fecha), IdEmpleado,
Cantidad =COUNT(*)
FROM Pedido
GROUP BY IdEmpleado, DATEPART (mm,fecha)
Mes IdEmpleado Cantidad
-------- ---------------- -----------
1 E0001 4
1 E0003 4
1 E0004 2
2 E0001 4
2 E0002 5
2 E0003 4

En muchas implementaciones SQL, la clausula GROUP BY tendra automaticamente el


efecto lateral de erdenar los datos, pero puede abviar esta ordenacion con una clausula
ORDER BY, como se muestra aqui:
SELECT Mes=DATEPART (mm, fecha), IdEmpleado
Cantidad=COUNT(*)
FROM Pedido
GROUP BY IdEmpleado, DATEPART (mm, fecha)
ORDER BY IdEmpleado
Mes IdEmpleado Cantidad
------ ------------- ------------
1 E0001 4
2 E0001 4
3 E0001 4
1 E0002 5
2 E0002 5
4 E0002 5
1 E0003 4
2 E0003 4
4 E0003 4
1 E0004 2
3 E0004 2
4 E0004 2
1 E0005 3
4 E0005 3
1 E0006 2
3 E0006 2
4 E0006 2

Condicones de búsqueda en los grupos


Al igual que la clausula WHERE puede ser utilizada para seleccionar o rechazar filas
individuales que participan en una consulta, la clausula HAVING puede ser utilizada
para seleccionar y rechazar grupos de filas. El formato de la clausula HAVING es
análogo al de la clausula WHERE, consistiendo en la palabra clave HAVING seguida de
una condición de búsqueda para grupos.
Averiguaremos el total por cada una de los pedidos emitidos donde el total sea mayor a
120 Nuevos Soles.
SELECT IdPedido,
`Total por pedido´
SUM(monto)
FROM Pedido
GROUP BY IdPedido
HAVING SUM(Monto)>120

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.

Caracteristica de los índices


Único: un índice único no permite la repetición de un dato en una columna
Compuesto: son los índices donde la expresión de índice representa dos o mas campos
Idexaremos la tabla Empleado:
CREATE CLUSTERED INDEX pkEmpleado
ON Empleado (IdEmpleado)
El índice anterior quedaría mejor si incluimos la clausula UNIQUE:
CRATE UNIQUE CLUSTERED INDEX pkEmpleado
ON Empleado (IdEmpleado)
Si se requiere con frecuencia una lista ordenada de empleados por el nombre:
CREATE NONCLUSTERED INDEX Apellido
ON Empleado (ApeEmpleado)
Para ordenar la tabla Pedido según los campos Fecha e IdEmpleado anotaríamos:
CREATE NONCLUSTERED INDEX FecEmp
ON Pedido (Fecha, IdEmpleado)
Este ultimo índice es un índice compuesto.
Usando el índice
Para optimizar una consulta solo debe agregar una la clausula:
(INDEX 0nombre_indice)
A la clausula SELECT luego del parámetro FROM
Por ejemplo, para obtener una lista ordenada de empleados según el nombre
anotaríamos:
SELECT ApeEmpleado
Telefono
FROM Empleado (INDEX =Apellido)
ApeEmpleado Telefono
------------------- ----------------
Aguilar Rojas 459-8126
Amanza Olguin 456-5999
Fernandez Rodriguez440-1222
Pazos Saavedra 870-3519
Pereda Chavez None
Quineche Tenorio 870-3519
Para obtener una lista de los pedidos ordenadas según la fecha e IdEmpleado, anotaría:
SELECT Fecha,
IdEmpleado,
IdPedido
FROM Pedido (INDEX=PecEmp)
Fecha IdEmpleado IdPedido
--------------------------- ------------------ -----------
2000-01-05 00 00 00 000 E0001 1
2000-01-05 00 00 00 000 E0001 2
2000-01-05 00 00 00 000 E0002 3
2000-01-10 00 00 00 000 E0002 6
2000-01-10 00 00 00 000 E0006 7
2000-01-15 00 00 00 000 E0001 11
2000-01-15 00 00 00 000 E0002 12
2000-01-15 00 00 00 000 E0005 14
2000-01-15 00 00 00 000 E0006 15
2000-01-20 00 00 00 000 E0001 17
2000-01-20 00 00 00 000 E0003 18
2000-01-20 00 00 00 000 E0004 20
2000-02-05 00 00 00 000 E0001 21
2000-02-10 00 00 00 000 E0003 29

Combinando el resultado de dos p mas consultas


El operador UNION permite combinar los resultados de dos o mas consultas en una
única tabla de resultados totales.
SELECT campos
FROM tabla
[WHERE condicion]
[GROUP BY clausula]
[HAVING condicion]
[INION [ALL]
SELECT campos
FROM table
[WHERE condicion]
[GROUP BY clausula]
[HAVING condicion]…]
[ORDER BY clausula]
Por defecto el operador UNION desecha los registros repetidos del conjunto de
resultados, a no ser que incluya el parámetro ALL.
La lista de campos especificados después del operador UNION, debe ser igual en
cantidad, tipo y orden que los señalados en la lista de campos de la orden SELECT
inicial.
El resultado puede quedar ordenado según el campo que especifique en la clausula
ORDER BY.
El nombre de los campos del conjunto de los resultados so tomados de la primera orden
SELECT.
Veamos un ejemplo:
Listar los artículos, y el total de unidades vendidas con la condición que el precio del
articulo sea inferior a 300 Nuevos Soles o una lista de artículos donde el precio del
articulo no exceda los 50 Soles.
La primera parte de la repetición se solucionara de la siguiente forma:
Listar los articulos, y el total de unidades vendidas con la condición que el precio del
articulo sea inferior a 300 Soles.
SELECT IdArticulo=SUM(PreVenta*Cantidad)
FROM DetallePedido
WHERE PreVenta<300
GROUP BY IdArticulo

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

Consultas a partir de multiples tablas


A partir del diseño de una base de datos, para muchas consultas se requieren datos
procedentes de dos o mas tablas como por ejemplo para obtener:
 Una lista de los Pedido y su respectivo importe (tablas Pedido y DetallePedido)
 Una lista de los empleados y su comisión (tablas Empleado, Pedido y
DetallePedido)
 Una lista de las Pedido emitidas en este mes, mostrando el nombre del cliente,
el nombre del articulo solicitado y el importe de la factura (tablas Empleado,
Articulo, Pedido y DetallePedido).
SQL permite recuperar datos que corresponden a estas peticiones mediante consultas
multitabla que componen (JOIN) datos procedentes de dos o mas tablas.
Para efectuar combinaciones de tablas puede usar la sintaxis SQL estándar o la de SQL
Server, veamos las variantes.
La sintaxis del SQL estándar (ANSI) sugiere la sintaxis siguiente:
SELECT tabla campo,
Tabla campo, …
FROM tabla [Tipo_Join] JOIN tabla ON condición
[WHERE condicion]
Mientras que la sintaxis de SQL Server es:
SELECT tabla.campo,
Tabla.campo,…
FROM tablas
WHERE tabla.campo Operador_Join tabla.campo
Puede usar cualquiera de las formas.
Si va a usar la sintaxis SQL ANSI:
SELECT tabla.campo, …
FROM tabla [Tipo_Join] JOIN table ON condicion
[WHERE condicion]
Puede hacer uso de los siguientes tipos de combinacion:
Tipo Join Descripcion
INNER JOIN Incluye solo las filas que satisface la
condición de combinación
CROSS JOIN Incluye todas las combinaciones posibles
entre las filas de las tablas
OUTER JOIN Incluye las filas que satisface la condición
de combinación y las filas restantes de
una de las tablas

Si va ausar la sintaxis de SQL Server:


SELECT tabla.campo,
Tabla.campo,…
FROM tablas
[WHERE tabla.campo Operador_Join tabla.campo]
Puede usar los siguientes operadores de combinacion:
Operador de combinacion Descripción
= Igual que
> Mayor que
< Menor que
>= Mayor e igual que
<= Menor e igual que
<> Diferente que

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

IdPedido SubTotal Igv


---------- ----------- ------
1 9 00 1.62
1 40 00 7.20
2 6 00 1.08
2 33 00 5.94
3 9 00 1.62
3 15 00 2.70
3 24 00 4.32
4 27 00 4.86
4 30 00 5.40
4 58 00 10.44
Las consultas multiabla mas comunes implican a dos tablas que tienen una relación
natural padre-hijo. La consulta refernte a Pedido y Detalle del ejemplo anterior es un
ejemplo de tal tipo de cosulta Cada línea de Detalle (hijo) tiene un Pedido asociado
(padre), y cada Pedido (padre) puede tener varias líneas de Detalle asociados (hijos).
Los padres de filas que generan los resultados de la consulta son combinados de fila
padre-hijo.
Las claves foráneas y las claves primarias crean relaciones padre-hijo en una base de
datos SQL. La tabla que contiene la clave foránea es el hijo en la relación, la tabla con
la clave primaria es el padre. Para ejercitar la relación padre-hijo en una consulta debe
especificarse una condición de búsqueda que compare la clave foránea y la clave
primaria. Veamos otro ejemplo:
Listar el nombre de los empleados, la fecha de atención y el numero de pedido para las
ventas realizadas en este mes.
En SQL ANSI:
SELECT NomEmpleado, Fecha, IdPedido
FROM Empleado INNER JOIN Pedido
ON Empleado.IdEmpleado=Pedido.IdEmpleado
WHERE DATEPART(mm, Fecha)=2

Usando SQL Server:


SELECT NomEmpleado,
Fecha,
IdPedido
FROM Empleado, Pedido
WHERE Empleado.IdEmpleado=Pedido.IdEmpleado
AND DATEPART(mm, Fecha)=2
NomEmpleado Fecha IdPedido
------------------ ----------------------------- ------------
Mariela 2000-02-05 00 00 00 000 21
Karla 2000-02-05 00 00 00 000 23
Juan 2000-02-05 00 00 00 000 25
Karla 2000-02-10 00 00 00 000 26
Jesus 2000-02-10 00 00 00 000 29
La tabla Empleado (hijo) contiene IdEmpleado, una clave foránea para la tabla Pedido
(padre)
SQL puede combinar datos de tres o mas tablas utilizando las mismas técnicas básicas
utilizadas para las consultas de dos tablas.
He aquí un sencillo ejemplo de una composición con tres tablas:
Listar los pedidos emitidas en el mes de Julio, incluyendo el nombre del empleado y el
nombre del cliente (para este ejemplo y los siguientes deberá asumir la presencia de
una tabla de clientes):
SELECT

Anda mungkin juga menyukai