<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Programación · DacaCode &lt;/&gt;</title><link>https://blog.dacadev.com/programacion/</link><description>Blog de tecnología, programación y electrónica, para compartir conocimientos, experiencias y tutoriales con este apasionante mundo.</description><generator>Hugo</generator><language>es-CO</language><copyright>Copyright © 2026 DacaDev. All rights reserved.</copyright><lastBuildDate>Fri, 26 Jun 2026 00:00:00 -0500</lastBuildDate><atom:link href="https://blog.dacadev.com/programacion/index.xml" rel="self" type="application/rss+xml"/><image><url>https://blog.dacadev.com/images/blog-logo.png</url><title>DacaCode &lt;/&gt;</title><link>https://blog.dacadev.com/</link></image><item><title>SQL: Transacciones, Índices y Constraints</title><link>https://blog.dacadev.com/programacion/sql/08-transacciones-indices-constraints/</link><pubDate>Fri, 26 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/sql/08-transacciones-indices-constraints/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Aprende transacciones en SQL con COMMIT, ROLLBACK, índices y constraints para proteger integridad y optimizar consultas.</description><media:content url="https://blog.dacadev.com/images/programming/sql/transactions-constraints/banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#qué-es-una-transacción-en-sql"&gt;Qué es una transacción en SQL&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#candados-y-concurrencia"&gt;Candados y concurrencia&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#iniciar-una-transacción"&gt;Iniciar una transacción&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#terminar-una-transacción"&gt;Terminar una transacción&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#savepoints-dentro-de-una-transacción"&gt;Savepoints dentro de una transacción&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#índices-y-constraints"&gt;Índices y constraints&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#creación-de-índices"&gt;Creación de índices&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#índices-únicos"&gt;Índices únicos&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#índices-multicolumna"&gt;Índices multicolumna&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#tipos-de-índices"&gt;Tipos de índices&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#índices-b-tree"&gt;Índices B-tree&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#índices-bitmap"&gt;Índices bitmap&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#índices-de-texto"&gt;Índices de texto&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#cómo-se-usan-los-índices"&gt;Cómo se usan los índices&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#constraints-restricciones-de-integridad"&gt;Constraints: restricciones de integridad&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#conclusión-de-la-serie-sql"&gt;Conclusión de la serie SQL&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;En sistemas con múltiples usuarios escribiendo datos al mismo tiempo, la diferencia entre una aplicación confiable y una que corrompe información suele estar en cómo manejas &lt;strong&gt;transacciones en SQL&lt;/strong&gt;, &lt;strong&gt;índices&lt;/strong&gt; y &lt;strong&gt;constraints&lt;/strong&gt;. En el artículo anterior analizamos &lt;a href="https://blog.dacadev.com/programacion/sql/07-vistas-views"



 


&gt;Vistas (Views)&lt;/a&gt;; ahora cerramos la serie con mecanismos de integridad y rendimiento.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;En este artículo vas a aprender cómo iniciar y cerrar transacciones con &lt;code&gt;COMMIT&lt;/code&gt; y &lt;code&gt;ROLLBACK&lt;/code&gt;, cuándo usar savepoints, cómo funcionan los índices B-tree, bitmap y full-text, y cómo las constraints mantienen reglas de integridad dentro del esquema.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="qué-es-una-transacción-en-sql"&gt;Qué es una transacción en SQL&lt;/h2&gt;
&lt;p&gt;Una &lt;strong&gt;transacción&lt;/strong&gt; agrupa una o varias sentencias SQL que deben ejecutarse como una unidad lógica. El objetivo es que los cambios se apliquen completos o no se apliquen en absoluto.&lt;/p&gt;
&lt;p&gt;Consideremos una transferencia bancaria. Restar dinero de una cuenta y sumarlo a otra no son acciones independientes desde el punto de vista del negocio. Si una actualización se ejecuta y la otra falla, el sistema queda en un estado inconsistente.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;START&lt;/span&gt; &lt;span style="color:#c678dd"&gt;TRANSACTION&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7f848e"&gt;/* retirar dinero de la primera cuenta, validando saldo suficiente */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;UPDATE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;account&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SET&lt;/span&gt; &lt;span style="color:#e06c75"&gt;avail_balance&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;avail_balance&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;-&lt;/span&gt; &lt;span style="color:#d19a66"&gt;500&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;account_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;9988&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;AND&lt;/span&gt; &lt;span style="color:#e06c75"&gt;avail_balance&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#d19a66"&gt;500&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;IF&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#e06c75"&gt;exactly&lt;/span&gt; &lt;span style="color:#e06c75"&gt;one&lt;/span&gt; &lt;span style="color:#c678dd"&gt;row&lt;/span&gt; &lt;span style="color:#e06c75"&gt;was&lt;/span&gt; &lt;span style="color:#e06c75"&gt;updated&lt;/span&gt; &lt;span style="color:#c678dd"&gt;by&lt;/span&gt; &lt;span style="color:#e06c75"&gt;the&lt;/span&gt; &lt;span style="color:#e06c75"&gt;previous&lt;/span&gt; &lt;span style="color:#c678dd"&gt;statement&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;THEN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7f848e"&gt;/* depositar dinero en la segunda cuenta */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;UPDATE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;account&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SET&lt;/span&gt; &lt;span style="color:#e06c75"&gt;avail_balance&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;avail_balance&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#d19a66"&gt;500&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;account_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;9989&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;IF&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#e06c75"&gt;exactly&lt;/span&gt; &lt;span style="color:#e06c75"&gt;one&lt;/span&gt; &lt;span style="color:#c678dd"&gt;row&lt;/span&gt; &lt;span style="color:#e06c75"&gt;was&lt;/span&gt; &lt;span style="color:#e06c75"&gt;updated&lt;/span&gt; &lt;span style="color:#c678dd"&gt;by&lt;/span&gt; &lt;span style="color:#e06c75"&gt;the&lt;/span&gt; &lt;span style="color:#e06c75"&gt;previous&lt;/span&gt; &lt;span style="color:#c678dd"&gt;statement&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;THEN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7f848e"&gt;/* todo funcionó, hacer los cambios permanentes */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;COMMIT&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;ELSE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7f848e"&gt;/* algo falló, deshacer todos los cambios de esta transacción */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;ROLLBACK&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;END&lt;/span&gt; &lt;span style="color:#c678dd"&gt;IF&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;ELSE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7f848e"&gt;/* saldo insuficiente o error durante la actualización */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;ROLLBACK&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;END&lt;/span&gt; &lt;span style="color:#c678dd"&gt;IF&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En este flujo, &lt;code&gt;COMMIT&lt;/code&gt; confirma los cambios y &lt;code&gt;ROLLBACK&lt;/code&gt; revierte todo lo ejecutado desde el inicio de la transacción. La base de datos actúa como una frontera de consistencia.&lt;/p&gt;
&lt;h3 id="candados-y-concurrencia"&gt;Candados y concurrencia&lt;/h3&gt;
&lt;p&gt;Cuando varias sesiones intentan leer o escribir los mismos datos, el motor puede usar &lt;strong&gt;candados&lt;/strong&gt; (&lt;em&gt;locks&lt;/em&gt;) sobre filas, páginas o tablas. Los locks evitan que una transacción lea datos en transición o sobrescriba cambios que todavía no han sido confirmados.&lt;/p&gt;
&lt;h2 id="iniciar-una-transacción"&gt;Iniciar una transacción&lt;/h2&gt;
&lt;p&gt;Los servidores de base de datos suelen manejar la creación de transacciones de una de estas dos formas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Siempre existe una transacción activa asociada a la sesión. Cuando la transacción actual termina, el servidor inicia automáticamente una nueva.&lt;/li&gt;
&lt;li&gt;Cada sentencia SQL se confirma automáticamente, a menos que inicies una transacción explícita.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En MySQL, una transacción explícita puede comenzar con:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;start&lt;/span&gt; &lt;span style="color:#c678dd"&gt;transaction&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Puedes configurar el comportamiento de &lt;code&gt;autocommit&lt;/code&gt; según el motor y el cliente que uses.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="terminar-una-transacción"&gt;Terminar una transacción&lt;/h2&gt;
&lt;p&gt;Una vez iniciada una transacción, necesitas terminarla explícitamente para que los cambios sean permanentes. &lt;code&gt;COMMIT&lt;/code&gt; marca los cambios como definitivos y libera recursos usados durante la transacción,.&lt;/p&gt;
&lt;p&gt;Si decides deshacer lo ejecutado desde el inicio de la transacción, usas &lt;code&gt;ROLLBACK&lt;/code&gt;. El servidor devuelve los datos al estado previo de la transacción.&lt;/p&gt;
&lt;p&gt;Además de &lt;code&gt;COMMIT&lt;/code&gt; y &lt;code&gt;ROLLBACK&lt;/code&gt;, una transacción puede terminar por otros eventos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;El servidor se apaga; al reiniciar, la transacción pendiente se revierte automáticamente.&lt;/li&gt;
&lt;li&gt;Ejecutas una sentencia de esquema como &lt;code&gt;ALTER TABLE&lt;/code&gt;; en varios motores esto puede confirmar la transacción actual e iniciar otra.&lt;/li&gt;
&lt;li&gt;Ejecutas otro &lt;code&gt;START TRANSACTION&lt;/code&gt;; algunos motores confirman la transacción anterior antes de abrir la nueva.&lt;/li&gt;
&lt;li&gt;El servidor detecta un &lt;strong&gt;deadlock&lt;/strong&gt;, elige una transacción como víctima y la revierte para desbloquear el sistema.&lt;/li&gt;
&lt;/ul&gt;




 
 





 


&lt;div class="notice warning"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Warning&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Las sentencias DDL no siempre participan en transacciones igual que las sentencias DML. Antes de mezclar &lt;code&gt;ALTER TABLE&lt;/code&gt;, &lt;code&gt;CREATE INDEX&lt;/code&gt; o cambios de esquema con operaciones de datos, revisa el comportamiento específico de tu motor.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="savepoints-dentro-de-una-transacción"&gt;Savepoints dentro de una transacción&lt;/h3&gt;
&lt;p&gt;Los &lt;strong&gt;savepoints&lt;/strong&gt; permiten definir puntos intermedios de rollback dentro de una misma transacción. En lugar de revertir todo, puedes regresar a un punto específico y continuar trabajando.&lt;/p&gt;
&lt;h2 id="índices-y-constraints"&gt;Índices y constraints&lt;/h2&gt;
&lt;p&gt;Una consulta sin apoyo puede obligar al servidor a escanear fila por fila. En tablas con millones de registros y decenas de columnas, esto se convierte en un cuello de botella.&lt;/p&gt;
&lt;p&gt;Los &lt;strong&gt;índices&lt;/strong&gt; son estructuras auxiliares que permiten encontrar filas con menos trabajo. Aceleran búsquedas, filtros, joins y ordenamientos.&lt;/p&gt;
&lt;h2 id="creación-de-índices"&gt;Creación de índices&lt;/h2&gt;
&lt;p&gt;Para crear un índice en MySQL podemos usar &lt;code&gt;ALTER TABLE&lt;/code&gt;. Supongamos que el sistema consulta clientes frecuentemente por correo electrónico:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ALTER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;TABLE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ADD&lt;/span&gt; &lt;span style="color:#c678dd"&gt;INDEX&lt;/span&gt; &lt;span style="color:#e06c75"&gt;idx_email&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;email&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;Query&lt;/span&gt; &lt;span style="color:#e06c75"&gt;OK&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#e06c75"&gt;affected&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;87&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;Records&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Duplicates&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Warnings&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Después de crear el índice, el optimizador decide si conviene usarlo. El motor evalúa estadísticas, cardinalidad y costo estimado.&lt;/p&gt;
&lt;p&gt;Podemos inspeccionar los índices existentes con &lt;code&gt;SHOW INDEX&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SHOW&lt;/span&gt; &lt;span style="color:#c678dd"&gt;INDEX&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt; \&lt;span style="color:#c678dd"&gt;G&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;***************************&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;. &lt;span style="color:#c678dd"&gt;row&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;***************************&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;Table&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;Non_unique&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;Key_name&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;idx_email&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;Seq_in_index&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;Column_name&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;email&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;Collation&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;A&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;Cardinality&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;599&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;Sub_part&lt;/span&gt;: &lt;span style="color:#c678dd"&gt;NULL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;Packed&lt;/span&gt;: &lt;span style="color:#c678dd"&gt;NULL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;Null&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;YES&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;Index_type&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;BTREE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;5&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;06&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Y también podemos eliminarlos cuando dejan de aportar valor:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ALTER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;TABLE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;DROP&lt;/span&gt; &lt;span style="color:#c678dd"&gt;INDEX&lt;/span&gt; &lt;span style="color:#e06c75"&gt;idx_email&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;Query&lt;/span&gt; &lt;span style="color:#e06c75"&gt;OK&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#e06c75"&gt;affected&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;50&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;Records&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Duplicates&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Warnings&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



 
 





 


&lt;div class="notice info"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Info&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Cada índice ocupa espacio y debe actualizarse cuando cambian las filas afectadas. Un índice acelera lecturas específicas, pero también puede encarecer escrituras como &lt;code&gt;INSERT&lt;/code&gt;, &lt;code&gt;UPDATE&lt;/code&gt; y &lt;code&gt;DELETE&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="índices-únicos"&gt;Índices únicos&lt;/h2&gt;
&lt;p&gt;Un &lt;strong&gt;índice único&lt;/strong&gt; cumple dos funciones: acelera búsquedas y evita valores duplicados en las columnas indexadas. Cada vez que insertas una fila o modificas la columna, el servidor valida si el valor ya existe.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ALTER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;TABLE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ADD&lt;/span&gt; &lt;span style="color:#c678dd"&gt;UNIQUE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;idx_email&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;email&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;Query&lt;/span&gt; &lt;span style="color:#e06c75"&gt;OK&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#e06c75"&gt;affected&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;64&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;Records&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Duplicates&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Warnings&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si intentas insertar un cliente con un email ya registrado, el motor rechaza la operación:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;INSERT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;INTO&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;store_id&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;email&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;address_id&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;active&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;VALUES&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;,&lt;span style="color:#98c379"&gt;&amp;#39;ALAN&amp;#39;&lt;/span&gt;,&lt;span style="color:#98c379"&gt;&amp;#39;KAHN&amp;#39;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#39;ALAN.KAHN@sakilacustomer.org&amp;#39;&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;394&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;ERROR&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1062&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;23000&lt;/span&gt;): &lt;span style="color:#e06c75"&gt;Duplicate&lt;/span&gt; &lt;span style="color:#e06c75"&gt;entry&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;ALAN.KAHN@sakilacustomer.org&amp;#39;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;for&lt;/span&gt; &lt;span style="color:#c678dd"&gt;key&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;idx_email&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="índices-multicolumna"&gt;Índices multicolumna&lt;/h2&gt;
&lt;p&gt;También puedes crear índices que cubren varias columnas. Si buscas clientes por apellido y nombre, un índice compuesto puede ser más útil que dos índices separados.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ALTER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;TABLE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ADD&lt;/span&gt; &lt;span style="color:#c678dd"&gt;INDEX&lt;/span&gt; &lt;span style="color:#e06c75"&gt;idx_full_name&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;Query&lt;/span&gt; &lt;span style="color:#e06c75"&gt;OK&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#e06c75"&gt;affected&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;35&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;Records&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Duplicates&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Warnings&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El orden importa. Un índice &lt;code&gt;(last_name, first_name)&lt;/code&gt; ayuda a consultas que filtran por &lt;code&gt;last_name&lt;/code&gt; o por &lt;code&gt;last_name&lt;/code&gt; junto con &lt;code&gt;first_name&lt;/code&gt;. No ayuda igual a una consulta que filtra solo por &lt;code&gt;first_name&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="tipos-de-índices"&gt;Tipos de índices&lt;/h2&gt;
&lt;h3 id="índices-b-tree"&gt;Índices B-tree&lt;/h3&gt;
&lt;p&gt;Los índices &lt;strong&gt;B-tree&lt;/strong&gt; organizan los valores como árboles balanceados. Los &lt;strong&gt;branch nodes&lt;/strong&gt; sirven para navegar por rangos, mientras que los &lt;strong&gt;leaf nodes&lt;/strong&gt; almacenan los valores reales del índice.&lt;/p&gt;
&lt;p&gt;Branch nodes dirigen la búsqueda hacia el rango correcto; leaf nodes contienen las entradas finales asociadas a los valores indexados.&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 root["Nodo raíz&lt;br/&gt;A - M | N - Z"]
 b1["A-C | D-F | G-I | J-M"]
 b2["N-P | Q-S | T-V | W-Z"]
 root --&gt; b1
 root --&gt; b2
 b1 --&gt; l1["Barker&lt;br/&gt;Blake"]
 b1 --&gt; l2["Fleming&lt;br/&gt;Fowler"]
 b1 --&gt; l3["Gooding&lt;br/&gt;Grossman&lt;br/&gt;Hawthorne"]
 b1 --&gt; l4["Jameson&lt;br/&gt;Markham&lt;br/&gt;Mason"]
 b2 --&gt; l5["Parker&lt;br/&gt;Portman"]
 b2 --&gt; l6["Roberts&lt;br/&gt;Smith"]
 b2 --&gt; l7["Tucker&lt;br/&gt;Tulman&lt;br/&gt;Tyler"]
 b2 --&gt; l8["Ziegler"]
&lt;/pre&gt;

&lt;p&gt;Este tipo de índice funciona muy bien para columnas con muchos valores distintos, como &lt;code&gt;customer.last_name&lt;/code&gt;, fechas, identificadores externos o campos usados en rangos.&lt;/p&gt;
&lt;h3 id="índices-bitmap"&gt;Índices bitmap&lt;/h3&gt;
&lt;p&gt;Los &lt;strong&gt;bitmap indexes&lt;/strong&gt; están diseñados para columnas de baja cardinalidad, es decir, columnas con pocos valores posibles repetidos en muchas filas. Un ejemplo clásico es &lt;code&gt;customer.active&lt;/code&gt;, donde puede haber solo &lt;code&gt;1&lt;/code&gt; para activo y &lt;code&gt;0&lt;/code&gt; para inactivo.&lt;/p&gt;
&lt;p&gt;En lugar de mantener un árbol grande, el motor mantiene bitmaps por valor. Para consultar clientes inactivos, puede recorrer el bitmap del valor &lt;code&gt;0&lt;/code&gt; y localizar las filas correspondientes.&lt;/p&gt;
&lt;p&gt;Esta estrategia es compacta para baja cardinalidad, pero se degrada cuando la columna tiene demasiados valores distintos.&lt;/p&gt;
&lt;h3 id="índices-de-texto"&gt;Índices de texto&lt;/h3&gt;
&lt;p&gt;Cuando almacenas documentos o contenido largo, buscar palabras con un escaneo completo es costoso.&lt;/p&gt;
&lt;p&gt;MySQL y SQL Server ofrecen índices &lt;strong&gt;full-text&lt;/strong&gt;; Oracle incluye herramientas bajo &lt;strong&gt;Oracle Text&lt;/strong&gt;. Estos mecanismos están especializados para documentos y búsquedas textuales.&lt;/p&gt;
&lt;h2 id="cómo-se-usan-los-índices"&gt;Cómo se usan los índices&lt;/h2&gt;
&lt;p&gt;Los índices permiten acceder rápidamente a datos, pero el motor decide si usarlos según el plan de ejecución. Un índice creado no garantiza automáticamente una consulta más rápida.&lt;/p&gt;
&lt;p&gt;Observemos tres criterios prácticos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Crea índices alrededor de consultas frecuentes, no alrededor de columnas al azar.&lt;/li&gt;
&lt;li&gt;Evita indexar columnas con baja selectividad usando B-tree si el motor ofrece una estrategia mejor.&lt;/li&gt;
&lt;li&gt;Mide el impacto en escrituras, porque cada índice debe mantenerse actualizado.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="constraints-restricciones-de-integridad"&gt;Constraints: restricciones de integridad&lt;/h2&gt;
&lt;p&gt;Una &lt;strong&gt;constraint&lt;/strong&gt; es una restricción aplicada a una o más columnas de una tabla. Vive dentro del esquema y protege los datos desde la base.&lt;/p&gt;
&lt;p&gt;Los tipos principales son:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Primary key constraints&lt;/strong&gt;: identifican la columna o combinación de columnas que garantizan unicidad dentro de una tabla.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Foreign key constraints&lt;/strong&gt;: restringen una o más columnas para que contengan valores existentes en la primary key de otra tabla.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unique constraints&lt;/strong&gt;: evitan duplicados en una o más columnas; una primary key es un caso especial de unicidad.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check constraints&lt;/strong&gt;: restringen los valores permitidos para una columna según una condición.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Normalmente las constraints se crean junto con la tabla usando &lt;code&gt;CREATE TABLE&lt;/code&gt;. Este ejemplo del esquema Sakila combina primary key, índices y foreign keys:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;CREATE&lt;/span&gt; &lt;span style="color:#c678dd"&gt;TABLE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;SMALLINT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;UNSIGNED&lt;/span&gt; &lt;span style="color:#c678dd"&gt;NOT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;NULL&lt;/span&gt; &lt;span style="color:#e06c75"&gt;AUTO_INCREMENT&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;store_id&lt;/span&gt; &lt;span style="color:#e06c75"&gt;TINYINT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;UNSIGNED&lt;/span&gt; &lt;span style="color:#c678dd"&gt;NOT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;VARCHAR&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;45&lt;/span&gt;) &lt;span style="color:#c678dd"&gt;NOT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;VARCHAR&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;45&lt;/span&gt;) &lt;span style="color:#c678dd"&gt;NOT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;email&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;VARCHAR&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;50&lt;/span&gt;) &lt;span style="color:#c678dd"&gt;DEFAULT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;address_id&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;SMALLINT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;UNSIGNED&lt;/span&gt; &lt;span style="color:#c678dd"&gt;NOT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;active&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;BOOLEAN&lt;/span&gt; &lt;span style="color:#c678dd"&gt;NOT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;NULL&lt;/span&gt; &lt;span style="color:#c678dd"&gt;DEFAULT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;TRUE&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;create_date&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DATETIME&lt;/span&gt; &lt;span style="color:#c678dd"&gt;NOT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;last_update&lt;/span&gt; &lt;span style="color:#c678dd"&gt;TIMESTAMP&lt;/span&gt; &lt;span style="color:#c678dd"&gt;DEFAULT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;CURRENT_TIMESTAMP&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#c678dd"&gt;UPDATE&lt;/span&gt; &lt;span style="color:#c678dd"&gt;CURRENT_TIMESTAMP&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#c678dd"&gt;KEY&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;KEY&lt;/span&gt; &lt;span style="color:#e06c75"&gt;idx_fk_store_id&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;store_id&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;KEY&lt;/span&gt; &lt;span style="color:#e06c75"&gt;idx_fk_address_id&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;address_id&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;KEY&lt;/span&gt; &lt;span style="color:#e06c75"&gt;idx_last_name&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;CONSTRAINT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fk_customer_address&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FOREIGN&lt;/span&gt; &lt;span style="color:#c678dd"&gt;KEY&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;address_id&lt;/span&gt;) 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;REFERENCES&lt;/span&gt; &lt;span style="color:#e06c75"&gt;address&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;address_id&lt;/span&gt;) &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#c678dd"&gt;DELETE&lt;/span&gt; &lt;span style="color:#c678dd"&gt;RESTRICT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#c678dd"&gt;UPDATE&lt;/span&gt; &lt;span style="color:#c678dd"&gt;CASCADE&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;CONSTRAINT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fk_customer_store&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FOREIGN&lt;/span&gt; &lt;span style="color:#c678dd"&gt;KEY&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;store_id&lt;/span&gt;) 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;REFERENCES&lt;/span&gt; &lt;span style="color:#e06c75"&gt;store&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;store_id&lt;/span&gt;) &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#c678dd"&gt;DELETE&lt;/span&gt; &lt;span style="color:#c678dd"&gt;RESTRICT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#c678dd"&gt;UPDATE&lt;/span&gt; &lt;span style="color:#c678dd"&gt;CASCADE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)&lt;span style="color:#e06c75"&gt;ENGINE&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#e06c75"&gt;InnoDB&lt;/span&gt; &lt;span style="color:#c678dd"&gt;DEFAULT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CHARSET&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#e06c75"&gt;utf8&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;También puedes agregar constraints después con &lt;code&gt;ALTER TABLE&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;ALTER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;TABLE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;ADD&lt;/span&gt; &lt;span style="color:#c678dd"&gt;CONSTRAINT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fk_customer_address&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FOREIGN&lt;/span&gt; &lt;span style="color:#c678dd"&gt;KEY&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;address_id&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;REFERENCES&lt;/span&gt; &lt;span style="color:#e06c75"&gt;address&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;address_id&lt;/span&gt;) &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#c678dd"&gt;DELETE&lt;/span&gt; &lt;span style="color:#c678dd"&gt;RESTRICT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#c678dd"&gt;UPDATE&lt;/span&gt; &lt;span style="color:#c678dd"&gt;CASCADE&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;ALTER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;TABLE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;ADD&lt;/span&gt; &lt;span style="color:#c678dd"&gt;CONSTRAINT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fk_customer_store&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FOREIGN&lt;/span&gt; &lt;span style="color:#c678dd"&gt;KEY&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;store_id&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;REFERENCES&lt;/span&gt; &lt;span style="color:#e06c75"&gt;store&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;store_id&lt;/span&gt;) &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#c678dd"&gt;DELETE&lt;/span&gt; &lt;span style="color:#c678dd"&gt;RESTRICT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#c678dd"&gt;UPDATE&lt;/span&gt; &lt;span style="color:#c678dd"&gt;CASCADE&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La cláusula &lt;code&gt;ON DELETE RESTRICT&lt;/code&gt; protege contra registros huérfanos cuando se intenta eliminar una fila padre.&lt;/p&gt;
&lt;p&gt;Para foreign keys, las acciones comunes ante borrados y actualizaciones son:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ON DELETE RESTRICT&lt;/code&gt;: impide borrar la fila padre si existen filas hijas relacionadas.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ON DELETE CASCADE&lt;/code&gt;: borra automáticamente las filas hijas cuando se borra la fila padre.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ON DELETE SET NULL&lt;/code&gt;: asigna &lt;code&gt;NULL&lt;/code&gt; en la foreign key de las filas hijas cuando se borra la fila padre.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ON UPDATE RESTRICT&lt;/code&gt;: impide actualizar la clave padre si hay filas hijas relacionadas.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ON UPDATE CASCADE&lt;/code&gt;: propaga el cambio de clave hacia las filas hijas.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ON UPDATE SET NULL&lt;/code&gt;: asigna &lt;code&gt;NULL&lt;/code&gt; en la foreign key de las filas hijas cuando cambia la clave padre.&lt;/li&gt;
&lt;/ul&gt;




 
 





 


&lt;div class="notice warning"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Warning&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;&lt;code&gt;CASCADE&lt;/code&gt; es potente, pero debe modelarse con cuidado. Una eliminación pequeña puede disparar borrados en varias tablas.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="conclusión-de-la-serie-sql"&gt;Conclusión de la serie SQL&lt;/h2&gt;
&lt;p&gt;Las transacciones, índices y constraints completan la base práctica para trabajar con SQL de forma profesional. Protegen operaciones compuestas, reducen el costo de acceso a datos y llevan reglas críticas al esquema.&lt;/p&gt;
&lt;p&gt;Con este artículo cerramos la serie de SQL. Para repasar desde el inicio, vuelve a: &lt;a href="https://blog.dacadev.com/programacion/sql/01-fundamentos-sql-select-from-where"



 


&gt;Fundamentos SQL: SELECT, FROM y WHERE&lt;/a&gt;. Desde ahí puedes recorrer consultas, filtros, joins, agrupaciones, subconsultas, vistas y estos mecanismos de integridad y rendimiento.&lt;/p&gt;</content:encoded></item><item><title>SQL: Vistas (Views) para Abstraer y Asegurar tus Datos</title><link>https://blog.dacadev.com/programacion/sql/07-vistas-views/</link><pubDate>Tue, 23 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/sql/07-vistas-views/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Aprende a crear vistas en SQL con CREATE VIEW para abstraer consultas, proteger datos sensibles y entender cuándo una vista es actualizable.</description><media:content url="https://blog.dacadev.com/images/programming/sql/views/banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#qué-es-una-vista"&gt;Qué es una vista&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#por-qué-usar-vistas"&gt;Por qué usar vistas&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#seguridad-de-los-datos"&gt;Seguridad de los datos&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#agregar-datos"&gt;Agregar datos&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#esconder-complejidad"&gt;Esconder complejidad&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#datos-distribuidos-o-particionados"&gt;Datos distribuidos o particionados&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#vistas-actualizables"&gt;Vistas actualizables&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#actualizando-vistas-simples"&gt;Actualizando vistas simples&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#conclusión"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;Cuando una base de datos crece, las consultas empiezan a acumular lógica de negocio, joins repetidos, filtros de seguridad y columnas calculadas. En ese punto, las &lt;strong&gt;vistas en SQL&lt;/strong&gt; se vuelven una herramienta clave: con &lt;code&gt;CREATE VIEW&lt;/code&gt; podemos encapsular una consulta y exponerla como si fuera una tabla lógica. En el artículo anterior vimos &lt;a href="https://blog.dacadev.com/programacion/sql/06-subqueries-subconsultas"



 


&gt;subqueries y subconsultas&lt;/a&gt;; ahora vamos a usar ese mismo nivel de composición para abstraer, asegurar y simplificar el acceso a datos.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;En este artículo analizaremos qué es una vista, cómo crearla con &lt;code&gt;CREATE VIEW&lt;/code&gt;, por qué ayuda con seguridad, agregación, complejidad y datos distribuidos, y qué condiciones debe cumplir una vista para ser actualizable.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="qué-es-una-vista"&gt;Qué es una vista&lt;/h2&gt;
&lt;p&gt;Una &lt;strong&gt;vista&lt;/strong&gt; no es una tabla física. En términos prácticos, es una consulta guardada en la base de datos que puedes consultar con &lt;code&gt;SELECT&lt;/code&gt; como si fuera una tabla. La vista no almacena los registros por sí misma; almacena la definición del query que se ejecutará cuando accedas a ella.&lt;/p&gt;
&lt;p&gt;Esto reduce repetición y mejora la legibilidad. Si una consulta se usa todos los días, o si quieres exponer solo ciertas columnas a un equipo o aplicación, una vista ofrece una interfaz estable sobre las tablas base.&lt;/p&gt;
&lt;p&gt;Consideremos una vista sobre la tabla &lt;code&gt;customer&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;CREATE&lt;/span&gt; &lt;span style="color:#c678dd"&gt;VIEW&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_vw&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;email&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;AS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;concat&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;substr&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;email&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;2&lt;/span&gt;), &lt;span style="color:#98c379"&gt;&amp;#39;*****&amp;#39;&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;substr&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;email&lt;/span&gt;, &lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;4&lt;/span&gt;)) &lt;span style="color:#e06c75"&gt;email&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En este ejemplo, la vista &lt;code&gt;customer_vw&lt;/code&gt; expone &lt;code&gt;customer_id&lt;/code&gt;, &lt;code&gt;first_name&lt;/code&gt;, &lt;code&gt;last_name&lt;/code&gt; y &lt;code&gt;email&lt;/code&gt;. Observemos un detalle importante: el email no se entrega completo, sino enmascarado mediante &lt;code&gt;concat()&lt;/code&gt; y &lt;code&gt;substr()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Para usar la vista, la consultamos como cualquier otra relación:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;email&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_vw&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+--------------+-------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;email&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+--------------+-------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;MARY&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SMITH&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;MA&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;*****&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;org&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PATRICIA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JOHNSON&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PA&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;*****&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;org&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;LINDA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;WILLIAMS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;LI&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;*****&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;org&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;BARBARA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JONES&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;BA&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;*****&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;org&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ELIZABETH&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;BROWN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;EL&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;*****&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;org&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ENRIQUE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FORSYTHE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;EN&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;*****&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;org&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FREDDIE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DUGGAN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FR&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;*****&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;org&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;WADE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DELVALLE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;WA&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;*****&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;org&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;AUSTIN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CINTRON&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;AU&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;*****&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;org&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+--------------+-------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;599&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;00&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La consulta queda más expresiva: en lugar de repetir el cálculo del email en cada reporte, centralizamos esa lógica en una vista.&lt;/p&gt;
&lt;p&gt;Si necesitas inspeccionar la estructura de una vista, puedes usar &lt;code&gt;DESCRIBE&lt;/code&gt; o su forma corta &lt;code&gt;DESC&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;describe&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_vw&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+----------------------+------+-----+---------+-------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Field&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;Type&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;Null&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;Key&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;Default&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Extra&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+----------------------+------+-----+---------+-------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;smallint&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;5&lt;/span&gt;) &lt;span style="color:#e06c75"&gt;unsigned&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;NO&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;varchar&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;45&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;NO&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;NULL&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;varchar&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;45&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;NO&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;NULL&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;email&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;varchar&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;11&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;YES&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;NULL&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+----------------------+------+-----+---------+-------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;4&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;00&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Puedes usar en vistas gran parte de lo que ya conoces de SQL: &lt;code&gt;WHERE&lt;/code&gt;, &lt;code&gt;ORDER BY&lt;/code&gt;, &lt;code&gt;GROUP BY&lt;/code&gt;, funciones, expresiones calculadas e incluso &lt;code&gt;JOIN&lt;/code&gt;. La vista encapsula la consulta; no elimina la necesidad de diseñarla correctamente.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="por-qué-usar-vistas"&gt;Por qué usar vistas&lt;/h2&gt;
&lt;p&gt;Las vistas son útiles cuando necesitas definir una capa de acceso estable entre las tablas reales y los consumidores de datos. Esa capa puede servir para seguridad, reporting, simplificación de consultas o unificación de datos.&lt;/p&gt;
&lt;h3 id="seguridad-de-los-datos"&gt;Seguridad de los datos&lt;/h3&gt;
&lt;p&gt;Cuando los usuarios consultan directamente las tablas base, pueden quedar expuestas columnas sensibles que no deberían estar disponibles para todos los perfiles. Una vista permite publicar solo las columnas necesarias y, si hace falta, transformar datos antes de mostrarlos.&lt;/p&gt;
&lt;p&gt;El ejemplo de &lt;code&gt;customer_vw&lt;/code&gt; aplica este patrón: el email se expone enmascarado. En una aplicación interna, podrías conceder permisos sobre la vista y evitar permisos directos sobre &lt;code&gt;customer&lt;/code&gt;. Así reduces superficie de exposición sin duplicar datos.&lt;/p&gt;
&lt;p&gt;Este enfoque también estabiliza contratos. Si la tabla base contiene más columnas en el futuro, los consumidores de la vista no las reciben automáticamente.&lt;/p&gt;
&lt;h3 id="agregar-datos"&gt;Agregar datos&lt;/h3&gt;
&lt;p&gt;Las vistas también funcionan bien para reportes o consultas agregadas. Si un equipo necesita revisar ventas por categoría de película, no tiene que escribir todos los &lt;code&gt;JOIN&lt;/code&gt; cada vez.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;CREATE&lt;/span&gt; &lt;span style="color:#c678dd"&gt;VIEW&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sales_by_film_category&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;AS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;name&lt;/span&gt; &lt;span style="color:#c678dd"&gt;AS&lt;/span&gt; &lt;span style="color:#e06c75"&gt;category&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;SUM&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;p&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;amount&lt;/span&gt;) &lt;span style="color:#c678dd"&gt;AS&lt;/span&gt; &lt;span style="color:#e06c75"&gt;total_sales&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;payment&lt;/span&gt; &lt;span style="color:#c678dd"&gt;AS&lt;/span&gt; &lt;span style="color:#e06c75"&gt;p&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;INNER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental&lt;/span&gt; &lt;span style="color:#c678dd"&gt;AS&lt;/span&gt; &lt;span style="color:#e06c75"&gt;r&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#e06c75"&gt;p&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;rental_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;r&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;rental_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;INNER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;inventory&lt;/span&gt; &lt;span style="color:#c678dd"&gt;AS&lt;/span&gt; &lt;span style="color:#e06c75"&gt;i&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#e06c75"&gt;r&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;inventory_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;i&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;inventory_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;INNER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film&lt;/span&gt; &lt;span style="color:#c678dd"&gt;AS&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#e06c75"&gt;i&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;INNER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film_category&lt;/span&gt; &lt;span style="color:#c678dd"&gt;AS&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fc&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fc&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;INNER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;category&lt;/span&gt; &lt;span style="color:#c678dd"&gt;AS&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fc&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;category_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;category_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;GROUP&lt;/span&gt; &lt;span style="color:#c678dd"&gt;BY&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;ORDER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;BY&lt;/span&gt; &lt;span style="color:#e06c75"&gt;total_sales&lt;/span&gt; &lt;span style="color:#c678dd"&gt;DESC&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Esta vista encapsula una agregación de pagos por categoría. El consumidor puede ejecutar &lt;code&gt;SELECT * FROM sales_by_film_category;&lt;/code&gt; y enfocarse en el resultado, no en la mecánica de las relaciones.&lt;/p&gt;




 
 





 


&lt;div class="notice info"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Info&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Una vista con agregaciones no materializa necesariamente el resultado. En muchos motores, la consulta se evalúa al leer la vista. Si el reporte es costoso y se consulta con alta frecuencia, analiza índices, planes de ejecución o alternativas como vistas materializadas cuando tu motor las soporte.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="esconder-complejidad"&gt;Esconder complejidad&lt;/h3&gt;
&lt;p&gt;Otra ventaja importante es ocultar consultas complejas detrás de un nombre claro. Analicemos una vista que resume estadísticas de películas usando subconsultas:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;CREATE&lt;/span&gt; &lt;span style="color:#c678dd"&gt;VIEW&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film_stats&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;AS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;title&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;description&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;rating&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;category&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;INNER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film_category&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;category_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fc&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;category_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fc&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt;) &lt;span style="color:#e06c75"&gt;category_name&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;count&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film_actor&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fa&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fa&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ) &lt;span style="color:#e06c75"&gt;num_actors&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;count&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;inventory&lt;/span&gt; &lt;span style="color:#e06c75"&gt;i&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;i&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ) &lt;span style="color:#e06c75"&gt;inventory_cnt&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;count&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;inventory&lt;/span&gt; &lt;span style="color:#e06c75"&gt;i&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;INNER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental&lt;/span&gt; &lt;span style="color:#e06c75"&gt;r&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#e06c75"&gt;i&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;inventory_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;r&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;inventory_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;i&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ) &lt;span style="color:#e06c75"&gt;num_rentals&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Esta consulta mezcla columnas directas, subqueries correlacionadas y conteos derivados. Usar &lt;code&gt;film_stats&lt;/code&gt; como interfaz simplifica el consumo y reduce errores de copia al reutilizar la lógica.&lt;/p&gt;
&lt;p&gt;También mejora la comunicación técnica. Un nombre como &lt;code&gt;film_stats&lt;/code&gt; expresa intención de negocio mejor que una consulta extensa pegada en múltiples servicios, dashboards o scripts.&lt;/p&gt;
&lt;h3 id="datos-distribuidos-o-particionados"&gt;Datos distribuidos o particionados&lt;/h3&gt;
&lt;p&gt;Las vistas pueden ayudar a unificar datos que viven en diferentes tablas. Si una tabla está particionada por año, por región o por tipo de entidad, una vista puede presentar una estructura más simple para quien consulta.&lt;/p&gt;
&lt;p&gt;El objetivo no es ocultar decisiones arquitectónicas críticas, sino evitar que cada consumidor tenga que conocer todos los detalles físicos del modelo. Una vista puede funcionar como una API interna de lectura dentro de la base de datos.&lt;/p&gt;
&lt;h2 id="vistas-actualizables"&gt;Vistas actualizables&lt;/h2&gt;
&lt;p&gt;Hasta ahora hemos usado vistas para leer datos. Sin embargo, algunos motores permiten ejecutar &lt;code&gt;UPDATE&lt;/code&gt;, &lt;code&gt;INSERT&lt;/code&gt; o &lt;code&gt;DELETE&lt;/code&gt; a través de una vista, siempre que la base de datos pueda mapear la operación de forma inequívoca hacia las tablas base.&lt;/p&gt;
&lt;p&gt;No todas las vistas son actualizables. Mientras más transformación tenga una vista, más difícil será determinar qué fila y qué columna real debe modificarse.&lt;/p&gt;
&lt;p&gt;Para que una vista sea actualizable, considera estas restricciones típicas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No se usan funciones de agregación como &lt;code&gt;max()&lt;/code&gt;, &lt;code&gt;min()&lt;/code&gt;, &lt;code&gt;avg()&lt;/code&gt;, &lt;code&gt;sum()&lt;/code&gt; o similares.&lt;/li&gt;
&lt;li&gt;La vista no utiliza cláusulas &lt;code&gt;GROUP BY&lt;/code&gt; ni &lt;code&gt;HAVING&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;No existen subconsultas en el &lt;code&gt;SELECT&lt;/code&gt; ni en el &lt;code&gt;FROM&lt;/code&gt;; y las subconsultas en el &lt;code&gt;WHERE&lt;/code&gt;, si existen, no hacen referencia a tablas del &lt;code&gt;FROM&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;La vista no utiliza &lt;code&gt;UNION&lt;/code&gt;, &lt;code&gt;UNION ALL&lt;/code&gt; ni &lt;code&gt;DISTINCT&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;La cláusula &lt;code&gt;FROM&lt;/code&gt; incluye al menos una tabla o una vista actualizable.&lt;/li&gt;
&lt;li&gt;Si hay más de una tabla o vista en el &lt;code&gt;FROM&lt;/code&gt;, se usan únicamente &lt;code&gt;INNER JOIN&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




 
 





 


&lt;div class="notice warning"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Warning&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Las reglas exactas dependen del motor de base de datos. MySQL, PostgreSQL, SQL Server y Oracle tienen diferencias en sintaxis, permisos y casos soportados. Antes de depender de escrituras sobre vistas en producción, valida el comportamiento en tu motor específico.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="actualizando-vistas-simples"&gt;Actualizando vistas simples&lt;/h3&gt;
&lt;p&gt;Supongamos nuevamente la vista &lt;code&gt;customer_vw&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;CREATE&lt;/span&gt; &lt;span style="color:#c678dd"&gt;VIEW&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_vw&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;email&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;AS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;concat&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;substr&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;email&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;2&lt;/span&gt;), &lt;span style="color:#98c379"&gt;&amp;#39;*****&amp;#39;&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;substr&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;email&lt;/span&gt;, &lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;4&lt;/span&gt;)) &lt;span style="color:#e06c75"&gt;email&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Podemos actualizar una columna directa de la tabla base, como &lt;code&gt;last_name&lt;/code&gt;, usando la vista:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;UPDATE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_vw&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SET&lt;/span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;SMITH-ALLEN&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;Query&lt;/span&gt; &lt;span style="color:#e06c75"&gt;OK&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;1&lt;/span&gt; &lt;span style="color:#c678dd"&gt;row&lt;/span&gt; &lt;span style="color:#e06c75"&gt;affected&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;11&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;Rows&lt;/span&gt; &lt;span style="color:#e06c75"&gt;matched&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Changed&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Warnings&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La operación funciona porque &lt;code&gt;last_name&lt;/code&gt; corresponde directamente a una columna actualizable de &lt;code&gt;customer&lt;/code&gt;. La vista actúa como una capa de acceso, pero el motor sabe qué valor modificar.&lt;/p&gt;
&lt;p&gt;En cambio, si intentamos actualizar &lt;code&gt;email&lt;/code&gt;, la operación falla:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;UPDATE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_vw&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SET&lt;/span&gt; &lt;span style="color:#e06c75"&gt;email&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;MARY.SMITH-ALLEN@sakilacustomer.org&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;ERROR&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1348&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;HY000&lt;/span&gt;): &lt;span style="color:#c678dd"&gt;Column&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;email&amp;#39;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;is&lt;/span&gt; &lt;span style="color:#c678dd"&gt;not&lt;/span&gt; &lt;span style="color:#e06c75"&gt;updatable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La razón es que &lt;code&gt;email&lt;/code&gt; en la vista no es la columna original; es una expresión calculada con &lt;code&gt;concat()&lt;/code&gt; y &lt;code&gt;substr()&lt;/code&gt;. El motor no puede inferir cómo convertir el valor nuevo en una actualización válida de la columna base.&lt;/p&gt;
&lt;p&gt;También debes tener cuidado con &lt;code&gt;INSERT&lt;/code&gt;. Insertar a través de una vista falla cuando la vista no expone todas las columnas &lt;code&gt;NOT NULL&lt;/code&gt; de la tabla base, por lo que el &lt;code&gt;INSERT&lt;/code&gt; no puede proporcionar valores para ellas. Si esas columnas no tienen &lt;code&gt;DEFAULT&lt;/code&gt;, el motor no tiene forma segura de completar la fila.&lt;/p&gt;
&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Las vistas en SQL son una herramienta de diseño para crear interfaces de datos más limpias. Con &lt;code&gt;CREATE VIEW&lt;/code&gt; puedes encapsular consultas repetidas, proteger columnas sensibles, construir reportes agregados y esconder complejidad sin duplicar información.&lt;/p&gt;
&lt;p&gt;También es importante reconocer sus límites. Una vista no reemplaza un buen diseño de índices, no siempre mejora rendimiento y no siempre permite escritura. Cuando una vista incluye agregaciones, expresiones calculadas, &lt;code&gt;DISTINCT&lt;/code&gt;, &lt;code&gt;UNION&lt;/code&gt; o subconsultas complejas, normalmente debes tratarla como una interfaz de lectura.&lt;/p&gt;
&lt;p&gt;Como siguiente paso de la serie, analizaremos cómo proteger la consistencia y el rendimiento de operaciones más críticas con &lt;a href="https://blog.dacadev.com/programacion/sql/08-transacciones-indices-constraints"



 


&gt;transacciones, índices y constraints&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>SQL: Subqueries y Tipos de JOIN Avanzados</title><link>https://blog.dacadev.com/programacion/sql/06-subqueries-subconsultas/</link><pubDate>Sat, 20 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/sql/06-subqueries-subconsultas/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Aprende a usar subqueries en SQL: subconsultas correlacionadas, EXISTS y joins avanzados para consultar datos relacionales con precisión.</description><media:content url="https://blog.dacadev.com/images/programming/sql/subqueries/banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#qué-es-una-subquery-en-sql"&gt;Qué es una subquery en SQL&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#tipos-de-subqueries"&gt;Tipos de subqueries&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#subqueries-no-correlacionadas"&gt;Subqueries no correlacionadas&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#subqueries-de-múltiples-filas-y-una-columna"&gt;Subqueries de múltiples filas y una columna&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#subqueries-multicolumna"&gt;Subqueries multicolumna&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#subqueries-correlacionadas"&gt;Subqueries correlacionadas&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#el-operador-exists"&gt;El operador EXISTS&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#joins-avanzados-revisitando-las-uniones"&gt;JOINs avanzados: revisitando las uniones&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#outer-joins"&gt;Outer joins&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#outer-joins-de-tres-tablas"&gt;Outer joins de tres tablas&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#cross-joins"&gt;Cross joins&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#natural-joins"&gt;Natural joins&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#conclusión"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;Cuando tus consultas SQL empiezan a mezclar filtros, agregaciones y relaciones entre tablas, los &lt;code&gt;JOIN&lt;/code&gt; básicos dejan de ser suficientes para expresar ciertas reglas de negocio con claridad. Las &lt;strong&gt;subqueries&lt;/strong&gt; o &lt;strong&gt;subconsultas en SQL&lt;/strong&gt; permiten encapsular una consulta dentro de otra, reutilizar resultados intermedios y construir filtros más precisos sin mover lógica innecesaria a la aplicación. En el artículo anterior vimos &lt;a href="https://blog.dacadev.com/programacion/sql/05-consultas-multiples-tablas-joins"



 


&gt;consultas a múltiples tablas con JOINs&lt;/a&gt;; ahora vamos a extender esa base con subconsultas, &lt;code&gt;EXISTS&lt;/code&gt; y tipos de &lt;code&gt;JOIN&lt;/code&gt; más avanzados.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;En este artículo aprenderás a usar subqueries escalares, subconsultas de múltiples filas, subqueries correlacionadas, el operador &lt;code&gt;EXISTS&lt;/code&gt;, &lt;code&gt;LEFT OUTER JOIN&lt;/code&gt;, &lt;code&gt;CROSS JOIN&lt;/code&gt; y &lt;code&gt;NATURAL JOIN&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="qué-es-una-subquery-en-sql"&gt;Qué es una subquery en SQL&lt;/h2&gt;
&lt;p&gt;Una &lt;strong&gt;subquery&lt;/strong&gt; es una consulta contenida dentro de otra sentencia SQL. A la sentencia externa la llamaremos &lt;strong&gt;consulta contenedora&lt;/strong&gt; o consulta principal. La subquery siempre va entre paréntesis y, en muchos motores, se evalúa antes de que la consulta principal termine de resolver su filtro o su conjunto de datos.&lt;/p&gt;
&lt;p&gt;Como cualquier consulta, una subquery puede retornar diferentes formas de resultado:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Una sola fila con una sola columna.&lt;/li&gt;
&lt;li&gt;Múltiples filas con una sola columna.&lt;/li&gt;
&lt;li&gt;Múltiples filas con múltiples columnas.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Analicemos un primer ejemplo. Queremos obtener el cliente con el &lt;code&gt;customer_id&lt;/code&gt; más alto:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; (&lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;MAX&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt;) &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+------------+-----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+------------+-----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;599&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;AUSTIN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CINTRON&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+------------+-----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;1&lt;/span&gt; &lt;span style="color:#c678dd"&gt;row&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;27&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La subquery &lt;code&gt;(SELECT MAX(customer_id) FROM customer)&lt;/code&gt; retorna un único valor. Por eso podemos compararla con &lt;code&gt;=&lt;/code&gt; en el &lt;code&gt;WHERE&lt;/code&gt; de la consulta principal.&lt;/p&gt;




 
 





 


&lt;div class="notice info"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Info&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Cuando una subquery retorna una fila y una sola columna, se comporta como una &lt;strong&gt;subquery escalar&lt;/strong&gt;. Puedes usarla con operadores como &lt;code&gt;=&lt;/code&gt;, &lt;code&gt;&amp;lt;&amp;gt;&lt;/code&gt;, &lt;code&gt;!=&lt;/code&gt;, &lt;code&gt;&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;gt;=&lt;/code&gt;, &lt;code&gt;&amp;lt;&lt;/code&gt; y &lt;code&gt;&amp;lt;=&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="tipos-de-subqueries"&gt;Tipos de subqueries&lt;/h2&gt;
&lt;p&gt;No todas las subconsultas tienen el mismo comportamiento. La diferencia más importante está en si la subquery depende o no de la consulta principal.&lt;/p&gt;
&lt;h3 id="subqueries-no-correlacionadas"&gt;Subqueries no correlacionadas&lt;/h3&gt;
&lt;p&gt;Las &lt;strong&gt;subqueries no correlacionadas&lt;/strong&gt; no dependen directamente de la consulta contenedora. Puedes ejecutarlas por separado, inspeccionar su resultado y luego entender cómo ese resultado alimenta el &lt;code&gt;WHERE&lt;/code&gt;, &lt;code&gt;HAVING&lt;/code&gt; o incluso el &lt;code&gt;FROM&lt;/code&gt; de la consulta principal.&lt;/p&gt;
&lt;p&gt;El ejemplo anterior es una subquery no correlacionada. Observemos otro caso: obtener todas las ciudades cuyo país no sea India.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;city_id&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;city&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;city&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;country_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;&amp;lt;&amp;gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; (&lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;country_id&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;country&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;country&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;India&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------+----------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;city_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;city&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------+----------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;A&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Corua&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;La&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Corua&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Abha&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Abu&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Dhabi&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;4&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Acua&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;599&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Zhoushan&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;600&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Ziguinchor&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------+----------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;540&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;02&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Aquí la subquery retorna el &lt;code&gt;country_id&lt;/code&gt; asociado a India. La consulta principal usa ese valor para excluir todas las ciudades que pertenezcan a ese país.&lt;/p&gt;




 
 





 


&lt;div class="notice warning"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Warning&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Si usas &lt;code&gt;=&lt;/code&gt; con una subquery que retorna más de un valor, el motor no puede comparar un valor escalar contra un conjunto de filas. En ese caso necesitas operadores como &lt;code&gt;IN&lt;/code&gt;, &lt;code&gt;ANY&lt;/code&gt;, &lt;code&gt;ALL&lt;/code&gt; o reestructurar la consulta.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="subqueries-de-múltiples-filas-y-una-columna"&gt;Subqueries de múltiples filas y una columna&lt;/h3&gt;
&lt;p&gt;Cuando una subquery retorna varias filas pero una sola columna, &lt;code&gt;IN&lt;/code&gt; suele ser el operador adecuado. Este operador compara el valor del lado izquierdo contra el conjunto de valores retornado por la subquery.&lt;/p&gt;
&lt;p&gt;Consideremos una consulta para obtener ciudades de Canadá o México:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;city_id&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;city&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;city&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;country_id&lt;/span&gt; &lt;span style="color:#c678dd"&gt;IN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; (&lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;country_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;country&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;country&lt;/span&gt; &lt;span style="color:#c678dd"&gt;IN&lt;/span&gt; (&lt;span style="color:#98c379"&gt;&amp;#39;Canada&amp;#39;&lt;/span&gt;,&lt;span style="color:#98c379"&gt;&amp;#39;Mexico&amp;#39;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------+----------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;city_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;city&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------+----------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;179&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Gatineau&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;196&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Halifax&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;300&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Lethbridge&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;313&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;London&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;556&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Uruapan&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;595&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Zapopan&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------+----------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;37&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;00&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La subquery retorna los &lt;code&gt;country_id&lt;/code&gt; de ambos países. Luego &lt;code&gt;IN&lt;/code&gt; filtra las ciudades cuyo &lt;code&gt;country_id&lt;/code&gt; esté dentro de ese conjunto.&lt;/p&gt;
&lt;h3 id="subqueries-multicolumna"&gt;Subqueries multicolumna&lt;/h3&gt;
&lt;p&gt;Las &lt;strong&gt;subqueries multicolumna&lt;/strong&gt; retornan más de una columna y son útiles cuando necesitas comparar combinaciones de valores o enriquecer la lógica de selección. En SQL también es común resolver este tipo de necesidad con varias subqueries coordinadas, especialmente cuando cada filtro opera sobre una dimensión diferente.&lt;/p&gt;
&lt;p&gt;Observemos este caso: queremos encontrar pares &lt;code&gt;actor_id&lt;/code&gt; y &lt;code&gt;film_id&lt;/code&gt; donde el actor tenga apellido &lt;code&gt;MONROE&lt;/code&gt; y la película tenga clasificación &lt;code&gt;PG&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fa&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;actor_id&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;fa&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film_actor&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fa&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fa&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;actor_id&lt;/span&gt; &lt;span style="color:#c678dd"&gt;IN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; (&lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;actor_id&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;actor&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;MONROE&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;AND&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fa&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt; &lt;span style="color:#c678dd"&gt;IN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; (&lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rating&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;PG&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;----------+---------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;actor_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;----------+---------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;120&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;63&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;120&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;144&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;120&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;414&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;178&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;983&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;----------+---------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;11&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;00&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Esta consulta combina dos filtros independientes: uno sobre actores y otro sobre películas. El resultado final sale de la tabla intermedia &lt;code&gt;film_actor&lt;/code&gt;, que representa la relación muchos-a-muchos.&lt;/p&gt;
&lt;h2 id="subqueries-correlacionadas"&gt;Subqueries correlacionadas&lt;/h2&gt;
&lt;p&gt;Hasta ahora, las subqueries han sido independientes. Una &lt;strong&gt;subquery correlacionada&lt;/strong&gt;, en cambio, depende de la consulta principal porque referencia una o más columnas de la fila que se está evaluando afuera.&lt;/p&gt;
&lt;p&gt;Esto cambia el modelo mental: la subquery no se ejecuta una sola vez para producir un conjunto estático, sino que puede evaluarse por cada fila candidata de la consulta externa. Por eso conviene revisar su costo, especialmente en tablas grandes.&lt;/p&gt;
&lt;p&gt;Analicemos una consulta que obtiene clientes con exactamente 20 rentas:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;, &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#d19a66"&gt;20&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; (&lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;count&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;) &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental&lt;/span&gt; &lt;span style="color:#e06c75"&gt;r&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;r&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------+-------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------+-------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;LAUREN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;HUDSON&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JEANETTE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;GREENE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;TARA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;RYAN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;WILMA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;RICHARDS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ALFREDO&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;MCADAMS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------+-------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;15&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;01&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La parte clave es &lt;code&gt;r.customer_id = c.customer_id&lt;/code&gt;. La subquery necesita el &lt;code&gt;customer_id&lt;/code&gt; de la fila actual de &lt;code&gt;customer&lt;/code&gt;, por eso está correlacionada.&lt;/p&gt;
&lt;h3 id="el-operador-exists"&gt;El operador EXISTS&lt;/h3&gt;
&lt;p&gt;El operador &lt;code&gt;EXISTS&lt;/code&gt; valida si la subquery retorna al menos una fila. No importa qué columnas seleccione la subquery; lo relevante es la existencia de registros que cumplan la condición.&lt;/p&gt;
&lt;p&gt;Por convención, muchas consultas usan &lt;code&gt;SELECT 1&lt;/code&gt; dentro de &lt;code&gt;EXISTS&lt;/code&gt; para indicar que el valor retornado no es importante:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;, &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#c678dd"&gt;EXISTS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; (&lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental&lt;/span&gt; &lt;span style="color:#e06c75"&gt;r&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;r&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;AND&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;date&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;r&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;rental_date&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;2005-05-25&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------+-------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------+-------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CHARLOTTE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;HUNTER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DELORES&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;HANSEN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;MINNIE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ROMERO&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;NELSON&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CHRISTENSON&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------+-------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;8&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;03&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;EXISTS&lt;/code&gt; es especialmente expresivo cuando la pregunta de negocio es binaria: “incluye esta fila si existe al menos una relación que cumple la condición”.&lt;/p&gt;




 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Usa &lt;code&gt;EXISTS&lt;/code&gt; cuando quieras comprobar existencia y &lt;code&gt;IN&lt;/code&gt; cuando quieras comparar contra un conjunto concreto de valores. Ambos pueden ser optimizados por el motor, pero expresan intenciones distintas.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="joins-avanzados-revisitando-las-uniones"&gt;JOINs avanzados: revisitando las uniones&lt;/h2&gt;
&lt;p&gt;Hasta este punto de la serie hemos trabajado principalmente con &lt;code&gt;INNER JOIN&lt;/code&gt;. Ese tipo de unión retorna únicamente las filas que cumplen la condición en ambas tablas. Sin embargo, SQL ofrece variantes útiles para preservar filas sin coincidencias, generar combinaciones cartesianas o delegar la condición de unión al motor.&lt;/p&gt;
&lt;h2 id="outer-joins"&gt;Outer joins&lt;/h2&gt;
&lt;p&gt;Los &lt;strong&gt;outer joins&lt;/strong&gt; retornan las filas que cumplen la condición de unión y, además, conservan filas de una tabla aunque no tengan coincidencias del otro lado. En un &lt;code&gt;LEFT OUTER JOIN&lt;/code&gt;, se preservan todas las filas de la tabla de la izquierda.&lt;/p&gt;
&lt;p&gt;Observemos un conteo de copias por película:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;title&lt;/span&gt;, &lt;span style="color:#c678dd"&gt;count&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;i&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;inventory_id&lt;/span&gt;) &lt;span style="color:#e06c75"&gt;num_copies&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;LEFT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;OUTER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;inventory&lt;/span&gt; &lt;span style="color:#e06c75"&gt;i&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;i&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;GROUP&lt;/span&gt; &lt;span style="color:#c678dd"&gt;BY&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;title&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------+-----------------------------+------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;title&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;num_copies&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------+-----------------------------+------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ACADEMY&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DINOSAUR&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;8&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ACE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;GOLDFINGER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ADAPTATION&lt;/span&gt; &lt;span style="color:#e06c75"&gt;HOLES&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;4&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;4&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;AFFAIR&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PREJUDICE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;7&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;14&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ALICE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FANTASIA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;999&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ZOOLANDER&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FICTION&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;5&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1000&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ZORRO&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ARK&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;8&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------+-----------------------------+------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;1000&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;01&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;ALICE FANTASIA&lt;/code&gt; aparece con &lt;code&gt;0&lt;/code&gt; copias porque no tiene registros asociados en &lt;code&gt;inventory&lt;/code&gt;. Aun así, el &lt;code&gt;LEFT OUTER JOIN&lt;/code&gt; conserva la película porque &lt;code&gt;film&lt;/code&gt; está a la izquierda.&lt;/p&gt;
&lt;p&gt;Veamos la misma situación sin agregación:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;title&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;i&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;inventory_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;LEFT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;OUTER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;inventory&lt;/span&gt; &lt;span style="color:#e06c75"&gt;i&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;i&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt; &lt;span style="color:#c678dd"&gt;BETWEEN&lt;/span&gt; &lt;span style="color:#d19a66"&gt;13&lt;/span&gt; &lt;span style="color:#c678dd"&gt;AND&lt;/span&gt; &lt;span style="color:#d19a66"&gt;15&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------+----------------+--------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;title&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;inventory_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------+----------------+--------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;13&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ALI&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FOREVER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;67&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;13&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ALI&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FOREVER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;68&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;13&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ALI&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FOREVER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;69&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;13&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ALI&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FOREVER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;70&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;14&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ALICE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FANTASIA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;NULL&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;15&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ALIEN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CENTER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;71&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;15&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ALIEN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CENTER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;72&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;15&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ALIEN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CENTER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;73&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;15&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ALIEN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CENTER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;74&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;15&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ALIEN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CENTER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;75&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;15&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ALIEN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CENTER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;76&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------+----------------+--------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;11&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;00&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El &lt;code&gt;NULL&lt;/code&gt; en &lt;code&gt;inventory_id&lt;/code&gt; indica que no existe fila relacionada en la tabla derecha.&lt;/p&gt;
&lt;h3 id="outer-joins-de-tres-tablas"&gt;Outer joins de tres tablas&lt;/h3&gt;
&lt;p&gt;Puedes encadenar &lt;code&gt;OUTER JOIN&lt;/code&gt; para preservar filas a través de varias relaciones. En este tipo de consulta, el orden importa porque define qué conjunto de filas se conserva en cada paso.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;title&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;i&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;inventory_id&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;r&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;rental_date&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;LEFT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;OUTER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;inventory&lt;/span&gt; &lt;span style="color:#e06c75"&gt;i&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;i&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;LEFT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;OUTER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental&lt;/span&gt; &lt;span style="color:#e06c75"&gt;r&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#e06c75"&gt;i&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;inventory_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;r&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;inventory_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt; &lt;span style="color:#c678dd"&gt;BETWEEN&lt;/span&gt; &lt;span style="color:#d19a66"&gt;13&lt;/span&gt; &lt;span style="color:#c678dd"&gt;AND&lt;/span&gt; &lt;span style="color:#d19a66"&gt;15&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------+----------------+--------------+---------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;title&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;inventory_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental_date&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------+----------------+--------------+---------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;13&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ALI&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FOREVER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;67&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2005&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;07&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;31&lt;/span&gt; &lt;span style="color:#d19a66"&gt;18&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;11&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;17&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;13&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ALI&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FOREVER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;67&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2005&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;08&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;22&lt;/span&gt; &lt;span style="color:#d19a66"&gt;21&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;59&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;29&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;13&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ALI&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FOREVER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;68&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2005&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;07&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;28&lt;/span&gt; &lt;span style="color:#d19a66"&gt;15&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;26&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;20&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;14&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ALICE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FANTASIA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;NULL&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;NULL&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;15&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ALIEN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CENTER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;71&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2005&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;05&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;28&lt;/span&gt; &lt;span style="color:#d19a66"&gt;02&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;06&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;37&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;15&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ALIEN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CENTER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;76&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2005&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;08&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;17&lt;/span&gt; &lt;span style="color:#d19a66"&gt;07&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;26&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;47&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------+----------------+--------------+---------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;32&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;01&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Aunque existe &lt;code&gt;RIGHT OUTER JOIN&lt;/code&gt;, en muchos equipos se prefiere estandarizar en &lt;code&gt;LEFT OUTER JOIN&lt;/code&gt;. Mantiene la lectura de izquierda a derecha y reduce cambios mentales al revisar consultas complejas.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="cross-joins"&gt;Cross joins&lt;/h2&gt;
&lt;p&gt;Un &lt;code&gt;CROSS JOIN&lt;/code&gt; produce un producto cartesiano: combina cada fila de la primera tabla con cada fila de la segunda. Es útil para generar matrices de combinaciones, calendarios, catálogos base o escenarios de prueba, pero puede crecer muy rápido.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;name&lt;/span&gt; &lt;span style="color:#e06c75"&gt;category_name&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;l&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;name&lt;/span&gt; &lt;span style="color:#e06c75"&gt;language_name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;category&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;CROSS&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#c678dd"&gt;language&lt;/span&gt; &lt;span style="color:#e06c75"&gt;l&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------------+---------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;category_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;language_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------------+---------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Action&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;English&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Action&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Italian&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Action&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Japanese&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Travel&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;English&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Travel&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;German&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------------+---------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;96&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;00&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si &lt;code&gt;category&lt;/code&gt; tiene 16 filas y &lt;code&gt;language&lt;/code&gt; tiene 6, el resultado tendrá 96 filas. Esa multiplicación es exactamente el comportamiento esperado.&lt;/p&gt;
&lt;h2 id="natural-joins"&gt;Natural joins&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;NATURAL JOIN&lt;/code&gt; deja que el motor determine las columnas de unión usando columnas con el mismo nombre en ambas tablas. Es importante conocerlo, pero no suele ser buena práctica en consultas de producción porque oculta la condición real del &lt;code&gt;JOIN&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;El siguiente ejemplo no retorna filas:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;, &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;, &lt;span style="color:#e5c07b"&gt;date&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;r&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;rental_date&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;NATURAL&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental&lt;/span&gt; &lt;span style="color:#e06c75"&gt;r&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;Empty&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;04&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El problema es que &lt;code&gt;customer&lt;/code&gt; y &lt;code&gt;rental&lt;/code&gt; pueden compartir más columnas de las que realmente queremos usar como condición natural. Al proyectar únicamente las columnas necesarias desde &lt;code&gt;customer&lt;/code&gt;, el &lt;code&gt;NATURAL JOIN&lt;/code&gt; puede comportarse como esperamos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;cust&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;cust&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;, &lt;span style="color:#e5c07b"&gt;date&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;r&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;rental_date&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; (&lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; ) &lt;span style="color:#e06c75"&gt;cust&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;NATURAL&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental&lt;/span&gt; &lt;span style="color:#e06c75"&gt;r&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------+-----------+---------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;date&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;r&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;rental_date&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------+-----------+---------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;MARY&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SMITH&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2005&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;05&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;25&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;MARY&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SMITH&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2005&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;05&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;28&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;MARY&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SMITH&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2005&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;06&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;15&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;AUSTIN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CINTRON&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2005&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;08&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;23&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------+-----------+---------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;16044&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;03&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



 
 





 


&lt;div class="notice warning"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Warning&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Prefiere &lt;code&gt;JOIN ... ON ...&lt;/code&gt; cuando la consulta debe ser mantenible. La condición explícita documenta la intención y evita cambios inesperados si el esquema gana nuevas columnas con nombres compartidos.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Las subqueries en SQL te permiten expresar reglas de negocio que dependen de resultados intermedios sin salir del motor de base de datos. Las subconsultas no correlacionadas son ideales para filtros basados en conjuntos estáticos; las correlacionadas son útiles cuando cada fila externa necesita una evaluación específica; y &lt;code&gt;EXISTS&lt;/code&gt; comunica con claridad validaciones de existencia.&lt;/p&gt;
&lt;p&gt;En el lado de los &lt;code&gt;JOIN&lt;/code&gt;, &lt;code&gt;LEFT OUTER JOIN&lt;/code&gt; conserva filas sin coincidencias, &lt;code&gt;CROSS JOIN&lt;/code&gt; genera combinaciones cartesianas y &lt;code&gt;NATURAL JOIN&lt;/code&gt; delega la condición al motor, aunque conviene usarlo con cuidado. La clave es elegir la herramienta que haga más explícita la intención de la consulta.&lt;/p&gt;
&lt;p&gt;En el siguiente artículo de la serie vamos a trabajar con &lt;a href="https://blog.dacadev.com/programacion/sql/07-vistas-views"



 


&gt;&lt;strong&gt;Vistas (Views)&lt;/strong&gt;&lt;/a&gt;, una forma práctica de encapsular consultas y exponer modelos de lectura reutilizables dentro de la base de datos.&lt;/p&gt;</content:encoded></item><item><title>Estilos CSS: Animaciones con @keyframes</title><link>https://blog.dacadev.com/programacion/estilos-css/animaciones-keyframes/</link><pubDate>Thu, 18 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/estilos-css/animaciones-keyframes/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Domina las animaciones en CSS con @keyframes: la propiedad animation, iteraciones, direction, fill-mode, play-state, accesibilidad y rendimiento, con ejemplos en vivo.</description><media:content url="https://blog.dacadev.com/images/programming/html-and-css/css/09-animaciones-keyframes-banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#transición-vs-animación"&gt;Transición vs. animación&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#la-regla-keyframes"&gt;La regla @keyframes&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#múltiples-pasos-con-porcentajes"&gt;Múltiples pasos con porcentajes&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#la-propiedad-animation-y-sus-subpropiedades"&gt;La propiedad animation y sus subpropiedades&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#iteration-count-y-direction"&gt;iteration-count y direction&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#fill-mode-el-estado-antes-y-después"&gt;fill-mode: el estado antes y después&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#play-state-y-delay"&gt;play-state y delay&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#encadenar-varias-animaciones"&gt;Encadenar varias animaciones&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#accesibilidad-respeta-prefers-reduced-motion"&gt;Accesibilidad: respeta prefers-reduced-motion&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#rendimiento-anima-en-la-capa-de-composición"&gt;Rendimiento: anima en la capa de composición&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#conclusión"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;Una transición anima el salto entre dos estados; pero cuando necesitas movimiento continuo, varios pasos intermedios o una secuencia que se repite —un spinner de carga, un latido, un texto que aparece— necesitas algo más expresivo. Ahí entran las &lt;strong&gt;animaciones con &lt;code&gt;@keyframes&lt;/code&gt;&lt;/strong&gt;, el sistema de CSS para describir secuencias de movimiento complejas de forma declarativa, sin una sola línea de JavaScript.&lt;/p&gt;
&lt;p&gt;Esta entrega extiende la serie &lt;strong&gt;Estilos CSS&lt;/strong&gt;, retomando justo donde lo dejaron las transiciones y transformaciones. Cubriremos la regla &lt;code&gt;@keyframes&lt;/code&gt;, todas las subpropiedades de &lt;code&gt;animation&lt;/code&gt;, y las consideraciones de accesibilidad y rendimiento que separan una animación profesional de una que marea al usuario.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Aprenderás a definir secuencias con &lt;code&gt;@keyframes&lt;/code&gt;, a controlarlas con la propiedad &lt;code&gt;animation&lt;/code&gt; y sus ocho subpropiedades, y a respetar las preferencias de movimiento del usuario con &lt;code&gt;prefers-reduced-motion&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="transición-vs-animación"&gt;Transición vs. animación&lt;/h2&gt;
&lt;p&gt;Aunque ambas producen movimiento, resuelven problemas distintos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Una &lt;strong&gt;transición&lt;/strong&gt; (&lt;code&gt;transition&lt;/code&gt;) interpola entre el estado actual y uno nuevo. Necesita un disparador —un &lt;code&gt;:hover&lt;/code&gt;, un cambio de clase— y va de un punto A a un punto B.&lt;/li&gt;
&lt;li&gt;Una &lt;strong&gt;animación&lt;/strong&gt; (&lt;code&gt;animation&lt;/code&gt;) ejecuta una secuencia definida en &lt;code&gt;@keyframes&lt;/code&gt;. No necesita disparador: puede arrancar sola, repetirse indefinidamente y pasar por múltiples estados intermedios.&lt;/li&gt;
&lt;/ul&gt;




 
 





 


&lt;div class="notice info"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Info&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Regla práctica: usa &lt;code&gt;transition&lt;/code&gt; para cambios de estado provocados por interacción; usa &lt;code&gt;animation&lt;/code&gt; para movimiento autónomo, cíclico o multipaso.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="la-regla-keyframes"&gt;La regla @keyframes&lt;/h2&gt;
&lt;p&gt;Una animación se define en dos partes: la &lt;strong&gt;secuencia&lt;/strong&gt; (con &lt;code&gt;@keyframes&lt;/code&gt;) y su &lt;strong&gt;aplicación&lt;/strong&gt; (con la propiedad &lt;code&gt;animation&lt;/code&gt;). La regla &lt;code&gt;@keyframes&lt;/code&gt; recibe un nombre y describe los estados de la animación en distintos momentos, expresados como porcentajes del 0% al 100% (o con las palabras clave &lt;code&gt;from&lt;/code&gt; y &lt;code&gt;to&lt;/code&gt;).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;keyframes&lt;/span&gt; &lt;span style="color:#e06c75"&gt;aparecer&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;from&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;opacity&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;translateY&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;rem&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;to&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;opacity&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;translateY&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;elemento&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;animation&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;aparecer&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.6&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;ease-out&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1.5rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;style&gt;
 @keyframes csanim-aparecer {
 from { opacity:0; transform:translateY(1rem); }
 to { opacity:1; transform:translateY(0); }
 }
 .csanim-fade { display:inline-block; background:#2a9da9; color:#fff; padding:.8em 1.4em; border-radius:.4em; animation:csanim-aparecer 1.2s ease-out infinite; }
 &lt;/style&gt;
 &lt;span class="csanim-fade"&gt;Aparezco con fade + desplazamiento&lt;/span&gt;
 &lt;p style="margin:.75rem 0 0;color:#555;"&gt;La secuencia se repite para que puedas observarla.&lt;/p&gt;
&lt;/div&gt;
&lt;h3 id="múltiples-pasos-con-porcentajes"&gt;Múltiples pasos con porcentajes&lt;/h3&gt;
&lt;p&gt;El verdadero poder de &lt;code&gt;@keyframes&lt;/code&gt; aparece con pasos intermedios. Cada porcentaje es una &amp;ldquo;foto&amp;rdquo; del estado en ese momento de la animación:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;keyframes&lt;/span&gt; &lt;span style="color:#e06c75"&gt;latido&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;0&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;%&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;scale&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;15&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;%&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;scale&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;1.25&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;30&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;%&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;scale&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;45&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;%&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;scale&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;1.15&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;60&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;%&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;scale&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1.5rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;text-align:center;"&gt;
 &lt;style&gt;
 @keyframes csanim-latido {
 0% { transform:scale(1); }
 15% { transform:scale(1.25); }
 30% { transform:scale(1); }
 45% { transform:scale(1.15); }
 60% { transform:scale(1); }
 100% { transform:scale(1); }
 }
 .csanim-heart { display:inline-block; font-size:2.5rem; color:#c0392b; animation:csanim-latido 1.5s ease-in-out infinite; }
 &lt;/style&gt;
 &lt;span class="csanim-heart"&gt;♥&lt;/span&gt;
&lt;/div&gt;
&lt;h2 id="la-propiedad-animation-y-sus-subpropiedades"&gt;La propiedad animation y sus subpropiedades&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;animation&lt;/code&gt; es una propiedad abreviada que agrupa ocho subpropiedades. Conviene conocerlas por separado para tener control fino:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Subpropiedad&lt;/th&gt;
 &lt;th&gt;Función&lt;/th&gt;
 &lt;th&gt;Ejemplo&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;animation-name&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Nombre del &lt;code&gt;@keyframes&lt;/code&gt; a ejecutar&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;aparecer&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;animation-duration&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Duración de un ciclo&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;0.6s&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;animation-timing-function&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Curva de progreso&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;ease-in-out&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;animation-delay&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Espera antes de iniciar&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;200ms&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;animation-iteration-count&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Número de repeticiones&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;infinite&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;animation-direction&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Sentido de reproducción&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;alternate&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;animation-fill-mode&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Estilos antes/después de animar&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;forwards&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;animation-play-state&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Reproducir o pausar&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;paused&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;La forma abreviada las combina en una sola declaración:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;spinner&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;animation&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;girar&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;linear&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;infinite&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7f848e"&gt;/* name | duration | timing-function | iteration-count */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="iteration-count-y-direction"&gt;iteration-count y direction&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;animation-iteration-count&lt;/code&gt; define cuántas veces se ejecuta (&lt;code&gt;infinite&lt;/code&gt; para un bucle perpetuo). &lt;code&gt;animation-direction&lt;/code&gt; controla el sentido:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;normal&lt;/code&gt; — siempre de 0% a 100%.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;reverse&lt;/code&gt; — siempre de 100% a 0%.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;alternate&lt;/code&gt; — alterna ida y vuelta en cada ciclo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;alternate-reverse&lt;/code&gt; — igual, pero empezando al revés.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El caso clásico es un &lt;strong&gt;spinner&lt;/strong&gt; de carga, que combina rotación infinita con velocidad constante:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;keyframes&lt;/span&gt; &lt;span style="color:#e06c75"&gt;girar&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;to&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;rotate&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;360&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;deg&lt;/span&gt;); } }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;spinner&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;animation&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;girar&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.8&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;linear&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;infinite&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1.5rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;text-align:center;"&gt;
 &lt;style&gt;
 @keyframes csanim-girar { to { transform:rotate(360deg); } }
 .csanim-spinner { display:inline-block; width:2.5rem; height:2.5rem; border:.3rem solid #d6eaf0; border-top-color:#2a9da9; border-radius:50%; animation:csanim-girar .8s linear infinite; }
 &lt;/style&gt;
 &lt;span class="csanim-spinner" role="status" aria-label="Cargando"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;h3 id="fill-mode-el-estado-antes-y-después"&gt;fill-mode: el estado antes y después&lt;/h3&gt;
&lt;p&gt;Por defecto, un elemento vuelve a su estilo original en cuanto la animación termina. &lt;code&gt;animation-fill-mode&lt;/code&gt; cambia ese comportamiento:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;none&lt;/code&gt; (por defecto) — no conserva estilos fuera de la ejecución.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;forwards&lt;/code&gt; — mantiene el estado del último keyframe al terminar.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;backwards&lt;/code&gt; — aplica el primer keyframe durante el &lt;code&gt;delay&lt;/code&gt;, antes de arrancar.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;both&lt;/code&gt; — combina &lt;code&gt;forwards&lt;/code&gt; y &lt;code&gt;backwards&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;forwards&lt;/code&gt; es esencial cuando quieres que el elemento permanezca en su estado final (por ejemplo, un mensaje que aparece y se queda visible):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;toast&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;animation&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;aparecer&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;ease-out&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;forwards&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="play-state-y-delay"&gt;play-state y delay&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;animation-play-state&lt;/code&gt; permite pausar (&lt;code&gt;paused&lt;/code&gt;) y reanudar (&lt;code&gt;running&lt;/code&gt;) una animación, típicamente al combinarla con &lt;code&gt;:hover&lt;/code&gt;. Aquí, la barra de progreso se anima sola pero se congela al pasar el cursor:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;keyframes&lt;/span&gt; &lt;span style="color:#e06c75"&gt;cargar&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;from&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;width&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;; } &lt;span style="color:#e06c75"&gt;to&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;width&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;100&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;%&lt;/span&gt;; } }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;barra__relleno&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;animation&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;cargar&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;ease-in-out&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;infinite&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;barra&lt;/span&gt;:&lt;span style="color:#61afef"&gt;hover&lt;/span&gt; .&lt;span style="color:#e5c07b"&gt;barra__relleno&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;animation-play-state&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;paused&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1.5rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;style&gt;
 @keyframes csanim-cargar { 0% { width:0; } 100% { width:100%; } }
 .csanim-barra { background:#e5e8e8; border-radius:1rem; overflow:hidden; height:1rem; }
 .csanim-barra__relleno { height:100%; width:0; background:linear-gradient(to right,#2a9da9,#16828d); border-radius:1rem; animation:csanim-cargar 3s ease-in-out infinite; }
 .csanim-barra:hover .csanim-barra__relleno { animation-play-state:paused; }
 &lt;/style&gt;
 &lt;div class="csanim-barra"&gt;&lt;div class="csanim-barra__relleno"&gt;&lt;/div&gt;&lt;/div&gt;
 &lt;p style="margin:.75rem 0 0;color:#555;"&gt;Pasa el cursor sobre la barra para pausar la animación.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="encadenar-varias-animaciones"&gt;Encadenar varias animaciones&lt;/h2&gt;
&lt;p&gt;Puedes aplicar varias animaciones a un mismo elemento separándolas con comas. Cada una mantiene su propia duración, retraso y curva, lo que permite componer comportamientos independientes:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;elemento&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;animation&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;aparecer&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;ease-out&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;flotar&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;ease-in-out&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;infinite&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;alternate&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1.5rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;text-align:center;"&gt;
 &lt;style&gt;
 @keyframes csanim-flotar { from { transform:translateY(0); } to { transform:translateY(-12px); } }
 .csanim-flota { display:inline-block; background:#f39c12; color:#fff; padding:1em 1.6em; border-radius:.5em; box-shadow:0 .4em .8em rgba(0,0,0,.2); animation:csanim-flotar 1.8s ease-in-out infinite alternate; }
 &lt;/style&gt;
 &lt;span class="csanim-flota"&gt;Floto suavemente&lt;/span&gt;
&lt;/div&gt;
&lt;h2 id="accesibilidad-respeta-prefers-reduced-motion"&gt;Accesibilidad: respeta prefers-reduced-motion&lt;/h2&gt;
&lt;p&gt;El movimiento excesivo puede causar mareos o malestar a personas con sensibilidad vestibular. Los sistemas operativos exponen una preferencia de &amp;ldquo;reducir movimiento&amp;rdquo;, y CSS la consulta con la media query &lt;code&gt;prefers-reduced-motion&lt;/code&gt;. Es una responsabilidad profesional desactivar o atenuar las animaciones no esenciales cuando el usuario lo solicita:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;media&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;(&lt;/span&gt;&lt;span style="color:#e06c75"&gt;prefers-reduced-motion&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;reduce&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;)&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;*,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;::&lt;span style="color:#61afef"&gt;before&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;::&lt;span style="color:#61afef"&gt;after&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;animation-duration&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0.01&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;ms&lt;/span&gt; &lt;span style="color:#7f848e"&gt;!important&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;animation-iteration-count&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt; &lt;span style="color:#7f848e"&gt;!important&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;transition-duration&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0.01&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;ms&lt;/span&gt; &lt;span style="color:#7f848e"&gt;!important&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



 
 





 


&lt;div class="notice warning"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Warning&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Ignorar &lt;code&gt;prefers-reduced-motion&lt;/code&gt; es un fallo de accesibilidad real. Reserva las animaciones llamativas para lo decorativo y asegúrate de que la interfaz siga siendo plenamente funcional cuando el movimiento se reduce.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="rendimiento-anima-en-la-capa-de-composición"&gt;Rendimiento: anima en la capa de composición&lt;/h2&gt;
&lt;p&gt;La misma regla de oro de las transiciones aplica aquí: anima propiedades que solo afecten la etapa de &lt;strong&gt;composición&lt;/strong&gt; del navegador —&lt;code&gt;transform&lt;/code&gt; y &lt;code&gt;opacity&lt;/code&gt;— en lugar de propiedades que disparen &lt;em&gt;layout&lt;/em&gt; o &lt;em&gt;paint&lt;/em&gt; (&lt;code&gt;width&lt;/code&gt;, &lt;code&gt;height&lt;/code&gt;, &lt;code&gt;top&lt;/code&gt;, &lt;code&gt;left&lt;/code&gt;, &lt;code&gt;margin&lt;/code&gt;).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;/* ❌ Costoso: recalcula layout en cada frame */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;keyframes&lt;/span&gt; &lt;span style="color:#e06c75"&gt;mover-malo&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;to&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;left&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;200&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;; } }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;/* ✅ Eficiente: solo composición, fluido a 60 fps */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;keyframes&lt;/span&gt; &lt;span style="color:#e06c75"&gt;mover-bien&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;to&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;translateX&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;200&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;); } }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Si una animación se ve entrecortada, lo primero que debes revisar es qué propiedades estás animando. Reescribir un &lt;code&gt;left&lt;/code&gt;/&lt;code&gt;top&lt;/code&gt; como &lt;code&gt;transform: translate()&lt;/code&gt; suele eliminar el &lt;em&gt;jank&lt;/em&gt; de inmediato.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Las animaciones con &lt;code&gt;@keyframes&lt;/code&gt; te dan un lenguaje declarativo para describir movimiento complejo: secuencias multipaso, bucles infinitos y comportamientos compuestos, todo en CSS puro. Dominar la propiedad &lt;code&gt;animation&lt;/code&gt; y sus subpropiedades —especialmente &lt;code&gt;fill-mode&lt;/code&gt;, &lt;code&gt;iteration-count&lt;/code&gt; y &lt;code&gt;play-state&lt;/code&gt;— te permite construir spinners, indicadores de carga y microinteracciones pulidas. Y recuerda: anima &lt;code&gt;transform&lt;/code&gt; y &lt;code&gt;opacity&lt;/code&gt;, y respeta siempre &lt;code&gt;prefers-reduced-motion&lt;/code&gt;.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;🚀 Con esta entrega completas el recorrido de la serie &lt;strong&gt;Estilos CSS&lt;/strong&gt;: desde la cascada y los selectores hasta el layout, el posicionamiento, los fondos, las transformaciones y, ahora, las animaciones. Tienes el repertorio completo para escribir CSS expresivo, accesible y de alto rendimiento.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
</content:encoded></item><item><title>SQL: Consultas a Múltiples Tablas con JOINs</title><link>https://blog.dacadev.com/programacion/sql/05-consultas-multiples-tablas-joins/</link><pubDate>Wed, 17 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/sql/05-consultas-multiples-tablas-joins/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Aprende a usar JOIN en SQL para consultar múltiples tablas, aplicar self join y combinar resultados con UNION, INTERSECT y EXCEPT.</description><media:content url="https://blog.dacadev.com/images/programming/sql/querying-multiple-tables/banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#producto-cartesiano"&gt;Producto cartesiano&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#inner-join"&gt;Inner Join&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#unir-3-o-más-tablas"&gt;Unir 3 o más tablas&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#subqueries-como-tablas"&gt;Subqueries como tablas&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#misma-tabla-dos-veces"&gt;Misma tabla dos veces&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#self-join"&gt;Self join&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#teoría-de-conjuntos"&gt;Teoría de conjuntos&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#union"&gt;UNION&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#intersect"&gt;INTERSECT&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#except"&gt;EXCEPT&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#reglas-de-operaciones-de-conjuntos"&gt;Reglas de operaciones de conjuntos&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#ordenar-resultados-con-alias-válidos"&gt;Ordenar resultados con alias válidos&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#el-orden-de-las-operaciones-importa"&gt;El orden de las operaciones importa&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#cierre"&gt;Cierre&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;Cuando una aplicación modela procesos reales, una sola tabla rara vez contiene todo el contexto. Clientes requieren direcciones, películas requieren actores y reportes operativos combinan varias entidades. Por eso, dominar &lt;strong&gt;consultas a múltiples tablas&lt;/strong&gt; y entender cada &lt;code&gt;JOIN en SQL&lt;/code&gt; es clave para escribir consultas correctas, expresivas y mantenibles.&lt;/p&gt;
&lt;p&gt;En el artículo anterior trabajamos &lt;a href="https://blog.dacadev.com/programacion/sql/04-agrupamiento-funciones-agregadas"



 


&gt;agrupamiento y funciones agregadas&lt;/a&gt;. Ahora conectaremos ese análisis con relaciones entre tablas.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Aprenderás a usar &lt;code&gt;INNER JOIN&lt;/code&gt;, unir tres o más tablas, reutilizar tablas con alias, aplicar &lt;code&gt;SELF JOIN&lt;/code&gt; y combinar resultados con &lt;code&gt;UNION&lt;/code&gt;, &lt;code&gt;INTERSECT&lt;/code&gt; y &lt;code&gt;EXCEPT&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="producto-cartesiano"&gt;Producto cartesiano&lt;/h2&gt;
&lt;p&gt;El &lt;strong&gt;producto cartesiano&lt;/strong&gt; aparece cuando haces un &lt;code&gt;JOIN&lt;/code&gt; entre dos tablas sin definir la condición que relaciona sus filas. SQL combina cada fila de la primera tabla con cada fila de la segunda.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;, &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;address&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;address&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------+-----------+----------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;address&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------+-----------+----------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;MARY&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SMITH&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;47&lt;/span&gt; &lt;span style="color:#e06c75"&gt;MySakila&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Drive&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PATRICIA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JOHNSON&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;47&lt;/span&gt; &lt;span style="color:#e06c75"&gt;MySakila&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Drive&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;LINDA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;WILLIAMS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;47&lt;/span&gt; &lt;span style="color:#e06c75"&gt;MySakila&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Drive&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FREDDIE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DUGGAN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1325&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Fukuyama&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Street&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;WADE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DELVALLE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1325&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Fukuyama&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Street&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;AUSTIN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CINTRON&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1325&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Fukuyama&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Street&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------+-----------+----------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;361197&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;03&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El resultado tiene &lt;code&gt;361,197&lt;/code&gt; filas porque &lt;code&gt;customer&lt;/code&gt; tiene &lt;code&gt;599&lt;/code&gt; registros y &lt;code&gt;address&lt;/code&gt; tiene &lt;code&gt;603&lt;/code&gt;: &lt;code&gt;599 * 603 = 361197&lt;/code&gt;. Normalmente esto indica que falta una condición &lt;code&gt;ON&lt;/code&gt;.&lt;/p&gt;




 
 





 


&lt;div class="notice warning"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Warning&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Un &lt;code&gt;JOIN&lt;/code&gt; sin condición explícita puede multiplicar el volumen de datos y degradar el rendimiento. Revisa siempre que exista una relación clara entre las tablas.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="inner-join"&gt;Inner Join&lt;/h2&gt;
&lt;p&gt;El &lt;strong&gt;&lt;code&gt;INNER JOIN&lt;/code&gt;&lt;/strong&gt; retorna solo las filas que tienen coincidencia en ambas tablas según la condición definida en &lt;code&gt;ON&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;, &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;address&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;address&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;address_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;address_id&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+--------------+----------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;address&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+--------------+----------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;MARY&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SMITH&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1913&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Hanoi&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Way&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PATRICIA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JOHNSON&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1121&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Loja&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Avenue&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;LINDA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;WILLIAMS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;692&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Joliet&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Street&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FREDDIE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DUGGAN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1103&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Quilmes&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Boulevard&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;WADE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DELVALLE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1331&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Usak&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Boulevard&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;AUSTIN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CINTRON&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1325&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Fukuyama&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Street&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+--------------+----------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;599&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;00&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Aunque muchos motores interpretan &lt;code&gt;JOIN&lt;/code&gt; como &lt;code&gt;INNER JOIN&lt;/code&gt;, escribirlo explícitamente mejora la legibilidad cuando aparecen otros tipos de unión.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;, &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;address&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt; &lt;span style="color:#c678dd"&gt;INNER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;address&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;address_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;address_id&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="unir-3-o-más-tablas"&gt;Unir 3 o más tablas&lt;/h2&gt;
&lt;p&gt;Para unir más de dos tablas, repetimos el patrón: otro &lt;code&gt;INNER JOIN&lt;/code&gt; y otra condición &lt;code&gt;ON&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;, &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;ct&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;city&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;INNER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;address&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;address_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;address_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;INNER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;city&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ct&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;city_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ct&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;city_id&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+--------------+----------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;city&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+--------------+----------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JULIE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SANCHEZ&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;A&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Corua&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;La&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Corua&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PEGGY&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;MYERS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Abha&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;TOM&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;MILNER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Abu&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Dhabi&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;BYRON&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;BOX&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Zhezqazghan&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;GUY&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;BROWNLEE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Zhoushan&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;RONNIE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;RICKETTS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Ziguinchor&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+--------------+----------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;599&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;03&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



 
 





 


&lt;div class="notice info"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Info&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;SQL es declarativo: describes qué resultado necesitas y el optimizador decide cómo ejecutarlo. El orden textual de las tablas no necesariamente define el orden físico del plan.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="subqueries-como-tablas"&gt;Subqueries como tablas&lt;/h2&gt;
&lt;p&gt;Una &lt;strong&gt;subquery&lt;/strong&gt; puede actuar como tabla derivada dentro de un &lt;code&gt;JOIN&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;, &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;addr&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;address&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;addr&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;city&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;INNER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; (&lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;address_id&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;address&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;ct&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;city&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;address&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;INNER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;city&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ct&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;city_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ct&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;city_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;district&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;California&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; ) &lt;span style="color:#e06c75"&gt;addr&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;address_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;addr&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;address_id&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------+-----------+------------------------+----------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;address&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;city&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------+-----------+------------------------+----------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PATRICIA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JOHNSON&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1121&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Loja&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Avenue&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;San&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Bernardino&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;BETTY&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;WHITE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;770&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Bydgoszcz&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Avenue&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Citrus&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Heights&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ALICE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;STEWART&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1135&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Izumisano&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Parkway&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Fontana&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JACOB&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;LANCE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1866&lt;/span&gt; &lt;span style="color:#e06c75"&gt;al&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#e06c75"&gt;Qatif&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Avenue&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;El&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Monte&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;RENE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;MCALISTER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1895&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Zhezqazghan&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Drive&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Garden&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Grove&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------+-----------+------------------------+----------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;9&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;00&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Aquí &lt;code&gt;addr&lt;/code&gt; contiene direcciones de California junto con su ciudad, y luego se une con &lt;code&gt;customer&lt;/code&gt; mediante &lt;code&gt;address_id&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="misma-tabla-dos-veces"&gt;Misma tabla dos veces&lt;/h2&gt;
&lt;p&gt;Algunas consultas necesitan aplicar condiciones distintas sobre la misma entidad. Para eso usamos alias diferentes, incluso si la tabla física es la misma.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;title&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;INNER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film_actor&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fa1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fa1&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;INNER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;actor&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fa1&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;actor_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a1&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;actor_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;INNER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film_actor&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fa2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fa2&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;INNER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;actor&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fa2&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;actor_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a2&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;actor_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;a1&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;CATE&amp;#39;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;AND&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a1&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;MCQUEEN&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;AND&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;a2&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;CUBA&amp;#39;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;AND&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a2&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;BIRCH&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;title&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;BLOOD&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ARGONAUTS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;TOWERS&lt;/span&gt; &lt;span style="color:#e06c75"&gt;HURRICANE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;2&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;00&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Esta consulta busca películas donde participaron ambos actores. Si declaramos la tabla una sola vez y usamos &lt;code&gt;OR&lt;/code&gt;, el significado cambia: buscamos películas donde participó cualquiera de los dos.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;title&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;INNER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film_actor&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fa&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fa&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;INNER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;actor&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fa&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;actor_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;actor_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; ((&lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;CATE&amp;#39;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;AND&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;MCQUEEN&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;OR&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;CUBA&amp;#39;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;AND&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;BIRCH&amp;#39;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;----------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;title&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;----------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ATLANTIS&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CAUSE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;BLOOD&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ARGONAUTS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;COMMANDMENTS&lt;/span&gt; &lt;span style="color:#e06c75"&gt;EXPRESS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;VOLCANO&lt;/span&gt; &lt;span style="color:#e06c75"&gt;TEXAS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;WATERSHIP&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FRONTIER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;----------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;54&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;00&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="self-join"&gt;Self join&lt;/h2&gt;
&lt;p&gt;Un &lt;strong&gt;self join&lt;/strong&gt; ocurre cuando una tabla se une consigo misma. Es común en relaciones autorreferenciales: empleados y managers, categorías padre e hijas, o películas y precuelas.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;title&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;f_prnt&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;title&lt;/span&gt; &lt;span style="color:#e06c75"&gt;prequel&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;INNER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f_prnt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f_prnt&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;prequel_film_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;prequel_film_id&lt;/span&gt; &lt;span style="color:#c678dd"&gt;IS&lt;/span&gt; &lt;span style="color:#c678dd"&gt;NOT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;NULL&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-----------------+--------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;title&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;prequel&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-----------------+--------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FIDDLER&lt;/span&gt; &lt;span style="color:#e06c75"&gt;LOST&lt;/span&gt; &lt;span style="color:#e06c75"&gt;II&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FIDDLER&lt;/span&gt; &lt;span style="color:#e06c75"&gt;LOST&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-----------------+--------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;1&lt;/span&gt; &lt;span style="color:#c678dd"&gt;row&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;00&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;f&lt;/code&gt; representa la película actual y &lt;code&gt;f_prnt&lt;/code&gt; representa la película relacionada como precuela. Los alias son obligatorios para evitar ambigüedad.&lt;/p&gt;
&lt;h2 id="teoría-de-conjuntos"&gt;Teoría de conjuntos&lt;/h2&gt;
&lt;p&gt;SQL también trabaja con conjuntos completos de filas. Estas operaciones combinan resultados de múltiples consultas, siempre que las columnas sean compatibles.&lt;/p&gt;
&lt;p&gt;La unión combina los elementos de &lt;code&gt;A&lt;/code&gt; y &lt;code&gt;B&lt;/code&gt;.&lt;/p&gt;




 
 
 
 &lt;div class="flex justify-center"&gt;
 &lt;img
 src="https://blog.dacadev.com/images/programming/sql/querying-multiple-tables/set-union_hu_cd19b39dd99e6fc5.webp"
 alt="Imagen guia del contenido de la página"style="width:400px"/&gt;
 &lt;/div&gt;
 
 
 


&lt;p&gt;La intersección conserva únicamente los elementos presentes en ambos conjuntos.&lt;/p&gt;




 
 
 
 &lt;div class="flex justify-center"&gt;
 &lt;img
 src="https://blog.dacadev.com/images/programming/sql/querying-multiple-tables/set-intersect_hu_8f82de50afd65425.webp"
 alt="Imagen guia del contenido de la página"style="width:400px"/&gt;
 &lt;/div&gt;
 
 
 


&lt;p&gt;La diferencia retorna los elementos de &lt;code&gt;A&lt;/code&gt; que no están en &lt;code&gt;B&lt;/code&gt;.&lt;/p&gt;




 
 
 
 &lt;div class="flex justify-center"&gt;
 &lt;img
 src="https://blog.dacadev.com/images/programming/sql/querying-multiple-tables/set-except_hu_116968c26251c42f.webp"
 alt="Imagen guia del contenido de la página"style="width:400px"/&gt;
 &lt;/div&gt;
 
 
 






 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Para aplicar operaciones de conjuntos, ambas consultas deben retornar el mismo número de columnas y columnas compatibles por posición.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="union"&gt;UNION&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;UNION&lt;/code&gt; combina resultados y elimina duplicados. &lt;code&gt;UNION ALL&lt;/code&gt; conserva todos los registros, por lo que suele ser más eficiente cuando no necesitas deduplicar.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;CUST&amp;#39;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;typ&lt;/span&gt;, &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;, &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;UNION&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ALL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;ACTR&amp;#39;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;typ&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;actor&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------+------------+-------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;typ&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------+------------+-------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CUST&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;MARY&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SMITH&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CUST&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PATRICIA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JOHNSON&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CUST&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;LINDA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;WILLIAMS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ACTR&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;MARY&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;KEITEL&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ACTR&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JULIA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FAWCETT&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ACTR&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;THORA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;TEMPLE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------+------------+-------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;799&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;00&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si duplicamos la misma consulta contra &lt;code&gt;actor&lt;/code&gt;, &lt;code&gt;UNION ALL&lt;/code&gt; devuelve dos copias de cada fila.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;ACTR&amp;#39;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;typ&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;actor&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;UNION&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ALL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;ACTR&amp;#39;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;typ&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;actor&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------+-------------+--------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;typ&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------+-------------+--------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ACTR&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PENELOPE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;GUINESS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ACTR&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;NICK&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;WAHLBERG&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ACTR&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ED&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CHASE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ACTR&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;MARY&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;KEITEL&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ACTR&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JULIA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FAWCETT&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ACTR&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;THORA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;TEMPLE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------+-------------+--------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;400&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;00&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Un ejemplo más claro muestra duplicados al combinar clientes y actores con patrones similares:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;, &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#c678dd"&gt;LIKE&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;J%&amp;#39;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;AND&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#c678dd"&gt;LIKE&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;D%&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;UNION&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ALL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;actor&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#c678dd"&gt;LIKE&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;J%&amp;#39;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;AND&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#c678dd"&gt;LIKE&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;D%&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------+-----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------+-----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JENNIFER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DAVIS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JENNIFER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DAVIS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JUDY&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DEAN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JODIE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DEGENERES&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JULIANNE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DENCH&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------+-----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;5&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;00&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="intersect"&gt;INTERSECT&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;INTERSECT&lt;/code&gt; retorna únicamente las filas presentes en ambos conjuntos. Dependiendo del motor, puede existir &lt;code&gt;INTERSECT ALL&lt;/code&gt;, que conserva duplicados según sus reglas.&lt;/p&gt;
&lt;p&gt;Es útil para encontrar coincidencias entre fuentes: identificadores compartidos, productos presentes en dos catálogos o usuarios existentes en dos procesos.&lt;/p&gt;
&lt;h2 id="except"&gt;EXCEPT&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;EXCEPT&lt;/code&gt; retorna las filas del primer conjunto que no aparecen en el segundo. También puede existir &lt;code&gt;EXCEPT ALL&lt;/code&gt;, según el motor.&lt;/p&gt;
&lt;p&gt;Esta operación es práctica para auditoría y reconciliación de datos.&lt;/p&gt;




 
 





 


&lt;div class="notice warning"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Warning&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Algunos motores no implementan &lt;code&gt;INTERSECT&lt;/code&gt;, &lt;code&gt;EXCEPT&lt;/code&gt; o sus variantes &lt;code&gt;ALL&lt;/code&gt;. En esos casos puedes modelar equivalentes con &lt;code&gt;JOIN&lt;/code&gt;, &lt;code&gt;NOT EXISTS&lt;/code&gt; o &lt;code&gt;LEFT JOIN&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="reglas-de-operaciones-de-conjuntos"&gt;Reglas de operaciones de conjuntos&lt;/h2&gt;
&lt;p&gt;Las operaciones de conjuntos son estrictas: mismo número de columnas, tipos compatibles y mismo orden.&lt;/p&gt;
&lt;h3 id="ordenar-resultados-con-alias-válidos"&gt;Ordenar resultados con alias válidos&lt;/h3&gt;
&lt;p&gt;Si ordenas el resultado final, usa los nombres expuestos por el primer &lt;code&gt;SELECT&lt;/code&gt;. En este ejemplo, &lt;code&gt;last_name&lt;/code&gt; y &lt;code&gt;first_name&lt;/code&gt; ya no son etiquetas válidas porque fueron renombradas como &lt;code&gt;lname&lt;/code&gt; y &lt;code&gt;fname&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;-- ERROR
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fname&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#e06c75"&gt;lname&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;actor&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#c678dd"&gt;LIKE&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;J%&amp;#39;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;AND&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#c678dd"&gt;LIKE&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;D%&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;UNION&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ALL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;, &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#c678dd"&gt;LIKE&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;J%&amp;#39;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;AND&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#c678dd"&gt;LIKE&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;D%&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ORDER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;BY&lt;/span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;ERROR&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1054&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;42&lt;/span&gt;&lt;span style="color:#e06c75"&gt;S22&lt;/span&gt;): &lt;span style="color:#c678dd"&gt;Unknown&lt;/span&gt; &lt;span style="color:#c678dd"&gt;column&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;last_name&amp;#39;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;order clause&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;-- WORKS
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fname&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#e06c75"&gt;lname&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;actor&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#c678dd"&gt;LIKE&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;J%&amp;#39;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;AND&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#c678dd"&gt;LIKE&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;D%&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;UNION&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ALL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;, &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#c678dd"&gt;LIKE&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;J%&amp;#39;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;AND&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#c678dd"&gt;LIKE&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;D%&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ORDER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;BY&lt;/span&gt; &lt;span style="color:#e06c75"&gt;lname&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;fname&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;----------+-----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fname&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;lname&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;----------+-----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JENNIFER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DAVIS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JENNIFER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DAVIS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JUDY&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DEAN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JODIE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DEGENERES&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JULIANNE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DENCH&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;----------+-----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;5&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;00&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="el-orden-de-las-operaciones-importa"&gt;El orden de las operaciones importa&lt;/h3&gt;
&lt;p&gt;Las uniones se evalúan según el orden y la precedencia del motor. Cuando mezcles &lt;code&gt;UNION&lt;/code&gt;, &lt;code&gt;INTERSECT&lt;/code&gt; y &lt;code&gt;EXCEPT&lt;/code&gt;, usa paréntesis para expresar intención y evitar resultados ambiguos.&lt;/p&gt;
&lt;p&gt;Reglas prácticas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Los alias visibles provienen del primer &lt;code&gt;SELECT&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UNION&lt;/code&gt; elimina duplicados; &lt;code&gt;UNION ALL&lt;/code&gt; los conserva.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ORDER BY&lt;/code&gt; se aplica al conjunto final, salvo que uses subqueries.&lt;/li&gt;
&lt;li&gt;El orden de operaciones puede cambiar el resultado.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="cierre"&gt;Cierre&lt;/h2&gt;
&lt;p&gt;Los &lt;code&gt;JOINs&lt;/code&gt; y las operaciones de conjuntos resuelven problemas complementarios. &lt;code&gt;INNER JOIN&lt;/code&gt; conecta filas relacionadas; &lt;code&gt;UNION&lt;/code&gt;, &lt;code&gt;INTERSECT&lt;/code&gt; y &lt;code&gt;EXCEPT&lt;/code&gt; combinan resultados compatibles.&lt;/p&gt;
&lt;p&gt;Dominar ambos enfoques mejora la semántica de reportes, filtros e integraciones. En el siguiente artículo avanzaremos hacia &lt;a href="https://blog.dacadev.com/programacion/sql/06-subqueries-subconsultas"



 


&gt;Subqueries&lt;/a&gt;, donde veremos subconsultas para construir lógica SQL modular.&lt;/p&gt;</content:encoded></item><item><title>Estilos CSS: Modularización y patrones de diseño</title><link>https://blog.dacadev.com/programacion/estilos-css/modularizacion-y-patrones/</link><pubDate>Tue, 16 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/estilos-css/modularizacion-y-patrones/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Aprende a organizar CSS a escala: estilos base, componentes modulares, la metodología BEM, clases de utilidad y la documentación con librerías de patrones.</description><media:content url="https://blog.dacadev.com/images/programming/html-and-css/css/08-modularizacion-y-patrones-banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#qué-es-la-modularización"&gt;Qué es la modularización&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#estilos-base"&gt;Estilos base&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#componentes-y-bem"&gt;Componentes y BEM&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#posicionamiento-del-componente"&gt;Posicionamiento del componente&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#estado-de-los-componentes"&gt;Estado de los componentes&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#utility-classes"&gt;Utility classes&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#metodologías-de-arquitectura-css"&gt;Metodologías de arquitectura CSS&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#librerías-de-patrones"&gt;Librerías de patrones&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#conclusión"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;En un proyecto pequeño cualquier organización de CSS funciona. El problema aparece al escalar: hojas de estilo de miles de líneas donde tocar una regla rompe tres componentes que parecían no tener relación. La causa casi siempre es la misma: estilos acoplados que se pisan entre sí. La solución es arquitectónica —modularizar— y existen metodologías probadas para lograrlo.&lt;/p&gt;
&lt;p&gt;Esta es la octava y última entrega de la serie &lt;strong&gt;Estilos CSS&lt;/strong&gt;. Veremos cómo estructurar estilos en módulos independientes, la metodología &lt;strong&gt;BEM&lt;/strong&gt;, las clases de utilidad y cómo documentar tus componentes con una librería de patrones.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Aprenderás a dividir tus estilos en componentes desacoplados, a nombrar clases con BEM, a usar utility classes con criterio y a mantener una librería de patrones como fuente única de verdad del diseño.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="qué-es-la-modularización"&gt;Qué es la modularización&lt;/h2&gt;
&lt;p&gt;Modularizar CSS consiste en dividir los estilos en archivos donde cada uno representa un &lt;strong&gt;módulo&lt;/strong&gt;: un único componente con todo su estilo encapsulado. Un módulo &lt;code&gt;button.css&lt;/code&gt; contiene todo lo necesario para renderizar un botón y sus variantes, y nada más.&lt;/p&gt;




 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;La regla de oro: un módulo no debe interferir con los estilos de otros. Solo se ocupa de su propio componente. Así, modificar un módulo nunca produce efectos colaterales inesperados en el resto de la página.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="estilos-base"&gt;Estilos base&lt;/h2&gt;
&lt;p&gt;Antes de los módulos conviene tener un archivo de &lt;strong&gt;estilos base&lt;/strong&gt;: no es un componente, sino la configuración inicial del documento (reset, tipografía global, &lt;code&gt;box-sizing&lt;/code&gt;).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:&lt;span style="color:#61afef"&gt;root&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;box-sizing&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;border-box&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;*,&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;::&lt;span style="color:#61afef"&gt;before&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;,&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;::&lt;span style="color:#61afef"&gt;after&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;box-sizing&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;inherit&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;body&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-family&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;Helvetica&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;Arial&lt;/span&gt;, &lt;span style="color:#e5c07b"&gt;sans-serif&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Para no reinventar la rueda, paquetes como &lt;a href="https://necolas.github.io/normalize.css/"




 target="_blank"
 


&gt;Normalize.css&lt;/a&gt; homogeneizan las diferencias entre navegadores de forma sensata.&lt;/p&gt;
&lt;h2 id="componentes-y-bem"&gt;Componentes y BEM&lt;/h2&gt;
&lt;p&gt;La idea central de un módulo es que los estilos y modificadores de un componente vivan en un solo lugar. La metodología &lt;strong&gt;BEM&lt;/strong&gt; (&lt;em&gt;Block, Element, Modifier&lt;/em&gt;) propone una convención de nombres que hace explícita la estructura y evita colisiones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Block&lt;/strong&gt; — el componente raíz: &lt;code&gt;.button&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Element&lt;/strong&gt; — una parte del componente, con &lt;code&gt;__&lt;/code&gt;: &lt;code&gt;.button__icon&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Modifier&lt;/strong&gt; — una variante, con &lt;code&gt;--&lt;/code&gt;: &lt;code&gt;.button--success&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;button&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;padding&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.8&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;border&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;solid&lt;/span&gt; &lt;span style="color:#d19a66"&gt;#265559&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0.2&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;background-color&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;transparent&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;rem&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;button--success&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#fff&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;background-color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#2f5926&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;border-color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#cfe8c9&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;button--danger&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#fff&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;background-color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#a92323&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;border-color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#e8c9c9&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;button--small&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0.8&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;rem&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;button--large&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1.2&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;rem&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;button&lt;/span&gt; &lt;span style="color:#e06c75"&gt;class&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;button&amp;#34;&lt;/span&gt;&amp;gt;Normal&amp;lt;/&lt;span style="color:#e06c75"&gt;button&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;button&lt;/span&gt; &lt;span style="color:#e06c75"&gt;class&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;button button--success&amp;#34;&lt;/span&gt;&amp;gt;Éxito&amp;lt;/&lt;span style="color:#e06c75"&gt;button&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;button&lt;/span&gt; &lt;span style="color:#e06c75"&gt;class&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;button button--danger&amp;#34;&lt;/span&gt;&amp;gt;Peligro&amp;lt;/&lt;span style="color:#e06c75"&gt;button&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;button&lt;/span&gt; &lt;span style="color:#e06c75"&gt;class&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;button button--large&amp;#34;&lt;/span&gt;&amp;gt;Grande&amp;lt;/&lt;span style="color:#e06c75"&gt;button&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1.5rem;background:#fff;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;display:flex;gap:.75rem;flex-wrap:wrap;align-items:center;"&gt;
 &lt;button type="button" style="padding:.5em .8em;border:1px solid #265559;border-radius:.2em;background:transparent;font-size:1rem;color:#265559;cursor:pointer;"&gt;Normal&lt;/button&gt;
 &lt;button type="button" style="padding:.5em .8em;border:1px solid #cfe8c9;border-radius:.2em;background:#2f5926;font-size:1rem;color:#fff;cursor:pointer;"&gt;Éxito&lt;/button&gt;
 &lt;button type="button" style="padding:.5em .8em;border:1px solid #e8c9c9;border-radius:.2em;background:#a92323;font-size:1rem;color:#fff;cursor:pointer;"&gt;Peligro&lt;/button&gt;
 &lt;button type="button" style="padding:.5em .8em;border:1px solid #265559;border-radius:.2em;background:transparent;font-size:1.2rem;color:#265559;cursor:pointer;"&gt;Grande&lt;/button&gt;
&lt;/div&gt;
&lt;h3 id="posicionamiento-del-componente"&gt;Posicionamiento del componente&lt;/h3&gt;
&lt;p&gt;Por buena práctica, el bloque raíz de un componente debería declarar &lt;code&gt;position: relative&lt;/code&gt;. Así estableces un contexto de posicionamiento controlado para cualquier elemento absoluto interno (un menú desplegable, un badge, un tooltip), sin depender de ancestros externos.&lt;/p&gt;
&lt;h3 id="estado-de-los-componentes"&gt;Estado de los componentes&lt;/h3&gt;
&lt;p&gt;Es común reflejar el estado de un componente con clases, ya sea para estilizarlo o para manipularlo desde JavaScript. La convención recomendada usa verbos o estados con prefijo: &lt;code&gt;is-loading&lt;/code&gt;, &lt;code&gt;has-error&lt;/code&gt;, &lt;code&gt;is-active&lt;/code&gt;.&lt;/p&gt;




 
 





 


&lt;div class="notice warning"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Warning&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;No mezcles las clases de estado con los modificadores BEM. Evita nombres como &lt;code&gt;block__element--modifier-is-loading&lt;/code&gt;. El estado es una capa transversal y dinámica; mantenlo separado de la variante estática del componente.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="utility-classes"&gt;Utility classes&lt;/h2&gt;
&lt;p&gt;Las &lt;strong&gt;clases de utilidad&lt;/strong&gt; aplican un estilo único y específico. Suelen usar &lt;code&gt;!important&lt;/code&gt; para garantizar que se apliquen por encima de los estilos del componente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;text-center&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;text-align&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;center&lt;/span&gt; &lt;span style="color:#7f848e"&gt;!important&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;float-left&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;float&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;left&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;hidden&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;display&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;none&lt;/span&gt; &lt;span style="color:#7f848e"&gt;!important&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;clearfix&lt;/span&gt;::&lt;span style="color:#61afef"&gt;before&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;clearfix&lt;/span&gt;::&lt;span style="color:#61afef"&gt;after&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;content&lt;/span&gt;: &lt;span style="color:#98c379"&gt;&amp;#34; &amp;#34;&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;display&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;table&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;clearfix&lt;/span&gt;::&lt;span style="color:#61afef"&gt;after&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;clear&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;both&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Son útiles para ajustes puntuales, pero abusar de ellas reintroduce el acoplamiento que la modularización busca evitar. Úsalas con criterio.&lt;/p&gt;
&lt;h2 id="metodologías-de-arquitectura-css"&gt;Metodologías de arquitectura CSS&lt;/h2&gt;
&lt;p&gt;BEM no es la única opción. Las metodologías más establecidas para organizar CSS a escala son:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OOCSS&lt;/strong&gt; — &lt;em&gt;Object-Oriented CSS&lt;/em&gt;, de Nicole Sullivan: separa estructura de apariencia.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SMACSS&lt;/strong&gt; — &lt;em&gt;Scalable and Modular Architecture for CSS&lt;/em&gt;, de Jonathan Snook: categoriza las reglas en capas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BEM&lt;/strong&gt; — &lt;em&gt;Block, Element, Modifier&lt;/em&gt;, de Yandex: convención de nombres explícita.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ITCSS&lt;/strong&gt; — &lt;em&gt;Inverted Triangle CSS&lt;/em&gt;, de Harry Roberts: organiza por especificidad creciente.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No son excluyentes; muchos equipos combinan ITCSS para la estructura de archivos con BEM para la nomenclatura.&lt;/p&gt;
&lt;h2 id="librerías-de-patrones"&gt;Librerías de patrones&lt;/h2&gt;
&lt;p&gt;En proyectos grandes, los componentes se documentan en una &lt;strong&gt;librería de patrones&lt;/strong&gt; (o &lt;em&gt;style guide&lt;/em&gt;): una web accesible para todo el equipo que muestra cómo se ve y se comporta cada componente. Es la fuente única de verdad del diseño y reduce las inconsistencias.&lt;/p&gt;
&lt;p&gt;Existen generadores de style guides; uno open source muy conocido es &lt;a href="https://kss-node.github.io/kss-node/"




 target="_blank"
 


&gt;KSS&lt;/a&gt;. Documenta los componentes a partir de comentarios estructurados en el propio CSS:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;Buttons
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;Botones disponibles en varios tamaños y colores.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;Markup:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;&amp;lt;button class=&amp;#34;button {{modifier_class}}&amp;#34;&amp;gt;click here&amp;lt;/button&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;.button--success - Botón verde de éxito
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;.button--danger - Botón rojo de peligro
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;.button--large - Botón grande
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;Styleguide Buttons
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;button&lt;/span&gt; { &lt;span style="color:#7f848e"&gt;/* ... */&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;KSS lee esos comentarios y genera automáticamente una página de documentación con el componente renderizado y todas sus variantes. El bloque incluye un título, una descripción, el &lt;code&gt;Markup&lt;/code&gt; de ejemplo (con el marcador &lt;code&gt;{{modifier_class}}&lt;/code&gt;), la lista de modificadores y una referencia &lt;code&gt;Styleguide&lt;/code&gt; para ubicarlo en la jerarquía.&lt;/p&gt;




 
 





 


&lt;div class="notice info"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Info&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Mantener la documentación junto al código —en comentarios del propio CSS— reduce el riesgo de que la librería de patrones quede desactualizada respecto a la implementación real.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Escribir CSS que escale es, ante todo, un problema de arquitectura. Modularizar en componentes desacoplados, nombrar con una convención consistente como BEM, reservar las utility classes para ajustes puntuales y documentar todo en una librería de patrones es lo que mantiene una hoja de estilos sana a medida que el proyecto crece.&lt;/p&gt;
&lt;p&gt;Con esta entrega cerramos la serie &lt;strong&gt;Estilos CSS&lt;/strong&gt;. Recorrimos desde los fundamentos de la cascada hasta la arquitectura de estilos a gran escala, pasando por selectores, el modelo de caja, layouts, posicionamiento, fondos y animaciones. Tienes ahora un modelo mental completo para escribir CSS profesional, predecible y mantenible.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;🚀 Repasa las entregas anteriores para consolidar cada concepto: los fundamentos sostienen los selectores, el modelo de caja sostiene los layouts, y la modularización une todo en un sistema coherente.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
</content:encoded></item><item><title>Estilos CSS: Transiciones, transformaciones y rendimiento</title><link>https://blog.dacadev.com/programacion/estilos-css/transiciones-y-transformaciones/</link><pubDate>Sun, 14 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/estilos-css/transiciones-y-transformaciones/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Domina las transiciones y transformaciones en CSS: timing functions, las funciones transform (scale, rotate, translate, skew), perspectiva 3D y el pipeline de render.</description><media:content url="https://blog.dacadev.com/images/programming/html-and-css/css/07-transiciones-y-transformaciones-banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#transiciones"&gt;Transiciones&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#timing-functions"&gt;Timing functions&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#transformaciones"&gt;Transformaciones&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#rotación"&gt;Rotación&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#traslación"&gt;Traslación&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#escala"&gt;Escala&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#inclinación"&gt;Inclinación&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#punto-de-referencia-transform-origin"&gt;Punto de referencia: transform-origin&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#combinar-transformaciones"&gt;Combinar transformaciones&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#el-pipeline-de-renderizado"&gt;El pipeline de renderizado&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#transformaciones-en-3d"&gt;Transformaciones en 3D&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#conclusión"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;Las transiciones y transformaciones son la puerta de entrada a las interfaces animadas. Una transición suaviza el cambio entre dos estados; una transformación altera la geometría visual de un elemento sin afectar el layout. Bien aplicadas, mejoran la percepción de calidad y guían la atención del usuario. Mal aplicadas, generan &lt;em&gt;jank&lt;/em&gt; y consumen batería. La diferencia está en entender qué propiedades son baratas de animar y por qué.&lt;/p&gt;
&lt;p&gt;Esta es la séptima entrega de la serie &lt;strong&gt;Estilos CSS&lt;/strong&gt;. Cubriremos la propiedad &lt;code&gt;transition&lt;/code&gt; y sus &lt;em&gt;timing functions&lt;/em&gt;, las funciones de &lt;code&gt;transform&lt;/code&gt; en 2D y 3D, y el pipeline de renderizado que explica por qué &lt;code&gt;transform&lt;/code&gt; y &lt;code&gt;opacity&lt;/code&gt; son las propiedades óptimas para animar.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Aprenderás a construir transiciones fluidas con curvas de Bézier, a aplicar y combinar transformaciones, y a entender el pipeline layout → paint → composición para escribir animaciones eficientes.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="transiciones"&gt;Transiciones&lt;/h2&gt;
&lt;p&gt;Una transición interpola el cambio de una propiedad entre su valor inicial y final a lo largo del tiempo. Suele combinarse con pseudo-clases como &lt;code&gt;:hover&lt;/code&gt; o &lt;code&gt;:active&lt;/code&gt;. Se controla con cuatro propiedades:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;transition-property&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;background-color&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;,&lt;/span&gt; &lt;span style="color:#e06c75"&gt;transform&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;transition-duration&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;0&lt;/span&gt;.&lt;span style="color:#e5c07b"&gt;3s&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;,&lt;/span&gt; &lt;span style="color:#e06c75"&gt;0&lt;/span&gt;.&lt;span style="color:#e5c07b"&gt;6s&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;transition-timing-function&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ease&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;,&lt;/span&gt; &lt;span style="color:#e06c75"&gt;linear&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;transition-delay&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;0s&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;,&lt;/span&gt; &lt;span style="color:#e06c75"&gt;100ms&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;transition-property&lt;/code&gt;&lt;/strong&gt; — qué propiedades se animan (usa &lt;code&gt;all&lt;/code&gt; para todas).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;transition-duration&lt;/code&gt;&lt;/strong&gt; — cuánto dura la interpolación.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;transition-timing-function&lt;/code&gt;&lt;/strong&gt; — cómo se distribuye el movimiento en el tiempo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;transition-delay&lt;/code&gt;&lt;/strong&gt; — cuánto espera antes de empezar (opcional).&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;boton&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transition&lt;/span&gt;: &lt;span style="color:#c678dd"&gt;background-color&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.3&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;ease&lt;/span&gt;, &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.3&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;ease&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;boton&lt;/span&gt;:&lt;span style="color:#61afef"&gt;hover&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;background-color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#16828d&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;translateY&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;-3&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1.5rem;background:#fff;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;style&gt;
 .cstrans { padding:.8em 1.6em; border:0; color:#fff; border-radius:.5em; cursor:pointer; background:#2a9da9; transition:background-color .3s ease, transform .3s ease, box-shadow .3s ease; box-shadow:0 .15em .4em rgba(0,0,0,.2); }
 .cstrans:hover { background:#16828d; transform:translateY(-4px); box-shadow:0 .4em .8em rgba(0,0,0,.3); }
 &lt;/style&gt;
 &lt;button class="cstrans" type="button"&gt;Pasa el cursor sobre mí&lt;/button&gt;
&lt;/div&gt;
&lt;h3 id="timing-functions"&gt;Timing functions&lt;/h3&gt;
&lt;p&gt;La &lt;em&gt;timing function&lt;/em&gt; define cómo se reparte el movimiento en el tiempo. Existen valores predefinidos —&lt;code&gt;linear&lt;/code&gt;, &lt;code&gt;ease&lt;/code&gt;, &lt;code&gt;ease-in&lt;/code&gt;, &lt;code&gt;ease-out&lt;/code&gt;, &lt;code&gt;ease-in-out&lt;/code&gt;— donde el eje X representa el tiempo y el eje Y el progreso del cambio.&lt;/p&gt;
&lt;p&gt;Todas son &lt;strong&gt;curvas de Bézier&lt;/strong&gt;, y puedes definir la tuya con la función &lt;code&gt;cubic-bezier()&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;box&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transition&lt;/span&gt;: &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.6&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;cubic-bezier&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;0.45&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0.05&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0.55&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0.95&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;También puedes hacer el cambio en pasos discretos con &lt;code&gt;steps()&lt;/code&gt;, útil para animaciones tipo sprite o efectos de &amp;ldquo;tecleo&amp;rdquo;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;box&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transition&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;all&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;steps&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;3&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Existen editores visuales de curvas de Bézier que te permiten ajustar la animación y copiar el valor exacto. Experimentar con ellos es la forma más rápida de afinar la sensación de una transición.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="transformaciones"&gt;Transformaciones&lt;/h2&gt;
&lt;p&gt;La propiedad &lt;code&gt;transform&lt;/code&gt; altera la geometría visual de un elemento mediante cuatro operaciones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;scale()&lt;/code&gt;&lt;/strong&gt; — escala el tamaño.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;rotate()&lt;/code&gt;&lt;/strong&gt; — rota el elemento.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;translate()&lt;/code&gt;&lt;/strong&gt; — lo desplaza.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;skew()&lt;/code&gt;&lt;/strong&gt; — lo inclina/estira.&lt;/li&gt;
&lt;/ul&gt;




 
 





 


&lt;div class="notice warning"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Warning&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Las transformaciones solo alteran la representación visual del elemento, &lt;strong&gt;no su comportamiento en el layout&lt;/strong&gt;. El hueco original que ocupaba se conserva, y los elementos vecinos no se reorganizan.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="rotación"&gt;Rotación&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;rotate()&lt;/code&gt; gira el elemento. Los valores positivos giran en sentido horario; los negativos, antihorario.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;giro&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;rotate&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;15&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;deg&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="traslación"&gt;Traslación&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;translate(x, y)&lt;/code&gt; mueve el elemento en ambos ejes sin afectar el flujo. Los valores positivos lo desplazan a la derecha y hacia abajo.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;mover&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;translate&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;40&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;10&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="escala"&gt;Escala&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;scale()&lt;/code&gt; redimensiona: valores entre 0 y 1 encogen, mayores que 1 agrandan.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;crecer&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;scale&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;1.3&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="inclinación"&gt;Inclinación&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;skew(x, y)&lt;/code&gt; deforma el elemento inclinándolo respecto a los ejes.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;inclinar&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#61afef;font-weight:bold"&gt;skew&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;-12&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;deg&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1.5rem;background:#fff;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;display:flex;gap:1.5rem;flex-wrap:wrap;align-items:center;justify-content:center;"&gt;
 &lt;span style="background:#2a9da9;color:#fff;padding:1em;border-radius:.4em;transform:rotate(15deg);display:inline-block;"&gt;rotate&lt;/span&gt;
 &lt;span style="background:#2a9da9;color:#fff;padding:1em;border-radius:.4em;transform:translate(0,-8px);display:inline-block;"&gt;translate&lt;/span&gt;
 &lt;span style="background:#2a9da9;color:#fff;padding:1em;border-radius:.4em;transform:scale(1.25);display:inline-block;"&gt;scale&lt;/span&gt;
 &lt;span style="background:#2a9da9;color:#fff;padding:1em;border-radius:.4em;transform:skew(-12deg);display:inline-block;"&gt;skew&lt;/span&gt;
&lt;/div&gt;
&lt;h3 id="punto-de-referencia-transform-origin"&gt;Punto de referencia: transform-origin&lt;/h3&gt;
&lt;p&gt;Toda transformación se aplica desde un punto de referencia, que por defecto es el centro del elemento. &lt;code&gt;transform-origin&lt;/code&gt; lo reubica:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;giro&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform-origin&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;left&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;center&lt;/span&gt;; } &lt;span style="color:#7f848e"&gt;/* equivale a 0% 50% */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="combinar-transformaciones"&gt;Combinar transformaciones&lt;/h3&gt;
&lt;p&gt;Puedes encadenar varias funciones separándolas por espacios. &lt;strong&gt;Se aplican de derecha a izquierda&lt;/strong&gt;, lo que afecta el resultado final:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;tarjeta&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;rotate&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;15&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;deg&lt;/span&gt;) &lt;span style="color:#e5c07b"&gt;translate&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;20&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="el-pipeline-de-renderizado"&gt;El pipeline de renderizado&lt;/h2&gt;
&lt;p&gt;Para escribir animaciones eficientes hay que entender cómo el navegador dibuja una página. El proceso tiene tres etapas clave:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Layout&lt;/strong&gt; — el navegador calcula las dimensiones y posiciones de todos los elementos. Cualquier cambio de tamaño o posición dispara un recálculo completo (&lt;em&gt;reflow&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Paint&lt;/strong&gt; — pinta en memoria los píxeles de cada elemento (colores, bordes, sombras), posiblemente en capas separadas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Composición&lt;/strong&gt; — combina las capas pintadas para mostrarlas en pantalla.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 A[JS / CSS] --&gt; B[Layout]
 B --&gt; C[Paint]
 C --&gt; D[Composición]
&lt;/pre&gt;

&lt;p&gt;La clave del rendimiento: algunas propiedades, como &lt;strong&gt;&lt;code&gt;transform&lt;/code&gt;&lt;/strong&gt; y &lt;strong&gt;&lt;code&gt;opacity&lt;/code&gt;&lt;/strong&gt;, solo afectan la etapa de &lt;strong&gt;composición&lt;/strong&gt;. No requieren recalcular el layout ni repintar, por lo que son las propiedades óptimas para animar de forma fluida a 60 fps.&lt;/p&gt;




 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Prefiere animar &lt;code&gt;transform&lt;/code&gt; y &lt;code&gt;opacity&lt;/code&gt; en lugar de &lt;code&gt;width&lt;/code&gt;, &lt;code&gt;height&lt;/code&gt;, &lt;code&gt;top&lt;/code&gt; o &lt;code&gt;left&lt;/code&gt;. Estas últimas disparan layout y paint en cada frame, lo que produce animaciones entrecortadas.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="transformaciones-en-3d"&gt;Transformaciones en 3D&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;transform&lt;/code&gt; también opera en tres dimensiones. Puedes rotar sobre cualquier eje con &lt;code&gt;rotateX()&lt;/code&gt;, &lt;code&gt;rotateY()&lt;/code&gt; y &lt;code&gt;rotateZ()&lt;/code&gt;. El efecto depende de la &lt;strong&gt;perspectiva&lt;/strong&gt;: la distancia simulada entre el observador y el elemento. A menor perspectiva, más pronunciado el efecto 3D.&lt;/p&gt;
&lt;p&gt;Hay dos formas de aplicarla:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;/* 1. Función dentro de transform (afecta solo a ese elemento) */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;box&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;perspective&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;200&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;) &lt;span style="color:#e5c07b"&gt;rotateX&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;30&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;deg&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;/* 2. Propiedad en el contenedor (perspectiva compartida) */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;row&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;perspective&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;200&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;box&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;rotateX&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;30&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;deg&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1.5rem;background:#fff;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="display:flex;justify-content:center;gap:2rem;perspective:300px;"&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.5em 1em;border-radius:.4em;transform:rotateX(35deg);"&gt;rotateX(35deg)&lt;/div&gt;
 &lt;div style="background:#16828d;color:#fff;padding:1.5em 1em;border-radius:.4em;transform:rotateY(35deg);"&gt;rotateY(35deg)&lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Una rotación de 180° voltea el elemento como un espejo. La propiedad &lt;code&gt;backface-visibility&lt;/code&gt; controla si la cara trasera es visible, lo que habilita efectos como las tarjetas que se voltean. Un recurso clásico para profundizar es &lt;a href="https://3dtransforms.desandro.com/card-flip"




 target="_blank"
 


&gt;Intro to CSS 3D transforms&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Las transiciones suavizan los cambios de estado y las transformaciones manipulan la geometría sin tocar el layout. La regla de oro del rendimiento es animar &lt;code&gt;transform&lt;/code&gt; y &lt;code&gt;opacity&lt;/code&gt;, que solo afectan la etapa de composición. Con curvas de Bézier afinadas y un uso consciente del pipeline, tus animaciones serán fluidas y eficientes.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;🚀 La entrega final de la serie aborda la &lt;strong&gt;modularización y los patrones de diseño&lt;/strong&gt; en CSS: cómo organizar tus estilos en componentes mantenibles con metodologías como BEM.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
</content:encoded></item><item><title>SQL: Agrupamiento y Funciones Agregadas con GROUP BY</title><link>https://blog.dacadev.com/programacion/sql/04-agrupamiento-funciones-agregadas/</link><pubDate>Sun, 14 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/sql/04-agrupamiento-funciones-agregadas/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Aprende a usar GROUP BY en SQL para resumir datos con funciones agregadas, HAVING, DISTINCT y agrupaciones por columnas o expresiones.</description><media:content url="https://blog.dacadev.com/images/programming/sql/grouping-aggregates/banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#conceptos-de-agrupamiento-en-sql"&gt;Conceptos de agrupamiento en SQL&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#ordenar-resultados-agregados-con-order-by"&gt;Ordenar resultados agregados con &lt;code&gt;ORDER BY&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#filtrar-grupos-con-having"&gt;Filtrar grupos con &lt;code&gt;HAVING&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#funciones-agregadas-comunes"&gt;Funciones agregadas comunes&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#grupos-implícitos-vs-grupos-explícitos"&gt;Grupos implícitos vs grupos explícitos&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#contar-valores-distintos-con-countdistinct-"&gt;Contar valores distintos con &lt;code&gt;COUNT(DISTINCT ...)&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#generar-grupos-según-la-granularidad-requerida"&gt;Generar grupos según la granularidad requerida&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#agrupamiento-por-una-columna"&gt;Agrupamiento por una columna&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#agrupamiento-por-múltiples-columnas"&gt;Agrupamiento por múltiples columnas&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#agrupamiento-mediante-expresiones"&gt;Agrupamiento mediante expresiones&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#buenas-prácticas-al-trabajar-con-group-by"&gt;Buenas prácticas al trabajar con &lt;code&gt;GROUP BY&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#conclusión"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;Cuando una tabla empieza a acumular miles o millones de filas, consultar registros individuales deja de ser suficiente. En análisis, reportes y validaciones operativas necesitamos resumir datos: cuántas rentas hizo cada cliente, cuánto pagó en total, cuál fue el monto máximo o qué categorías concentran más actividad. Para eso usamos &lt;strong&gt;agrupamiento en SQL&lt;/strong&gt; con &lt;code&gt;GROUP BY&lt;/code&gt; y &lt;strong&gt;funciones agregadas&lt;/strong&gt; como &lt;code&gt;COUNT&lt;/code&gt;, &lt;code&gt;SUM&lt;/code&gt;, &lt;code&gt;AVG&lt;/code&gt;, &lt;code&gt;MIN&lt;/code&gt; y &lt;code&gt;MAX&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Este es el artículo 4 de la serie SQL. Venimos de trabajar con &lt;a href="https://blog.dacadev.com/programacion/sql/03-logica-condicional-case"



 


&gt;lógica condicional con CASE&lt;/a&gt;, y ahora vamos a convertir filas transaccionales en resultados agregados listos para análisis.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;En este artículo aprenderás a usar &lt;code&gt;GROUP BY&lt;/code&gt;, ordenar grupos con &lt;code&gt;ORDER BY&lt;/code&gt;, filtrar agregaciones con &lt;code&gt;HAVING&lt;/code&gt;, contar valores distintos con &lt;code&gt;DISTINCT&lt;/code&gt; y crear agrupaciones por una columna, múltiples columnas o expresiones.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="conceptos-de-agrupamiento-en-sql"&gt;Conceptos de agrupamiento en SQL&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;GROUP BY&lt;/code&gt; toma filas que comparten el mismo valor en una o más expresiones y las compacta en un grupo lógico. Si seleccionamos únicamente &lt;code&gt;customer_id&lt;/code&gt; desde &lt;code&gt;rental&lt;/code&gt;, SQL puede devolver cada cliente una sola vez:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;GROUP&lt;/span&gt; &lt;span style="color:#c678dd"&gt;BY&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;4&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;5&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;6&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;594&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;595&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;596&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;597&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;598&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;599&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;599&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;00&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El resultado ya no representa rentas individuales, sino el conjunto de clientes que aparecen en la tabla. El siguiente paso natural es medir cuántas filas contiene cada grupo. Para eso usamos &lt;code&gt;COUNT(*)&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt;, &lt;span style="color:#c678dd"&gt;count&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;GROUP&lt;/span&gt; &lt;span style="color:#c678dd"&gt;BY&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;count&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;32&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;27&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;26&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;4&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;22&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;5&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;38&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;6&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;28&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;594&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;27&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;595&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;30&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;596&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;28&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;597&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;25&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;598&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;22&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;599&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;19&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;599&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;01&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



 
 





 


&lt;div class="notice info"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Info&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;&lt;code&gt;COUNT(*)&lt;/code&gt; le indica a SQL que cuente todas las filas contenidas dentro de cada grupo definido por &lt;code&gt;GROUP BY&lt;/code&gt;. No cuenta clientes únicos; cuenta filas dentro del grupo actual.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="ordenar-resultados-agregados-con-order-by"&gt;Ordenar resultados agregados con &lt;code&gt;ORDER BY&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Una agregación suele ser más útil cuando puedes priorizarla. Por ejemplo, para identificar los clientes con más rentas, ordenamos por la segunda columna del &lt;code&gt;SELECT&lt;/code&gt;, que en este caso es &lt;code&gt;count(*)&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt;, &lt;span style="color:#c678dd"&gt;count&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;GROUP&lt;/span&gt; &lt;span style="color:#c678dd"&gt;BY&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ORDER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;BY&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2&lt;/span&gt; &lt;span style="color:#c678dd"&gt;DESC&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;count&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;148&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;46&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;526&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;45&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;236&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;42&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;144&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;42&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;75&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;41&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;248&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;15&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;110&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;14&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;281&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;14&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;61&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;14&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;318&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;12&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;599&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;01&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;&lt;code&gt;ORDER BY&lt;/code&gt; puede usar el nombre de una columna, un alias o la posición de la columna dentro del &lt;code&gt;SELECT&lt;/code&gt;. Aun así, en consultas mantenibles suele ser más claro usar alias explícitos.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="filtrar-grupos-con-having"&gt;Filtrar grupos con &lt;code&gt;HAVING&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;WHERE&lt;/code&gt; filtra filas antes de que ocurra el agrupamiento. &lt;code&gt;HAVING&lt;/code&gt;, en cambio, filtra grupos después de calcular las agregaciones. Esta diferencia es crítica: no puedes usar &lt;code&gt;WHERE count(*) &amp;gt;= 40&lt;/code&gt; porque &lt;code&gt;count(*)&lt;/code&gt; todavía no existe en esa fase lógica de la consulta.&lt;/p&gt;
&lt;p&gt;Consideremos clientes con al menos 40 rentas:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt;, &lt;span style="color:#c678dd"&gt;count&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;GROUP&lt;/span&gt; &lt;span style="color:#c678dd"&gt;BY&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;HAVING&lt;/span&gt; &lt;span style="color:#c678dd"&gt;count&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;&amp;gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;40&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;count&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;75&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;41&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;144&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;42&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;148&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;46&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;197&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;40&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;236&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;42&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;469&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;40&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;526&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;45&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;7&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;01&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Analicemos el flujo conceptual: &lt;code&gt;FROM&lt;/code&gt; obtiene las filas, &lt;code&gt;WHERE&lt;/code&gt; descarta filas individuales, &lt;code&gt;GROUP BY&lt;/code&gt; crea grupos, las funciones agregadas calculan métricas y &lt;code&gt;HAVING&lt;/code&gt; descarta grupos completos. Por último, &lt;code&gt;ORDER BY&lt;/code&gt; organiza el resultado final.&lt;/p&gt;
&lt;h2 id="funciones-agregadas-comunes"&gt;Funciones agregadas comunes&lt;/h2&gt;
&lt;p&gt;Las bases de datos implementan distintas funciones agregadas, pero estas aparecen prácticamente en cualquier motor SQL:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Función&lt;/th&gt;
 &lt;th&gt;Qué devuelve&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;MAX()&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;El valor máximo dentro de un conjunto&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;MIN()&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;El valor mínimo dentro de un conjunto&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;AVG()&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;El promedio de los valores del conjunto&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;SUM()&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;La suma total de los valores del conjunto&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;COUNT()&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;La cantidad de valores o filas del conjunto&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Sin &lt;code&gt;GROUP BY&lt;/code&gt;, estas funciones operan sobre toda la tabla o sobre el conjunto filtrado por &lt;code&gt;WHERE&lt;/code&gt;. Observemos un resumen global de pagos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;MAX&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;amount&lt;/span&gt;) &lt;span style="color:#e06c75"&gt;max_amt&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;MIN&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;amount&lt;/span&gt;) &lt;span style="color:#e06c75"&gt;min_amt&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;AVG&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;amount&lt;/span&gt;) &lt;span style="color:#e06c75"&gt;avg_amt&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SUM&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;amount&lt;/span&gt;) &lt;span style="color:#e06c75"&gt;tot_amt&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;COUNT&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;) &lt;span style="color:#e06c75"&gt;num_payments&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;payment&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------+---------+----------+----------+--------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;max_amt&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;min_amt&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;avg_amt&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;tot_amt&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;num_payments&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------+---------+----------+----------+--------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;11&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;99&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;00&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;4&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;200667&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;67416&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;51&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;16049&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------+---------+----------+----------+--------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;1&lt;/span&gt; &lt;span style="color:#c678dd"&gt;row&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;09&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Aquí SQL devuelve una sola fila porque existe un grupo implícito: todo el resultado de &lt;code&gt;payment&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="grupos-implícitos-vs-grupos-explícitos"&gt;Grupos implícitos vs grupos explícitos&lt;/h2&gt;
&lt;p&gt;Cuando usamos una función agregada sin &lt;code&gt;GROUP BY&lt;/code&gt;, SQL resume todo el conjunto como un único grupo. Eso es útil para métricas globales, pero no sirve si necesitamos una métrica por cliente, actor, categoría o periodo.&lt;/p&gt;
&lt;p&gt;Para obtener métricas por cliente, definimos el grupo explícitamente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;MAX&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;amount&lt;/span&gt;) &lt;span style="color:#e06c75"&gt;max_amt&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;MIN&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;amount&lt;/span&gt;) &lt;span style="color:#e06c75"&gt;min_amt&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;AVG&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;amount&lt;/span&gt;) &lt;span style="color:#e06c75"&gt;avg_amt&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SUM&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;amount&lt;/span&gt;) &lt;span style="color:#e06c75"&gt;tot_amt&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;COUNT&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;) &lt;span style="color:#e06c75"&gt;num_payments&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;payment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;GROUP&lt;/span&gt; &lt;span style="color:#c678dd"&gt;BY&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+---------+---------+----------+---------+--------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;max_amt&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;min_amt&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;avg_amt&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;tot_amt&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;num_payments&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+---------+---------+----------+---------+--------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;9&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;99&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;99&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;708750&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;118&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;68&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;32&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;10&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;99&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;99&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;4&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;767778&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;128&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;73&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;27&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;10&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;99&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;99&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;5&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;220769&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;135&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;74&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;26&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;4&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;8&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;99&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;99&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;717273&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;81&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;78&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;22&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;5&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;9&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;99&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;99&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;805789&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;144&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;62&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;38&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;6&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;7&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;99&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;99&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;347143&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;93&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;72&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;28&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;594&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;8&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;99&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;99&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;4&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;841852&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;130&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;73&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;27&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;595&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;10&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;99&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;99&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;923333&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;117&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;70&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;30&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;596&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;6&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;99&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;99&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;454286&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;96&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;72&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;28&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;597&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;8&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;99&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;99&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;990000&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;99&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;75&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;25&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;598&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;7&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;99&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;99&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;808182&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;83&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;78&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;22&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;599&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;9&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;99&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;99&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;4&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;411053&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;83&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;81&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;19&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+---------+---------+----------+---------+--------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;599&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;04&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La regla práctica es directa: cualquier columna no agregada en el &lt;code&gt;SELECT&lt;/code&gt; debe representar la granularidad del resultado y, por lo tanto, debe estar en el &lt;code&gt;GROUP BY&lt;/code&gt;.&lt;/p&gt;




 
 





 


&lt;div class="notice warning"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Warning&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Algunos motores permiten seleccionar columnas que no están agrupadas ni agregadas, pero el resultado puede ser ambiguo o depender de configuraciones del motor. Para consultas portables y correctas, declara explícitamente la granularidad.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="contar-valores-distintos-con-countdistinct-"&gt;Contar valores distintos con &lt;code&gt;COUNT(DISTINCT ...)&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;COUNT(*)&lt;/code&gt; cuenta filas. &lt;code&gt;COUNT(columna)&lt;/code&gt; cuenta valores no nulos de esa columna. &lt;code&gt;COUNT(DISTINCT columna)&lt;/code&gt; cuenta valores únicos, ignorando duplicados.&lt;/p&gt;
&lt;p&gt;Esto permite diferenciar entre el número de pagos registrados y el número de clientes distintos que hicieron pagos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;COUNT&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt;) &lt;span style="color:#e06c75"&gt;num_rows&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;COUNT&lt;/span&gt;(&lt;span style="color:#c678dd"&gt;DISTINCT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt;) &lt;span style="color:#e06c75"&gt;num_customers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;payment&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;----------+---------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;num_rows&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;num_customers&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;----------+---------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;16049&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;599&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;----------+---------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;1&lt;/span&gt; &lt;span style="color:#c678dd"&gt;row&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;01&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Observemos que &lt;code&gt;num_rows&lt;/code&gt; refleja eventos de pago, mientras &lt;code&gt;num_customers&lt;/code&gt; refleja entidades únicas. Esa distinción evita errores frecuentes en reportes, especialmente cuando mezclamos métricas transaccionales con métricas de negocio.&lt;/p&gt;
&lt;h2 id="generar-grupos-según-la-granularidad-requerida"&gt;Generar grupos según la granularidad requerida&lt;/h2&gt;
&lt;p&gt;La calidad de una consulta agregada depende de elegir la granularidad correcta. No es lo mismo agrupar por cliente, por cliente y mes, por actor y clasificación, o por una expresión derivada de una fecha.&lt;/p&gt;
&lt;h3 id="agrupamiento-por-una-columna"&gt;Agrupamiento por una columna&lt;/h3&gt;
&lt;p&gt;Agrupar por una sola columna es el caso base. En este ejemplo obtenemos cuántas películas tiene asociadas cada actor:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;actor_id&lt;/span&gt;, &lt;span style="color:#c678dd"&gt;count&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film_actor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;GROUP&lt;/span&gt; &lt;span style="color:#c678dd"&gt;BY&lt;/span&gt; &lt;span style="color:#e06c75"&gt;actor_id&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;----------+----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;actor_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;count&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;----------+----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;19&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;25&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;22&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;4&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;22&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;197&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;33&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;198&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;40&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;199&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;15&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;200&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;20&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;----------+----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;200&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;11&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



 
 





 


&lt;div class="notice info"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Info&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;En este resultado cada fila representa un actor y el conteo de películas en las que participa. La consulta ya no describe relaciones individuales &lt;code&gt;actor-película&lt;/code&gt;, sino un resumen por actor.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="agrupamiento-por-múltiples-columnas"&gt;Agrupamiento por múltiples columnas&lt;/h3&gt;
&lt;p&gt;En algunos casos necesitamos generar grupos que combinen más de una columna. Por ejemplo, contar cuántas películas tiene cada actor por clasificación (&lt;code&gt;G&lt;/code&gt;, &lt;code&gt;PG&lt;/code&gt;, &lt;code&gt;PG-13&lt;/code&gt;, &lt;code&gt;R&lt;/code&gt;, &lt;code&gt;NC-17&lt;/code&gt;):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fa&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;actor_id&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;rating&lt;/span&gt;, &lt;span style="color:#c678dd"&gt;count&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film_actor&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fa&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;INNER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fa&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;GROUP&lt;/span&gt; &lt;span style="color:#c678dd"&gt;BY&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fa&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;actor_id&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;rating&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ORDER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;BY&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;----------+--------+----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;actor_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rating&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;count&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;----------+--------+----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;G&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;4&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PG&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;6&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PG&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;13&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;R&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;NC&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;17&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;5&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;G&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;7&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PG&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;6&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PG&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;13&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;R&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;NC&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;17&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;8&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;199&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;G&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;199&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PG&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;4&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;199&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PG&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;13&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;4&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;199&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;R&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;199&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;NC&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;17&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;200&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;G&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;5&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;200&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PG&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;200&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PG&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;13&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;200&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;R&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;6&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;200&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;NC&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;17&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;4&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;----------+--------+----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;996&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;01&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Aquí la granularidad ya no es “actor”, sino “actor + clasificación”. Cada combinación única genera su propio grupo. Esta técnica es la base para reportes multidimensionales y pivotes posteriores en herramientas de BI.&lt;/p&gt;
&lt;h3 id="agrupamiento-mediante-expresiones"&gt;Agrupamiento mediante expresiones&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;GROUP BY&lt;/code&gt; no está limitado a columnas físicas. También puede agrupar por expresiones, funciones o transformaciones calculadas. Esto es especialmente útil con fechas.&lt;/p&gt;
&lt;p&gt;El siguiente ejemplo agrupa rentas por año:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;extract&lt;/span&gt;(&lt;span style="color:#c678dd"&gt;YEAR&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental_date&lt;/span&gt;) &lt;span style="color:#c678dd"&gt;year&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;COUNT&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;) &lt;span style="color:#e06c75"&gt;how_many&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;GROUP&lt;/span&gt; &lt;span style="color:#c678dd"&gt;BY&lt;/span&gt; &lt;span style="color:#c678dd"&gt;extract&lt;/span&gt;(&lt;span style="color:#c678dd"&gt;YEAR&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental_date&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------+----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;year&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;how_many&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------+----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2005&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;15862&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2006&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;182&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------+----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;2&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;01&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En lugar de agrupar por cada &lt;code&gt;rental_date&lt;/code&gt; exacto, reducimos la fecha al año con &lt;code&gt;EXTRACT(YEAR FROM rental_date)&lt;/code&gt;. El resultado responde una pregunta distinta: volumen anual, no eventos individuales.&lt;/p&gt;
&lt;h2 id="buenas-prácticas-al-trabajar-con-group-by"&gt;Buenas prácticas al trabajar con &lt;code&gt;GROUP BY&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Para mantener consultas claras y confiables, considera estas reglas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Define primero la &lt;strong&gt;granularidad&lt;/strong&gt;: una fila por cliente, por cliente y mes, por actor y rating, etc.&lt;/li&gt;
&lt;li&gt;Usa alias descriptivos para agregaciones: &lt;code&gt;num_payments&lt;/code&gt;, &lt;code&gt;total_amount&lt;/code&gt;, &lt;code&gt;avg_amount&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Aplica &lt;code&gt;WHERE&lt;/code&gt; para filtrar filas antes de agrupar y &lt;code&gt;HAVING&lt;/code&gt; para filtrar grupos.&lt;/li&gt;
&lt;li&gt;Evita depender de posiciones como &lt;code&gt;ORDER BY 2&lt;/code&gt; en consultas de producción si un alias mejora la legibilidad.&lt;/li&gt;
&lt;li&gt;Verifica si necesitas contar filas (&lt;code&gt;COUNT(*)&lt;/code&gt;), valores no nulos (&lt;code&gt;COUNT(columna)&lt;/code&gt;) o valores únicos (&lt;code&gt;COUNT(DISTINCT columna)&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;GROUP BY&lt;/code&gt; cambia la forma en que lees una tabla: pasas de inspeccionar filas individuales a construir resúmenes por la granularidad que necesita tu análisis. Combinado con funciones agregadas, &lt;code&gt;HAVING&lt;/code&gt;, &lt;code&gt;DISTINCT&lt;/code&gt; y expresiones, se convierte en una herramienta central para reportes, dashboards y validaciones de datos.&lt;/p&gt;
&lt;p&gt;En el siguiente artículo de la serie vamos a conectar datos distribuidos entre tablas con &lt;a href="https://blog.dacadev.com/programacion/sql/05-consultas-multiples-tablas-joins"



 


&gt;consultas a múltiples tablas usando JOINs&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Estilos CSS: Fondos, gradientes y sombras</title><link>https://blog.dacadev.com/programacion/estilos-css/backgrounds-y-sombras/</link><pubDate>Fri, 12 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/estilos-css/backgrounds-y-sombras/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Aprende a trabajar con fondos en CSS: las propiedades background, gradientes lineales y radiales, modos de mezcla y sombras con box-shadow y text-shadow.</description><media:content url="https://blog.dacadev.com/images/programming/html-and-css/css/06-backgrounds-y-sombras-banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#la-familia-background"&gt;La familia background&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#gradientes-lineales"&gt;Gradientes lineales&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#gradientes-lineales-repetitivos"&gt;Gradientes lineales repetitivos&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#gradientes-radiales"&gt;Gradientes radiales&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#combinar-múltiples-fondos"&gt;Combinar múltiples fondos&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#texturas-con-blend-modes"&gt;Texturas con blend modes&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#sombras-box-shadow-y-text-shadow"&gt;Sombras: box-shadow y text-shadow&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#sombras-interiores-para-feedback"&gt;Sombras interiores para feedback&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#conclusión"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;Los fondos y las sombras son las herramientas con las que CSS aporta profundidad, textura y jerarquía visual sin necesidad de imágenes externas. Un gradiente bien construido reemplaza un archivo PNG; una sombra sutil comunica que un botón es interactivo. Dominar estas propiedades te permite crear interfaces ricas con código puro, ligero y escalable.&lt;/p&gt;
&lt;p&gt;Esta es la sexta entrega de la serie &lt;strong&gt;Estilos CSS&lt;/strong&gt;. Recorreremos la familia de propiedades &lt;code&gt;background&lt;/code&gt;, los gradientes lineales y radiales, los modos de mezcla y las sombras de caja y de texto.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Aprenderás a generar gradientes y patrones sin imágenes, a combinar varias capas de fondo y a usar &lt;code&gt;box-shadow&lt;/code&gt; y &lt;code&gt;text-shadow&lt;/code&gt; para dar realismo y feedback a tus componentes.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="la-familia-background"&gt;La familia background&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;background&lt;/code&gt; es una propiedad abreviada que agrupa ocho propiedades individuales:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;background-image&lt;/code&gt; — una imagen o un gradiente generado.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;background-position&lt;/code&gt; — la posición inicial del fondo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;background-size&lt;/code&gt; — el tamaño de renderizado (&lt;code&gt;cover&lt;/code&gt;, &lt;code&gt;contain&lt;/code&gt;, valores explícitos).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;background-repeat&lt;/code&gt; — si la imagen se repite en mosaico.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;background-origin&lt;/code&gt; — respecto a qué caja se posiciona (border, padding o content).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;background-clip&lt;/code&gt; — hasta qué caja se extiende el fondo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;background-attachment&lt;/code&gt; — si el fondo se desplaza con el contenido o queda fijo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;background-color&lt;/code&gt; — un color sólido que se renderiza detrás de la imagen.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="gradientes-lineales"&gt;Gradientes lineales&lt;/h2&gt;
&lt;p&gt;Un gradiente es una transición de colores generada por una función de CSS, sin archivos. &lt;code&gt;linear-gradient()&lt;/code&gt; crea una transición a lo largo de una dirección.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;fade&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;background-image&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;linear-gradient&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;to&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;right&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;#fff&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;#2a9da9&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;margin:1rem 0;"&gt;
 &lt;div style="height:80px;border-radius:.4em;background-image:linear-gradient(to right,#fff,#2a9da9);"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;La función acepta una dirección (&lt;code&gt;to right&lt;/code&gt;, &lt;code&gt;90deg&lt;/code&gt;, etc.) y una lista de colores. Puedes incluir más de dos colores y fijar su posición con porcentajes:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;fade&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;background-image&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;linear-gradient&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;90&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;deg&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;#c0392b&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;%&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;#fff&lt;/span&gt; &lt;span style="color:#d19a66"&gt;50&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;%&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;#2a9da9&lt;/span&gt; &lt;span style="color:#d19a66"&gt;100&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;%&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;margin:1rem 0;"&gt;
 &lt;div style="height:80px;border-radius:.4em;background-image:linear-gradient(90deg,#c0392b 0%,#fff 50%,#2a9da9 100%);"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="gradientes-lineales-repetitivos"&gt;Gradientes lineales repetitivos&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;repeating-linear-gradient()&lt;/code&gt; crea patrones que se repiten, útil para texturas como rayas:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;rayas&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;background-image&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;repeating-linear-gradient&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;-45&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;deg&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#d19a66"&gt;#2a9da9&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;#2a9da9&lt;/span&gt; &lt;span style="color:#d19a66"&gt;10&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;#16828d&lt;/span&gt; &lt;span style="color:#d19a66"&gt;10&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;#16828d&lt;/span&gt; &lt;span style="color:#d19a66"&gt;20&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;margin:1rem 0;"&gt;
 &lt;div style="height:50px;border-radius:.4em;background-image:repeating-linear-gradient(-45deg,#2a9da9,#2a9da9 10px,#16828d 10px,#16828d 20px);"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="gradientes-radiales"&gt;Gradientes radiales&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;radial-gradient()&lt;/code&gt; genera una transición circular o elíptica que irradia desde un punto, en lugar de seguir una dirección lineal.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;brillo&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;background-image&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;radial-gradient&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;#fff&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;#2a9da9&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;margin:1rem 0;"&gt;
 &lt;div style="height:120px;border-radius:.4em;background-image:radial-gradient(circle,#fff,#2a9da9);"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="combinar-múltiples-fondos"&gt;Combinar múltiples fondos&lt;/h2&gt;
&lt;p&gt;Puedes apilar varias capas de fondo separándolas con comas. La primera capa queda al frente. Esto permite, por ejemplo, superponer un gradiente sobre una imagen:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;heroe&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;background-image&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;linear-gradient&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;to&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;bottom&lt;/span&gt;, &lt;span style="color:#e5c07b"&gt;rgba&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;42&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;157&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;169&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;0.6&lt;/span&gt;), &lt;span style="color:#e5c07b"&gt;rgba&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;22&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;130&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;141&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;0.9&lt;/span&gt;)),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;url&lt;/span&gt;(&lt;span style="color:#98c379"&gt;foto.jpg&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;background-size&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;cover&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;margin:1rem 0;"&gt;
 &lt;div style="height:120px;border-radius:.4em;display:flex;align-items:center;justify-content:center;color:#fff;font-family:Helvetica,Arial,sans-serif;font-weight:bold;background-image:linear-gradient(135deg,rgba(42,157,169,.85),rgba(22,130,141,.95)),repeating-linear-gradient(45deg,#888,#888 8px,#777 8px,#777 16px);"&gt;Gradiente sobre una textura de fondo&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="texturas-con-blend-modes"&gt;Texturas con blend modes&lt;/h3&gt;
&lt;p&gt;La propiedad &lt;code&gt;background-blend-mode&lt;/code&gt; mezcla las capas de fondo entre sí (con modos como &lt;code&gt;multiply&lt;/code&gt;, &lt;code&gt;soft-light&lt;/code&gt;, &lt;code&gt;overlay&lt;/code&gt;), añadiendo textura a una imagen sin editarla en un programa externo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;textura&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;background-image&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;url&lt;/span&gt;(&lt;span style="color:#98c379"&gt;rayones.png&lt;/span&gt;), &lt;span style="color:#e5c07b"&gt;url&lt;/span&gt;(&lt;span style="color:#98c379"&gt;foto.jpg&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;background-blend-mode&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;soft-light&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="sombras-box-shadow-y-text-shadow"&gt;Sombras: box-shadow y text-shadow&lt;/h2&gt;
&lt;p&gt;CSS permite añadir sombras tanto a las cajas (&lt;code&gt;box-shadow&lt;/code&gt;) como al texto (&lt;code&gt;text-shadow&lt;/code&gt;). Ambas reciben los mismos parámetros básicos:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Desplazamiento horizontal y vertical (&lt;code&gt;offset-x&lt;/code&gt;, &lt;code&gt;offset-y&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;El radio de difuminado (&lt;code&gt;blur&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;(opcional) El radio de expansión (&lt;code&gt;spread&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;El color de la sombra.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;tarjeta&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;box-shadow&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.2&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;rgba&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0.25&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;titulo&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;text-shadow&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;2&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt; &lt;span style="color:#d19a66"&gt;4&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;rgba&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0.4&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1.5rem;background:#f4f6f7;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;display:flex;gap:1.5rem;flex-wrap:wrap;align-items:center;"&gt;
 &lt;div style="background:#fff;color:#111;padding:1.2em 1.5em;border-radius:.5em;box-shadow:0 .2em .5em rgba(0,0,0,.25);"&gt;Tarjeta con &lt;code&gt;box-shadow&lt;/code&gt;&lt;/div&gt;
 &lt;span style="font-size:1.6rem;font-weight:bold;color:#2a9da9;text-shadow:2px 2px 4px rgba(0,0,0,.4);"&gt;Texto con text-shadow&lt;/span&gt;
&lt;/div&gt;
&lt;h3 id="sombras-interiores-para-feedback"&gt;Sombras interiores para feedback&lt;/h3&gt;
&lt;p&gt;La palabra clave &lt;code&gt;inset&lt;/code&gt; convierte la sombra en interior, perfecta para simular que un botón está presionado. Combinada con pseudo-clases como &lt;code&gt;:active&lt;/code&gt;, crea componentes con feedback táctil:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;boton&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;background-image&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;linear-gradient&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;to&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;bottom&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;#2a9da9&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;#16828d&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;box-shadow&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0.1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;rgba&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;0.4&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#fff&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;boton&lt;/span&gt;:&lt;span style="color:#61afef"&gt;active&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;box-shadow&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;inset&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt; &lt;span style="color:#d19a66"&gt;#0d4f56&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;inset&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;rgba&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;0.4&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1.5rem;background:#fff;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;style&gt;
 .csbtn { padding:1em 1.5em; border:0; font-size:.9rem; color:#fff; border-radius:.5em; cursor:pointer; background-image:linear-gradient(to bottom,#2a9da9,#16828d); box-shadow:.1em .1em .5em rgba(0,0,0,.4); }
 .csbtn:active { box-shadow:inset 0 0 .5em #0d4f56, inset 0 .5em 1em rgba(0,0,0,.4); }
 &lt;/style&gt;
 &lt;button class="csbtn" type="button"&gt;Mantén presionado este botón&lt;/button&gt;
 &lt;p style="margin:.75rem 0 0;color:#555;"&gt;Al pulsarlo, la sombra interior simula el hundido físico.&lt;/p&gt;
&lt;/div&gt;




 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Las sombras se renderizan en la capa de composición y son baratas de animar. Una transición sutil de &lt;code&gt;box-shadow&lt;/code&gt; en &lt;code&gt;:hover&lt;/code&gt; comunica interactividad con un costo de rendimiento mínimo.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Los gradientes y las sombras te permiten construir interfaces con profundidad y textura usando solo CSS, evitando peticiones de red y archivos de imagen. Apilar capas de fondo, mezclarlas con blend modes y aplicar sombras interiores son técnicas que elevan la calidad visual de cualquier componente.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;🚀 La próxima entrega cubre &lt;strong&gt;transiciones y transformaciones&lt;/strong&gt;: cómo animar cambios de estado de forma fluida y manipular la geometría de los elementos con &lt;code&gt;transform&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
</content:encoded></item><item><title>SQL: Lógica Condicional con la Expresión CASE</title><link>https://blog.dacadev.com/programacion/sql/03-logica-condicional-case/</link><pubDate>Thu, 11 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/sql/03-logica-condicional-case/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Aprende a usar CASE en SQL para crear lógica condicional, clasificar datos, evitar división por cero y manejar NULL correctamente.</description><media:content url="https://blog.dacadev.com/images/programming/sql/conditional-logic/banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#la-expresión-case"&gt;La expresión CASE&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#searched-case"&gt;Searched CASE&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#simple-case"&gt;Simple CASE&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#comprobar-la-existencia"&gt;Comprobar la existencia&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#errores-de-división-por-cero"&gt;Errores de división por cero&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#actualizaciones-condicionales"&gt;Actualizaciones condicionales&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#manejo-de-valores-null"&gt;Manejo de valores NULL&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#cierre"&gt;Cierre&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;Cuando una consulta necesita clasificar registros, calcular valores derivados o protegerse de casos límite, la &lt;strong&gt;lógica condicional en SQL&lt;/strong&gt; evita mover decisiones simples a la capa de aplicación. Después de trabajar con &lt;a href="https://blog.dacadev.com/programacion/sql/02-filtrado-datos-clausula-where"



 


&gt;filtrado de datos con WHERE&lt;/a&gt;, el siguiente paso natural es usar la &lt;strong&gt;expresión CASE&lt;/strong&gt; para transformar resultados directamente dentro del query.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;En este artículo analizaremos cómo usar &lt;code&gt;CASE&lt;/code&gt; en SQL con condiciones múltiples, validaciones de existencia, protección contra división por cero, actualizaciones condicionales y manejo explícito de valores &lt;code&gt;NULL&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;La expresión &lt;code&gt;CASE&lt;/code&gt; cumple un rol similar a &lt;code&gt;if / else if / else&lt;/code&gt; o &lt;code&gt;switch / case&lt;/code&gt; en lenguajes de programación. Su valor está en que opera dentro del motor de base de datos: puedes derivar columnas, etiquetar estados y condicionar cálculos sin postprocesar cada fila en tu backend.&lt;/p&gt;
&lt;p&gt;Observemos un primer ejemplo directo. A partir de una columna &lt;code&gt;active&lt;/code&gt;, convertimos &lt;code&gt;1&lt;/code&gt; y &lt;code&gt;0&lt;/code&gt; en etiquetas más legibles:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;CASE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHEN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;active&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt; &lt;span style="color:#c678dd"&gt;THEN&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;ACTIVE&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ELSE&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;INACTIVE&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;END&lt;/span&gt; &lt;span style="color:#e06c75"&gt;activity_type&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+--------------+---------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;activity_type&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+--------------+---------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;MARY&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SMITH&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ACTIVE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PATRICIA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JOHNSON&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ACTIVE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;LINDA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;WILLIAMS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ACTIVE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;BARBARA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JONES&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ACTIVE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ELIZABETH&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;BROWN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ACTIVE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JENNIFER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DAVIS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ACTIVE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;KENT&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ARSENAULT&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ACTIVE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;TERRANCE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ROUSH&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;INACTIVE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;RENE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;MCALISTER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ACTIVE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;EDUARDO&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;HIATT&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ACTIVE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;TERRENCE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;GUNDERSON&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ACTIVE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ENRIQUE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FORSYTHE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ACTIVE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FREDDIE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DUGGAN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ACTIVE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;WADE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DELVALLE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ACTIVE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;AUSTIN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CINTRON&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ACTIVE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+--------------+---------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;599&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;00&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="la-expresión-case"&gt;La expresión CASE&lt;/h2&gt;
&lt;p&gt;La expresión &lt;code&gt;CASE&lt;/code&gt; evalúa una o varias condiciones y retorna un valor según la primera coincidencia encontrada. En SQL, &lt;code&gt;CASE&lt;/code&gt; no es solo una herramienta cosmética; también permite modelar reglas de negocio dentro de consultas, reportes y operaciones &lt;code&gt;UPDATE&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Existen dos variantes principales:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Searched CASE&lt;/strong&gt;: cada &lt;code&gt;WHEN&lt;/code&gt; contiene una condición completa.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simple CASE&lt;/strong&gt;: se evalúa una expresión base contra valores específicos.&lt;/li&gt;
&lt;/ul&gt;




 
 





 


&lt;div class="notice info"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Info&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Si ninguna condición coincide y no defines &lt;code&gt;ELSE&lt;/code&gt;, el resultado de &lt;code&gt;CASE&lt;/code&gt; será &lt;code&gt;NULL&lt;/code&gt;. Conviene declarar &lt;code&gt;ELSE&lt;/code&gt; explícitamente cuando el consumidor del dato espera una categoría estable.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="searched-case"&gt;Searched CASE&lt;/h2&gt;
&lt;p&gt;El &lt;strong&gt;Searched CASE&lt;/strong&gt; es la forma más flexible porque cada rama puede evaluar una condición distinta. Su estructura general es:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;CASE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;WHEN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;C1&lt;/span&gt; &lt;span style="color:#c678dd"&gt;THEN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;E1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;WHEN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;C2&lt;/span&gt; &lt;span style="color:#c678dd"&gt;THEN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;E2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;WHEN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CN&lt;/span&gt; &lt;span style="color:#c678dd"&gt;THEN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;EN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [&lt;span style="color:#c678dd"&gt;ELSE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ED&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;END&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En este patrón, &lt;code&gt;C1&lt;/code&gt;, &lt;code&gt;C2&lt;/code&gt; y &lt;code&gt;CN&lt;/code&gt; representan condiciones booleanas. Cuando una condición se cumple, &lt;code&gt;CASE&lt;/code&gt; retorna su expresión asociada (&lt;code&gt;E1&lt;/code&gt;, &lt;code&gt;E2&lt;/code&gt;, &lt;code&gt;EN&lt;/code&gt;) y deja de evaluar las siguientes ramas.&lt;/p&gt;
&lt;p&gt;Analicemos una clasificación de categorías de películas:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;CASE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;WHEN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;category&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;name&lt;/span&gt; &lt;span style="color:#c678dd"&gt;IN&lt;/span&gt; (&lt;span style="color:#98c379"&gt;&amp;#39;Children&amp;#39;&lt;/span&gt;,&lt;span style="color:#98c379"&gt;&amp;#39;Family&amp;#39;&lt;/span&gt;,&lt;span style="color:#98c379"&gt;&amp;#39;Sports&amp;#39;&lt;/span&gt;,&lt;span style="color:#98c379"&gt;&amp;#39;Animation&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;THEN&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;All Ages&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;WHEN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;category&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Horror&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;THEN&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Adult&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;WHEN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;category&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;name&lt;/span&gt; &lt;span style="color:#c678dd"&gt;IN&lt;/span&gt; (&lt;span style="color:#98c379"&gt;&amp;#39;Music&amp;#39;&lt;/span&gt;,&lt;span style="color:#98c379"&gt;&amp;#39;Games&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;THEN&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Teens&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;ELSE&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Other&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;END&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Esta variante permite mezclar operadores como &lt;code&gt;IN&lt;/code&gt;, &lt;code&gt;=&lt;/code&gt;, comparaciones numéricas, subconsultas y funciones. También se puede usar para evitar cálculos innecesarios en ciertas filas.&lt;/p&gt;
&lt;p&gt;Consideremos el siguiente caso: si un cliente está inactivo, queremos retornar &lt;code&gt;0&lt;/code&gt;; si está activo, contamos sus rentas:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;, &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;CASE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHEN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;active&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt; &lt;span style="color:#c678dd"&gt;THEN&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ELSE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; (&lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;count&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;) &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental&lt;/span&gt; &lt;span style="color:#e06c75"&gt;r&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;r&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;END&lt;/span&gt; &lt;span style="color:#e06c75"&gt;num_rentals&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+--------------+-------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;num_rentals&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+--------------+-------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;MARY&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SMITH&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;32&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PATRICIA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JOHNSON&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;27&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;LINDA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;WILLIAMS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;26&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;BARBARA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JONES&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;22&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ELIZABETH&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;BROWN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;38&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JENNIFER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DAVIS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;28&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;TERRANCE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ROUSH&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;RENE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;MCALISTER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;26&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;EDUARDO&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;HIATT&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;27&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;TERRENCE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;GUNDERSON&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;30&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ENRIQUE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FORSYTHE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;28&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FREDDIE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DUGGAN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;25&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;WADE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DELVALLE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;22&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;AUSTIN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CINTRON&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;19&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+--------------+-------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;599&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;01&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="simple-case"&gt;Simple CASE&lt;/h2&gt;
&lt;p&gt;El &lt;strong&gt;Simple CASE&lt;/strong&gt; es útil cuando todas las ramas comparan la misma expresión contra valores concretos. En lugar de repetir &lt;code&gt;category.name = ...&lt;/code&gt;, colocamos &lt;code&gt;category.name&lt;/code&gt; una sola vez después de &lt;code&gt;CASE&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;CASE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;category&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;WHEN&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Children&amp;#39;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;THEN&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;All Ages&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;WHEN&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Family&amp;#39;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;THEN&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;All Ages&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;WHEN&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Sports&amp;#39;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;THEN&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;All Ages&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;WHEN&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Animation&amp;#39;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;THEN&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;All Ages&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;WHEN&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Horror&amp;#39;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;THEN&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Adult&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;WHEN&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Music&amp;#39;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;THEN&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Teens&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;WHEN&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Games&amp;#39;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;THEN&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Teens&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;ELSE&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Other&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;END&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Esta forma es más compacta y legible cuando la decisión depende de una única columna o expresión. Su limitación es que no permite condiciones heterogéneas por rama; para eso conviene usar &lt;code&gt;Searched CASE&lt;/code&gt;.&lt;/p&gt;




 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Usa &lt;code&gt;Simple CASE&lt;/code&gt; cuando estás mapeando valores discretos de una misma columna. Usa &lt;code&gt;Searched CASE&lt;/code&gt; cuando necesitas rangos, &lt;code&gt;IN&lt;/code&gt;, &lt;code&gt;EXISTS&lt;/code&gt;, comparaciones entre columnas o reglas más compuestas.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="comprobar-la-existencia"&gt;Comprobar la existencia&lt;/h2&gt;
&lt;p&gt;Uno de los usos más prácticos de &lt;code&gt;CASE&lt;/code&gt; es combinarlo con &lt;code&gt;EXISTS&lt;/code&gt;. Esta técnica permite crear columnas tipo bandera (&lt;code&gt;Y&lt;/code&gt; / &lt;code&gt;N&lt;/code&gt;, &lt;code&gt;true&lt;/code&gt; / &lt;code&gt;false&lt;/code&gt;, &lt;code&gt;1&lt;/code&gt; / &lt;code&gt;0&lt;/code&gt;) según la existencia de filas relacionadas.&lt;/p&gt;
&lt;p&gt;Observemos una consulta que marca si un actor participó en películas con ciertas clasificaciones:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;CASE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHEN&lt;/span&gt; &lt;span style="color:#c678dd"&gt;EXISTS&lt;/span&gt; (&lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film_actor&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fa&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;INNER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fa&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fa&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;actor_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;actor_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;AND&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;rating&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;G&amp;#39;&lt;/span&gt;) &lt;span style="color:#c678dd"&gt;THEN&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Y&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ELSE&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;N&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;END&lt;/span&gt; &lt;span style="color:#e06c75"&gt;g_actor&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;CASE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHEN&lt;/span&gt; &lt;span style="color:#c678dd"&gt;EXISTS&lt;/span&gt; (&lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film_actor&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fa&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;INNER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fa&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fa&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;actor_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;actor_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;AND&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;rating&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;PG&amp;#39;&lt;/span&gt;) &lt;span style="color:#c678dd"&gt;THEN&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Y&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ELSE&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;N&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;END&lt;/span&gt; &lt;span style="color:#e06c75"&gt;pg_actor&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;CASE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHEN&lt;/span&gt; &lt;span style="color:#c678dd"&gt;EXISTS&lt;/span&gt; (&lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film_actor&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fa&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;INNER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fa&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fa&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;actor_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;actor_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;AND&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;rating&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;NC-17&amp;#39;&lt;/span&gt;) &lt;span style="color:#c678dd"&gt;THEN&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Y&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ELSE&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;N&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;END&lt;/span&gt; &lt;span style="color:#e06c75"&gt;nc17_actor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;actor&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#c678dd"&gt;LIKE&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;S%&amp;#39;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;OR&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#c678dd"&gt;LIKE&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;S%&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------+-------------+---------+----------+------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;g_actor&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;pg_actor&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;nc17_actor&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------+-------------+---------+----------+------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JOE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SWANK&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SANDRA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;KILMER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CAMERON&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;STREEP&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SANDRA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PECK&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SISSY&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SOBIESKI&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;N&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;NICK&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;STALLONE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SEAN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;WILLIAMS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;GROUCHO&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SINATRA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SCARLETT&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DAMON&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SPENCER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PECK&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SEAN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;GUINESS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SPENCER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DEPP&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SUSAN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DAVIS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SIDNEY&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CROWE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SYLVESTER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DERN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SUSAN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DAVIS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DAN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;STREEP&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SALMA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;NOLTE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;N&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SCARLETT&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;BENING&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JEFF&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SILVERSTONE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JOHN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SUVARI&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JAYNE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SILVERSTONE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------+-------------+---------+----------+------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;22&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;00&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;También podemos usar &lt;code&gt;CASE&lt;/code&gt; con una subconsulta escalar. Aquí se clasifica la disponibilidad de una película según la cantidad de copias en inventario:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;title&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;CASE&lt;/span&gt; (&lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;count&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;) &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;inventory&lt;/span&gt; &lt;span style="color:#e06c75"&gt;i&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;i&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHEN&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt; &lt;span style="color:#c678dd"&gt;THEN&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Out Of Stock&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHEN&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt; &lt;span style="color:#c678dd"&gt;THEN&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Scarce&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHEN&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2&lt;/span&gt; &lt;span style="color:#c678dd"&gt;THEN&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Scarce&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHEN&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt; &lt;span style="color:#c678dd"&gt;THEN&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Available&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHEN&lt;/span&gt; &lt;span style="color:#d19a66"&gt;4&lt;/span&gt; &lt;span style="color:#c678dd"&gt;THEN&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Available&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ELSE&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Common&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;END&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film_availability&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-----------------------------+-------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;title&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film_availability&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-----------------------------+-------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ACADEMY&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DINOSAUR&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Common&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ACE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;GOLDFINGER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Available&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ADAPTATION&lt;/span&gt; &lt;span style="color:#e06c75"&gt;HOLES&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Available&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;AFFAIR&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PREJUDICE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Common&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;AFRICAN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;EGG&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Available&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;AGENT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;TRUMAN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Common&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;AIRPLANE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SIERRA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Common&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;AIRPORT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;POLLOCK&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Available&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ALABAMA&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DEVIL&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Common&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ALADDIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CALENDAR&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Common&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ALAMO&lt;/span&gt; &lt;span style="color:#e06c75"&gt;VIDEOTAPE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Common&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ALASKA&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PHANTOM&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Common&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ALI&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FOREVER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Available&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ALICE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FANTASIA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;Out&lt;/span&gt; &lt;span style="color:#c678dd"&gt;Of&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Stock&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;YOUNG&lt;/span&gt; &lt;span style="color:#c678dd"&gt;LANGUAGE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Scarce&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;YOUTH&lt;/span&gt; &lt;span style="color:#e06c75"&gt;KICK&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Scarce&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ZHIVAGO&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CORE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Scarce&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ZOOLANDER&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FICTION&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Common&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ZORRO&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ARK&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Common&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-----------------------------+-------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;1000&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;01&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="errores-de-división-por-cero"&gt;Errores de división por cero&lt;/h2&gt;
&lt;p&gt;La división por cero no está definida matemáticamente y los motores de base de datos deben tratarla como un caso especial. En MySQL, por ejemplo, una división directa entre cero puede retornar &lt;code&gt;NULL&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#d19a66"&gt;100&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;/&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;100&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;/&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;NULL&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;1&lt;/span&gt; &lt;span style="color:#c678dd"&gt;row&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;00&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En reportes, un &lt;code&gt;NULL&lt;/code&gt; inesperado puede contaminar cálculos posteriores o romper supuestos del consumidor. &lt;code&gt;CASE&lt;/code&gt; permite controlar el denominador antes de ejecutar la división.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;, &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;sum&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;p&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;amount&lt;/span&gt;) &lt;span style="color:#e06c75"&gt;tot_payment_amt&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;count&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;p&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;amount&lt;/span&gt;) &lt;span style="color:#e06c75"&gt;num_payments&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;sum&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;p&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;amount&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;CASE&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHEN&lt;/span&gt; &lt;span style="color:#c678dd"&gt;count&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;p&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;amount&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt; &lt;span style="color:#c678dd"&gt;THEN&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ELSE&lt;/span&gt; &lt;span style="color:#c678dd"&gt;count&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;p&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;amount&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;END&lt;/span&gt; &lt;span style="color:#e06c75"&gt;avg_payment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;LEFT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;OUTER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;payment&lt;/span&gt; &lt;span style="color:#e06c75"&gt;p&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;p&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;GROUP&lt;/span&gt; &lt;span style="color:#c678dd"&gt;BY&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;, &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------+------------+-----------------+--------------+-------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;tot_payment_amt&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;num_payments&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;avg_payment&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------+------------+-----------------+--------------+-------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;MARY&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SMITH&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;118&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;68&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;32&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;708750&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PATRICIA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JOHNSON&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;128&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;73&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;27&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;4&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;767778&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;LINDA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;WILLIAMS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;135&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;74&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;26&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;5&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;220769&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;BARBARA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JONES&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;81&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;78&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;22&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;717273&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ELIZABETH&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;BROWN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;144&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;62&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;38&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;805789&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;EDUARDO&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;HIATT&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;130&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;73&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;27&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;4&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;841852&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;TERRENCE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;GUNDERSON&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;117&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;70&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;30&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;923333&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ENRIQUE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FORSYTHE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;96&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;72&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;28&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;454286&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FREDDIE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DUGGAN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;99&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;75&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;25&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;990000&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;WADE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DELVALLE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;83&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;78&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;22&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;808182&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;AUSTIN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CINTRON&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;83&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;81&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;19&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;4&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;411053&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------+------------+-----------------+--------------+-------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;599&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;07&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



 
 





 


&lt;div class="notice warning"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Warning&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Esta técnica evita el error o el &lt;code&gt;NULL&lt;/code&gt;, pero no siempre significa que dividir entre &lt;code&gt;1&lt;/code&gt; sea semánticamente correcto. En métricas financieras o analíticas, valida si conviene retornar &lt;code&gt;0&lt;/code&gt;, &lt;code&gt;NULL&lt;/code&gt; controlado o una etiqueta explícita.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="actualizaciones-condicionales"&gt;Actualizaciones condicionales&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;CASE&lt;/code&gt; también puede usarse dentro de &lt;code&gt;UPDATE&lt;/code&gt;. Esto permite modificar registros según reglas calculadas al momento de la escritura.&lt;/p&gt;
&lt;p&gt;El siguiente ejemplo desactiva clientes activos si su última renta ocurrió hace 90 días o más; en caso contrario, mantiene el registro activo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;UPDATE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;SET&lt;/span&gt; &lt;span style="color:#e06c75"&gt;active&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;CASE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;WHEN&lt;/span&gt; &lt;span style="color:#d19a66"&gt;90&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;&amp;lt;=&lt;/span&gt; (&lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;datediff&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;now&lt;/span&gt;(), &lt;span style="color:#c678dd"&gt;max&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;rental_date&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental&lt;/span&gt; &lt;span style="color:#e06c75"&gt;r&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;r&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;THEN&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;ELSE&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;END&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;active&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Esta aproximación concentra la regla en una sola sentencia SQL. Antes de ejecutar un &lt;code&gt;UPDATE&lt;/code&gt; de este tipo en producción, conviene probar el mismo &lt;code&gt;CASE&lt;/code&gt; en un &lt;code&gt;SELECT&lt;/code&gt;, revisar cuántas filas cambiarán y ejecutar la operación dentro de una transacción si el motor lo permite.&lt;/p&gt;
&lt;h2 id="manejo-de-valores-null"&gt;Manejo de valores NULL&lt;/h2&gt;
&lt;p&gt;Los valores &lt;code&gt;NULL&lt;/code&gt; aparecen con frecuencia cuando usamos &lt;code&gt;LEFT OUTER JOIN&lt;/code&gt;, porque no siempre existe una fila relacionada. &lt;code&gt;CASE&lt;/code&gt; nos permite reemplazarlos por un valor controlado para reportes o interfaces.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;, &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;CASE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;WHEN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;address&lt;/span&gt; &lt;span style="color:#c678dd"&gt;IS&lt;/span&gt; &lt;span style="color:#c678dd"&gt;NULL&lt;/span&gt; &lt;span style="color:#c678dd"&gt;THEN&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Unknown&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;ELSE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;address&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;END&lt;/span&gt; &lt;span style="color:#e06c75"&gt;address&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;CASE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;WHEN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ct&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;city&lt;/span&gt; &lt;span style="color:#c678dd"&gt;IS&lt;/span&gt; &lt;span style="color:#c678dd"&gt;NULL&lt;/span&gt; &lt;span style="color:#c678dd"&gt;THEN&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Unknown&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;ELSE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ct&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;city&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;END&lt;/span&gt; &lt;span style="color:#e06c75"&gt;city&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;CASE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;WHEN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;cn&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;country&lt;/span&gt; &lt;span style="color:#c678dd"&gt;IS&lt;/span&gt; &lt;span style="color:#c678dd"&gt;NULL&lt;/span&gt; &lt;span style="color:#c678dd"&gt;THEN&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Unknown&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;ELSE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;cn&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;country&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;END&lt;/span&gt; &lt;span style="color:#e06c75"&gt;country&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;LEFT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;OUTER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;address&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;address_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;address_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;LEFT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;OUTER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;city&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ct&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;city_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ct&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;city_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;LEFT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;OUTER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;country&lt;/span&gt; &lt;span style="color:#e06c75"&gt;cn&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ct&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;country_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;cn&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;country_id&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En varios motores también existen funciones como &lt;code&gt;COALESCE&lt;/code&gt;, útiles para este caso específico. Aun así, &lt;code&gt;CASE&lt;/code&gt; sigue siendo preferible cuando la lógica depende de más de una condición o cuando el valor de salida no es simplemente el primer dato no nulo.&lt;/p&gt;
&lt;h2 id="cierre"&gt;Cierre&lt;/h2&gt;
&lt;p&gt;La expresión &lt;code&gt;CASE&lt;/code&gt; convierte SQL en una herramienta más expresiva para preparar datos cerca de donde viven. Con ella puedes clasificar filas, derivar columnas, controlar casos límite, ejecutar actualizaciones condicionales y normalizar valores faltantes.&lt;/p&gt;
&lt;p&gt;Como regla práctica, usa &lt;code&gt;CASE&lt;/code&gt; para reglas de presentación, clasificación y cálculo que pertenecen naturalmente al resultado de la consulta. Si la lógica empieza a depender de múltiples procesos externos o de reglas de dominio altamente cambiantes, evalúa moverla a una capa de aplicación o a una vista bien documentada.&lt;/p&gt;
&lt;p&gt;En el siguiente artículo de la serie vamos a trabajar con &lt;a href="https://blog.dacadev.com/programacion/sql/04-agrupamiento-funciones-agregadas"



 


&gt;agrupamiento y funciones agregadas&lt;/a&gt;, donde &lt;code&gt;GROUP BY&lt;/code&gt;, &lt;code&gt;COUNT&lt;/code&gt;, &lt;code&gt;SUM&lt;/code&gt; y otras funciones nos permitirán resumir datos de manera consistente.&lt;/p&gt;</content:encoded></item><item><title>Estilos CSS: Posicionamiento, z-index y diseño responsive</title><link>https://blog.dacadev.com/programacion/estilos-css/posicionamiento-y-responsive/</link><pubDate>Wed, 10 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/estilos-css/posicionamiento-y-responsive/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Domina el posicionamiento en CSS: static, relative, absolute, fixed y sticky, los contextos de apilamiento con z-index y el diseño responsive con media queries.</description><media:content url="https://blog.dacadev.com/images/programming/html-and-css/css/05-posicionamiento-y-responsive-banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#la-propiedad-position"&gt;La propiedad position&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#fixed-anclado-al-viewport"&gt;Fixed: anclado al viewport&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#absolute-relativo-al-ancestro-posicionado"&gt;Absolute: relativo al ancestro posicionado&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#relative-desplazamiento-sin-salir-del-flujo"&gt;Relative: desplazamiento sin salir del flujo&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#sticky-lo-mejor-de-relative-y-fixed"&gt;Sticky: lo mejor de relative y fixed&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#stacking-contexts-y-z-index"&gt;Stacking contexts y z-index&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#responsive-estilos-que-se-adaptan"&gt;Responsive: estilos que se adaptan&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#media-queries"&gt;Media queries&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#breakpoints-con-mobile-first"&gt;Breakpoints con mobile first&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#estilos-para-impresión"&gt;Estilos para impresión&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#conclusión"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;Hasta ahora hemos trabajado con elementos que viven en el flujo normal del documento. El posicionamiento rompe ese flujo: te permite anclar una cabecera al viewport, superponer un modal, desplegar un menú o fijar una barra lateral mientras el usuario hace scroll. Combinado con &lt;code&gt;z-index&lt;/code&gt; y las media queries, el posicionamiento es la base de las interacciones dinámicas y del diseño adaptable.&lt;/p&gt;
&lt;p&gt;Esta es la quinta entrega de la serie &lt;strong&gt;Estilos CSS&lt;/strong&gt;. Cubriremos los cinco valores de &lt;code&gt;position&lt;/code&gt;, los contextos de apilamiento con &lt;code&gt;z-index&lt;/code&gt; y los fundamentos del diseño &lt;strong&gt;responsive&lt;/strong&gt;.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Entenderás cuándo usar cada tipo de posicionamiento, por qué &lt;code&gt;z-index&lt;/code&gt; a veces &amp;ldquo;no funciona&amp;rdquo; por culpa de los contextos de apilamiento, y cómo escribir media queries con un enfoque &lt;em&gt;mobile first&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="la-propiedad-position"&gt;La propiedad position&lt;/h2&gt;
&lt;p&gt;La propiedad &lt;code&gt;position&lt;/code&gt; acepta cinco valores que cambian cómo se ubica un elemento:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;static&lt;/code&gt; (por defecto) — el elemento permanece en el flujo normal.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;relative&lt;/code&gt; — se desplaza respecto a su posición original sin salir del flujo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;absolute&lt;/code&gt; — se extrae del flujo y se posiciona respecto a su ancestro posicionado más cercano.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fixed&lt;/code&gt; — se extrae del flujo y se posiciona respecto al viewport.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sticky&lt;/code&gt; — combina &lt;code&gt;relative&lt;/code&gt; y &lt;code&gt;fixed&lt;/code&gt; según el scroll.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Las propiedades &lt;code&gt;top&lt;/code&gt;, &lt;code&gt;right&lt;/code&gt;, &lt;code&gt;bottom&lt;/code&gt; y &lt;code&gt;left&lt;/code&gt; controlan la ubicación (y, en algunos casos, el tamaño) de los elementos posicionados.&lt;/p&gt;
&lt;h2 id="fixed-anclado-al-viewport"&gt;Fixed: anclado al viewport&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;position: fixed&lt;/code&gt; extrae el elemento del flujo normal —los demás se reorganizan como si no existiera— y lo ancla a una posición relativa al viewport, donde permanece aunque el usuario haga scroll. Es la base de los &lt;strong&gt;modales&lt;/strong&gt;: un fondo semitransparente que cubre toda la pantalla y un cuerpo centrado encima.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;modal-backdrop&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;position&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;fixed&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;top&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;right&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;bottom&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;left&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;background-color&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;rgba&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0.5&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;modal-body&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;position&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;fixed&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;top&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;3&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;bottom&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;3&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;right&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;20&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;%&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;left&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;20&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;%&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;background-color&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;white&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;overflow&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;auto&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Al posicionar no estás obligado a declarar los cuatro lados. Si omites &lt;code&gt;bottom&lt;/code&gt; y &lt;code&gt;height&lt;/code&gt;, la altura la determina el contenido de forma natural. Combinar lados con &lt;code&gt;width&lt;/code&gt;/&lt;code&gt;height&lt;/code&gt; te da control total sobre el tamaño.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="absolute-relativo-al-ancestro-posicionado"&gt;Absolute: relativo al ancestro posicionado&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;position: absolute&lt;/code&gt; también extrae el elemento del flujo, pero se posiciona respecto al primer ancestro que tenga una posición distinta de &lt;code&gt;static&lt;/code&gt;. Si ningún ancestro está posicionado, usa el &lt;em&gt;bloque contenedor inicial&lt;/em&gt; (el tamaño del viewport).&lt;/p&gt;
&lt;p&gt;Este es el patrón para colocar un botón de cierre en la esquina de un modal: el padre se marca como &lt;code&gt;position: relative&lt;/code&gt; y el botón como &lt;code&gt;position: absolute&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;modal-body&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;position&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;relative&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;modal-close&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;position&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;absolute&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;top&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0.3&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;right&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0.3&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="position:relative;background:#eaf2f8;padding:1.5em;border-radius:.4em;min-height:4em;"&gt;
 &lt;span style="position:absolute;top:.4em;right:.4em;background:#c0392b;color:#fff;padding:.2em .5em;border-radius:.3em;font-size:.8em;cursor:pointer;"&gt;✕&lt;/span&gt;
 &lt;strong&gt;Cuerpo del modal&lt;/strong&gt;
 &lt;p style="margin:.4rem 0 0;"&gt;El botón de cierre está posicionado en la esquina con &lt;code&gt;absolute&lt;/code&gt; respecto a este contenedor &lt;code&gt;relative&lt;/code&gt;.&lt;/p&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="relative-desplazamiento-sin-salir-del-flujo"&gt;Relative: desplazamiento sin salir del flujo&lt;/h2&gt;
&lt;p&gt;A diferencia de los anteriores, &lt;code&gt;position: relative&lt;/code&gt; &lt;strong&gt;no&lt;/strong&gt; extrae el elemento del flujo; lo traslada respecto a su posición original, dejando su hueco intacto. Tampoco permite redimensionarlo con la combinación de lados.&lt;/p&gt;
&lt;p&gt;Su uso más frecuente es establecer un &lt;strong&gt;bloque contenedor&lt;/strong&gt; para descendientes absolutos. Es la base de un menú desplegable: el contenedor es &lt;code&gt;relative&lt;/code&gt; y el menú es &lt;code&gt;absolute&lt;/code&gt;, mostrándose con &lt;code&gt;:hover&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;dropdown&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;position&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;relative&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;display&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;inline-block&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;dropdown-menu&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;position&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;absolute&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;top&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;100&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;%&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;left&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;display&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;none&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;dropdown&lt;/span&gt;:&lt;span style="color:#61afef"&gt;hover&lt;/span&gt; .&lt;span style="color:#e5c07b"&gt;dropdown-menu&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;display&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;block&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;min-height:9em;"&gt;
 &lt;style&gt;
 .csdrop { position:relative; display:inline-block; }
 .csdrop-label { padding:.5em 1.5em; border:1px solid #ccc; background:#eee; cursor:pointer; border-radius:.3em; }
 .csdrop-menu { position:absolute; top:100%; left:0; min-width:160px; background:#fff; border:1px solid #999; border-radius:.3em; display:none; margin:0; padding:0; list-style:none; box-shadow:0 4px 12px rgba(0,0,0,.15); z-index:1; }
 .csdrop:hover .csdrop-menu { display:block; }
 .csdrop-menu li a { display:block; padding:.5em 1.5em; color:#2a7ae2; text-decoration:none; }
 .csdrop-menu li a:hover { background:#f0f0f0; }
 &lt;/style&gt;
 &lt;div class="csdrop"&gt;
 &lt;div class="csdrop-label"&gt;Menú principal ▾&lt;/div&gt;
 &lt;ul class="csdrop-menu"&gt;
 &lt;li&gt;&lt;a href="#posicionamiento-y-responsive"&gt;Inicio&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#posicionamiento-y-responsive"&gt;Productos&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#posicionamiento-y-responsive"&gt;Contacto&lt;/a&gt;&lt;/li&gt;
 &lt;/ul&gt;
 &lt;/div&gt;
 &lt;p style="margin:.75rem 0 0;color:#555;"&gt;Pasa el cursor sobre el botón para desplegar el menú.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="sticky-lo-mejor-de-relative-y-fixed"&gt;Sticky: lo mejor de relative y fixed&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;position: sticky&lt;/code&gt; mantiene el elemento en su posición normal hasta que, al hacer scroll, alcanza el umbral definido por &lt;code&gt;top&lt;/code&gt;/&lt;code&gt;bottom&lt;/code&gt;; en ese momento se &amp;ldquo;pega&amp;rdquo; como si fuera &lt;code&gt;fixed&lt;/code&gt;. Cuando el contenido vuelve, recupera su comportamiento relativo. Es ideal para barras laterales y cabeceras de sección que deben permanecer visibles.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;afijo&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;position&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;sticky&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;top&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="stacking-contexts-y-z-index"&gt;Stacking contexts y z-index&lt;/h2&gt;
&lt;p&gt;Cuando varios elementos posicionados se solapan, &lt;code&gt;z-index&lt;/code&gt; controla el orden de apilamiento en el eje Z. Acepta enteros positivos y negativos: a mayor valor, más al frente.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;uno&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;position&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;relative&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;z-index&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;dos&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;position&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;relative&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;z-index&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;2&lt;/span&gt;; } &lt;span style="color:#7f848e"&gt;/* queda por encima de .uno */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Aquí está la trampa que confunde a muchos: &lt;strong&gt;cada elemento posicionado con &lt;code&gt;z-index&lt;/code&gt; crea su propio contexto de apilamiento&lt;/strong&gt;. Un hijo dentro de un contexto con &lt;code&gt;z-index: 1&lt;/code&gt; nunca podrá superar a un elemento de un contexto hermano con &lt;code&gt;z-index: 2&lt;/code&gt;, aunque el hijo tenga &lt;code&gt;z-index: 99999&lt;/code&gt;.&lt;/p&gt;




 
 





 


&lt;div class="notice warning"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Warning&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;&lt;code&gt;z-index&lt;/code&gt; tiene dos &amp;ldquo;gotchas&amp;rdquo;: solo funciona sobre elementos posicionados (cualquier &lt;code&gt;position&lt;/code&gt; distinto de &lt;code&gt;static&lt;/code&gt;), y al usarlo creas un nuevo contexto de apilamiento. Si un &lt;code&gt;z-index&lt;/code&gt; enorme &amp;ldquo;no funciona&amp;rdquo;, casi siempre es porque su elemento está atrapado en un contexto de apilamiento de menor prioridad.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="responsive-estilos-que-se-adaptan"&gt;Responsive: estilos que se adaptan&lt;/h2&gt;
&lt;p&gt;La enorme variedad de pantallas obliga a diseñar interfaces que respondan a distintos tamaños. La filosofía &lt;strong&gt;mobile first&lt;/strong&gt; consiste en escribir primero los estilos para móvil y luego ampliarlos progresivamente hacia tablets y escritorio.&lt;/p&gt;
&lt;h3 id="media-queries"&gt;Media queries&lt;/h3&gt;
&lt;p&gt;Una &lt;strong&gt;media query&lt;/strong&gt; aplica un bloque de CSS solo cuando se cumple una condición sobre el viewport. Conviene usar &lt;code&gt;em&lt;/code&gt; en los umbrales para que respeten el zoom y la configuración del usuario.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;media&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;(&lt;/span&gt;&lt;span style="color:#e06c75"&gt;min-width&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;35em&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;)&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#e5c07b"&gt;titulo&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;2.25&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;rem&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puedes combinar condiciones con lógica:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;/* AND: ambas condiciones */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;media&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;(&lt;/span&gt;&lt;span style="color:#e06c75"&gt;min-width&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;20em&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;)&lt;/span&gt; &lt;span style="color:#e06c75"&gt;and&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;(&lt;/span&gt;&lt;span style="color:#e06c75"&gt;max-width&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;35em&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;)&lt;/span&gt; { &lt;span style="color:#7f848e"&gt;/* ... */&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;/* OR: cualquiera de las dos */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;media&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;(&lt;/span&gt;&lt;span style="color:#e06c75"&gt;max-width&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;20em&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;),&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;(&lt;/span&gt;&lt;span style="color:#e06c75"&gt;min-width&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;35em&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;)&lt;/span&gt; { &lt;span style="color:#7f848e"&gt;/* ... */&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Entre las características consultables están &lt;code&gt;min-width&lt;/code&gt;, &lt;code&gt;max-width&lt;/code&gt;, &lt;code&gt;min-height&lt;/code&gt;, &lt;code&gt;orientation: landscape | portrait&lt;/code&gt; y &lt;code&gt;min-resolution: 2dppx&lt;/code&gt; (para pantallas retina). El catálogo completo está en la &lt;a href="https://developer.mozilla.org/es/docs/Web/CSS/@media"




 target="_blank"
 


&gt;documentación de &lt;code&gt;@media&lt;/code&gt; en MDN&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="breakpoints-con-mobile-first"&gt;Breakpoints con mobile first&lt;/h3&gt;
&lt;p&gt;Los &lt;strong&gt;breakpoints&lt;/strong&gt; son los puntos donde el diseño cambia de un tamaño a otro. Con el enfoque mobile first, los estilos base sirven al móvil y cada media query añade ajustes para pantallas mayores:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;titulo&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;rem&lt;/span&gt;; } &lt;span style="color:#7f848e"&gt;/* móvil (base) */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;media&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;(&lt;/span&gt;&lt;span style="color:#e06c75"&gt;min-width&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;35em&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;)&lt;/span&gt; { &lt;span style="color:#7f848e"&gt;/* tablet */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#e5c07b"&gt;titulo&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;2&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;rem&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;media&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;(&lt;/span&gt;&lt;span style="color:#e06c75"&gt;min-width&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;50em&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;)&lt;/span&gt; { &lt;span style="color:#7f848e"&gt;/* escritorio */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#e5c07b"&gt;titulo&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;2.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;rem&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;style&gt;
 .csresp { font-size:1.5rem;font-weight:bold;color:#16828d;margin:0; }
 @media (min-width:35em) { .csresp { font-size:2rem; } }
 @media (min-width:50em) { .csresp { font-size:2.5rem; } }
 &lt;/style&gt;
 &lt;p class="csresp"&gt;Este título cambia de tamaño según el ancho&lt;/p&gt;
 &lt;small style="color:#555;"&gt;Redimensiona la ventana para cruzar los breakpoints de 35em y 50em.&lt;/small&gt;
&lt;/div&gt;
&lt;h3 id="estilos-para-impresión"&gt;Estilos para impresión&lt;/h3&gt;
&lt;p&gt;Las media queries también cubren el medio de impresión. &lt;code&gt;@media print&lt;/code&gt; aplica reglas cuando el usuario imprime o exporta a PDF:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;media&lt;/span&gt; &lt;span style="color:#e06c75"&gt;print&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;*&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;black&lt;/span&gt; &lt;span style="color:#7f848e"&gt;!important&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;background&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;none&lt;/span&gt; &lt;span style="color:#7f848e"&gt;!important&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;El posicionamiento te da control fino sobre dónde vive cada elemento: &lt;code&gt;fixed&lt;/code&gt; para modales, &lt;code&gt;absolute&lt;/code&gt; para tooltips y menús, &lt;code&gt;relative&lt;/code&gt; como ancla, y &lt;code&gt;sticky&lt;/code&gt; para elementos que acompañan el scroll. Sumado a un manejo consciente de los contextos de apilamiento y a media queries con enfoque mobile first, tienes las piezas para construir interfaces dinámicas y adaptables.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;🚀 La próxima entrega explora los &lt;strong&gt;fondos y las sombras&lt;/strong&gt;: gradientes, modos de mezcla y las propiedades &lt;code&gt;box-shadow&lt;/code&gt; y &lt;code&gt;text-shadow&lt;/code&gt; para dar profundidad a tus componentes.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
</content:encoded></item><item><title>Estilos CSS: Layouts con Float, Flexbox y Grid</title><link>https://blog.dacadev.com/programacion/estilos-css/layouts-flexbox-grid/</link><pubDate>Mon, 08 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/estilos-css/layouts-flexbox-grid/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Aprende a maquetar con CSS: el legado de float y clearfix, el modelo flexible de Flexbox y el sistema bidimensional de CSS Grid, con demostraciones renderizadas.</description><media:content url="https://blog.dacadev.com/images/programming/html-and-css/css/04-layouts-flexbox-grid-banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#float-el-origen-y-el-clearfix"&gt;Float: el origen y el clearfix&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#flexbox-layout-en-una-dimensión"&gt;Flexbox: layout en una dimensión&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#alinear-ítems-con-justify-content-y-align-items"&gt;Alinear ítems con justify-content y align-items&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#controlar-el-tamaño-flex-grow-flex-shrink-y-flex-basis"&gt;Controlar el tamaño: flex-grow, flex-shrink y flex-basis&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#dirección-y-envoltura"&gt;Dirección y envoltura&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#propiedades-del-ítem"&gt;Propiedades del ítem&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#css-grid-layout-en-dos-dimensiones"&gt;CSS Grid: layout en dos dimensiones&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#una-rejilla-básica"&gt;Una rejilla básica&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#posicionar-ítems-por-líneas"&gt;Posicionar ítems por líneas&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#áreas-con-nombre"&gt;Áreas con nombre&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#rejilla-implícita-y-galerías-responsivas"&gt;Rejilla implícita y galerías responsivas&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#flexbox-y-grid-complementarios-no-rivales"&gt;Flexbox y Grid: complementarios, no rivales&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#conclusión"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;Maquetar es componer la estructura visual de una página: columnas, rejillas, barras laterales, galerías. Durante años se hizo con herramientas que no se diseñaron para ello —&lt;code&gt;float&lt;/code&gt; nació para envolver texto alrededor de imágenes— hasta que llegaron &lt;strong&gt;Flexbox&lt;/strong&gt; y &lt;strong&gt;CSS Grid&lt;/strong&gt;, dos sistemas pensados específicamente para layout. Conocer los tres te permite entender el código heredado y elegir la herramienta correcta para cada problema.&lt;/p&gt;
&lt;p&gt;Esta es la cuarta entrega de la serie &lt;strong&gt;Estilos CSS&lt;/strong&gt;. Recorreremos &lt;code&gt;float&lt;/code&gt; y la técnica &lt;code&gt;clearfix&lt;/code&gt;, el modelo unidimensional de Flexbox y el sistema bidimensional de Grid, con ejemplos que puedes ver renderizados.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Aprenderás cuándo sigue siendo útil &lt;code&gt;float&lt;/code&gt;, cómo controlar el tamaño de los ítems con &lt;code&gt;flex&lt;/code&gt;, y cómo posicionar elementos en una rejilla con &lt;code&gt;grid-template&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="float-el-origen-y-el-clearfix"&gt;Float: el origen y el clearfix&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;float&lt;/code&gt; extrae un elemento del flujo normal y lo desplaza hacia un lado de su contenedor; el contenido adyacente fluye a su alrededor. Ese fue su propósito original: envolver texto alrededor de una imagen.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;imagen&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;float&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;left&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;margin-right&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem 1.25rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="float:left;width:90px;height:90px;background:#2a9da9;color:#fff;display:flex;align-items:center;justify-content:center;border-radius:.4em;margin:0 1em .5em 0;"&gt;float&lt;/div&gt;
 &lt;p style="margin:0;"&gt;Este párrafo fluye alrededor del bloque flotado. El texto se ajusta al margen del elemento extraído del flujo, exactamente el caso de uso para el que &lt;code&gt;float&lt;/code&gt; fue concebido: envolver contenido alrededor de una figura.&lt;/p&gt;
 &lt;div style="clear:both;"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Cuando usas &lt;code&gt;float&lt;/code&gt;, necesitas &lt;strong&gt;limpiar&lt;/strong&gt; el flujo para que el contenedor vuelva a comportarse con normalidad. El patrón estándar es el &lt;strong&gt;clearfix&lt;/strong&gt;, implementado con un pseudo-elemento:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;clearfix&lt;/span&gt;::&lt;span style="color:#61afef"&gt;before&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;clearfix&lt;/span&gt;::&lt;span style="color:#61afef"&gt;after&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;display&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;table&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;content&lt;/span&gt;: &lt;span style="color:#98c379"&gt;&amp;#34; &amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;clearfix&lt;/span&gt;::&lt;span style="color:#61afef"&gt;after&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;clear&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;both&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Para layouts modernos, &lt;code&gt;float&lt;/code&gt; casi siempre se reemplaza por Flexbox o Grid. Resérvalo para su propósito original: envolver texto alrededor de un elemento.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="flexbox-layout-en-una-dimensión"&gt;Flexbox: layout en una dimensión&lt;/h2&gt;
&lt;p&gt;Al aplicar &lt;code&gt;display: flex&lt;/code&gt; a un contenedor, este se convierte en un &lt;strong&gt;flex container&lt;/strong&gt; y sus hijos en &lt;strong&gt;flex items&lt;/strong&gt;. Flexbox organiza los ítems a lo largo de un eje principal y los alinea en el eje transversal, ajustando tamaños de forma flexible.&lt;/p&gt;
&lt;p&gt;Un contenedor flex tiene dos ejes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Eje principal (main)&lt;/strong&gt; — la dirección en la que se colocan los ítems (horizontal por defecto).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Eje transversal (cross)&lt;/strong&gt; — perpendicular al principal.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="alinear-ítems-con-justify-content-y-align-items"&gt;Alinear ítems con justify-content y align-items&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;justify-content&lt;/code&gt; controla la distribución a lo largo del &lt;strong&gt;eje principal&lt;/strong&gt;: &lt;code&gt;flex-start&lt;/code&gt;, &lt;code&gt;flex-end&lt;/code&gt;, &lt;code&gt;center&lt;/code&gt;, &lt;code&gt;space-between&lt;/code&gt;, &lt;code&gt;space-around&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;align-items&lt;/code&gt; controla la alineación en el &lt;strong&gt;eje transversal&lt;/strong&gt;: &lt;code&gt;stretch&lt;/code&gt; (por defecto), &lt;code&gt;flex-start&lt;/code&gt;, &lt;code&gt;flex-end&lt;/code&gt;, &lt;code&gt;center&lt;/code&gt;, &lt;code&gt;baseline&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;barra&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;display&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;flex&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;justify-content&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;space-between&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;align-items&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;center&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="display:flex;justify-content:space-between;align-items:center;background:#eaf2f8;padding:.75rem;border-radius:.4em;"&gt;
 &lt;span style="background:#2a9da9;color:#fff;padding:.5em 1em;border-radius:.3em;"&gt;Logo&lt;/span&gt;
 &lt;span style="background:#2a9da9;color:#fff;padding:.5em 1em;border-radius:.3em;"&gt;Menú&lt;/span&gt;
 &lt;span style="background:#2a9da9;color:#fff;padding:.5em 1em;border-radius:.3em;"&gt;Perfil&lt;/span&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="controlar-el-tamaño-flex-grow-flex-shrink-y-flex-basis"&gt;Controlar el tamaño: flex-grow, flex-shrink y flex-basis&lt;/h3&gt;
&lt;p&gt;La propiedad abreviada &lt;code&gt;flex&lt;/code&gt; agrupa tres propiedades que gobiernan el tamaño de cada ítem:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;flex-basis&lt;/code&gt;&lt;/strong&gt; — el tamaño base (de partida) del ítem antes de crecer o encoger. Su valor inicial es &lt;code&gt;auto&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;flex-grow&lt;/code&gt;&lt;/strong&gt; — el factor de crecimiento para repartir el espacio sobrante. &lt;code&gt;0&lt;/code&gt; no crece.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;flex-shrink&lt;/code&gt;&lt;/strong&gt; — el factor de encogimiento cuando falta espacio.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;col-a&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;flex&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;; } &lt;span style="color:#7f848e"&gt;/* crece para ocupar el espacio sobrante */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;col-b&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;flex&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;2&lt;/span&gt;; } &lt;span style="color:#7f848e"&gt;/* crece al doble que col-a */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="display:flex;gap:.5rem;"&gt;
 &lt;div style="flex:1;background:#2a9da9;color:#fff;padding:1em;border-radius:.4em;text-align:center;"&gt;flex: 1&lt;/div&gt;
 &lt;div style="flex:2;background:#16828d;color:#fff;padding:1em;border-radius:.4em;text-align:center;"&gt;flex: 2 (el doble de ancho)&lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="dirección-y-envoltura"&gt;Dirección y envoltura&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;flex-direction&lt;/code&gt; cambia el eje principal: &lt;code&gt;row&lt;/code&gt; (por defecto), &lt;code&gt;row-reverse&lt;/code&gt;, &lt;code&gt;column&lt;/code&gt;, &lt;code&gt;column-reverse&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;flex-wrap&lt;/code&gt; permite que los ítems salten a una nueva línea cuando no caben: &lt;code&gt;nowrap&lt;/code&gt; (por defecto), &lt;code&gt;wrap&lt;/code&gt;, &lt;code&gt;wrap-reverse&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;flex-flow&lt;/code&gt; es la abreviatura de ambas: &lt;code&gt;flex-flow: row wrap&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="propiedades-del-ítem"&gt;Propiedades del ítem&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;align-self&lt;/code&gt; — sobrescribe &lt;code&gt;align-items&lt;/code&gt; para un ítem concreto.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;order&lt;/code&gt; — reordena los ítems sin tocar el HTML; el valor inicial es &lt;code&gt;0&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




 
 





 


&lt;div class="notice info"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Info&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Flexbox crea automáticamente columnas de igual altura y es la herramienta ideal para centrar un elemento. Para un catálogo de bugs conocidos y sus soluciones, consulta &lt;a href="https://github.com/philipwalton/flexbugs"




 target="_blank"
 


&gt;flexbugs&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="css-grid-layout-en-dos-dimensiones"&gt;CSS Grid: layout en dos dimensiones&lt;/h2&gt;
&lt;p&gt;Mientras Flexbox trabaja en un solo eje, &lt;strong&gt;CSS Grid&lt;/strong&gt; organiza el contenido en &lt;strong&gt;filas y columnas&lt;/strong&gt; simultáneamente. Antes de usarlo conviene fijar su vocabulario:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Grid line&lt;/strong&gt; — las líneas que forman la estructura de la rejilla.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grid track&lt;/strong&gt; — el espacio entre dos líneas adyacentes (una fila o una columna).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grid cell&lt;/strong&gt; — la intersección de una fila y una columna.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grid area&lt;/strong&gt; — un rectángulo formado por una o más celdas.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="una-rejilla-básica"&gt;Una rejilla básica&lt;/h3&gt;
&lt;p&gt;Se activa con &lt;code&gt;display: grid&lt;/code&gt; y se definen las pistas con &lt;code&gt;grid-template-columns&lt;/code&gt; y &lt;code&gt;grid-template-rows&lt;/code&gt;. La unidad &lt;code&gt;fr&lt;/code&gt; representa una fracción del espacio disponible.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;grid&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;display&lt;/span&gt;: &lt;span style="color:#c678dd"&gt;grid&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;grid-template-columns&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e06c75"&gt;fr&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e06c75"&gt;fr&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e06c75"&gt;fr&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;gap&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:.5em;"&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.5em;border-radius:.4em;text-align:center;"&gt;a&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.5em;border-radius:.4em;text-align:center;"&gt;b&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.5em;border-radius:.4em;text-align:center;"&gt;c&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.5em;border-radius:.4em;text-align:center;"&gt;d&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.5em;border-radius:.4em;text-align:center;"&gt;e&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.5em;border-radius:.4em;text-align:center;"&gt;f&lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;La función &lt;code&gt;repeat()&lt;/code&gt; evita la repetición: &lt;code&gt;grid-template-columns: repeat(3, 1fr)&lt;/code&gt; equivale a &lt;code&gt;1fr 1fr 1fr&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="posicionar-ítems-por-líneas"&gt;Posicionar ítems por líneas&lt;/h3&gt;
&lt;p&gt;Cada línea de la rejilla tiene un número. Con &lt;code&gt;grid-column&lt;/code&gt; y &lt;code&gt;grid-row&lt;/code&gt; indicas dónde empieza y termina un ítem usando la sintaxis &lt;code&gt;inicio / fin&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;destacado&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;grid-column&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;/&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt;; &lt;span style="color:#7f848e"&gt;/* abarca de la línea 1 a la 3 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;grid-row&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;span&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2&lt;/span&gt;; &lt;span style="color:#7f848e"&gt;/* abarca dos pistas verticales */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="display:grid;grid-template-columns:repeat(3,1fr);grid-auto-rows:60px;gap:.5em;"&gt;
 &lt;div style="grid-column:1 / 3;background:#f39c12;color:#fff;display:flex;align-items:center;justify-content:center;border-radius:.4em;"&gt;grid-column: 1 / 3&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;display:flex;align-items:center;justify-content:center;border-radius:.4em;"&gt;b&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;display:flex;align-items:center;justify-content:center;border-radius:.4em;"&gt;c&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;display:flex;align-items:center;justify-content:center;border-radius:.4em;"&gt;d&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;display:flex;align-items:center;justify-content:center;border-radius:.4em;"&gt;e&lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="áreas-con-nombre"&gt;Áreas con nombre&lt;/h3&gt;
&lt;p&gt;La forma más legible de componer un layout es nombrar las áreas con &lt;code&gt;grid-template-areas&lt;/code&gt; y asignar cada elemento con &lt;code&gt;grid-area&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;contenedor&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;display&lt;/span&gt;: &lt;span style="color:#c678dd"&gt;grid&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;grid-template-areas&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;titulo titulo&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;nav nav&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;main aside&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;grid-template-columns&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;2&lt;/span&gt;&lt;span style="color:#e06c75"&gt;fr&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e06c75"&gt;fr&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;gap&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;header&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;grid-area&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;titulo&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;nav&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;grid-area&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;nav&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;main&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;grid-area&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;main&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;aside&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;grid-area&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;aside&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="display:grid;grid-template-areas:'titulo titulo' 'nav nav' 'main aside';grid-template-columns:2fr 1fr;gap:.5em;"&gt;
 &lt;div style="grid-area:titulo;background:#16828d;color:#fff;padding:.8em;border-radius:.4em;text-align:center;"&gt;titulo&lt;/div&gt;
 &lt;div style="grid-area:nav;background:#1f6f78;color:#fff;padding:.8em;border-radius:.4em;text-align:center;"&gt;nav&lt;/div&gt;
 &lt;div style="grid-area:main;background:#2a9da9;color:#fff;padding:1.5em;border-radius:.4em;text-align:center;"&gt;main&lt;/div&gt;
 &lt;div style="grid-area:aside;background:#f39c12;color:#fff;padding:1.5em;border-radius:.4em;text-align:center;"&gt;aside&lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="rejilla-implícita-y-galerías-responsivas"&gt;Rejilla implícita y galerías responsivas&lt;/h3&gt;
&lt;p&gt;Cuando no conoces de antemano la cantidad de ítems —por ejemplo, datos que vienen de una API— la &lt;strong&gt;rejilla implícita&lt;/strong&gt; crece automáticamente para acomodarlos. La combinación de &lt;code&gt;auto-fill&lt;/code&gt; con &lt;code&gt;minmax()&lt;/code&gt; produce galerías que se adaptan al ancho disponible sin media queries:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;galeria&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;display&lt;/span&gt;: &lt;span style="color:#c678dd"&gt;grid&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;grid-template-columns&lt;/span&gt;: &lt;span style="color:#61afef;font-weight:bold"&gt;repeat&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;auto&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;fill&lt;/span&gt;, &lt;span style="color:#61afef;font-weight:bold"&gt;minmax&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;180&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e06c75"&gt;fr&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;gap&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:.5em;"&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.2em;border-radius:.4em;text-align:center;"&gt;1&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.2em;border-radius:.4em;text-align:center;"&gt;2&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.2em;border-radius:.4em;text-align:center;"&gt;3&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.2em;border-radius:.4em;text-align:center;"&gt;4&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.2em;border-radius:.4em;text-align:center;"&gt;5&lt;/div&gt;
 &lt;/div&gt;
 &lt;small style="display:block;margin-top:.5rem;color:#555;"&gt;Redimensiona la ventana: las columnas se reorganizan solas.&lt;/small&gt;
&lt;/div&gt;




 
 





 


&lt;div class="notice warning"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Warning&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Con Grid solo puedes formar rectángulos. No se pueden crear formas en L o U directamente; se simulan dejando celdas vacías (con &lt;code&gt;.&lt;/code&gt; en &lt;code&gt;grid-template-areas&lt;/code&gt;) o combinando áreas.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="flexbox-y-grid-complementarios-no-rivales"&gt;Flexbox y Grid: complementarios, no rivales&lt;/h2&gt;
&lt;p&gt;No tienes que elegir uno. La combinación más potente es usar &lt;strong&gt;Grid&lt;/strong&gt; para la estructura macro de la página (cabecera, contenido, barra lateral, pie) y &lt;strong&gt;Flexbox&lt;/strong&gt; para alinear el contenido dentro de cada zona (una barra de navegación, una tarjeta, un grupo de botones).&lt;/p&gt;
&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;float&lt;/code&gt; resuelve el envolvimiento de texto; Flexbox domina el layout en una dimensión y el centrado; Grid organiza estructuras bidimensionales complejas. Elegir la herramienta adecuada para cada problema —y combinarlas— es lo que distingue una maquetación robusta de una llena de parches.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;🚀 En la próxima entrega abordamos el &lt;strong&gt;posicionamiento&lt;/strong&gt; (&lt;code&gt;relative&lt;/code&gt;, &lt;code&gt;absolute&lt;/code&gt;, &lt;code&gt;fixed&lt;/code&gt;, &lt;code&gt;sticky&lt;/code&gt;), los contextos de apilamiento con &lt;code&gt;z-index&lt;/code&gt; y el diseño &lt;strong&gt;responsive&lt;/strong&gt; con media queries.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
</content:encoded></item><item><title>SQL: Filtrado de Datos con la Cláusula WHERE</title><link>https://blog.dacadev.com/programacion/sql/02-filtrado-datos-clausula-where/</link><pubDate>Mon, 08 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/sql/02-filtrado-datos-clausula-where/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Aprende filtrado de datos con WHERE en SQL usando operadores, BETWEEN, IN, LIKE, expresiones regulares y NULL.</description><media:content url="https://blog.dacadev.com/images/programming/sql/filtering/banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#la-cláusula-where-y-las-condiciones-booleanas"&gt;La cláusula WHERE y las condiciones booleanas&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#condiciones-de-igualdad"&gt;Condiciones de igualdad&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#condiciones-de-desigualdad"&gt;Condiciones de desigualdad&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#modificación-de-datos-con-condiciones-de-igualdad"&gt;Modificación de datos con condiciones de igualdad&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#condiciones-de-rango"&gt;Condiciones de rango&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#usando-between"&gt;Usando BETWEEN&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#condiciones-de-pertenencia-con-in"&gt;Condiciones de pertenencia con IN&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#subconsultas-dentro-de-in"&gt;Subconsultas dentro de IN&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#condiciones-de-coincidencia-con-like"&gt;Condiciones de coincidencia con LIKE&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#expresiones-regulares"&gt;Expresiones regulares&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#filtrado-de-valores-null"&gt;Filtrado de valores NULL&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#cierre"&gt;Cierre&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;El &lt;strong&gt;filtrado de datos en SQL&lt;/strong&gt; es una operación diaria cuando trabajas con bases relacionales: rara vez necesitas todas las filas de una tabla. La &lt;strong&gt;cláusula WHERE&lt;/strong&gt; expresa condiciones precisas para reducir resultados, evitar lecturas innecesarias y alinear la consulta con la lógica de negocio. Este es el artículo #2 de la serie SQL; si necesitas repasar &lt;code&gt;SELECT&lt;/code&gt;, &lt;code&gt;FROM&lt;/code&gt; y el modelo general de consulta, revisa &lt;a href="https://blog.dacadev.com/programacion/sql/01-fundamentos-sql-select-from-where"



 


&gt;Fundamentos de SQL&lt;/a&gt;.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Aprenderás a usar &lt;code&gt;WHERE&lt;/code&gt; con igualdad, desigualdad, rangos, &lt;code&gt;BETWEEN&lt;/code&gt;, &lt;code&gt;IN&lt;/code&gt;, subconsultas, &lt;code&gt;LIKE&lt;/code&gt;, expresiones regulares y &lt;code&gt;NULL&lt;/code&gt;, tanto en lectura como en modificación.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="la-cláusula-where-y-las-condiciones-booleanas"&gt;La cláusula WHERE y las condiciones booleanas&lt;/h2&gt;
&lt;p&gt;La cláusula &lt;code&gt;WHERE&lt;/code&gt; filtra filas evaluando una o más condiciones. Cada condición produce un resultado lógico que el motor de base de datos usa para decidir si una fila entra o no en el resultado final.&lt;/p&gt;
&lt;p&gt;En la práctica, esas condiciones suelen combinar varios tipos de operadores:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Operadores de comparación&lt;/strong&gt;: &lt;code&gt;=&lt;/code&gt;, &lt;code&gt;!=&lt;/code&gt;, &lt;code&gt;&amp;lt;&lt;/code&gt;, &lt;code&gt;&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;&amp;gt;&lt;/code&gt;, &lt;code&gt;LIKE&lt;/code&gt;, &lt;code&gt;IN&lt;/code&gt;, &lt;code&gt;BETWEEN&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operadores aritméticos&lt;/strong&gt;: &lt;code&gt;+&lt;/code&gt;, &lt;code&gt;-&lt;/code&gt;, &lt;code&gt;*&lt;/code&gt;, &lt;code&gt;/&lt;/code&gt;, cuando necesitas comparar expresiones calculadas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operadores lógicos&lt;/strong&gt;: &lt;code&gt;AND&lt;/code&gt;, &lt;code&gt;OR&lt;/code&gt;, &lt;code&gt;NOT&lt;/code&gt;, para componer filtros más específicos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Aunque &lt;code&gt;WHERE&lt;/code&gt; es el punto central para filtrar filas, también existe &lt;code&gt;HAVING&lt;/code&gt;, que se utiliza después de agrupar datos con &lt;code&gt;GROUP BY&lt;/code&gt;. La diferencia es importante: &lt;code&gt;WHERE&lt;/code&gt; filtra filas antes de la agregación; &lt;code&gt;HAVING&lt;/code&gt; filtra grupos después de calcular agregados.&lt;/p&gt;
&lt;h2 id="condiciones-de-igualdad"&gt;Condiciones de igualdad&lt;/h2&gt;
&lt;p&gt;La condición de igualdad compara una columna contra una expresión. Esa expresión puede ser un literal, un número, una fecha o incluso el resultado de una subconsulta.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;title&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;RIVER OUTLAW&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;fed_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;111-11-1111&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;amount&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;375&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;25&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; (&lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film_id&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;title&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;RIVER OUTLAW&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Observemos un caso concreto usando la base de datos de ejemplo Sakila. La consulta obtiene los correos de clientes que rentaron películas el &lt;code&gt;2005-06-14&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;email&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;INNER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental&lt;/span&gt; &lt;span style="color:#e06c75"&gt;r&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;r&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;date&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;r&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;rental_date&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;2005-06-14&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;email&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CATHERINE&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;CAMPBELL&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;@&lt;/span&gt;&lt;span style="color:#e06c75"&gt;sakilacustomer&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;org&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JOYCE&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;EDWARDS&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;@&lt;/span&gt;&lt;span style="color:#e06c75"&gt;sakilacustomer&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;org&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;TERRENCE&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;GUNDERSON&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;@&lt;/span&gt;&lt;span style="color:#e06c75"&gt;sakilacustomer&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;org&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;16&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;03&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Aquí &lt;code&gt;date(r.rental_date)&lt;/code&gt; transforma el &lt;code&gt;DATETIME&lt;/code&gt; a fecha antes de comparar. En producción, aplicar funciones sobre columnas puede limitar el uso eficiente de índices.&lt;/p&gt;
&lt;h2 id="condiciones-de-desigualdad"&gt;Condiciones de desigualdad&lt;/h2&gt;
&lt;p&gt;La desigualdad expresa el caso contrario: queremos excluir filas que coinciden con un valor. En SQL puedes escribirla con &lt;code&gt;&amp;lt;&amp;gt;&lt;/code&gt;, &lt;code&gt;!=&lt;/code&gt; o usando &lt;code&gt;NOT&lt;/code&gt; según el motor y el estilo del equipo.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;email&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;INNER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental&lt;/span&gt; &lt;span style="color:#e06c75"&gt;r&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;r&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;date&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;r&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;rental_date&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;2005-06-14&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-----------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;email&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-----------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;AUSTIN&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;CINTRON&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;@&lt;/span&gt;&lt;span style="color:#e06c75"&gt;sakilacustomer&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;org&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;AUSTIN&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;CINTRON&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;@&lt;/span&gt;&lt;span style="color:#e06c75"&gt;sakilacustomer&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;org&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;AUSTIN&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;CINTRON&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;@&lt;/span&gt;&lt;span style="color:#e06c75"&gt;sakilacustomer&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;org&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;AUSTIN&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;CINTRON&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;@&lt;/span&gt;&lt;span style="color:#e06c75"&gt;sakilacustomer&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;org&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-----------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;16028&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;03&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La diferencia semántica es directa: en lugar de seleccionar rentas del día indicado, excluimos ese día.&lt;/p&gt;
&lt;h2 id="modificación-de-datos-con-condiciones-de-igualdad"&gt;Modificación de datos con condiciones de igualdad&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;WHERE&lt;/code&gt; no solo aparece en &lt;code&gt;SELECT&lt;/code&gt;. También es crítico en &lt;code&gt;UPDATE&lt;/code&gt; y &lt;code&gt;DELETE&lt;/code&gt;, donde define exactamente qué filas serán modificadas o eliminadas.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;DELETE&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#c678dd"&gt;year&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;rental_date&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2004&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;DELETE&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#c678dd"&gt;year&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;rental_date&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2005&lt;/span&gt; &lt;span style="color:#c678dd"&gt;AND&lt;/span&gt; &lt;span style="color:#c678dd"&gt;year&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;rental_date&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2006&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El primer caso elimina rentas del año 2004; el segundo elimina rentas que no pertenecen ni a 2005 ni a 2006.&lt;/p&gt;




 
 





 


&lt;div class="notice warning"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Warning&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Antes de ejecutar un &lt;code&gt;DELETE&lt;/code&gt; o &lt;code&gt;UPDATE&lt;/code&gt; con &lt;code&gt;WHERE&lt;/code&gt;, valida la condición con un &lt;code&gt;SELECT&lt;/code&gt; equivalente. Un filtro demasiado amplio puede modificar más filas de las esperadas.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="condiciones-de-rango"&gt;Condiciones de rango&lt;/h2&gt;
&lt;p&gt;Para filtrar rangos puedes combinar operadores como &lt;code&gt;&amp;lt;&lt;/code&gt;, &lt;code&gt;&amp;lt;=&lt;/code&gt;, &lt;code&gt;&amp;gt;&lt;/code&gt; y &lt;code&gt;&amp;gt;=&lt;/code&gt; con &lt;code&gt;AND&lt;/code&gt; u &lt;code&gt;OR&lt;/code&gt;. Esto funciona con fechas, números y otros tipos comparables.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;rental_date&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental_date&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;2005-05-25&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+---------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental_date&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+---------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;130&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2005&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;05&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;24&lt;/span&gt; &lt;span style="color:#d19a66"&gt;22&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;53&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;30&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;459&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2005&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;05&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;24&lt;/span&gt; &lt;span style="color:#d19a66"&gt;22&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;54&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;33&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;239&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2005&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;05&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;24&lt;/span&gt; &lt;span style="color:#d19a66"&gt;23&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;31&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;46&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+---------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;8&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;00&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;rental_date&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental_date&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;&amp;lt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;2005-06-16&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;AND&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental_date&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;&amp;gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;2005-06-14&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+---------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental_date&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+---------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;416&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2005&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;06&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;14&lt;/span&gt; &lt;span style="color:#d19a66"&gt;22&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;53&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;33&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;516&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2005&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;06&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;14&lt;/span&gt; &lt;span style="color:#d19a66"&gt;22&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;55&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;13&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;148&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2005&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;06&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;15&lt;/span&gt; &lt;span style="color:#d19a66"&gt;23&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;20&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;26&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;237&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2005&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;06&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;15&lt;/span&gt; &lt;span style="color:#d19a66"&gt;23&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;36&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;37&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;155&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2005&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;06&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;15&lt;/span&gt; &lt;span style="color:#d19a66"&gt;23&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;55&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;27&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;341&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2005&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;06&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;15&lt;/span&gt; &lt;span style="color:#d19a66"&gt;23&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;57&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;20&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;149&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2005&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;06&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;15&lt;/span&gt; &lt;span style="color:#d19a66"&gt;23&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;58&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;53&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+---------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;364&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;00&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="usando-between"&gt;Usando BETWEEN&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;BETWEEN&lt;/code&gt; permite expresar un rango con una sintaxis más compacta. El valor menor va a la izquierda, el mayor a la derecha, y ambos límites son inclusivos.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;rental_date&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental_date&lt;/span&gt; &lt;span style="color:#c678dd"&gt;BETWEEN&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;2005-06-14&amp;#39;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;AND&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;2005-06-16&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+---------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental_date&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+---------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;416&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2005&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;06&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;14&lt;/span&gt; &lt;span style="color:#d19a66"&gt;22&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;53&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;33&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;516&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2005&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;06&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;14&lt;/span&gt; &lt;span style="color:#d19a66"&gt;22&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;55&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;13&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;148&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2005&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;06&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;15&lt;/span&gt; &lt;span style="color:#d19a66"&gt;23&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;20&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;26&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;237&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2005&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;06&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;15&lt;/span&gt; &lt;span style="color:#d19a66"&gt;23&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;36&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;37&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;155&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2005&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;06&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;15&lt;/span&gt; &lt;span style="color:#d19a66"&gt;23&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;55&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;27&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;341&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2005&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;06&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;15&lt;/span&gt; &lt;span style="color:#d19a66"&gt;23&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;57&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;20&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;149&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2005&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;06&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;15&lt;/span&gt; &lt;span style="color:#d19a66"&gt;23&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;58&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;53&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+---------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;364&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;00&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;&lt;code&gt;BETWEEN&lt;/code&gt; puede usarse con fechas, horas, números y &lt;code&gt;strings&lt;/code&gt;. Recuerda que los límites son inclusivos, así que valida cuidadosamente rangos de tiempo cuando trabajes con columnas &lt;code&gt;DATETIME&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="condiciones-de-pertenencia-con-in"&gt;Condiciones de pertenencia con IN&lt;/h2&gt;
&lt;p&gt;Las condiciones de pertenencia permiten verificar si un valor existe dentro de una lista. Primero, analicemos la versión con &lt;code&gt;OR&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;title&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;rating&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rating&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;G&amp;#39;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;OR&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rating&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;PG&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------------------------+--------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;title&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rating&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------------------------+--------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ACADEMY&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DINOSAUR&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PG&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ACE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;GOLDFINGER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;G&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;WEDDING&lt;/span&gt; &lt;span style="color:#e06c75"&gt;APOLLO&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PG&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;WEREWOLF&lt;/span&gt; &lt;span style="color:#e06c75"&gt;LOLA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;G&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;WEST&lt;/span&gt; &lt;span style="color:#e06c75"&gt;LION&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;G&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;YOUNG&lt;/span&gt; &lt;span style="color:#c678dd"&gt;LANGUAGE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;G&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------------------------+--------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;372&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;00&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La misma condición puede escribirse de forma más clara con &lt;code&gt;IN&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;title&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;rating&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rating&lt;/span&gt; &lt;span style="color:#c678dd"&gt;IN&lt;/span&gt; (&lt;span style="color:#98c379"&gt;&amp;#39;G&amp;#39;&lt;/span&gt;,&lt;span style="color:#98c379"&gt;&amp;#39;PG&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;También puedes combinar pertenencia y negación usando &lt;code&gt;NOT IN&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;title&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;rating&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rating&lt;/span&gt; &lt;span style="color:#c678dd"&gt;NOT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;IN&lt;/span&gt; (&lt;span style="color:#98c379"&gt;&amp;#39;PG-13&amp;#39;&lt;/span&gt;,&lt;span style="color:#98c379"&gt;&amp;#39;R&amp;#39;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#39;NC-17&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;IN&lt;/code&gt; mejora la legibilidad cuando comparas una columna contra múltiples valores discretos y evita repetir la misma columna.&lt;/p&gt;
&lt;h2 id="subconsultas-dentro-de-in"&gt;Subconsultas dentro de IN&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;IN&lt;/code&gt; no está limitado a listas escritas manualmente. También puedes usar una subconsulta para calcular dinámicamente los valores válidos de comparación.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;title&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;rating&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rating&lt;/span&gt; &lt;span style="color:#c678dd"&gt;IN&lt;/span&gt; (&lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rating&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;title&lt;/span&gt; &lt;span style="color:#c678dd"&gt;LIKE&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;%PET%&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------------------------+--------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;title&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rating&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------------------------+--------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ACADEMY&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DINOSAUR&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PG&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ACE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;GOLDFINGER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;G&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;WEDDING&lt;/span&gt; &lt;span style="color:#e06c75"&gt;APOLLO&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PG&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;WEREWOLF&lt;/span&gt; &lt;span style="color:#e06c75"&gt;LOLA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;G&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;WEST&lt;/span&gt; &lt;span style="color:#e06c75"&gt;LION&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;G&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;YOUNG&lt;/span&gt; &lt;span style="color:#c678dd"&gt;LANGUAGE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;G&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------------------------+--------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;372&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;00&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La subconsulta obtiene los &lt;code&gt;rating&lt;/code&gt; de películas cuyo título contiene &lt;code&gt;PET&lt;/code&gt;; la consulta externa recupera las películas con esos ratings.&lt;/p&gt;
&lt;h2 id="condiciones-de-coincidencia-con-like"&gt;Condiciones de coincidencia con LIKE&lt;/h2&gt;
&lt;p&gt;Las condiciones de coincidencia permiten buscar patrones de texto en lugar de valores exactos. Con &lt;code&gt;LIKE&lt;/code&gt;, SQL ofrece dos comodines principales:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Comodín&lt;/th&gt;
 &lt;th&gt;Significado&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;_&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Exactamente un carácter&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;%&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Cualquier cantidad de caracteres, incluyendo cero&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Consideremos este patrón: &lt;code&gt;_A_T%S&lt;/code&gt;. Significa: un carácter cualquiera, luego &lt;code&gt;A&lt;/code&gt;, luego un carácter cualquiera, luego &lt;code&gt;T&lt;/code&gt;, luego cualquier secuencia, y finalmente &lt;code&gt;S&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#c678dd"&gt;LIKE&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;_A_T%S&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-----------+------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-----------+------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;MATTHEWS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ERICA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;WALTERS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CASSANDRA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;WATTS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SHELLY&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-----------+------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;3&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;00&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;LIKE&lt;/code&gt; es útil para búsquedas simples. Un patrón que inicia con &lt;code&gt;%&lt;/code&gt;, como &lt;code&gt;'%PET%'&lt;/code&gt;, suele ser más costoso porque limita el uso de índices tradicionales.&lt;/p&gt;
&lt;h2 id="expresiones-regulares"&gt;Expresiones regulares&lt;/h2&gt;
&lt;p&gt;Algunos motores permiten filtrar texto con expresiones regulares. En MySQL, por ejemplo, se usa &lt;code&gt;REGEXP&lt;/code&gt;. Otros motores tienen variantes propias, así que siempre valida la sintaxis de tu base de datos.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#e06c75"&gt;REGEXP&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;^[QY]&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;YOUNG&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CYNTHIA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;QUALLS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;STEPHEN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;QUINTANILLA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ROGER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;YANEZ&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;LUIS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;YEE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;MARVIN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;QUIGLEY&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;TROY&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;6&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;16&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El patrón &lt;code&gt;^[QY]&lt;/code&gt; indica que el apellido debe iniciar con &lt;code&gt;Q&lt;/code&gt; o &lt;code&gt;Y&lt;/code&gt;. Las expresiones regulares son más expresivas que &lt;code&gt;LIKE&lt;/code&gt;, pero menos portables entre motores.&lt;/p&gt;
&lt;h2 id="filtrado-de-valores-null"&gt;Filtrado de valores NULL&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;NULL&lt;/code&gt; es un caso especial en SQL. No representa &lt;code&gt;false&lt;/code&gt;, cero ni una cadena vacía; representa ausencia de valor o valor desconocido. Por esa razón, no debes comparar &lt;code&gt;NULL&lt;/code&gt; con &lt;code&gt;=&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Para consultar valores nulos se usa &lt;code&gt;IS NULL&lt;/code&gt;, y para excluirlos se usa &lt;code&gt;IS NOT NULL&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental_id&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;return_date&lt;/span&gt; &lt;span style="color:#c678dd"&gt;IS&lt;/span&gt; &lt;span style="color:#c678dd"&gt;NULL&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-----------+-------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-----------+-------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;11496&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;155&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;11541&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;335&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;15867&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;505&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;15875&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;41&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;15894&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;168&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;15966&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;374&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-----------+-------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;183&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;01&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



 
 





 


&lt;div class="notice info"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Info&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;&lt;code&gt;NULL = NULL&lt;/code&gt; no se evalúa como verdadero en SQL estándar. Cuando una comparación involucra &lt;code&gt;NULL&lt;/code&gt;, el resultado puede ser desconocido; por eso &lt;code&gt;IS NULL&lt;/code&gt; y &lt;code&gt;IS NOT NULL&lt;/code&gt; son operadores específicos para este caso.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="cierre"&gt;Cierre&lt;/h2&gt;
&lt;p&gt;La cláusula &lt;code&gt;WHERE&lt;/code&gt; convierte una tabla completa en un conjunto de filas relevante. Dominar igualdad, desigualdad, rangos, pertenencia, patrones y &lt;code&gt;NULL&lt;/code&gt; te permite escribir consultas más precisas y seguras.&lt;/p&gt;
&lt;p&gt;Como regla práctica, diseña filtros explícitos, valida condiciones destructivas con &lt;code&gt;SELECT&lt;/code&gt;, y considera el impacto de funciones, comodines y expresiones regulares sobre los índices. En el siguiente artículo abordaremos &lt;a href="https://blog.dacadev.com/programacion/sql/03-logica-condicional-case"



 


&gt;Lógica condicional con CASE&lt;/a&gt;, una herramienta clave para transformar valores dentro de tus consultas.&lt;/p&gt;</content:encoded></item><item><title>Estilos CSS: Dominando el modelo de caja</title><link>https://blog.dacadev.com/programacion/estilos-css/modelo-de-caja/</link><pubDate>Sat, 06 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/estilos-css/modelo-de-caja/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Domina el modelo de caja en CSS: content-box vs border-box, control de overflow, alturas orgánicas, centrado vertical, márgenes negativos y colapso de márgenes.</description><media:content url="https://blog.dacadev.com/images/programming/html-and-css/css/03-modelo-de-caja-banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#las-cuatro-regiones-de-una-caja"&gt;Las cuatro regiones de una caja&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#box-sizing-content-box-vs-border-box"&gt;&lt;code&gt;box-sizing&lt;/code&gt;: content-box vs border-box&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#alturas-el-flujo-normal-manda"&gt;Alturas: el flujo normal manda&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#overflow-qué-hacer-cuando-el-contenido-se-desborda"&gt;&lt;code&gt;overflow&lt;/code&gt;: qué hacer cuando el contenido se desborda&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#centrado-vertical"&gt;Centrado vertical&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#márgenes-negativos"&gt;Márgenes negativos&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#colapso-de-márgenes-margin-collapsing"&gt;Colapso de márgenes (margin collapsing)&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#conclusión"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;El modelo de caja es el sistema con el que CSS calcula el tamaño y el espaciado de cada elemento. Parece trivial, pero es la fuente número uno de layouts impredecibles: un &lt;code&gt;width: 50%&lt;/code&gt; que termina midiendo más de la mitad, dos columnas que no encajan, márgenes que desaparecen sin razón aparente. Todos esos síntomas se explican entendiendo cómo el navegador compone una caja.&lt;/p&gt;
&lt;p&gt;Esta es la tercera entrega de la serie &lt;strong&gt;Estilos CSS&lt;/strong&gt;. Analizaremos las cuatro regiones de una caja, el cambio de comportamiento que introduce &lt;code&gt;box-sizing&lt;/code&gt;, el control de &lt;code&gt;overflow&lt;/code&gt;, el manejo de alturas, el centrado vertical y el colapso de márgenes.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Comprenderás por qué &lt;code&gt;box-sizing: border-box&lt;/code&gt; debería ser tu valor por defecto y aprenderás a resolver los problemas clásicos de altura, centrado vertical y colapso de márgenes.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="las-cuatro-regiones-de-una-caja"&gt;Las cuatro regiones de una caja&lt;/h2&gt;
&lt;p&gt;Todo elemento HTML se compone, de adentro hacia afuera, de cuatro capas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;content&lt;/strong&gt; — el área donde vive el contenido (texto, imágenes).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;padding&lt;/strong&gt; — el espacio interno entre el contenido y el borde.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;border&lt;/strong&gt; — el borde que rodea el padding.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;margin&lt;/strong&gt; — el espacio externo que separa la caja de sus vecinos.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;div&lt;/span&gt; &lt;span style="color:#e06c75"&gt;class&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;caja&amp;#34;&lt;/span&gt;&amp;gt;content + padding + border + margin&amp;lt;/&lt;span style="color:#e06c75"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px dashed #f39c12;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;"&gt;
 &lt;div style="background:#fdebd0;padding:1.25rem;border:3px solid #2a9da9;font-family:Helvetica,Arial,sans-serif;color:#111;"&gt;
 &lt;div style="background:#aed6f1;padding:.75rem;"&gt;content&lt;/div&gt;
 &lt;small style="display:block;margin-top:.4rem;color:#555;"&gt;El área azul es el &lt;code&gt;content&lt;/code&gt;; el beige es el &lt;code&gt;padding&lt;/code&gt;; el trazo turquesa es el &lt;code&gt;border&lt;/code&gt;; el espacio punteado exterior es el &lt;code&gt;margin&lt;/code&gt;.&lt;/small&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="box-sizing-content-box-vs-border-box"&gt;&lt;code&gt;box-sizing&lt;/code&gt;: content-box vs border-box&lt;/h2&gt;
&lt;p&gt;La propiedad &lt;code&gt;box-sizing&lt;/code&gt; decide qué incluye el &lt;code&gt;width&lt;/code&gt; y el &lt;code&gt;height&lt;/code&gt; que declaras.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;content-box&lt;/code&gt;&lt;/strong&gt; (valor por defecto) — &lt;code&gt;width&lt;/code&gt; y &lt;code&gt;height&lt;/code&gt; miden &lt;strong&gt;solo&lt;/strong&gt; el contenido. El &lt;code&gt;padding&lt;/code&gt; y el &lt;code&gt;border&lt;/code&gt; se suman &lt;em&gt;por fuera&lt;/em&gt;, agrandando el tamaño final.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;border-box&lt;/code&gt;&lt;/strong&gt; — &lt;code&gt;width&lt;/code&gt; y &lt;code&gt;height&lt;/code&gt; miden el conjunto de contenido + padding + border. El tamaño que declaras es el tamaño real renderizado.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mira dos cajas con &lt;code&gt;width: 200px&lt;/code&gt; y &lt;code&gt;padding: 20px&lt;/code&gt;, una con cada modelo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;content-box&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;box-sizing&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;content-box&lt;/span&gt;; } &lt;span style="color:#7f848e"&gt;/* ancho real: 200 + 40 = 240px */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;border-box&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;box-sizing&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;border-box&lt;/span&gt;; } &lt;span style="color:#7f848e"&gt;/* ancho real: 200px */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="box-sizing:content-box;width:200px;padding:20px;border:3px solid #c0392b;background:#fdecea;margin-bottom:.75rem;color:#111;"&gt;content-box → mide 246px en total&lt;/div&gt;
 &lt;div style="box-sizing:border-box;width:200px;padding:20px;border:3px solid #27ae60;background:#eafaf1;color:#111;"&gt;border-box → mide 200px en total&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Por eso es práctica recomendada activar &lt;code&gt;border-box&lt;/code&gt; de forma global, heredándolo para no romper estilos de terceros:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:&lt;span style="color:#61afef"&gt;root&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;box-sizing&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;border-box&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;*,&lt;/span&gt; ::&lt;span style="color:#61afef"&gt;before&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;,&lt;/span&gt; ::&lt;span style="color:#61afef"&gt;after&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;box-sizing&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;inherit&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



 
 





 


&lt;div class="notice warning"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Warning&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Evita los &lt;strong&gt;números mágicos&lt;/strong&gt;: valores arbitrarios (&lt;code&gt;margin-top: 37px&lt;/code&gt;) que &amp;ldquo;cuadran&amp;rdquo; un diseño por casualidad. Haz que el contenido se adapte al contenedor, no al revés.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="alturas-el-flujo-normal-manda"&gt;Alturas: el flujo normal manda&lt;/h2&gt;
&lt;p&gt;La altura de un contenedor es &lt;strong&gt;orgánica&lt;/strong&gt; por defecto: la define su contenido, no el contenedor. Esto tiene dos consecuencias prácticas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Definir &lt;code&gt;height&lt;/code&gt; en porcentaje rara vez funciona, porque se refiere a la altura del padre, que a su vez depende de su contenido.&lt;/li&gt;
&lt;li&gt;Para que un &lt;code&gt;height: 100%&lt;/code&gt; funcione, el padre necesita una altura explícita en unidades absolutas.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En lugar de fijar alturas, prefiere restringir el rango con &lt;code&gt;min-height&lt;/code&gt; y &lt;code&gt;max-height&lt;/code&gt;, dejando que el contenido fluya:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;panel&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;min-height&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;6&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;max-height&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;12&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="overflow-qué-hacer-cuando-el-contenido-se-desborda"&gt;&lt;code&gt;overflow&lt;/code&gt;: qué hacer cuando el contenido se desborda&lt;/h2&gt;
&lt;p&gt;Cuando el contenido excede el tamaño de su caja, &lt;code&gt;overflow&lt;/code&gt; define el comportamiento:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Valor&lt;/th&gt;
 &lt;th&gt;Comportamiento&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;visible&lt;/code&gt; (por defecto)&lt;/td&gt;
 &lt;td&gt;El contenido se desborda y permanece visible.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;hidden&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;El contenido que se sale se recorta.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;scroll&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Siempre añade barras de desplazamiento.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;auto&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Añade barras solo si hace falta.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;recorte&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;overflow&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;auto&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;max-height&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="overflow:auto;max-height:5em;border:1px solid #ccc;padding:.5rem;color:#111;"&gt;
 &lt;p style="margin:0 0 .5rem;"&gt;Este contenedor tiene &lt;code&gt;overflow: auto&lt;/code&gt; y una altura máxima.&lt;/p&gt;
 &lt;p style="margin:0 0 .5rem;"&gt;Cuando el contenido supera esa altura, aparece una barra de desplazamiento.&lt;/p&gt;
 &lt;p style="margin:0 0 .5rem;"&gt;Línea adicional para forzar el desbordamiento.&lt;/p&gt;
 &lt;p style="margin:0;"&gt;Y una más para asegurar el scroll.&lt;/p&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Puedes controlar cada eje por separado con &lt;code&gt;overflow-x&lt;/code&gt; y &lt;code&gt;overflow-y&lt;/code&gt;, aunque mezclar valores distintos suele dar resultados poco predecibles.&lt;/p&gt;
&lt;h2 id="centrado-vertical"&gt;Centrado vertical&lt;/h2&gt;
&lt;p&gt;Centrar verticalmente fue durante años un dolor de cabeza en CSS. La propiedad &lt;code&gt;vertical-align&lt;/code&gt; no sirve para esto: solo aplica a elementos &lt;code&gt;inline&lt;/code&gt; y a celdas de tabla. Hoy tenemos varias soluciones según el escenario:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;¿Puedes usar la altura natural?&lt;/strong&gt; Aplica un &lt;code&gt;padding&lt;/code&gt; igual arriba y abajo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;¿Necesitas altura fija?&lt;/strong&gt; Usa &lt;code&gt;display: table-cell&lt;/code&gt; con &lt;code&gt;vertical-align: middle&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;El caso general:&lt;/strong&gt; usa &lt;strong&gt;flexbox&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;¿Una sola línea de texto?&lt;/strong&gt; Usa &lt;code&gt;line-height&lt;/code&gt; igual a la altura del contenedor.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;La solución moderna por excelencia es flexbox, que centra en ambos ejes con tres declaraciones:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;centro&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;display&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;flex&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;align-items&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;center&lt;/span&gt;; &lt;span style="color:#7f848e"&gt;/* eje vertical */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;justify-content&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;center&lt;/span&gt;; &lt;span style="color:#7f848e"&gt;/* eje horizontal */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;min-height&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;8&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;"&gt;
 &lt;div style="display:flex;align-items:center;justify-content:center;min-height:8em;background:#eaf2f8;border-radius:.4em;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;span style="background:#2a9da9;color:#fff;padding:.6em 1.2em;border-radius:.4em;"&gt;Centrado en ambos ejes&lt;/span&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="márgenes-negativos"&gt;Márgenes negativos&lt;/h2&gt;
&lt;p&gt;A diferencia de &lt;code&gt;padding&lt;/code&gt; y &lt;code&gt;border&lt;/code&gt;, los márgenes admiten valores &lt;strong&gt;negativos&lt;/strong&gt;, lo que te permite tirar de un elemento hacia afuera de su posición natural o solaparlo con su vecino.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;solapado&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;margin-top&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;-1.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1em;border-radius:.4em;"&gt;Bloque base&lt;/div&gt;
 &lt;div style="background:#f39c12;color:#fff;padding:1em;border-radius:.4em;margin-top:-1.5em;margin-left:2em;"&gt;Bloque con &lt;code&gt;margin-top&lt;/code&gt; negativo que se solapa&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="colapso-de-márgenes-margin-collapsing"&gt;Colapso de márgenes (margin collapsing)&lt;/h2&gt;
&lt;p&gt;Cuando dos márgenes verticales se encuentran, &lt;strong&gt;no se suman&lt;/strong&gt;: se &lt;em&gt;colapsan&lt;/em&gt;, quedando solo el de mayor valor. Si un párrafo tiene &lt;code&gt;margin-bottom: 30px&lt;/code&gt; y el siguiente &lt;code&gt;margin-top: 20px&lt;/code&gt;, la separación entre ambos será de &lt;code&gt;30px&lt;/code&gt;, no &lt;code&gt;50px&lt;/code&gt;.&lt;/p&gt;




 
 





 


&lt;div class="notice info"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Info&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;El colapso de márgenes solo ocurre con márgenes &lt;strong&gt;verticales&lt;/strong&gt; (arriba y abajo). Los márgenes horizontales (izquierda y derecha) nunca colapsan.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Hay varias formas de impedir el colapso cuando no lo deseas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Aplicar &lt;code&gt;overflow: auto&lt;/code&gt; (o cualquier valor distinto de &lt;code&gt;visible&lt;/code&gt;) al contenedor.&lt;/li&gt;
&lt;li&gt;Añadir un &lt;code&gt;border&lt;/code&gt; o un &lt;code&gt;padding&lt;/code&gt; entre los dos márgenes.&lt;/li&gt;
&lt;li&gt;Usar un contenedor flotado, &lt;code&gt;inline-block&lt;/code&gt; o con posición absoluta/fija.&lt;/li&gt;
&lt;li&gt;Usar &lt;strong&gt;flexbox&lt;/strong&gt; o &lt;strong&gt;grid&lt;/strong&gt;: los márgenes entre ítems del layout no colapsan.&lt;/li&gt;
&lt;li&gt;Los elementos con &lt;code&gt;display: table-cell&lt;/code&gt; no tienen margen, así que no colapsan.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;El modelo de caja deja de ser un misterio cuando interiorizas que &lt;code&gt;box-sizing&lt;/code&gt; controla la aritmética del tamaño, que la altura es orgánica por naturaleza y que los márgenes verticales colapsan. Activar &lt;code&gt;border-box&lt;/code&gt; de forma global y apoyarte en flexbox para el centrado elimina la mayoría de los problemas clásicos de maquetación.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;🚀 La siguiente entrega cubre los sistemas de &lt;strong&gt;layout&lt;/strong&gt;: &lt;code&gt;float&lt;/code&gt;, &lt;strong&gt;flexbox&lt;/strong&gt; y &lt;strong&gt;CSS Grid&lt;/strong&gt;, las herramientas con las que componemos la estructura completa de una página.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
</content:encoded></item><item><title>SQL: Fundamentos de SELECT, FROM y WHERE</title><link>https://blog.dacadev.com/programacion/sql/01-fundamentos-sql-select-from-where/</link><pubDate>Fri, 05 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/sql/01-fundamentos-sql-select-from-where/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Aprende SQL desde SELECT, FROM y WHERE: domina cláusulas esenciales, alias, tablas derivadas, vistas y filtros para consultas claras.</description><media:content url="https://blog.dacadev.com/images/programming/sql/fundamentals/banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#qué-es-una-base-de-datos-y-cómo-se-estructura-una-consulta-sql"&gt;Qué es una base de datos y cómo se estructura una consulta SQL&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#select-definir-las-columnas-del-resultado"&gt;&lt;code&gt;SELECT&lt;/code&gt;: definir las columnas del resultado&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#from-declarar-el-origen-de-los-datos"&gt;&lt;code&gt;FROM&lt;/code&gt;: declarar el origen de los datos&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#tablas-permanentes"&gt;Tablas permanentes&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#tablas-derivadas"&gt;Tablas derivadas&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#tablas-temporales"&gt;Tablas temporales&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#vistas"&gt;Vistas&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#alias-mejorar-legibilidad-sin-cambiar-el-modelo"&gt;Alias: mejorar legibilidad sin cambiar el modelo&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#where-filtrar-filas-antes-del-resultado-final"&gt;&lt;code&gt;WHERE&lt;/code&gt;: filtrar filas antes del resultado final&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#group-by-y-having-agrupar-datos-y-filtrar-agregados"&gt;&lt;code&gt;GROUP BY&lt;/code&gt; y &lt;code&gt;HAVING&lt;/code&gt;: agrupar datos y filtrar agregados&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#order-by-ordenar-el-resultado-final"&gt;&lt;code&gt;ORDER BY&lt;/code&gt;: ordenar el resultado final&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#cierre"&gt;Cierre&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;Cuando trabajas con una base de datos relacional, la calidad del sistema depende de consultas legibles y precisas. Las &lt;strong&gt;sentencias básicas de SQL&lt;/strong&gt; como &lt;code&gt;SELECT&lt;/code&gt;, &lt;code&gt;FROM&lt;/code&gt; y &lt;code&gt;WHERE&lt;/code&gt; definen qué datos recuperas, desde dónde los tomas y bajo qué condiciones entran al resultado final. Este es el primer artículo de la serie de SQL.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;En este artículo aprenderás cómo se organiza una consulta SQL, qué rol cumplen &lt;code&gt;SELECT&lt;/code&gt;, &lt;code&gt;FROM&lt;/code&gt;, &lt;code&gt;WHERE&lt;/code&gt;, &lt;code&gt;GROUP BY&lt;/code&gt;, &lt;code&gt;HAVING&lt;/code&gt; y &lt;code&gt;ORDER BY&lt;/code&gt;, y cómo usar alias, tablas derivadas, tablas temporales y vistas para construir consultas más claras.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="qué-es-una-base-de-datos-y-cómo-se-estructura-una-consulta-sql"&gt;Qué es una base de datos y cómo se estructura una consulta SQL&lt;/h2&gt;




 
 





 


&lt;div class="notice info"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Info&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Una &lt;strong&gt;base de datos&lt;/strong&gt; no es más que un conjunto de información relacionada. En SQL trabajamos sobre esa información mediante sentencias que describen qué datos queremos leer, filtrar, agrupar u ordenar.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;SQL permite expresar consultas declarativas: describes el resultado esperado y el motor decide el plan de ejecución, aplica optimizaciones y devuelve un &lt;strong&gt;result set&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Las cláusulas principales de una consulta suelen aparecer en este orden lógico:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Cláusula&lt;/th&gt;
 &lt;th&gt;Propósito&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;select&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Determina qué columnas incluir en el result set de la consulta&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;from&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Identifica las tablas de las que se extraen los datos y cómo se unen&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;where&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Filtra los registros no deseados&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;group by&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Agrupa filas por valores de columna comunes&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;having&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Filtra los grupos no deseados&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;order by&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Ordena las filas del resultado final por una o más columnas&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="select-definir-las-columnas-del-resultado"&gt;&lt;code&gt;SELECT&lt;/code&gt;: definir las columnas del resultado&lt;/h2&gt;




 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;La cláusula &lt;code&gt;SELECT&lt;/code&gt; determina cuáles columnas, expresiones o valores calculados se incluyen en el resultado de la consulta.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;code&gt;SELECT&lt;/code&gt; es la parte visible de la consulta. Ahí defines columnas, valores constantes, expresiones calculadas o resultados procesados por funciones integradas.&lt;/p&gt;
&lt;p&gt;Consideremos este ejemplo usando &lt;code&gt;language&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;language_id&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;COMMON&amp;#39;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;language_usage&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;language_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;*&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;1415927&lt;/span&gt; &lt;span style="color:#e06c75"&gt;lang_pi_value&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;upper&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;name&lt;/span&gt;) &lt;span style="color:#e06c75"&gt;language_name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#c678dd"&gt;language&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+----------------+---------------+---------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;language_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;language_usage&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;lang_pi_value&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;language_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+----------------+---------------+---------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;COMMON&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;1415927&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ENGLISH&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;COMMON&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;6&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;2831854&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ITALIAN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;COMMON&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;9&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;4247781&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JAPANESE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;4&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;COMMON&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;12&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;5663708&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;MANDARIN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; ... &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; ... &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; ... &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; ... &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------+----------------+---------------+---------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;6&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;04&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Este &lt;code&gt;SELECT&lt;/code&gt; combina una columna real, un literal, una expresión aritmética y una función. Cada expresión forma una columna del resultado.&lt;/p&gt;
&lt;p&gt;Reglas prácticas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Usa &lt;code&gt;*&lt;/code&gt; solo cuando realmente necesitas todas las columnas.&lt;/li&gt;
&lt;li&gt;Selecciona columnas específicas para reducir ruido y transferencia de datos.&lt;/li&gt;
&lt;li&gt;Usa &lt;code&gt;AS&lt;/code&gt; para alias explícitos en columnas calculadas o renombradas.&lt;/li&gt;
&lt;li&gt;Aplica operaciones, funciones integradas o expresiones cuando aporte claridad.&lt;/li&gt;
&lt;li&gt;Usa &lt;code&gt;DISTINCT&lt;/code&gt; para eliminar duplicados según las columnas seleccionadas.&lt;/li&gt;
&lt;/ul&gt;




 
 





 


&lt;div class="notice warning"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Warning&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Evita usar &lt;code&gt;SELECT *&lt;/code&gt; por defecto en consultas que respaldan APIs, reportes o procesos críticos. Cuando el esquema cambia, el resultado también cambia, y eso puede romper consumidores que esperan columnas específicas.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="from-declarar-el-origen-de-los-datos"&gt;&lt;code&gt;FROM&lt;/code&gt;: declarar el origen de los datos&lt;/h2&gt;




 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;La cláusula &lt;code&gt;FROM&lt;/code&gt; define las tablas usadas por la consulta y también la forma en que esas tablas se relacionan entre sí.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;code&gt;FROM&lt;/code&gt; indica de dónde salen las filas. Puede apuntar a tablas permanentes, derivadas, temporales o vistas.&lt;/p&gt;
&lt;h3 id="tablas-permanentes"&gt;Tablas permanentes&lt;/h3&gt;
&lt;p&gt;Las &lt;strong&gt;tablas permanentes&lt;/strong&gt; son creadas con &lt;code&gt;CREATE TABLE&lt;/code&gt;: datos persistentes, definidos en el esquema y disponibles entre sesiones.&lt;/p&gt;
&lt;p&gt;Ejemplo mínimo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;language_id&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#c678dd"&gt;language&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="tablas-derivadas"&gt;Tablas derivadas&lt;/h3&gt;
&lt;p&gt;Una &lt;strong&gt;tabla derivada&lt;/strong&gt; es una subconsulta usada dentro de &lt;code&gt;FROM&lt;/code&gt;. Vive solo durante la ejecución y permite aislar una etapa intermedia.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;concat&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;cust&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#39;, &amp;#39;&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;cust&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;) &lt;span style="color:#e06c75"&gt;full_name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; (&lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;email&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;JESSIE&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; ) &lt;span style="color:#e06c75"&gt;cust&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;full_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;BANKS&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;JESSIE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;MILAM&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;JESSIE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;---------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;2&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;00&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La subconsulta filtra clientes llamados &lt;code&gt;JESSIE&lt;/code&gt;. La consulta externa usa ese conjunto como &lt;code&gt;cust&lt;/code&gt; y construye &lt;code&gt;full_name&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="tablas-temporales"&gt;Tablas temporales&lt;/h3&gt;
&lt;p&gt;Las &lt;strong&gt;tablas temporales&lt;/strong&gt; materializan datos intermedios durante una sesión, transacción o proceso puntual.&lt;/p&gt;




 
 





 


&lt;div class="notice info"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Info&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Las tablas temporales se comportan como tablas normales, pero los datos insertados desaparecen en algún momento, usualmente al cerrar la sesión de base de datos o finalizar la transacción, según el motor utilizado.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;CREATE&lt;/span&gt; &lt;span style="color:#c678dd"&gt;TEMPORARY&lt;/span&gt; &lt;span style="color:#c678dd"&gt;TABLE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;actors_j&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;actor_id&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;smallint&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;5&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;varchar&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;45&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;varchar&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;45&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;Query&lt;/span&gt; &lt;span style="color:#e06c75"&gt;OK&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#e06c75"&gt;affected&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;00&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;INSERT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;INTO&lt;/span&gt; &lt;span style="color:#e06c75"&gt;actors_j&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;actor_id&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;actor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#c678dd"&gt;LIKE&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;J%&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;Query&lt;/span&gt; &lt;span style="color:#e06c75"&gt;OK&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;7&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#e06c75"&gt;affected&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;03&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;Records&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;7&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Duplicates&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Warnings&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;*&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;actors_j&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;----------+------------+-----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;actor_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;----------+------------+-----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;119&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;WARREN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JACKMAN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;131&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JANE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JACKMAN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;8&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;MATTHEW&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JOHANSSON&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;64&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;RAY&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JOHANSSON&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; ... &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; ... &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; ... &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;----------+------------+-----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;7&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;00&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Este patrón es práctico cuando un proceso reutiliza un subconjunto de datos varias veces. Conviene medir su impacto porque materializar datos tiene costo.&lt;/p&gt;
&lt;h3 id="vistas"&gt;Vistas&lt;/h3&gt;
&lt;p&gt;Una &lt;strong&gt;vista&lt;/strong&gt; es una tabla virtual creada con &lt;code&gt;CREATE VIEW&lt;/code&gt;. Normalmente encapsula una consulta y la expone como fuente reutilizable.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;CREATE&lt;/span&gt; &lt;span style="color:#c678dd"&gt;VIEW&lt;/span&gt; &lt;span style="color:#e06c75"&gt;cust_vw&lt;/span&gt; &lt;span style="color:#c678dd"&gt;AS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;active&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;Query&lt;/span&gt; &lt;span style="color:#e06c75"&gt;OK&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#e06c75"&gt;affected&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;12&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;cust_vw&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;active&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------+-----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------+-----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SANDRA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;MARTIN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JUDITH&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;COX&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SHEILA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;WELLS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ERICA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;MATTHEWS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;HEIDI&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;LARSON&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; ... &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; ... &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;TERRANCE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ROUSH&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------+-----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;15&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;00&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Las vistas encapsulan lógica compartida y pueden exponer solo ciertas columnas a consumidores internos.&lt;/p&gt;
&lt;h2 id="alias-mejorar-legibilidad-sin-cambiar-el-modelo"&gt;Alias: mejorar legibilidad sin cambiar el modelo&lt;/h2&gt;
&lt;p&gt;Los &lt;strong&gt;alias&lt;/strong&gt; permiten referenciar tablas y columnas con nombres más cortos. Esto evita redundancia y mejora la lectura, especialmente cuando hay joins o nombres de tabla largos.&lt;/p&gt;
&lt;p&gt;Observemos este ejemplo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;, &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;time&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;r&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;rental_date&lt;/span&gt;) &lt;span style="color:#e06c75"&gt;rental_time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;INNER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental&lt;/span&gt; &lt;span style="color:#e06c75"&gt;r&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;r&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;date&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;r&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;rental_date&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;2005-06-14&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En este caso, &lt;code&gt;customer&lt;/code&gt; se referencia como &lt;code&gt;c&lt;/code&gt; y &lt;code&gt;rental&lt;/code&gt; como &lt;code&gt;r&lt;/code&gt;. La consulta queda compacta y cada columna mantiene un origen explícito.&lt;/p&gt;
&lt;h2 id="where-filtrar-filas-antes-del-resultado-final"&gt;&lt;code&gt;WHERE&lt;/code&gt;: filtrar filas antes del resultado final&lt;/h2&gt;




 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;La cláusula &lt;code&gt;WHERE&lt;/code&gt; es el mecanismo para excluir filas no deseadas del result set.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;code&gt;WHERE&lt;/code&gt; concentra buena parte de la lógica de una consulta. Ahí combinas operadores, comparaciones, funciones y paréntesis para expresar condiciones precisas.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#e06c75"&gt;title&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;rating&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;rental_duration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;film&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;rating&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;G&amp;#39;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;AND&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental_duration&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;&amp;gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;7&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;OR&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;rating&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;PG-13&amp;#39;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;AND&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental_duration&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#d19a66"&gt;4&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------------------+--------+-----------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;title&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rating&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental_duration&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------------------+--------+-----------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ALABAMA&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DEVIL&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PG&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;13&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;BACKLASH&lt;/span&gt; &lt;span style="color:#e06c75"&gt;UNDEFEATED&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PG&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;13&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;BILKO&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ANONYMOUS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PG&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;13&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;BLANKET&lt;/span&gt; &lt;span style="color:#e06c75"&gt;BEVERLY&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;G&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;7&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;BORROWERS&lt;/span&gt; &lt;span style="color:#e06c75"&gt;BEDAZZLED&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;G&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;7&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;BRIDE&lt;/span&gt; &lt;span style="color:#e06c75"&gt;INTRIGUE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;G&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;7&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CASPER&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DRAGONFLY&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PG&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;13&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; ... &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; ... &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; ... &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;WAR&lt;/span&gt; &lt;span style="color:#e06c75"&gt;NOTTING&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;G&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;7&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;WORLD&lt;/span&gt; &lt;span style="color:#e06c75"&gt;LEATHERNECKS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PG&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;13&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;-------------------------+--------+-----------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;68&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;00&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La condición usa dos grupos lógicos. Los paréntesis hacen explícita la intención y reducen ambigüedad cuando se combinan &lt;code&gt;AND&lt;/code&gt; y &lt;code&gt;OR&lt;/code&gt;.&lt;/p&gt;




 
 





 


&lt;div class="notice warning"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Warning&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Cuando mezclas &lt;code&gt;AND&lt;/code&gt; y &lt;code&gt;OR&lt;/code&gt;, usa paréntesis aunque el motor tenga reglas de precedencia. La consulta queda más legible y disminuye el riesgo de devolver más filas de las esperadas.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="group-by-y-having-agrupar-datos-y-filtrar-agregados"&gt;&lt;code&gt;GROUP BY&lt;/code&gt; y &lt;code&gt;HAVING&lt;/code&gt;: agrupar datos y filtrar agregados&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;GROUP BY&lt;/code&gt; agrupa filas por valores comunes de una o más columnas y permite aplicar agregados como &lt;code&gt;count&lt;/code&gt;, &lt;code&gt;sum&lt;/code&gt;, &lt;code&gt;avg&lt;/code&gt;, &lt;code&gt;min&lt;/code&gt; o &lt;code&gt;max&lt;/code&gt;. &lt;code&gt;HAVING&lt;/code&gt; opera después de la agrupación: filtra grupos, no filas individuales.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;, &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;, &lt;span style="color:#c678dd"&gt;count&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;INNER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental&lt;/span&gt; &lt;span style="color:#e06c75"&gt;r&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;r&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;GROUP&lt;/span&gt; &lt;span style="color:#c678dd"&gt;BY&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;, &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;HAVING&lt;/span&gt; &lt;span style="color:#c678dd"&gt;count&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;&amp;gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;40&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------+-----------+----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#c678dd"&gt;count&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------+-----------+----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;TAMMY&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SANDERS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;41&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CLARA&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SHAW&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;42&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ELEANOR&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;HUNT&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;46&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;SUE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PETERS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;40&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; ... &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; ... &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; ... &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------+-----------+----------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;7&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;03&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Aquí agrupamos rentas por cliente y dejamos solo clientes con &lt;code&gt;40&lt;/code&gt; o más rentas. &lt;code&gt;WHERE count(*) &amp;gt;= 40&lt;/code&gt; no aplica porque &lt;code&gt;WHERE&lt;/code&gt; se evalúa antes de calcular agregados.&lt;/p&gt;
&lt;h2 id="order-by-ordenar-el-resultado-final"&gt;&lt;code&gt;ORDER BY&lt;/code&gt;: ordenar el resultado final&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;ORDER BY&lt;/code&gt; define el orden de las filas devueltas. Sin esta cláusula, no debes asumir un orden estable.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;mysql&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;SELECT&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt;, &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;time&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;r&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;rental_date&lt;/span&gt;) &lt;span style="color:#e06c75"&gt;rental_time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;FROM&lt;/span&gt; &lt;span style="color:#e06c75"&gt;customer&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;INNER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;JOIN&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental&lt;/span&gt; &lt;span style="color:#e06c75"&gt;r&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ON&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;r&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;customer_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;WHERE&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;date&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;r&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;rental_date&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;2005-06-14&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#c678dd"&gt;ORDER&lt;/span&gt; &lt;span style="color:#c678dd"&gt;BY&lt;/span&gt; &lt;span style="color:#c678dd"&gt;c&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------+-----------+-------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;first_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;last_name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rental_time&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------+-----------+-------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DANIEL&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CABRAL&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;23&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;09&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;38&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CATHERINE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CAMPBELL&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;23&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;17&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;03&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;HERMAN&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DEVORE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;23&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;35&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;09&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;AMBER&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;DIXON&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;23&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;42&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;56&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;JOYCE&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;EDWARDS&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;23&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;16&lt;/span&gt;:&lt;span style="color:#d19a66"&gt;26&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; ... &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; ... &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; ... &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#7f848e"&gt;------------+-----------+-------------+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;16&lt;/span&gt; &lt;span style="color:#c678dd"&gt;rows&lt;/span&gt; &lt;span style="color:#c678dd"&gt;in&lt;/span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; (&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;.&lt;span style="color:#d19a66"&gt;01&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sec&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En este caso, el resultado queda ordenado por &lt;code&gt;last_name&lt;/code&gt;. También puedes ordenar por múltiples columnas y controlar la dirección con &lt;code&gt;ASC&lt;/code&gt; o &lt;code&gt;DESC&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="cierre"&gt;Cierre&lt;/h2&gt;
&lt;p&gt;Las cláusulas básicas de SQL forman una cadena clara: &lt;code&gt;SELECT&lt;/code&gt; define qué mostrar, &lt;code&gt;FROM&lt;/code&gt; de dónde leer, &lt;code&gt;WHERE&lt;/code&gt; filtra filas, &lt;code&gt;GROUP BY&lt;/code&gt; agrupa, &lt;code&gt;HAVING&lt;/code&gt; filtra grupos y &lt;code&gt;ORDER BY&lt;/code&gt; estabiliza el orden final.&lt;/p&gt;
&lt;p&gt;En el siguiente artículo de la serie profundizaremos en &lt;a href="https://blog.dacadev.com/programacion/sql/02-filtrado-datos-clausula-where"



 


&gt;&lt;strong&gt;Filtrado de datos con la cláusula WHERE&lt;/strong&gt;&lt;/a&gt;, donde analizaremos operadores, rangos, patrones, valores nulos y composición de condiciones con más detalle.&lt;/p&gt;</content:encoded></item><item><title>Estilos CSS: Selectores, combinadores y pseudo-clases</title><link>https://blog.dacadev.com/programacion/estilos-css/selectores-css/</link><pubDate>Thu, 04 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/estilos-css/selectores-css/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Aprende a apuntar a cualquier elemento con los selectores de CSS: básicos, combinadores, pseudo-clases, pseudo-elementos y selectores de atributo, con ejemplos en vivo.</description><media:content url="https://blog.dacadev.com/images/programming/html-and-css/css/02-selectores-css-banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#selectores-básicos"&gt;Selectores básicos&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#combinadores"&gt;Combinadores&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#selectores-compuestos"&gt;Selectores compuestos&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#pseudo-clases"&gt;Pseudo-clases&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#posición-estructural"&gt;Posición estructural&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#estado-e-interacción"&gt;Estado e interacción&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#campos-de-formulario"&gt;Campos de formulario&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#pseudo-elementos"&gt;Pseudo-elementos&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#selectores-de-atributo"&gt;Selectores de atributo&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#conclusión"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;Un selector es el mecanismo con el que CSS apunta a los elementos que vas a estilizar. Elegir el selector correcto no es solo cuestión de que &amp;ldquo;funcione&amp;rdquo;: impacta directamente en la especificidad, en el acoplamiento de tus estilos y en la facilidad para mantenerlos. CSS ofrece un catálogo amplio de selectores, y conocerlos a fondo te evita escribir reglas frágiles.&lt;/p&gt;
&lt;p&gt;Este artículo es la segunda entrega de la serie &lt;strong&gt;Estilos CSS&lt;/strong&gt;. Recorreremos los selectores básicos, los combinadores, las pseudo-clases, los pseudo-elementos y los selectores de atributo, con ejemplos que puedes ver renderizados aquí mismo.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Repasaremos cada familia de selectores con su especificidad y demostraciones en vivo, para que puedas elegir siempre la opción más precisa y de menor acoplamiento.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="selectores-básicos"&gt;Selectores básicos&lt;/h2&gt;
&lt;p&gt;Son los cuatro selectores fundamentales sobre los que se construye todo lo demás:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Selector de tipo&lt;/strong&gt; (&lt;code&gt;p&lt;/code&gt;, &lt;code&gt;h1&lt;/code&gt;) — apunta por nombre de etiqueta. Especificidad &lt;code&gt;0,0,1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Selector de clase&lt;/strong&gt; (&lt;code&gt;.media&lt;/code&gt;) — apunta a los elementos con esa clase. Especificidad &lt;code&gt;0,1,0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Selector de ID&lt;/strong&gt; (&lt;code&gt;#sidebar&lt;/code&gt;) — apunta al elemento con ese &lt;code&gt;id&lt;/code&gt;. Especificidad &lt;code&gt;1,0,0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Selector universal&lt;/strong&gt; (&lt;code&gt;*&lt;/code&gt;) — apunta a todos los elementos. Especificidad &lt;code&gt;0,0,0&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="combinadores"&gt;Combinadores&lt;/h2&gt;
&lt;p&gt;Los &lt;strong&gt;combinadores&lt;/strong&gt; unen selectores simples para describir una relación entre elementos.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Combinador&lt;/th&gt;
 &lt;th&gt;Símbolo&lt;/th&gt;
 &lt;th&gt;Significado&lt;/th&gt;
 &lt;th&gt;Ejemplo&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Descendiente&lt;/td&gt;
 &lt;td&gt;(espacio)&lt;/td&gt;
 &lt;td&gt;Cualquier descendiente&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;.menu li&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Hijo directo&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Hijo inmediato&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;.lista &amp;gt; li&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Hermano adyacente&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;+&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;El elemento inmediatamente siguiente&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;p + h2&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Hermano general&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;~&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Todos los hermanos posteriores&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;li.activo ~ li&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;El combinador de hijo directo (&lt;code&gt;&amp;gt;&lt;/code&gt;) solo afecta al primer nivel de descendientes. Observa la diferencia con el descendiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;lista&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;li&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-weight&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;bold&lt;/span&gt;; } &lt;span style="color:#7f848e"&gt;/* solo hijos directos */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;ul&lt;/span&gt; &lt;span style="color:#e06c75"&gt;class&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;lista&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#e06c75"&gt;li&lt;/span&gt;&amp;gt;Hijo directo (en negrita)&amp;lt;/&lt;span style="color:#e06c75"&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#e06c75"&gt;li&lt;/span&gt;&amp;gt;Hijo directo (en negrita)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#e06c75"&gt;ul&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#e06c75"&gt;li&lt;/span&gt;&amp;gt;Nieto (sin negrita)&amp;lt;/&lt;span style="color:#e06c75"&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#e06c75"&gt;ul&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#e06c75"&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#e06c75"&gt;ul&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem 1.25rem;background:#fff;color:#111;margin:1rem 0;"&gt;
 &lt;style&gt;
 .cssel-child &gt; li { font-weight:bold; }
 .cssel-child ul li { font-weight:normal; }
 .cssel-child, .cssel-child ul { font-family:Helvetica,Arial,sans-serif; }
 &lt;/style&gt;
 &lt;ul class="cssel-child"&gt;
 &lt;li&gt;Hijo directo (en negrita)&lt;/li&gt;
 &lt;li&gt;Hijo directo (en negrita)
 &lt;ul&gt;
 &lt;li&gt;Nieto (sin negrita)&lt;/li&gt;
 &lt;/ul&gt;
 &lt;/li&gt;
 &lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="selectores-compuestos"&gt;Selectores compuestos&lt;/h2&gt;
&lt;p&gt;Varios selectores simples se pueden unir &lt;strong&gt;sin espacios&lt;/strong&gt; para formar un selector compuesto que exige que el elemento cumpla &lt;em&gt;todas&lt;/em&gt; las condiciones. Por ejemplo, &lt;code&gt;.dropdown.is-active&lt;/code&gt; apunta a &lt;code&gt;&amp;lt;div class=&amp;quot;dropdown is-active&amp;quot;&amp;gt;&lt;/code&gt; pero no a &lt;code&gt;&amp;lt;div class=&amp;quot;dropdown&amp;quot;&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="pseudo-clases"&gt;Pseudo-clases&lt;/h2&gt;
&lt;p&gt;Las &lt;strong&gt;pseudo-clases&lt;/strong&gt; apuntan a elementos según un estado: interacción del usuario o posición respecto a sus hermanos. Empiezan con un solo dos puntos (&lt;code&gt;:&lt;/code&gt;) y tienen la especificidad de una clase (&lt;code&gt;0,1,0&lt;/code&gt;).&lt;/p&gt;
&lt;h3 id="posición-estructural"&gt;Posición estructural&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;:first-child&lt;/code&gt;, &lt;code&gt;:last-child&lt;/code&gt;, &lt;code&gt;:only-child&lt;/code&gt; — primero, último o único hijo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:nth-child(an + b)&lt;/code&gt; — apunta según una fórmula posicional entre sus hermanos.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:nth-last-child()&lt;/code&gt; — igual, pero contando desde el final.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:first-of-type&lt;/code&gt;, &lt;code&gt;:last-of-type&lt;/code&gt;, &lt;code&gt;:nth-of-type()&lt;/code&gt; — equivalentes, pero solo cuentan elementos del mismo tipo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:not(&amp;lt;selector&amp;gt;)&lt;/code&gt; — apunta a lo que &lt;em&gt;no&lt;/em&gt; coincide con el selector interno.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:empty&lt;/code&gt; — elementos sin hijos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Un patrón clásico: aplicar un fondo alterno con &lt;code&gt;:nth-child(even)&lt;/code&gt; para crear filas tipo &amp;ldquo;cebra&amp;rdquo;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;zebra&lt;/span&gt; &lt;span style="color:#e06c75"&gt;li&lt;/span&gt;:&lt;span style="color:#61afef"&gt;nth-child&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;(&lt;/span&gt;&lt;span style="color:#e06c75"&gt;even&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;)&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;background&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#ecf0f1&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem 1.25rem;background:#fff;color:#111;margin:1rem 0;"&gt;
 &lt;style&gt;
 .cssel-zebra { list-style:none;padding:0;margin:0;font-family:Helvetica,Arial,sans-serif; }
 .cssel-zebra li { padding:.5em .75em; }
 .cssel-zebra li:nth-child(even) { background:#ecf0f1; }
 &lt;/style&gt;
 &lt;ul class="cssel-zebra"&gt;
 &lt;li&gt;Fila 1&lt;/li&gt;
 &lt;li&gt;Fila 2 (resaltada)&lt;/li&gt;
 &lt;li&gt;Fila 3&lt;/li&gt;
 &lt;li&gt;Fila 4 (resaltada)&lt;/li&gt;
 &lt;/ul&gt;
&lt;/div&gt;
&lt;h3 id="estado-e-interacción"&gt;Estado e interacción&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;:hover&lt;/code&gt; — mientras el cursor está sobre el elemento.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:focus&lt;/code&gt; — cuando el elemento recibe foco (clic, toque o tabulación).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:root&lt;/code&gt; — el elemento raíz del documento.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="campos-de-formulario"&gt;Campos de formulario&lt;/h3&gt;
&lt;p&gt;Varias pseudo-clases describen el estado de los controles: &lt;code&gt;:disabled&lt;/code&gt;, &lt;code&gt;:enabled&lt;/code&gt;, &lt;code&gt;:checked&lt;/code&gt;, &lt;code&gt;:invalid&lt;/code&gt;, &lt;code&gt;:valid&lt;/code&gt;, &lt;code&gt;:required&lt;/code&gt;, &lt;code&gt;:optional&lt;/code&gt;. Aquí, &lt;code&gt;:invalid&lt;/code&gt; cambia el borde cuando el valor no es un correo válido:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;input&lt;/span&gt;:&lt;span style="color:#61afef"&gt;invalid&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;border-color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#c0392b&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;input&lt;/span&gt;:&lt;span style="color:#61afef"&gt;valid&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;border-color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#27ae60&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem 1.25rem;background:#fff;color:#111;margin:1rem 0;"&gt;
 &lt;style&gt;
 .cssel-form input { padding:.5em;border:2px solid #ccc;border-radius:.3em;font-size:1rem;font-family:Helvetica,Arial,sans-serif; }
 .cssel-form input:invalid { border-color:#c0392b; }
 .cssel-form input:valid { border-color:#27ae60; }
 &lt;/style&gt;
 &lt;div class="cssel-form"&gt;
 &lt;label&gt;Escribe un correo: &lt;input type="email" placeholder="tu@correo.com" required&gt;&lt;/label&gt;
 &lt;/div&gt;
&lt;/div&gt;




 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;La lista de pseudo-clases es extensa y evoluciona con cada nivel de la especificación. Consulta la &lt;a href="https://developer.mozilla.org/es/docs/Web/CSS/Pseudo-classes"




 target="_blank"
 


&gt;documentación de MDN sobre pseudo-clases&lt;/a&gt; para el catálogo completo y el soporte por navegador.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="pseudo-elementos"&gt;Pseudo-elementos&lt;/h2&gt;
&lt;p&gt;Los &lt;strong&gt;pseudo-elementos&lt;/strong&gt; no apuntan a un elemento existente, sino a una parte del documento que no tiene marcado propio, o inyectan contenido nuevo. Usan doble dos puntos (&lt;code&gt;::&lt;/code&gt;) y tienen la especificidad de un selector de tipo (&lt;code&gt;0,0,1&lt;/code&gt;).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;::before&lt;/code&gt; — inserta un primer hijo virtual. Requiere la propiedad &lt;code&gt;content&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;::after&lt;/code&gt; — inserta un último hijo virtual. Requiere &lt;code&gt;content&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;::first-letter&lt;/code&gt; — estiliza la primera letra del texto.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;::first-line&lt;/code&gt; — estiliza la primera línea.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;::selection&lt;/code&gt; — estiliza el texto que el usuario resalta.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;nota&lt;/span&gt;::&lt;span style="color:#61afef"&gt;before&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;content&lt;/span&gt;: &lt;span style="color:#98c379"&gt;&amp;#34;★ &amp;#34;&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#f39c12&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;capitular&lt;/span&gt;::&lt;span style="color:#61afef"&gt;first-letter&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;2.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;font-weight&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;bold&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#2a9da9&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem 1.25rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;p style="margin:.2rem 0;"&gt;&lt;span style="color:#f39c12;"&gt;★ &lt;/span&gt;Texto precedido por un pseudo-elemento &lt;code&gt;::before&lt;/code&gt;.&lt;/p&gt;
 &lt;p style="margin:.6rem 0 0;"&gt;&lt;span style="font-size:2.5em;font-weight:bold;color:#2a9da9;"&gt;L&lt;/span&gt;orem ipsum con la primera letra estilizada como capitular.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="selectores-de-atributo"&gt;Selectores de atributo&lt;/h2&gt;
&lt;p&gt;Apuntan a elementos según sus atributos HTML. Tienen la especificidad de una clase (&lt;code&gt;0,1,0&lt;/code&gt;).&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Selector&lt;/th&gt;
 &lt;th&gt;Coincide cuando el atributo&amp;hellip;&lt;/th&gt;
 &lt;th&gt;Ejemplo&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;[attr]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;existe&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;input[disabled]&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;[attr=&amp;quot;valor&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;es exactamente igual&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;input[type=&amp;quot;radio&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;[attr^=&amp;quot;valor&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;empieza con el valor&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;a[href^=&amp;quot;https&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;[attr$=&amp;quot;valor&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;termina con el valor&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;a[href$=&amp;quot;.pdf&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;[attr*=&amp;quot;valor&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;contiene el valor&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;[class*=&amp;quot;sprite-&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;[attr~=&amp;quot;valor&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;es una lista separada por espacios que incluye el valor&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;a[rel~=&amp;quot;author&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;[attr|=&amp;quot;valor&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;es igual o empieza con &lt;code&gt;valor-&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;[lang|=&amp;quot;es&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Por ejemplo, podemos marcar visualmente los enlaces externos y los que apuntan a un PDF:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;a&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;[&lt;/span&gt;&lt;span style="color:#e06c75"&gt;href&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;^=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;https&amp;#34;&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;]&lt;/span&gt;::&lt;span style="color:#61afef"&gt;after&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;content&lt;/span&gt;: &lt;span style="color:#98c379"&gt;&amp;#34; ↗&amp;#34;&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;a&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;[&lt;/span&gt;&lt;span style="color:#e06c75"&gt;href&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;$=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;.pdf&amp;#34;&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;]&lt;/span&gt;::&lt;span style="color:#61afef"&gt;after&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;content&lt;/span&gt;: &lt;span style="color:#98c379"&gt;&amp;#34; (PDF)&amp;#34;&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#c0392b&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem 1.25rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;p style="margin:0;"&gt;
 &lt;a href="https://developer.mozilla.org" style="color:#2a7ae2;"&gt;Enlace externo&lt;span style="color:#2a7ae2;"&gt; ↗&lt;/span&gt;&lt;/a&gt; ·
 &lt;a href="#" style="color:#2a7ae2;"&gt;Documento&lt;span style="color:#c0392b;"&gt; (PDF)&lt;/span&gt;&lt;/a&gt;
 &lt;/p&gt;
&lt;/div&gt;




 
 





 


&lt;div class="notice info"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Info&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Los selectores de atributo distinguen mayúsculas y minúsculas por defecto. La especificación nivel 4 añade un modificador &lt;code&gt;i&lt;/code&gt; antes del corchete de cierre —&lt;code&gt;input[value=&amp;quot;search&amp;quot; i]&lt;/code&gt;— para hacerlos insensibles a mayúsculas. Verifica el soporte antes de usarlo en producción.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;El catálogo de selectores de CSS es amplio y cada familia resuelve un problema distinto. La clave está en elegir el selector más preciso con la menor especificidad posible: eso mantiene tus estilos desacoplados y fáciles de sobrescribir cuando lo necesites.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;🚀 En la siguiente entrega abordamos el &lt;strong&gt;modelo de caja&lt;/strong&gt;: cómo &lt;code&gt;margin&lt;/code&gt;, &lt;code&gt;border&lt;/code&gt;, &lt;code&gt;padding&lt;/code&gt; y &lt;code&gt;content&lt;/code&gt; definen el tamaño real de cada elemento y cómo &lt;code&gt;box-sizing&lt;/code&gt; cambia las reglas del juego.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
</content:encoded></item><item><title>Estilos CSS: Cascada, especificidad, herencia y unidades</title><link>https://blog.dacadev.com/programacion/estilos-css/fundamentos-cascada-especificidad-herencia/</link><pubDate>Tue, 02 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/estilos-css/fundamentos-cascada-especificidad-herencia/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Domina los fundamentos de CSS: cómo resuelve el navegador los conflictos de estilos con la cascada, la especificidad, la herencia y las unidades em, rem y vw.</description><media:content url="https://blog.dacadev.com/images/programming/html-and-css/css/01-fundamentos-cascada-especificidad-herencia-banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#la-cascada-cómo-el-navegador-resuelve-conflictos"&gt;La cascada: cómo el navegador resuelve conflictos&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#origen-de-los-estilos"&gt;Origen de los estilos&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#especificidad-el-peso-de-un-selector"&gt;Especificidad: el peso de un selector&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#orden-del-código-el-último-en-hablar-gana"&gt;Orden del código: el último en hablar gana&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#herencia-propiedades-que-viajan-hacia-abajo"&gt;Herencia: propiedades que viajan hacia abajo&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#valores-especiales-inherit-e-initial"&gt;Valores especiales: &lt;code&gt;inherit&lt;/code&gt; e &lt;code&gt;initial&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#unidades-absolutas-vs-relativas"&gt;Unidades absolutas vs. relativas&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#em-relativo-al-elemento"&gt;&lt;code&gt;em&lt;/code&gt;: relativo al elemento&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#rem-relativo-a-la-raíz"&gt;&lt;code&gt;rem&lt;/code&gt;: relativo a la raíz&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#unidades-relativas-al-viewport"&gt;Unidades relativas al viewport&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#calc-para-combinar-unidades"&gt;&lt;code&gt;calc()&lt;/code&gt; para combinar unidades&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#números-sin-unidad-y-line-height"&gt;Números sin unidad y &lt;code&gt;line-height&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#custom-properties-variables-css"&gt;Custom properties (variables CSS)&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#redefinir-variables-por-contexto"&gt;Redefinir variables por contexto&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#conclusión"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;Cuando dos reglas de estilo compiten por el mismo elemento, el resultado no es aleatorio: el navegador aplica un algoritmo determinista para decidir cuál gana. Comprender ese algoritmo —la cascada, la especificidad y la herencia— es la diferencia entre pelear contra CSS a punta de &lt;code&gt;!important&lt;/code&gt; y escribir hojas de estilo predecibles y mantenibles.&lt;/p&gt;
&lt;p&gt;Este artículo abre la serie &lt;strong&gt;Estilos CSS&lt;/strong&gt;. Analizaremos cómo el navegador resuelve conflictos, cómo se calcula el peso de un selector y cómo aprovechar las unidades relativas para construir interfaces que escalan.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Al terminar entenderás el modelo mental que rige &lt;em&gt;toda&lt;/em&gt; hoja de estilos: origen de los estilos, especificidad, orden del código, herencia y el sistema de unidades relativas (&lt;code&gt;em&lt;/code&gt;, &lt;code&gt;rem&lt;/code&gt;, &lt;code&gt;vw&lt;/code&gt;) junto con las variables CSS.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="la-cascada-cómo-el-navegador-resuelve-conflictos"&gt;La cascada: cómo el navegador resuelve conflictos&lt;/h2&gt;
&lt;p&gt;CSS significa &lt;em&gt;Cascading Style Sheets&lt;/em&gt;. La &lt;strong&gt;cascada&lt;/strong&gt; es precisamente el conjunto de reglas que determina qué declaración prevalece cuando varias apuntan a la misma propiedad de un elemento. El navegador evalúa tres criterios en orden:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Origen de la hoja de estilos&lt;/strong&gt; — de dónde provienen los estilos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Especificidad del selector&lt;/strong&gt; — qué selector es más &amp;ldquo;específico&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Orden en el código&lt;/strong&gt; — cuál se declaró de último.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="origen-de-los-estilos"&gt;Origen de los estilos&lt;/h3&gt;
&lt;p&gt;Existen tres orígenes posibles, con prioridad creciente:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;User agent styles&lt;/strong&gt; — los estilos por defecto del navegador (por ejemplo, el &lt;code&gt;margin&lt;/code&gt; de un &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; o el subrayado de un enlace).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Author styles&lt;/strong&gt; — los estilos que tú defines en tus archivos &lt;code&gt;.css&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User styles&lt;/strong&gt; — estilos configurados por el propio usuario en el navegador (accesibilidad, tamaños de fuente). Tienen prioridad sobre los anteriores.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tus estilos (&lt;em&gt;author&lt;/em&gt;) pisan a los del navegador, que es justo lo que esperas al escribir una hoja de estilos.&lt;/p&gt;
&lt;h2 id="especificidad-el-peso-de-un-selector"&gt;Especificidad: el peso de un selector&lt;/h2&gt;
&lt;p&gt;La &lt;strong&gt;especificidad&lt;/strong&gt; se representa con la notación &lt;code&gt;0,0,0,0&lt;/code&gt;, donde cada posición cuenta, de izquierda a derecha: estilos &lt;em&gt;inline&lt;/em&gt;, IDs, clases y nombres de etiqueta.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Componente&lt;/th&gt;
 &lt;th&gt;Ejemplo&lt;/th&gt;
 &lt;th&gt;Peso&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Selector de etiqueta&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;p&lt;/code&gt;, &lt;code&gt;h1&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;0,0,0,1&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Selector de clase&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;.nav-menu&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;0,0,1,0&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Selector de ID&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;#sidebar&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;0,1,0,0&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Estilo inline&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;style=&amp;quot;...&amp;quot;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;1,0,0,0&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Las reglas de desempate son sencillas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Una declaración con &lt;code&gt;!important&lt;/code&gt; gana por encima de todo (úsala con prudencia).&lt;/li&gt;
&lt;li&gt;Gana el selector con más IDs.&lt;/li&gt;
&lt;li&gt;Si hay empate, gana el que tenga más clases.&lt;/li&gt;
&lt;li&gt;Si persiste el empate, gana el que tenga más etiquetas.&lt;/li&gt;
&lt;/ol&gt;




 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Las pseudo-clases (&lt;code&gt;:hover&lt;/code&gt;) y los selectores de atributo (&lt;code&gt;[type=&amp;quot;text&amp;quot;]&lt;/code&gt;) cuentan como una clase (&lt;code&gt;0,0,1,0&lt;/code&gt;). El selector universal &lt;code&gt;*&lt;/code&gt; y los combinadores (&lt;code&gt;&amp;gt;&lt;/code&gt;, &lt;code&gt;+&lt;/code&gt;, &lt;code&gt;~&lt;/code&gt;) &lt;strong&gt;no&lt;/strong&gt; aportan especificidad.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Observa cómo dos reglas compiten por el color del párrafo. La clase &lt;code&gt;.destacado&lt;/code&gt; gana al selector de etiqueta &lt;code&gt;p&lt;/code&gt;, aunque la regla de &lt;code&gt;p&lt;/code&gt; se declare después:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;p&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#555&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;destacado&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#c0392b&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;p&lt;/span&gt;&amp;gt;Texto con el color por defecto del selector de etiqueta.&amp;lt;/&lt;span style="color:#e06c75"&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;p&lt;/span&gt; &lt;span style="color:#e06c75"&gt;class&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;destacado&amp;#34;&lt;/span&gt;&amp;gt;Este párrafo gana por especificidad de clase.&amp;lt;/&lt;span style="color:#e06c75"&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem 1.25rem;background:#fff;color:#111;margin:1rem 0;"&gt;
 &lt;style&gt;
 .csfund-spec p { color:#555;margin:.25rem 0;font-family:Helvetica,Arial,sans-serif; }
 .csfund-spec .destacado { color:#c0392b;font-weight:bold; }
 &lt;/style&gt;
 &lt;div class="csfund-spec"&gt;
 &lt;p&gt;Texto con el color por defecto del selector de etiqueta.&lt;/p&gt;
 &lt;p class="destacado"&gt;Este párrafo gana por especificidad de clase.&lt;/p&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="orden-del-código-el-último-en-hablar-gana"&gt;Orden del código: el último en hablar gana&lt;/h2&gt;
&lt;p&gt;Cuando dos declaraciones tienen el &lt;strong&gt;mismo origen y la misma especificidad&lt;/strong&gt;, el navegador aplica la que aparece de última en el código fuente. Este comportamiento es crítico al ordenar las pseudo-clases de un enlace.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;a&lt;/span&gt;:&lt;span style="color:#61afef"&gt;link&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#2a7ae2&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;a&lt;/span&gt;:&lt;span style="color:#61afef"&gt;visited&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#8e44ad&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;a&lt;/span&gt;:&lt;span style="color:#61afef"&gt;hover&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;text-decoration&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;underline&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;a&lt;/span&gt;:&lt;span style="color:#61afef"&gt;active&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#c0392b&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Como las cuatro pseudo-clases tienen la misma especificidad, su orden importa. La regla mnemotécnica es &lt;strong&gt;LoVe/HAte&lt;/strong&gt; — &lt;em&gt;link, visited, hover, active&lt;/em&gt;. Si inviertes &lt;code&gt;:hover&lt;/code&gt; y &lt;code&gt;:link&lt;/code&gt;, el &lt;code&gt;:hover&lt;/code&gt; nunca se aplicaría.&lt;/p&gt;
&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem 1.25rem;background:#fff;color:#111;margin:1rem 0;"&gt;
 &lt;style&gt;
 .csfund-links a { font-family:Helvetica,Arial,sans-serif;font-weight:bold;text-decoration:none;color:#2a7ae2; }
 .csfund-links a:hover { text-decoration:underline;color:#c0392b; }
 &lt;/style&gt;
 &lt;p class="csfund-links" style="margin:0;"&gt;&lt;a href="#fundamentos-cascada-especificidad-herencia"&gt;Pasa el cursor sobre este enlace&lt;/a&gt; para ver el efecto del orden del código.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="herencia-propiedades-que-viajan-hacia-abajo"&gt;Herencia: propiedades que viajan hacia abajo&lt;/h2&gt;
&lt;p&gt;La &lt;strong&gt;herencia&lt;/strong&gt; permite que ciertas propiedades de un elemento padre se transmitan a sus hijos. No todas las propiedades heredan: lo hacen principalmente las relacionadas con texto (&lt;code&gt;color&lt;/code&gt;, &lt;code&gt;font-family&lt;/code&gt;, &lt;code&gt;line-height&lt;/code&gt;, &lt;code&gt;text-align&lt;/code&gt;), mientras que las de caja (&lt;code&gt;margin&lt;/code&gt;, &lt;code&gt;padding&lt;/code&gt;, &lt;code&gt;border&lt;/code&gt;) no.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;tarjeta&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#1a5276&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;font-family&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;Georgia&lt;/span&gt;, &lt;span style="color:#e5c07b"&gt;serif&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;div&lt;/span&gt; &lt;span style="color:#e06c75"&gt;class&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;tarjeta&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#e06c75"&gt;h4&lt;/span&gt;&amp;gt;Título heredado&amp;lt;/&lt;span style="color:#e06c75"&gt;h4&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#e06c75"&gt;p&lt;/span&gt;&amp;gt;Este párrafo hereda &amp;lt;&lt;span style="color:#e06c75"&gt;em&lt;/span&gt;&amp;gt;color&amp;lt;/&lt;span style="color:#e06c75"&gt;em&lt;/span&gt;&amp;gt; y &amp;lt;&lt;span style="color:#e06c75"&gt;em&lt;/span&gt;&amp;gt;font-family&amp;lt;/&lt;span style="color:#e06c75"&gt;em&lt;/span&gt;&amp;gt; del contenedor.&amp;lt;/&lt;span style="color:#e06c75"&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#e06c75"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem 1.25rem;background:#fff;margin:1rem 0;"&gt;
 &lt;div style="color:#1a5276;font-family:Georgia,serif;"&gt;
 &lt;h4 style="margin:.2rem 0;"&gt;Título heredado&lt;/h4&gt;
 &lt;p style="margin:.2rem 0;"&gt;Este párrafo hereda &lt;em&gt;color&lt;/em&gt; y &lt;em&gt;font-family&lt;/em&gt; del contenedor.&lt;/p&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="valores-especiales-inherit-e-initial"&gt;Valores especiales: &lt;code&gt;inherit&lt;/code&gt; e &lt;code&gt;initial&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Dos palabras clave te dan control explícito sobre la herencia:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;inherit&lt;/code&gt; — fuerza a una propiedad a tomar el valor del padre, incluso en propiedades que normalmente no heredan.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;initial&lt;/code&gt; — restablece la propiedad a su valor inicial según la especificación, ignorando la herencia.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="unidades-absolutas-vs-relativas"&gt;Unidades absolutas vs. relativas&lt;/h2&gt;
&lt;p&gt;El píxel (&lt;code&gt;px&lt;/code&gt;) es la unidad &lt;strong&gt;absoluta&lt;/strong&gt; más común. Existen otras (&lt;code&gt;pt&lt;/code&gt;, &lt;code&gt;cm&lt;/code&gt;, &lt;code&gt;in&lt;/code&gt;) con equivalencias fijas: &lt;code&gt;1in = 96px = 72pt&lt;/code&gt;. Sin embargo, las unidades &lt;strong&gt;relativas&lt;/strong&gt; son las que permiten construir interfaces que escalan con el contexto.&lt;/p&gt;
&lt;h3 id="em-relativo-al-elemento"&gt;&lt;code&gt;em&lt;/code&gt;: relativo al elemento&lt;/h3&gt;
&lt;p&gt;Un &lt;code&gt;em&lt;/code&gt; equivale al &lt;code&gt;font-size&lt;/code&gt; del propio elemento. Es ideal para &lt;code&gt;padding&lt;/code&gt;, &lt;code&gt;margin&lt;/code&gt; y &lt;code&gt;border-radius&lt;/code&gt;, porque estos escalan junto con el tamaño de fuente.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;caja&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;padding&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;background&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#ecf0f1&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;caja--pequena&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;12&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;caja--grande&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;20&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem 1.25rem;background:#fff;color:#111;margin:1rem 0;display:flex;gap:1rem;align-items:flex-start;flex-wrap:wrap;"&gt;
 &lt;span style="font-size:12px;padding:1em;border-radius:1em;background:#ecf0f1;color:#111;"&gt;padding 1em · 12px&lt;/span&gt;
 &lt;span style="font-size:20px;padding:1em;border-radius:1em;background:#ecf0f1;color:#111;"&gt;padding 1em · 20px&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;El &lt;code&gt;padding&lt;/code&gt; de ambas cajas es &lt;code&gt;1em&lt;/code&gt;, pero al cambiar el &lt;code&gt;font-size&lt;/code&gt; el espaciado escala proporcionalmente sin tocar la propiedad &lt;code&gt;padding&lt;/code&gt;.&lt;/p&gt;




 
 





 


&lt;div class="notice info"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Info&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Para convertir un tamaño en píxeles a &lt;code&gt;em&lt;/code&gt;, divide el tamaño deseado entre el tamaño heredado: si quieres &lt;code&gt;16px&lt;/code&gt; y el padre tiene &lt;code&gt;12px&lt;/code&gt;, entonces &lt;code&gt;16 / 12 = 1.333em&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="rem-relativo-a-la-raíz"&gt;&lt;code&gt;rem&lt;/code&gt;: relativo a la raíz&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;rem&lt;/code&gt; (&lt;em&gt;root em&lt;/em&gt;) siempre toma como referencia el &lt;code&gt;font-size&lt;/code&gt; del elemento raíz (&lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; o &lt;code&gt;:root&lt;/code&gt;). Esto te da un punto de control global: cambiar el tamaño de la raíz redimensiona todo el documento de forma coherente.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:&lt;span style="color:#61afef"&gt;root&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0.875&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;media&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;(&lt;/span&gt;&lt;span style="color:#e06c75"&gt;min-width&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;800px&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;)&lt;/span&gt; { :&lt;span style="color:#61afef"&gt;root&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; } }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;media&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;(&lt;/span&gt;&lt;span style="color:#e06c75"&gt;min-width&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;1200px&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;)&lt;/span&gt; { :&lt;span style="color:#61afef"&gt;root&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1.125&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; } }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Una práctica habitual: usar &lt;code&gt;rem&lt;/code&gt; para tipografía, &lt;code&gt;px&lt;/code&gt; para bordes y &lt;code&gt;em&lt;/code&gt; para &lt;code&gt;padding&lt;/code&gt;, &lt;code&gt;margin&lt;/code&gt; y &lt;code&gt;border-radius&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="unidades-relativas-al-viewport"&gt;Unidades relativas al viewport&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;vw&lt;/code&gt; — 1% del ancho del viewport.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vh&lt;/code&gt; — 1% del alto del viewport.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vmin&lt;/code&gt; — 1% de la dimensión más pequeña entre ancho y alto.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vmax&lt;/code&gt; — 1% de la dimensión más grande.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="calc-para-combinar-unidades"&gt;&lt;code&gt;calc()&lt;/code&gt; para combinar unidades&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;calc()&lt;/code&gt; permite operar entre unidades de distinta naturaleza, algo imposible de otra forma. Es muy útil para tipografía fluida:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:&lt;span style="color:#61afef"&gt;root&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;calc&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;0.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;vw&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="números-sin-unidad-y-line-height"&gt;Números sin unidad y &lt;code&gt;line-height&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Si declaras un número sin unidad en &lt;code&gt;line-height&lt;/code&gt;, este actúa como un &lt;strong&gt;factor multiplicador&lt;/strong&gt; del &lt;code&gt;font-size&lt;/code&gt; del elemento. Es la forma recomendada, porque cada descendiente calcula su propia altura de línea a partir de su tamaño de fuente.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;body&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;line-height&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1.5&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="custom-properties-variables-css"&gt;Custom properties (variables CSS)&lt;/h2&gt;
&lt;p&gt;Las &lt;strong&gt;variables CSS&lt;/strong&gt; se declaran con el prefijo &lt;code&gt;--&lt;/code&gt; y se consumen con la función &lt;code&gt;var()&lt;/code&gt;. A diferencia de las variables de un preprocesador, son dinámicas: viven en el DOM y respetan la cascada y la herencia.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:&lt;span style="color:#61afef"&gt;root&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;--color-marca&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#2a9da9&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;--color-texto&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#1c2833&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;panel&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#61afef;font-weight:bold"&gt;var&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;--&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;color&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#e06c75"&gt;texto&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;border-left&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;4&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;solid&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;var&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;--&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;color&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#e06c75"&gt;marca&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;var()&lt;/code&gt; acepta un segundo argumento como valor de respaldo: &lt;code&gt;var(--color-secundario, #888)&lt;/code&gt; usará &lt;code&gt;#888&lt;/code&gt; si la variable no está definida.&lt;/p&gt;
&lt;h3 id="redefinir-variables-por-contexto"&gt;Redefinir variables por contexto&lt;/h3&gt;
&lt;p&gt;Como las variables respetan la cascada, puedes sobrescribirlas dentro de un bloque para crear temas locales. Aquí el mismo componente &lt;code&gt;.panel&lt;/code&gt; se reconfigura dentro de &lt;code&gt;.tema-oscuro&lt;/code&gt; cambiando solo las variables:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:&lt;span style="color:#61afef"&gt;root&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;--fondo&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#fff&lt;/span&gt;; &lt;span style="color:#e06c75"&gt;--texto&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#111&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;tema-oscuro&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;--fondo&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#2c3e50&lt;/span&gt;; &lt;span style="color:#e06c75"&gt;--texto&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#ecf0f1&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;panel&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;background&lt;/span&gt;: &lt;span style="color:#61afef;font-weight:bold"&gt;var&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;--&lt;/span&gt;&lt;span style="color:#e06c75"&gt;fondo&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#61afef;font-weight:bold"&gt;var&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;--&lt;/span&gt;&lt;span style="color:#e06c75"&gt;texto&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;padding&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;margin:1rem 0;display:flex;gap:1rem;flex-wrap:wrap;"&gt;
 &lt;div style="background:#fff;color:#111;padding:1em;border-radius:.5em;border:1px solid #ddd;flex:1;min-width:180px;"&gt;
 &lt;strong&gt;Panel claro&lt;/strong&gt;
 &lt;p style="margin:.4rem 0 0;"&gt;Usa las variables por defecto de &lt;code&gt;:root&lt;/code&gt;.&lt;/p&gt;
 &lt;/div&gt;
 &lt;div style="background:#2c3e50;color:#ecf0f1;padding:1em;border-radius:.5em;flex:1;min-width:180px;"&gt;
 &lt;strong&gt;Panel oscuro&lt;/strong&gt;
 &lt;p style="margin:.4rem 0 0;"&gt;Las mismas reglas, con las variables redefinidas.&lt;/p&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;El componente no cambió ni una línea: solo redefinimos las variables en un contenedor superior. Ese es el poder de combinar herencia y &lt;em&gt;custom properties&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;La cascada, la especificidad y la herencia forman el núcleo conceptual de CSS. Dominarlos te permite predecir qué regla gana sin recurrir a parches. Sumado a un buen uso de unidades relativas y variables, tienes la base para escribir estilos escalables y mantenibles.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;🚀 Próximo en la serie: los &lt;strong&gt;selectores&lt;/strong&gt; de CSS, la herramienta con la que apuntamos con precisión a los elementos que queremos estilizar.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
</content:encoded></item><item><title>GitHub Copilot: Beneficios, Desventajas y Precauciones</title><link>https://blog.dacadev.com/programacion/github-copilot-beneficios-desventajas-precauciones/</link><pubDate>Mon, 27 May 2024 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/github-copilot-beneficios-desventajas-precauciones/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Descubre cómo GitHub Copilot puede revolucionar tu forma de programar. Aprende sobre sus funcionalidades, beneficios, desventajas y precauciones en esta guía completa.</description><media:content url="https://blog.dacadev.com/images/programming/github-copilot-beneficios-desventajas-precauciones/banner.jpg" medium="image" type="image/jpeg"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#qué-es-github-copilot"&gt;¿Qué es GitHub Copilot?&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#debo-preocuparme-por-el-manejo-de-datos"&gt;¿Debo preocuparme por el manejo de datos?&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#cuáles-son-los-alcances-de-copilot"&gt;¿Cuáles son los alcances de Copilot?&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#es-acertado-copilot-en-sus-predicciones"&gt;¿Es acertado Copilot en sus predicciones?&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#beneficios-de-usar-copilot"&gt;Beneficios de usar Copilot&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#precauciones-y-desventajas-de-copilot"&gt;Precauciones y desventajas de Copilot&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#conclusión"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;





 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;&lt;p&gt;Este artículo nace como una iniciativa para centralizar el conocimiento que he adquirido en el manejo de la herramienta de &lt;strong&gt;GitHub Copilot&lt;/strong&gt; gracias a su uso diario, cursos y consejos que he encontrado en diversos recursos.&lt;/p&gt;
&lt;p&gt;La herramienta la puedes encontrar en el siguiente enlace: &lt;a href="https://github.com/features/copilot"




 target="_blank"
 


&gt;&lt;strong&gt;GitHub Copilot&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;GitHub Copilot&lt;/strong&gt; es una herramienta de inteligencia artificial que nos ofrece toda la potencia de los modelos de lenguaje a gran escala (LLM, por sus siglas en inglés) enfocada específicamente en el campo del desarrollo de software y programación. Es una herramienta que ha revolucionado la manera de escribir código y aún tiene mucho más por aportar. Veamos algunas de sus funcionalidades y beneficios, así como desventajas y riesgos de usar esta herramienta.&lt;/p&gt;
&lt;h2 id="qué-es-github-copilot"&gt;¿Qué es GitHub Copilot?&lt;/h2&gt;
&lt;p&gt;Mi definición de lo que es &lt;strong&gt;Copilot&lt;/strong&gt; sería:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;GitHub Copilot&lt;/strong&gt; es una herramienta de programación de pair programming que extiende las habilidades de los desarrolladores permitiendo enfocarse en el diseño, delegando la “carpintería” al copiloto.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Adicionalmente, si queremos ser un poco más técnicos al respecto y definir qué es &lt;strong&gt;Copilot&lt;/strong&gt; técnicamente, debemos decir que &lt;strong&gt;Copilot&lt;/strong&gt; trabaja sobre las mismas bases de los LLMs como ChatGPT, con la salvedad de que fue afinado para que su enfoque sea 100% en la escritura de código.&lt;/p&gt;
&lt;p&gt;Los datos usados para ajustar el modelo que alimenta a &lt;strong&gt;GitHub Copilot&lt;/strong&gt; fueron todos los repositorios públicos que se encuentran en GitHub, siendo esta la plataforma más usada para alojar proyectos alrededor del mundo. Esto significa que el conjunto de datos de entrenamiento es inmenso y muy completo.&lt;/p&gt;
&lt;p&gt;Por último, como &lt;strong&gt;Copilot&lt;/strong&gt; está basado en la tecnología de los LLMs, en general lo que busca es predecir, a partir de probabilidades, cuál sería el código que seguiría a medida que vas escribiendo.&lt;/p&gt;
&lt;h2 id="debo-preocuparme-por-el-manejo-de-datos"&gt;¿Debo preocuparme por el manejo de datos?&lt;/h2&gt;
&lt;p&gt;Una de las principales dudas al momento de usar &lt;strong&gt;Copilot&lt;/strong&gt;, incluso podría pensar que la primera duda, es ¿&lt;strong&gt;Copilot&lt;/strong&gt; usará mis datos y mi código para futuras sugerencias? o en palabras más simples ¿&lt;strong&gt;Copilot&lt;/strong&gt; va a robar mi código?&lt;/p&gt;
&lt;p&gt;La respuesta es un NO rotundo. &lt;strong&gt;Copilot&lt;/strong&gt; no usará tu código o el código generado con la herramienta para reentrenar el modelo, ya que, como mencioné antes, esta herramienta solo es entrenada con datos públicos que se obtienen de los repositorios públicos de GitHub.&lt;/p&gt;
&lt;p&gt;Además, el código generado a partir de &lt;strong&gt;Copilot&lt;/strong&gt; no es alojado para realizar una futura realimentación del modelo, por lo que puedes estar seguro de la privacidad de tu código y de tu negocio a fin de cuentas.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;En este punto debo mencionar algo y es la propiedad intelectual. Puede que &lt;strong&gt;Copilot&lt;/strong&gt; no respete la propiedad intelectual si esta es en un repositorio público, por lo que si quieres tener este tipo de protección y a la vez tener un código abierto, es mejor asesorarte.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="cuáles-son-los-alcances-de-copilot"&gt;¿Cuáles son los alcances de Copilot?&lt;/h2&gt;
&lt;p&gt;Como mencionamos antes, &lt;strong&gt;Copilot&lt;/strong&gt; es tu compañero de programación en pareja, esto significa que te ayudará a escribir código brindando sugerencias durante la escritura del mismo, pero aquí puede surgir una pregunta muy importante: &lt;strong&gt;¿Puede Copilot ayudarme sin importar el lenguaje?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La respuesta a esta pregunta es ambigua, sí y no. Es un sí porque recuerda que el modelo fue entrenado usando todo el código público alojado en GitHub, y entre estos encontramos una diversidad inmensa de lenguajes, frameworks, estilos, prácticas, etc. Sin embargo, también debemos tener en cuenta que los lenguajes más populares como JavaScript o Python son los que más proyectos tienen alojados en GitHub, lo que significa que el modelo aprendió más de estos lenguajes, haciéndolo mucho más eficiente para estos tipos de lenguajes o frameworks.&lt;/p&gt;
&lt;p&gt;Si intentas utilizar &lt;strong&gt;Copilot&lt;/strong&gt; con algún lenguaje que no es tan popular como COBOL, es posible que &lt;strong&gt;Copilot&lt;/strong&gt; no haga un muy buen trabajo, pero lo intentará.&lt;/p&gt;




 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Si tienes miedo de que la IA te pueda arrebatar el trabajo, tiene sentido buscar aquello en lo que la IA no es realmente buena&amp;hellip; ¿aún? Esto es solo una opinión que podría ser una buena discusión, ¿qué opinas?&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="es-acertado-copilot-en-sus-predicciones"&gt;¿Es acertado Copilot en sus predicciones?&lt;/h2&gt;
&lt;p&gt;Esta es una pregunta que muchas personas se hacen, sin importar el nivel de experiencia que tengan, y volviendo a retomar la idea de antes, sus predicciones mejorarán a medida que sea usado para escribir código de lenguajes o contextos populares, ya que tendrá más conocimiento de dónde echar mano.&lt;/p&gt;
&lt;p&gt;Dado lo anterior, es MUY IMPORTANTE que tú, como desarrollador, supervises siempre el resultado de &lt;strong&gt;Copilot&lt;/strong&gt;. No importa qué tan sencillo o simple sea, hazlo como una nueva práctica para el uso de esta herramienta ya que &lt;strong&gt;Copilot&lt;/strong&gt; solo predice, no piensa realmente&amp;hellip; ¿aún? 🤔&lt;/p&gt;
&lt;p&gt;Aquí quiero hacer un énfasis que es mandatorio, y es el de la supervisión. Tu responsabilidad como programador es supervisar el resultado de &lt;strong&gt;Copilot&lt;/strong&gt;, y esto se puede hacer eficientemente solamente si:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Conoces la tecnología, lenguaje, frameworks, etc. que &lt;strong&gt;Copilot&lt;/strong&gt; te está ayudando a construir.&lt;/li&gt;
&lt;li&gt;Entiendes lo que estás construyendo y el propósito, la lógica de negocio.&lt;/li&gt;
&lt;li&gt;Entiendes a nivel macro el impacto de tu trabajo, &lt;strong&gt;Copilot&lt;/strong&gt; te ayudará con lo micro.&lt;/li&gt;
&lt;/ul&gt;




 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Debes ser siempre consciente de lo que estás construyendo, siempre recuérdalo porque con el uso de &lt;strong&gt;Copilot&lt;/strong&gt; es fácil caer en la tentación de dejar pasar algunas cosas.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="beneficios-de-usar-copilot"&gt;Beneficios de usar Copilot&lt;/h2&gt;
&lt;p&gt;Hablemos ahora de cuáles son los beneficios de usar &lt;strong&gt;Copilot&lt;/strong&gt;. ¡Hay muchos!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Incrementa la productividad, ya que no gastarás tiempo escribiendo y reescribiendo código, sobre todo si son piezas pequeñas pero tediosas.&lt;/li&gt;
&lt;li&gt;Reduce los errores en el código, aunque debamos supervisar el resultado de &lt;strong&gt;Copilot&lt;/strong&gt;, este siempre nos ayudará a reducir errores comunes como los typos o referencias mal realizadas.&lt;/li&gt;
&lt;li&gt;Permite tener una gran diversidad de código, ya que puedes pedirle a &lt;strong&gt;Copilot&lt;/strong&gt; que te dé no solo una, sino más sugerencias, permitiéndonos ahondar en múltiples estilos o diseños de código.&lt;/li&gt;
&lt;li&gt;Soporta múltiples lenguajes, con mejor rendimiento en unos más que en otros.&lt;/li&gt;
&lt;li&gt;Te permite aprender y desarrollar al mismo tiempo. Cuando &lt;strong&gt;Copilot&lt;/strong&gt; te ayuda a escribir código, puede implementar técnicas o ideas nuevas para ti y te permitirá aprender de ellas. Para ello, debes ser consciente y supervisar el resultado, no confíes 100% en su respuesta. Valida en la documentación o en recursos de confianza.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Copilot&lt;/strong&gt; se ajustará a tu tipo de código. A medida que lo uses, entenderá cuál es el estilo de código en base a lo ya escrito en el proyecto. Tú lo orientas en base a cómo escribas código. Esto significa que si cambias de proyecto y este tiene otras reglas, &lt;strong&gt;Copilot&lt;/strong&gt; se adaptará. Él no aprende de ti.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="precauciones-y-desventajas-de-copilot"&gt;Precauciones y desventajas de Copilot&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Su precisión es variable dependiendo del contexto del prompt y del mismo código que tienes en ese archivo. Esto depende del tiempo de trabajo en el proyecto con &lt;strong&gt;Copilot&lt;/strong&gt;, los archivos abiertos y el código de referencia.&lt;/li&gt;
&lt;li&gt;Riesgos de seguridad potenciales. Debes supervisar el resultado, sobre todo si trabajas con partes sensibles del código como SQL, ORMs, código de lógica de negocio, etc. Valida el código que propone &lt;strong&gt;Copilot&lt;/strong&gt; y, si no lo conocías, valida su uso en la documentación o un recurso de confianza.&lt;/li&gt;
&lt;li&gt;Depender demasiado de la herramienta. Para que esto no suceda, debes conocer bien la tecnología, lenguaje y sistema que estás construyendo, para tener el criterio y confianza de que lo que estás haciendo lo podrías hacer sin ayuda de &lt;strong&gt;Copilot&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Una “desventaja” es que tiene un costo, no tiene opción de uso gratuito o similar, y es más costoso a medida que se implementa en organizaciones. Esto, en algunos casos como personas/empresas que están empezando, puede ser un valor difícil de asumir. Debes tener claro el valor que agrega en el equipo y ese gasto adicional incluirlo en tus cuentas.&lt;/li&gt;
&lt;li&gt;Límite en el contexto de la herramienta. Esta es una desventaja de los LLMs en general y, aunque es algo que está en constante mejora, es muy difícil (por lo menos hasta ahora) incluir todo un proyecto en el contexto de un LLM y adicionalmente compartir qué es lo que se busca hacer. Por lo que para tareas muy grandes con un código fuente enorme, tiende a no ser tan preciso.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;GitHub Copilot&lt;/strong&gt; ha revolucionado la forma en que los desarrolladores escriben código, ofreciendo beneficios significativos como el aumento de la productividad y la reducción de errores. Sin embargo, es crucial supervisar sus sugerencias y estar consciente de sus limitaciones y riesgos. A medida que la tecnología avanza, &lt;strong&gt;Copilot&lt;/strong&gt; seguirá mejorando, pero siempre será necesario el criterio humano para garantizar la calidad y la seguridad del código.&lt;/p&gt;




 
 





 


&lt;div class="notice info"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Info&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Este artículo se actualiza periódicamente conforme evolucionan las funcionalidades de &lt;strong&gt;GitHub Copilot&lt;/strong&gt;. Si tienes experiencias o consejos adicionales, no dudes en compartirlos a través de la &lt;a href="https://blog.dacadev.com/contacto"



 


&gt;página de contacto&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
</content:encoded></item><item><title>Patrones de Diseño: Decorador</title><link>https://blog.dacadev.com/programacion/patrones-de-diseno/decorador/</link><pubDate>Wed, 21 Feb 2024 21:25:17 +0000</pubDate><guid>https://blog.dacadev.com/programacion/patrones-de-diseno/decorador/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Explora el patrón decorador en diseño de software: una guía completa para agregar dinamismo y flexibilidad a tus objetos, evitando la complejidad del código.</description><media:content url="https://blog.dacadev.com/images/programming/design-patterns/decorator/banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#objetivo-del-patrón-decorador"&gt;Objetivo del patrón decorador&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#ejemplo-de-uso"&gt;Ejemplo de uso&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#características-del-patrón-decorador"&gt;Características del patrón decorador&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#implementación-del-ejemplo-en-código"&gt;Implementación del ejemplo en código&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#teoría"&gt;Teoría&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#ejemplo"&gt;Ejemplo&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#consideraciones-del-patrón-decorador"&gt;Consideraciones del patrón decorador&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;h2 id="objetivo-del-patrón-decorador"&gt;Objetivo del patrón decorador&lt;/h2&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;El &lt;strong&gt;patrón decorador&lt;/strong&gt; agrega dinamismo a la extensión de funcionalidades.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;El objetivo del &lt;strong&gt;patrón decorador&lt;/strong&gt; es crear una clase abstracta, la cual usaremos para crear (a través de herencia) los objetos base. Los decoradores serán clases especiales que extienden las funcionalidades de la clase abstracta, agregando un campo que contendrá una instancia de la clase abstracta, o en su defecto, un hijo de la misma.&lt;/p&gt;
&lt;p&gt;Veamos un ejemplo de cómo los decoradores pueden funcionar. Supongamos que estamos creando una aplicación para llevar el control de costos de bebidas, donde el costo de estas bebidas depende de los ingredientes adicionales que le añadamos, como por ejemplo, chocolate rallado, crema, etc.&lt;/p&gt;
&lt;h2 id="ejemplo-de-uso"&gt;Ejemplo de uso&lt;/h2&gt;
&lt;p&gt;Ahora, supongamos que tenemos una clase base café a la cual queremos agregar dos ingredientes nuevos: chocolate y crema chantilly. Gráficamente, se vería algo como&lt;/p&gt;




 
 
 
 &lt;div class="flex justify-center"&gt;
 &lt;img
 src="https://blog.dacadev.com/images/programming/design-patterns/decorator/decorator-examples_hu_96ec4daeb7afeea5.webp"
 alt="Imagen guia del contenido de la página"style="width:400px"/&gt;
 &lt;/div&gt;
 
 
 


&lt;p&gt;De este ejemplo, podemos ver que para calcular el costo total de la bebida debemos sumar el valor de costo de cada uno de los decoradores o de las clases decoradoras. Para ello, la clase base debe tener la capacidad de identificar si tiene un hijo para retornar su valor de costo por defecto y así encadenar la suma.&lt;/p&gt;
&lt;p&gt;Antes de pasar al código de implementación, veamos algunas características que debemos tener en cuenta para este patrón.&lt;/p&gt;
&lt;h2 id="características-del-patrón-decorador"&gt;Características del patrón decorador&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;El decorador debe tener el mismo supertipo que el objeto que están decorando; es decir, ambas clases, la clase decoradora y la que se está decorando, deben heredar de la misma clase.&lt;/li&gt;
&lt;li&gt;Puedes usar uno o más decoradores para encapsular un objeto, lo que significa que no hay límite en la cantidad de objetos decoradores que se utilicen sobre un objeto.&lt;/li&gt;
&lt;li&gt;Cuando se le da el mismo supertipo al decorado y a la clase que está decorando, podemos pasar dicho elemento decorado en lugar del objeto original encapsulado.&lt;/li&gt;
&lt;li&gt;El decorador agrega su propio comportamiento antes o después de que el objeto decorado realice su trabajo.&lt;/li&gt;
&lt;li&gt;Los objetos pueden ser decorados en cualquier momento, lo que permite que sean decorados de manera dinámica en tiempo de ejecución.&lt;/li&gt;
&lt;/ul&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;🚀 El &lt;strong&gt;patrón decorador&lt;/strong&gt; adiciona responsabilidades de manera dinámica a un objeto, ofreciendo flexibilidad y una alternativa al uso de subclases.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="implementación-del-ejemplo-en-código"&gt;Implementación del ejemplo en código&lt;/h2&gt;
&lt;h3 id="teoría"&gt;Teoría&lt;/h3&gt;
&lt;p&gt;Para la implementación de nuestro ejemplo, veamos como funcionaría el diagrama de clases&lt;/p&gt;
&lt;pre class="mermaid"&gt;classDiagram
 class Component {
 methodA()
 methodB()
 otherMethods()
 }
 class ConcreteComponent {
 methodA()
 methodB()
 }
 class Decorator {
 WrappedObj Component
 methodA()
 methodB()
 otherMethods()
 }
 class ConcreteDecoratorA {
 WrappedObj Component
 methodA()
 methodB()
 otherMethods()
 }
 class ConcreteDecoratorB {
 WrappedObj Component
 methodA()
 methodB()
 otherMethods()
 }
 Component &lt;|-- ConcreteComponent
 Component &lt;|-- Decorator
 Decorator &lt;|-- ConcreteDecoratorA
 Decorator &lt;|-- ConcreteDecoratorB
&lt;/pre&gt;

&lt;p&gt;Tendremos una clase base (nuestra clase abstracta) que en el diagrama se llama Component. De esta clase creamos dos clases: una es la clase &lt;code&gt;ConcreteComponent&lt;/code&gt;, que es la que usaremos para instanciar nuestros objetos, y otra clase llamada &lt;code&gt;Decorator&lt;/code&gt;, que es la que usaremos para crear todos los decoradores que podemos usar con nuestro objeto &lt;code&gt;ConcreteComponent&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Decorator&lt;/code&gt; es una clase abstracta que será usada para crear nuestros decoradores específicos. Esta clase definirá los métodos y demás lógica que debe ser implementada para que otras clases sean decoradores válidos.&lt;/p&gt;
&lt;h3 id="ejemplo"&gt;Ejemplo&lt;/h3&gt;
&lt;p&gt;Aplicando el anterior esquema a un ejemplo, podemos suponer que queremos crear tipos de bebidas que varían su combinación&lt;/p&gt;
&lt;pre class="mermaid"&gt;classDiagram
 class Beverage {
 -description
 +getDescription()
 +cost()
 }
 class Coffee {
 +cost()
 }
 class Decaf {
 +cost()
 }
 class HouseBlend {
 +cost()
 }
 class IngredientDecorator {
 -beverage Beverage
 +getDescription()
 }
 class Milk {
 +cost()
 +getDescription()
 }
 class Mocha {
 +cost()
 +getDescription()
 }
 class Soy {
 +cost()
 +getDescription()
 }
 class Chantilly {
 +cost()
 +getDescription()
 }
 class Chocolate {
 +cost()
 +getDescription()
 }
 Beverage &lt;|-- Coffee
 Beverage &lt;|-- Decaf
 Beverage &lt;|-- HouseBlend
 Beverage &lt;|-- IngredientDecorator
 IngredientDecorator &lt;|-- Milk
 IngredientDecorator &lt;|-- Mocha
 IngredientDecorator &lt;|-- Soy
 IngredientDecorator &lt;|-- Chantilly
 IngredientDecorator &lt;|-- Chocolate
&lt;/pre&gt;

&lt;p&gt;La implementación del anterior diagrama se haría de la siguiente manera (en Python) empezaremos por la implementación de las clases abstractas&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#e06c75"&gt;abc&lt;/span&gt; &lt;span style="color:#c678dd"&gt;import&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ABC&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;Beverage&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;ABC&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;cost&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;float&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;pass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;description&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;pass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;IngredientDecorator&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;ABC&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#56b6c2;font-weight:bold"&gt;__init__&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;beverage&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;Beverage&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;beverage&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;beverage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;cost&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;float&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;pass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;description&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;pass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ahora haciendo uso de nuestras clases abstractas, podemos crear nuestros objetos y decoradores concretos, nuestros objetos lucirían de la siguiente forma:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#e06c75"&gt;abc_classes&lt;/span&gt; &lt;span style="color:#c678dd"&gt;import&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Beverage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;Coffee&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;Beverage&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;cost&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;float&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1.99&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;description&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;Coffee&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;Decaf&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;Beverage&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;cost&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;float&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1.25&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;description&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;Decaf&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;HouseBlend&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;Beverage&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;cost&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;float&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.89&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;description&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;House Blend&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;y nuestros decoradores&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#e06c75"&gt;abc_classes&lt;/span&gt; &lt;span style="color:#c678dd"&gt;import&lt;/span&gt; &lt;span style="color:#e06c75"&gt;IngredientDecorator&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;Milk&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;IngredientDecorator&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;cost&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;float&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;beverage&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;cost&lt;/span&gt;() &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;description&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;beverage&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;description&lt;/span&gt;() &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;, Milk&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;Mocha&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;IngredientDecorator&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;cost&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;float&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;beverage&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;cost&lt;/span&gt;() &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.20&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;description&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;beverage&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;description&lt;/span&gt;() &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;, Mocha&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;Soy&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;IngredientDecorator&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;cost&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;float&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;beverage&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;cost&lt;/span&gt;() &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.15&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;description&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;beverage&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;description&lt;/span&gt;() &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;, Soy&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;Chantilly&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;IngredientDecorator&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;cost&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;float&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;beverage&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;cost&lt;/span&gt;() &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.25&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;description&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;beverage&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;description&lt;/span&gt;() &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;, Chantilly&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;Chocolate&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;IngredientDecorator&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;cost&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;float&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;beverage&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;cost&lt;/span&gt;() &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.30&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;description&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;beverage&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;description&lt;/span&gt;() &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;, Chocolate&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;y su uso dentro de nuestro código sería&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#e06c75"&gt;concrete_classes&lt;/span&gt; &lt;span style="color:#c678dd"&gt;import&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Coffee&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;Decaf&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;HouseBlend&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#e06c75"&gt;decorators&lt;/span&gt; &lt;span style="color:#c678dd"&gt;import&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Milk&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;Mocha&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;Soy&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;Chantilly&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;Chocolate&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;if&lt;/span&gt; &lt;span style="color:#e06c75"&gt;__name__&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;==&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;chocolate_blend&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Chantilly&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;Chocolate&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;HouseBlend&lt;/span&gt;()))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;soy_decaf&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Soy&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;Decaf&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;moccachino&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Mocha&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;Chocolate&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;Milk&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;Coffee&lt;/span&gt;())))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;chocolate_blend&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;cost&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;chocolate_blend&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;description&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;soy_decaf&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;cost&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;soy_decaf&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;description&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;moccachino&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;cost&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;moccachino&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;description&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;cuando ejecutemos este código podremos ver que en nuestro resultado obtendremos&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1.44
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;House Blend, Chocolate, Chantilly
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1.4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Decaf, Soy
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2.59
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Coffee, Milk, Chocolate, Mocha
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="consideraciones-del-patrón-decorador"&gt;Consideraciones del patrón decorador&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;la herencia es una forma de extensión, pero no necesariamente la mejor forma de alcanzar la flexibilidad de nuestros diseños&lt;/li&gt;
&lt;li&gt;En nuestros diseños debemos de habilitar la extensión de nuevos comportamientos evitando la modificación del código actual&lt;/li&gt;
&lt;li&gt;la composición y la delegación pueden ser usados para agregar nuevos comportamientos en tiempo de ejecución&lt;/li&gt;
&lt;li&gt;El &lt;strong&gt;patrón decorador&lt;/strong&gt; provee una alternativa al uso de subclases para extender el comportamiento&lt;/li&gt;
&lt;li&gt;El &lt;strong&gt;patrón decorador&lt;/strong&gt; involucra el uso de clases decoradores que son usadas para encapsular componentes del mismo tipo en concreto&lt;/li&gt;
&lt;li&gt;Las clases decoradoras tienen el mismo tipo de la clase que decoran o encapsulan&lt;/li&gt;
&lt;li&gt;Los decoradores agregan nuevos comportamientos antes o después de que el objeto encapsulado realiza su trabajo&lt;/li&gt;
&lt;li&gt;Los decoradores normalmente son transparentes al cliente del componente&lt;/li&gt;
&lt;li&gt;Los decoradores pueden resultar en muchos objetos pequeños en nuestros diseños y el sobre uso del mismo puede derbar en crear código complejo y difícil de mantener&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>Patrones de Diseño: Observador</title><link>https://blog.dacadev.com/programacion/patrones-de-diseno/observador/</link><pubDate>Mon, 08 Jan 2024 01:25:17 +0000</pubDate><guid>https://blog.dacadev.com/programacion/patrones-de-diseno/observador/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Explora el patrón observador, su implementación en Python y su aplicación en la vida real. Aprende sobre sus partes claves de implementación</description><media:content url="https://blog.dacadev.com/images/programming/design-patterns/observer/banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#teoría"&gt;Teoría&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#implementación"&gt;Implementación&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#consideraciones-del-patrón-observador"&gt;*&lt;strong&gt;*Consideraciones del patrón observador**&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;





 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;El &lt;strong&gt;patrón observador&lt;/strong&gt; define una relación &lt;strong&gt;uno-a-muchos&lt;/strong&gt; entre objetos: cuando un objeto cambia de estado, todos sus dependientes son notificados automáticamente.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="teoría"&gt;Teoría&lt;/h2&gt;
&lt;p&gt;El &lt;strong&gt;patrón observador&lt;/strong&gt; es muy útil cuando se desea actualizar diversos objetos en función de los cambios en otros, siendo ampliamente implementado en frameworks frontend como React o Vue.&lt;/p&gt;
&lt;p&gt;Este patrón se basa en dos partes clave: los publishers u observables, que son los objetos emisores de valores, y los suscriptores, conocidos como observadores o subscribers. Estos últimos reciben los valores emitidos por los publishers.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;&lt;strong&gt;Publishers + Suscribers = Observer Pattern&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;La esencia de este patrón es permitir que un &lt;strong&gt;&lt;code&gt;publisher&lt;/code&gt;&lt;/strong&gt; emita eventos a sus &lt;strong&gt;&lt;code&gt;subscribers&lt;/code&gt;&lt;/strong&gt;, teniendo además la capacidad de agregar o eliminar suscriptores de sus listas.&lt;/p&gt;
&lt;p&gt;Veamos gráficamente cómo funciona este patrón.&lt;/p&gt;




 
 
 
 &lt;div class="flex justify-center"&gt;
 &lt;img
 src="https://blog.dacadev.com/images/programming/design-patterns/observer/obvs_hu_55213fbec80361a.webp"
 alt="Imagen guia del contenido de la página"style="width:400px"/&gt;
 &lt;/div&gt;
 
 
 


&lt;p&gt;En el caso 1, observamos un Objeto &lt;strong&gt;Publisher&lt;/strong&gt; emitiendo valores constantemente, compartidos con todos los &lt;strong&gt;Suscribers&lt;/strong&gt; registrados en su lista. En este ejemplo, no hay suscriptores.&lt;/p&gt;
&lt;p&gt;En el caso 2, dos objetos están suscritos al objeto &lt;strong&gt;Publisher&lt;/strong&gt;, recibiendo el valor emitido en el momento de su emisión.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;El patrón &lt;strong&gt;Observer&lt;/strong&gt; permite relacionar objetos de manera comprensible, eficiente y mantenible. Es una relación &lt;strong&gt;One-to-Many&lt;/strong&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="implementación"&gt;Implementación&lt;/h2&gt;
&lt;p&gt;Implementaremos el patrón observer en Python definiendo dos clases abstractas: &lt;strong&gt;Publisher&lt;/strong&gt; y &lt;strong&gt;Subscriber&lt;/strong&gt;. Luego, crearemos clases derivadas que emitan valores (Publisher) y que se registren para recibir datos (Subscribers).&lt;/p&gt;
&lt;p&gt;Comenzamos con las clases abstractas:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#e06c75"&gt;abc&lt;/span&gt; &lt;span style="color:#c678dd"&gt;import&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ABC&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;abstractmethod&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;Suscriber&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;ABC&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#56b6c2;font-weight:bold"&gt;__init__&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;pass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#61afef"&gt;@abstractmethod&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;update&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;value&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;None&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;raise&lt;/span&gt; &lt;span style="color:#e06c75"&gt;NotImplementedError&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#34;You must implement this method&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;Publisher&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;ABC&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#56b6c2;font-weight:bold"&gt;__init__&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;subscribers&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;list&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;Suscriber&lt;/span&gt;] &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;list&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;add_suscriber&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;subscriber&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;Suscriber&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;subscribers&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;append&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;subscriber&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;remove_suscriber&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;suscriber&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;Suscriber&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;subscribers&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;remove&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;suscriber&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;notify_suscribers&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;value&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;for&lt;/span&gt; &lt;span style="color:#e06c75"&gt;suscriber&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;in&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;subscribers&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En este código, definimos dos clases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Subscriber: Representa a los suscriptores o observadores, exigiendo la implementación del método &lt;strong&gt;&lt;code&gt;update&lt;/code&gt;&lt;/strong&gt;, que recibe el dato actualizado.&lt;/li&gt;
&lt;li&gt;Publisher: Define tres métodos clave: - &lt;strong&gt;add_subscriber&lt;/strong&gt;: Registra un nuevo suscriptor. - &lt;strong&gt;remove_subscriber&lt;/strong&gt;: Elimina un suscriptor específico. - &lt;strong&gt;notify_subscribers&lt;/strong&gt;: Actualiza el valor a todos los suscriptores.&lt;/li&gt;
&lt;/ul&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Este código es una guía sobre cómo funciona el patrón y puede mejorarse según las necesidades de cada proyecto.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Ahora, implementemos este patrón en un ejemplo práctico: un sistema de IoT en casa que mide la radiación ultravioleta. Queremos compartir estos datos con dos sistemas: uno que almacena información para la protección infantil contra los rayos UV y otro para un sistema de riego basado en estas mediciones.&lt;/p&gt;
&lt;p&gt;Implementaremos tres clases:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;UVSolarSystem (Publisher)&lt;/li&gt;
&lt;li&gt;UVTracker (Suscriber)&lt;/li&gt;
&lt;li&gt;UVPlantTracker (Suscriber)&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;UVSolarSystem&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;Publisher&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;emit_value&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;value&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;randint&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;100&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;notify_suscribers&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;value&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;UVTracker&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;Suscriber&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;update&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;value&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;None&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;(&lt;span style="color:#98c379"&gt;f&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;UVTracker: &lt;/span&gt;&lt;span style="color:#98c379"&gt;{&lt;/span&gt;&lt;span style="color:#e06c75"&gt;value&lt;/span&gt;&lt;span style="color:#98c379"&gt;}&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#34;Doing funny stuff with this value :D&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;UVPlantTracker&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;Suscriber&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;update&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;value&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;None&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;(&lt;span style="color:#98c379"&gt;f&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;UVPlantTracker: &lt;/span&gt;&lt;span style="color:#98c379"&gt;{&lt;/span&gt;&lt;span style="color:#e06c75"&gt;value&lt;/span&gt;&lt;span style="color:#98c379"&gt;}&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#34;Doing funny stuff for the plants with this value :D&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En el código, el método &lt;strong&gt;&lt;code&gt;emit_value&lt;/code&gt;&lt;/strong&gt; en UVSolarSystem es personalizado y utiliza &lt;strong&gt;&lt;code&gt;notify_subscribers&lt;/code&gt;&lt;/strong&gt;. Las clases Subscriber implementan el método &lt;strong&gt;&lt;code&gt;update&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Probemos el código:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#34;Stage 1&amp;#34;&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;center&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;50&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#34;=&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;# define the publisher&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;solar_system&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;UVSolarSystem&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;solar_system&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;emit_value&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#34;Stage 2&amp;#34;&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;center&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;50&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#34;=&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;# first suscriber&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;uv_tracker&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;UVTracker&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;solar_system&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;add_suscriber&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;uv_tracker&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;solar_system&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;emit_value&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#34;Stage 3&amp;#34;&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;center&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;50&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#34;=&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;# second suscriber&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;uv_plant_tracker&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;UVPlantTracker&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;solar_system&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;add_suscriber&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;uv_plant_tracker&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;solar_system&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;emit_value&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#34;Stage 4&amp;#34;&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;center&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;50&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#34;=&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;# remove the first suscriber&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;solar_system&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;remove_suscriber&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;uv_tracker&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La salida sería&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; $ python main.py
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;=====================&lt;/span&gt;Stage &lt;span style="color:#e06c75"&gt;1&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;======================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;=====================&lt;/span&gt;Stage &lt;span style="color:#e06c75"&gt;2&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;======================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UVTracker: &lt;span style="color:#d19a66"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Doing funny stuff with this value :D
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;=====================&lt;/span&gt;Stage &lt;span style="color:#e06c75"&gt;3&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;======================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UVTracker: &lt;span style="color:#d19a66"&gt;79&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Doing funny stuff with this value :D
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UVPlantTracker: &lt;span style="color:#d19a66"&gt;79&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Doing funny stuff &lt;span style="color:#c678dd"&gt;for&lt;/span&gt; the plants with this value :D
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;=====================&lt;/span&gt;Stage &lt;span style="color:#e06c75"&gt;4&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;======================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UVPlantTracker: &lt;span style="color:#d19a66"&gt;73&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Podemos mejorar el Publisher inicial agregando la posibilidad de retener el último valor emitido. Esto permite a los suscriptores acceder al valor cuando lo necesiten. El cambio en la clase &lt;strong&gt;&lt;code&gt;Publisher&lt;/code&gt;&lt;/strong&gt; sería:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;PublisherImprove&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;ABC&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#56b6c2;font-weight:bold"&gt;__init__&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;None&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;subscribers&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;list&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;Suscriber&lt;/span&gt;] &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;list&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;_value&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;add_suscriber&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;subscriber&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;Suscriber&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;subscribers&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;append&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;subscriber&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;remove_suscriber&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;suscriber&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;Suscriber&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;subscribers&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;remove&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;suscriber&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;notify_suscribers&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;for&lt;/span&gt; &lt;span style="color:#e06c75"&gt;suscriber&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;in&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;subscribers&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;suscriber&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;update&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;_value&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#61afef"&gt;@property&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;get_value&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;_value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Agregamos el getter &lt;strong&gt;&lt;code&gt;get_value&lt;/code&gt;&lt;/strong&gt; para acceder al valor actual del Publisher, alojado como atributo privado &lt;strong&gt;&lt;code&gt;self._value&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="consideraciones-del-patrón-observador"&gt;*&lt;strong&gt;*Consideraciones del patrón observador**&lt;/strong&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Define una relación one-to-many entre objetos.&lt;/li&gt;
&lt;li&gt;Los observables actualizan a los observadores a través de una interfaz común.&lt;/li&gt;
&lt;li&gt;Cualquier observador puede participar si cumple con la interfaz común.&lt;/li&gt;
&lt;li&gt;Los observadores deben estar desacoplados del observable.&lt;/li&gt;
&lt;li&gt;Es posible acceder a los datos del observable cuando sea necesario, en vez de esperar cada evento.&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>Patrones de Diseño: Estrategia</title><link>https://blog.dacadev.com/programacion/patrones-de-diseno/estrategia/</link><pubDate>Thu, 28 Dec 2023 01:25:17 +0000</pubDate><guid>https://blog.dacadev.com/programacion/patrones-de-diseno/estrategia/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Descubre cómo implementar el Patrón Estrategia en Python con un enfoque práctico en clases de aves, optimizando comportamientos flexibles en tiempo de ejecución</description><media:content url="https://blog.dacadev.com/images/programming/design-patterns/strategy/banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;&lt;/nav&gt;
&lt;/details&gt;





 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;El &lt;strong&gt;patrón estrategia&lt;/strong&gt; define una familia de algoritmos intercambiables, encapsulando cada uno de ellos para que puedan ser usados de manera flexible en tiempo de ejecución.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Este patrón consiste en definir/identificar un conjunto de comportamientos comunes de un objeto y encapsular dichos comportamientos como una familia de algoritmos que, por definición, serán comunes entre ellos. De esta manera, si un objeto hace uso de dichos comportamientos, cada uno de ellos sería reemplazable por alguno de la misma familia.&lt;/p&gt;
&lt;p&gt;Apliquemos el concepto agnóstico y posteriormente lo aplicaremos en código.&lt;/p&gt;
&lt;p&gt;Supongamos que queremos crear un conjunto de clases que estén relacionadas con aves. Cada una de nuestras aves tendrá la capacidad de volar. Para aplicar el patrón estrategia, debemos identificar primero cuáles son esos comportamientos comunes que tienen nuestro conjunto de clases (Aves), para lo cual sería el método de volar, y vamos a encapsular este tipo de comportamiento. Esta idea se ilustra en el siguiente diagrama:&lt;/p&gt;
&lt;pre class="mermaid"&gt;classDiagram
 class Ave {
 +volar()
 }
 class NoVolar {
 ejecutarVuelo()
 }
 class SiVolar {
 ejecutarVuelo()
 }
 ComportamientoVolar &lt;|-- NoVolar
 ComportamientoVolar &lt;|-- SiVolar
 class ComportamientoVolar {
 +ejecutarVuelo()
 }
 Ave &lt;|-- Pato
 Ave &lt;|-- Gallina
 Ave --|&gt; ComportamientoVolar
&lt;/pre&gt;

&lt;p&gt;Para este proceso optaremos por definir las clases abstractas de Aves y del comportamiento de volar, de esta manera podemos crear nuestras diversas clases y estas podrán emplear cualquiera de las clases que implementen la clase base de &lt;code&gt;comportamientoVolar&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Este código implementado en Python se vería de la siguiente manera:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#e06c75"&gt;abc&lt;/span&gt; &lt;span style="color:#c678dd"&gt;import&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ABC&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;abstractclassmethod&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;# Clases abstractas&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;FlightBehavior&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;ABC&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#56b6c2;font-weight:bold"&gt;__init__&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;pass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#61afef"&gt;@abstractclassmethod&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;execute_fly&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;pass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;Bird&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;ABC&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#56b6c2;font-weight:bold"&gt;__init__&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;flys_behavior&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;FlightBehavior&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;flys_behavior&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;flys_behavior&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;fly&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;flys_behavior&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;execute_fly&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;# Cómo utilizarlo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;# 1. Definir las clases que implementan las clases abstractas&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;# Estrategias&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;NoFly&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;FlightBehavior&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#56b6c2;font-weight:bold"&gt;__init__&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;super&lt;/span&gt;()&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#56b6c2;font-weight:bold"&gt;__init__&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;execute_fly&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#34;I can&amp;#39;t fly&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;Fly&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;FlightBehavior&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#56b6c2;font-weight:bold"&gt;__init__&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;super&lt;/span&gt;()&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#56b6c2;font-weight:bold"&gt;__init__&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;execute_fly&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#34;I can fly&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;# Clases que implementan la estrategia&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;Hen&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;Bird&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#56b6c2;font-weight:bold"&gt;__init__&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;flys_behavior&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;FlightBehavior&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;super&lt;/span&gt;()&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#56b6c2;font-weight:bold"&gt;__init__&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;flys_behavior&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#e06c75"&gt;flys_behavior&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;Duck&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;Bird&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#56b6c2;font-weight:bold"&gt;__init__&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;flys_behavior&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;FlightBehavior&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;super&lt;/span&gt;()&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#56b6c2;font-weight:bold"&gt;__init__&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;flys_behavior&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#e06c75"&gt;flys_behavior&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;# 2. Crear los objetos&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;if&lt;/span&gt; &lt;span style="color:#e06c75"&gt;__name__&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;==&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;hen&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Hen&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;NoFly&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;hen&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;fly&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;duck&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Duck&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;Fly&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;duck&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;fly&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Este patrón es útil en situaciones en las que tienes una clase que tiene varios comportamientos y quieres que el comportamiento se seleccione en tiempo de ejecución, según las necesidades de tu aplicación. Por ejemplo, puedes tener una clase que realiza operaciones matemáticas y quieres poder cambiar la operación que realiza en tiempo de ejecución, según las necesidades de la aplicación.&lt;/p&gt;




 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;El patrón estrategia es ideal cuando tienes múltiples algoritmos para una tarea y necesitas cambiar entre ellos de forma dinámica. Piensa en sistemas de pago, algoritmos de ordenamiento o validaciones configurables.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;A continuación, un ejemplo de Python de este caso de cambio de estrategia en tiempo de ejecución:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#e06c75"&gt;abc&lt;/span&gt; &lt;span style="color:#c678dd"&gt;import&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ABC&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;abstractmethod&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;Context&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#56b6c2;font-weight:bold"&gt;__init__&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;strategy&lt;/span&gt;: &lt;span style="color:#98c379"&gt;&amp;#39;Strategy&amp;#39;&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;None&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;_strategy&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;strategy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;execute_strategy&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;x&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;y&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;_strategy&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;execute&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;x&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;y&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;Strategy&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;ABC&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#61afef"&gt;@abstractmethod&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;execute&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;x&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;y&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;pass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;AddStrategy&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;Strategy&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;execute&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;x&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;y&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e06c75"&gt;x&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#e06c75"&gt;y&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;SubtractStrategy&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;Strategy&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;execute&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;self&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;x&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;y&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e06c75"&gt;x&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;-&lt;/span&gt; &lt;span style="color:#e06c75"&gt;y&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;# Uso de las clases&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;context&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Context&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;AddStrategy&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;context&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;execute_strategy&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;10&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;5&lt;/span&gt;)) &lt;span style="color:#7f848e"&gt;# Salida: 15&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;context&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Context&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;SubtractStrategy&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;context&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;execute_strategy&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;10&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;5&lt;/span&gt;)) &lt;span style="color:#7f848e"&gt;# Salida: 5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title>Despliegue su sitio en GitHub Pages con HUGO y dominio personalizado</title><link>https://blog.dacadev.com/programacion/despliega-tu-sitio-de-hugo-en-github-pages/</link><pubDate>Mon, 18 Dec 2023 20:56:15 +0000</pubDate><guid>https://blog.dacadev.com/programacion/despliega-tu-sitio-de-hugo-en-github-pages/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Explora esta guía detallada para desplegar sitios web en GitHub Pages usando HUGO. Aprende a configurar tu sitio, automatizar con GitHub Actions y personalizar tu dominio. Ideal para desarrolladores y creadores de contenido que buscan una solución rápida y efectiva.</description><media:content url="https://blog.dacadev.com/images/programming/tutorials/deploy-hugo-site-in-github-pages/banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#despliegue-paso-a-paso-del-sitio-en-github-pages"&gt;Despliegue paso a paso del sitio en &lt;strong&gt;GitHub&lt;/strong&gt; Pages&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#configura-un-dominio-personalizado-en-github-pages"&gt;Configura un dominio personalizado en &lt;strong&gt;GitHub Pages&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;





 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;En este tutorial aprenderás a desplegar un sitio web creado con &lt;strong&gt;Hugo&lt;/strong&gt; en &lt;strong&gt;GitHub Pages&lt;/strong&gt; en menos de 10 minutos, automatizar el despliegue con &lt;strong&gt;GitHub Actions&lt;/strong&gt; y configurar un dominio personalizado.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;HUGO&lt;/strong&gt; es un generador de sitios estáticos creado en Go, que cuenta con un rendimiento excelente y varias funcionalidades que permiten crear sitios web de manera amigable tanto para desarrolladores como para creadores de contenido.&lt;/p&gt;
&lt;p&gt;Para saber más de la herramienta, puedes remitirte a la documentación en el siguiente &lt;a href="https://gohugo.io/"




 target="_blank"
 


&gt;link&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Para desplegar tu sitio web creado con &lt;strong&gt;HUGO&lt;/strong&gt;, dispones de muchas herramientas, tanto pagas como gratuitas, que te pueden ayudar en este proceso. En este post, vamos a ver cómo podemos desplegar rápidamente nuestro sitio en GitHub Pages en menos de 10 minutos y actualizar el dominio a uno personalizado.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GitHub Pages&lt;/strong&gt; es un servicio que ofrece &lt;strong&gt;GitHub&lt;/strong&gt; para los repositorios públicos o para aquellos usuarios que cuentan con una suscripción pro, sean usuarios personales o empresariales.&lt;/p&gt;
&lt;h2 id="despliegue-paso-a-paso-del-sitio-en-github-pages"&gt;Despliegue paso a paso del sitio en &lt;strong&gt;GitHub&lt;/strong&gt; Pages&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Debes tener un proyecto de HUGO funcional y alojarlo en un repositorio público en &lt;strong&gt;GitHub&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Si quieres que el repositorio sea privado y aún así desplegar tu sitio, es importante contar con la cuenta Pro.&lt;/p&gt;
&lt;p&gt;En la imagen de referencia, estoy usando la página especial de &lt;strong&gt;GitHub Pages&lt;/strong&gt; que coincide con mi nombre de usuario, &lt;a href="https://github.com/dacadev-official"




 target="_blank"
 


&gt;dacadev-official&lt;/a&gt;. Esto significa que cuando despliegue mi sitio, lo harán en la raíz del dominio de mi cuenta, que sería &lt;code&gt;https://dacadev-official.github.io&lt;/code&gt;. Si el nombre fuera diferente, la URL sería &lt;code&gt;https://dacadev-official.github.io/&amp;lt;my-repo-name&amp;gt;&lt;/code&gt;. Es importante tener esto en cuenta ya que si en &lt;strong&gt;HUGO&lt;/strong&gt; estamos usando &lt;code&gt;Permalinks&lt;/code&gt; o &lt;code&gt;relURL&lt;/code&gt; sin tener configurado debidamente nuestro &lt;code&gt;baseurl&lt;/code&gt;, podría generar problemas en los enlaces.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Dentro de nuestro repositorio, nos dirigiremos a la sección de &lt;em&gt;settings &amp;gt; pages&lt;/em&gt; y activaremos la opción de build and deploy con &lt;strong&gt;GitHub Actions&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;El siguiente paso consiste en activar las &lt;strong&gt;GitHub Actions&lt;/strong&gt;. Para ello, debemos crear un archivo dentro del folder &lt;code&gt;.github/workflows&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Las &lt;strong&gt;GitHub Actions&lt;/strong&gt; son una herramienta de automatización integrada en GitHub, que permite ejecutar flujos de trabajo basados en eventos dentro de un repositorio.&lt;/p&gt;
&lt;p&gt;Crearemos el archivo &lt;code&gt;hugo.yaml&lt;/code&gt; dentro del folder mencionado. Puede ser cualquier nombre, pero lo importante es que sea un nombre relacionado o descriptivo de lo que hará. Dentro de este archivo, colocaremos el siguiente contenido.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7f848e"&gt;# Nombre de la acción&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;name&lt;/span&gt;: Deploy Hugo site to Pages
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;# Se activara cuando se haga un push sobre la rama main&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;on&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;push&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;branches&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;# Permisos para que pueda leer el contenido del repo y&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;# pueda escribir sobre la funcionalidad de GitHub Pages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;permissions&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;contents&lt;/span&gt;: read
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;pages&lt;/span&gt;: write
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;id-token&lt;/span&gt;: write
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;# Estara asociado al grupo relacionados con pages y no cancelará&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;# otros procesos que esten en ejecución&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;concurrency&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;group&lt;/span&gt;: &lt;span style="color:#98c379"&gt;&amp;#34;pages&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;cancel-in-progress&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;# Define bash como el encargado de ejecutar los trabajos&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;defaults&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;run&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;shell&lt;/span&gt;: bash
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;# En este apartado define el entorno usado para el workflow&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;jobs&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#7f848e"&gt;# 1 TRABAJO DE CONSTRUCCIÓN DEL SITIO&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;build&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7f848e"&gt;# Entorno&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;runs-on&lt;/span&gt;: ubuntu-latest
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;env&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#7f848e"&gt;# Esta variable permite cambiar facilmente la version de HUGO usada&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;HUGO_VERSION&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0.121.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;steps&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e06c75"&gt;name&lt;/span&gt;: Install Hugo CLI
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;run&lt;/span&gt;: |&lt;span style="color:#98c379"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#98c379"&gt; wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#98c379"&gt; &amp;amp;&amp;amp; sudo dpkg -i ${{ runner.temp }}/hugo.deb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e06c75"&gt;name&lt;/span&gt;: Install Dart Sass
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;run&lt;/span&gt;: sudo snap install dart-sass
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;				&lt;span style="color:#7f848e"&gt;# Prepara el entorno para desplegar las páginas&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e06c75"&gt;name&lt;/span&gt;: Checkout
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;uses&lt;/span&gt;: actions/checkout@v4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;with&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;submodules&lt;/span&gt;: recursive
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;fetch-depth&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e06c75"&gt;name&lt;/span&gt;: Setup Pages
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;id&lt;/span&gt;: pages
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;uses&lt;/span&gt;: actions/configure-pages@v4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e06c75"&gt;name&lt;/span&gt;: Install Node.js dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;run&lt;/span&gt;: &lt;span style="color:#98c379"&gt;&amp;#34;yarn install&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;				&lt;span style="color:#7f848e"&gt;# Configura las variables de entorno de HUGO y procede a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;				&lt;span style="color:#7f848e"&gt;# ejecutar el comando para construir el sitio.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e06c75"&gt;name&lt;/span&gt;: Build with Hugo
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;env&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;HUGO_ENVIRONMENT&lt;/span&gt;: production
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;HUGO_ENV&lt;/span&gt;: production
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;run&lt;/span&gt;: |&lt;span style="color:#98c379"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#98c379"&gt; hugo \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#98c379"&gt; --gc \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#98c379"&gt; --minify \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#98c379"&gt; --baseURL &amp;#34;${{ steps.pages.outputs.base_url }}/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 &lt;span style="color:#7f848e"&gt;# Sube el contenido generado por hugo al directorio de GitHub Pages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			- &lt;span style="color:#e06c75"&gt;name&lt;/span&gt;: Upload artifact
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;uses&lt;/span&gt;: actions/upload-pages-artifact@v2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;with&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;path&lt;/span&gt;: ./public
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7f848e"&gt;# 2 REDESPLIEGA EL SITIO EN GITHUB PAGES CON LOS NUEVOS CAMBIOS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;deploy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;name&lt;/span&gt;: github-pages
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;url&lt;/span&gt;: ${{ steps.deployment.outputs.page_url }}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;runs-on&lt;/span&gt;: ubuntu-latest
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;needs&lt;/span&gt;: build
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;steps&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e06c75"&gt;name&lt;/span&gt;: Deploy to GitHub Pages
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;id&lt;/span&gt;: deployment
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;uses&lt;/span&gt;: actions/deploy-pages@v3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;El siguiente paso es hacer commit con el nuevo archivo agregado, con un mensaje descriptivo, y finalmente hacer push de los cambios a la rama main o la que hayas definido en el archivo .yaml de configuración.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;git commit -m &amp;ldquo;feat: implement github actions to deploy site into GitHub Pages&amp;rdquo;
git push origin main&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Nos dirigiremos a la página de nuestro repositorio y veremos que &lt;strong&gt;GitHub&lt;/strong&gt; ha detectado automáticamente nuestros cambios con las acciones y las ejecutará. Verás algo similar a la siguiente imagen.
Una vez que se completen los workflows correctamente, debes dirigirte a la URL del repositorio, que sería &lt;code&gt;https://&amp;lt;username&amp;gt;.github.io/&amp;lt;repository&amp;gt;&lt;/code&gt;. Recuerda que si tu repositorio tiene el mismo nombre que tu usuario, puedes omitir el &lt;code&gt;&amp;lt;repository&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;En caso de que se genere un error o algo similar debes de revisar los logs de cada paso que enontrarás en el link de details al lado de cada uno de los pasos&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="configura-un-dominio-personalizado-en-github-pages"&gt;Configura un dominio personalizado en &lt;strong&gt;GitHub Pages&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Hasta este punto, hemos configurado y desplegado exitosamente nuestro sitio en &lt;strong&gt;GitHub Pages&lt;/strong&gt;. Ahora, lo que nos falta es configurar nuestro nombre de dominio para que tenga un nombre de nuestra marca o necesidad en cuestión.&lt;/p&gt;
&lt;p&gt;En este ejemplo, hemos usado un dominio adquirido en &lt;a href="https://www.namecheap.com/"




 target="_blank"
 


&gt;Namecheap&lt;/a&gt; que tenemos listo para configurar.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Lo primero que haremos es configurar nuestro dominio dentro de nuestro repositorio. Para ello, nos dirigiremos a settings &amp;gt; pages de nuevo y buscaremos la opción de Custom Domain.&lt;/li&gt;
&lt;li&gt;Dentro del input, agregamos el dominio que queremos agregar.&lt;/li&gt;
&lt;li&gt;El siguiente paso será configurar las direcciones IP a las cuales queremos que apunte nuestro dominio. Para ello, nos dirigiremos al panel de control de Namecheap e iremos a las opciones avanzadas de nuestro dominio.
Las URL listadas son las siguientes:
&lt;ul&gt;
&lt;li&gt;185.199.108.153&lt;/li&gt;
&lt;li&gt;185.199.109.153&lt;/li&gt;
&lt;li&gt;185.199.110.153&lt;/li&gt;
&lt;li&gt;185.199.111.153&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Lo que estamos configurando es lo siguiente:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Registros A&lt;/strong&gt; con la dirección &lt;code&gt;@&lt;/code&gt;, que representa la raíz del dominio, apuntando a cuatro direcciones IP diferentes. Son necesarios para que tu dominio personalizado apunte a los servidores de &lt;strong&gt;GitHub Pages&lt;/strong&gt;. Esto permite que cuando alguien ingrese tu dominio en su navegador, la solicitud sea dirigida a los servidores de GitHub, donde está alojado tu proyecto.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Registro CNAME&lt;/strong&gt; con el host &lt;code&gt;www&lt;/code&gt; y el valor &lt;code&gt;&amp;lt;username&amp;gt;.github.io&lt;/code&gt;., redirige las solicitudes de &lt;code&gt;www.tudominio.com&lt;/code&gt; al subdominio&lt;code&gt; &amp;lt;username&amp;gt;.github.io&lt;/code&gt; en &lt;strong&gt;GitHub&lt;/strong&gt;. Esto es útil si quieres que tanto &lt;code&gt;www.tudominio.com&lt;/code&gt; como &lt;code&gt;tudominio.com&lt;/code&gt; muestren tu proyecto en &lt;strong&gt;GitHub Pages&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ya con esto, tu sitio estaría listo para servir a través de tu dominio personalizado.&lt;/p&gt;




 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Debes esperar un tiempo para que GitHub confirme que el dominio ingresado está configurado correctamente. Normalmente esto puede tomar entre unos minutos hasta 24 horas dependiendo de la propagación DNS.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
</content:encoded></item><item><title>Patrones de diseño: Qué son?</title><link>https://blog.dacadev.com/programacion/patrones-de-diseno/que-son/</link><pubDate>Sat, 02 Dec 2023 00:29:10 +0000</pubDate><guid>https://blog.dacadev.com/programacion/patrones-de-diseno/que-son/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Descubre los patrones de diseño en programación: soluciones clave para retos de software, categorías principales y principios para desarrolladores</description><media:content url="https://blog.dacadev.com/images/programming/design-patterns/what-is/banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#principios-de-diseño"&gt;Principios de diseño&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#qué-no-hacer-al-usar-patrones-de-diseño"&gt;Qué No Hacer al Usar Patrones de Diseño&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;Los patrones de diseño, en general, se pueden definir como soluciones estandarizadas a problemas comunes en el diseño de software. No son fragmentos de código específicos, sino más bien guías o plantillas que se pueden aplicar en diversos contextos de programación.&lt;/p&gt;
&lt;p&gt;Estos patrones son especialmente útiles porque permiten reutilizar conocimientos y enfoques que han sido probados y perfeccionados a lo largo de los años, y proporcionan un punto de partida para tus proyectos de software.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Los patrones de diseño son guías que pueden ser adaptadas para cada propósito específico según se requiera.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Los patrones de diseño se dividen en tres categorías principales:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Patrones Creacionales:&lt;/strong&gt; Estos patrones se relacionan con los procesos de creación de objetos. Su objetivo es abstraer los detalles de la instanciación de clases, haciendo los sistemas más independientes de cómo sus objetos son creados y representados. Dentro de esta categoría encontramos los patrones:
&lt;ul&gt;
&lt;li&gt;Singleton&lt;/li&gt;
&lt;li&gt;Factory Method&lt;/li&gt;
&lt;li&gt;Abstract Factory&lt;/li&gt;
&lt;li&gt;Builder&lt;/li&gt;
&lt;li&gt;Prototype.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Patrones Estructurales:&lt;/strong&gt; Estos patrones se enfocan en cómo las clases y objetos se componen para formar estructuras más grandes. Los patrones estructurales facilitan el diseño al identificar formas sencillas de realizar relaciones entre entidades. Dentro de esta categoría encontramos los patrones:
&lt;ul&gt;
&lt;li&gt;Adapter&lt;/li&gt;
&lt;li&gt;Bridge&lt;/li&gt;
&lt;li&gt;Composite&lt;/li&gt;
&lt;li&gt;Decorator&lt;/li&gt;
&lt;li&gt;Facade&lt;/li&gt;
&lt;li&gt;Flyweight&lt;/li&gt;
&lt;li&gt;Proxy.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Patrones de Comportamiento:&lt;/strong&gt; Estos patrones se centran en la comunicación entre objetos. Son útiles para definir patrones de comunicación entre clases y objetos, haciéndolos más flexibles y eficientes. Encontraremos patrones como:
&lt;ul&gt;
&lt;li&gt;Observer [&lt;a href="https://blog.dacadev.com/programacion/patrones-de-diseno/observador"



 


&gt;&lt;strong&gt;más info&lt;/strong&gt;&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Mediator&lt;/li&gt;
&lt;li&gt;Iterator&lt;/li&gt;
&lt;li&gt;Strategy [&lt;a href="https://blog.dacadev.com/programacion/patrones-de-diseno/estrategia"



 


&gt;&lt;strong&gt;más info&lt;/strong&gt;&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Command&lt;/li&gt;
&lt;li&gt;State&lt;/li&gt;
&lt;li&gt;Visitor.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cada patrón tiene su propio conjunto de reglas y contextos donde es más adecuado. Lo importante es entender que no existe un patrón que sea mejor que los otros en todas las situaciones.&lt;/p&gt;
&lt;h2 id="principios-de-diseño"&gt;Principios de diseño&lt;/h2&gt;
&lt;p&gt;Antes de adentrarte en los patrones de diseño, es buena idea tener unas bases y conceptos iniciales que te ayudarán al momento de estudiar cada uno de los patrones. Estos principios son:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Identifica los aspectos de tu aplicación que pueden cambiar y sepáralos de aquellos que probablemente seguirán igual.&lt;/li&gt;
&lt;li&gt;Programa para una interfaz, no para una implementación. Programar para interfaces significa programar para supertipos.&lt;/li&gt;
&lt;li&gt;Prefiere la composición sobre la herencia en OO. Es decir, si debes escoger entre una u otra, es más flexible y fácil implementar la composición, ya que esta se define a través de interfaces.&lt;/li&gt;
&lt;li&gt;Esfuérzate por lograr diseños con acoplamientos débiles entre objetos que interactúan. Es decir, disminuye al máximo la dependencia entre los objetos de tu aplicación.&lt;/li&gt;
&lt;li&gt;Las clases deben ser abiertas a código nuevo y cerradas a la modificación del mismo. Es decir, se debe evitar modificar lo existente siempre que sea posible.&lt;/li&gt;
&lt;li&gt;Depende de abstracciones, no de clases concretas. Es decir, no utilices una clase como dependencia de otra; en su lugar, usa una clase abstracta o una interfaz&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="qué-no-hacer-al-usar-patrones-de-diseño"&gt;Qué No Hacer al Usar Patrones de Diseño&lt;/h2&gt;
&lt;p&gt;Al momento de estudiar y trabajar con los patrones de diseño, es importante tener en cuenta los siguientes puntos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Conocer las bases de Orientación a Objetos (OO) no te hace un buen diseñador de OO.&lt;/li&gt;
&lt;li&gt;Un buen diseño de OO es reutilizable, extensible y mantenible a lo largo del tiempo.&lt;/li&gt;
&lt;li&gt;Los patrones te muestran cómo construir buenos sistemas usando cualidades de OO.&lt;/li&gt;
&lt;li&gt;Los patrones son experiencias probadas orientadas a objetos.&lt;/li&gt;
&lt;li&gt;Los patrones no te dan código; ellos te dan una solución general a problemas de diseño. Tu objetivo como programador e ingeniero de Software es aplicarlos y adaptarlos a tus casos específicos.&lt;/li&gt;
&lt;li&gt;Los patrones no son inventados, son descubiertos. Tú podrías encontrar otro a lo largo de tu carrera.&lt;/li&gt;
&lt;li&gt;La mayoría de los patrones y principios son capaces de manejar el constante cambio en el software, permitiéndote adaptar tu código a nuevos requerimientos sin grandes refactorizaciones.&lt;/li&gt;
&lt;/ul&gt;




 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;No intentes aplicar todos los patrones de una vez. Empieza por entender el problema que resuelve cada uno y úsalos cuando el contexto lo requiera. La sobreingeniería es tan perjudicial como la falta de diseño.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
</content:encoded></item><item><title>Código Limpio: Escribe nombres significativos</title><link>https://blog.dacadev.com/programacion/codigo-limpio/nombres-significativos/</link><pubDate>Thu, 14 Sep 2023 02:18:24 +0000</pubDate><guid>https://blog.dacadev.com/programacion/codigo-limpio/nombres-significativos/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Aprende a nombrar variables y funciones eficazmente con consejos de 'Código Limpio'. Mejora la legibilidad y mantenimiento de tu código.</description><media:content url="https://blog.dacadev.com/images/programming/clean-code/meaning-names/banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#nombres-significativos"&gt;Nombres significativos&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#transmitir-el-propósito-del-código"&gt;Transmitir el propósito del código&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#sé-explícito-y-puntual"&gt;Sé explícito y puntual&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#variables-similares"&gt;Variables similares&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#nombres-pronunciables"&gt;Nombres pronunciables&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#nombres-fáciles-de-buscar"&gt;Nombres fáciles de buscar&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#no-permitas-los-mapas-mentales"&gt;No permitas los mapas mentales&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#nombres-en-las-clases"&gt;Nombres en las clases&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;Al momento de escribir código, una tarea difícil de la que nadie habla es el hecho de nombrar nuestras variables, funciones, clases, etc. Y si no lo sientes así, déjame contarte por qué es algo a lo que deberías prestarle atención 😉.&lt;/p&gt;
&lt;p&gt;Te voy a compartir algunos consejos que te ayudarán a la hora de definir dichos nombres y el porqué es buena práctica. Dentro de estos consejos encontramos&amp;hellip;&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;🚀 El contenido de este post está basado en las enseñanzas del libro &amp;ldquo;Código Limpio&amp;rdquo; y lo que he aprendido a lo largo de mi carrera como programador.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="nombres-significativos"&gt;Nombres significativos&lt;/h3&gt;
&lt;p&gt;Los nombres deben transmitir claramente cuál es el propósito del código, es decir, que con el hecho de leer la variable o función, se debe entender qué contiene.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;// Incorrecto
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;const&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt;[] &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; [];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;// Correcto
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;const&lt;/span&gt; &lt;span style="color:#e06c75"&gt;users&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt;[] &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; [];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En el ejemplo anterior podemos ver que en la primera parte estamos definiendo nombres aleatorios para nuestro código lo cual no nos dice nada y en dado caso debemos leer más a fondo el código para entender qué es lo que hace, mientras que en la segunda parte podemos ver claramente que la variable será un arreglo de usuarios.&lt;/p&gt;
&lt;h3 id="transmitir-el-propósito-del-código"&gt;Transmitir el propósito del código&lt;/h3&gt;
&lt;p&gt;Los nombres deben transmitir claramente cuál es la intención o uso del código. Por ejemplo, en el siguiente ejemplo podemos ver que en la primera parte el nombre no nos dice nada sobre lo que hace la función, mientras que en la segunda parte podemos ver que el nombre nos dice claramente que dicha función escribirá &lt;code&gt;Hello World&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;// Incorrecto
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;function&lt;/span&gt; &lt;span style="color:#e06c75"&gt;foo&lt;/span&gt;()&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#c678dd"&gt;void&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;console&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;log&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#34;Hello World&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;// Correcto
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;function&lt;/span&gt; &lt;span style="color:#e06c75"&gt;printHelloWorld&lt;/span&gt;()&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#c678dd"&gt;void&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;console&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;log&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#34;Hello World&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;🚀 Incluso podemos mejorar el nombre de la función &lt;code&gt;printHelloWorld&lt;/code&gt; a &lt;code&gt;printHelloWorldToConsole&lt;/code&gt; para ser más explícitos.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="sé-explícito-y-puntual"&gt;Sé explícito y puntual&lt;/h3&gt;
&lt;p&gt;Los nombres que des dentro de tu código deben ser explícitos, esto significa que deben ser claros al transmitir información, esto ya lo mencioné, pero no caigas en hacerlo en exceso. Observa el siguiente ejemplo.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;// Incorrecto
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;const&lt;/span&gt; &lt;span style="color:#e06c75"&gt;usersStringNameArray&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt;[] &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; [&lt;span style="color:#98c379"&gt;&amp;#34;John&amp;#34;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#34;Mary&amp;#34;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#34;Sam&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;// Correcto
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;const&lt;/span&gt; &lt;span style="color:#e06c75"&gt;userNames&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt;[] &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; [&lt;span style="color:#98c379"&gt;&amp;#34;John&amp;#34;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#34;Mary&amp;#34;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#34;Sam&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En el ejemplo observamos que estamos repitiendo información que ya nos brinda el tipado, como por ejemplo nombrar que es un arreglo de &lt;code&gt;strings&lt;/code&gt;, lo que termina siendo redundante ya que el tipo de dato está implícito en el tipado &lt;code&gt;string[]&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="variables-similares"&gt;Variables similares&lt;/h3&gt;
&lt;p&gt;Habrá casos en donde tengas variables cuyo comportamiento es similar o que hagan referencia a un mismo valor y puede ser difícil nombrarlas. Usa nombres que realmente distingan la funcionalidad de dicha variable y cuál es su objetivo, como en el siguiente código:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;// Incorrecto
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;function&lt;/span&gt; &lt;span style="color:#e06c75"&gt;copyChars&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;a1&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt;[], &lt;span style="color:#e06c75"&gt;a2&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt;[])&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#c678dd"&gt;void&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;for&lt;/span&gt; (&lt;span style="color:#c678dd"&gt;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;i&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;; &lt;span style="color:#e06c75"&gt;i&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a1&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;length&lt;/span&gt;; &lt;span style="color:#e06c75"&gt;i&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;a2&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;i&lt;/span&gt;] &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a1&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;i&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;// Correcto
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;function&lt;/span&gt; &lt;span style="color:#e06c75"&gt;copyChars&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;source&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt;[], &lt;span style="color:#e06c75"&gt;destination&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt;[])&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#c678dd"&gt;void&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;for&lt;/span&gt; (&lt;span style="color:#c678dd"&gt;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;i&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;; &lt;span style="color:#e06c75"&gt;i&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;source&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;length&lt;/span&gt;; &lt;span style="color:#e06c75"&gt;i&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;destination&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;i&lt;/span&gt;] &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;source&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;i&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Para el ejemplo anterior, podemos observar que el uso de &lt;code&gt;source&lt;/code&gt; y &lt;code&gt;destination&lt;/code&gt; en lugar de &lt;code&gt;a1&lt;/code&gt; y &lt;code&gt;a2&lt;/code&gt; transmite claramente la funcionalidad de cada variable a pesar de ser similares.&lt;/p&gt;
&lt;h3 id="nombres-pronunciables"&gt;Nombres pronunciables&lt;/h3&gt;
&lt;p&gt;Usa nombres que sean pronunciables y que estén relacionados con el lenguaje que se esté usando al momento de escribir código. De esta manera, al leer el código no tendrás que hacer mapas mentales de los nombres.&lt;/p&gt;
&lt;h3 id="nombres-fáciles-de-buscar"&gt;Nombres fáciles de buscar&lt;/h3&gt;
&lt;p&gt;En concordancia con el punto anterior, además de tener nombres pronunciables, también piensa en que sean fáciles de buscar dentro del código o incluso dentro del proyecto.&lt;/p&gt;
&lt;p&gt;Intenta evitar el uso de variables sencillas como a, además de que no transmiten nada, encontrarlas es difícil. ¿Cuántas palabras no tienen una &amp;lsquo;a&amp;rsquo;? 🙃&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;🚀 Solo en casos en donde la variable se use una vez en códigos pequeños, como ciclos &lt;code&gt;for&lt;/code&gt;, podemos optar por usar variables simples como &lt;code&gt;e&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;for&lt;/span&gt; (&lt;span style="color:#c678dd"&gt;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;j&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;; &lt;span style="color:#e06c75"&gt;j&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#d19a66"&gt;34&lt;/span&gt;; &lt;span style="color:#e06c75"&gt;j&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;s&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;+=&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;t&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;j&lt;/span&gt;] &lt;span style="color:#56b6c2"&gt;*&lt;/span&gt; &lt;span style="color:#d19a66"&gt;4&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;/&lt;/span&gt; &lt;span style="color:#d19a66"&gt;5&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="no-permitas-los-mapas-mentales"&gt;No permitas los mapas mentales&lt;/h3&gt;
&lt;p&gt;Cuando nos referimos a mapas mentales del código, estamos pensando en los demás (inclusive en tu yo del futuro). Cuando estás leyendo código y empiezas a crear mapas en tu cabeza con las relaciones de cada nombre de variable, función, etc., estás agregando una tarea adicional e innecesaria porque en sí tienes que entender el código y ahora tener ese mapa de nombres en la cabeza. ¿Imagínate si tienes muchas variables o nombres?&lt;/p&gt;
&lt;p&gt;Para evitar esto, no uses nombres simples como &lt;code&gt;i&lt;/code&gt;, &lt;code&gt;j&lt;/code&gt; (muy común en ciclos for) o &lt;code&gt;r&lt;/code&gt; para decir &lt;code&gt;url&lt;/code&gt; o &lt;code&gt;response&lt;/code&gt;. Simplemente coloca el nombre que corresponde.&lt;/p&gt;
&lt;h3 id="nombres-en-las-clases"&gt;Nombres en las clases&lt;/h3&gt;
&lt;p&gt;Además de los consejos ya presentados, en las clases debemos tener en cuenta también otros casos para escribir código entendible y mantenible. Ten en cuenta estas consideraciones:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Las clases deben tener nombres sustantivos y NO verbales o de acciones. Un sustantivo es una palabra que se utiliza para nombrar personas, animales, cosas, lugares o ideas.&lt;/li&gt;
&lt;li&gt;Los métodos de las clases deben tener nombres que hagan referencia a verbos o frases verbales, como &lt;code&gt;postPayment&lt;/code&gt;, &lt;code&gt;deletePage&lt;/code&gt; o &lt;code&gt;save&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Los accesores, mutadores, getters o setters deben ser nombrados según su valor y llevar el prefijo &lt;code&gt;get/set&lt;/code&gt; e &lt;code&gt;is&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Define una forma de nombrar las acciones y aférrate a ella. Por ejemplo, si usas get, no uses &lt;code&gt;fetch&lt;/code&gt; en otros. De esta manera mantienes la consistencia a través del código y/o proyecto.&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item></channel></rss>