[go: up one dir, main page]

0% encontró este documento útil (0 votos)
17 vistas65 páginas

Python y SQL - Resumen

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
17 vistas65 páginas

Python y SQL - Resumen

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 65

‭ undamentos Esenciales de Python y Bases de Datos SQL:‬

F
‭Una Guía Práctica‬

‭Introducción‬

‭ ste informe sirve como una guía fundamental para estudiantes y desarrolladores‬
E
‭aspirantes que buscan dominar conceptos esenciales en la programación Python y la‬
‭gestión de bases de datos SQL. Su propósito es tender un puente entre la‬
‭comprensión teórica y la aplicación práctica, ofreciendo definiciones claras, ejemplos‬
‭ilustrativos y ejercicios prácticos. El documento cubre meticulosamente las‬
‭estructuras de datos centrales de Python, como las listas unidimensionales y los‬
‭diccionarios, así como los mecanismos de flujo de control, incluyendo ciclos y‬
‭sentencias condicionales. Paralelamente, se abordan los principios fundamentales de‬
‭las bases de datos, abarcando el diseño, la normalización y los comandos SQL‬
‭prácticos para la definición, manipulación y consulta de datos. El objetivo es equipar a‬
‭los estudiantes con las habilidades necesarias para escribir código Python eficiente e‬
‭interactuar eficazmente con bases de datos relacionales, sentando una base sólida‬
‭para temas más avanzados en el desarrollo de software y la ciencia de datos.‬

‭Parte I: Fundamentos de Python‬

‭1. Listas Unidimensionales en Python‬

‭ as listas en Python son estructuras de datos increíblemente versátiles y‬


L
‭fundamentales que permiten almacenar múltiples elementos bajo una única variable.‬
‭ diferencia de los arrays estáticos que se encuentran en otros lenguajes de‬
A
‭programación, las listas de Python son inherentemente dinámicas en tamaño, lo que‬
‭significa que pueden expandirse o contraerse automáticamente según sea necesario.‬
‭Una característica distintiva de las listas de Python es su flexibilidad para contener‬
‭elementos de diferentes tipos de datos dentro de la misma colección, como enteros,‬
‭cadenas de texto, números de punto flotante e incluso otras listas.‬‭1‬ ‭Esta‬
‭heterogeneidad es posible porque las listas almacenan principalmente referencias a‬
‭los objetos en ubicaciones de memoria contiguas, mientras que los objetos reales‬
‭pueden residir en cualquier parte de la memoria.‬

‭ as listas son estructuras de datos‬‭mutables‬‭, lo que implica que sus elementos‬


L
‭pueden ser modificados, añadidos o eliminados después de su creación. Además,‬
‭mantienen un‬‭orden‬‭de inserción, y sus elementos son accesibles a través de un‬
‭sistema de‬‭indexación‬‭basado en cero, donde el primer elemento se encuentra en el‬
‭índice 0.‬‭2‬

‭ a elección de la estructura de datos adecuada es un aspecto crítico en el diseño de‬


L
‭software. Es importante diferenciar entre las listas nativas de Python y los arrays de‬
‭NumPy, a menudo mencionados en el contexto de "arrays unidimensionales". Aunque‬
‭ambos pueden representar secuencias, los arrays de NumPy imponen una restricción‬
‭fundamental: todos sus elementos deben ser del mismo tipo de dato, y su tamaño es‬
‭fijo una vez creados.‬‭4‬ ‭Esta rigidez se traduce en beneficios de rendimiento‬
‭significativos para operaciones numéricas y matemáticas a gran escala. En contraste,‬
‭las listas de Python priorizan la flexibilidad y la facilidad de uso para la colección de‬
‭datos de propósito general. Esta distinción subraya una decisión de diseño basada en‬
‭el caso de uso: las listas de Python son ideales para la gestión general de colecciones‬
‭de datos diversas, mientras que los arrays de NumPy son la opción superior para‬
‭computación numérica de alto rendimiento, lo que aclara por qué el término "lista‬
‭unidimensional" puede referirse a conceptos diferentes dependiendo del contexto.‬

‭1.2. Creación y Acceso‬

‭ a creación de listas en Python es un proceso sencillo. Comúnmente, se construyen‬


L
‭encerrando una secuencia de elementos separados por comas dentro de corchetes .‬
‭Para inicializar una lista vacía, se pueden usar simplemente o el constructor list().‬‭2‬
‭Python‬

‭# Creación de una lista vacía‬


‭ y_empty_list =‬
m
‭another_empty_list =‬‭list‬‭()‬

‭# Creación de una lista con elementos‬


f‭ ruits = [‬‭'apple'‬‭,‬‭'banana'‬‭,‬‭'orange'‬‭]‬
‭mixed_list =‬

‭ l acceso a los elementos de una lista se realiza utilizando su posición indexada‬


E
‭dentro de corchetes ``. Python emplea una indexación basada en cero, donde el‬
‭primer elemento corresponde al índice 0. Además, la indexación negativa permite‬
‭acceder a los elementos desde el final de la lista, siendo lista[-1] el último elemento. El‬
‭slicing‬‭, que utiliza el operador de dos puntos [:],‬‭facilita la extracción de un rango de‬
‭elementos de la lista.‬‭2‬

‭Python‬

l‭anguages =‬
‭print(languages)‬ ‭# Acceso al primer elemento: 'Python'‬
‭print(languages)‬ ‭# Acceso al tercer elemento: 'C++'‬
‭print(languages[-‬‭1‬‭])‬ ‭# Acceso al último elemento:‬‭'C++'‬

‭ y_list = [‬‭'p'‬‭,‬‭'r'‬‭,‬‭'o'‬‭,‬‭'g'‬‭,‬‭'r'‬‭,‬‭'a'‬‭,‬‭'m'‬‭]‬
m
‭print(my_list[‬‭2‬‭:‬‭5‭]‬ )‬ ‭# Slicing: ['o', 'g', 'r']‬
‭print(my_list[‬‭5‬‭:])‬ ‭# Desde el índice 5 hasta el‬‭final: ['a', 'm']‬
‭print(my_list[: -‬‭4‬‭])‬ ‭# Desde el inicio hasta el‬‭cuarto elemento desde el final: ['p', 'r', 'o']‬

‭ unque los arrays de NumPy ofrecen funciones como arange() y linspace() para‬
A
‭generar secuencias numéricas‬‭1‬‭, la función‬

r‭ ange() nativa de Python es la forma idiomática y más eficiente en memoria para‬


‭generar secuencias de números destinadas a listas o bucles en un contexto de‬
‭ rogramación Python general. Esta distinción subraya la diferencia entre las‬
p
‭capacidades de propósito general de Python y las bibliotecas especializadas para‬
‭computación numérica. Para los principiantes, comprender que range() es la‬
‭herramienta principal para secuencias numéricas en Python es fundamental para‬
‭escribir código Pythonico, a menos que se requieran las optimizaciones específicas‬
‭que ofrecen los arrays de NumPy.‬

‭1.3. Modificación y Métodos Comunes‬

‭ na de las propiedades más poderosas de las listas de Python es su mutabilidad, lo‬


U
‭que permite modificar sus elementos directamente mediante la asignación a un índice‬
‭específico.‬‭3‬

‭Python‬

‭ olors =‬
c
‭colors =‬‭'Purple'‬‭# Cambia el primer elemento‬
‭colors =‬‭'Blue'‬ ‭# Cambia el tercer elemento‬
‭print(colors)‬‭# Output:‬

‭Las listas de Python ofrecen una rica colección de métodos para su manipulación:‬
‭●‬ ‭append(item): Añade un único elemento al final de la lista.‬‭2‬
‭●‬ ‭extend(iterable): Incorpora múltiples elementos de un iterable (como otra lista o‬
‭ na tupla) al final de la lista existente.‬‭2‬
u
‭●‬ ‭insert(index, item): Inserta un elemento en una posición específica, desplazando‬
‭los elementos existentes.‬‭2‬
‭●‬ ‭remove(value): Elimina la primera ocurrencia de un valor especificado. Si el valor‬
‭no se encuentra, genera un error.‬‭2‬
‭●‬ ‭pop(index): Elimina y devuelve el elemento en un índice dado. Si no se especifica‬
‭un índice, elimina y devuelve el último elemento.‬‭2‬
‭●‬ ‭clear(): Elimina todos los elementos de la lista, dejándola vacía.‬‭3‬
‭●‬ ‭sort(): Ordena la lista en su lugar (modifica la lista original), por defecto en orden‬
‭ascendente. Permite ordenar según criterios personalizados.‬‭2‬
‭●‬ ‭reverse(): Invierte el orden de los elementos de la lista en su lugar.‬‭2‬
‭●‬ ‭copy(): Retorna una copia superficial (shallow copy) de la lista.‬

‭ demás de los métodos, varias funciones incorporadas de Python son compatibles‬


A
‭con las listas:‬
‭●‬ ‭len(list): Devuelve el número de elementos en la lista.‬‭2‬
‭●‬ ‭min(list): Retorna el elemento más pequeño de la lista.‬‭2‬
‭●‬ ‭max(list): Retorna el elemento más grande de la lista.‬‭2‬
‭●‬ ‭sum(list): Calcula la suma de todos los elementos numéricos en la lista.‬
‭●‬ ‭sorted(iterable): Retorna una nueva lista ordenada a partir de un iterable, sin‬
‭ odificar la lista original. Esto es útil cuando se necesita una versión ordenada sin‬
m
‭alterar la secuencia original.‬
‭ ‬ ‭enumerate(iterable): Retorna un objeto enumerate que produce pares de (índice,‬

‭valor) para cada elemento del iterable. Es especialmente útil para iterar sobre una‬
‭lista y acceder tanto al elemento como a su posición.‬‭2‬
‭●‬ ‭zip(iterable1, iterable2,...): Crea un iterador que agrega elementos de múltiples‬
‭iterables en tuplas. La i-ésima tupla contiene el i-ésimo elemento de cada uno de‬
‭los iterables de entrada.‬

‭ a mutabilidad de las listas tiene implicaciones significativas, especialmente cuando‬


L
‭se pasan listas a funciones o se crean copias. Una copia superficial (obtenida con‬
‭list.copy() o [:]) de una lista que contiene objetos mutables anidados (como otras‬
‭listas o diccionarios) significa que solo se copia la referencia a esos objetos anidados.‬
‭Por lo tanto, cualquier modificación realizada en los objetos mutables anidados en la‬
‭copia se reflejará también en la lista original.‬‭8‬ ‭Este comportamiento es una fuente‬
‭común de errores para los programadores principiantes, ya que puede conducir a‬
‭efectos secundarios inesperados y a la corrupción de datos si no se comprende y‬
‭gestiona adecuadamente. Para evitar esto, en escenarios donde se necesita una‬
‭copia completamente independiente de una estructura de datos anidada, se debe‬
‭recurrir a una copia profunda (‬

‭copy.deepcopy()).‬

‭1.4. Ejercicios Resueltos‬

‭Ejercicio 1: Manipulación Básica de Listas‬


‭●‬ ‭Problema:‬‭Dada la lista numeros = , realiza las siguientes‬‭operaciones:‬
‭1.‬ ‭Añade el número 60 al final de la lista.‬
‭2.‬ ‭Inserta el número 25 en la posición del índice 2.‬
‭3.‬ ‭Elimina el número 30 de la lista.‬
‭4.‬ ‭Invierte el orden de la lista.‬
‭5.‬ ‭Imprime la lista resultante y su longitud.‬
‭●‬ ‭Solución:‬
‭Python‬
‭ umeros =‬
n
‭print(‬‭f"Lista original:‬‭{numeros}‬‭"‭)‬ ‬

‭# 1. Añadir 60 al final [3, 5]‬


‭ umeros.append(‬‭60‬‭)‬
n
‭print(‬‭f"Después de append(60):‬‭{numeros}‬‭"‬‭)‬‭# Output:‬

‭# 2. Insertar 25 en el índice 2 [3, 5]‬


‭ umeros.insert(‬‭2‬‭,‬‭25‬‭)‬
n
‭print(‬‭f"Después de insert(2, 25):‬‭{numeros}‬‭"‭)‬ ‬‭# Output:‬

‭# 3. Eliminar 30‬
‭ umeros.remove(‬‭30‬‭)‬
n
‭print(‬‭f"Después de remove(30):‬‭{numeros}‬‭"‬‭)‬‭# Output:‬

‭# 4. Invertir la lista [3, 5]‬


‭ umeros.reverse()‬
n
‭print(‬‭f"Después de reverse():‬‭{numeros}‬‭"‬‭)‬‭# Output:‬

‭# 5. Imprimir la lista final y su longitud [5, 6]‬


‭ rint(‬‭f"Lista final:‬‭{numeros}‬‭"‬‭)‬
p
‭print(‬‭f"Longitud de la lista:‬‭{‬‭len‬‭(numeros)}‬‭"‬‭)‬‭# Output:‬‭6‬

‭Ejercicio 2: Operaciones con Listas y Búsqueda‬

‭●‬ ‭Problema:‬‭Dada una lista de temperaturas temperaturas‬‭= [25.5, 28.1, 22.3, 28.1,‬
‭26.0, 29.5]:‬
‭1.‬ ‭Encuentra la temperatura máxima y mínima.‬
‭2.‬ ‭Cuenta cuántas veces aparece la temperatura 28.1.‬
‭3.‬ ‭Encuentra el índice de la primera aparición de 28.1.‬
‭4.‬ ‭Crea una nueva lista temperaturas_ordenadas que sea una versión ordenada‬
‭ e temperaturas sin modificar la original.‬
d
‭‬ S
● ‭ olución:‬
‭Python‬
t‭ emperaturas = [‬‭25.5‬‭,‬‭28.1‬‭,‬‭22.3‬‭,‬‭28.1‬‭,‬‭26.0‬‭,‬‭29.5‬‭]‬
‭print(‬‭f"Lista original de temperaturas:‬‭{temperaturas}‬‭"‬‭)‬

‭# 1. Temperatura máxima y mínima [2, 6]‬


‭ ax_temp =‬‭max‬‭(temperaturas)‬
m
‭min_temp =‬‭min‬‭(temperaturas)‬
‭print(‬‭f"Temperatura máxima:‬‭{max_temp}‬‭"‬‭)‬‭# Output:‬‭29.5‬
‭print(‬‭f"Temperatura mínima:‬‭{min_temp}‬‭"‭)‬ ‬‭# Output:‬‭22.3‬

‭# 2. Contar apariciones de 28.1 [2, 3]‬


‭ ount_28_1 = temperaturas.count(‬‭28.1‬‭)‬
c
‭print(‬‭f"La temperatura 28.1 aparece‬‭{count_28_1}‬‭veces."‬‭)‬‭# Output: 2‬

‭# 3. Índice de la primera aparición de 28.1 [2, 6]‬


i‭ndex_28_1 = temperaturas.index(‬‭28.1‬‭)‬
‭print(‬‭f"El índice de la primera 28.1 es:‬‭{index_28_1}‬‭"‬‭)‬‭# Output: 1‬

‭# 4. Crear una nueva lista ordenada‬


t‭ emperaturas_ordenadas =‬‭sorted‬‭(temperaturas)‬
‭print(‬‭f"Lista ordenada (nueva):‬‭{temperaturas_ordenadas}‬‭"‭)‬ ‬‭# Output: [22.3, 25.5, 26.0, 28.1, 28.1,‬
‭29.5]‬
‭print(‬‭f"Lista original después de sorted():‬‭{temperaturas}‬‭"‬‭)‬‭# Output: [25.5, 28.1, 22.3, 28.1, 26.0,‬
‭29.5]‬

‭2. Diccionarios en Python‬

‭ n diccionario de Python es una estructura de datos altamente flexible y eficiente que‬


U
‭organiza la información en pares de clave: valor. Se puede comparar con un‬
‭diccionario del mundo real, donde cada palabra (la clave) tiene una definición‬
‭correspondiente (el valor).‬‭8‬

‭Las características fundamentales de los diccionarios son las siguientes:‬


‭●‬ ‭Pares Clave-Valor:‬‭Los datos se organizan de manera‬‭que cada clave única se‬
‭ socia con un valor específico.‬‭8‬
a
‭●‬ ‭Mutabilidad:‬‭Los diccionarios pueden modificarse después‬‭de su creación; es‬
‭posible añadir nuevos pares, actualizar valores existentes y eliminar entradas.‬‭8‬
‭●‬ ‭Claves Únicas:‬‭Las claves dentro de un diccionario‬‭deben ser únicas. Si se‬
‭intenta añadir una clave duplicada, el nuevo valor sobrescribirá el valor anterior‬
‭asociado a esa clave.‬‭8‬
‭●‬ ‭Claves Inmutables:‬‭Las claves deben ser de un tipo‬‭de dato inmutable, como‬
‭cadenas de texto, números o tuplas. Las listas y otros diccionarios no pueden‬
‭utilizarse como claves, ya que son mutables.‬‭8‬
‭●‬ ‭Valores de Cualquier Tipo de Dato:‬‭Los valores pueden‬‭ser de cualquier tipo de‬
‭dato y pueden estar duplicados dentro del diccionario.‬‭8‬
‭●‬ ‭Ordenados (Python 3.7+):‬‭A partir de Python 3.7, los‬‭diccionarios mantienen el‬
‭orden de inserción de los elementos. Antes de esta versión, los diccionarios no‬
‭garantizaban un orden específico.‬‭8‬
‭●‬ ‭Hashing Interno:‬‭Los diccionarios implementan una‬‭técnica de hashing‬
‭internamente, lo que permite que las operaciones de búsqueda, inserción y‬
‭eliminación se realicen en tiempo constante (en promedio). Esto los hace‬
‭extremadamente eficientes para el acceso rápido a los datos.‬‭8‬

‭ a implementación del hashing en los diccionarios‬‭8‬ ‭es un mecanismo subyacente‬


