Anda di halaman 1dari 11

Base de Datos

INTRODUCCIN CONSULTAS - SQL

El lenguaje de consulta estructurado (SQL) es un lenguaje de base de datos normalizado,


utilizado por los diferentes motores de bases de datos para realizar determinadas operaciones sobre
los datos o sobre la estructura de los mismos. Pero sin embargo cada motor de bases de datos tiene
sus peculiaridades y lo hace diferente de cada motor, por lo tanto el lenguaje SQL normalizado (ANSI)
no tendr la misma respuesta en los diferentes motores de bases de datos. Esta compuesto por
comandos, clusulas, operadores y funciones de agregado. Estos elementos se combinan en las
instrucciones para crear, actualizar y manipular las bases de datos.

1.1. Componentes del SQL


El lenguaje SQL est compuesto por comandos, clusulas, operadores y funciones de agregado. Estos
elementos se combinan en las instrucciones para crear, actualizar y manipular las bases de datos.

1.2. Comandos
Existen tres tipos de comandos SQL:
DDL (Lenguaje de Definicin de Datos). Permiten crear y definir nuevas bases de datos,
campos e ndices.
DML (Lenguaje de Manipulacin de Datos). Permiten generar consultas para ordenar, filtrar y
extraer datos de la base de datos, permite hacer
o Mostrar los datos de una o mas tablas, o de una o mas vistas.
o Modificar los valores de atributos en filas existentes.
o Eliminar filas de tablas o vistas.
o Agregar nuevas filas a una tabla o vista.
o Bloquear una tabla o vista, limitando temporalmente el acceso de otros usuarios.
o Ver el plan de ejecucin de una sentencia SQL.
DCL (Lenguaje de Control de Datos). Permiten variar los permisos otorgados a los usuarios con
referencia a los datos.

Comandos DDL
Comando Descripcin
CREATE Utilizado para crear nuevas tablas, campos e ndices
DROP Empleado para eliminar tablas e ndices
Utilizado para modificar las tablas agregando campos o cambiando la definicin de los
ALTER
campos.
Comandos DML
Comando Descripcin
Utilizado para consultar registros de la base de datos que satisfagan un criterio
SELECT
determinado
INSERT Utilizado para cargar lotes de datos en la base de datos en una nica operacin.
UPDATE Utilizado para modificar los valores de los campos y registros especificados
DELETE Utilizado para eliminar registros de una tabla de una base de datos
Comandos DCL
Comando Descripcin
GRANT Permite que otros usuarios manipulen la data, con el permiso respectivo otorgado
REVOKE Permite retirar todos o parte de os privilegios que se han concedido a los usuarios.

1.3. Clusulas
Las clusulas son condiciones de modificacin utilizadas para definir los datos que desea seleccionar o
manipular.

Ing. CIP. Eddy Ivn Quispe Soto 1


Base de Datos

Clusula Descripcin
FROM Utilizada para especificar la tabla de la cual se van a seleccionar los registros
Utilizada para especificar las condiciones que deben reunir los registros que se van a
WHERE
seleccionar
GROUP BY Utilizada para separar los registros seleccionados en grupos especficos
HAVING Utilizada para expresar la condicin que debe satisfacer cada grupo
ORDER BY Utilizada para ordenar los registros seleccionados de acuerdo con un orden especfico

1.4. Operadores Lgicos

Operador Uso
Es el "y" lgico. Evala dos condiciones y devuelve un valor de verdad slo si ambas
AND
son ciertas.
Es el "o" lgico. Evala dos condiciones y devuelve un valor de verdar si alguna de las
OR
dos es cierta.
NOT Negacin lgica. Devuelve el valor contrario de la expresin.

1.5. Operadores de Comparacin

