El documento describe los conceptos básicos de las bases de datos, incluyendo los modelos de datos, entidades, atributos, relaciones, normalización, integridad referencial, y el lenguaje SQL. Proporciona ejemplos de consultas SQL para ilustrar conceptos como seleccionar, filtrar, agrupar, unir tablas y resumir datos de varias tablas relacionadas.
Las entidades son: Stores - Tiendas Sales - Ventas Titles - Libros Authors - Autores Employee - Empleados Jobs - Tipo de trabajo o actividad Discounts - Descuentos TitleAuthor - Titulos por autor Roysched - Control de inventario
Los modelos son importantes para realizar consultas. Un buen esquema gráfico responde a cuestiones como; Que tablas necesitamos para crear una lista de todos los jugadores que han anotado más de 15 goles en las últimas dos temporadas ?
Identifique las llaves primarias y foráneas de los esquemas de ventas y distribución de libros.
Que concepto asegura el requisito de unicidad de una entidad ?
Para producir un diseño de una base de datos se tiene que comenzar con tablas sin normalizar y a través de una serie de pasos descomponer la estructura de datos hasta desarrollar el esquema final.
Una consecuencia negativa de la normalización es la ineficacia de la recupearación debido a una descomposición excesiva.
Un manejador de base de datos hace posible la definición física de un modelo lógico. Un manejador de base de datos relacional RDBMS es un sistema de software que administra la manera en que se almacenan y recuperan los datos.
Un manejador de base de datos debe conservar la integridad de la base de datos.
Entre las múltiples herramientas de un RDBMS está el SQL.
Para la creación de la base de datos existen muchas herramientas gráficas. La herramienta de dibujo Visio es flexible, rápida y facil de utilizar. ERwin es otra herramienta de diseño gráfico con soporte para múltiples bases de datos.
Los tipos de datos pueden ser: Char, Money, Real, Decimal, Int, Date/Time y Especiales Las e specificaciones NOT NULL, DEFAULT y CHECK definen lo que deberá hacerse cuando se inserte un registro a la tabla y se asignen los valores a los campos . NOT NULL obliga a que el campo tenga un valor. DEFAULT define el valor que será asignado por omisión en la asignación. CHECK define el rango de valores que aceptará el campo. Los tipos de datos y las especificaciones NOT NULL, DEFAULT y CHECK c onforman la integridad semántica.
Nombre del índice OrderID_Ind. Clave de ordenamiento OrderID. Tabla dereferencia Order_Details.
La llave primaria de la tabla Order_Details se construye con los campos O r derID y ProductID. La definición de la llave primaria asegura el requisito de unicidad para cada registro de la tabla (integridad de la entidad). Los campos OrderID y ProductID de la tabla Order_Details solo aceptarán valores que exístan dentro de las tablas Orders y Products (integridad referencial).
Para SQL Server INTO va después de SELECT y crea una tabla permanente. Para Informix INTO TEMP va al final y la tabla es temporal.
El símbolo * devuelve todos los campos encontrados en la tabla especificada. Recuperar todos los campos de la tabla puede ser poco eficaz en tablas con demasiadas columnas.
COUNT(*) es una función de agregación que cuenta todos los registros de la tabla de Clientes. Lo claúsula AS cambia el nombre del campo en la consulta.
El resultado muestra que existen varios clientes por país, 3 en Argentina, 2 en Austria, 2 en Belgium, etc. Como saber en cuantos paises distintos se tienen clientes ?
En una consulta, la claúsula DISTINCT suprime los registros duplicados. Es valido
LIKE equivale a coincide con . El carácter comodin % indica una coincidencia parcial. La consulta recupera todos los clientes cuya ciudad inicie con los caracteres “México”. Otros operadores son: < Menor que, <= Menor o igual que, > Mayor que, >= Mayor o igual que, = Igual que, <> No igual que. BETWEEN - Dentro de un intervalo de valores IN - Contenido dentro de una lista de valores
Es posible emplear expresiones y/o funciones en las consultas. FirstName + &quot; &quot; + LastName es una expresión que concatena dos campos del tipo caracter. YEAR(HireDate) es una función que se aplica solo a campos del tipo fecha.
La claúsula WHERE puede tener mas de una condición. Si deseamos los pedidos que fueron enviados despues de la fecha de requerimiento en los años 1997 y 1998 la condición queda WHERE ShippedDate > RequiredDate AND (YEAR(OrderDate)=1997 OR YEAR(OrderDate)=1998)
Es posible emplear NOT BETWEEN.
Otras funciones de agregación son: SUM Suma MIN Valor mínimo MAX Valor máximo AVG Promedio
SUM() y AVG() actúan sobre todos los registros de la tabla de detalle de pedidos que cumplan con la condición ProductId = 15 . Es posible ordenar por un campo que no este dentro de la consulta pero que sea parte de la tabla.
Ordenar es una forma de agrupar y acercarse al resultado. Se tienen 2 proveedores en Australia, 1 en Brazil, 2 en Canada, ......, 3 en France, 3 en Germany,........
Las consultas de grupo resumen los datos en función de uno o más campos comúnes. Se agrupan los registros en función del campo Country y la función COUNT() cuenta los registros que fueron agrupados por ese campo.
La claúsula HAVING es equivalente a la claúsula WHERE para consultas agrupadas.
Cual es el resultado con COUNT(Price) ? Por que ?
Las funciones de agregación no se limitan simplemente a contar o acumular valores. Es posible realizar operaciones dentro de ellas.
Es posible emplear HAVING SUM(Quantity) BETWEEN 500 AND 700 HAVING SUM(Quantity) BETWEEN 500 AND 700 AND SUM(Quantity * UnitPrice) > 10000.00
Es importante evitar este tipo de consultas pues solicitan demasiados recursos al RDBMS.
Se asegura la relación entre las tablas con la claúsula WHERE S.OrderId = D.OrderId Si no se emplean los alias S y D la sintaxis alternativa es: WHERE Orders.OrderId = Order_Details.OrderId Solo se antepone el nombre de la tabla o el alias cuando el nombre de algún campo se repite en ambas tablas.
Agrupando por cliente se tienen los resultados.
En la clausula HAVING, el total de descuento es: SUM(UnitPrice * Quantity * Discount) Y el 10% del total de venta es: SUM(UnitPrice * Quantity) * 0.10
Ordenar es una forma de agrupar y acercarse al resultado.
Observando los datos de la consulta anterior 213-46-8915 BU1032 6871 5 213-46-8915 BU1032 423LL930 10 213-46-8915 BU2075 X999 35 Al agrupar por los campos Au_id y Title_id queda 213-46-8915 BU1032 15 213-46-8915 BU2075 35
Observando los datos de la consulta anterior 213-46-8915 BU1032 15 213-46-8915 BU2075 35 Al agrupar por el campos Au_id queda 213-46-8915 50
En algunos RDBMS las tablas temporales o generadas por la sentencia INTO subsisten mientras dure la sesión activa. No son vistas por otros usuarios.
Se unen tres tablas, las relaciones entre ellas son: Por Titulo s.Title_id = t.Title_id y por Almacén o.Stor_id = s.Stor_id Dejar una tabla si relación con las otras, provoca un producto cartesiano.
Que sucede si: b.ReportsTo=a.Employeeid
La solución puede incluir tablas temporales.
Tips: Que número de proveedor es “ Gai pâturage” ? Que productos distribuye ?
En el primer caso se deben asignar valores para cada campo de la tabla en el orden en que fueron definidos. La segunda forma es más flexible, permite especificar algunos campos en cualquier orden y sus respectivos valores.
OrderId es un campo númerico del tipo autoincremento (IDENTITY para SQL Server y SERIAL para Informix). El RDBMS genera el siguiente valor que corresponde al campo OrderId. Una nueva inserción generará el pedido 11080. GETDATE() es una función disponible en SQL Server para obtener la fecha y hora del sistema. Los campos sin asignación toman el valor NULL o el valor por omisión (DEFAULT).
INSERT statement conflicted with COLUMN CHECK constraint 'CK_Quantity'. The conflict occurred in database 'Northwind', table 'Order_Details', column 'Quantity'. INSERT statement conflicted with TABLE CHECK constraint 'CK_Discount'. The conflict occurred in database 'Northwind', table 'Order Details'. Inserta un nuevo registro con los cvalores 11079, 73, 0, 1, 0.
Si no se especifia la clausula WHERE todos los registros de la tabla serán actualizados. La segunda forma no es valida para SQL Server.
Es importante conocer el tipo de dato de cada campo (columna).
Si no se especifia la clausula WHERE todos los registros de la tabla serán borrados.
Es importante conocer de antemano cuantos registros serán borrados.
EL RDBMS prohíbe cualquier operación que pudiera romper la integridad referencial. DELETE statement conflicted with COLUMN REFERENCE constraint 'FK_Order_Details_Orders'. The conflict occurred in database 'Northwind', table 'Order Details', column 'OrderID'.
La cláusula: WHERE Quantity IS NULL Solo presenta los registros donde no hay valor para Quantity (no se encontraron registros). Para Informix la sintaxis es: SELECT S.OrderId, Quantity, UnitPrice, Discount FROM Orders S, OUTER (Order_Details) D WHERE S.OrderId = D.OrderId AND Quantity IS NULL ORDER BY S.OrderId
Por omisión, la consulta es INNER JOIN. Esto es, solo trae los proveedores que tengan productos en la tabla Products. FROM Suppliers INNER JOIN Products ON (Suppliers.SupplierID = Products.SupplierID) Para OUTER JOIN, tenemos: FROM Suppliers FULL | LEFT | RIGHT OUTER JOIN Products ON (Suppliers.SupplierID = Products.SupplierID) Y para un producto cartesiano: FROM Suppliers CROSS JOIN Products
En un INNER JOIN los clientes “FISSA” y “PARIS” no son parte del resultado de la consulta. FULL OUTER JOIN especifica que los registros de la tabla de la izquierda “Customers” y derecha “Orders” que no reunan la condicion del JOIN son incluidos en el conjunto de resultados. LEFT OUTER JOIN especifica que todos los registros de la tabla izquierda “Customers” que no reunan la condición del JOIN son incluidos en el conjunto de resultados. RIGHT OUTER JOIN especifica que todos los registros de la tabla derecha “Orders” que no reunan la condición del JOIN son incluidos en el conjunto de resultados.
La cláusula WHERE T.pub_id IS NULL OR P.pub_id IS NULL Elimina todos los libros que corresponden a cada editor. Los siguientes cambios devuelven: FROM Publishers P LEFT OUTER JOIN Titles T - El mismo resultado FROM Publishers P RIGHT OUTER JOIN Titles T - No devuelve registros FROM Titles T LEFT OUTER JOIN Publishers P - No devuelve registros FROM Titles T RIGHT OUTER JOIN Publishers P - El mismo resultado Por que ?
Solo presenta los editores que tienen libros y ventas.
Solo presenta los editores que tienen libros y ventas.
Presenta el total de editores.
Ejemplo de “Subquery” en la claúsula “WHERE”. El “Subquery” debe regresar exactamente una columna.
Ejemplo se “Subqueries” anidados. Es posible obtener el mismo resultado con una consulta diferente ?