L
‭crucial que explica su notable eficiencia para la recuperación, inserción y eliminación‬
‭rápidas de datos. Esta característica los convierte en la elección ideal para escenarios‬
‭que requieren búsquedas rápidas, como la asignación de identificadores a registros,‬
‭el conteo de frecuencias de elementos o la construcción de índices invertidos.‬‭9‬ ‭En‬
‭tales situaciones, una búsqueda secuencial (como la que se realizaría en una lista)‬
‭sería considerablemente más lenta. Esta ventaja de rendimiento es una consideración‬
‭fundamental en el diseño de software, ya que permite que las aplicaciones escalen de‬
‭manera efectiva al manejar grandes volúmenes de datos con acceso rápido.‬

‭2.2. Creación y Acceso‬

‭Los diccionarios pueden crearse de varias maneras. La forma más común es‬
‭ tilizando llaves {} para encerrar pares clave: valor separados por comas.‬
u
‭Alternativamente, se puede emplear el constructor dict() incorporado en Python.‬‭8‬

‭Python‬

‭# Creación usando llaves‬


‭student = {‬‭"name"‬‭:‬‭"Alice"‬‭,‬‭"age"‬‭:‬‭20‬‭,‬‭"major"‬‭:‬‭"Computer‬‭Science"‬‭}‬

‭# Creación usando dict() constructor‬


‭colors =‬‭dict‬‭(red=‬‭1‬‭, green=‬‭2‬‭, blue=‬‭3‭)‬ ‬

‭# Diccionario vacío‬
‭ mpty_dict = {}‬
e
‭another_empty_dict =‬‭dict‬‭()‬

‭ os valores de un diccionario se acceden utilizando sus claves correspondientes, ya‬


L
‭sea dentro de corchetes `` o mediante el método get(). El método get() es‬
‭generalmente más seguro y robusto, ya que permite especificar un valor‬
‭predeterminado que se devolverá si la clave no se encuentra, evitando así un KeyError‬
‭que podría interrumpir la ejecución del programa.‬‭8‬

‭Python‬

‭ rint(student[‬‭"name"‬‭])‬ ‭# Output: Alice‬


p
‭print(student.get(‬‭"age"‬‭))‬ ‭# Output: 20‬
‭print(student.get(‬‭"city"‬‭,‬‭"Unknown"‬‭))‬‭# Output: Unknown‬‭(la clave 'city' no existe, devuelve‬
‭'Unknown')‬

‭ a disponibilidad del método get() junto con el acceso directo mediante corchetes ``‬
L
‭es una elección de diseño importante para la robustez del código. El acceso directo‬
‭diccionario[clave] generará un KeyError si la clave no está presente, lo que podría‬
‭provocar un fallo en el programa. En cambio, get() proporciona un mecanismo de‬
‭respaldo elegante, permitiendo que el programa continúe su ejecución incluso si una‬
‭clave esperada no se encuentra. Esta capacidad de manejar con gracia la ausencia de‬
‭una clave es una práctica fundamental en la programación defensiva y la gestión de‬
‭ rrores, especialmente cuando se trabaja con entradas de usuario o datos externos‬
e
‭donde la existencia de claves no siempre está garantizada.‬

‭2.3. Manipulación y Métodos Comunes‬

‭ a naturaleza mutable de los diccionarios permite una manipulación flexible de sus‬


L
‭contenidos.‬
‭●‬ ‭Añadir y Actualizar Elementos:‬‭Los nuevos pares clave-valor‬‭se añaden, y los‬
v‭ alores existentes se actualizan, mediante una simple asignación utilizando la‬
‭clave dentro de corchetes.‬‭8‬
‭Python‬
‭ y_dict = {‬‭"apple"‬‭:‬‭2‬‭,‬‭"banana"‬‭:‬‭4‬‭}‬
m
‭my_dict[‬‭"orange"‬‭] =‬‭6‬ ‭# Añadir nuevo par‬
‭my_dict[‬‭"apple"‬‭] =‬‭5‬ ‭# Actualizar valor existente‬
‭print(my_dict)‬‭# Output: {'apple': 5, 'banana': 4,‬‭'orange': 6}‬

‭●‬ ‭Eliminar Elementos:‬


‭○‬ ‭del diccionario[clave]: Elimina un elemento específico por su clave.‬‭8‬
‭○‬ ‭pop(clave): Elimina un elemento por su clave y devuelve el valor asociado. Si la‬
‭ lave no existe, puede generar un KeyError a menos que se proporcione un‬
c
‭valor predeterminado.‬‭8‬
‭○‬ ‭clear(): Vacía completamente el diccionario, eliminando todos sus elementos.‬‭8‬
‭○‬ ‭popitem(): Elimina y devuelve un par clave-valor arbitrario. A partir de Python‬
‭3.7, elimina y devuelve el último par insertado.‬‭8‬
‭ ‬ ‭Iteración:‬‭Los diccionarios pueden ser iterados eficientemente‬‭utilizando bucles‬

‭for. Los métodos comunes para obtener vistas de los elementos del diccionario‬
‭son:‬
‭○‬ ‭keys(): Retorna un objeto de vista que contiene todas las claves del‬
‭diccionario.‬‭8‬
‭○‬ ‭values(): Retorna un objeto de vista que contiene todos los valores del‬
‭diccionario.‬‭8‬
‭○‬ ‭items(): Retorna un objeto de vista que contiene todos los pares clave-valor‬
‭como tuplas (clave, valor).‬‭8‬
‭Python‬
‭d = {‬‭1‭:‬ ‬‭'Geeks'‬‭,‬‭2‭:‬ ‬‭'For'‬‭,‬‭'age'‬‭:‬‭22‬‭}‬
‭for‬ ‭key‬‭in‬ ‭d.keys(): print(key)‬
f‭ or‬ ‭value‬‭in‬ ‭d.values(): print(value)‬
‭for‬ ‭key, value‬‭in‬ ‭d.items(): print(‬‭f"‬‭{key}‬‭:‬‭{value}‬‭"‭)‬ ‬

‭●‬ ‭Diccionarios Anidados:‬‭Los diccionarios pueden contener‬‭otros diccionarios‬


‭ omo valores, lo que permite construir estructuras de datos jerárquicas y‬
c
‭complejas.‬‭8‬
‭Python‬
‭ ested_dict = {‬‭1‬‭:‬‭'Geeks'‬‭,‬‭2‭:‬ ‬‭'For'‬‭,‬‭3‭:‬ {‬‭'A'‬‭:‬‭'Welcome'‬‭,‬‭'B'‬‭:‬‭'To'‬‭}}‬
n
‭print(nested_dict[‬‭'A'‬‭])‬‭# Output: Welcome‬

‭●‬ ‭Copia de Diccionarios (Copia Superficial vs. Profunda):‬


‭○‬ ‭Copia Superficial (copy.copy()):‬‭Crea un nuevo diccionario,‬‭pero si el‬
‭ iccionario original contiene objetos mutables anidados (como listas u otros‬
d
‭diccionarios), solo se copian las referencias a esos objetos. Esto significa que‬
‭los cambios en las partes anidadas de la copia afectarán también al‬
‭diccionario original.‬‭8‬
‭ ‬ ‭Copia Profunda (copy.deepcopy()):‬‭Crea un nuevo diccionario‬

‭completamente independiente, copiando recursivamente todos los objetos‬
‭mutables anidados. Las modificaciones realizadas en la copia profunda no‬
‭afectarán al diccionario original.‬‭8‬

‭La distinción detallada entre la copia superficial y la copia profunda para diccionarios‬
‭8‬
‭es un concepto fundamental para gestionar la integridad‬‭de los datos y evitar‬
‭efectos secundarios no deseados en estructuras de datos complejas. Esta‬
‭consideración se extiende más allá de los diccionarios a cualquier objeto mutable de‬
‭Python que contenga otros objetos mutables. Comprender cuándo utilizar cada tipo‬
‭de copia es crucial para prevenir la corrupción de datos inesperada, especialmente‬
‭cuando diferentes partes de un programa o funciones operan con copias de datos‬
‭complejos sin la intención de alterar la fuente original. Es un aspecto clave para‬
‭escribir código predecible y mantenible en aplicaciones a gran escala.‬

‭2.4. Ejercicios Resueltos‬

‭Ejercicio 1: Gestión de Inventario Simple‬


‭●‬ ‭Problema:‬‭Tienes un diccionario inventario = {'manzanas': 50, 'peras': 30,‬
‭'naranjas': 20}.‬
‭1.‬ ‭Añade 'uvas' con una cantidad de 40.‬
‭2.‬ ‭Actualiza la cantidad de 'manzanas' a 60.‬
‭3.‬ ‭Elimina 'peras' del inventario.‬
‭4.‬ ‭Imprime el inventario final.‬
‭ ‬ ‭Solución:‬

‭Python‬
i‭nventario = {‬‭'manzanas'‬‭:‬‭50‬‭,‬‭'peras'‬‭:‬‭30‬‭,‬‭'naranjas'‬‭:‬‭20‬‭}‬
‭print(‬‭f"Inventario inicial:‬‭{inventario}‬‭"‭)‬ ‬

‭# 1. Añadir 'uvas' [8, 9]‬


i‭nventario[‬‭'uvas'‬‭] =‬‭40‬
‭print(‬‭f"Después de añadir uvas:‬‭{inventario}‬‭"‬‭)‬‭# Output:‬‭{'manzanas': 50, 'peras': 30, 'naranjas':‬
‭20, 'uvas': 40}‬

‭# 2. Actualizar 'manzanas' [8, 9]‬


i‭nventario[‬‭'manzanas'‬‭] =‬‭60‬
‭print(‬‭f"Después de actualizar manzanas:‬‭{inventario}‬‭"‬‭)‬‭# Output: {'manzanas': 60, 'peras': 30,‬
‭'naranjas': 20, 'uvas': 40}‬

‭# 3. Eliminar 'peras' [8, 9]‬


‭del‬ ‭inventario[‬‭'peras'‬‭]‬
‭print(‬‭f"Después de eliminar peras:‬‭{inventario}‬‭"‬‭)‬‭# Output: {'manzanas': 60, 'naranjas': 20, 'uvas':‬
‭40}‬

‭Ejercicio 2: Análisis de Frecuencia de Palabras‬

‭●‬ ‭Problema:‬‭Dada la cadena de texto texto = "hola mundo‬‭hola python hola", usa‬
‭ n diccionario para contar la frecuencia de cada palabra.‬
u
‭ ‬ ‭Solución:‬

‭Python‬
t‭ exto =‬‭"hola mundo hola python hola"‬
‭palabras = texto.split()‬‭# Divide la cadena en una‬‭lista de palabras‬
‭frecuencia = {}‬

‭for‬ ‭palabra‬‭in‬ ‭palabras:‬


‭# Usa get() para obtener el valor actual o 0 si la palabra no está, luego incrementa [9]‬
‭frecuencia[palabra] = frecuencia.get(palabra,‬‭0‬‭) +‬‭1‬

‭print(‬‭f"Frecuencia de palabras:‬‭{frecuencia}‬‭"‬‭)‬
‭# Output: {'hola': 3, 'mundo': 1, 'python': 1}‬

‭3. Ciclos (Loops) en Python‬

‭ os ciclos, o bucles, son construcciones fundamentales en la programación que‬


L
‭permiten ejecutar un bloque de código repetidamente. Python ofrece dos tipos‬
‭principales de bucles: for y while, cada uno adecuado para diferentes escenarios de‬
‭iteración.‬

‭3.1. El Bucle for‬

‭ l bucle for en Python se utiliza para iterar sobre los elementos de cualquier‬
E
‭secuencia (como listas, tuplas, cadenas de texto o rangos) o sobre otros objetos‬
‭iterables. Ejecuta un bloque de código una vez por cada elemento de la secuencia.‬‭7‬
‭●‬ ‭Sintaxis:‬‭for item in iterable: # bloque de código‬
‭●‬ ‭Ejemplo: Iteración sobre una lista:‬
‭Python‬
‭words = [‬‭'cat'‬‭,‬‭'window'‬‭,‬‭'defenestrate'‬‭]‬
‭for‬ ‭w‬‭in‬ ‭words:‬
‭print(w,‬‭len‬‭(w))‬
‭ Output:‬
#
‭# cat 3‬
‭# window 6‬
‭# defenestrate 12‬

‭●‬ ‭Ejemplo: Uso de range() para iteración numérica:‬‭La‬‭función range() genera‬


‭ na secuencia de números, comúnmente utilizada con los bucles for. Puede‬
u
‭tomar uno (stop), dos (start, stop) o tres argumentos (start, stop, step).‬‭1‬
‭Python‬
‭for‬ ‭i‬‭in‬‭range‬‭(‬‭5‭)‬ :‬‭# Genera 0, 1, 2, 3, 4‬
‭print(i)‬
‭# Output: 0, 1, 2, 3, 4‬

‭for‬ ‭i‬‭in‬‭range‬‭(‬‭2‭,‬ ‬‭10‬‭,‬‭2‬‭):‬‭# Genera 2, 4, 6, 8‬


‭print(i)‬
‭# Output: 2, 4, 6, 8‬

‭ n aspecto crítico al trabajar con bucles for es la seguridad de la iteración,‬


U
‭especialmente cuando se modifica una colección mientras se itera sobre ella. Es‬
‭fundamental iterar sobre una‬‭copia‬‭de la colección‬‭(por ejemplo, utilizando‬
‭lista.copy() o lista[:]) o construir una nueva colección. La modificación directa de la‬
‭colección durante la iteración puede conducir a un comportamiento inesperado o a‬
‭errores, debido a los cambios en la indexación y el tamaño de la colección.‬‭7‬ ‭Por‬
‭ejemplo, si se elimina un elemento, los índices de los elementos subsiguientes se‬
‭desplazan, lo que podría hacer que el bucle omita elementos o intente acceder a‬
‭índices inexistentes. Esta situación es una trampa común para los programadores‬
‭principiantes y representa una práctica fundamental para mantener la integridad de‬
‭los datos en el código.‬

‭3.2. El Bucle while‬

‭ l bucle while ejecuta repetidamente un bloque de código siempre que una condición‬
E
‭dada permanezca True. Requiere una gestión cuidadosa de la condición para evitar‬
‭bucles infinitos, donde el programa nunca termina su ejecución.‬‭7‬
‭●‬ ‭Sintaxis:‬‭while condition: # bloque de código‬
‭●‬ ‭Ejemplo:‬
‭Python‬
‭count =‬‭0‬
‭while‬ ‭count <‬‭5‬‭:‬
‭print(count)‬
‭count +=‬‭1‬‭# Importante: actualizar la variable‬‭de control‬
‭# Output: 0, 1, 2, 3, 4‬

‭ a necesidad de actualizar explícitamente la variable de control dentro de un bucle‬


L
‭while‬‭12‬ ‭es un aspecto fundamental para asegurar su‬‭terminación y evitar bucles‬
i‭nfinitos. Esto resalta la responsabilidad del programador en la gestión de la condición‬
‭de finalización del bucle, lo que contrasta marcadamente con los bucles‬

f‭ or, donde la iteración sobre una secuencia finita es implícita. Si la variable de control‬
‭no se modifica de manera que eventualmente haga que la condición del bucle sea‬
‭False, el bucle se ejecutará indefinidamente. Esta es una fuente común de errores‬
‭para los principiantes y subraya la importancia de un diseño de bucle meticuloso.‬

‭3.3. Sentencias break y continue‬

‭ as sentencias break y continue proporcionan mecanismos adicionales para controlar‬


L
‭el flujo de ejecución dentro de los bucles.‬
‭●‬ ‭Sentencia break:‬‭Termina inmediatamente el bucle for‬‭o while más interno en el‬
‭ ue se encuentra. La ejecución del programa se reanuda en la instrucción que‬
q
‭sigue inmediatamente al bucle.‬‭7‬
‭Python‬
‭for‬ ‭i‬‭in‬‭range‬‭(‬‭5‭)‬ :‬
‭if‬ ‭i ==‬‭3‭:‬ ‬
‭break‬‭# Sale del bucle cuando i es 3‬
‭print(i)‬
‭# Output: 0, 1, 2‬

‭●‬ ‭Sentencia continue:‬‭Omite el resto de la iteración‬‭actual del bucle y procede a la‬


s‭ iguiente iteración. Es útil cuando se desea saltar ciertas partes del código del‬
‭bucle para condiciones específicas.‬‭7‬
‭Python‬
‭for‬ ‭num‬‭in‬‭range‬‭(‬‭2‬‭,‬‭10‬‭):‬
‭if‬ ‭num %‬‭2‬ ‭==‬‭0‬‭:‬
‭print(‬‭f"Found an even number‬‭{num}‬‭"‬‭)‬
‭continue‬‭# Salta el resto de la iteración‬‭para números pares‬
‭print(‬‭f"Found an odd number‬‭{num}‬‭"‬‭)‬
‭ Output:‬
#
‭# Found an even number 2‬
‭# Found an odd number 3‬
‭# Found an even number 4‬
‭# Found an odd number 5‬
‭# Found an even number 6‬
‭# Found an odd number 7‬
‭ Found an even number 8‬
#
‭# Found an odd number 9‬

‭●‬ ‭Cláusula else en Bucles:‬‭Tanto los bucles for como‬‭while pueden incluir una‬
‭ láusula else opcional. Este bloque else se ejecuta‬‭solamente si el bucle se‬
c
‭completa de forma normal‬‭, es decir, sin encontrar‬‭una sentencia break. Si el bucle‬
‭se termina por un break, una sentencia return o una excepción, la cláusula else se‬
‭omite.‬‭7‬
‭Python‬
‭for‬ ‭n‬‭in‬‭range‬‭(‬‭2‬‭,‬‭10‬‭):‬
‭for‬ ‭x‬‭in‬‭range‬‭(‬‭2‬‭, n):‬
‭if‬ ‭n % x ==‬‭0‭:‬ ‬
‭print(‬‭f"‬‭{n}‬‭equals‬‭{x}‬‭*‬‭{n//x}‬‭"‭)‬ ‬
‭break‬
‭else‬‭:‬‭# Este else pertenece al for interno‬
‭print(‬‭f"‬‭{n}‬‭is a prime number"‬‭)‬
‭ Output incluye: "2 is a prime number", "3 is a prime number", etc.‬
#
‭# Y para no-primos: "4 equals 2 * 2", etc.‬

