PlanB Flashcards
El rectangulo en un diagrama de entidad - relación se denomina
Tipo de entidad
Si lo comparamos con clases, el tipo de entidad es la clase y la entidad es el objeto.
La elipse en un diagrama de entidad-relación se denomina
Atributo
El rombo en un diagrama de entidad-relación se denomina
Relación
¿Qué es el grado de una relación?
Es el nº de tipos de entidad que participan en esa relación
Que es una relación reflexiva?
La que es de grado 1, es decir, que la relación se relaciona solo con un tipo de entidad de la cual salen dos líneas hasta la relación.
Que es la cardinalidad
nº de ocurrencias de una entidad que se relaciona con una del otro extremo (1,1), (1,n), etc
Que es el tipo de correspondencia?
Las máximas de las cardinalidades de la relación, por ejemplo, si tiene (0,n) y (0,1), el tipo de correspondencia será 1:n
Que es el dominio en entidad-relación
Los valores permitidos
que es una entidad fuerte/regular y como se representa
con un rectángulo , tiene sentido por si misma (autor, pedido)
qué es una entidad débil y cómo se representa
con un rectángulo punteado, no tiene sentido por sí misma (libro, factura) . Tiene que tener un atributo que le de sentido.
- En existencia: por defecto factura es débil en existencia al necesitar un pedido.
- En identidad: Necesitan una entidad fuerte para existir y además no hay ningún atributo propio de la entidad débil que sea clave
Que significa una pata de gallo, un circulo y dos rayas en un diagrama entidad relación?
En un diagrama de entidad relación, la pata de gallo se refiere a muchos, el circulo 0, y las rayas verticales 1:1
Que es la relación de generalización especialización?
La relación de generalización/especialización es un concepto que se utiliza en varios campos, como la informática, la ingeniería de software y la teoría de sistemas. Describe una jerarquía entre clases o conceptos donde uno de ellos es más general y abarca las características comunes de otros que son más específicos. Este tipo de relación es clave para el diseño y organización de sistemas y datos.
- Generalización: Un concepto general que define atributos y comportamientos comunes. Este concepto es la superclase o clase padre.
- Especialización: Un concepto más específico que hereda atributos y comportamientos del concepto general, pero que también puede tener características adicionales. Este concepto es la subclase o clase hija.
Ejemplo práctico:
-
Clase General: “Vehículo” (generalización).
- Atributos comunes: número de ruedas, capacidad de pasajeros, color.
- Métodos comunes: acelerar, frenar.
-
Clases Especializadas: “Coche”, “Motocicleta”, “Camión” (especialización).
- “Coche” puede tener atributos adicionales, como número de puertas.
- “Motocicleta” podría tener un atributo adicional relacionado con el tipo de manillar.
- “Camión” podría tener atributos como la capacidad de carga.
- Herencia: Las clases especializadas heredan los atributos y métodos de la clase general. Esto permite reutilizar código y mantener la coherencia en el sistema.
- Polimorfismo: Gracias a la generalización/especialización, se pueden tratar objetos de las clases especializadas como si fueran objetos de la clase general, lo que facilita la flexibilidad en el diseño del software.
- Jerarquía: Se crea una estructura jerárquica donde la clase más general se encuentra en la parte superior y las especializadas en los niveles inferiores.
En diseño de bases de datos, la relación de generalización/especialización se refiere a cómo se modelan entidades y subentidades en un diagrama entidad-relación. Por ejemplo, una entidad general “Empleado” podría especializarse en entidades como “Gerente” o “Técnico”, cada una con sus propios atributos específicos.
La relación de generalización/especialización es una forma de organizar y estructurar información mediante la creación de categorías jerárquicas, donde los conceptos más específicos son una especialización de un concepto más general. Esto es crucial en el diseño de sistemas, ya que promueve la reutilización y la consistencia.
en generalización especialización, cuando es exclusiva o disjunta como se representa?
Representa que el máximo es uno, se representa con un arco en la parte inferior o un triangulo hacia abajo con una d (disjunto)
en generalización especialización, cuando es solapada o no disjunta como se representa?
Representa que el máximo es varios. Se representa con un triangulo sin arco o con un triangulo hacia abajo con una O
en generalización especialización, cuando es total o II , como se representa?
Representa que la mínima es 1. Se representa con un circulo encima del triangulo.
en generalización especialización, cuando es parcial o I, como se representa?
Representa que la mínima es 0. El triangulo por encima no tiene nada.
representación de dfd y flujos permitidos en dfd
Rectángulos: entidades externas (actores que interactúan con el sistema, usuarios, etc)
Círculos: Procesos (actividades que transforman los datos , registrar pedido, procesar algo)
|| : almacén de datos (bases de datos o archivos)
Flecha: flujo de datos (muestra la dirección en la que se mueven los datos)
Flujos permitidos:
- Entre dos procesos
- Proceso y almacén
- Proceso y entidad externa
Cual es el proceso de modelado de una bbdd?
- Toma de requisitos
- Modelo conceptual (independiente de todo e/r)
- Modelo lógico (dependiente del tipo de bd ejemplo modelo relacional)
- Modelo físico (dependiente del sgbd : oracle)
Arquitectura ansi/spark de un dbms
- Nivel externo (vistas )
- Nivel conceptual (tablas / relaciones)
- Nivel interno (detalles almacén, índices)
Busca independencia entre nivel físico y lógico
En el modelo relacional hay entidad- relación?
NO! Solo relaciones!
En el modelo relacional que es el esquema de una relación o intensión?
El conjunto de sus atributos. Por ejemplo la relación profesor sus atributos serían nif, nombre, dpto, teléfono. Ojo los atributos no el nº de atributos que es el grado!!!
En el modelo relacional que es el grado?
El número de atributos de la relación (en el entidad-relación era el número de entidades que participaban)
En el modelo relacional que es la extensión?
Es el conjunto de tuplas
En el modelo relacional que es la cardinalidad?
El nº de tuplas.
CUIDADO en el modelo E/R es: nº de ocurrencias de una entidad que se relaciona con una del otro extremo (1,1), (1,n), etc
Que es una tupla?
Es una fila o registro, por ejemplo 1111,’pepe’,’madrid’
Como se pasa del modelo entidad relación al relacional
- Un tipo de entidad se convierte en una relación
- En las relaciones 1:n se propaga la clave del lado del 1 al lado n (por ejemplo, el id de proveedor se lleva también a la tabla producto)
- En las relaciones n:M se crea una relación (tabla nueva con las claves de ambas entidades)
En el modelo relacional que es la regla de integridad de entidad?
Ningún atributo de la primary key puede tener valor nulo
En el modelo relacional que es la integridad referencial?
Si en una relación existe una clave ajena, los valores de esta deben coincidir con la clave referenciada o ser nulos.
En el modelo relacional que es una clave candidata?
Atributo o conjunto de atributos mínimo que identifican unívocamente a cada tupla.
Que es una superclave?
es igual que la clave candidata pero sin ser un conjunto mínimo ya que es reducible. Por ejemplo dni, colorojos. Puede reducirse eliminando colorojos.
De todas las superclaves que tengamos, las que sean mínimas serán candidatas.
Cuantas son las reglas de codd y que son?
13, numeradas del 0 al 12 . Define los requisitos que debe cumplir un SGBD para ser considerado relacional
Codd 0
Regla fundamental. Todo SGBBDD debe ser autosuficiente
Codd 1
Regla de la información. Toda la información debe estar en tablas
Codd 2
Regla del acceso garantizado. Todos los datos son accesibles, sin ambigüedad
Codd 3
Regla del tratamiento sistemático de valores nulos.
Codd 4
Catálogo dinámico en línea basado en el modelo relacional. Es el diccionario de datos. se accede a los metadatos igual que alos datos.
Codd 5
Regla del sublenguaje de datos completo. Existe al menos un lenguaje que permita el manejo completo de la base de datos (SQL)
Codd 6
Regla de actualización de vistas. Las vistas deben mostrar información actualizada siempre.
Codd 7
Inserción, actualización y borrado de alto nivel. Se puede operar desde conjuntos de datos, no solo registro a registro.
Codd 8
Independencia física de los datos. Si cambia el nombre de un fichero de la BD no hay que cambiar ni programas de usuarios ni tablas.
Codd 9
Independencia lógica de datos. Las aplicaciones son independientes de la propia lógica. Es más difícil que la independencia física.
Codd 10
Independencia de la integridad. Las reglas de integridad se guardan en el diccinario de datos, no en las apps.
Codd 11
Independencia de la distribución. Las BBDD distribuidas permiten trabajar en ellas como si fueran una base de datos normal y local
Codd 12
La regla de la no subversión. Si el SGBD tiene un lenguaje de bajo nivel, este no podrá saltarse las reglas anteriores.
Que es mejor 1FN o 5FN
Cuanto más alta es la forma normal mejor. Cuando una relación está en 3FN, significa que también está en 2FN y 1FN.
Cual es la ventaja e inconvenientes de las FN
Se generan más relaciones/tablas
Es bueno porque hay menos repetición / inconsistencias
Es malo porque el rendimiento de las consultas cae (hay que hacer más inner join)
señala la respuesta incorrecta , los tipos más corrientes de anomalías en bd son: a) lecturas no repetibles b) lecturas hundidas c) lecturas sucias d) lecturas fantasma
La respuesta incorrecta es b) lecturas hundidas.
Los tipos más corrientes de anomalías en bases de datos son:
Lecturas no repetibles (a):
Ocurren cuando una transacción lee el mismo dato más de una vez y encuentra valores diferentes debido a actualizaciones realizadas por otras transacciones.
Lecturas sucias (c):
Sucede cuando una transacción lee datos que han sido modificados por otra transacción que aún no ha sido confirmada (commit).
Lecturas fantasma (d):
Ocurren cuando una transacción encuentra registros nuevos o eliminados en una segunda lectura de una consulta, debido a inserciones o eliminaciones realizadas por otras transacciones.
Lecturas hundidas no es un término reconocido en el contexto de anomalías en bases de datos
Que es la integridad de entidad? puede tener valores nulos?
La integridad de entidad es un principio fundamental en el modelo relacional de bases de datos que garantiza que cada fila (tupla) en una tabla es única y que se puede identificar de manera inequívoca. Este principio se asegura principalmente mediante la implementación de claves primarias.
NO PUEDE TENER VALORES NULOS
Dependencia funcional vs multivaluada
Dependencia Funcional:
Concepto: Imagina que tienes una tabla donde cada estudiante tiene un número de identificación único (por ejemplo, EstudianteID). Si sabes el EstudianteID, puedes saber exactamente el nombre del estudiante. Esto significa que EstudianteID determina el nombre del estudiante. En términos más sencillos, una cosa (EstudianteID) determina otra cosa (Nombre).
Ejemplo: Si EstudianteID es “123”, siempre sabrás que su nombre es “Ana”. No puede haber dos estudiantes con el mismo EstudianteID pero nombres diferentes.
Dependencia Multivaluada:
Concepto: Ahora, imagina que además de tener un nombre, cada estudiante puede hablar varios idiomas y practicar varios deportes. Por ejemplo, un estudiante puede hablar inglés y español, y también puede jugar al fútbol y al baloncesto. Aquí, su EstudianteID se asocia con varios idiomas y varios deportes, pero estos idiomas y deportes no dependen unos de otros. Esto significa que el EstudianteID tiene una dependencia multivaluada sobre Idioma y Deporte.
Ejemplo: El estudiante con EstudianteID “123” puede hablar inglés y español (idiomas independientes) y jugar al fútbol y al baloncesto (deportes independientes). Aquí, los idiomas y los deportes se asocian con el estudiante de manera independiente.
Resumen:
Dependencia Funcional: Un atributo (como EstudianteID) determina otro atributo (como Nombre).
Dependencia Multivaluada: Un atributo (como EstudianteID) se asocia con múltiples valores de otros atributos (como Idiomas y Deportes), de manera independiente.
Que significa que una tabla está en 1FN
Cada columna en una tabla contiene solo valores atómicos (indivisibles) y que cada fila es única.
Valores Atómicos: Cada campo en una tabla debe contener un solo valor, no una lista de valores o un conjunto de valores. Esto significa que no puedes tener una celda en la tabla que contenga múltiples datos.
No hay Repeticiones: No puedes tener columnas repetidas que representen el mismo tipo de información. Por ejemplo, no debes tener columnas como Teléfono1, Teléfono2, etc., para un solo contacto; en su lugar, deberías tener una tabla separada para los números de teléfono.
Ejemplo Simple:
Supongamos que tienes una tabla de Estudiantes así:
EstudianteID Nombre Teléfonos
1 Ana 555-1234, 555-5678
2 Luis 555-8765
Esta tabla no está en 1FN porque la columna Teléfonos contiene múltiples números en la misma celda.
Para ponerla en 1FN, deberías separar los números de teléfono en filas diferentes o en una tabla aparte, así:
Opción 1: Separar en filas diferentes (dentro de la misma tabla):
EstudianteID Nombre Teléfono
1 Ana 555-1234
1 Ana 555-5678
2 Luis 555-8765
Opción 2: Crear una tabla aparte para los teléfonos:
Tabla Estudiantes:
EstudianteID Nombre
1 Ana
2 Luis
Tabla Teléfonos:
TeléfonoID EstudianteID Teléfono
1 1 555-1234
2 1 555-5678
3 2 555-8765
Resumen:
Una tabla está en 1FN si cada celda contiene un único valor y no hay columnas que repitan el mismo tipo de información. Esto asegura que los datos estén organizados de manera clara y sin ambigüedades
Que significa que una tabla está en 2FN
Está en 1FN y todos sus atributos no clave dependen completamente de toda la clave primaria, no solo de una parte de ella.
Si la clave es simple, está en 2FN!!!
Ejemplo Sencillo:
Supongamos que tenemos la siguiente tabla Pedidos:
PedidoID ProductoID Cantidad PrecioProducto NombreProducto
1 101 50 0.50 Lápiz
1 102 30 2.00 Cuaderno
2 101 20 0.50 Lápiz
Clave Primaria Compuesta: En esta tabla, la clave primaria es la combinación de PedidoID y ProductoID.
Problema: Los atributos PrecioProducto y NombreProducto dependen solo de ProductoID y no de la combinación completa PedidoID + ProductoID. Esto significa que hay una dependencia parcial.
Solución (Descomposición para lograr 2FN):
Dividimos la tabla en dos tablas:
Tabla Pedidos: Esta tabla mantiene la relación entre PedidoID y ProductoID junto con la cantidad.
Tabla Productos: Esta tabla almacena la información del producto, como su nombre y precio, que dependen solo del ProductoID.
Tabla Pedidos:
PedidoID ProductoID Cantidad
1 101 50
1 102 30
2 101 20
Tabla Productos:
ProductoID NombreProducto PrecioProducto
101 Lápiz 0.50
102 Cuaderno 2.00
Explicación:
Ahora, todos los atributos en la tabla Pedidos dependen completamente de la clave primaria PedidoID + ProductoID.
La tabla Productos asegura que NombreProducto y PrecioProducto dependan únicamente de ProductoID, que es su clave primaria.
Resumen:
Una tabla está en 2FN cuando no tiene dependencias parciales, lo que significa que cada atributo no clave depende completamente de toda la clave primaria, y no solo de una parte de ella. Esto ayuda a evitar redundancias y mejora la integridad de los datos.
Que significa que una tabla está en 3FN
La Tercera Forma Normal (3FN) es un concepto clave en la normalización de bases de datos que tiene como objetivo eliminar la redundancia y asegurar que los datos se almacenen de manera eficiente. Una tabla está en 3FN si cumple con las siguientes condiciones:
Está en Segunda Forma Normal (2FN):
Esto significa que la tabla ya está libre de dependencias parciales, es decir, todos los atributos no clave dependen completamente de la clave primaria.
No tiene dependencias transitivas:
Una dependencia transitiva ocurre cuando un atributo no clave depende de otro atributo no clave, lo cual a su vez depende de la clave primaria. En 3FN, todos los atributos no clave deben depender directamente de la clave primaria, no de otro atributo no clave.
Ejemplo Sencillo:
Supongamos que tenemos la siguiente tabla Estudiantes:
EstudianteID Nombre Curso Profesor
1 Ana Matemáticas Pérez
2 Luis Historia López
Clave Primaria: EstudianteID
Dependencia Transitiva: Aquí, el Profesor depende del Curso, que a su vez depende del EstudianteID. Esto crea una dependencia transitiva, ya que Profesor depende indirectamente de la clave primaria EstudianteID a través del Curso.
Descomposición para lograr 3FN:
Para eliminar esta dependencia transitiva y llevar la tabla a 3FN, podemos descomponer la tabla en dos:
Tabla Estudiantes:
EstudianteID Nombre Curso
1 Ana Matemáticas
2 Luis Historia
Tabla Cursos:
Curso Profesor
Matemáticas Pérez
Historia López
Explicación:
En la tabla Estudiantes, todos los atributos dependen directamente de la clave primaria EstudianteID.
La tabla Cursos ahora contiene la relación entre Curso y Profesor, eliminando la dependencia transitiva.
Resumen:
Una tabla está en Tercera Forma Normal (3FN) si está en 2FN y no tiene dependencias transitivas. Esto significa que todos los atributos no clave dependen directamente de la clave primaria, lo que evita redundancias y mejora la integridad de los datos. La 3FN es un paso importante en el diseño de bases de datos porque ayuda a asegurar que la base de datos esté bien estructurada y que los datos no se dupliquen innecesariamente.
Que significa que una tabla está en FNBC
Si está en 3FN y los determinantes de todas las dependencias funcionales son la clave.
La Forma Normal de Boyce-Codd (BCNF) es una versión avanzada de la Tercera Forma Normal (3FN) en la normalización de bases de datos. Fue desarrollada por Raymond F. Boyce y Edgar F. Codd como una mejora de la 3FN para manejar ciertos tipos de dependencias que no son cubiertas completamente por la 3FN.
La tabla no tiene dependencias parciales ni transitivas. Es decir, todos los atributos no clave dependen directamente de la clave primaria.
Para cualquier dependencia funcional
𝐴→𝐵
A→B, 𝐴
A debe ser una superclave:
Esto significa que si existe una dependencia funcional en la tabla, el atributo de la izquierda (el que determina) debe ser una superclave.
En otras palabras, no debe haber ningún atributo no clave que determine otro atributo no clave.
Ejemplo de BCNF:
Imagina que tienes la siguiente tabla Asignaciones:
AsignaciónID EstudianteID TutorID
1 1001 T01
2 1002 T02
3 1003 T01
4 1002 T01
Dependencia Funcional: En esta tabla, existe una dependencia funcional entre EstudianteID y TutorID porque un estudiante solo puede tener un tutor. Sin embargo, EstudianteID no es una superclave, porque no identifica de manera única las tuplas de la tabla (la clave primaria es AsignaciónID).
Problema con BCNF: Aunque la tabla podría estar en 3FN (porque no hay dependencias parciales o transitivas), no está en BCNF porque EstudianteID (que no es una superclave) determina TutorID.
Solución para alcanzar BCNF:
Podemos descomponer la tabla en dos:
Tabla EstudiantesTutores:
EstudianteID TutorID
1001 T01
1002 T02
1003 T01
Tabla Asignaciones:
AsignaciónID EstudianteID
1 1001
2 1002
3 1003
4 1002
Ahora, en la tabla EstudiantesTutores, EstudianteID es una superclave, y no hay dependencias funcionales que violen BCNF.
Resumen:
La Forma Normal de Boyce-Codd (BCNF) es una versión más estricta de la 3FN. Una tabla está en BCNF si no tiene dependencias funcionales en las que un atributo no clave determine otro atributo no clave. Esto asegura que la tabla esté lo más libre posible de redundancias y dependencias anómalas, lo que mejora la integridad de los datos.
4FN
La Cuarta Forma Normal (4FN) es una etapa avanzada en el proceso de normalización de bases de datos que se enfoca en eliminar ciertas formas de redundancia que no son abordadas en las formas normales anteriores.
Para que una tabla esté en 4FN, debe cumplir con los siguientes criterios:
Requisitos para estar en 4FN:
Debe estar en Boyce-Codd Normal Form (BCNF):
La tabla ya debe cumplir con las reglas de la BCNF, lo que significa que no tiene dependencias funcionales no deseadas.
No debe tener dependencias multivaluadas no triviales:
Una dependencia multivaluada ocurre cuando un atributo en una tabla está relacionado con múltiples valores de otro atributo, independientemente de otros atributos. En 4FN, cualquier dependencia multivaluada no trivial debe ser eliminada.
Ejemplo Sencillo:
Supongamos que tienes una tabla Proyectos que registra los programadores y las herramientas que utilizan en diferentes proyectos:
Proyecto Programador Herramienta
Proyecto1 Alice Git
Proyecto1 Alice Docker
Proyecto1 Bob Git
Proyecto1 Bob Docker
Proyecto2 Alice Jenkins
En esta tabla, existe una dependencia multivaluada: para cada Proyecto, un Programador puede estar relacionado con múltiples Herramientas. Además, el Proyecto y el Programador no están relacionados con un solo valor de Herramienta, lo que crea redundancia.
Solución para alcanzar 4FN:
Para eliminar esta dependencia multivaluada y llevar la tabla a 4FN, se debe descomponer en dos tablas:
Tabla ProyectosProgramadores:
Proyecto Programador
Proyecto1 Alice
Proyecto1 Bob
Proyecto2 Alice
Tabla ProgramadoresHerramientas:
Programador Herramienta
Alice Git
Alice Docker
Bob Git
Bob Docker
Alice Jenkins
Explicación:
Ahora, las relaciones entre Programadores y Herramientas no están mezcladas con la relación entre Proyectos y Programadores. Esto elimina la redundancia y asegura que la tabla cumpla con 4FN.
Resumen:
La Cuarta Forma Normal (4FN) se alcanza cuando una tabla está en BCNF y no tiene dependencias multivaluadas no triviales. Esto ayuda a eliminar redundancias adicionales que pueden surgir en bases de datos complejas, asegurando una estructura de datos más eficiente y consistente.
5FN
La Quinta Forma Normal (5FN), también conocida como Forma Normal Proyectada y Combinada (PJ/NF), es el nivel más avanzado de normalización en bases de datos. Se ocupa de resolver las dependencias de tipo “join” (unión), que pueden causar redundancia y anomalías en la base de datos.
Requisitos para estar en 5FN:
Debe estar en Cuarta Forma Normal (4FN):
La tabla ya debe cumplir con los criterios de la 4FN, lo que significa que no tiene dependencias multivaluadas no triviales.
No debe haber dependencias de unión (join dependencies) no triviales:
Una dependencia de unión ocurre cuando una tabla puede ser descompuesta en varias tablas más pequeñas, pero al volver a unirlas (mediante un JOIN), no se recuperan todas las tuplas originales de la tabla. En 5FN, se busca que cualquier tabla que se pueda descomponer de manera no trivial en otras tablas más pequeñas, deba ser descompuesta.
Ejemplo Sencillo:
Imagina que tienes una tabla Pedidos que registra las relaciones entre clientes, productos, y proveedores:
Cliente Producto Proveedor
Juan Televisor Sony
Juan Teléfono Samsung
Marta Televisor LG
Marta Teléfono Samsung
En esta tabla, las combinaciones de Cliente, Producto, y Proveedor pueden llevar a una dependencia de unión, porque la relación entre ellos puede estar basada en otras relaciones subyacentes, como la relación entre Cliente y Producto, Producto y Proveedor, o Cliente y Proveedor.
Problema:
La tabla podría contener redundancia si, por ejemplo, las relaciones entre Cliente y Producto son independientes de las relaciones entre Producto y Proveedor. Esto significa que podríamos dividir esta tabla en tres tablas más pequeñas sin perder información al unirlas.
Descomposición para alcanzar 5FN:
Tabla ClientesProductos:
Cliente Producto
Juan Televisor
Juan Teléfono
Marta Televisor
Marta Teléfono
Tabla ProductosProveedores:
Producto Proveedor
Televisor Sony
Televisor LG
Teléfono Samsung
Tabla ClientesProveedores:
Cliente Proveedor
Juan Sony
Juan Samsung
Marta LG
Marta Samsung
Explicación:
Al descomponer la tabla original en tres tablas más pequeñas y hacer JOIN entre ellas, podemos reconstruir la tabla original sin redundancias. Esto asegura que la tabla cumple con la 5FN, eliminando cualquier posible dependencia de unión no trivial.
Resumen:
La Quinta Forma Normal (5FN) se asegura de que no existan dependencias de unión no triviales en una tabla. Esto es esencial para eliminar redundancias que pueden surgir en bases de datos complejas, especialmente cuando una relación entre atributos depende de otras relaciones en la tabla. La 5FN es menos común en la práctica, ya que la mayoría de las bases de datos bien diseñadas alcanzan su máxima eficiencia en 3FN o 4FN. Sin embargo, para bases de datos muy complejas, 5FN puede ser necesaria para garantizar la eliminación total de redundancias.
Que es SQL y versiones
SQL declarativo: Permite especificar qué se desea hacer con los datos sin preocuparse por los detalles de implementación.
Extensiones procedurales: Añaden la capacidad de definir el cómo realizar ciertas operaciones mediante lógica de programación más detallada, ofreciendo un control más fino sobre el comportamiento y el flujo de las operaciones en la base de datos. Imperativo.
Estándar:
Ansi-86
Ansi-92 - revisión grande, es el más conocido
ISO 9075 SQL:1999: SQL 3. Triggers
ISO 9075 SQL:2003: Objeto Sequence
ISO 9075 SQL:2006: XML Nativo
ISO 9075 SQL:2008: sentencia Truncate
ISO 9075 SQL:2016: Compatibilidad JSON
Productos SQL
Oracle
Microsoft SQL Server
Mysql / MariaDB
Informix
IBM Db2
PostgreeSQL
MaxDB
Hablame de SQLITE
No es un gestor de BD, es un formato de fichero
Es local, no se usa por red
Muy usado en android
Libreria (Acid compatible) permite realizar transacciones
Que es una transacción
Conjunto de sentencias SQL que se tienen que hacer todas o ninguna. Procesos atómicos
Que es ACID
Atomicidad Consistencia Aislamiento Durabilidad
Que lenguaje imperativo es desarrollado por microsoft y oracle?
transact SQL (T-SQL) y PL/SQL
Que son los sublenguajes DDL, DML y DCL
-Data definición languaje - > Creación / borrado / eliminación de objetos
-Data manimulation languaje -> Consulta / borrado / modificación / inserción de datos
-Data control languaje -> Control sobre permisos / transacciones
Que es una sequence en ddl?
En el contexto de DDL (Data Definition Language) en bases de datos, una sequence (o secuencia) es un objeto de base de datos que se utiliza para generar números únicos de forma secuencial. Las secuencias son comúnmente empleadas para crear valores únicos, como claves primarias, donde se requiere un identificador incremental.
DDL
CREATE
DROP
ALTER
TABLE/INDEX/VIEW/PROCEDURE/SEQUENCE/FUNCTION/TYPE (clase) /TRIGGER/DOMAIN (valores)/SCHEMA (nivel de agrupación)/ROLE (usuarios)
Que diferencia hay entre un procedure y una function?
La function siempre devuelve un valor
DML
SELECT (joins, agrupaciones, subconsultas)
UPDATE
INSERT
DELETE
MERGE
TRUNCATE ( no transaccional)
DCL
GRANT (dar permisos)
REVOKE (quitar permisos)
TCL: COMMIT/ROLLBACK (confirmar/deshacer transacción)
TCL: SAVEPOINT (para no deshacer todo) / RELEASE SAVEPOINT -> Guarda la partida antes del commit (puede haber varios savepoint pero un solo commit)
TCL: SET TRANSACTION / START TRANSACTION
para que sirve CAll?
para llamar a un procedimiento CALL procedurename
para que sirve RELEASE SAVEPOINT
Para borrar un SAVEPOINT
CREATE TABLE y restricciones
PRIMARY KEY
FOREIGN KEY - REFERENCES
UNIQUE
NOT NULL
CHECK
DEFAULT
PRIMARY KEY:
Asegura que cada fila en la tabla sea única y no nula. Una columna definida como PRIMARY KEY no puede contener valores duplicados ni NULL.
CREATE TABLE empleados (
empleado_id INT PRIMARY KEY,
nombre VARCHAR(50)
);
CREATE TABLE empleados (
empleado_id INT,
nombre VARCHAR(50),
CONSTRAINT pk_empleado_id PRIMARY KEY (empleado_id)
);
FOREIGN KEY:
Crea una relación entre dos tablas, asegurando que el valor de la columna en una tabla exista como clave primaria en otra tabla. Esto mantiene la integridad referencial.
CREATE TABLE pedidos (
pedido_id INT PRIMARY KEY,
empleado_id INT,
FOREIGN KEY (empleado_id) REFERENCES empleados(empleado_id)
);
CREATE TABLE pedidos (
pedido_id INT,
empleado_id INT,
CONSTRAINT pk_pedido_id PRIMARY KEY (pedido_id),
CONSTRAINT fk_empleado_id FOREIGN KEY (empleado_id) REFERENCES empleados(empleado_id)
);
UNIQUE:
Asegura que todos los valores en una columna o conjunto de columnas sean únicos en la tabla, pero a diferencia de la PRIMARY KEY, puede contener un valor NULL.
CREATE TABLE productos (
producto_id INT UNIQUE,
nombre VARCHAR(50)
);
CREATE TABLE productos (
producto_id INT,
nombre VARCHAR(50),
CONSTRAINT uq_producto_id UNIQUE (producto_id)
);
NOT NULL:
Impide que una columna almacene valores NULL. Es decir, obliga a que se proporcione un valor para esa columna en cada fila de la tabla.
CREATE TABLE clientes (
cliente_id INT PRIMARY KEY,
nombre VARCHAR(50) NOT NULL
);
CREATE TABLE clientes (
cliente_id INT,
nombre VARCHAR(50),
CONSTRAINT pk_cliente_id PRIMARY KEY (cliente_id),
CONSTRAINT nn_nombre NOT NULL (nombre)
);
CHECK:
Restringe los valores que se pueden ingresar en una columna según una condición específica.
CREATE TABLE empleados (
empleado_id INT PRIMARY KEY,
salario DECIMAL(10, 2) CHECK (salario > 0)
);
CREATE TABLE empleados (
empleado_id INT,
salario DECIMAL(10, 2),
CONSTRAINT pk_empleado_id PRIMARY KEY (empleado_id),
CONSTRAINT chk_salario CHECK (salario > 0)
);
DEFAULT:
Especifica un valor predeterminado para una columna si no se proporciona un valor al insertar una nueva fila.
CREATE TABLE productos (
producto_id INT PRIMARY KEY,
stock INT DEFAULT 0
);
CREATE TABLE productos (
producto_id INT,
stock INT,
CONSTRAINT pk_producto_id PRIMARY KEY (producto_id),
CONSTRAINT df_stock DEFAULT 0 FOR stock
);
Resumen:
Las constraints en SQL son herramientas poderosas para asegurar la integridad de los datos en una base de datos. Al definir restricciones como PRIMARY KEY, FOREIGN KEY, UNIQUE, NOT NULL, CHECK, y DEFAULT en el momento de crear una tabla, se establecen las reglas que los datos deben seguir, garantizando la coherencia y confiabilidad de la información almacenada.
Utilizar CONSTRAINT en SQL permite dar nombre explícito a cada restricción que se aplica en una tabla, lo que facilita la referencia y la gestión de estas restricciones a lo largo del tiempo. Esto es especialmente útil en proyectos grandes y colaborativos, donde la claridad y la organización son cruciales.
Uso de ALTER TABLE
El comando ALTER TABLE en SQL se utiliza para modificar una tabla existente en la base de datos. Puedes agregar, eliminar o modificar columnas, así como también modificar restricciones o el esquema de la tabla. Aquí te doy algunos ejemplos comunes de cómo usar ALTER TABLE:
ALTER TABLE empleados
ADD edad INT;
ALTER TABLE empleados
DROP COLUMN edad;
ALTER TABLE empleados
MODIFY nombre VARCHAR(100);
ALTER TABLE empleados
RENAME COLUMN nombre TO nombre_completo;
ALTER TABLE empleados
ADD CONSTRAINT un_email UNIQUE (email);
ALTER TABLE empleados
DROP CONSTRAINT un_email;
ALTER TABLE empleados
RENAME TO personal;
El comando ALTER TABLE es muy versátil y permite modificar la estructura de una tabla sin necesidad de eliminarla y recrearla. Esto es útil para realizar cambios en la base de datos sin interrumpir su funcionamiento.
Como se utiliza DEFAULT
Set Default Value (Establecer un valor predeterminado)
SET DEFAULT: Establece un valor predeterminado para una columna.
SET NOT NULL: Asegura que una columna no acepte valores nulos.
ALTER TABLE empleados
ALTER COLUMN salario SET DEFAULT 50000;
Set Not Null (Establecer una columna como NOT NULL)
ALTER TABLE empleados
ALTER COLUMN nombre SET NOT NULL;
Set Data Type (Cambiar el tipo de dato de una columna)
ALTER TABLE empleados
ALTER COLUMN salario TYPE DECIMAL(10, 2);
Como funciona GRANT y REVOKE
Los comandos GRANT y REVOKE en SQL se utilizan para gestionar permisos de acceso en una base de datos. GRANT otorga permisos a los usuarios para realizar ciertas acciones, mientras que REVOKE elimina esos permisos.
Ejemplo de GRANT
Supongamos que tienes una base de datos con una tabla llamada empleados, y quieres otorgar permisos de selección (lectura) a un usuario llamado usuario1.
GRANT SELECT ON empleados TO usuario1;
Explicación: Este comando permite al usuario1 ejecutar consultas SELECT en la tabla empleados
GRANT SELECT, INSERT, UPDATE ON empleados TO usuario1;
Explicación: Aquí, usuario1 puede seleccionar, insertar y actualizar registros en la tabla empleados.
Ejemplo de REVOKE
Si decides que ya no quieres que usuario1 tenga acceso de actualización a la tabla empleados, puedes revocar ese permiso:
REVOKE UPDATE ON empleados FROM usuario1;
Explicación: Este comando elimina el permiso de UPDATE para usuario1, pero el usuario aún podrá realizar operaciones SELECT e INSERT, ya que esos permisos no han sido revocados.
Si deseas revocar todos los permisos otorgados:
REVOKE ALL PRIVILEGES ON empleados FROM usuario1;
Explicación: Esto elimina todos los permisos que usuario1 tenía sobre la tabla empleados
GranTOT y revOOOke
GRANT <privilegios> ON objeto TO usuario/rol WITH GRANT
T O T</privilegios>
<privilegios>: SELECT, INSERT, UPDATE, DELETE, etc. También puede ser ALL para otorgar todos los privilegios posibles.
ON objeto: Define el objeto de la base de datos sobre el que se aplican los privilegios, como una tabla, vista, procedimiento almacenado, etc.
TO usuario/rol: Especifica a quién se están otorgando los privilegios. Puede ser un usuario específico o un rol que agrupe varios usuarios.
WITH GRANT OPTION: Permite al destinatario de los privilegios otorgarlos a otros usuarios o roles.
REVOKE <privilegio> ON objeto FROM usuario/rol
O O O
</privilegio></privilegios>
Para que sirve WITH GRANT OPTIONS?
Para que el usuario al que se le han dado permisos, pueda dar permisos a otros usuarios.
No más permisos de los que tiene el usuario, pero si podría dar menos.
Niveles de aislamiento tabla
Aislamient. | Lec. sucia | Lec. no repetible | Lec. Fantasma
Read uncommited SI SI SI
Read commited NO SI SI
Repeatable read NO NO SI
Serializable NO NO NO
Lectura Sucia (Dirty Read)
Ocurre cuando una transacción lee datos que han sido modificados por otra transacción, pero que aún no han sido confirmados. Commit
Escenario: Supongamos que tenemos dos transacciones, A y B, que operan sobre una tabla cuentas.
Transacción A: Actualiza el saldo de una cuenta de 1000 a 500 pero no hace commit aún.
BEGIN TRANSACTION;
UPDATE cuentas SET saldo = 500 WHERE cuenta_id = 1;
– No hace COMMIT todavía
Transacción B: Lee el saldo de esa cuenta antes de que la transacción A confirme los cambios.
SELECT saldo FROM cuentas WHERE cuenta_id = 1;
– Obtiene un saldo de 500 (lectura sucia)
Transacción A: Decide hacer un rollback.
ROLLBACK;
En este caso, Transacción B ha leído un saldo incorrecto (500), porque A hizo un rollback, y el saldo real sigue siendo 1000. Esta es una lectura sucia.
Lectura Sucia: Lees datos modificados pero no confirmados.
Lectura No Repetible (Non-Repeatable Read)
Ocurre cuando una transacción vuelve a leer un dato y obtiene un valor diferente porque otra transacción ha modificado y confirmado ese dato entre las dos lecturas
Escenario: Tenemos dos transacciones, A y B, que operan sobre una tabla clientes.
Transacción A: Lee el nombre de un cliente.
BEGIN TRANSACTION;
SELECT nombre FROM clientes WHERE cliente_id = 1;
– Obtiene ‘Juan’
Transacción B: Actualiza el nombre de ese cliente y hace commit.
BEGIN TRANSACTION;
UPDATE clientes SET nombre = ‘Carlos’ WHERE cliente_id = 1;
COMMIT;
Transacción A: Vuelve a leer el nombre del cliente dentro de la misma transacción.
SELECT nombre FROM clientes WHERE cliente_id = 1;
– Obtiene ‘Carlos’ (lectura no repetible)
En este caso, Transacción A ha leído dos valores diferentes para el mismo cliente durante la misma transacción. Esto es una lectura no repetible
Lectura No Repetible: Lees datos que cambian después de una confirmación mientras tu transacción aún está en curso.
Lectura Fantasma (Phantom Read)
Ocurre cuando una transacción ejecuta la misma consulta dos veces y obtiene un conjunto de resultados diferente debido a la inserción, actualización, o eliminación de filas por otra transacción.
Escenario: Tenemos dos transacciones, A y B, que operan sobre una tabla pedidos.
Transacción A: Selecciona todos los pedidos realizados por el cliente con cliente_id = 1.
BEGIN TRANSACTION;
SELECT * FROM pedidos WHERE cliente_id = 1;
– Obtiene 2 pedidos
Transacción B: Inserta un nuevo pedido para el cliente cliente_id = 1 y hace commit.
BEGIN TRANSACTION;
INSERT INTO pedidos (cliente_id, producto) VALUES (1, ‘ProductoX’);
COMMIT;
Transacción A: Vuelve a ejecutar la misma consulta dentro de la misma transacción.
SELECT * FROM pedidos WHERE cliente_id = 1;
– Obtiene 3 pedidos (lectura fantasma)
En este caso, Transacción A ve un “fantasma” (un nuevo pedido) que apareció entre las dos ejecuciones de la misma consulta debido a la inserción de Transacción B. Esto es una lectura fantasma.
Lectura Fantasma: Lees un conjunto de resultados y luego ves nuevas filas insertadas por otra transacción cuando vuelves a leer.
SQL Para insertar datos en una tabla y también insertarlos leyendolos de otra tabla
INSERT INTO tabla (CAMPO1, CAMPO2)
VALUES (‘valor 1’, ‘valor 2’);
INSERT INTO tabla (CAMPO1, CAMPO2)
SELECT CAMPO1, CAMPO2
FROM tabla2;
SQL para actualizar datos de una tabla
UPDATE nombretabla1 set CAMPO1=’valor1’, CAMPO2=’valor2’ WHERE ID=1
SQL para eliminar datos de una tabla
DELETE FROM nombretabla where ID=1
Para que sirve DISTINCT
El comando DISTINCT en SQL elimina filas duplicadas de los resultados de una consulta, mostrando solo combinaciones únicas de los valores seleccionados en las columnas.
OJO NO AFECTA SOLO A UN CAMPO, AFECTA A TODOS
1 Ana Ventas 50000
2 Luis Ventas 60000
3 Ana IT 50000
4 Marta IT 70000
5 Luis Ventas 60000 «_space;duplicado
6 Ana Ventas 50000 «_space;duplicado
SELECT DISTINCT nombre, departamento, salario
FROM empleados;
Ana Ventas 50000
Luis Ventas 60000
Ana IT 50000
Marta IT 70000
Cuales son las funciones de agregado en SQL y como se usan?
Las funciones de agregado en SQL se utilizan para realizar cálculos en un conjunto de valores y devolver un solo valor. Estas funciones son comúnmente utilizadas junto con GROUP BY en consultas para agrupar los resultados por una o más columnas.
Principales funciones de agregado en SQL:
COUNT():
Cuenta el número de filas que coinciden con una condición.
Ejemplo: SELECT COUNT(*) FROM empleados; (Cuenta todas las filas en la tabla empleados).
SUM():
Suma los valores numéricos de una columna.
Ejemplo: SELECT SUM(salario) FROM empleados; (Suma los salarios de todos los empleados).
AVG():
Calcula el valor promedio de una columna numérica.
Ejemplo: SELECT AVG(salario) FROM empleados; (Calcula el salario promedio de los empleados).
MIN():
Devuelve el valor mínimo de una columna.
Ejemplo: SELECT MIN(salario) FROM empleados; (Encuentra el salario más bajo en la tabla empleados).
MAX():
Devuelve el valor máximo de una columna.
Ejemplo: SELECT MAX(salario) FROM empleados; (Encuentra el salario más alto en la tabla empleados).
GROUP_CONCAT() (o similar según el RDBMS):
Combina los valores de una columna en una cadena, separados por comas u otro delimitador.
Ejemplo: SELECT GROUP_CONCAT(nombre) FROM empleados; (Concatena todos los nombres de los empleados en una cadena).
SELECT departamento, COUNT(*), AVG(salario), MAX(salario)
FROM empleados
GROUP BY departamento;
Este ejemplo cuenta el número de empleados, calcula el salario promedio y encuentra el salario máximo para cada departamento
Como se usa having y where en sql?
Queremos agrupar las ventas por producto, pero solo queremos incluir aquellas ventas donde la cantidad es mayor que 10 (usando WHERE) y luego filtrar los grupos para mostrar solo aquellos productos cuyo total de ventas es mayor que 50 (usando HAVING).
SELECT producto, SUM(cantidad) AS total_cantidad
FROM ventas
WHERE cantidad > 10
GROUP BY producto
HAVING SUM(cantidad) > 50;
Explicación:
WHERE cantidad > 10: Filtra las filas antes del agrupamiento para incluir solo aquellas ventas donde la cantidad es mayor que 10.
GROUP BY producto: Agrupa las filas por producto.
HAVING SUM(cantidad) > 50: Después de agrupar, filtra los grupos para mostrar solo aquellos productos cuya suma total de cantidad vendida es mayor que 50.
Ejemplo en un escenario real:
Imagina: Tienes una tienda y deseas analizar las ventas de productos. Primero, filtras para ver solo aquellas ventas que tienen más de 10 unidades por transacción (con WHERE). Luego, agrupas las ventas por producto y decides mostrar solo aquellos productos que han vendido más de 50 unidades en total (con HAVING).
Cual es el orden en la sintaxis de SQL where order having, etc?
SEL-FROM-JOIN-WHE-GRO-HA-OR-7
SELECT FROM JOIN WHERE GROUP HAVING ORDER
Si tengo una tabla proveedores con idproveedor y una tabla productos con idproducto e idproveedor y queremos hacer dos consultas con subquery. La primera que muestre un listado de productos con proveedor y la segunda un listado de productos si nproveedor, como se haría?
Listado de productos con proveedor:
SELECT *
FROM productos
WHERE idproveedor IN (
SELECT idproveedor
FROM proveedores
);
Listado de productos sin proveedor:
SELECT *
FROM productos
WHERE idproveedor NOT IN (
SELECT idproveedor
FROM proveedores where idproveedor is not null
);
ojo con el is not null ya que si es nulo puede dar problemas.
Tengo una tabla proveedores con idproveedor y una tabla productos con idproducto e idproveedor. Queremos saber si alguno de los proveedores existe en la tabla productos. Como sería la query con exists?
Para saber si alguno de los proveedores de la tabla proveedores existe en la tabla productos utilizando EXISTS, puedes utilizar la siguiente consulta:
SELECT *
FROM proveedores
WHERE EXISTS (
SELECT 1
FROM productos
WHERE productos.idproveedor = proveedores.idproveedor
);
EXISTS: Esta cláusula se utiliza para verificar si la subconsulta devuelve alguna fila. Si la subconsulta devuelve al menos una fila, EXISTS será verdadera.
Subconsulta:
(SELECT 1 FROM productos WHERE productos.idproveedor = proveedores.idproveedor) busca si el idproveedor de la tabla proveedores está presente en la tabla productos.
No es necesario seleccionar una columna en particular, por eso se usa SELECT 1.
Resultado: La consulta devolverá todos los proveedores que tienen al menos un producto asociado en la tabla productos.
Tengo una tabla proveedores con idproveedor y una tabla productos con idproducto e idproveedor. Queremos saber si alguno de los proveedores existe en la tabla productos. Como sería la query con any/some?
SELECT *
FROM proveedores
WHERE idproveedor = ANY (
SELECT idproveedor
FROM productos
);
SELECT *
FROM proveedores
WHERE idproveedor = SOME (
SELECT idproveedor
FROM productos
);
ANY: Esta cláusula comprueba si el idproveedor de la tabla proveedores coincide con cualquiera de los valores de idproveedor devueltos por la subconsulta.
Subconsulta: (SELECT idproveedor FROM productos) selecciona todos los idproveedor de la tabla productos.
Si el idproveedor de un proveedor coincide con alguno de los valores devueltos por la subconsulta, el proveedor será listado.
Este enfoque te permitirá ver todos los proveedores que tienen productos en la tabla productos.
Tengo una tabla proveedores con idproveedor y una tabla productos con idproducto e idproveedor. Queremos saber todos los proveedores existe en la tabla productos. Como sería la query con all?
SELECT *
FROM proveedores
WHERE idproveedor = ALL (
SELECT idproveedor
FROM productos
);
ALL: Este operador compara cada idproveedor en la tabla proveedores con todos los idproveedor de la subconsulta.
Este enfoque requeriría que el idproveedor en la tabla proveedores coincidiera con todos los valores devueltos por la subconsulta, lo cual no tiene mucho sentido en este caso, porque un proveedor solo tendría que coincidir con sí mismo, no con todos los demás.
tengo una tabla productos con idproducto y precio. Usando subconsulta, quiero saber cual es el precio más alto
SELECT * FROM productos
WHERE precio = (SELECT MAX(precio) FROM productos);
Subconsulta: (SELECT MAX(precio) FROM productos) obtiene el valor del precio más alto de la tabla productos.
Consulta Principal: La consulta principal selecciona todas las filas de la tabla productos donde el precio sea igual al resultado de la subconsulta, es decir, el precio más alto.
Esta consulta devolverá la fila (o filas) con el precio más alto en la tabla productos.
SELECT *
FROM productos
WHERE precio >= ALL (
SELECT precio
FROM productos
);
ALL: Este operador compara el precio de cada fila con todos los precios de la subconsulta.
La condición precio >= ALL (SELECT precio FROM productos) verifica si el precio es mayor o igual a todos los demás precios en la tabla. Si esto es cierto, entonces ese precio es el más alto.
Esta consulta devolverá la fila (o filas) que tienen el precio más alto en la tabla productos, utilizando el operador ALL.
CROSS JOIN Como funciona?
Un CROSS JOIN en SQL produce el producto cartesiano de dos tablas. Es decir, combina cada fila de la primera tabla con cada fila de la segunda tabla. Este tipo de join no requiere ninguna condición y puede generar un número muy grande de resultados si ambas tablas tienen muchas filas.
Tabla empleados:
id_empleado nombre
1 Ana
2 Luis
Tabla departamentos:
id_departamento nombre_departamento
101 Ventas
102 IT
Consulta con CROSS JOIN:
SELECT e.nombre, d.nombre_departamento
FROM empleados e
CROSS JOIN departamentos d;
nombre nombre_departamento
Ana Ventas
Ana IT
Luis Ventas
Luis IT
Explicación:
Cada fila de la tabla empleados se combina con cada fila de la tabla departamentos.
En este ejemplo, Ana se combina con Ventas e IT, y Luis también se combina con Ventas e IT, dando lugar a 4 filas en total.
Un CROSS JOIN es útil cuando necesitas combinar todas las posibles combinaciones de dos conjuntos de datos.
Si la Tabla A tiene 5 registros y 2 campos y la Tabla B tiene 2 registros y 3 campos, ¿Cuantos registros tendrá el resultado si hacemos CROSS JOIN?. Dame un ejemplo con datos
Si la tabla A tiene 5 registros y 2 campos, y la tabla B tiene 2 registros y 3 campos, al hacer un CROSS JOIN, el número total de registros en el resultado será el PRODUCTO del número de registros en ambas tablas.
Cálculo:
Tabla A: 5 registros
Tabla B: 2 registros
El número total de registros en el resultado será:
5 (registros en A) * 2 (registros en B) = 10 registros.
Ejemplo con datos:
Tabla A (5 registros, 2 campos):
id_a nombre_a
1 Ana
2 Luis
3 Marta
4 Juan
5 Carla
Tabla B (2 registros, 3 campos):
id_b nombre_b ciudad
101 Empresa1 Madrid
102 Empresa2 Barcelona
Consulta con CROSS JOIN:
SELECT *
FROM A
CROSS JOIN B;
Resultado (10 registros):
id_a nombre_a id_b nombre_b ciudad
1 Ana 101 Empresa1 Madrid
1 Ana 102 Empresa2 Barcelona
2 Luis 101 Empresa1 Madrid
2 Luis 102 Empresa2 Barcelona
3 Marta 101 Empresa1 Madrid
3 Marta 102 Empresa2 Barcelona
4 Juan 101 Empresa1 Madrid
4 Juan 102 Empresa2 Barcelona
5 Carla 101 Empresa1 Madrid
5 Carla 102 Empresa2 Barcelona
Explicación:
Cada fila de la tabla A se combina con cada fila de la tabla B, produciendo 10 registros en total.
El CROSS JOIN no requiere una condición de unión y simplemente empareja cada fila de la tabla A con cada fila de la tabla B.
CROSS JOIN SIN WHERE Y CON WHERE
Cuando ejecutas un CROSS JOIN sin una cláusula WHERE, obtienes el producto cartesiano de ambas tablas. Esto significa que cada fila de la tabla libro se combina con cada fila de la tabla autor, generando todas las posibles combinaciones.
Resultado de CROSS JOIN sin WHERE:
SELECT libro.titulo, autor.nombre
FROM libro
CROSS JOIN autor;
Resultado (producto cartesiano):
titulo nombre
El Quijote Cervantes
El Quijote García Márquez
El Quijote Cela
Cien Años Cervantes
Cien Años García Márquez
Cien Años Cela
La Colmena Cervantes
La Colmena García Márquez
La Colmena Cela
Con la cláusula WHERE (filtrando el CROSS JOIN):
Cuando agregas la cláusula WHERE libro.dniautor = autor.dni, se eliminan las combinaciones que no cumplen la condición, dejando solo las combinaciones correctas donde el dniautor en la tabla libro coincide con el dni en la tabla autor.
SELECT libro.titulo, autor.nombre
FROM libro
CROSS JOIN autor
WHERE libro.dniautor = autor.dni;
Resultado filtrado con WHERE:
titulo nombre
El Quijote Cervantes
Cien Años García Márquez
La Colmena Cela
Comparación:
Sin WHERE: Obtenemos todas las combinaciones posibles entre las tablas libro y autor, resultando en 9 combinaciones (3 libros x 3 autores).
Con WHERE: El producto cartesiano se filtra para mostrar solo las combinaciones donde los dni coinciden entre las dos tablas, reduciendo el resultado a 3 combinaciones correctas (una por cada libro con su autor correspondiente).
Esta comparación muestra cómo el uso de la cláusula WHERE reduce el número de filas a solo aquellas que satisfacen la condición, haciendo que el CROSS JOIN actúe como un INNER JOIN.
CROSS JOIN IMPLÍCITO VS EXPLÍCITO
IMPLÍCITO: Con coma (,):
SELECT libro.titulo, autor.nombre FROM libro, autor;
EXPLÍCITO: Con CROSS JOIN:
SELECT libro.titulo, autor.nombre FROM libro CROSS JOIN autor;
Ambas consultas producen el mismo resultado, que es el producto cartesiano de las dos tablas. En ambos casos, cada fila de la tabla libro se combina con cada fila de la tabla autor, generando todas las combinaciones posibles entre las dos tablas.
Como funciona un inner join, ejemplo de select de NombreEmpleado (tabla empleados) y Departamento (tabla departamentos) cruzando por id_empleado
Un INNER JOIN es una manera de combinar datos de dos tablas en SQL, devolviendo solo las filas donde haya coincidencias en ambas tablas.
Tabla empleados:
id_empleado
NombreEmpleado
id_departamento
Tabla departamentos:
id_departamento
Departamento
Obtener el nombre del empleado y el nombre del departamento donde trabaja.
SELECT empleados.NombreEmpleado, departamentos.Departamento
FROM empleados
INNER JOIN departamentos ON empleados.id_departamento = departamentos.id_departamento;
INNER JOIN: Combina las dos tablas.
ON empleados.id_departamento = departamentos.id_departamento: Relaciona las filas de ambas tablas usando la columna id_departamento.
Resultado: Muestra el nombre del empleado y su departamento, pero solo para las coincidencias en ambas tablas.
Si no hay coincidencia, esa fila no se mostrará.
Como funciona un left join (o left outer join), ejemplo de select de NombreEmpleado (tabla empleados) y Departamento (tabla departamentos) cruzando por id_emplead
Si añades un LEFT OUTER JOIN al ejemplo, la consulta cambiaría ligeramente. El LEFT OUTER JOIN devuelve todas las filas de la tabla de la izquierda (en este caso, la tabla empleados), incluso si no hay coincidencias en la tabla de la derecha (en este caso, la tabla departamentos). Si no hay coincidencia, los valores de la tabla derecha aparecerán como NULL.
El término OUTER es opcional. Al escribir LEFT JOIN, el sistema asume automáticamente que es un LEFT OUTER JOIN.
SELECT empleados.NombreEmpleado, departamentos.Departamento
FROM empleados
LEFT JOIN departamentos ON empleados.id_departamento = departamentos.id_departamento;
Explicación:
LEFT JOIN: Este tipo de unión selecciona todas las filas de la tabla empleados (tabla de la izquierda), independientemente de si tienen coincidencias en la tabla departamentos (tabla de la derecha).
Resultado: Si un empleado no tiene un departamento asociado en la tabla departamentos, el campo Departamento será NULL en los resultados.
Comparación con INNER JOIN:
INNER JOIN: Solo devuelve las filas que tienen coincidencias en ambas tablas.
LEFT JOIN (o LEFT OUTER JOIN): Devuelve todas las filas de la tabla de la izquierda (empleados), y las filas de la tabla derecha (departamentos) solo si hay coincidencias. Si no hay coincidencias, muestra NULL en los campos de la tabla derecha.
Ejemplo visual:
NombreEmpleado Departamento
Juan Finanzas
María Ventas
Pedro NULL
En este ejemplo, Pedro no tiene un departamento asociado, pero con un LEFT JOIN, aún aparece en los resultados, con el campo Departamento como NULL.
RIGHT JOIN ES IGUAL PERO MUESTRA LAS DE LA OTRA TABLA (DERECHA)
Como funciona Full outer join?
un FULL OUTER JOIN en SQL combina los resultados de un LEFT JOIN y un RIGHT JOIN. Esto significa que devuelve todas las filas cuando hay una coincidencia en una de las tablas. Si no hay coincidencia, las filas no coincidentes también se incluirán con valores NULL en las columnas de la tabla que no tiene coincidencia.
Clientes:
ClienteID Nombre
1 Juan
2 María
3 Pedro
Pedidos:
PedidoID ClienteID Producto
101 1 ProductoA
102 2 ProductoB
103 4 ProductoC
Si realizamos un FULL OUTER JOIN en estas tablas basándonos en ClienteID, el resultado sería:
SELECT Clientes.ClienteID, Nombre, PedidoID, Producto
FROM Clientes
FULL OUTER JOIN Pedidos
ON Clientes.ClienteID = Pedidos.ClienteID;
Resultado:
Tabla
ClienteID Nombre PedidoID Producto
1 Juan 101 ProductoA
2 María 102 ProductoB
3 Pedro NULL NULL
NULL NULL 103 ProductoC
En este resultado, puedes ver que:
Juan y María tienen pedidos correspondientes.
Pedro no tiene pedidos, por lo que los valores de PedidoID y Producto son NULL.
El pedido 103 no tiene un cliente correspondiente, por lo que los valores de ClienteID y Nombre son NULL.
Para que sirve UNION Y UNION ALL
SELECT Nombre FROM Empleados
UNION
SELECT Nombre FROM ExEmpleados;
Muestra todos los registros de Empleados y de ExEmpleados ELIMINANDO REPETIDOS!!!
SELECT Nombre FROM Empleados
UNION ALL
SELECT Nombre FROM ExEmpleados;
UNION ALL NO ELIMINA REPETIDOS!!!
Cómo funciona MERGE en SQL?
Se utiliza para realizar operaciones de inserción, actualización o eliminación de datos en una tabla, todo en una única sentencia.
Combina la lógica de las sentencias INSERT, UPDATE y DELETE dependiendo de si ya existe o no una coincidencia en los datos. Esto es útil cuando necesitas sincronizar dos tablas o actualizar datos con condiciones específicas.
Explicación Sencilla
Imagina que tienes dos tablas: una llamada clientes_actual (que contiene la información actual de tus clientes) y otra llamada clientes_nuevos (que contiene nuevos datos que podrían actualizar o añadir a la tabla actual).
Si un cliente de la tabla clientes_nuevos ya existe en la tabla clientes_actual, queremos actualizar su información.
Si un cliente de la tabla clientes_nuevos no existe en la tabla clientes_actual, queremos insertarlo como un nuevo registro.
Sintaxis Básica de MERGE
MERGE INTO tabla_destino USING tabla_fuente
ON condición_de_coincidencia
WHEN MATCHED THEN
– Aquí va la acción si hay coincidencia (UPDATE o DELETE)
WHEN NOT MATCHED THEN
– Aquí va la acción si no hay coincidencia (INSERT)
Ejemplo Práctico
Supongamos que queremos actualizar o insertar clientes en la tabla clientes_actual usando datos de la tabla clientes_nuevos.
MERGE INTO clientes_actual AS c
USING clientes_nuevos AS n
ON c.id_cliente = n.id_cliente
WHEN MATCHED THEN
UPDATE SET
c.nombre = n.nombre,
c.email = n.email,
c.telefono = n.telefono
WHEN NOT MATCHED THEN
INSERT (id_cliente, nombre, email, telefono)
VALUES (n.id_cliente, n.nombre, n.email, n.telefono);
Explicación del Ejemplo
MERGE INTO clientes_actual: Indica que la tabla donde se aplicarán los cambios es clientes_actual.
USING clientes_nuevos: La tabla que contiene los datos nuevos que queremos comparar es clientes_nuevos.
ON c.id_cliente = n.id_cliente: Esta es la condición de coincidencia, donde comparamos los registros de ambas tablas en función del campo id_cliente.
WHEN MATCHED THEN: Si se encuentra una coincidencia (es decir, si el cliente ya existe en clientes_actual), se ejecuta la acción de actualización (UPDATE).
WHEN NOT MATCHED THEN: Si no se encuentra una coincidencia (es decir, si el cliente no existe en clientes_actual), se ejecuta la acción de inserción (INSERT).
Triggers
Se lanzan cuando se detectan eventos en la base de datos (filas borradas, añadidas, etc) en un objeto. Después de que se complete la operación que activó el trigger (INSERT, UPDATE o DELETE).
No aceptan parámetros
No pueden usar transacciones
Los hay de fila y de sentencia:
-Un trigger de fila: se ejecuta una vez por cada fila afectada.
-Un trigger de sentencia se ejecuta una sola vez por toda la operación, independientemente del número de filas afectadas.
Un trigger de fila se ejecutaría cada vez que se inserta una fila en la tabla de empleados para registrar el historial de cada nuevo empleado. Si hay 10 filas, se ejecuta 10 veces.
Un trigger de sentencia se ejecutaría una sola vez cuando se inserta un grupo de nuevos empleados para registrar la operación en un log. Si hay 10 filas se ejecuta una vez.
Triggers eventos
Cuándo se ejecuta: Después de que se complete la operación que activó el trigger (INSERT, UPDATE o DELETE).
BEFORE: Se ejecuta antes de la operación. Ideal para validaciones y modificaciones previas a la inserción o actualización de datos.
CREATE TRIGGER trigger_name
BEFORE INSERT ON table_name
FOR EACH ROW
BEGIN
– Código que se ejecuta antes de la operación INSERT
END;
AFTER: Se ejecuta después de la operación. Útil para acciones posteriores, como auditorías o actualizaciones en otras tablas.
CREATE TRIGGER trigger_name
AFTER UPDATE ON table_name
FOR EACH ROW
BEGIN
– Código que se ejecuta después de la operación UPDATE
END;
INSTEAD OF: Se ejecuta en lugar de la operación. Principalmente usado en vistas para controlar operaciones que de otra manera no se permitirían.
CREATE TRIGGER trigger_name
INSTEAD OF DELETE ON view_name
FOR EACH ROW
BEGIN
– Código que se ejecuta en lugar de la operación DELETE
END;
INSTEAD OF
Si tenemos una consulta que hace update de 100 filas y tenemos este trigger:
INSTEAD OF UPDATE ON view_name
FOR EACH ROW
BEGIN
– CODIGO DE INSERCIÓN
END;
Se ejecutará el código de inserción en lugar de hacer la actualización original.