Operador Uso
< Menor que
> Mayor que
<> Distinto de
<= Menor Igual que
>= Mayor Igual que
= Igual que
BETWEEN Utilizado para especificar un intervalo de valores.
LIKE Utilizado en la comparacin de un modelo
IS NULL Devuelve el registro que no tiene datos
IN Utilizado para especificar registros de una base de datos

1.6. Funciones de Agregado


Las funciones de agregado se usan dentro de una clusula SELECT en grupos de registros para
devolver un nico valor que se aplica a un grupo de registros.

Funcin Descripcin
AVG Utilizada para calcular el promedio de los valores de un campo determinado
COUNT Utilizada para devolver el nmero de registros de la seleccin
SUM Utilizada para devolver la suma de todos los valores de un campo determinado
MAX Utilizada para devolver el valor ms alto de un campo especificado
MIN Utilizada para devolver el valor ms bajo de un campo especificado

Ing. CIP. Eddy Ivn Quispe Soto 2


Base de Datos

Lenguaje de Definicin de Datos, DDL.


Todas esas sentencias sirven para recuperar, insertar, borrar, modificar los datos almacenados en la
base de datos; lo que veremos en este tema son las sentencias que afectan a la estructura de los
datos.

Sintaxis: Creacin de Base de Datos

CREATE DATABASE database_name


ON PRIMARY
(
NAME= NOMBREBD_DATA,
FILENAME= 'drive:\directorio\nombre_data.mdf',
SIZE= 10,
MAXSIZE= 20,
FILEGROWTH=2
)
LOG ON
(
NAME= NOMBREBD_LOG,
FILENAME= 'drive:\directorio\nombre_log.ldf',
SIZE= 10,
MAXSIZE= 20,
FILEGROWTH= 2
)

Sintaxis: Creacin de Tablas

CREATE TABLE table_name


(
column_name datatype [ NULL | NOT NULL | IDENTITY ] ,
column_name datatype [ NULL | NOT NULL | IDENTITY ]
)

Es decir:

Ing. CIP. Eddy Ivn Quispe Soto 3


Base de Datos

Lenguaje de Manipulacin de Datos, DML.


Las consultas de resumen introducen dos nuevas clusulas a la sentencia SELECT, la clusula
GROUP BY y la clusula HAVING, son clusulas que slo se pueden utilizar en una consulta de
resumen, se tienen que escribir entre la clusula WHERE y la clusula ORDER BY y tienen la
siguiente sintaxis:

Ing. CIP. Eddy Ivn Quispe Soto 4


Base de Datos

EJEMPLOS DE COMANDOS DDL

1. Crea la base de datos BD_Venta


IF EXISTS (SELECT name FROM sys.databases WHERE name = 'DB_Ventas')
DROP DATABASE [DB_Ventas]

CREATE DATABASE [DB_Ventas]


ON PRIMARY
(
NAME = 'Ventas', FILENAME = 'C:\BDSQL\DATA\Ventas.mdf' ,
SIZE = 6144KB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 1024KB
)
LOG ON
(
NAME = 'Ventas_log', FILENAME = 'C:\BDSQL\DATA\Ventas_log.ldf' ,
SIZE = 1024KB ,
MAXSIZE = 2GB ,
FILEGROWTH = 10%
)

2. Crea la tabla cliente, sus atributos tipo de datos y la clave primaria id_cliente.
CREATE TABLE [Cliente]
(
[Id_cliente] [char](6) NOT NULL,
[Cli_Nombre] [nvarchar](30) NOT NULL,
[Cli_Apellido] [nvarchar](30) NOT NULL,
[Cli_Direccion] [nvarchar](30) NULL,
[Cli_Telefono] [char](9) NULL,
[Cli_Ruc] [char](10) NULL,
[Id_distrito] [char](3) NULL,
CONSTRAINT [PK_Cliente] PRIMARY KEY ([Id_cliente] ASC)
)

Ing. CIP. Eddy Ivn Quispe Soto 5


Base de Datos

3. Inserta una fila en la tabla Cliente.