‭ a cláusula else en los bucles‬‭7‬ ‭es una característica‬‭de Python menos común pero‬
L
‭muy potente. Proporciona una forma clara de distinguir entre un bucle que completó‬
‭su curso natural y uno que fue terminado prematuramente. Esta elección de diseño‬
‭simplifica ciertos patrones lógicos, como la búsqueda de un elemento y la ejecución‬
‭de una acción si no se encuentra, sin la necesidad de variables de bandera‬
‭adicionales. Por ejemplo, en el caso de la búsqueda de números primos, si se‬
‭encuentra un factor (lo que provoca un‬

‭ reak), la cláusula else se omite. Si el bucle interno se completa sin encontrar ningún‬
b
‭factor, significa que el número es primo, y la cláusula else se ejecuta. Esto mejora la‬
‭legibilidad del código y reduce el código repetitivo.‬

‭3.4. Ejercicios Resueltos‬

‭Ejercicio 1: Suma de Números Pares con for y continue‬


‭●‬ ‭Problema:‬‭Calcula la suma de todos los números pares‬‭del 1 al 10, pero usa‬
‭ ontinue para saltar los números impares.‬
c
‭ ‬ ‭Solución:‬

‭Python‬
‭suma_pares =‬‭0‬
‭for‬ ‭i‬‭in‬‭range‬‭(‬‭1‭,‬ ‬‭11‬‭):‬
‭if‬ ‭i %‬‭2‬‭!=‬‭0‭:‬ ‬‭# Si es impar [7, 12]‬
‭continue‬‭# Salta a la siguiente iteración‬‭[7, 12]‬
s‭ uma_pares += i‬
‭print(‬‭f"La suma de los números pares del 1 al 10 es:‬‭{suma_pares}‬‭"‬‭)‬‭# Output: 30‬

‭Ejercicio 2: Búsqueda de un Elemento con while y break‬

‭●‬ ‭Problema:‬‭Pide al usuario que ingrese números repetidamente‬‭hasta que ingrese‬


‭ l número 0. Cuando ingrese 0, el programa debe terminar.‬
e
‭ ‬ ‭Solución:‬

‭Python‬
‭while‬‭True‬‭:‬‭# Bucle infinito que se romperá con 'break'‬‭[13]‬
‭numero =‬‭int‬‭(‬‭input‬‭(‭"‬ Ingresa un número (0 para‬‭salir): "‬‭))‬
‭if‬ ‭numero ==‬‭0‬‭:‬
‭print(‬‭"Saliendo del programa."‬‭)‬
‭break‬‭# Termina el bucle [12, 13]‬
‭print(‬‭f"Ingresaste:‬‭{numero}‬‭"‬‭)‬

‭4. Condicionales en Python‬

‭ as sentencias condicionales en Python (if, elif, else) son esenciales para controlar el‬
L
‭flujo de ejecución de un programa, permitiendo que el código se comporte de manera‬
‭diferente según si una expresión booleana se evalúa como True o False. La‬
‭indentación es un elemento crucial en Python, ya que define los bloques de código‬
‭asociados a cada condición.‬‭13‬

‭4.1. Sentencias if, if-else, if-elif-else‬

‭●‬ ‭Sentencia if:‬‭Ejecuta un bloque de código únicamente‬‭si su condición asociada‬


‭es True.‬‭13‬
‭Python‬
‭x =‬‭5‬
‭if‬ ‭x >‬‭3‬‭:‬
‭print(‬‭"x is greater than 3"‬‭)‬‭# Se ejecuta porque‬‭5 > 3 es True‬

‭●‬ ‭Sentencia if-else:‬‭Proporciona dos bloques de código‬‭alternativos: uno para‬


‭ uando la condición es True (el bloque if) y otro para cuando es False (el bloque‬
c
‭else).‬‭13‬
‭Python‬
‭a =‬‭10‬
‭if‬ ‭(a >‬‭10‬‭):‬
‭print(‬‭"Value of a is greater than 10"‬‭)‬
‭else‬‭:‬
‭print(‬‭"Value of a is 10"‬‭)‬‭# Se ejecuta porque‬‭10 > 10 es False‬

‭●‬ ‭Sentencia if-elif-else:‬‭Se utiliza para verificar‬‭múltiples condiciones de forma‬


s‭ ecuencial. Python evalúa cada condición de arriba hacia abajo. El bloque de‬
‭código de la primera condición que se evalúa como True se ejecuta, y el resto de‬
‭las condiciones y bloques se omiten. Si ninguna condición if o elif es True, se‬
‭ejecuta el bloque else (si está presente).‬‭13‬
‭Python‬
‭var1 =‬‭1‬‭+‭2‬ j‬‭# Un número complejo‬
‭if‬ ‭(‭t‬ ype‬‭(var1) ==‬‭int‬‭):‬
‭print(‬‭"Type is Integer"‬‭)‬
‭elif‬ ‭(‭t‬ ype‬‭(var1) ==‬‭float‬‭):‬
‭print(‬‭"Type is Float"‬‭)‬
‭elif‬ ‭(‭t‬ ype‬‭(var1) ==‬‭complex‬‭):‬
‭print(‬‭"Type is Complex"‬‭)‬‭# Se ejecuta‬
‭else‬‭:‬
‭print(‬‭"Type is Unknown"‬‭)‬
‭ a estructura if-elif-else‬‭15‬ ‭aborda directamente la necesidad de tomar decisiones con‬
L
‭múltiples opciones, ofreciendo una alternativa más legible y eficiente a las cadenas de‬

i‭f-else anidadas profundamente.‬‭17‬ ‭Esta estructura‬‭promueve un código más limpio y‬


‭una mejor mantenibilidad, especialmente a medida que el número de condiciones‬
‭aumenta. Al evaluar las condiciones de forma secuencial y ejecutar solo el primer‬
‭bloque verdadero, se asegura que las condiciones mutuamente excluyentes se‬
‭manejen de manera clara y concisa, lo cual es un aspecto clave del estilo Pythonico y‬
‭la facilidad de mantenimiento del código.‬

‭4.2. Operadores Lógicos y de Comparación‬

‭ as sentencias condicionales se basan en expresiones booleanas, que se construyen‬


L
‭utilizando operadores de comparación y lógicos.‬
‭●‬ ‭Operadores de Comparación:‬‭Se emplean para comparar‬‭valores y devuelven‬
‭True o False como resultado.‬‭13‬
‭○‬ ‭== (Igual a)‬
‭○‬ ‭!= (Diferente de)‬
‭○‬ ‭< (Menor que)‬
‭○‬ ‭> (Mayor que)‬
‭○‬ ‭<= (Menor o igual que)‬
‭○‬ ‭>= (Mayor o igual que)‬
‭Python‬
‭print(‬‭42‬ ‭==‬‭42‬‭)‬ ‭# True‬
‭print(‬‭'hello'‬‭!=‬‭'Hello'‬‭)‬‭# True (distingue mayúsculas‬‭y minúsculas)‬

‭●‬ ‭Operadores Lógicos:‬‭Se utilizan para combinar expresiones‬‭booleanas.‬‭13‬


‭○‬ ‭and: Retorna True si ambos operandos son True.‬
‭○‬ ‭or: Retorna True si al menos uno de los operandos es True.‬
‭○‬ ‭not: Invierte el valor booleano de un operando.‬
‭Python‬
‭print((‬‭4‬ ‭<‬‭5‬‭)‬‭and‬ ‭(‬‭5‬ ‭<‬‭6‭)‬ )‬‭# True‬
‭print((‬‭1‬ ‭==‬‭2‬‭)‬‭or‬ ‭(‬‭2‬ ‭==‬‭2‭)‬ )‬‭# True‬
‭print(‬‭not‬ ‭(‬‭4‬ ‭>‬‭5‬‭))‬‭# True‬

‭●‬ ‭Operador Condicional Ternario (Expresión Condicional):‬‭Es una expresión‬


‭if-else concisa de una sola línea, ideal para asignaciones condicionales simples.‬‭13‬
‭○‬ ‭Sintaxis: valor_si_verdadero if condición else valor_si_falso‬
‭Python‬
‭age =‬‭15‬
s‭ tatus =‬‭'kid'‬‭if‬ ‭age <‬‭18‬‭else‬‭'adult'‬
‭print(status)‬‭# Output: kid‬

‭ a inclusión del operador condicional ternario‬‭13‬ ‭demuestra el énfasis de Python en la‬


L
‭expresividad y la concisión para la lógica condicional simple. Aunque no es‬
‭estrictamente necesario (un bloque‬

i‭f-else logra el mismo resultado), permite un código más compacto y, a menudo, más‬
‭legible en escenarios específicos. Este operador no es simplemente una mejora‬
‭sintáctica; permite incrustar la lógica condicional directamente en expresiones, lo que‬
‭es útil para asignaciones, argumentos de funciones o dentro de f-strings, lo que lleva‬
‭a un código más funcional y compacto cuando es apropiado. Es una herramienta para‬
‭la elegancia en la programación Python.‬

‭4.3. Ejercicios Resueltos‬

‭Ejercicio 1: Clasificación de Números‬

‭●‬ ‭Problema:‬‭Escribe un programa que pida al usuario‬‭un número entero y‬


‭ etermine si es positivo, negativo o cero.‬
d
‭ ‬ ‭Solución:‬

‭Python‬
‭numero =‬‭int‬‭(‭i‬nput‬‭(‭"‬ Ingresa un número entero: "‬‭))‬

‭if‬ ‭numero >‬‭0‬‭:‬


‭print(‬‭"El número es positivo."‬‭)‬
‭elif‬ ‭numero <‬‭0‬‭:‬
‭print(‬‭"El número es negativo."‬‭)‬
‭else‬‭:‬
‭print(‬‭"El número es cero."‬‭)‬
‭●‬ ‭Referencias:‬‭16‬

‭Ejercicio 2: Elegibilidad para Descuento‬

‭●‬ ‭Problema:‬‭Una tienda ofrece descuentos: 10% si la‬‭compra es de $100 o más, y‬


‭ % si la compra es de $50 o más (pero menos de $100). Si la compra es menor‬
5
‭de $50, no hay descuento. Calcula el precio final.‬
‭ ‬ ‭Solución:‬

‭Python‬
‭ recio_original =‬‭float‬‭(‬‭input‬‭(‬‭"Ingresa el precio total‬‭de la compra: "‬‭))‬
p
‭descuento =‬‭0‬

‭if‬ ‭precio_original >=‬‭100‬‭:‬


‭descuento =‬‭0.10‬
‭elif‬ ‭precio_original >=‬‭50‬‭:‬‭# Implica que es < 100‬‭por el orden de elif [15, 18]‬
‭descuento =‬‭0.05‬
‭else‬‭:‬
‭descuento =‬‭0‬‭# No hay descuento‬

‭ recio_final = precio_original * (‬‭1‬ ‭- descuento)‬


p
‭print(‬‭f"Precio original: $‬‭{precio_original:‬‭.2‬‭f}‬‭"‬‭)‬
‭print(‬‭f"Descuento aplicado:‬‭{descuento*‬‭100‬‭:‭.‬0‬‭f}‬‭%"‬‭)‬
‭print(‬‭f"Precio final: $‬‭{precio_final:‬‭.2‬‭f}‬‭"‬‭)‬

‭Parte II: Fundamentos de Bases de Datos SQL‬

‭5. Diseño de Bases de Datos‬

‭ l diseño de bases de datos es un proceso sistemático de organización de datos que‬


E
‭implica la creación de tablas y el establecimiento de relaciones lógicas entre ellas. Los‬
‭ bjetivos primordiales de este proceso son salvaguardar la integridad de los datos y‬
o
‭mejorar la flexibilidad de la base de datos, lo cual se logra eliminando la redundancia‬
‭y las dependencias inconsistentes.‬‭19‬

‭5.1. Conceptos Clave (Entidades, Atributos, Relaciones)‬

‭Los elementos fundamentales en el diseño de bases de datos son:‬


‭●‬ ‭Entidades:‬‭Representan "cosas" u objetos del mundo‬‭real sobre los cuales se‬
‭ esea almacenar información (por ejemplo, clientes, productos, pedidos). En el‬
d
‭contexto de las bases de datos relacionales, las entidades se corresponden‬
‭directamente con las tablas. En los Diagramas Entidad-Relación (ERD), las‬
‭entidades suelen representarse como rectángulos.‬‭20‬
‭ ‬ ‭Atributos:‬‭Son las propiedades o características que‬‭describen una entidad (por‬

‭ejemplo, una entidad "Cliente" podría tener atributos como ID_Cliente, Nombre,‬
‭Apellido). Los atributos se convierten en columnas (campos) dentro de las tablas‬
‭de la base de datos. En los ERD, los atributos se representan comúnmente como‬
‭óvalos.‬‭20‬
‭●‬ ‭Relaciones:‬‭Describen las asociaciones o interacciones‬‭entre dos o más‬
‭entidades (por ejemplo, un "Cliente"‬‭realiza‬‭un "Pedido").‬‭Las relaciones son‬
‭cruciales para vincular datos distribuidos en diferentes tablas y para obtener‬
‭información significativa a partir de ellos. En los ERD, las relaciones suelen‬
‭representarse como rombos o diamantes.‬‭20‬

‭ a progresión desde los conceptos del mundo real (entidades, atributos, relaciones)‬
L
‭hasta su representación abstracta en los Diagramas Entidad-Relación (ERD)‬‭20‬
‭constituye un paso fundamental en el diseño de bases de datos. Esta abstracción‬
‭permite a los diseñadores modelar sistemas complejos de manera visual y lógica‬
‭antes de comprometerse con una implementación técnica específica. Los ERD son‬
‭herramientas para "visualizar entidades, atributos y relaciones" y para "facilitar la‬
‭comunicación entre las partes interesadas del proyecto".‬‭21‬ ‭Representan "un modelo‬
‭de un problema del mundo real que es independiente de cualquier consideración‬
‭física".‬‭20‬ ‭Este enfoque inicial en el diseño conceptual‬‭es vital porque permite a los‬
‭diseñadores concentrarse en la lógica de negocio y los requisitos de datos sin verse‬
‭abrumados por los detalles de implementación, lo que previene costosos rediseños‬
‭posteriores y asegura que la base de datos refleje con precisión el dominio del‬
‭problema.‬

‭5.2. Diagramas Entidad-Relación (ERD)‬

‭ os Diagramas Entidad-Relación (ERD) son herramientas visuales utilizadas para‬


L
‭modelar la estructura lógica de una base de datos. Emplean un conjunto definido de‬
‭símbolos (rectángulos para entidades, óvalos para atributos, diamantes para‬
‭relaciones y líneas de conexión) para representar la interconexión entre entidades y‬
‭sus propiedades.‬‭20‬

‭Pasos para Dibujar un ERD Básico:‬


‭1.‬ ‭Definir Propósito y Alcance:‬‭Es fundamental clarificar‬‭el objetivo del diagrama y‬
‭ ué aspectos del sistema necesita representar.‬‭21‬
q
‭2.‬ ‭Identificar Entidades:‬‭Determinar las principales‬‭"cosas" sobre las cuales se‬
‭almacenarán datos (por ejemplo, Clientes, Productos). Se dibujan como‬
‭rectángulos y se etiquetan con un sustantivo.‬‭21‬
‭3.‬ ‭Definir Relaciones:‬‭Establecer cómo interactúan las‬‭entidades (por ejemplo, un‬
‭Cliente‬‭realiza‬‭un Pedido). Se dibujan líneas que‬‭conectan las entidades y se‬
‭etiqueta la relación (a menudo dentro de un diamante o directamente sobre la‬
‭línea).‬‭21‬
‭4.‬ ‭Añadir Atributos:‬‭Para cada entidad, identificar sus‬‭propiedades clave (por‬
‭ejemplo, ID_Cliente, Nombre). Se dibujan como óvalos conectados a su entidad‬
‭correspondiente.‬‭21‬
‭5.‬ ‭Especificar Cardinalidad:‬‭Indicar la relación numérica‬‭entre las instancias de las‬
‭entidades (por ejemplo, uno a uno, uno a muchos, muchos a muchos).‬‭21‬

‭ ardinalidad:‬‭Define la relación numérica entre las‬‭instancias de las entidades en‬


C
‭una asociación.‬‭20‬
‭●‬ ‭Uno a Uno (1:1):‬‭Cada instancia de la Entidad A se‬‭relaciona exactamente con‬
‭ na instancia de la Entidad B (por ejemplo, una Persona tiene un Pasaporte).‬
u
‭ ‬ ‭Uno a Muchos (1:M):‬‭Una instancia de la Entidad A‬‭se relaciona con múltiples‬

‭instancias de la Entidad B, pero cada instancia de la Entidad B se relaciona con‬
‭solo una instancia de la Entidad A (por ejemplo, un Departamento tiene muchos‬
‭Empleados, pero cada Empleado pertenece a un único Departamento).‬
‭●‬ ‭Muchos a Muchos (M:N):‬‭Múltiples instancias de la‬‭Entidad A se relacionan con‬
‭múltiples instancias de la Entidad B (por ejemplo, Estudiantes pueden inscribirse‬
‭en muchos Cursos, y Cursos pueden tener muchos Estudiantes).‬

‭ a forma en que la cardinalidad se traduce en la implementación física de la base de‬


L
‭datos‬‭20‬ ‭es un aspecto práctico crucial. Por ejemplo,‬‭las relaciones uno a uno se‬
‭implementan con una clave foránea en una de las tablas que apunta a la otra. Para las‬
‭relaciones uno a muchos, la tabla del lado "muchos" siempre contendrá la clave‬
‭foránea que referencia a la tabla del lado "uno". Particularmente importante es que las‬
‭relaciones muchos a muchos siempre requieren una tabla intermedia o de "enlace",‬
‭que contendrá únicamente claves foráneas que apunten a los registros de las dos‬
‭tablas originales involucradas en la relación. Esta comprensión es fundamental para‬
‭que los principiantes comprendan cómo las decisiones de diseño abstractas se‬
‭traducen directamente en estructuras de tabla concretas en SQL.‬

