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));