INSERT INTO [Cliente]
([Id_cliente],[Cli_Nombre],[Cli_Apellido],[Cli_Direccion],[Cli_Telefono]
,[Cli_Ruc],[Id_distrito])
VALUES ('000019','Jose Maria','Loli Luna','T. Garcia', '2324518', NULL,
NULL)

4. Inserta una fila en la tabla Artculo.


INSERT INTO [Articulo]
([Id_articulo],[Id_categ],[Descripcion],[Pcosto],[Stock])
VALUES ('000099','C007','AccuSync70',0,0)

EJEMPLOS DE COMANDOS DML.

5. Mostrar los artculos con su categora ordenado por descripcin de categora


SELECT articulo.id_articulo, articulo.descripcion, pcosto,
articulo.stock, categoria.descripcion
FROM Articulo, Categoria
WHERE articulo.id_categ= categoria.id_categ
ORDER BY articulo.descripcion

6. Mostrar los artculos cuyo stock sea mayor a 132 unidades


SELECT articulo.id_articulo, articulo.descripcion, articulo.pcosto,
articulo.stock
FROM articulo
WHERE stock>=12

7. Mostrar los clientes que hallan comprado en el ao 1999


SELECT cli_nombre, cli_apellido, id_factura, fecha
FROM factura, cliente
WHERE factura.id_cliente=cliente.id_cliente AND factura.fecha>=
'01/01/1999' AND factura.fecha<='12/31/1999'

8. Mostrar todos los datos del Cliente de nombre Rodrigo Gustavo


SELECT *
FROM cliente
WHERE cli_nombre='Rodrigo Gustavo'

9. Mostrar todos los datos del Cliente de hayan realizado una compra al menos una vez.
SELECT DISTINCT C.*
FROM Cliente C , dbo.Factura F
WHERE C.id_cliente=F.id_Client

10. Muestra datos del artculo con esos nombres


SELECT id_articulo AS Codigo, descripcion AS Nombre , pcosto As Costo
FROM articulo
WHERE descripcion IN ('Dell','Pentium III')

11. Muestra las facturas con totales desde 1000 hasta 5000
SELECT id_factura, fecha, total
FROM factura
WHERE total BETWEEN 1000 and 5000

12. Muestra las facturas emitidas en el ao 1999.


SELECT id_factura, fecha, total
FROM factura
WHERE fecha BETWEEN '1999-01-01' AND '1999-31-12'

Ing. CIP. Eddy Ivn Quispe Soto 6


Base de Datos

13. Muestra las facturas emitidas el mes de diciembre, ao 1999, y el dia 8. (ver consulta 25).
SELECT id_factura, fecha
FROM factura
WHERE MONTH(fecha)=12 and YEAR (fecha) =1999 and DAY(fecha)=08

14. Muestra clientes cuyo nombre empiece con la letra M y el tercer carcter sea una r.
SELECT cli_nombre, cli_apellido
FROM cliente
WHERE cli_nombre LIKE ('m_r%')

15. Clientes que no tengan numero de RUC.


SELECT id_cliente, cli_nombre, cli_apellido
FROM cliente
WHERE cli_ruc IS NULL

16. Muestra las total vendido de las facturas emitidas el ao 2004.


SELECT SUM(total), YEAR(fecha)
FROM factura
WHERE YEAR (fecha)=2004
GROUP BY YEAR (fecha)

ANIDAR SUBCONSULTAS
Las subconsultas pueden anidarse de forma que una subconsulta aparezca en la clusula
WHERE (por ejemplo) de otra subconsulta que a su vez forma parte de otra consulta principal. En
la prctica, una consulta consume mucho ms tiempo y memoria cuando se incrementa el nmero de
niveles de anidamiento. La consulta resulta tambin ms difcil de leer, comprender y mantener
cuando contiene ms de uno o dos niveles de subconsultas.

17. Muestra los datos del artculo ms caro.