‭5.3. Normalización (1FN, 2FN, 3FN)‬

‭ a normalización es un proceso sistemático para organizar los datos en una base de‬
L
‭datos con el fin de minimizar la redundancia de datos y mejorar la integridad de los‬
‭mismos. Implica la aplicación de un conjunto de reglas conocidas como "formas‬
‭normales".‬‭19‬
‭●‬ ‭Redundancia:‬‭Los datos duplicados no solo desperdician‬‭espacio de‬
‭ lmacenamiento, sino que también crean problemas de mantenimiento‬
a
‭significativos. Por ejemplo, si la dirección de un cliente se almacena en múltiples‬
‭lugares, cualquier cambio en esa dirección requerirá actualizaciones en todas las‬
‭ubicaciones, lo que aumenta el riesgo de inconsistencias.‬‭19‬
‭ ‬ ‭Dependencia Inconsistente:‬‭Esto ocurre cuando los‬‭datos se almacenan en una‬

‭tabla a la que lógicamente no pertenecen o no dependen completamente de la‬
‭clave primaria de esa tabla. Esta situación dificulta el acceso y la gestión de los‬
‭datos.‬‭19‬

‭Las formas normales son las siguientes:‬


‭●‬ ‭Primera Forma Normal (1FN):‬
‭○‬ ‭Eliminar grupos repetitivos (atributos multivaluados) en tablas individuales.‬
‭ ada columna debe contener valores atómicos (únicos e indivisibles).‬
C
‭○‬ ‭Crear una tabla separada para cada conjunto de datos relacionados.‬
‭○‬ ‭Identificar cada conjunto de datos relacionados con una clave primaria.‬‭19‬
‭ ‬ ‭Segunda Forma Normal (2FN):‬

‭○‬ ‭Debe estar en 1FN.‬
‭○‬ ‭Eliminar datos redundantes creando tablas separadas para conjuntos de‬
v‭ alores que se aplican a múltiples registros.‬
‭○‬ ‭Todos los atributos no clave deben ser completamente funcionalmente‬
‭dependientes de la‬‭totalidad‬‭de la clave primaria‬‭(sin dependencias‬
‭parciales).‬‭19‬
‭ ‬ ‭Tercera Forma Normal (3FN):‬

‭○‬ ‭Debe estar en 2FN.‬
‭○‬ ‭Eliminar datos que no dependen de la clave (dependencias transitivas). Los‬
‭atributos no clave no deben depender de otros atributos no clave.‬‭19‬

‭ unque la Tercera Forma Normal (3FN) se considera generalmente el nivel más alto de‬
A
‭normalización práctico‬‭19‬‭, la práctica del diseño‬‭de bases de datos a menudo implica‬
‭una compensación entre la normalización estricta y el rendimiento. La adherencia‬
‭perfecta a la 3FN no siempre es práctica, ya que la creación de muchas tablas‬
‭pequeñas puede degradar el rendimiento o exceder las capacidades del sistema.‬‭19‬
‭Esto significa que las decisiones de diseño en el mundo real a menudo implican‬
‭compromisos pragmáticos, donde se puede optar por desnormalizar una base de‬
‭datos para optimizar la velocidad de consulta, especialmente en entornos de‬
‭almacenamiento de datos o con altas tasas de lectura. Esta consideración introduce‬
‭el concepto de compensaciones en el diseño, que es una perspectiva más avanzada‬
‭que la simple aplicación de reglas.‬

‭5.4. Claves (Primarias, Foráneas)‬

‭ as claves son elementos fundamentales en el diseño de bases de datos relacionales,‬


L
‭ya que garantizan la integridad de los datos y permiten establecer relaciones‬
‭significativas entre las tablas.‬
‭●‬ ‭Clave Primaria (PK):‬‭Es un atributo o un conjunto‬‭de atributos que identifica de‬
f‭ orma única cada registro (fila) en una tabla. Una clave primaria no puede‬
‭contener valores NULL y debe ser única para cada registro, asegurando que cada‬
‭fila sea distinguible.‬‭19‬
‭○‬ ‭Ejemplo: ID_Cliente en una tabla Clientes.‬
‭ ‬ ‭Clave Foránea (FK):‬‭Es una columna (o un conjunto‬‭de columnas) en una tabla‬

‭que hace referencia a la clave primaria en otra tabla. Su función es establecer un‬
‭vínculo lógico entre dos tablas, lo que es esencial para mantener la integridad‬
r‭ eferencial. Las claves foráneas pueden contener valores NULL si la relación lo‬
‭permite.‬‭19‬
‭○‬ ‭Ejemplo: ID_Cliente en una tabla Pedidos que hace referencia a ID_Cliente en‬
‭la tabla Clientes.‬
‭ ‬ ‭Otras Claves‬‭22‬‭:‬

‭○‬ ‭Superclave:‬‭Cualquier conjunto de atributos que identifique‬‭de forma única‬
‭una fila en una tabla.‬
‭○‬ ‭Clave Candidata:‬‭Una superclave mínima, es decir,‬‭que no contiene atributos‬
‭redundantes. Una tabla puede tener varias claves candidatas.‬
‭○‬ ‭Clave Alterna:‬‭Una clave candidata que no ha sido‬‭elegida como clave‬
‭primaria.‬

‭ l papel de las claves primarias y foráneas‬‭19‬ ‭va‬‭más allá de la mera identificación y‬


E
‭vinculación de datos; son los mecanismos centrales para hacer cumplir las reglas de‬
‭integridad de datos, como la unicidad y la integridad referencial. Por ejemplo, las‬
‭claves primarias garantizan que no haya registros duplicados o no identificados,‬
‭mientras que las claves foráneas aseguran que las relaciones entre tablas sean‬
‭válidas (por ejemplo, un pedido no puede existir para un cliente inexistente). Esta‬
‭capacidad de las claves para actuar como guardianes de la calidad de los datos es‬
‭fundamental para construir sistemas de bases de datos fiables y precisos.‬

‭6. Lenguaje de Definición de Datos (DDL) en SQL‬

‭ os comandos DDL (Data Definition Language) se utilizan para definir, modificar y‬


L
‭gestionar la estructura de los objetos de la base de datos, como tablas, vistas, índices‬
‭y esquemas. Estos comandos se ocupan del‬‭esquema‬‭de‬‭la base de datos, no de los‬
‭datos en sí.‬‭24‬

‭6.1. CREATE TABLE‬

‭ l comando CREATE TABLE se emplea para crear nuevas tablas en una base de datos.‬
E
‭Al utilizarlo, se especifica el nombre de la tabla, los nombres de las columnas, sus‬
‭tipos de datos y cualquier restricción (constraints) que se desee aplicar, como‬
‭PRIMARY KEY, NOT NULL, UNIQUE o FOREIGN KEY.‬‭24‬
‭●‬ ‭Sintaxis:‬
‭SQL‬
‭CREATE‬‭TABLE‬ ‭table_name (‬
‭column1_name DATATYPE,‬
‭column2_name DATATYPE,‬
‭...‬
‭PRIMARY‬ ‭KEY (column_name(s)),‬
‭FOREIGN‬ ‭KEY (fk_column_name)‬‭REFERENCES‬ ‭other_table(pk_column_name)‬
‭);‬

‭●‬ ‭Ejemplo:‬‭Creación de una tabla customers.‬‭24‬


‭SQL‬
‭CREATE‬‭TABLE‬ ‭customers (‬
‭ ustomer_id‬‭INT‬‭PRIMARY‬ ‭KEY,‬
c
‭first_name‬‭VARCHAR‬‭(‬‭50‬‭),‬
‭last_name‬‭VARCHAR‬‭(‭5‬ 0‬‭),‬
‭email‬‭VARCHAR‬‭(‬‭100‬‭),‬
‭phone_number‬‭VARCHAR‬‭(‭2‬ 0‬‭)‬
‭);‬

‭ a sentencia CREATE TABLE‬‭24‬ ‭define efectivamente‬‭el "contrato" para el‬


L
‭almacenamiento de datos. La especificación de tipos de datos (como‬

‭ ARCHAR o INT) y restricciones (como PRIMARY KEY o FOREIGN KEY) en esta etapa‬
V
‭es crucial para garantizar la calidad y coherencia de los datos‬‭en el punto de entrada‬‭.‬
‭Esto es un enfoque proactivo para la integridad de los datos, ya que evita que datos‬
‭inválidos sean almacenados en primer lugar. El esquema actúa como un plano y un‬
‭guardián, permitiendo que el sistema de gestión de bases de datos valide‬
‭automáticamente los datos a medida que se insertan o actualizan, lo que reduce‬
‭significativamente el riesgo de datos sucios y simplifica la lógica de la aplicación que‬
‭interactúa con la base de datos.‬

‭6.2. ALTER TABLE‬

‭ l comando ALTER TABLE se utiliza para modificar la estructura de una tabla existente‬
E
‭en la base de datos. Esto incluye la capacidad de añadir nuevas columnas, modificar‬
l‭as propiedades de las columnas existentes (como su tipo de dato o tamaño), eliminar‬
‭columnas, y añadir o eliminar restricciones.‬‭24‬
‭●‬ ‭Añadir una Columna:‬
‭SQL‬
‭ALTER‬‭TABLE‬ ‭reviews‬
‭ADD‬‭COLUMN‬ ‭review_text‬‭VARCHAR‬‭(‬‭500‬‭);‬

‭●‬ ‭Modificar el Tipo de Dato de una Columna:‬


‭SQL‬
‭ALTER‬‭TABLE‬ ‭reviews‬
‭ LTER‬‭COLUMN‬ ‭stars
A TYPE‬‭FLOAT‬‭;‬‭-- La sintaxis puede‬‭variar (por ejemplo, MODIFY COLUMN‬
‭en MySQL)‬

‭●‬ ‭Renombrar una Columna:‬


‭SQL‬
‭ALTER‬‭TABLE‬ ‭reviews‬
‭RENAME‬‭COLUMN‬ ‭submit_date‬‭TO‬ ‭submission_date;‬

‭●‬ ‭Eliminar una Columna:‬


‭SQL‬
‭ALTER‬‭TABLE‬ ‭Employees‬
‭DROP‬‭COLUMN‬ ‭Email;‬

‭ l comando ALTER TABLE‬‭24‬ ‭es fundamental para la evolución‬‭del esquema de una‬


E
‭base de datos. Las bases de datos rara vez son estáticas; los requisitos del negocio‬
‭cambian constantemente, y‬

‭ LTER TABLE proporciona la flexibilidad necesaria para adaptar el modelo de datos‬


A
‭sin perder la información existente. Esto resalta la naturaleza dinámica de la gestión‬
‭de bases de datos en entornos del mundo real. Permite realizar cambios en el‬
‭esquema‬‭in situ‬‭, lo que significa que los datos existentes‬‭se conservan mientras la‬
‭estructura de la tabla se ajusta a las nuevas necesidades. Esta capacidad es esencial‬
‭para mantener bases de datos operativas a lo largo del tiempo y para apoyar‬
‭prácticas de desarrollo ágiles. Sin ALTER TABLE, los cambios en el esquema‬
‭requerirían complejas migraciones de datos, lo que a menudo sería inviable.‬

‭6.3. DROP TABLE‬


‭ l comando DROP TABLE se utiliza para eliminar permanentemente una tabla‬
E
‭completa de la base de datos. Esta operación incluye la eliminación de todos sus‬
‭datos, índices y restricciones asociadas. Es una acción irreversible y requiere extrema‬
‭precaución, ya que los datos eliminados no pueden recuperarse fácilmente.‬‭24‬
‭●‬ ‭Sintaxis:‬‭DROP TABLE table_name;‬
‭●‬ ‭Ejemplo:‬
‭SQL‬
‭DROP‬‭TABLE‬ ‭customers;‬

‭ l énfasis en que DROP TABLE es una operación "permanente" y que requiere‬


E
‭"precaución"‬‭24‬ ‭subraya un aspecto crítico de la administración‬‭de bases de datos: la‬
‭prevención de la pérdida de datos. Este comando destaca los altos riesgos‬
‭involucrados en las operaciones DDL y la necesidad de estrategias robustas de copia‬
‭de seguridad y recuperación en entornos profesionales. La eliminación permanente‬
‭significa que los datos no son recuperables sin copias de seguridad, lo que convierte‬
‭a esta operación en una de alto impacto. Esto resalta la importancia de las copias de‬
‭seguridad de la base de datos, la gestión de transacciones (aunque‬

‭ ROP es DDL y a menudo se auto-confirma) y los controles de acceso estrictos. Para‬


D
‭un profesional, comprender el poder destructivo de DROP TABLE es primordial para la‬
‭gestión de riesgos y la garantía de la continuidad del negocio.‬

‭7. Lenguaje de Manipulación de Datos (DML) en SQL‬

‭ os comandos DML (Data Manipulation Language) se utilizan para interactuar y‬


L
‭gestionar los datos reales almacenados dentro de las tablas de la base de datos.‬
‭Estos comandos permiten añadir, modificar y eliminar filas de datos.‬‭25‬

‭7.1. INSERT‬

‭El comando INSERT se emplea para añadir nuevas filas (registros) a una tabla‬
‭ xistente. Los datos pueden insertarse una fila a la vez o múltiples filas a partir del‬
e
‭resultado de otra consulta.‬‭24‬
‭●‬ ‭Sintaxis (Fila Única):‬
‭SQL‬
‭INSERT‬‭INTO‬ ‭table_name (column1, column2,...)‬
‭VALUES‬ ‭(value1, value2,...);‬

‭●‬ ‭Sintaxis (Múltiples Filas desde SELECT):‬


‭SQL‬
‭INSERT‬‭INTO‬ ‭table_name
(column1, column2,...)‬
‭SELECT‬ ‭column1, column2,...‬
‭FROM‬ ‭other_table‬
‭WHERE‬ ‭criteria;‬

‭●‬ ‭Ejemplo:‬
‭SQL‬
‭INSERT‬‭INTO‬ ‭customers (first_name, last_name, email,‬‭phone_number)‬
‭VALUES‬ ‭(‬‭'Nick'‬‭,‬‭'Singh'‬‭,‬‭'nick.singh@datalemur.com'‬‭,‬‭'123-456-7890'‬‭);‬

‭ a capacidad de insertar datos tanto de forma individual como a partir de sentencias‬


L
‭SELECT‬‭28‬ ‭destaca diferentes estrategias de población‬‭de datos. Las inserciones de‬
‭una sola fila son comunes para la entrada de datos impulsada por aplicaciones (por‬
‭ejemplo, cuando un usuario envía un formulario), mientras que las inserciones de‬
‭varias filas a partir de una‬

‭ ELECT son cruciales para la migración de datos, los procesos ETL (Extracción,‬
S
‭Transformación y Carga) o la población de nuevas tablas a partir de otras existentes.‬
‭Esto demuestra la escalabilidad en la gestión de datos de SQL y su capacidad para la‬
‭transformación de datos a gran escala.‬

‭7.2. UPDATE‬

‭ l comando UPDATE se utiliza para modificar datos existentes en uno o más registros‬
E
‭(filas) de una tabla. La cláusula WHERE es fundamental para especificar qué filas‬
‭deben actualizarse; si se omite, la sentencia afectará a todas las filas de la tabla.‬‭24‬
‭●‬ ‭Sintaxis:‬
‭SQL‬
‭UPDATE table_name‬
‭SET‬ ‭column1‬‭=‬ ‭value1, column2‬‭=‬ ‭value2,...‬
‭WHERE‬‭condition‬‭;‬

‭●‬ ‭Ejemplo:‬‭Aumento de precios para libros de un autor‬‭específico.‬‭30‬


‭SQL‬
‭UPDATE bookshop‬
‭SET‬ ‭price‬‭=‬ ‭price‬‭*‬‭1.1‬
‭WHERE‬ ‭author‬‭=‬‭'Jane Austen'‬‭;‬

‭ a necesidad absoluta de la cláusula WHERE en las sentencias UPDATE‬‭30‬ ‭es una‬


L
‭consideración crítica de seguridad y precisión. La advertencia sobre omitirla‬‭30‬ ‭resalta‬
‭el potencial de una corrupción de datos catastrófica, enfatizando la importancia de‬
‭una construcción de consultas cuidadosa y pruebas rigurosas en escenarios del‬
‭mundo real. Modificar‬

t‭ odas‬‭las filas de forma no intencionada puede conducir‬‭a una pérdida o corrupción‬


‭masiva de datos, dejando la base de datos inutilizable o incorrecta. Esto subraya el‬
‭principio de "medir dos veces, cortar una vez" en las operaciones de base de datos.‬
‭Enseña que los comandos SQL, especialmente DML, tienen consecuencias inmediatas‬
‭y potencialmente irreversibles, lo que requiere una atención meticulosa a la cláusula‬
‭WHERE y, a menudo, copias de seguridad de datos previas o reversiones de‬
‭transacciones.‬

‭7.3. DELETE‬

‭ l comando DELETE se utiliza para eliminar registros (filas) existentes de una tabla. Al‬
E
‭igual que con UPDATE, la cláusula WHERE es esencial para especificar qué filas deben‬
‭eliminarse. Si se omite, se borrarán todas las filas de la tabla. Esta operación es‬
‭permanente y los datos eliminados no pueden recuperarse fácilmente.‬‭25‬
‭●‬ ‭Sintaxis:‬
‭SQL‬
‭DELETE‬‭FROM‬ ‭table_name‬
‭WHERE‬‭condition‬‭;‬
‭●‬ ‭Ejemplo (Eliminar un solo registro):‬‭32‬
‭SQL‬
‭DELETE‬‭FROM‬ ‭Students‬‭WHERE‬ ‭StudentID‬‭=‬‭2‬‭;‬

