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 datosmutables, lo que implica que sus elementos
L
pueden ser modificados, añadidos o eliminados después de su creación. Además,
mantienen unordende inserción, y sus elementos son accesibles a través de un
sistema deindexaciónbasado 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
languages =
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 elfinal: ['a', 'm']
print(my_list[: -4]) # Desde el inicio hasta elcuarto elemento desde el final: ['p', 'r', 'o']
unque los arrays de NumPy ofrecen funciones como arange() y linspace() para
A
generar secuencias numéricas1, 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 siguientesoperaciones:
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]
index_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 maneraque cada clave única se
socia con un valor específico.8
a
● Mutabilidad:Los diccionarios pueden modificarse despuésde su creación; es
posible añadir nuevos pares, actualizar valores existentes y eliminar entradas.8
● Claves Únicas:Las claves dentro de un diccionariodeben 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 tipode 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 puedenser de cualquier tipo de
dato y pueden estar duplicados dentro del diccionario.8
● Ordenados (Python 3.7+):A partir de Python 3.7, losdiccionarios 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 unaté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 diccionarios8 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":"ComputerScience"}
# 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-valorse 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 eficientementeutilizando 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 keyin d.keys(): print(key)
f or valuein d.values(): print(value)
for key, valuein d.items(): print(f"{key}:{value}")
● Diccionarios Anidados:Los diccionarios pueden contenerotros 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 integridadde 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
inventario = {'manzanas':50,'peras':30,'naranjas':20}
print(f"Inventario inicial:{inventario}")
# 1. Añadir 'uvas' [8, 9]
inventario['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]
inventario['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 mundohola 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 unalista de palabras
frecuencia = {}
for palabrain 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 win words:
print(w,len(w))
Output:
#
# cat 3
# window 6
# defenestrate 12
● Ejemplo: Uso de range() para iteración numérica:Lafunció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 iinrange(5) :# Genera 0, 1, 2, 3, 4
print(i)
# Output: 0, 1, 2, 3, 4
for iinrange(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 unacopiade 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 variablede control
# Output: 0, 1, 2, 3, 4
a necesidad de actualizar explícitamente la variable de control dentro de un bucle
L
while12 es un aspecto fundamental para asegurar suterminación y evitar bucles
infinitos. 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 foro 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 iinrange(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ónactual 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 numinrange(2,10):
if num %2 ==0:
print(f"Found an even number{num}")
continue# Salta el resto de la iteraciónpara 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 comowhile pueden incluir una
láusula else opcional. Este bloque else se ejecutasolamente si el bucle se
c
completa de forma normal, es decir, sin encontraruna 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 ninrange(2,10):
for xinrange(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 bucles7 es una característicade 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 paresdel 1 al 10, pero usa
ontinue para saltar los números impares.
c
Solución:
●
Python
suma_pares =0
for iinrange(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 repetidamentehasta que ingrese
l número 0. Cuando ingrese 0, el programa debe terminar.
e
Solución:
●
Python
whileTrue:# Bucle infinito que se romperá con 'break'[13]
numero =int(input(" Ingresa un número (0 parasalir): "))
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 únicamentesi su condición asociada
es True.13
Python
x =5
if x >3:
print("x is greater than 3")# Se ejecuta porque5 > 3 es True
● Sentencia if-else:Proporciona dos bloques de códigoalternativos: 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 porque10 > 10 es False
● Sentencia if-elif-else:Se utiliza para verificarmú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-else15 aborda directamente la necesidad de tomar decisiones con
L
múltiples opciones, ofreciendo una alternativa más legible y eficiente a las cadenas de
if-else anidadas profundamente.17 Esta estructurapromueve 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 compararvalores 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úsculasy minúsculas)
● Operadores Lógicos:Se utilizan para combinar expresionesbooleanas.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 <18else'adult'
print(status)# Output: kid
a inclusión del operador condicional ternario13 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
if-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 usuarioun número entero y
etermine si es positivo, negativo o cero.
d
Solución:
●
Python
numero =int(input(" 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 lacompra 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 totalde la compra: "))
p
descuento =0
if precio_original >=100:
descuento =0.10
elif precio_original >=50:# Implica que es < 100por 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:.2f}")
print(f"Descuento aplicado:{descuento*100:.0f}%")
print(f"Precio final: ${precio_final:.2f}")
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 mundoreal 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 quedescriben 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 interaccionesentre dos o más
entidades (por ejemplo, un "Cliente"realizaun "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 conceptuales 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 clarificarel 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 lasentidades (por ejemplo, un
Clienterealizaun Pedido). Se dibujan líneas queconectan 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 suspropiedades clave (por
ejemplo, ID_Cliente, Nombre). Se dibujan como óvalos conectados a su entidad
correspondiente.21
5. Especificar Cardinalidad:Indicar la relación numéricaentre 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 lasinstancias de las entidades en
C
una asociación.20
● Uno a Uno (1:1):Cada instancia de la Entidad A serelaciona 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 Ase 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 laEntidad 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
datos20 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 desperdicianespacio 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 losdatos 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 latotalidadde 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áctico19, la práctica del diseñode 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 conjuntode 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 conjuntode 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 Claves22:
●
○ Superclave:Cualquier conjunto de atributos que identifiquede 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 sidoelegida como clave
primaria.
l papel de las claves primarias y foráneas19 vamá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 delesquemadela 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
CREATETABLE 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
CREATETABLE customers (
ustomer_idINTPRIMARY KEY,
c
first_nameVARCHAR(50),
last_nameVARCHAR(5 0),
emailVARCHAR(100),
phone_numberVARCHAR(2 0)
);
a sentencia CREATE TABLE24 define efectivamenteel "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 datosen 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
las 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
ALTERTABLE reviews
ADDCOLUMN review_textVARCHAR(500);
● Modificar el Tipo de Dato de una Columna:
SQL
ALTERTABLE reviews
LTERCOLUMN stars
A TYPEFLOAT;-- La sintaxis puedevariar (por ejemplo, MODIFY COLUMN
en MySQL)
● Renombrar una Columna:
SQL
ALTERTABLE reviews
RENAMECOLUMN submit_dateTO submission_date;
● Eliminar una Columna:
SQL
ALTERTABLE Employees
DROPCOLUMN Email;
l comando ALTER TABLE24 es fundamental para la evolucióndel 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
esquemain situ, lo que significa que los datos existentesse 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
DROPTABLE 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ónde 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
INSERTINTO table_name (column1, column2,...)
VALUES (value1, value2,...);
● Sintaxis (Múltiples Filas desde SELECT):
SQL
INSERTINTO table_name
(column1, column2,...)
SELECT column1, column2,...
FROM other_table
WHERE criteria;
● Ejemplo:
SQL
INSERTINTO 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
SELECT28 destaca diferentes estrategias de poblaciónde 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,...
WHEREcondition;
● Ejemplo:Aumento de precios para libros de un autorespecí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 UPDATE30 es una
L
consideración crítica de seguridad y precisión. La advertencia sobre omitirla30 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 odaslas filas de forma no intencionada puede conducira 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
DELETEFROM table_name
WHEREcondition;
● Ejemplo (Eliminar un solo registro):32
SQL
DELETEFROM StudentsWHERE StudentID=2;
● Ejemplo (Eliminar múltiples registros):32
SQL
DELETEFROM StudentsWHERE LastName='Doe';
a comparación entre DELETE y TRUNCATE25 para laeliminació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, LastNameFROM Customers;
● Cláusula WHERE:Se utiliza para filtrar filas basándoseen 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 CustomersWHERE 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, nocómoobtenerlos, lo que permiteal 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_nameFROM movie_theater
ORDERBY movie_nameDESC;-- Ordena nombres de películasen 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únpara los principiantes es confundir
sus roles o su ubicación incorrecta en la consulta. Comprender que
RDER BY actúa sobre elconjunto de resultados finaldespué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 quetienen 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
GROUPBY movie_genre;
● Cláusula HAVING:Se utiliza para filtrar registrosagrupados 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
GROUPBY movie_genre
HAVINGAVG(guest_total)>100;
a distinción entre WHERE (filtrado de filas individualesantesde agrupar) y HAVING
L
(filtrado deresultados agrupadosdespué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 losresultados de la
agregación. Esta diferencia es esencial para consultasanalí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 valorescoincidentes en
ambastablas según la condición de unión. Es el tipode unión más común.39
SQL
SELECT e.first_name, d.department_name
FROM employeesAS e
INNERJOIN departmentsAS dON e.department_id= d.department_id;
○ LEFT (OUTER) JOIN:Devuelve todos los registros dela tablaizquierday los
r egistros coincidentes de la tabladerecha. Si noexiste 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 OrdersAS o
LEFTJOIN CustomersAS cON o.customer_id= c.customer_id;
○ RIGHT (OUTER) JOIN:Devuelve todos los registros dela tabladerechay los
r egistros coincidentes de la tablaizquierda. Si noexiste 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 OrdersAS o
RIGHTJOIN CustomersAS cON o.customer_id= c.customer_id;
○ FULL (OUTER) JOIN:Devuelve todos los registros cuandohay 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 employeesAS e
FULLOUTERJOIN departmentsAS dON e.department_id= d.department_id;
os diferentes tipos de operaciones JOIN39 proporcionanun 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 (
INNER), 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é clienteshanrealizado
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]
SELECTAVG(PrecioTotal)AS PrecioPromedio
FROM Ventas;
-- 2. PrecioTotal total agrupado por FechaVenta, ordenado por fecha [34, 36]
SELECT FechaVenta,SUM(PrecioTotal)AS TotalPorFecha
FROM Ventas
GROUPBY FechaVenta
ORDERBY FechaVentaASC;
-- 3. FechaVenta donde el PrecioTotal total fue superior a $500 [34, 36]
SELECT FechaVenta,SUM(PrecioTotal)AS TotalPorFecha
FROM Ventas
GROUPBY FechaVenta
HAVINGSUM(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 EmpleadosAS E
INNERJOIN DepartamentosAS DON 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 DepartamentosAS D
LEFTJOIN EmpleadosAS EON 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 enterosnumeros = , 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 deproductos 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 unbucle 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 ingreseuna 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. Sila edad es menor de 13,
imprime "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,
imprime 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 sistemade 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 enel 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 enla tabla Autores y 5 libros en la
t abla Libros (asegurándote de que los AutorID sean válidos).
. Actualización Condicional:Actualiza el AnioPublicacionde todos los libros
2
publicados antes del año 2000 a 1999.
3. Eliminación Específica:Elimina de la tabla Librostodos los libros cuyo título
contenga la palabra "Historia".
Consultas (DQL)
1. Selección con Filtrado y Ordenación:Selecciona elTitulo 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 totalde libros por AutorID.
3. Filtrado de Agregados:Encuentra los AutorID que tienenmás de 2 libros
publicados.
4. Combinación de Tablas (JOIN):Realiza un INNER JOINentre Autores y Libros
para mostrar el NombreAutor y el Titulo de cada libro.
5. LEFT JOIN para Autores sin Libros:Realiza un LEFTJOIN 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 numin 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
lista1 = ['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, precioin precios.items():
if precio <50:
precios[producto] = precio *1.10# Aumenta10%
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: clavefor clave, valorin 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"
whileTrue:
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")
elif13 <= edad <=19:
print("Adolescente")
else:
print("Adulto")
2. Día de la Semana:
Python
numero_dia =int(input("Ingresa un número del 1 al7: "))
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:
■ SociorealizaPréstamo: Cardinalidad 1:M (Un sociopuede realizar
uchos préstamos, pero un préstamo es realizado por un solo socio).
m
Libroes parte dePréstamo: Cardinalidad 1:M (Un libropuede 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: Paramodelar 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
CREATETABLE Autores (
AutorIDINTPRIMARY KEY,
NombreAutorVARCHAR(1 00)
);
CREATETABLE Libros (
ibroIDINTPRIMARY KEY,
L
TituloVARCHAR(255),
AutorIDINT,
FOREIGN KEY (AutorID)REFERENCES Autores(AutorID)
);
2. Modificación de Tabla:
SQL
ALTERTABLE Libros
ADDCOLUMN AnioPublicacionINT;
ALTERTABLE Libros
LTERCOLUMN TituloVARCHAR(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
INSERTINTO Autores (AutorID, NombreAutor)VALUES
(1, 'Gabriel Garcia Marquez'),
(2, 'Jane Austen'),
(3, 'George Orwell');
INSERTINTO 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
DELETEFROM Libros
WHERE TituloLIKE'%Historia%';
Consultas (DQL)
1. Selección con Filtrado y Ordenación:
SQL
SELECT Titulo, AnioPublicacion
FROM Libros
WHERE AnioPublicacion>2010
ORDERBY AnioPublicacionDESC;
2. Agregación con Agrupación:
SQL
SELECT AutorID,COUNT(LibroID)AS TotalLibros
FROM Libros
GROUPBY AutorID;
3. Filtrado de Agregados:
SQL
SELECT AutorID,COUNT(LibroID)AS TotalLibros
FROM Libros
GROUPBY AutorID
HAVINGCOUNT(LibroID)>2;
4. Combinación de Tablas (INNER JOIN):
SQL
SELECT A.NombreAutor, L.Titulo
FROM AutoresAS A
INNERJOIN LibrosAS LON A.AutorID= L.AutorID;
5. LEFT JOIN para Autores sin Libros:
SQL
SELECT A.NombreAutor, L.Titulo
FROM AutoresAS A
LEFTJOIN LibrosAS LON 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()yextend() ?
a) No hay diferencia
b)append()agrega un solo elemento,
extend()agregamú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 forenPython?
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ónrange()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 fory un bucle
while?
a) fores para iterar sobre secuencias,
whiledependede condiciones
b)whilees más rápido que for
c) No hay diferencia
Respuesta correcta: a
14.¿Qué sucede si la condición de un bucle whilenuncase 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 breakdentro 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 continuedentrode 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 ifbá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-elseyif-elif-else
?
a) if-elsepermite múltiples condiciones
b)if-elif-elsepermite 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