SELECT id_articulo AS Codigo, descripcion AS Nombre , PCOSTO
FROM articulo
WHERE PCOSTO=(SELECT MAX(pcosto) FROM articulo)

18. Muestra el articulo mas barato


SELECT id_articulo AS Codigo, descripcion AS Nombre , PCOSTO
FROM articulo
WHERE PCOSTO=(SELECT MIN(pcosto) FROM articulo)

19. Muestra las facturas, clientes, totales calculados, y cuantos tipos de artculos hay en esa factura, ordenados
por cuantos tipos de artculos hay en la factura en forma descendente.
SELECT factura.id_factura, cli_nombre, cli_apellido,
SUM(cantidad*pcosto) AS Total, COUNT(articulo.id_articulo) AS 'Cuantos
tipos de Articulo'
FROM factura, articulo, detalle, cliente
WHERE detalle.id_articulo=articulo.id_articulo and
factura.id_factura=detalle.id_factura and
cliente.id_cliente=factura.id_cliente
GROUP BY factura.id_factura, cli_nombre, cli_apellido
ORDER BY COUNT(articulo.id_articulo) DESC

20. Muestra los mejores clientes cuya suma de totales de sus compras sea mayores a 10000, en el ao 1999.
SELECT cliente.id_cliente, cli_nombre, cli_apellido, SUM(total) AS
'Acumulado Soles'
FROM factura, cliente
WHERE factura.id_cliente=cliente.id_cliente AND YEAR(factura.fecha)=1999
GROUP BY cliente.id_cliente, cli_nombre, cli_apellido
HAVING SUM(total)>10000
ORDER BY cliente.id_cliente

Ing. CIP. Eddy Ivn Quispe Soto 7


Base de Datos

OPERADORES EXISTS Y NOT EXISTS.


EXISTS evala si el subconjunto resultante de la subconsulta no es vaci, en caso contrario da falso.
NOT EXISTS trabaja de modo contrario, evala verdadero si el conjunto resultante es vaci y falso en
caso contrario.

21. Clientes que no hayan adquirido nunca una factura


SELECT id_cliente, cli_nombre, cli_apellido
FROM cliente
WHERE NOT EXISTS (SELECT * FROM factura WHERE cliente.id_cliente =
factura.id_cliente)

22. Empleados que no hayan emitido nunca una factura


SELECT id_empleado, apaterno, amaterno
FROM empleado
WHERE NOT EXISTS (SELECT * FROM factura WHERE empleado.id_empleado =
factura.id_empleado)

23. Artculos que todava no hayan sido vendidos


SELECT articulo.id_articulo, descripcion
FROM articulo
WHERE NOT EXISTS (SELECT * FROM factura ,detalle WHERE
factura.id_factura = detalle.id_factura and
articulo.id_articulo=detalle.id_articulo )

24. Clientes que hayan comprado por lo menos una vez (ver consulta 26).
SELECT id_cliente, cli_nombre, cli_apellido
FROM cliente
WHERE EXISTS (SELECT * FROM factura WHERE cliente.id_cliente =
factura.id_cliente)

25. Mostrar las facturas del da 8 del mes de diciembre, y ao 1999.


SELECT *
FROM factura
WHERE DATEPART("YYYY",[FECHA])>=1999 And DATEPART("MM",[FECHA])=12 And
DATEPART("DD",[FECHA])=8

26. Clientes que hayan comprado por lo menos una vez (ver consulta 27)
SELECT DISTINCT (cliente.id_cliente), cli_nombre
FROM cliente,factura
WHERE cliente.id_cliente=factura.id_cliente

27. Total de ventas generadas por ao


SELECT YEAR(fecha), SUM (Cantidad*Pcosto)
FROM Cliente C,Factura F,Articulo A,Detalle D
WHERE C.id_cliente=F.id_Cliente AND D.id_factura=F.id_factura AND
D.id_articulo=A.id_articulo
GROUP BY YEAR(fecha)