‭●‬ ‭Ejemplo (Eliminar múltiples registros):‬‭32‬


‭SQL‬
‭DELETE‬‭FROM‬ ‭Students‬‭WHERE‬ ‭LastName‬‭=‬‭'Doe'‬‭;‬

‭ a comparación entre DELETE y TRUNCATE‬‭25‬ ‭para la‬‭eliminación masiva de filas es‬


L
‭una consideración práctica valiosa. Aunque ambos comandos vacían una tabla,‬

‭ RUNCATE es más rápido y reinicia las columnas de identidad, pero DELETE permite‬
T
‭el uso de cláusulas WHERE y activa los disparadores (triggers). Esta diferencia‬
‭destaca la existencia de herramientas distintas para necesidades diferentes, con el‬
‭rendimiento y el comportamiento transaccional como diferenciadores clave.‬
‭TRUNCATE es superior para vaciar una tabla completa cuando la velocidad y el‬
‭reinicio de las columnas de identidad son importantes, y no se necesita un registro a‬
‭nivel de fila ni la activación de disparadores. Por otro lado, DELETE es necesario para‬
‭eliminaciones condicionales o cuando se requieren disparadores o registros‬
‭detallados.‬

‭8. Lenguaje de Consulta de Datos (DQL) en SQL‬

‭ os comandos DQL (Data Query Language) se utilizan principalmente para recuperar‬


L
‭datos de la base de datos según reglas especificadas. El comando DQL central es‬
‭SELECT.‬‭25‬

‭8.1. SELECT y WHERE‬

‭●‬ ‭Sentencia SELECT:‬‭Es el comando SQL más fundamental,‬‭utilizado para‬


r‭ ecuperar datos de una o más tablas. Se pueden especificar las columnas a‬
‭recuperar o usar * para seleccionar todas las columnas.‬‭24‬
‭○‬ ‭Sintaxis:‬‭SELECT column1, column2,... FROM table_name;‬‭o SELECT * FROM‬
‭table_name;‬
‭○‬ ‭Ejemplo:‬
‭SQL‬
‭SELECT‬‭*‬‭FROM‬ ‭Customers;‬
‭SELECT‬ ‭FirstName, LastName‬‭FROM‬ ‭Customers;‬

‭●‬ ‭Cláusula WHERE:‬‭Se utiliza para filtrar filas basándose‬‭en una condición‬
‭especificada. Siempre debe ir después de la sentencia FROM.‬‭24‬
‭○‬ ‭Sintaxis:‬‭SELECT... FROM table_name WHERE condition;‬
‭○‬ ‭Ejemplo:‬
‭SQL‬
‭SELECT‬‭*‬‭FROM‬ ‭Customers‬‭WHERE‬ ‭City‬‭=‬‭'New York'‬‭;‬

‭ a combinación de SELECT (qué datos obtener) y WHERE (qué filas obtener)‬‭24‬


L
‭constituye la base de la recuperación precisa de datos. Esto subraya la naturaleza‬
‭declarativa de SQL, donde los usuarios especifican‬

‭ ué‬‭datos desean, no‬‭cómo‬‭obtenerlos, lo que permite‬‭al motor de la base de datos‬


q
‭optimizar el proceso de recuperación. Esta combinación es esencial para la eficiencia‬
‭y la relevancia. En lugar de recuperar todos los datos y luego filtrarlos en la capa de la‬
‭aplicación, SQL permite el filtrado en la fuente, lo que reduce la transferencia de‬
‭datos y la sobrecarga de procesamiento. Este es un principio central de la interacción‬
‭eficiente con la base de datos.‬

‭8.2. ORDER BY‬

‭ a cláusula ORDER BY se utiliza para ordenar el conjunto de resultados de una‬


L
‭consulta en orden ascendente (ASC) o descendente (DESC) basándose en una o más‬
‭columnas. ASC es el orden predeterminado. Esta cláusula debe aparecer después de‬
‭las cláusulas FROM, WHERE, GROUP BY y HAVING.‬‭34‬
‭●‬ ‭Sintaxis:‬‭SELECT... FROM table_name ORDER BY column1,‬‭column2;‬
‭●‬ ‭Ejemplo:‬
‭SQL‬
‭SELECT‬ ‭movie_name‬‭FROM‬ ‭movie_theater‬
‭ORDER‬‭BY‬ ‭movie_name‬‭DESC‬‭;‬‭-- Ordena nombres de películas‬‭en orden descendente‬
‭ a clara distinción entre ORDER BY (para ordenar/presentación) y GROUP BY (para‬
L
‭agregación/resumen)‬‭34‬ ‭es crucial. Un error común‬‭para los principiantes es confundir‬
‭sus roles o su ubicación incorrecta en la consulta. Comprender que‬

‭ RDER BY actúa sobre el‬‭conjunto de resultados final‬‭después de todas las demás‬


O
‭operaciones es clave. La advertencia sobre "Colocar ORDER BY antes de GROUP BY"‬
‭34‬
‭indica que la base de datos procesa‬

‭ ROUP BY primero. Esto revela el orden lógico de las operaciones dentro de una‬
G
‭consulta SQL: FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY ->‬
‭LIMIT. Comprender este orden de ejecución es vital para escribir consultas correctas‬
‭y eficientes, ya que dicta cuándo ocurre el filtrado, la agregación y la ordenación.‬

‭8.3. GROUP BY y HAVING‬

‭●‬ ‭Cláusula GROUP BY:‬‭Se utiliza para agrupar filas que‬‭tienen los mismos valores‬
‭ n columnas especificadas en filas de resumen. Se usa casi siempre con‬
e
‭funciones de agregación (COUNT(), SUM(), AVG(), MAX(), MIN()) para realizar‬
‭cálculos en cada grupo.‬‭34‬
‭○‬ ‭Sintaxis:‬‭SELECT column1, AGGREGATE_FUNCTION(column2)‬‭FROM‬
‭table_name GROUP BY column1;‬
‭○‬ ‭Ejemplo:‬
‭SQL‬
‭SELECT‬ ‭movie_genre,‬‭AVG‬‭(guest_total)‬‭AS‬ ‭average_guests‬
‭FROM‬ ‭movie_theater‬
‭GROUP‬‭BY‬ ‭movie_genre;‬

‭●‬ ‭Cláusula HAVING:‬‭Se utiliza para filtrar registros‬‭agrupados basándose en‬


‭ ondiciones aplicadas a funciones de agregación. Es similar a WHERE pero opera‬
c
‭sobre los resultados de GROUP BY.‬‭34‬
‭○‬ ‭Sintaxis:‬‭SELECT... FROM table_name GROUP BY column(s)‬‭HAVING‬
‭aggregate_condition;‬
‭○‬ ‭Ejemplo:‬
‭SQL‬
‭SELECT‬ ‭movie_genre,‬‭AVG‬‭(guest_total)‬‭AS‬ ‭avg_guests‬
‭FROM‬ ‭movie_theater‬
‭GROUP‬‭BY‬ ‭movie_genre‬
‭HAVING‬‭AVG‬‭(guest_total)‬‭>‬‭100‬‭;‬

‭ a distinción entre WHERE (filtrado de filas individuales‬‭antes‬‭de agrupar) y HAVING‬


L
‭(filtrado de‬‭resultados agrupados‬‭después de la agregación)‬‭34‬ ‭representa un salto‬
‭conceptual crucial en las consultas SQL. Esto pone de manifiesto que el filtrado de‬
‭datos se produce en etapas distintas, cada una con su propósito y comando‬
‭específicos, lo que permite realizar consultas analíticas complejas.‬

