select - gestioninformacionUdeM

Anuncio
Crear BD en
Isis Bonet Cruz, PhD
SQL Server
Microsoft® SQL Server™ es un sistema de
administración y análisis de bases de datos
relacionales de Microsoft para soluciones de
comercio electrónico, línea de negocio y
almacenamiento de datos.
Tomado de: http://msdn.microsoft.com/es-es/library/bb545450.aspx
La arquitectura y sus componentes
• Motor de Bases de Datos
Para crear bases de datos relacionales
para el procesamiento de transacciones
en línea o datos de procesamiento
analítico en línea.
creación de tablas y
objetos de base de datos (p.ej.,
índices, vistas y procedimientos
almacenados)
ver, administrar y proteger datos
SQL Server Management Studio
http://msdn.microsoft.com/esco/library/ms187875%28v=sql.105%29.aspx
4
SQL Server Management Studio
SQL Server Management Studio
Es un entorno integrado para obtener
acceso, configurar, administrar y
desarrollar todos los componentes de
SQL Server. SQL Server
Management Studio combina un
amplio grupo de herramientas
gráficas con una serie de editores de
script enriquecidos que permiten a
desarrolladores y administradores de
todos los niveles obtener acceso SQL
Server.
Tomado de: http://technet.microsoft.com/es-es/library/ms174173.aspx
Crear Bases de Datos
Modificar scripts y archivos en SQL
Server Management Studio
Crear nueva Consulta (Abre ventana de script)
Editor de script
•
Diagramas de Relaciones
•
Tablas
•
Consultas (Vistas)
•
Procedimientos Almacenados
•
Funciones
•
Triggers
•
Políticas de Seguridad
Tipos de datos
Vea: http://msdn.microsoft.com/es-co/library/ms187752.aspx
Números exactos:
bigint
int
smallint
tinyint
bit
Números aproximados:
float
Fecha y hora:
datetime
date
datetime2
decimal predeterminado
dec(18,0)
numeric
money
smallmoney
real
smalldatetime AAAA-MM-DD
hh:mm:ss
time
datetimeoffset
Tipos de datos
Vea: http://msdn.microsoft.com/es-co/library/ms187752.aspx
Cadenas de caracteres:
char predeterminado char(1)
varchar
Cadenas de caracteres Unicode:
nchar predeterminado nchar(1)
nvarchar
Cadenas binarias:
binary predeterminado binary(1)
varbinary
Otros tipos de datos:
cursor
sql_variant
table
text
ntext
image
timestamp
uniqueidentifier
xml
Instrucciones
• CREATE: Crea
• ALTER: Modifica
• DROP : Borra
CREATE
CREATE tipo_objeto nombre_objecto…
– CREATE DATABASE
– CREATE TABLE
Ejemplos:
CREATE DATABASE venta
CREATE TABLE Clientes(IdCliente int,
Nombre varchar(40), edad int)
Crear tablas
• Ver:
http://msdn.microsoft.com/esco/library/ms174979%28v=sql.105%29.aspx
ALTER
ALTER nombre_objecto
Ejemplos:
Adicionar el campo fecha_solicitud, del tipo date a la
tabla venta
ALTER TABLE venta
add fecha_solicitud date
Adicionando llave extranjera
ALTER TABLE departamento
add constraint FK_Prueba_Empleado foreign key
(id_empleado)
references Empleado (id_empleado);
ALTER
Adicionando llave primaria a la tabla Empleado:
ALTER TABLE empleado
ALTER COLUMN id_empleado int not null;
ALTER TABLE empleado
ADD CONSTRAINT PK_Prueba PRIMARY KEY
(id_empleado)ON [PRIMARY]
DROP
DROP nombre_objecto
Ejemplos:
DROP TABLE empleado
DROP DATABASE venta
Operaciones con los datos
• Operaciones con datos de la BD
– SELECT
– INSERT
– UPDATE
– DELETE
UPDATE
UPDATE <nombre_tabla>
SET <campo1> = <valor1>
{[,<campo2> = <valor2>,...,<campoN> = <valorN>]}
[ WHERE <condicion>];
Ejemplo:
UPDATE Empleado
SET fecha_inicio=getdate()
WHERE fecha_inicio is null;
INSERT
INSERT INTO <nombre_tabla>
[(<campo1>[,<campo2>,...])]
values
(<valor1>,<valor2>,...);
Ejemplo:
INSERT INTO Empleado
(Id_Empleado
,Nombre
,Id_Departamento
,Edad
,fecha_inicio)
VALUES
(10,'Antonio Gómez', 2, 30, '2012-12-01'),
(12,'Alonso Diaz', 2, 30, '2012-12-01');
Consultas SQL
Isis Bonet Cruz, PhD
SELECT
SELECT select_list [ INTO new_table ]
[ FROM table_source ]
[ WHERE search_condition ]
[ GROUP BY group_by_expression ]
[ HAVING search_condition ]
[ ORDER BY order_expression [ ASC | DESC ] ]
Tomado de: http://msdn.microsoft.com/es-es/library/ms189499(v=sql.105).aspx
SELECT
SELECT select_list [ INTO new_table ]
SELECT
[ ALL | DISTINCT
]
[ FROM
table_source
] [ WHERE
search_condition ]
[ TOP ( expression ) [ PERCENT ] [ WITH TIES ] ]
[ GROUP
BY group_by_expression ]
<select_list> <select_list> ::=
[ HAVING
search_condition
]
{
*
| { table_name
| view_name [| ASC
table_alias
}.*] ]
[ ORDER
BY order_expression
| DESC
|{
[ { table_name | view_name | table_alias }. ]
{ column_name | $IDENTITY | $ROWGUID }
| udt_column_name [ { . | :: } { { property_name | field_name}
| method_name (argument [ ,...n] ) } ]
| expression
[ [ AS ] column_alias ]
}
| column_alias = expression
Tomado
de: http://msdn.microsoft.com/es-es/library/ms189499(v=sql.105).aspx
} [ ,...n
]
SELECT
SELECT select_list [ INTO new_table ]
[ FROM table_source ] [ WHERE search_condition ]
[ GROUP
BY group_by_expression ]
Cuando se utiliza más de una tabla se utiliza la sentencia join , que permite
combinar
registros de dos o]más tablas en una base de datos relacional. En el
[ HAVING
search_condition
Lenguaje SQL hay tres tipo de JOIN: interno, externo y cruzado.
[ ORDER
BY order_expression [ ASC | DESC ] ]
Tomado de: http://msdn.microsoft.com/es-es/library/ms189499(v=sql.105).aspx
Tipos de Join en sentencia SELECT
Combinación interna (INNER JOIN)
Se utiliza para establecer la relación entre las tablas
que se utilizan en el FROM
Ejemplo: suponga las tablas Área y Profesor
ID_Área
Nombre_Área
ID
Nombre_Prof
ID_Área
1
Civil
1
Angel Garcia
2
2
Administrativa
2
Andrea Diaz
1
3
Mecatrónica
3
Rafael Pérez
3
4
Alberto Molina
2
ID_Area
Nombre_Area
ID
Nombre
ID_Area
1
Civil
1
Angel Garcia
2
2
Administrativa
2
Andrea Diaz
1
3
Mecatrónica
3
Rafael Pérez
3
4
Alberto Molina
2
Saber el nombre del profesor y el área a que pertenece:
1ra Vía:
SELECT p.Nombre, a.Nombre_Area
FROM area as a, profesor as p
WHERE a.ID_Area= p.ID_Area
2da Vía:
SELECT p.Nombre, a.Nombre_Area
FROM area as a INNER JOIN profesor as p ON a.ID_Area= p.ID_Area
Tipos de Join en sentencia SELECT
CROSS JOIN
Produce el producto cartesiano
ID_Area
Nombre_Area
ID
Nombre
ID_Area
1
Civil
1
Angel Garcia
2
2
Administrativa
2
Andrea Diaz
1
3
Mecatrónica
3
Rafael Pérez
3
4
Alberto Molina
2
SELECT p.Nombre, a.Nombre_Area
FROM area as a , profesor as p
SELECT *
FROM area CROSS JOIN profesor
Tipos de Join en sentencia SELECT
Combinación externa (OUTER JOIN)
La sentencia LEFT (RIGTH) OUTER JOIN retorna la pareja de
todos los valores de la tabla izquierda (derecha) con los
valores de la tabla de la derecha (izquierda)
correspondientes, o retorna un valor nulo NULL en caso de
no correspondencia.
FULL OUTER JOIN cuando queremos que salgan de derecha y
de izquierda
ID_Area
Nombre_Area
ID
Nombre
ID_Area
1
Civil
1
Angel Garcia
2
2
Administrativa
2
Andrea Diaz
1
3
Mecatrónica
3
Rafael Pérez
3
4
Alberto Molina
2
5
Gustavo Díaz
SELECT *
FROM profesor LEFT OUTER JOIN area ON profesor.ID_Area = area.ID_Area
Profesor.ID
Profesor.Nombre
Profesor. ID_Area
Area.ID_Area
Area.Nombre_Area
1
Angel Garcia
2
2
Administrativa
2
Andrea Diaz
1
1
Civil
3
Rafael Pérez
3
3
Mecatrónica
4
Alberto Molina
2
2
Administrativa
5
Gustavo Díaz
NULL
NULL
WHERE
• Define la condición que se debe cumplir
para que se devuelvan las filas.
ID_Area
Nombre_Area
ID
Nombre
Edad
ID_Area
1
Civil
1
Angel Garcia
34
2
2
Administrativa
2
Andrea Diaz
36
1
3
Mecatrónica
3
Rafael Pérez
40
3
4
Alberto Molina
55
2
5
Gustavo Díaz
44
Los profesores del área de Administrativa
SELECT profesor.Nombre
FROM profesor inner join area on profesor.ID_Area=Area.ID_Area
WHERE area.Nombre_Area=´Administrativa´
Profesores con apellido Diaz:
SELECT Nombre
FROM profesor
WHERE Nombre LIKE ('%Diaz%');
ID_Area
Nombre_Area
ID
Nombre
Edad
ID_Area
1
Civil
1
Angel Garcia
34
2
2
Administrativa
2
Andrea Diaz
36
1
3
Mecatrónica
3
Rafael Pérez
40
3
4
Alberto Molina
55
2
5
Gustavo Díaz
44
Profesor con edad mayor de 40
SELECT Nombre
FROM profesor
WHERE edad >40
Profesor con edad mayor de 40 del departamento de Administrativa
SELECT profesor.Nombre
FROM profesor INNER JOIN area ON profesor.ID_Area=area.ID_Area
WHERE edad >40 AND area.Nombre=´Administrativa´
ID_Area
Nombre_Area
ID
Nombre
Edad
ID_Area
1
Civil
1
Angel Garcia
34
2
2
Administrativa
2
Andrea Diaz
36
1
3
Mecatrónica
3
Rafael Pérez
40
3
4
Alberto Molina
55
2
5
Gustavo Díaz
44
Profesor de las áreas: Administrativa y Mecatrónica
SELECT profesor.Nombre
FROM profesor INNER JOIN area ON profesor.ID_Area=area.ID_Area
WHERE area.Nombre=´Administrativa´ OR area.Nombre=´Mecatrónica´
ORDER BY
• Permite ordenar los resultados por una
columna determinada
ID_Area
Nombre_Area
ID
Nombre
Edad
ID_Area
1
Civil
1
Angel Garcia
34
2
2
Administrativa
2
Andrea Diaz
36
1
3
Mecatrónica
3
Rafael Pérez
40
3
4
Alberto Molina
55
2
5
Gustavo Díaz
44
Profesor con edad mayor de 40
SELECT Nombre
FROM profesor
WHERE edad >40
ORDER BY edad ASC
ASC- ordena ascendentemente
DESC- ordena decrecientemente
GROUP BY
• Permite agrupar filas para resumir
resultados, por el valor de una columna
Funciones de Agregación más comunes
•
•
•
•
•
•
•
SUM ()
AVG ()
COUNT ()
FIRST ()
LAST ()
MAX ()
MIN ()
ID_Area
Nombre_Area
ID
Nombre
Edad
ID_Area
1
Civil
1
Angel Garcia
34
2
2
Administrativa
2
Andrea Diaz
36
1
3
Mecatrónica
3
Rafael Pérez
40
3
4
Alberto Molina
55
2
5
Gustavo Díaz
44
Cantidad de profesores por Área:
SELECT area. Nombre_Area, COUNT (profesor.Nombre) AS Cantidad_Profesores
FROM profesor INNER JOIN area ON profesor.ID_Area=area.ID_Area
GROUP BY area.Nombre_Area
HAVING
• Especifica una condición de búsqueda para un grupo o
agregado
(Para aplicar condiciones después de hacer un GROUP BY)
ID_Area
Nombre_Area
ID
Nombre
Edad
ID_Area
1
Civil
1
Angel Garcia
34
2
2
Administrativa
2
Andrea Diaz
36
1
3
Mecatrónica
3
Rafael Pérez
40
3
4
Alberto Molina
55
2
5
Gustavo Díaz
44
Departamento cuya cantidad de profesores por Área es superior a 5:
SELECT area. Nombre_Area, COUNT (profesor.Nombre) AS Cantidad_Profesores
FROM profesor INNER JOIN area ON profesor.ID_Area=area.ID_Area
GROUP BY area.Nombre_Area
HAVING COUNT (profesor.Nombre) > 5
VIEW
La sentencia: CREATE VIEW…
Crea una tabla virtual a partir
de una consulta.
Utilizando la base realizada en clases:
Cliente
CC
Producto
Codigo
Nombre
Nombre
Apellidos
Precio
teléfono
Empleado
Id
nombre
apellidos
cargo
OrdenVenta
OrdenVenta_Producto
codigo
Nro
descuento
cantidad
Nro
fecha_solicitud
domicilio
CC
Id_empleado
Venta
Nro
fecha_venta
descripcion
• Lista de todos los datos de la tabla Clientes.
• Lista de datos de los clientes, todos los clientes que han
realizado órdenes.
• Nro y fecha de solicitud de las órdenes de venta que se
han entregado, con la fecha de entrega.
• Lista de empleados que han atendido más de dos
órdenes de venta, ordenados según la cantidad de
atendida.
• Órdenes de venta que no se han realizado hasta la fecha
(Nro de orden, cliente que la solicitó y empleado que la
atendió).
• Por cada orden de venta el precio total que se debe
pagar.
• Monto total de las ventas realizadas en el año 2012.
Subconsultas
• Es una instrucción SELECT anidada dentro de
una instrucción SELECT, SELECT...INTO,
INSERT...INTO, DELETE, o UPDATE o dentro de
otra consulta.
Ejemplos subconsultas
Según el ejercicio realizado en clases:
• Aquellos productos que tienen el mayor precio.
select producto.Nombre
from Producto
where Precio= (
select MAX(Precio)
from Producto
)
Ejemplos subconsultas
• Por cada empleado cantidad de órdenes que
se han realizado ya.
SELECT Empleado.nombre, Empleado.apellidos,
count(Nro) as CantidadVendidas
FROM
Empleado inner join OrdenVenta on
Empleado.Id=OrdenVenta.Id_empleado
GROUP BY Empleado.nombre, Empleado.apellidos;
• y aquellas que no se cumplieron.
Ejemplos subconsultas
• y la cantidad que no se cumplieron.
SELECT NC.nombre, NC.apellidos, count(NC.Nro) as
CantidadNoVendidas
FROM
(SELECT OrdenVenta.Nro, Empleado.nombre,
Empleado.apellidos, OrdenVenta.fecha_solicitud
FROM OrdenVenta inner join Empleado on
OrdenVenta.Id_empleado=Empleado.Id
WHERE OrdenVenta.Nro NOT IN (
SELECT Nro
FROM Venta
))NC
GROUP BY NC.nombre, NC.apellidos;
• Aquellos productos para los que no se hicieron órdenes en
el mes actual.
select producto.Codigo
from
Producto
EXCEPT
select OrdenVenta_Producto.Codigo
from
OrdenVenta inner join OrdenVenta_Producto on
OrdenVenta.Nro=OrdenVenta_Producto.Nro
where month(OrdenVenta.fecha_solicitud) =
MONTH(getdate()) and
YEAR(getdate())=YEAR(OrdenVenta.fecha_solicitud);
Otra opción
• Aquellos productos para los que no se hicieron órdenes en
el mes actual.
select producto.Codigo, Producto.Nombre
from
Producto
where Producto.Codigo NOT IN(
select OrdenVenta_Producto.Codigo
from
OrdenVenta inner join OrdenVenta_Producto on
OrdenVenta.Nro=OrdenVenta_Producto.Nro
where month(OrdenVenta.fecha_solicitud) =
MONTH(getdate()) and
YEAR(getdate())=YEAR(OrdenVenta.fecha_solicitud));
Descargar