28. Total de ventas generadas en los aos 2003 y 2004


SELECT YEAR(fecha), SUM (Cantidad*Pcosto)
FROM Cliente C,Factura F,Articulo A,Detalle D
WHERE C.id_cliente=F.id_Cliente AND D.id_factura=F.id_factura AND
D.id_articulo=A.id_articulo
GROUP BY YEAR(fecha)
HAVING YEAR(FECHA) IN (2003,2004)

Ing. CIP. Eddy Ivn Quispe Soto 8


Base de Datos

CONSULTAS DE UNIN INTERNA

Las vinculaciones entre tablas se realiza mediante la clusula INNER que combina registros de
dos tablas siempre que haya concordancia de valores en un campo comn. Su sintaxis es:

SELECT campos FROM tb1 INNER JOIN tb2 ON tb1.campo1 comp tb2.campo2

En donde:

tb1, tb2
Son los nombres de las tablas desde las que se combinan los registros.

campo1, campo2
Son los nombres de los campos que se combinan. Si no son numricos, los campos deben ser del
mismo tipo de datos y contener el mismo tipo de datos, pero no tienen que tener el mismo nombre.

comp
Es cualquier operador de comparacin relacional: =, <, >, <=, >=, o <>.

Se puede utilizar una operacin INNER JOIN en cualquier clusula FROM. Esto crea una
combinacin por equivalencia, conocida tambin como unin interna. Las combinaciones Aqu son las
ms comunes; stas combinan los registros de dos tablas siempre que haya concordancia de valores
en un campo comn a ambas tablas. Se puede utilizar INNER JOIN con las tablas Departamentos y
Empleados para seleccionar todos los empleados de cada departamento. Por el contrario, para
seleccionar todos los departamentos (incluso si alguno de ellos no tiene ningn empleado asignado)
se emplea LEFT JOIN o todos los empleados (incluso si alguno no est asignado a ningn
departamento), en este caso RIGHT JOIN.

Si se intenta combinar campos que contengan datos Memo u Objeto OLE, se produce un
error. Se pueden combinar dos campos numricos cualesquiera, incluso si son de diferente tipo de
datos. Por ejemplo, puede combinar un campo Numrico para el que la propiedad Size de su objeto
Field est establecida como Entero, y un campo Contador.
El ejemplo siguiente muestra cmo podra combinar las tablas Categoras y Productos basndose en el
campo IDCategoria:

SELECT Nombre_Categora, NombreProducto FROM Categorias INNER JOIN Productos ON


Categorias.IDCategoria = Productos.IDCategoria;

En el ejemplo anterior, IDCategoria es el campo combinado, pero no est incluido en la salida


de la consulta ya que no est incluido en la instruccin SELECT. Para incluir el campo combinado,
incluir el nombre del campo en la instruccin SELECT, en este caso, Categorias.IDCategoria.
Tambin se pueden enlazar varias clusulas ON en una instruccin JOIN, utilizando la sintaxis
siguiente:

SELECT campos FROM tabla1 INNER JOIN tabla2 ON tb1.campo1 comp tb2.campo1 AND ON
tb1.campo2 comp tb2.campo2) OR ON tb1.campo3 comp tb2.campo3)];

Tambin puede anidar instrucciones JOIN utilizando la siguiente sintaxis:

SELECT campos FROM tb1 INNER JOIN (tb2 INNER JOIN [( ]tb3 [INNER JOIN [( ]tablax [INNER
JOIN ...)] ON tb3.campo3 comp tbx.campox)] ON tb2.campo2 comp tb3.campo3) ON tb1.campo1
comp tb2.campo2;

Un LEFT JOIN o un RIGHT JOIN puede anidarse dentro de un INNER JOIN, pero un INNER
JOIN no puede anidarse dentro de un LEFT JOIN o un RIGHT JOIN.