‭ HERE es para el filtrado inicial a nivel de fila, reduciendo el conjunto de datos antes‬
W
‭de que se produzca cualquier agregación. HAVING luego filtra los‬‭resultados de la‬
‭agregación‬‭. Esta diferencia es esencial para consultas‬‭analíticas complejas (por‬
‭ejemplo, "encontrar departamentos con un salario promedio > X" frente a "encontrar‬
‭empleados con un salario > Y").‬

‭8.4. JOIN‬

‭ a cláusula JOIN se utiliza para combinar filas de dos o más tablas basándose en una‬
L
‭columna relacionada entre ellas. Esto es esencial para obtener información completa‬
‭de conjuntos de datos normalizados donde los datos relacionados se distribuyen en‬
‭varias tablas.‬‭35‬
‭●‬ ‭Tipos de JOIN:‬
‭○‬ ‭INNER JOIN:‬‭Devuelve solo las filas que tienen valores‬‭coincidentes en‬
‭ambas‬‭tablas según la condición de unión. Es el tipo‬‭de unión más común.‬‭39‬
‭SQL‬
‭SELECT‬ ‭e.first_name, d.department_name‬
‭FROM‬ ‭employees‬‭AS‬ ‭e‬
‭INNER‬‭JOIN‬ ‭departments‬‭AS‬ ‭d‬‭ON‬ ‭e.department_id‬‭=‬ ‭d.department_id;‬

‭○‬ ‭LEFT (OUTER) JOIN:‬‭Devuelve todos los registros de‬‭la tabla‬‭izquierda‬‭y los‬
r‭ egistros coincidentes de la tabla‬‭derecha‬‭. Si no‬‭existe una coincidencia en la‬
‭tabla derecha, se devuelven valores NULL para las columnas de la tabla‬
‭derecha.‬‭39‬
‭SQL‬
‭SELECT‬ ‭o.order_id, c.customer_name‬
‭FROM‬ ‭Orders‬‭AS‬ ‭o‬
‭LEFT‬‭JOIN‬ ‭Customers‬‭AS‬ ‭c‬‭ON‬ ‭o.customer_id‬‭=‬ ‭c.customer_id;‬
‭○‬ ‭RIGHT (OUTER) JOIN:‬‭Devuelve todos los registros de‬‭la tabla‬‭derecha‬‭y los‬
r‭ egistros coincidentes de la tabla‬‭izquierda‬‭. Si no‬‭existe una coincidencia en la‬
‭tabla izquierda, se devuelven valores NULL para las columnas de la tabla‬
‭izquierda.‬‭39‬
‭SQL‬
‭SELECT‬ ‭o.order_id, c.customer_name‬
‭FROM‬ ‭Orders‬‭AS‬ ‭o‬
‭RIGHT‬‭JOIN‬ ‭Customers‬‭AS‬ ‭c‬‭ON‬ ‭o.customer_id‬‭=‬ ‭c.customer_id;‬

‭○‬ ‭FULL (OUTER) JOIN:‬‭Devuelve todos los registros cuando‬‭hay una‬


‭ oincidencia en la tabla izquierda o en la derecha. Si no existe una‬
c
‭coincidencia en ninguna de las tablas, se devuelven valores NULL para el lado‬
‭no coincidente.‬‭39‬

‭ ota: No todas las bases de datos SQL admiten FULL OUTER JOIN‬
N
‭directamente. 40‬
‭SQL‬
‭SELECT‬ ‭e.first_name, d.department_name‬
‭FROM‬ ‭employees‬‭AS‬ ‭e‬
‭FULL‬‭OUTER‬‭JOIN‬ ‭departments‬‭AS‬ ‭d‬‭ON‬ ‭e.department_id‬‭=‬ ‭d.department_id;‬

‭ os diferentes tipos de operaciones JOIN‬‭39‬ ‭proporcionan‬‭un control matizado sobre‬


L
‭la integridad de los datos, permitiendo a los analistas elegir una "perspectiva" para su‬
‭conjunto de datos combinado. Ya sea que se necesiten solo datos coincidentes (‬

I‭NNER), todos los datos de un lado (LEFT/RIGHT) o una unión completa de ambos‬
‭(FULL), la elección de la unión impacta directamente el alcance y la interpretación de‬
‭los resultados. Esto es un concepto poderoso para el análisis de datos, ya que‬
‭permite a los usuarios responder preguntas como "¿Qué clientes‬‭han‬‭realizado‬
‭pedidos?" (INNER), "Mostrar todos los clientes, y sus pedidos si los tienen" (LEFT), o‬
‭"Mostrar todos los departamentos, y los empleados en ellos si los hay, o los‬
‭departamentos sin empleados y los empleados sin departamento" (FULL). La elección‬
‭de la unión es una consecuencia directa de la pregunta analítica que se plantea.‬

‭8.5. Ejercicios Resueltos‬


‭Ejercicio 1: Selección y Filtrado Básico‬

‭●‬ ‭Problema:‬‭Dada una tabla Productos con columnas ProductoID,‬‭Nombre,‬


‭Categoría, PrecioUnitario.‬
‭1.‬ ‭Selecciona todos los productos de la categoría 'Electrónica'.‬
‭2.‬ ‭Selecciona el Nombre y PrecioUnitario de los productos cuyo precio sea‬
‭mayor a $100.‬
‭ ‬ ‭Solución:‬

‭ QL‬
S
‭-- Asumiendo que la tabla Productos ya existe y tiene datos:‬
‭-- CREATE TABLE Products (‬
‭-- product_id INT PRIMARY KEY,‬
‭-- product_name VARCHAR(100),‬
‭-- category VARCHAR(50),‬
‭-- unit_price DECIMAL(10, 2)‬
‭-- );‬
‭-- INSERT INTO Products VALUES (1, 'Laptop', 'Electronics', 500.00), (2, 'Smartphone',‬
‭'Electronics', 300.00), (3, 'Book', 'Books', 25.00);‬

‭-- 1. Seleccionar todos los productos de la categoría 'Electronics' [24, 25, 34]‬
‭SELECT‬‭*‬
‭FROM‬ ‭Products‬
‭WHERE‬ ‭Category‬‭=‬‭'Electronics'‬‭;‬

‭-- 2. Seleccionar nombre y precio de productos con precio > $100 [24, 25, 34]‬
‭SELECT‬ ‭Nombre, PrecioUnitario‬
‭FROM‬ ‭Products‬
‭WHERE‬ ‭PrecioUnitario‬‭>‬‭100‬‭;‬

‭Ejercicio 2: Agregación y Ordenación‬

‭●‬ ‭Problema:‬‭Dada una tabla Ventas con columnas VentaID,‬‭ProductoID,‬


‭CantidadVendida, FechaVenta, PrecioTotal.‬
‭1.‬ ‭Calcula el PrecioTotal promedio de todas las ventas.‬
‭2.‬ ‭Calcula el PrecioTotal total agrupado por FechaVenta y ordénalo por fecha.‬
‭3.‬ ‭Encuentra las FechaVenta donde el PrecioTotal total fue superior a $500.‬
‭●‬ ‭Solución:‬
‭ QL‬
S
‭-- Asumiendo que la tabla Ventas ya existe y tiene datos:‬
‭-- CREATE TABLE Sales (‬
‭-- sale_id INT PRIMARY KEY,‬
‭-- product_id INT,‬
‭-- quantity_sold INT,‬
‭-- sale_date DATE,‬
‭-- total_price DECIMAL(10, 2)‬
‭-- );‬
‭-- INSERT INTO Sales VALUES (1, 101, 5, '2024-01-01', 2500.00), (2, 102, 3, '2024-01-02', 900.00),‬
‭(3, 103, 2, '2024-01-02', 60.00);‬

‭-- 1. PrecioTotal promedio de todas las ventas [34, 37, 38]‬


‭SELECT‬‭AVG‬‭(PrecioTotal)‬‭AS‬ ‭PrecioPromedio‬
‭FROM‬ ‭Ventas;‬

‭-- 2. PrecioTotal total agrupado por FechaVenta, ordenado por fecha [34, 36]‬
‭SELECT‬ ‭FechaVenta,‬‭SUM‬‭(PrecioTotal)‬‭AS‬ ‭TotalPorFecha‬
‭FROM‬ ‭Ventas‬
‭GROUP‬‭BY‬ ‭FechaVenta‬
‭ORDER‬‭BY‬ ‭FechaVenta‬‭ASC‬‭;‬

‭-- 3. FechaVenta donde el PrecioTotal total fue superior a $500 [34, 36]‬
‭SELECT‬ ‭FechaVenta,‬‭SUM‬‭(PrecioTotal)‬‭AS‬ ‭TotalPorFecha‬
‭FROM‬ ‭Ventas‬
‭GROUP‬‭BY‬ ‭FechaVenta‬
‭HAVING‬‭SUM‬‭(PrecioTotal)‬‭>‬‭500‬‭;‬

‭Ejercicio 3: Combinación de Tablas (JOIN)‬

‭●‬ ‭Problema:‬‭Dadas las tablas Empleados (EmpleadoID,‬‭Nombre, DepartamentoID)‬


‭y Departamentos (DepartamentoID, NombreDepartamento).‬
‭1.‬ ‭Realiza un INNER JOIN para listar los nombres de los empleados junto con el‬
‭nombre de su departamento.‬
‭2.‬ ‭Realiza un LEFT JOIN para listar todos los departamentos y, si tienen‬
‭ mpleados, sus nombres.‬
e
‭‬ S
● ‭ olución:‬
‭ QL‬
S
‭-- Asumiendo que las tablas Empleados y Departamentos existen‬
‭-- CREATE TABLE Departamentos (‬
‭-- DepartamentoID INT PRIMARY KEY,‬
‭-- NombreDepartamento VARCHAR(50)‬
‭-- );‬
‭-- INSERT INTO Departamentos VALUES (1, 'HR'), (2, 'Engineering'), (3, 'Sales');‬
‭-- CREATE TABLE Empleados (‬
‭-- EmpleadoID INT PRIMARY KEY,‬
‭-- Nombre VARCHAR(50),‬
‭-- DepartamentoID INT,‬
‭-- FOREIGN KEY (DepartamentoID) REFERENCES Departamentos(DepartamentoID)‬
‭-- );‬
‭-- INSERT INTO Empleados VALUES (101, 'Alice', 1), (102, 'Bob', 2), (103, 'Charlie', NULL);‬

‭-- 1. INNER JOIN: Empleados con sus departamentos [40, 41, 42, 43]‬
‭SELECT‬ ‭E.Nombre, D.NombreDepartamento‬
‭FROM‬ ‭Empleados‬‭AS‬ ‭E‬
‭INNER‬‭JOIN‬ ‭Departamentos‬‭AS‬ ‭D‬‭ON‬ ‭E.DepartamentoID‬‭=‬ ‭D.DepartamentoID;‬

‭-- 2. LEFT JOIN: Todos los departamentos y sus empleados (si los tienen) [40, 41, 42, 43]‬
‭SELECT‬ ‭D.NombreDepartamento, E.Nombre‬
‭FROM‬ ‭Departamentos‬‭AS‬ ‭D‬
‭LEFT‬‭JOIN‬ ‭Empleados‬‭AS‬ ‭E‬‭ON‬ ‭D.DepartamentoID‬‭=‬ ‭E.DepartamentoID;‬

‭Conclusión‬

‭ ste informe ha proporcionado una visión integral de los conceptos fundamentales en‬
E
‭la programación Python y la gestión de bases de datos SQL. Se han explorado las‬
‭versátiles estructuras de datos de Python, como listas y diccionarios, comprendiendo‬
‭sus características, creación, acceso y manipulación. Se ha examinado a fondo el‬
‭poder del flujo de control con los bucles for y while, junto con las sentencias break y‬
‭continue, y las capacidades de toma de decisiones de las condicionales if-elif-else.‬

‭ n el ámbito de las bases de datos, se han profundizado en las etapas cruciales del‬
E
‭diseño, destacando el papel de los ERD en la conceptualización de las relaciones de‬
‭ atos y la importancia de la normalización para la integridad y eficiencia de los datos.‬
d
‭Luego, se ha pasado a la aplicación práctica de SQL, cubriendo los comandos DDL‬
‭para estructurar bases de datos, los comandos DML para gestionar datos y los‬
‭comandos DQL para una potente recuperación de información.‬

‭ a inclusión de ejercicios resueltos y preguntas teóricas básicas a lo largo del informe‬


L
‭tiene como objetivo solidificar la comprensión y proporcionar experiencia práctica,‬
‭preparando a los estudiantes para los desafíos de programación y datos del mundo‬
‭real. Dominar estos temas fundamentales es un paso indispensable para alcanzar la‬
‭competencia en el desarrollo de software y el análisis de datos.‬

‭Apéndice A: Referencia Rápida de Funciones‬

‭Tabla de Funciones Comunes de Python‬

‭ sta tabla proporciona una referencia rápida para los métodos y funciones‬
E
‭incorporadas de Python más utilizados, relevantes para las listas y diccionarios. Es‬
‭una herramienta valiosa para que los estudiantes recuerden rápidamente la sintaxis y‬
‭el propósito sin tener que buscar en una documentación extensa.‬

‭Función/Método Python‬ ‭Descripción‬

‭list()‬ ‭Crea una lista vacía o convierte un iterable en‬


‭una lista.‬‭2‬

‭append(item)‬ ‭Añade un solo elemento al final de la lista.‬‭3‬

‭extend(iterable)‬ ‭Añade múltiples elementos de un iterable al‬


‭final de la lista.‬‭3‬

‭insert(index, item)‬ ‭Inserta un elemento en una posición específica‬


‭de la lista.‬‭3‬
‭remove(value)‬ ‭Elimina la primera ocurrencia de un valor‬
‭específico de la lista.‬‭2‬

‭pop(index)‬ ‭Elimina y devuelve el elemento en el índice‬


‭dado (o el último si no se especifica).‬‭2‬

‭clear()‬ ‭Elimina todos los elementos de la lista.‬‭3‬

‭sort()‬ ‭Ordena los elementos de la lista en su lugar‬


‭(modifica la lista original).‬‭3‬

‭reverse()‬ ‭Invierte el orden de los elementos de la lista en‬


‭su lugar.‬‭3‬

‭copy()‬ ‭Retorna una copia superficial de la lista.‬

‭len(list)‬ ‭Devuelve el número de elementos en la lista.‬‭5‬

‭min(list)‬ ‭Retorna el elemento más pequeño de la lista.‬‭2‬

‭max(list)‬ ‭Retorna el elemento más grande de la lista.‬‭2‬

‭sum(list)‬ ‭ alcula la suma de todos los elementos‬


C
‭numéricos en la lista.‬

‭sorted(iterable)‬ ‭ etorna una nueva lista ordenada a partir de un‬


R
‭iterable (no modifica el original).‬

‭enumerate(iterable)‬ ‭Retorna un objeto enumerate (pares de índice,‬


‭valor).‬‭2‬

‭zip(iterable1, iterable2,...)‬ ‭ grega elementos de múltiples iterables en‬


A
‭tuplas.‬

‭dict()‬ ‭Crea un diccionario vacío o a partir de pares‬


‭clave-valor.‬‭8‬

‭dict[key]‬ ‭Accede al valor asociado a una clave o‬


‭añade/actualiza un par.‬‭8‬

‭get(key, default)‬ ‭Retorna el valor para la clave; si no se‬


‭encuentra, devuelve default o None.‬‭8‬
‭del dict[key]‬ ‭Elimina un par clave-valor del diccionario.‬‭8‬

‭pop(key, default)‬ ‭Elimina la clave y retorna su valor; si no se‬


‭encuentra, devuelve default o error.‬‭8‬

‭popitem()‬ ‭Elimina y retorna un par clave-valor (el último‬


‭en Python 3.7+).‬‭8‬

‭keys()‬ ‭Retorna una vista de todas las claves del‬


‭diccionario.‬‭8‬

‭values()‬ ‭Retorna una vista de todos los valores del‬


‭diccionario.‬‭8‬

‭items()‬ ‭Retorna una vista de todos los pares‬


‭clave-valor como tuplas.‬‭8‬

‭copy.copy(dict)‬ ‭Crea una copia superficial del diccionario.‬‭8‬

‭copy.deepcopy(dict)‬ ‭Crea una copia profunda del diccionario‬


‭(requiere import copy).‬‭8‬

‭Tabla de Comandos y Funciones Comunes de SQL‬

‭ sta tabla resume los comandos DDL, DML y DQL más utilizados, así como las‬
E
‭funciones de agregación, cadena y fecha más comunes en SQL. Sirve como una‬
‭referencia rápida para las operaciones fundamentales de bases de datos.‬

‭Tipo/Categoría‬ ‭Comando/Función SQL‬ ‭Descripción‬

‭ DL (Data Definition‬
D ‭CREATE TABLE‬ ‭ rea una nueva tabla en la‬
C
‭Language)‬ ‭base de datos con columnas y‬
‭restricciones definidas.‬‭24‬

‭ALTER TABLE‬ ‭ odifica la estructura de una‬


M
‭tabla existente‬
‭(añadir/eliminar/modificar‬
‭columnas o restricciones).‬‭24‬
‭DROP TABLE‬ ‭ limina permanentemente una‬
E
‭tabla de la base de datos,‬
‭incluyendo todos sus datos.‬‭24‬

‭TRUNCATE TABLE‬ ‭ limina todas las filas de una‬


E
‭tabla de forma rápida, pero‬
‭mantiene su estructura.‬‭25‬

‭ ML (Data Manipulation‬
D ‭INSERT INTO‬ ‭Añade nuevas filas (registros)‬
‭Language)‬ ‭a una tabla.‬‭24‬

‭UPDATE‬ ‭Modifica datos existentes en‬


‭una o más filas de una tabla.‬‭24‬

‭DELETE FROM‬ ‭ limina filas existentes de una‬


E
‭tabla, basándose en una‬
‭condición.‬‭25‬

‭ QL (Data Query‬
D ‭SELECT‬ ‭Recupera datos de una o más‬
‭Language)‬ ‭tablas.‬‭24‬

‭WHERE‬ ‭Filtra filas basándose en una‬


‭condición específica.‬‭24‬

‭GROUP BY‬ ‭ grupa filas que tienen los‬


A
‭mismos valores en columnas‬
‭especificadas en filas de‬
‭resumen.‬‭34‬

‭HAVING‬ ‭ iltra registros agrupados‬


F
‭basándose en condiciones‬
‭aplicadas a funciones de‬
‭agregación.‬‭34‬

‭ORDER BY‬ ‭ rdena el conjunto de‬


O
‭resultados en orden‬
‭ascendente o descendente.‬‭34‬

‭INNER JOIN‬ ‭ evuelve solo las filas con‬


D
‭valores coincidentes en‬
‭ambas tablas.‬‭40‬

‭LEFT JOIN‬ ‭ evuelve todos los registros‬


D
‭de la tabla izquierda y los‬
‭coincidentes de la derecha.‬‭40‬

‭RIGHT JOIN‬ ‭ evuelve todos los registros‬


D
‭de la tabla derecha y los‬
‭coincidentes de la izquierda.‬‭40‬

‭FULL OUTER JOIN‬ ‭ evuelve todos los registros‬


D
‭cuando hay una coincidencia‬
‭en la tabla izquierda o en la‬
‭derecha.‬‭40‬

‭Funciones de Agregación‬ ‭COUNT()‬ ‭ uenta el número de filas o‬


C
‭valores no nulos en una‬
‭columna.‬‭37‬

‭SUM()‬ ‭Calcula la suma de los valores‬


‭de una columna numérica.‬‭37‬

‭AVG()‬ ‭ alcula el promedio de los‬


C
‭valores de una columna‬
‭numérica.‬‭37‬

‭MAX()‬ ‭Retorna el valor máximo de‬


‭una columna.‬‭37‬

‭MIN()‬ ‭Retorna el valor mínimo de‬


‭una columna.‬‭37‬

‭Funciones de Cadena‬ ‭CONCAT()‬ ‭Concatena dos o más‬


‭cadenas de texto.‬‭45‬

‭SUBSTRING()‬ ‭Extrae una parte de una‬


‭cadena de texto.‬‭45‬

‭LENGTH() / CHAR_LENGTH()‬ ‭Devuelve la longitud de una‬


‭cadena.‬‭46‬

‭LOWER()‬ ‭Convierte una cadena a‬


‭minúsculas.‬‭45‬

‭UPPER()‬ ‭Convierte una cadena a‬


‭mayúsculas.‬‭45‬

‭TRIM()‬ ‭Elimina espacios en blanco u‬


‭otros caracteres del‬
‭inicio/final de una cadena.‬‭45‬

‭REPLACE()‬ ‭ eemplaza todas las‬


R
‭ocurrencias de una‬
‭subcadena por otra.‬‭45‬

‭INSTR()‬ ‭ usca la posición de una‬


B
‭subcadena dentro de una‬
‭cadena.‬‭45‬

‭Funciones de Fecha‬ ‭ ETDATE()/NOW()/CURRENT_‬


G ‭Retorna la fecha y hora‬
‭DATE‬ ‭actuales.‬‭47‬

‭DATEADD()/ADDDATE()‬ ‭Añade un intervalo de tiempo‬


‭a una fecha.‬‭47‬

‭DATEDIFF()/TIMESTAMPDIFF()‬ ‭Calcula la diferencia entre dos‬


‭fechas.‬‭47‬

‭DATEPART()/EXTRACT()‬ ‭Extrae partes específicas de‬


‭una fecha (año, mes, día).‬‭47‬

‭FORMAT()/TO_CHAR()‬ ‭ ormatea una fecha en un‬


F
‭formato de cadena‬
‭específico.‬‭47‬

‭Apéndice B: Ejercicios Propuestos‬

‭ sta sección ofrece ejercicios adicionales para consolidar la comprensión de los‬


E
‭conceptos de Python y SQL presentados en el informe. Se anima a los estudiantes a‬
‭intentar resolverlos antes de consultar las soluciones en el Apéndice C.‬

‭Ejercicios Propuestos de Python‬


‭Listas Unidimensionales‬

‭1.‬ ‭Filtrado de Elementos:‬‭Dada una lista de números enteros‬‭numeros = , crea una‬


‭ ueva lista que contenga solo los números pares.‬
n
‭ .‬ ‭Unión de Listas:‬‭Dadas dos listas lista1 = ['a', 'b',‬‭'c'] y lista2 = ['d', 'e', 'f'], crea‬
2
‭una tercera lista que sea la concatenación de lista1 y lista2. Luego, añade un‬
‭elemento 'g' al final de la nueva lista.‬

‭Diccionarios‬

‭1.‬ ‭Actualización Condicional:‬‭Tienes un diccionario de‬‭productos y sus precios:‬


‭ recios = {'laptop': 1200, 'mouse': 25, 'teclado': 75}. Si el precio de un producto es‬
p
‭menor a $50, auméntalo en un 10%. Imprime el diccionario resultante.‬
‭ .‬ ‭Inversión de Clave-Valor:‬‭Dado un diccionario capitales‬‭= {'España': 'Madrid',‬
2
‭'Francia': 'París', 'Alemania': 'Berlín'}, crea un nuevo diccionario donde los valores‬
‭originales sean las claves y las claves originales sean los valores.‬

‭Ciclos (Loops)‬

‭1.‬ ‭Contador Regresivo:‬‭Escribe un programa que use un‬‭bucle while para contar‬
‭ esde 10 hasta 1, imprimiendo cada número. Después de llegar a 1, imprime‬
d
‭"¡Despegue!".‬
‭ .‬ ‭Validación de Entrada:‬‭Pide al usuario que ingrese‬‭una contraseña. El bucle‬
2
‭debe continuar pidiendo la contraseña hasta que el usuario ingrese‬
‭"PythonEsGenial". Una vez que la ingrese correctamente, imprime "Acceso‬
‭concedido.".‬

‭Condicionales‬

‭1.‬ ‭Clasificación de Edad:‬‭Pide al usuario su edad. Si‬‭la edad es menor de 13,‬


i‭mprime "Niño". Si está entre 13 y 19 (inclusive), imprime "Adolescente". De lo‬
‭contrario, imprime "Adulto".‬
‭2.‬ ‭Día de la Semana:‬‭Pide al usuario un número del 1 al 7. Usando if-elif-else,‬
i‭mprime el día de la semana correspondiente (1 para Lunes, 2 para Martes, etc.).‬
‭Si el número no está en el rango, imprime "Número inválido.".‬

‭Ejercicios Propuestos de SQL‬

‭Diseño de Bases de Datos (Conceptual)‬

‭1.‬ ‭Identificación de Componentes ERD:‬‭Para un sistema‬‭de gestión de una‬


‭ iblioteca, identifica al menos 3 entidades, 2 atributos para cada entidad y 2‬
b
‭relaciones entre ellas. Describe la cardinalidad de esas relaciones.‬

‭Código SQL para Creación de Estructuras (DDL)‬

‭1.‬ ‭Creación de Tabla con Clave Foránea:‬‭Crea dos tablas:‬‭Autores (AutorID INT‬
‭ RIMARY KEY, NombreAutor VARCHAR(100)) y Libros (LibroID INT PRIMARY KEY,‬
P
‭Titulo VARCHAR(255), AutorID INT). La tabla Libros debe tener una clave foránea‬
‭que referencie a Autores.‬
‭ .‬ ‭Modificación de Tabla:‬‭A la tabla Libros creada en‬‭el ejercicio anterior, añade‬
2
‭una nueva columna AnioPublicacion de tipo INT. Luego, modifica el tipo de dato‬
‭de Titulo a VARCHAR(300).‬

‭Manipulación de Información (DML)‬

‭1.‬ ‭Inserción Múltiple:‬‭Inserta al menos 3 autores en‬‭la tabla Autores y 5 libros en la‬
t‭ abla Libros (asegurándote de que los AutorID sean válidos).‬
‭ .‬ ‭Actualización Condicional:‬‭Actualiza el AnioPublicacion‬‭de todos los libros‬
2
‭publicados antes del año 2000 a 1999.‬
‭3.‬ ‭Eliminación Específica:‬‭Elimina de la tabla Libros‬‭todos los libros cuyo título‬
‭contenga la palabra "Historia".‬

‭Consultas (DQL)‬

‭1.‬ ‭Selección con Filtrado y Ordenación:‬‭Selecciona el‬‭Titulo y AnioPublicacion de‬


t‭ odos los libros publicados después de 2010, ordenados por AnioPublicacion de‬
‭forma descendente.‬
‭2.‬ ‭Agregación con Agrupación:‬‭Calcula el número total‬‭de libros por AutorID.‬
‭3.‬ ‭Filtrado de Agregados:‬‭Encuentra los AutorID que tienen‬‭más de 2 libros‬
‭publicados.‬
‭4.‬ ‭Combinación de Tablas (JOIN):‬‭Realiza un INNER JOIN‬‭entre Autores y Libros‬
‭para mostrar el NombreAutor y el Titulo de cada libro.‬
‭5.‬ ‭LEFT JOIN para Autores sin Libros:‬‭Realiza un LEFT‬‭JOIN entre Autores y Libros‬
‭para listar todos los autores y, si tienen libros, sus títulos. Incluye también a los‬
‭autores que no tienen libros registrados.‬

‭Apéndice C: Soluciones a Ejercicios Propuestos‬

‭Soluciones a Ejercicios Propuestos de Python‬

‭Listas Unidimensionales‬

‭1.‬ ‭Filtrado de Elementos:‬


‭Python‬
‭ umeros =‬
n
‭numeros_pares =‬
‭for‬ ‭num‬‭in‬ ‭numeros:‬
‭if‬ ‭num %‬‭2‬ ‭==‬‭0‬‭:‬
‭numeros_pares.append(num)‬
‭print(‬‭f"Números pares:‬‭{numeros_pares}‬‭"‬‭)‬
‭# Output: Números pares:‬

‭2.‬ ‭Unión de Listas:‬


‭Python‬
l‭ista1 = [‬‭'a'‬‭,‬‭'b'‬‭,‬‭'c'‬‭]‬
‭lista2 = [‬‭'d'‬‭,‬‭'e'‬‭,‬‭'f'‬‭]‬
‭nueva_lista = lista1 + lista2‬
‭nueva_lista.append(‬‭'g'‬‭)‬
‭print(‬‭f"Nueva lista:‬‭{nueva_lista}‬‭"‬‭)‬
‭# Output: Nueva lista: ['a', 'b', 'c', 'd', 'e', 'f', 'g']‬

‭Diccionarios‬

‭1.‬ ‭Actualización Condicional:‬


‭Python‬
‭precios = {‬‭'laptop'‬‭:‬‭1200‬‭,‬‭'mouse'‬‭:‬‭25‬‭,‬‭'teclado'‬‭:‬‭75‬‭}‬
‭for‬ ‭producto, precio‬‭in‬ ‭precios.items():‬
‭if‬ ‭precio <‬‭50‬‭:‬
‭precios[producto] = precio *‬‭1.10‬‭# Aumenta‬‭10%‬
‭print(‬‭f"Precios actualizados:‬‭{precios}‬‭"‬‭)‬
‭# Output: Precios actualizados: {'laptop': 1200, 'mouse': 27.5, 'teclado': 75}‬

‭2.‬ ‭Inversión de Clave-Valor:‬


‭Python‬
‭ apitales = {‬‭'España'‬‭:‬‭'Madrid'‬‭,‬‭'Francia'‬‭:‬‭'París'‬‭,‬‭'Alemania'‬‭:‬‭'Berlín'‬‭}‬
c
‭capitales_invertido = {valor: clave‬‭for‬ ‭clave, valor‬‭in‬ ‭capitales.items()}‬
‭print(‬‭f"Diccionario invertido:‬‭{capitales_invertido}‬‭"‬‭)‬
‭# Output: Diccionario invertido: {'Madrid': 'España', 'París': 'Francia', 'Berlín': 'Alemania'}‬

‭Ciclos (Loops)‬

‭1.‬ ‭Contador Regresivo:‬


‭Python‬
‭contador =‬‭10‬
‭while‬ ‭contador >=‬‭1‭:‬ ‬
‭print(contador)‬
‭contador -=‬‭1‬
‭print(‬‭"¡Despegue!"‬‭)‬
‭ Output:‬
#
‭# 10‬
‭#...‬
‭# 1‬
‭# ¡Despegue!‬

‭2.‬ ‭Validación de Entrada:‬


‭Python‬
‭contrasena_correcta =‬‭"PythonEsGenial"‬
‭while‬‭True‬‭:‬
‭contrasena_ingresada =‬‭input‬‭(‬‭"Ingresa la contraseña:‬‭"‬‭)‬
‭if‬ ‭contrasena_ingresada == contrasena_correcta:‬
‭print(‬‭"Acceso concedido."‬‭)‬
‭break‬
‭else‬‭:‬
‭print(‬‭"Contraseña incorrecta. Intenta de nuevo."‬‭)‬

‭Condicionales‬

‭1.‬ ‭Clasificación de Edad:‬


‭Python‬
‭edad =‬‭int‬‭(‬‭input‬‭(‬‭"Ingresa tu edad: "‬‭))‬
‭if‬ ‭edad <‬‭13‬‭:‬
‭print(‬‭"Niño"‬‭)‬
‭elif‬‭13‬ ‭<= edad <=‬‭19‬‭:‬
‭print(‬‭"Adolescente"‬‭)‬
‭else‬‭:‬
‭print(‬‭"Adulto"‬‭)‬

‭2.‬ ‭Día de la Semana:‬


‭Python‬
‭numero_dia =‬‭int‬‭(‬‭input‬‭(‬‭"Ingresa un número del 1 al‬‭7: "‬‭))‬
‭if‬ ‭numero_dia ==‬‭1‬‭:‬
‭print(‬‭"Lunes"‬‭)‬
‭elif‬ ‭numero_dia ==‬‭2‬‭:‬
‭print(‬‭"Martes"‬‭)‬
‭elif‬ ‭numero_dia ==‬‭3‬‭:‬
‭print(‬‭"Miércoles"‬‭)‬
‭elif‬ ‭numero_dia ==‬‭4‬‭:‬
‭print(‬‭"Jueves"‬‭)‬
‭elif‬ ‭numero_dia ==‬‭5‬‭:‬
‭print(‬‭"Viernes"‬‭)‬
‭elif‬ ‭numero_dia ==‬‭6‬‭:‬
‭print(‬‭"Sábado"‬‭)‬
‭elif‬ ‭numero_dia ==‬‭7‬‭:‬
‭print(‬‭"Domingo"‬‭)‬
‭else‬‭:‬
‭print(‬‭"Número inválido."‬‭)‬

‭Soluciones a Ejercicios Propuestos de SQL‬

‭Diseño de Bases de Datos (Conceptual)‬

‭1.‬ ‭Identificación de Componentes ERD:‬


‭○‬ ‭Entidades:‬
‭■‬ ‭Libro: Atributos: ID_Libro, Título, ISBN.‬
‭■‬ ‭Socio: Atributos: ID_Socio, Nombre, Dirección, Teléfono.‬
‭■‬ ‭Préstamo: Atributos: ID_Préstamo, FechaPréstamo, FechaDevolución.‬
‭○‬ ‭Relaciones:‬
‭■‬ ‭Socio‬‭realiza‬‭Préstamo: Cardinalidad 1:M (Un socio‬‭puede realizar‬
‭ uchos préstamos, pero un préstamo es realizado por un solo socio).‬
m
‭ ‬ ‭Libro‬‭es parte de‬‭Préstamo: Cardinalidad 1:M (Un libro‬‭puede estar en‬

‭muchos préstamos a lo largo del tiempo, pero en un préstamo específico,‬
‭se refiere a una instancia de un libro).‬‭Nota: Para‬‭modelar múltiples copias‬
‭del mismo libro, se podría introducir una entidad Copia_Libro.‬

‭Código SQL para Creación de Estructuras (DDL)‬

‭1.‬ ‭Creación de Tabla con Clave Foránea:‬


‭SQL‬
‭CREATE‬‭TABLE‬ ‭Autores (‬
‭AutorID‬‭INT‬‭PRIMARY‬ ‭KEY,‬
‭NombreAutor‬‭VARCHAR‬‭(‭1‬ 00‬‭)‬
‭);‬

‭CREATE‬‭TABLE‬ ‭Libros (‬
‭ ibroID‬‭INT‬‭PRIMARY‬ ‭KEY,‬
L
‭Titulo‬‭VARCHAR‬‭(‬‭255‬‭),‬
‭AutorID‬‭INT‬‭,‬
‭FOREIGN‬ ‭KEY (AutorID)‬‭REFERENCES‬ ‭Autores(AutorID)‬
‭);‬

‭2.‬ ‭Modificación de Tabla:‬


‭SQL‬
‭ALTER‬‭TABLE‬ ‭Libros‬
‭ADD‬‭COLUMN‬ ‭AnioPublicacion‬‭INT‬‭;‬

‭ALTER‬‭TABLE‬ ‭Libros‬
‭ LTER‬‭COLUMN‬ ‭Titulo‬‭VARCHAR‬‭(‭3
A ‬ 00‬‭);‬
‭-- O para MySQL: ALTER TABLE Libros MODIFY COLUMN Titulo VARCHAR(300);‬

‭Manipulación de Información (DML)‬

‭1.‬ ‭Inserción Múltiple:‬


‭SQL‬
‭INSERT‬‭INTO‬ ‭Autores (AutorID, NombreAutor)‬‭VALUES‬
‭(‬‭1‭,‬ ‬‭'Gabriel Garcia Marquez'‬‭),‬
‭(‬‭2‭,‬ ‬‭'Jane Austen'‬‭),‬
‭(‬‭3‭,‬ ‬‭'George Orwell'‬‭);‬

‭INSERT‬‭INTO‬ ‭Libros (LibroID, Titulo, AutorID)‬‭VALUES‬


‭(‬‭101‬‭,‬‭'Cien años de soledad'‬‭,‬‭1‭)‬ ,‬
‭(‬‭102‬‭,‬‭'Orgullo y prejuicio'‬‭,‬‭2‬‭),‬
‭(‬‭103‬‭,‬‭'1984'‬‭,‬‭3‭)‬ ,‬
‭(‬‭104‬‭,‬‭'El amor en los tiempos del cólera'‬‭,‬‭1‬‭),‬
‭(‬‭105‬‭,‬‭'Rebelión en la granja'‬‭,‬‭3‬‭);‬

‭2.‬ ‭Actualización Condicional:‬


‭SQL‬
‭UPDATE Libros‬
‭SET‬ ‭AnioPublicacion‬‭=‬‭1999‬
‭WHERE‬ ‭AnioPublicacion‬‭<‬‭2000‬‭;‬

‭3.‬ ‭Eliminación Específica:‬


‭SQL‬
‭DELETE‬‭FROM‬ ‭Libros‬
‭WHERE‬ ‭Titulo‬‭LIKE‬‭'%Historia%'‬‭;‬

‭Consultas (DQL)‬

‭1.‬ ‭Selección con Filtrado y Ordenación:‬


‭SQL‬
‭SELECT‬ ‭Titulo, AnioPublicacion‬
‭FROM‬ ‭Libros‬
‭WHERE‬ ‭AnioPublicacion‬‭>‬‭2010‬
‭ORDER‬‭BY‬ ‭AnioPublicacion‬‭DESC‬‭;‬

‭2.‬ ‭Agregación con Agrupación:‬


‭SQL‬
‭SELECT‬ ‭AutorID,‬‭COUNT‬‭(LibroID)‬‭AS‬ ‭TotalLibros‬
‭FROM‬ ‭Libros‬
‭GROUP‬‭BY‬ ‭AutorID;‬

‭3.‬ ‭Filtrado de Agregados:‬


‭SQL‬
‭SELECT‬ ‭AutorID,‬‭COUNT‬‭(LibroID)‬‭AS‬ ‭TotalLibros‬
‭FROM‬ ‭Libros‬
‭GROUP‬‭BY‬ ‭AutorID‬
‭HAVING‬‭COUNT‬‭(LibroID)‬‭>‬‭2‭;‬ ‬

‭4.‬ ‭Combinación de Tablas (INNER JOIN):‬


‭SQL‬
‭SELECT‬ ‭A.NombreAutor, L.Titulo‬
‭FROM‬ ‭Autores‬‭AS‬ ‭A‬
‭INNER‬‭JOIN‬ ‭Libros‬‭AS‬ ‭L‬‭ON‬ ‭A.AutorID‬‭=‬ ‭L.AutorID;‬

‭5.‬ ‭LEFT JOIN para Autores sin Libros:‬


‭SQL‬
‭SELECT‬ ‭A.NombreAutor, L.Titulo‬
‭FROM‬ ‭Autores‬‭AS‬ ‭A‬
‭LEFT‬‭JOIN‬ ‭Libros‬‭AS‬ ‭L‬‭ON‬ ‭A.AutorID‬‭=‬ ‭L.AutorID;‬

‭Apéndice D: Preguntas Teóricas‬

‭25 Preguntas Teóricas de Opción Múltiple sobre Python‬


‭1.‬ ¿
‭ Cuál es la principal diferencia entre una lista y una tupla en Python?‬
‭a) Las listas son inmutables, las tuplas son mutables‬
‭b) Las listas son mutables, las tuplas son inmutables‬
‭c) No existe ninguna diferencia‬
‭Respuesta correcta: b‬