Ing. CIP. Eddy Ivn Quispe Soto 9


Base de Datos

EN RESUMEN

sintaxis del INNER JOIN es la siguiente:

sintaxis del LEFT JOIN es la siguiente:

sintaxis del RIGTH JOIN es la siguiente:

EJEMPLOS DE APLICACIN.

29. Articulos y sus respectiva categorias (ver consulta 28)


select Id_articulo,articulo.Descripcion,Categoria.Descripcion
from Articulo,Categoria
where articulo.id_categ=categoria.id_categ

30. Articulos y sus respectiva categorias - Utilizando INNER JOIN.


select Id_articulo,articulo.Descripcion,Categoria.Descripcion
from Articulo INNER JOIN Categoria ON
articulo.id_categ=categoria.id_categ

31. Clientes que hayan comprado por lo menos una vez


SELECT DISTINCT (cliente.id_cliente), cli_nombre
FROM cliente INNER JOIN factura ON cliente.id_cliente=factura.id_cliente

32. Artculos que se hayan vendido por lo menos una vez


SELECT DISTINCT (Articulo.Id_articulo), Articulo.Descripcion
FROM Articulo INNER JOIN (Factura INNER JOIN Detalle
ON Factura.Id_factura = Detalle.Id_factura)
ON Articulo.Id_articulo = Detalle.Id_articulo

33. Artculos, sus categoras y sus tipos


SELECT DISTINCT (Articulo.Id_articulo),
Articulo.Descripcion,categoria.Descripcion,tipo.Descripcion
FROM Articulo INNER JOIN (categoria INNER JOIN tipo
ON categoria.id_tipo=tipo.id_tipo)
ON Articulo.id_categ=categoria.id_categ

34. Artculos, sus categoras y sus tipos


SELECT DISTINCT (Articulo.Id_articulo),
Articulo.Descripcion,categoria.Descripcion,tipo.Descripcion
FROM Articulo INNER JOIN (categoria RIGHT JOIN tipo
ON categoria.id_tipo=tipo.id_tipo)
ON Articulo.id_categ=categoria.id_categ

35. Articulos que no tengan categoria (ver consulta 34)


SELECT id_articulo,Descripcion
FROM articulo
WHERE id_categ IS NULL

36. Articulos que no tengan categoria - Utilizando LEFT JOIN


SELECT Id_articulo,articulo.Descripcion

Ing. CIP. Eddy Ivn Quispe Soto 10


Base de Datos

FROM Articulo LEFT JOIN Categoria ON Articulo.id_categ =


categoria.id_categ
WHERE articulo.id_categ IS NULL

37. Categorias que no tengan asignado articulos (ver consulta 36)


select categoria.Id_categ,Categoria.Descripcion
from Categoria
where not exists (select * from articulo where
articulo.id_categ=categoria.id_categ)

38. Categorias que no tengan asignado articulos - Utilizando LEFT JOIN


SELECT categoria.Id_categ,categoria.Descripcion
FROM categoria LEFT JOIN articulo ON
articulo.id_categ=categoria.id_categ
WHERE articulo.id_categ IS NULL

39. Categorias que no tengan asignado articulos - Utilizando RIGHT JOIN


SELECT categoria.Id_categ,categoria.Descripcion
FROM articulo RIGHT JOIN categoria ON articulo.id_categ =
categoria.id_categ
WHERE articulo.id_categ IS NULL

40. Empleados que hayan facturado y solo aquellos que se les asigno un distrito
select empleado.id_empleado,Apaterno, id_factura, distrito.nombre
from empleado left join factura on
empleado.id_empleado = factura.id_empleado
left join distrito on empleado.id_distrito = distrito.id_distrito
where factura.id_empleado is not NULL
and empleado.id_distrito is not NULL

Ing. CIP. Eddy Ivn Quispe Soto 11

Anda mungkin juga menyukai