‭2.‬ ¿
‭ Qué significa que las listas en Python son "mutables"?‬
‭a) No pueden cambiar después de ser creadas‬
‭b) Pueden cambiar sus elementos después de ser creadas‬
‭c) Solo pueden contener números‬
‭Respuesta correcta: b‬
‭3.‬ ¿ mis_datos‬
‭ Cómo se accede al tercer elemento de una lista llamada‬‭ ‭?‬
‭a) mis_datos[2]‬
‭b) mis_datos[3]‬
‭c) mis_datos[1]‬
‭Respuesta correcta: a‬

‭4.‬ ¿
‭ Qué es el "slicing" en listas de Python?‬
‭a) Extraer un subconjunto de elementos de la lista‬
‭b) Ordenar la lista‬
‭c) Eliminar un elemento específico‬
‭Respuesta correcta: a‬

‭5.‬ ¿
‭ Cuál es la función del método‬‭ append()‬‭en una lista?‬
‭a) Elimina un elemento al final‬
‭b) Añade un elemento al final‬
‭c) Añade un elemento al principio‬
‭Respuesta correcta: b‬

‭6.‬ ¿
‭ Cuál es la diferencia entre los métodos‬‭ append()‬‭y‬‭extend()‬ ‭?‬
‭a) No hay diferencia‬
‭b)‬‭append()‬‭agrega un solo elemento,‬‭
extend()‬‭agrega‬‭múltiples elementos‬
‭de un iterable‬
append()‬‭elimina elementos,‬‭
‭c)‬‭ extend()‬‭agrega elementos‬
‭Respuesta correcta: b‬

‭7.‬ ¿
‭ Qué es un diccionario en Python?‬
‭a) Una colección de elementos ordenados‬
‭b) Una colección de pares clave-valor‬
‭c) Un tipo especial de lista‬
‭Respuesta correcta: b‬

‭8.‬ ¿
‭ Qué restricción existe sobre las claves de un diccionario?‬
‭a) Deben ser números enteros‬
‭b) Deben ser inmutables (hashables)‬
‭c) Deben ser únicas y mutables‬
‭Respuesta correcta: b‬

‭9.‬ ¿
‭ Cómo se accede a un valor en un diccionario sin riesgo de error si la‬
‭clave no existe?‬
‭ ) Usando‬‭
a get()‬
‭b) Usando‬‭ []‬
‭c) No es posible hacerlo sin error‬
‭Respuesta correcta: a‬

‭10.‬‭¿Qué es una copia superficial de un diccionario?‬


‭a) Una copia independiente que también copia objetos anidados‬
‭b) Una copia que comparte referencias a objetos anidados‬
‭c) Una copia que convierte el diccionario en lista‬
‭Respuesta correcta: b‬

‭11.‬ ‭¿Cuál es el propósito principal de un bucle‬‭ for‬‭en‬‭Python?‬


‭a) Repetir un bloque de código un número específico de veces‬
‭b) Ejecutar indefinidamente un bloque de código‬
‭c) Esperar hasta que una condición sea verdadera‬
‭Respuesta correcta: a‬

‭12.‬‭¿Para qué se utiliza la función‬‭range()‬‭en un bucle‬‭


for‬
‭?‬
‭a) Generar números aleatorios‬
‭b) Generar una secuencia de números‬
‭c) Crear listas de texto‬
‭Respuesta correcta: b‬

‭13.‬‭¿Cuál es la diferencia entre un bucle‬‭ for‬‭y un bucle‬‭


while‬‭?‬
‭a)‬‭ for‬‭es para iterar sobre secuencias,‬‭
while‬‭depende‬‭de condiciones‬
‭b)‬‭while‬‭es más rápido que‬‭ for‬
‭c) No hay diferencia‬
‭Respuesta correcta: a‬

‭14.‬‭¿Qué sucede si la condición de un bucle‬‭ while‬‭nunca‬‭se vuelve False?‬


‭a) El bucle termina automáticamente‬
‭b) Se produce un error de sintaxis‬
‭c) El bucle se ejecuta infinitamente‬
‭Respuesta correcta: c‬

‭15.‬‭¿Qué hace la sentencia‬‭ break‬‭dentro de un bucle?‬


‭a) Detiene la iteración actual y continúa‬
‭b) Finaliza completamente el bucle‬
‭c) Omite la condición del bucle‬
‭Respuesta correcta: b‬

‭16.‬‭¿Cuál es la función de la sentencia‬‭ continue‬‭dentro‬‭de un bucle?‬


‭a) Finalizar el bucle‬
‭b) Omitir el resto del código actual y pasar a la siguiente iteración‬
‭c) Reiniciar el bucle desde el inicio‬
‭Respuesta correcta: b‬

‭17.‬ ‭¿Cómo funciona una sentencia‬‭ if‬‭básica en Python?‬


‭a) Evalúa una condición y ejecuta código si es falsa‬
‭b) Evalúa una condición y ejecuta código si es verdadera‬
‭c) Solo se ejecuta al inicio del programa‬
‭Respuesta correcta: b‬

‭18.‬‭¿Cuál es la diferencia entre‬‭ if-else‬‭y‬‭if-elif-else‬


‭?‬
‭a)‬‭ if-else‬‭permite múltiples condiciones‬
‭b)‬‭if-elif-else‬‭permite múltiples condiciones‬
‭c) No existe diferencia‬
‭Respuesta correcta: b‬

‭19.‬‭¿Qué operadores lógicos existen en Python?‬


‭a) and, or, not‬
‭b) if, else, elif‬
‭c) &, |, ~‬
‭Respuesta correcta: a‬

‭20.‬‭¿Qué es el operador ternario en Python?‬


‭a) Un bucle anidado‬
‭b) Una expresión condicional compacta‬
‭c) Un tipo de lista‬
‭Respuesta correcta: b‬

‭21.‬‭¿Por qué es importante la indentación en Python?‬


‭a) Es solo una convención de estilo‬
‭b) Define la estructura de bloques de código‬
‭c) No afecta la ejecución del código‬
‭Respuesta correcta: b‬

‭22.‬‭¿Cómo se puede iterar sobre las claves y valores de un diccionario al‬


‭ ismo tiempo?‬
m
‭a) Usando items()‬
‭b) Usando keys()‬
‭c) Usando values()‬
‭Respuesta correcta: a‬

‭23.‬‭¿Qué método se utiliza para eliminar un elemento de una lista por su‬
‭valor?‬
‭a) pop()‬
‭b) remove()‬
‭c) delete()‬
‭Respuesta correcta: b‬

‭24.‬‭¿Qué devuelve la función len() al aplicarse a una lista o diccionario?‬


‭a) La suma de sus elementos‬
‭b) La cantidad de elementos‬
‭c) El valor máximo‬
‭Respuesta correcta: b‬

‭25.‬‭¿Cuál es el índice del primer y último elemento de una lista usando‬


‭indexación negativa?‬
‭a) 0 y -1‬
‭b) 1 y -1‬
‭c) 0 y -n‬
‭Respuesta correcta: a‬

‭25 Preguntas Teóricas de Opción Múltiple sobre SQL‬


‭1.‬ ¿
‭ Cuál es el propósito principal del diseño de bases de datos?‬
‭a) Mejorar el rendimiento de la red‬
‭b) Organizar datos eficientemente y evitar redundancias‬
‭c) Crear interfaces gráficas‬
‭Respuesta correcta: b‬

‭2.‬ ¿
‭ Qué es una "entidad" en bases de datos?‬
‭a) Una relación entre tablas‬
‭ ) Un objeto o concepto del mundo real sobre el que se almacena información‬
b
‭c) Un conjunto de atributos‬
‭Respuesta correcta: b‬

‭3.‬ ¿
‭ Qué es un "atributo" en bases de datos?‬
‭a) Un valor único‬
‭b) Una característica que describe a una entidad‬
‭c) Una clave primaria‬
‭Respuesta correcta: b‬

‭4.‬ ¿
‭ Qué es una "relación" en un diagrama ERD?‬
‭a) La conexión lógica entre entidades‬
‭b) Un tipo de clave primaria‬
‭c) Una consulta SQL‬
‭Respuesta correcta: a‬

‭5.‬ ¿
‭ Cuáles son los tres tipos principales de cardinalidad?‬
‭a) Uno a Uno, Uno a Muchos, Muchos a Muchos‬
‭b) Entero, Decimal, Texto‬
‭c) Físico, Lógico, Conceptual‬
‭Respuesta correcta: a‬

‭6.‬ ¿
‭ Cuál es la función de una clave primaria?‬
‭a) Almacenar valores duplicados‬
‭b) Identificar de forma única cada fila en una tabla‬
‭c) Conectar dos tablas diferentes‬
‭Respuesta correcta: b‬

‭7.‬ ¿
‭ Cuál es la función de una clave foránea?‬
‭a) Identificar filas de forma única‬
‭b) Establecer una relación entre tablas‬
‭c) Crear índices en la tabla‬
‭Respuesta correcta: b‬

‭8.‬ ¿
‭ Qué es la normalización en bases de datos?‬
‭a) Proceso para aumentar la redundancia de datos‬
‭b) Proceso para organizar datos eliminando redundancias‬
‭c) Proceso de denormalizar la base de datos‬
‭Respuesta correcta: b‬
‭9.‬ ¿
‭ Qué garantiza la Primera Forma Normal (1FN)?‬
‭a) Que los atributos sean atómicos (sin multivalores)‬
‭b) Que las claves foráneas sean únicas‬
‭c) Que no existan datos duplicados‬
‭Respuesta correcta: a‬

‭10.‬‭¿Qué requisito añade la Segunda Forma Normal (2FN)?‬


‭a) Eliminar atributos multivaluados‬
‭b) Eliminar dependencias parciales de claves primarias compuestas‬
‭c) Eliminar claves foráneas‬
‭Respuesta correcta: b‬

‭11.‬ ‭¿Qué requisito añade la Tercera Forma Normal (3FN)?‬


‭a) Eliminar atributos multivaluados‬
‭b) Eliminar dependencias transitivas‬
‭c) Eliminar claves primarias‬
‭Respuesta correcta: b‬

‭12.‬‭¿Qué significa DDL en SQL?‬


‭a) Data Definition Language‬
‭b) Data Deletion Language‬
‭c) Data Document Language‬
‭Respuesta correcta: a‬

‭13.‬‭¿Cuál es el propósito del comando CREATE TABLE?‬


‭a) Insertar registros‬
‭b) Crear nuevas tablas‬
‭c) Consultar registros‬
‭Respuesta correcta: b‬

‭14.‬‭¿Cuál es la función del comando ALTER TABLE?‬


‭a) Consultar registros‬
‭b) Modificar la estructura de una tabla‬
‭c) Eliminar tablas‬
‭Respuesta correcta: b‬

‭15.‬‭¿Cuál es la diferencia entre DROP TABLE y TRUNCATE TABLE?‬


‭a) DROP elimina la estructura, TRUNCATE solo los datos‬
‭ ) No hay diferencia‬
b
‭c) TRUNCATE elimina la estructura, DROP elimina solo datos‬
‭Respuesta correcta: a‬

‭16.‬‭¿Qué significa DML en SQL?‬


‭a) Data Manipulation Language‬
‭b) Data Model Language‬
‭c) Data Markup Language‬
‭Respuesta correcta: a‬

‭17.‬ ‭¿Cuál es el propósito del comando INSERT INTO?‬


‭a) Crear tablas‬
‭b) Insertar nuevos registros‬
‭c) Actualizar registros existentes‬
‭Respuesta correcta: b‬

‭18.‬‭¿Por qué es importante la cláusula WHERE en UPDATE y DELETE?‬


‭a) Para mejorar el rendimiento de la consulta‬
‭b) Para especificar qué registros deben ser afectados‬
‭c) No es necesaria en esos comandos‬
‭Respuesta correcta: b‬

‭19.‬‭¿Qué significa DQL en SQL?‬


‭a) Data Query Language‬
‭b) Data Quality Language‬
‭c) Data Queue Language‬
‭Respuesta correcta: a‬

‭20.‬‭¿Qué diferencia hay entre WHERE y HAVING?‬


‭a) WHERE filtra después de agrupar, HAVING antes‬
‭b) WHERE filtra registros individuales, HAVING sobre grupos‬
‭c) No existe diferencia‬
‭Respuesta correcta: b‬

‭21.‬‭¿Para qué sirve GROUP BY en una consulta SQL?‬


‭a) Agrupar registros con valores duplicados‬
‭b) Agrupar registros para aplicar funciones de agregación‬
‭c) Ordenar los resultados‬
‭Respuesta correcta: b‬
‭22.‬‭¿Cuál es el propósito de ORDER BY?‬
‭a) Filtrar registros‬
‭b) Ordenar registros en la salida‬
‭c) Agrupar registros‬
‭Respuesta correcta: b‬

‭23.‬‭¿Qué hace un INNER JOIN?‬


‭a) Une todas las filas, coincidan o no‬
‭b) Devuelve solo filas con coincidencias en ambas tablas‬
‭c) Une filas aleatorias‬
‭Respuesta correcta: b‬

‭24.‬‭¿Cuándo usarías un FULL OUTER JOIN?‬


‭a) Cuando solo quieres registros con coincidencias‬
‭b) Cuando quieres todas las filas, coincidan o no‬
‭c) Para actualizar registros‬
‭Respuesta correcta: b‬

‭25.‬‭¿Cuál es el orden lógico de ejecución de cláusulas en una consulta SQL?‬


‭a) FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY‬
‭b) SELECT, FROM, WHERE, GROUP BY, ORDER BY, HAVING‬
‭c) WHERE, SELECT, FROM, GROUP BY, ORDER BY‬
‭Respuesta correcta: a‬

‭Obras citadas‬

‭1.‬ ‭Creating a one-dimensional NumPy array - GeeksforGeeks, fecha de acceso:‬


‭ gosto 4, 2025,‬
a
‭https://www.geeksforgeeks.org/python/creating-a-one-dimensional-numpy-arra‬
‭y/‬
‭2.‬ ‭list — Python Reference (The Right Way) 0.1 documentation, fecha de acceso:‬
‭agosto 4, 2025,‬‭https://python-reference.readthedocs.io/en/latest/docs/list/‬
‭3.‬ ‭Python List (With Examples) - Programiz, fecha de acceso: agosto 4, 2025,‬
‭https://www.programiz.com/python-programming/list‬
‭4.‬ ‭the absolute basics for beginners — NumPy v2.3 Manual, fecha de acceso: agosto‬
‭4, 2025,‬‭https://numpy.org/doc/stable/user/absolute_beginners.html‬
‭5.‬ ‭List Objects — Python 3.13.5 documentation, fecha de acceso: agosto 4, 2025,‬
‭https://docs.python.org/3/c-api/list.html‬
‭6.‬ ‭Python List Functions & Methods Tutorial and Examples | DataCamp, fecha de‬
‭ cceso: agosto 4, 2025,‬‭https://www.datacamp.com/tutorial/python-list-function‬
a
‭7.‬ ‭4. More Control Flow Tools — Python 3.13.5 documentation, fecha de acceso:‬
‭agosto 4, 2025,‬‭https://docs.python.org/3/tutorial/controlflow.html‬
‭8.‬ ‭Dictionaries in Python - GeeksforGeeks, fecha de acceso: agosto 4, 2025,‬
‭https://www.geeksforgeeks.org/python/python-dictionary/‬
‭9.‬ ‭Python Dictionary: Understanding Methods with Examples | by Binary Beats -‬
‭Medium, fecha de acceso: agosto 4, 2025,‬
‭https://binarybeats.medium.com/python-dictionary-understanding-methods-wit‬
‭h-examples-aa367ede8650‬
‭10.‬‭dict — Python Reference (The Right Way) 0.1 documentation, fecha de acceso:‬
‭agosto 4, 2025,‬‭https://python-reference.readthedocs.io/en/latest/docs/dict/‬
‭11.‬ ‭Dictionary Objects — Python 3.13.5 documentation, fecha de acceso: agosto 4,‬
‭2025,‬‭https://docs.python.org/3/c-api/dict.html‬
‭12.‬‭How To Use Python Continue, Break and Pass Statements when Working with‬
‭Loops, fecha de acceso: agosto 4, 2025,‬
‭https://www.digitalocean.com/community/tutorials/how-to-use-break-continue-a‬
‭nd-pass-statements-when-working-with-loops-in-python-3‬
‭13.‬‭Python Control Flow - Python Cheatsheet, fecha de acceso: agosto 4, 2025,‬
‭https://www.pythoncheatsheet.org/cheatsheet/control-flow‬
‭14.‬‭Control flow - Python Basics 25.1.0, fecha de acceso: agosto 4, 2025,‬
‭https://python-basics-tutorial.readthedocs.io/en/latest/control-flow/index.html‬
‭15.‬‭Python if elif else - w3resource, fecha de acceso: agosto 4, 2025,‬
‭https://www.w3resource.com/python/python-if-else-statements.php‬
‭16.‬‭if…elif…else in Python Tutorial - DataCamp, fecha de acceso: agosto 4, 2025,‬
‭https://www.datacamp.com/tutorial/elif-statements-python‬
‭17.‬‭Python If Else Statements - Conditional Statements - GeeksforGeeks, fecha de‬
‭acceso: agosto 4, 2025,‬‭https://www.geeksforgeeks.org/python/python-if-else/‬
‭18.‬‭if elif else Problems | Python Classroom, fecha de acceso: agosto 4, 2025,‬
‭https://www.pythonclassroom.com/decisions-if-elif-else/if-elif-else/if-elif-else-pr‬
‭oblems‬
‭19.‬‭Database normalization description - Microsoft 365 Apps | Microsoft ..., fecha de‬
‭acceso: agosto 4, 2025,‬
‭https://learn.microsoft.com/en-us/troubleshoot/microsoft-365-apps/access/data‬
‭base-normalization-description‬
‭20.‬‭Database Design - Entity-Relationship Diagrams (ERD ..., fecha de acceso: agosto‬
‭4, 2025,‬
‭https://knowledge.kitchen/content/courses/database-design/notes/entity-relation‬
‭ship-diagrams/‬
‭21.‬‭Entity Relationship (ER) diagrams guide - Nulab, fecha de acceso: agosto 4, 2025,‬
‭https://nulab.com/learn/software-development/entity-relationship-diagrams-guid‬
‭e/‬
‭22.‬‭ER Diagram (ERD) - Definition & Overview | Lucidchart, fecha de acceso: agosto 4,‬
‭2025,‬‭https://www.lucidchart.com/pages/er-diagrams‬
‭23.‬‭DATABASE DESIGN: NORMALIZATION NOTE & EXERCISES (Up ..., fecha de‬
‭ cceso: agosto 4, 2025,‬
a
‭https://www.javaguicodexample.com/normalizationnotes.pdf‬
‭24.‬‭SQL CRUD: CREATE, READ, UPDATE, DELETE, DROP, and ..., fecha de acceso:‬
‭agosto 4, 2025,‬
‭https://datalemur.com/blog/sql-create-read-update-delete-drop-alter‬
‭25.‬‭SQL Commands (DDL, DML, DQL, DCL, TCL) with Examples, fecha de acceso:‬
‭agosto 4, 2025,‬‭https://www.mygreatlearning.com/blog/sql-commands/‬
‭26.‬‭SQL ALTER TABLE - GeeksforGeeks, fecha de acceso: agosto 4, 2025,‬
‭https://www.geeksforgeeks.org/sql/sql-alter-add-drop-modify/‬
‭27.‬‭MySQL Alter Table - Exercises, Practice, Solution - w3resource, fecha de acceso:‬
‭agosto 4, 2025,‬
‭https://www.w3resource.com/mysql-exercises/alter-table-statement/index.php‬
‭28.‬‭Data modification language statements (DML) INSERT, UPDATE ..., fecha de‬
‭acceso: agosto 4, 2025,‬‭http://www1.udel.edu/evelyn/SQL-Class1/SQLInsert.html‬
‭29.‬‭3 About DML Statements and Transactions - Oracle Help Center, fecha de‬
‭acceso: agosto 4, 2025,‬
‭https://docs.oracle.com/en/database/oracle/oracle-database/19/tdddg/dml-and-tr‬
‭ansactions.html‬
‭30.‬‭Update Data with SQL - Coginiti, fecha de acceso: agosto 4, 2025,‬
‭https://www.coginiti.co/tutorials/beginner/sql-update/‬
‭31.‬‭Update (SQL) - Wikipedia, fecha de acceso: agosto 4, 2025,‬
‭https://en.wikipedia.org/wiki/Update_(SQL)‬
‭32.‬‭SQL DELETE Statement Explained with Examples - DbSchema, fecha de acceso:‬
‭agosto 4, 2025,‬‭https://dbschema.com/blog/tutorials/sql-delete-statement/‬
‭33.‬‭DELETE (Transact-SQL) - SQL Server - Microsoft Learn, fecha de acceso: agosto‬
‭4, 2025,‬
‭https://learn.microsoft.com/en-us/sql/t-sql/statements/delete-transact-sql?view=‬
‭sql-server-ver17‬
‭34.‬‭How To Use GROUP BY and ORDER BY in SQL: A Complete Guide ..., fecha de‬
‭acceso: agosto 4, 2025,‬
‭https://www.digitalocean.com/community/tutorials/how-to-use-groupby-and-or‬
‭derby-in-sql‬
‭35.‬‭SQL join tables with group by and order by - w3resource, fecha de acceso:‬
‭agosto 4, 2025,‬
‭https://www.w3resource.com/sql/joins/joining-with-group-by-and-order-by.php‬
‭36.‬‭How to Use GROUP BY and HAVING in SQL | DataCamp, fecha de acceso: agosto‬
‭4, 2025,‬‭https://www.datacamp.com/tutorial/group-by-having-clause-sql‬
‭37.‬‭The Ultimate Guide to SQL Aggregate Functions - StrataScratch, fecha de‬
‭acceso: agosto 4, 2025,‬
‭https://www.stratascratch.com/blog/the-ultimate-guide-to-sql-aggregate-functi‬
‭ons/‬
‭38.‬‭Exploring Aggregate Functions in SQL: A Comprehensive Guide | by Reetesh‬
‭Kumar, fecha de acceso: agosto 4, 2025,‬
‭https://medium.com/@reetesh043/exploring-aggregate-functions-in-sql-a-comp‬
‭rehensive-guide-d6517adf1cb5‬
‭39.‬‭SQL Joins Difference (Inner/Left/Right/Full/Outer Joins) - YouTube, fecha de‬
‭ cceso: agosto 4, 2025,‬‭https://www.youtube.com/watch?v=4JLkHtIxXlA‬
a
‭40.‬‭Mastering SQL Joins – INNER, LEFT, RIGHT, and FULL OUTER Explained - Blog,‬
‭fecha de acceso: agosto 4, 2025,‬
‭https://blog.tedjordan.org/analytics/sql/mastering-sql-joins-inner-left-right-and-f‬
‭ull-outer-explained/‬
‭41.‬‭SQL Joins (Inner, Left, Right and Full Join) - GeeksforGeeks, fecha de acceso:‬
‭agosto 4, 2025,‬
‭https://www.geeksforgeeks.org/sql/sql-join-set-1-inner-left-right-and-full-joins/‬
‭42.‬‭SQL Joins. Lessons for beginners. W3Schools in English, fecha de acceso: agosto‬
‭4, 2025,‬‭https://w3schoolsua.github.io/sql/sql_ join_en.html‬
‭43.‬‭5 Best Practices For Writing SQL JOIN Query - GeeksforGeeks, fecha de acceso:‬
‭agosto 4, 2025,‬
‭https://www.geeksforgeeks.org/sql/5-best-practices-for-writing-sql-joins/‬
‭44.‬‭Left Join - GeeksforGeeks | Videos, fecha de acceso: agosto 4, 2025,‬
‭https://www.geeksforgeeks.org/videos/left-join/‬
‭45.‬‭Using String Functions in SQL - Coginiti, fecha de acceso: agosto 4, 2025,‬
‭https://www.coginiti.co/tutorials/intermediate/string-functions-in-sql/‬
‭46.‬‭SQL | String functions - GeeksforGeeks, fecha de acceso: agosto 4, 2025,‬
‭https://www.geeksforgeeks.org/sql/sql-string-functions/‬
‭47.‬‭SQL Date Functions - Meritshot, fecha de acceso: agosto 4, 2025,‬
‭https://www.meritshot.com/sql-date-functions/‬
‭48.‬‭Python if, if...else Statement (With Examples) - Programiz, fecha de acceso:‬
‭agosto 4, 2025,‬‭https://www.programiz.com/python-programming/if-elif-else‬

También podría gustarte