<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ SQL - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Descubre miles de cursos de programación escritos por expertos. Aprende Desarrollo Web, Ciencia de Datos, DevOps, Seguridad y obtén asesoramiento profesional para desarrolladores. ]]>
        </description>
        <link>https://www.freecodecamp.org/espanol/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ SQL - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/espanol/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Wed, 13 May 2026 20:04:27 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/espanol/news/tag/sql/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Aprende SQL - Curso desde cero en español ]]>
                </title>
                <description>
                    <![CDATA[ SQL (Structured Query Language) es el lenguaje estándar para gestionar y manipular datos almacenados en bases de datos relacionales. Es la herramienta esencial que te permite comunicarte con las bases de datos que impulsan las aplicaciones modernas. Acabamos de publicar un curso en el canal de YouTube de freeCodeCamp en ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/aprende-sql-curso-desde-cero-en-espanol/</link>
                <guid isPermaLink="false">69b88053633d5f04fc668404</guid>
                
                    <category>
                        <![CDATA[ SQL ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Estefania Cassingena Navone ]]>
                </dc:creator>
                <pubDate>Thu, 26 Mar 2026 04:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2026/03/Thumbnail-A.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>SQL (Structured Query Language) es el lenguaje estándar para gestionar y manipular datos almacenados en bases de datos relacionales. Es la herramienta esencial que te permite comunicarte con las bases de datos que impulsan las aplicaciones modernas.</p><p>Acabamos de publicar un curso en el canal de YouTube de freeCodeCamp en español que te guiará paso a paso a través de los fundamentos de SQL. Aprenderás los conceptos básicos que necesitas para comenzar y crearás dos proyectos.</p><p>El curso fue creado por Sergie Code. Sergie es ingeniero de software y creador de contenido a quien le encanta enseñar y compartir sus conocimientos. Su trabajo se centra en JavaScript, incluyendo React.js, Angular.js y otros frameworks.</p><p>Antes de adentrarnos en el contenido del curso, veamos qué es SQL y por qué deberías aprenderlo.</p><p>Los datos están en todas partes. Las plataformas y organizaciones modernas dependen de las bases de datos todos los días. Cada vez que inicias sesión en un sitio web, estás utilizando el poder de las bases de datos. Al dominar SQL, podrás extraer información valiosa a partir de los datos almacenados, una habilidad que es muy valorada en la ingeniería de software, la ciencia de datos y en los negocios.</p><p>SQL es un lenguaje especializado diseñado para gestionar datos almacenados en bases de datos relacionales. Con SQL, puedes crear bases de datos, definir su estructura y realizar operaciones clave como crear, insertar, actualizar y eliminar registros. Una de sus características principales es que te permite acceder a los datos a través de consultas (queries) para encontrar de forma eficiente los datos exactos que tú o tu aplicación necesitan.</p><h2 id="curso-de-sql-en-espa-ol"><strong>Curso de SQL en español</strong></h2><p>Genial. Ahora que ya sabes más sobre SQL, veamos lo que aprenderás durante el curso:</p><ul><li>Introducción a SQL y bases de datos.</li><li>SQL vs. MySQL, PostgreSQL y SQL Server.</li><li>Jerarquía de bases de datos relacionales.</li><li>DBngin y TablePlus.</li><li>Lenguaje de Definición de Datos (DDL): CREATE, DROP, ALTER y DESCRIBE.</li><li>Trabajo con tablas, atributos y restricciones.</li><li>Claves foráneas y relaciones entre tablas.</li><li>Lenguaje de Manipulación de Datos (DML): INSERT, UPDATE, DELETE y TRUNCATE.</li><li>Lenguaje de Consulta de Datos (DQL): SELECT, WHERE y ORDER BY.</li><li>Funciones de agregación (COUNT, SUM, AVG).</li><li>INNER JOIN, LEFT JOIN, RIGHT JOIN, y Joins de 3 tablas.</li><li>Subconsultas, GROUP BY y HAVING.</li><li>Gestión de SQL con Docker y variables de entorno.</li><li>Buenas prácticas y ejemplos prácticos.</li></ul><p>Al final del curso, conocerás los fundamentos de SQL y podrás comenzar a crear y gestionar tus propias bases de datos relacionales.</p><p>Te invitamos a ver el curso en el canal de YouTube de freeCodeCamp.org en español:</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.49999999999999%;" class="fluid-width-video-wrapper">
            <iframe width="200" height="113" src="https://www.youtube.com/embed/6JBsoPOwPew?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" title="Aprende SQL - Curso desde cero con MySQL, PostgreSQL, Backend y Docker" name="fitvid0"></iframe>
          </div>
        </div>
      </figure><p>✍️ Curso creado por Sergie Code.</p><ul><li>Youtube: <a href="https://www.youtube.com/@SergieCode">@SergieCode</a></li><li>Instagram: <a href="https://www.instagram.com/sergiecode">sergiecode</a></li><li>LinkedIn: <a href="https://www.linkedin.com/in/sergiecode/">Sergie Code</a></li><li>GitHub: <a href="https://github.com/sergiecode">sergiecode</a></li><li>Facebook: <a href="https://www.facebook.com/sergiecodeok">sergiecodeok</a></li><li>TikTok: <a href="https://www.tiktok.com/@sergiecode">@sergiecode</a></li><li>Twitter: <a href="https://twitter.com/sergiecode">@sergiecode</a></li><li>Threads: <a href="https://www.threads.net/@sergiecode">@sergiecode</a></li></ul> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Aprende SQL – Cursos gratis de Bases de Datos Relacionales para principiantes ]]>
                </title>
                <description>
                    <![CDATA[ SQL (Structured Query Language) es un lenguaje de programación popular, utilizado para bases de datos relacionales y  existen muchos recursos gratis muy buenos que puedes usar para aprenderlo. En este artículo, te compartiré 8 cursos gratis para principiantes con los que podrás aprender SQL, PostgreSQL y MySQL. Cursos gratis de ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/learn-sql-free-relational-database-courses-for-beginners/</link>
                <guid isPermaLink="false">667c69027f03e8043199af37</guid>
                
                    <category>
                        <![CDATA[ SQL ]]>
                    </category>
                
                    <category>
                        <![CDATA[ base de datos ]]>
                    </category>
                
                    <category>
                        <![CDATA[ base de datos relacionales ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Franciscomelov ]]>
                </dc:creator>
                <pubDate>Thu, 04 Jul 2024 19:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/06/caspar-camille-rubin-fPkvU7RDmCo-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/learn-sql-free-relational-database-courses-for-beginners/#relational-database-freecodecamp-curriculum" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Learn SQL – Free Relational Database Courses for Beginners</a>
      </p><p>SQL (Structured Query Language) es un lenguaje de programación popular, utilizado para bases de datos relacionales y &nbsp;existen muchos recursos gratis muy buenos que puedes usar para aprenderlo.</p><p>En este artículo, te compartiré 8 cursos gratis para principiantes con los que podrás aprender SQL, PostgreSQL y MySQL.</p><h2 id="cursos-gratis-de-sql">Cursos gratis de SQL</h2><ol><li><a href="#curso-bd-freecodecamp">Relational Database Curriculum</a> (freeCodeCamp)</li><li><a href="#sql-tutorial">SQL Tutorial - Full Database Course for Beginners</a> (freeCodeCamp)</li><li><a href="#aprender-sql-60min">Learn SQL In 60 Minutes</a> (Web Dev Simplified)</li><li><a href="#tutorial-sql-principiantes">SQL For Beginners Tutorial</a> (Amigoscode)</li><li><a href="#bd-mysql-curso-completo">MySQL Database - Full Course</a> (freeCodeCamp)</li><li><a href="#tutorial-mysql">MySQL Tutorial for Beginners - Full Course</a> (Programming with Mosh)</li><li><a href="#curso-intensivo-mysql">MySQL Crash Course | Learn SQL</a> (Traversy Media)</li><li><a href="#sql-ciencias-datos">SQL for Data Science</a> (UC Davis)</li></ol><!--kg-card-begin: html--><h2 id="curso-bd-freecodecamp">Curso de Bases de Datos Relacionales de freeCodeCamp</h2><!--kg-card-end: html--><p>En septiembre de 2021, freeCodeCamp lanzó la <a href="https://www.freecodecamp.org/news/how-to-run-freecodecamps-relational-databases-curriculum-using-docker-vscode-and-coderoad/">versión beta</a> de su curso de Bases de datos relacionales. Esta versión beta corre completamente en Visual Studio Code utilizando Docker y la extensión CodeRoad.</p><p>En este curso aprenderás acerca de Git, GitHub, Bash, Nano, SQL, PostgreSQL y mucho más. Este es un curso completamente basado en proyectos.</p><p>Algunos de los proyectos que construirás son, una base de datos de Mario, una base de datos mundial, una base de datos de cuerpos celestes y una tienda de renta de bicicletas.</p><p>Para aprender más, puedes leer <a href="https://www.freecodecamp.org/news/how-to-run-freecodecamps-relational-databases-curriculum-using-docker-vscode-and-coderoad/">este artículo</a> de Tom Mondloch, creador del curso.</p><!--kg-card-begin: html--><h2 id="sql-tutorial">Tutorial de SQL- Curso completo de bases de datos para principiantes</h2><!--kg-card-end: html--><p>En este<a href="https://www.youtube.com/watch?v=HXV3zeQKqGY"> curso de freeCodeCamp en YouTube</a>, Mike Dane, te enseñará las bases de SQL. Aprenderás sobre cómo crear tablas, insertar datos, comodines, uniones y mucho más.</p><p>En este curso, aprenderás cómo instalar MySQL en tu Mac o computadora Windows. También practicarás tus habilidades en SQL al construir la base de datos de una compañía y un diagrama entidad-relación</p><p>Si te gusta este curso de Mike Dace, puedes visitar su <a href="https://www.youtube.com/c/GiraffeAcademy/videos">canal de YouTube</a>, para más cursos gratis.</p><!--kg-card-begin: html--><h2 id="aprender-sql-60min">Aprende SQL en 60 minutos</h2><!--kg-card-end: html--><p>En este <a href="https://www.youtube.com/watch?v=p3qvj9hO_Bo">curso de Desarrollo Web en YouTube</a>, Kyle te enseñará las bases para empezar con SQL. Aprenderás a crear de tablas, insertar datos a tablas, llaves primarias, llaves foráneas, agregar funciones y más.</p><p>Este es un gran curso que te servirá de introducción, a partir de aquí podrás crear tus propios proyectos usando SQL.</p><!--kg-card-begin: html--><h2 id="tutorial-sql-principiantes">Tutorial de SQL para principiantes</h2><!--kg-card-end: html--><p>En este <a href="https://www.youtube.com/watch?v=5hzZtqCNQKk">curso de Amigoscode en YouTube</a>, Nelson te enseñará como configurar PostgreSQL en Mac y Windows. También aprenderás las bases de SQL, incluyendo, la creación de tablas, llaves primarias, llaves foráneas, agregar funciones y más.</p><p>Si disfrutas este curso gratis en YouTube de Nelson, puedes ver sus otros cursos en su <a href="https://www.youtube.com/c/amigoscode/videos">canal</a> o visitar su <a href="https://amigoscode.com/">sitio web</a> para ver sus cursos de pago.</p><!--kg-card-begin: html--><h2 id="bd-mysql-curso-completo">Base De Datos Con MySQL - Curso Completo</h2><!--kg-card-end: html--><p>En este <a href="https://www.youtube.com/watch?v=ER8oKX5myE0">curso gratis de freeCodeCamp en YouTube</a>, Bharath te enseñará cómo instalar MySQL en tu máquina local. Aprenderás como crear tablas, insertar datos en tablas, hacer modelado de datos, bloquear, a usar SQL Explain y mucho más.</p><p>Bharath también ofrece recursos útiles para acompañar el curso, como una<a href="https://docs.google.com/document/d/1tDPgLoE1SakXJlwBF283nG12iUaBVy-OngmFaC4KHbI/edit"> guía de inicio</a> y un r<a href="https://github.com/jmbharathram/executeoncommand/tree/master/mysql">epositorio en GitHub</a> con los códigos MySQL.</p><p>Si disfrutas este curso, puedes visitar más cursos en su <a href="https://www.youtube.com/channel/UCwfA8RML42R-a65NRA4MQ2A">canal de YouTube</a>.</p><!--kg-card-begin: html--><h2 id="tutorial-mysql">Tutorial MySQL para Principiantes - Curso Completo</h2><!--kg-card-end: html--><p>En este <a href="https://www.youtube.com/watch?v=7S_tz1z_5bA">curso de Programming with Mosh en YouTube</a>, Mosh te enseñará como instalar MySQL en Mac o Windows. Aprenderás acerca de, crear tablas, insertar datos en tablas, uniones, operadores, cláusulas SQL, operadores SQL y más.</p><p>Si disfrutas este curso de Mosh, puedes visitar su <a href="https://www.youtube.com/channel/UCWv7vMbMWH4-V0ZXdmDpPBA">canal de YouTube</a> o visitar su <a href="https://codewithmosh.com/">sitio web</a> para ver sus cursos de pago.</p><!--kg-card-begin: html--><h2 id="curso-intensivo-mysql">Curso intensivo de MySQL | Aprende SQL</h2><!--kg-card-end: html--><p>En este <a href="https://www.youtube.com/watch?v=9ylj9NR0Lcg">curso de Traversy Media en YouTube</a>, Brad te enseñará las bases para empezar con SQL, aprenderás a crear tablas, insertar datos en tablas, modificar tablas, llaves primarias, llaves foráneas, agregar funciones y más.</p><p>Esta es una gran introducción para comenzar a aprender lo básico. A partir de aquí podrás comenzar a construir tus primeros proyectos usando MySQL.</p><p>Brad también incluye un <a href="https://gist.github.com/bradtraversy/c831baaad44343cc945e76c2e30927b3">acordeón de MySQL</a> en el curso.</p><!--kg-card-begin: html--><h2 id="sql-ciencias-datos">SQL para Ciencias de Datos</h2><!--kg-card-end: html--><p>En este <a href="https://www.coursera.org/learn/sql-for-data-science?specialization=learn-sql-basics-data-science">curso de UC Davis</a>, aprenderás las bases para usar SQL en un contexto de Ciencias de Datos, aprenderás a como crear tablas, insertar datos en tablas, llaves primarias, llaves foráneas, agregar funciones, uniones, sub-consultas y más.</p><p>Este curso es de acceso gratis en Coursera y es parte de la <a href="https://www.coursera.org/specializations/learn-sql-basics-data-science">especialización, aprende las bases de SQL para Ciencias de Datos</a>.</p><p>Si te interesa continuar con esta especialización, te sugiero mirar los otros tres cursos ofrecidos después de este curso introductorio.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Consultando bases de datos relacionales: Funciones de Agregado en SQL: Cómo Usar GROUP BY con COUNT, SUM, AVG, MAX, MIN y Más ]]>
                </title>
                <description>
                    <![CDATA[ El mundo de las bases de datos relacionales o bases de datos SQL es maravilloso, sólo que a veces nos puede resultar complejo, por no tener conocimiento de todas las herramientas que tenemos a disposición. Hagamos un repaso rápido de que es una base de datos y sus tipos. Una ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/funciones-de-agregado-en-sql-como-usar-sum-avg-max-min-y-mas/</link>
                <guid isPermaLink="false">6551fad4bcc2a003e70e2406</guid>
                
                    <category>
                        <![CDATA[ SQL ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Leonardo José Castillo Lacruz ]]>
                </dc:creator>
                <pubDate>Fri, 24 Nov 2023 01:26:13 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/11/A5K5Id6BHKIj_2560_1440.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>El mundo de las bases de datos relacionales o bases de datos SQL es maravilloso, sólo que a veces nos puede resultar complejo, por no tener conocimiento de todas las herramientas que tenemos a disposición.</p><p>Hagamos un repaso rápido de que es una base de datos y sus tipos. Una base de datos es una herramienta que nos permite almacenar datos de forma permanente. Existen 2 tipos de bases de datos que difieren en su forma de almacenar y recuperar los datos pero cumplen el objetivo anteriormente descrito, veamos un poco en detalle esto.</p><h2 id="tipos-de-bases-de-datos-">Tipos de bases de datos:</h2><ul><li><em>Relacionales o SQL</em>. Los datos se almacenan en tablas y campos, donde una tabla puede tener múltiples campos y estos campos almacenan un dato, que puede ser cadena de caracteres, textos (cadenas con más de 255 caracteres), números (enteros y decimales), fecha, fecha y hora, datos binarios. Cada herramientas de gestión de base de datos SQL puede tener algunos tipos de campos adicionales. </li><li><em>NoSQL o no solo SQL.</em> Los datos se van a almacenar de acuerdo a como la herramienta lo implemente, siendo las más usadas: colecciones y documentos, par registros de la forma llave-valor, columnas anchas (donde se generan tablas y campos pero con la ventaja de cada registro puede tener diferentes campos), grafos. </li></ul><p>De acuerdo la necesidad que se tenga, se selecciona el tipo de base de datos a utilizar. Nuestro foco en este artículo es el de las bases de datos relacionales o SQL. Para ello vamos a partir de un ejemplo que tenemos pre-construido, donde la base de datos posee 3 tablas, relacionadas entre sí, de acuerdo con el siguiente módelo: entidad-relación (es el modelo usado por excelencia para representar bases de datos SQL):</p><h3 id="base-de-datos-de-ejemplo-">Base de datos de ejemplo:</h3><p>En nuestro caso partimos de una base de datos que simula un sistema de gestión de tickets o turnos, que está compuesto de 3 tablas, que representan las 3 entidades envueltas:</p><ul><li><em>users</em>, es la tabla que nos permite representar los usuarios o clientes que van a solicitar turnos o tickets.</li><li><em>stores</em>, almacena los datos de las tiendas o comercios que ofrecen los servicios y que desean tener control de los turnos o tickets de sus clientes.</li><li><em>tickets</em>, tabla que almacena los turnos o tickets de los clientes en las tiendas o comercios.</li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/11/image-2.png" class="kg-image" alt="image-2" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2023/11/image-2.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2023/11/image-2.png 659w" width="659" height="390" loading="lazy"><figcaption>Modelo entidad-relación de una base de datos de ejemplo</figcaption></figure><p>De acuerdo al modelo anterior, podemos entender que un usuario (registro en la tabla users) puede tener n turnos, en este caso hablamos de una relación <em>1 -&gt; N</em>, luego podemos observar que una tienda (registro en la tabla stores) va a disponer o habilitar n turnos, entonces la relación será de la misma forma: <em>1 -&gt; N</em>. Luego es posible observar que un usuario va a n turnos en n tiendas, por lo tanto la relación de usuarios con tiendas será <em>N -&gt; M.</em> </p><p>Puedes obtener la base de datos de ejemplo para práctica en el siguiente link:<br><a href="https://github.com/ljcl79/practica-joins">https://github.com/ljcl79/practica-joins</a></p><h2 id="como-realizar-consultas-sobre-una-base-de-datos-sql"><strong>Como realizar consultas sobre una base de datos SQL</strong></h2><p>Para realizar una consulta sobre una base de datos SQL, recordemos que usamos el comando <code>SELECT</code>, el cual nos retorna los campos de los registros que cumplan la condición de búsqueda. La anatomía de un <code>SELECT</code> sigue a continuación:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/11/image-3.png" class="kg-image" alt="image-3" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2023/11/image-3.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2023/11/image-3.png 903w" sizes="(min-width: 720px) 720px" width="903" height="285" loading="lazy"></figure><p>En este video podrás encontrar un mejor detalle de como realizar consultas básicas, hacemos uso de la misma base de datos del documento actual.</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.49999999999999%;" class="fluid-width-video-wrapper">
            <iframe width="200" height="113" src="https://www.youtube.com/embed/oRiZ5OHCjx8?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" title="Dominando SQL: Cómo usar SELECT en 1, 2 y 3 tablas con filtros WHERE" name="fitvid0"></iframe>
          </div>
        </div>
      </figure><p>Con el contexto anterior, podemos avanzar un nivel en cuanto a consultas de base de datos SQL, es el uso de JOINs. Los JOINs nos permites relacionar tablas por campos, que generalmente corresponden a campos que identifican registros en la tabla principal y referencia a un campo en la tabla destino. </p><p>Por ejemplo en el modelo que estamos usando como ejemplo, tenemos las relaciones indicadas anteriormente:</p><ul><li>Tabla <code>users</code> por el campo <code>id</code> está relacionado con la tabla <code>tickets</code> por el campo <code>user_id</code>.</li><li>Tabla <code>stores</code> por el campo <code>id</code> está relacionado con la tabla <code>tickets</code> por el campo <code>store_id</code></li></ul><p>Ahora pensemos en como hacer una consulta que relacione las tablas, ejemplo, saber que usuarios tienen turnos, ya sea realizados o agendados. Para ello podemos aplicar el uso de JOIN, en este caso veamos la siguiente figura:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/11/image-4.png" class="kg-image" alt="image-4" width="426" height="247" loading="lazy"><figcaption>JOINs visualizado a partir de la herramienta: https://sql-joins.leopard.in.ua/</figcaption></figure><p>En el caso anterior la tabla A será la tabla <code>users</code> y la tabla B será la tabla <code>tickets</code>, la consulta a ejecutar para obtener que usuarios tienen turnos, como indicamos anteriormente será:</p><pre><code class="language-SQL">SELECT * FROM users A INNER JOIN tickets B ON A.id = B.user_id;</code></pre><p>Observando la gráfica podemos obtener los distintos tipos de JOINs que SQL permite realizar:</p><p><em>INNER JOIN</em></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/11/image-4.png" class="kg-image" alt="image-4" width="426" height="247" loading="lazy"><figcaption>Tomado de: https://sql-joins.leopard.in.ua/</figcaption></figure><p><em>LEFT JOIN</em></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/11/image-5.png" class="kg-image" alt="image-5" width="426" height="247" loading="lazy"><figcaption>Tomado de: https://sql-joins.leopard.in.ua/</figcaption></figure><p><em>RIGHT JOIN</em></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/11/image-6.png" class="kg-image" alt="image-6" width="426" height="247" loading="lazy"><figcaption>Tomado de: https://sql-joins.leopard.in.ua/</figcaption></figure><p><em>FULL JOIN</em></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/11/image-7.png" class="kg-image" alt="image-7" width="426" height="247" loading="lazy"></figure><p>Para profundizar sobre el tema de JOINs puedes acceder a este artículo de freeCodeCamp.org en español: <a href="https://www.freecodecamp.org/espanol/news/tutorial-de-uniones-en-sql/">https://www.freecodecamp.org/espanol/news/tutorial-de-uniones-en-sql/</a>.</p><p>De igual forma, en el siguiente video podrás entrar en detalle de como realizar consultas usando JOINs.</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.49999999999999%;" class="fluid-width-video-wrapper">
            <iframe width="200" height="113" src="https://www.youtube.com/embed/6wWjiWjb2dU?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" title="🎯 Domina los JOINs en SQL: Práctica con un Sistema de Turnos | Tutorial Completo 🎯" name="fitvid1"></iframe>
          </div>
        </div>
      </figure><h2 id="consultas-a-realizar">Consultas a realizar</h2><p>Con el modelo anterior indicado, pensemos en algunas consultas que serán interesantes realizar:</p><ul><li>Cantidad de usuarios con ticket por día en un periodo</li><li>Promedio de turnos por día en un periodo</li><li>Cantidad de turnos mayor o menor por dia.</li><li>Cantidad de turnos ejecutados mayor o menor por dia.</li><li>Cantidad de turnos por Tienda por día en un periodo</li><li>Top 10 de las tiendas con mayor cantidad de turnos ejecutados.</li></ul><p>Todas las consultas anteriores tienen un elemento en común, es que necesitan agruparse para poder hacer las operaciones de cálculo, para ello, SQL tiene un palabra reservada que podemos ejecutar en nuestras queries: <code>GROUP BY</code>, que adicionalmente se puede filtrar usando la palabra reserva <code>HAVING</code>.</p><p>Además de ello, de las consultas podemos entender que debemos conseguir el valor mayor, el valor menor, el promedio por ejemplo, todo lo anterior se denomina, funciones de agregado, veamos esto en detalle.</p><h3 id="agrupando-los-resultados-por-campos">Agrupando los resultados por campos</h3><p>Cuando realizamos una consulta, podemos definir que los resultados se agrupen por los valores de un campo, de esta forma, luego podemos obtener valores como conteo, suma o promedio de valores, incluso obtener el mayor o el menor valor de un campo . Adicionalmente cuando agrupamos podemos filtrar esos resultados agrupados aplicando los criterios anteriomente indicados (conteo, suma, etc);</p><p>Anatamía de un <code>GROUP BY</code> con <code>HAVING</code>:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/11/image-11.png" class="kg-image" alt="image-11" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2023/11/image-11.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2023/11/image-11.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2023/11/image-11.png 1116w" sizes="(min-width: 720px) 720px" width="1116" height="206" loading="lazy"></figure><h3 id="ordenando-los-resultados">Ordenando los resultados</h3><p>Al momento de realizar consultas, es posible querer que estas se ordenen por algun campo, siendo los criterios disponibles: de forma ascendente y de forma descendente. Esto nos permite obtener los datos con una visual definida de tal forma que sea facil ubicar los datos y también poder comparar sus valores.</p><p>Para ordenar una consulta simplemente agregamos al final de ella, las palabras reservadas <code>ORDER BY</code> y luego el o los campos los cuales deseamos ordenar, siendo posible ordenar por multiples campos y cada campo tenga su criterio (ascendente o descendente).</p><h3 id="limitando-los-resultados">Limitando los resultados</h3><p>En alguna oportunidades queremos solo obtener el primer registro de la consulta (aunque sea haya retornado una cantidad mayor de registros), o por ejemplo queremos obtener el top 10 de registros con cierta condición, para ello usamos cada herramienta de base de datos posee una palabra reservada, en nuestro caso, usando MySQL o PostgreSQL, &nbsp;la palabra reservada será <code>LIMIT</code>.</p><p>Más adelante usaremos tanto el orden como la limitación para ajustar nuestras consultas.</p><h2 id="funciones-de-agregado">Funciones de agregado</h2><p>Estas son funciones de SQL (Si SQL así como un lenguaje de programación tienen funciones, lo que lo haces aún más poderoso 😎), que realizan un calculo, en base a un campo o expresión de campos, sobre un conjunto de datos y retornan un resultado.</p><p>Tomando en cuenta lo indicado en punto anterior, las funciones de agregado generalmente van acompañadas de las palabras reservadas <code>GROUP BY</code> y en algunos casos de la palabra <code>HAVING</code> (estas trabajan en conjunto se mencionó anteriormente), pero esto no es regla, es decir no es necesario ello. Entendido esto, podemos obtener una única fila como resultado de una consulta con una función de agregado, o una fila por cada grupo generado en la query (usando <code>GROUP BY</code>)</p><p><strong>Anatomía de las funciones de agregado</strong></p><p>Las consultas o <code>SELECT</code> usando funciones de agregado van a seguir la siguiente forma:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/11/image-8.png" class="kg-image" alt="image-8" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2023/11/image-8.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2023/11/image-8.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2023/11/image-8.png 1012w" sizes="(min-width: 720px) 720px" width="1012" height="222" loading="lazy"></figure><p>Ejemplo de consultas que retornarian un único resultado:</p><ul><li>Día del primer turno registrado</li><li>Día del último turno registrado</li><li>Cantidad de turnos procesados por el sistema</li><li>Si le agregamos a la tabla de tickets, los minutos de cada turno ejecutado, podemos obtener la suma de tiempo ejecutado.</li></ul><p>Estos 4 ejemplos nos van a retornar una fila de resultado solamente, porque no estamos agrupando por ningún elemento.</p><p>Ahora bien, veamos cuales son esas funciones de agregado:</p><h3 id="count">COUNT</h3><p>Nos permite hacer el conteo, o contar cuantos registros o filas que cumplen la condición de la consulta. Su sintaxis es muy simple: ]</p><figure class="kg-card kg-code-card"><pre><code>SELECT COUNT(campo o *) FROM tabla1 INNER JOIN tabla2 ON (tabla1.key = tabla2.key) WHERE &lt;condicion&gt; </code></pre><figcaption>La anterior consulta nos va a retornar una sola fila</figcaption></figure><p> Ahora vemos la siguiente consulta:</p><figure class="kg-card kg-code-card"><pre><code>SELECT COUNT(campo o *) FROM tabla1 INNER JOIN tabla2 ON (tabla1.key = tabla2.key) WHERE &lt;condicion&gt; GROUP BY &lt;campo1&gt;</code></pre><figcaption>La anterior consulta nos va a retornar una fila por cada uno de los distintos valores de campo1</figcaption></figure><h3 id="sum">SUM</h3><p>Nos permite hacer la suma de los valores del campo de los registros o filas que cumplen la condición de la consulta. Tiene sentido cuando el campo es numérico. Su sintaxis sigue a continuación:</p><pre><code>SELECT SUM(campo) FROM tabla1 INNER JOIN tabla2 ON (tabla1.key = tabla2.key) WHERE &lt;condicion&gt; </code></pre><p>Agrupando por algún campo queda:</p><pre><code>SELECT SUM(campo) FROM tabla1 INNER JOIN tabla2 ON (tabla1.key = tabla2.key) WHERE &lt;condicion&gt; GROUP BY &lt;campo1&gt;</code></pre><h3 id="avg">AVG</h3><p>Esta función calcula el promedio de los valores del campo de los registros o filas que cumplen la condición de la consulta, se entiende como el promedio a la suma de los valores dividido entre la cantidad de registros, sería algo como SUM/COUNT. Sólo funciona si el campo es numérico. La sintaxis es:</p><pre><code>SELECT AVG(campo) FROM tabla1 INNER JOIN tabla2 ON (tabla1.key = tabla2.key) WHERE &lt;condicion&gt; </code></pre><p>Agrupando por algún campo queda:</p><pre><code>SELECT AVG(campo) FROM tabla1 INNER JOIN tabla2 ON (tabla1.key = tabla2.key) WHERE &lt;condicion&gt; GROUP BY &lt;campo1&gt;</code></pre><h3 id="max">MAX</h3><p>La función MAX, nos permite calcular el máximo o mayor valor de un conjunto de registros o filas que cumplen la condición de la consulta (siempre comento esto porque estas funciones se pueden o no combinar con condiciones de consulta). A diferencia de las anteriores, es posible usarla en cualquier tipo de dato que sea ordenable, por ejemplo, textos y números. La usamos de la siguiente forma es:</p><pre><code>SELECT MAX(campo) FROM tabla1 INNER JOIN tabla2 ON (tabla1.key = tabla2.key) WHERE &lt;condicion&gt; </code></pre><p>Agrupando por algún campo queda:</p><pre><code>SELECT MAX(campo) FROM tabla1 INNER JOIN tabla2 ON (tabla1.key = tabla2.key) WHERE &lt;condicion&gt; GROUP BY &lt;campo1&gt;</code></pre><h3 id="min">MIN</h3><p>La función MIN, nos permite calcular el menor valor o el valor mínimo de un conjunto de registros o filas devueltos a realizar una consulta, esta puede tener o no condiciones. Como su antecesora (MAX), es posible usarla en cualquier tipo de dato que sea ordenable, caso más usado: textos y números. Para ejecutarla, lo indicamos de la siguiente forma:</p><pre><code>SELECT MIN(campo) FROM tabla1 INNER JOIN tabla2 ON (tabla1.key = tabla2.key) WHERE &lt;condicion&gt; </code></pre><p>Agrupando por algún campo queda:</p><pre><code>SELECT MIN(campo) FROM tabla1 INNER JOIN tabla2 ON (tabla1.key = tabla2.key) WHERE &lt;condicion&gt; GROUP BY &lt;campo1&gt;</code></pre><h2 id="implementando-las-consultas-solicitadas-en-sql">Implementando las consultas solicitadas en SQL</h2><p>Vamos a realizar el código SQL para cada una de las consultas planteadas anteriormente, para ello vamos a usar lo que hemos aprendido: Funciones de agregado, agrupamiento y relacionamiento. </p><ul><li>Cantidad de usuarios con ticket por día en un periodo. Definamos ese periodo para el ejemplo como el mes de julio de 2023.</li></ul><p>En este caso, lo que requerimos es cantidad de registros, es contar por lo tanto la función de agregado que vamos a usar es <code>COUNT</code>, adicionalmente nos piden que ese conteo, sea realizado por día, es decir debemos agrupar los datos por el día del turno. </p><p>Con lo anterior la consulta a construir será:</p><pre><code>SELECT COUNT(*) FROM users INNER JOIN tickets ON (users.id = tickets.user_id) WHERE date_time &gt;= '2023-07-01' AND date_time &lt; '2023-08-01' GROUP BY date_time </code></pre><p>La consulta está correcta de sintaxis, pero el campo date_time es de tipo fecha y hora, por lo tanto, esta agrupando siempre que el ticket fuese realizado en el mismo día y a la misma hora, lo cual no es lo solicitado, para ello vamos a hacer uso de una función especial que nos retorne la fecha solamente en el caso de un campo de tipo <code>datetime</code>, en ese caso la función es <code>DATE,</code> luego es necesario que ademas del conteo, mostremos el día, por lo que la consulta queda:</p><pre><code>SELECT DATE(date_time), COUNT(*) FROM users INNER JOIN tickets ON (users.id = tickets.user_id) WHERE date_time &gt;= '2023-07-01' AND date_time &lt; '2023-08-01' GROUP BY DATE(date_time)</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/11/image-9.png" class="kg-image" alt="image-9" width="359" height="309" loading="lazy"><figcaption>Resultado obtenido de la consulta anterior.</figcaption></figure><ul><li>Promedio de turnos por día en un periodo</li></ul><p>Para esta consulta debemos hacer uso de la función <code>AVG</code>, ya que lo nos piden es el promedio de turnos por dia, en un periodo, en ese caso, tomamos la consulta anterior, y sobre esa consulta aplicamos un concepto que se denomina SUBSELECT. Cuando hacemos uso de SUBSELECT debemos encerrar entre () la consulta original y luego le damos un nombre, observa como queda la consulta:</p><pre><code>SELECT AVG(total) FROM 
(SELECT DATE(date_time), COUNT(*) as total FROM users INNER JOIN tickets ON (users.id = tickets.user_id) WHERE date_time &gt;= '2023-07-01' AND date_time &lt; '2023-08-01' GROUP BY DATE(date_time)) as t1</code></pre><p>El texto <code>as t1</code> es el que nos permite indicarle a SQL que ese SUBSELECT que está entre parentesis: <code>(SELECT DATE(date_time), COUNT(*) as total FROM users INNER JOIN tickets ON (users.id = tickets.user_id) WHERE date_time &gt;= '2023-07-01' AND date_time &lt; '2023-08-01' GROUP BY DATE(date_time))</code></p><p>Otro punto interesante es que le dimos un nombre al valor de conteo, para poder luego obtener su promedio, eso lo hicimos de esta forma: <code>COUNT(*) as total</code></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/11/image-10.png" class="kg-image" alt="image-10" width="215" height="103" loading="lazy"><figcaption>Este es el resultado de la consulta de promedio</figcaption></figure><ul><li>Cantidad de turnos mayor o menor por dia.</li></ul><p>En este caso debemos usar las funciones de MAX y MIN, vamos a realizar 2 consultas para ello. Para obtener el día con mayor cantidad de turnos esperados (es decir sin importar su status), hacemos la siguiente consulta:</p><pre><code>SELECT MAX(t1.total) FROM 
(
SELECT DATE(date_time) as fecha, COUNT(*) as total FROM users INNER JOIN tickets ON (users.id = tickets.user_id) 
WHERE date_time &gt;= '2023-07-01' AND date_time &lt; '2023-08-01' GROUP BY DATE(date_time)
) as t1;</code></pre><p>La consulta anterior nos devuelve la cantidad máximas de turnos, pero no obtenemos el día, lo cual sería importante, por lo que en ese caso podemos hacer uso de otra herramienta que no es función de agregado, pero que es básica para cualquier consulta, el ordenar, luego si solo queremos un registro, nos apoyamos en otra herramientas disponible que es la de limitar como vimos anteriormente.</p><p>Como queda nuestra consulta para obtener el día com mayor cantidad de turnos, usando orden y limitación:</p><pre><code>SELECT DATE(date_time) as fecha, COUNT(*) as total FROM users INNER JOIN tickets ON (users.id = tickets.user_id) 
WHERE date_time &gt;= '2023-07-01' AND date_time &lt; '2023-08-01' 
GROUP BY DATE(date_time) 
ORDER BY 2 DESC LIMIT 1</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/11/image-12.png" class="kg-image" alt="image-12" width="250" height="126" loading="lazy"><figcaption>Ahora obtenemos tanto el día como la cantidad</figcaption></figure><p>Para obtener la cantidad menor de turnos en un día usamos las mismas consultas, sólo ajustando las funciones de agregado o el criterio de orden.</p><pre><code>SELECT MIN(t1.total) FROM 
(
SELECT DATE(date_time) as fecha, COUNT(*) as total FROM users INNER JOIN tickets ON (users.id = tickets.user_id) 
WHERE date_time &gt;= '2023-07-01' AND date_time &lt; '2023-08-01' GROUP BY DATE(date_time)
) as t1;</code></pre><p>Observa que en este caso cambiamos <code>MAX</code> por <code>MIN</code>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/11/image-15.png" class="kg-image" alt="image-15" width="250" height="126" loading="lazy"><figcaption></figcaption></figure><p>Ahora usando orden y limitación:</p><pre><code>SELECT DATE(date_time) as fecha, COUNT(*) as total FROM users INNER JOIN tickets ON (users.id = tickets.user_id) 
WHERE date_time &gt;= '2023-07-01' AND date_time &lt; '2023-08-01' 
GROUP BY DATE(date_time) 
ORDER BY 2 ASC LIMIT 1</code></pre><p>Para este caso solo cambiamos es &nbsp;<code>DESC</code> por <code>ASC</code>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/11/image-16.png" class="kg-image" alt="image-16" width="250" height="126" loading="lazy"></figure><ul><li>Día con mayor o menor cantidad de turnos ejecutados</li></ul><p>Esta consulta es similar a la anterior, solo que en este caso vamos a agregar una condición del valor del campo status, que sea igual a realizado, observa como quedan las consultas:</p><p>Primero veamos el día con mayor cantidad de turnos realizados o ejecutados:</p><pre><code>SELECT MAX(t1.total) FROM 
(
SELECT DATE(date_time) as fecha, COUNT(*) as total FROM users INNER JOIN tickets ON (users.id = tickets.user_id) 
WHERE date_time &gt;= '2023-07-01' AND date_time &lt; '2023-08-01' AND status = 'Realizado' GROUP BY DATE(date_time)
) as t1;</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/11/image-17.png" class="kg-image" alt="image-17" width="250" height="126" loading="lazy"></figure><p>Recordando que si queremos la fecha, usamos orden y limitación:</p><pre><code>SELECT DATE(date_time) as fecha, COUNT(*) as total FROM users INNER JOIN tickets ON (users.id = tickets.user_id) 
WHERE date_time &gt;= '2023-07-01' AND date_time &lt; '2023-08-01' AND status = 'Realizado'
GROUP BY DATE(date_time) 
ORDER BY 2 DESC LIMIT 1</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/11/image-18.png" class="kg-image" alt="image-18" width="250" height="126" loading="lazy"></figure><p>Ahora veamos el día con menor cantidad de turnos realizados o ejecutados:</p><pre><code>SELECT MIN(t1.total) FROM 
(
SELECT DATE(date_time) as fecha, COUNT(*) as total FROM users INNER JOIN tickets ON (users.id = tickets.user_id) 
WHERE date_time &gt;= '2023-07-01' AND date_time &lt; '2023-08-01' AND status = 'Realizado' GROUP BY DATE(date_time)
) as t1;</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/11/image-20.png" class="kg-image" alt="image-20" width="250" height="126" loading="lazy"></figure><p>Usando orden y limitación, obtenemos tanto la cantidad como la fecha que sucedió:</p><pre><code>SELECT DATE(date_time) as fecha, COUNT(*) as total FROM users INNER JOIN tickets ON (users.id = tickets.user_id) 
WHERE date_time &gt;= '2023-07-01' AND date_time &lt; '2023-08-01' AND status = 'Realizado'
GROUP BY DATE(date_time) 
ORDER BY 2 ASC LIMIT 1</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/11/image-21.png" class="kg-image" alt="image-21" width="250" height="126" loading="lazy"></figure><ul><li>Cantidad de turnos por Tienda por día en un periodo</li></ul><p>Veamos ahora este ejemplo, donde la función de agregado es la de conteo, pero debemos agrupar por 2 campos, en este será la fecha del turno y el nombre de la tienda, los campos están en 2 tablas diferentes pero esto no será problema para nuestra consulta. Veamos como queda:</p><pre><code>SELECT store_name, DATE(date_time) as fecha, COUNT(*) as total FROM stores INNER JOIN tickets ON (stores.id = tickets.store_id) 
WHERE date_time &gt;= '2023-07-01' AND date_time &lt; '2023-08-01' GROUP BY store_name, DATE(date_time)
</code></pre><p>En la consulta apreciamos que el agrupamiento se realizó por el nombre de la tienda y la fecha del turno: <code>GROUP BY store_name, DATE(date_time)</code></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/11/image-22.png" class="kg-image" alt="image-22" width="383" height="257" loading="lazy"></figure><ul><li>Top 10 de las tiendas con mayor cantidad de turnos ejecutados.</li></ul><p>En este caso, analicemos la consulta, vamos a necesitar contar los turnos, función COUNT, luego debemos agruparlos por cada tienda, de esta forma obtenemos la cantidad por tienda, luego aplicamos un criterio de orden descendente, para que las primeras sean las tiendas de mayor cantidad de turnos y luego lo limitamos a 10. Excelente!, veamos la query.</p><pre><code>SELECT store_name, COUNT(*) as total FROM stores INNER JOIN tickets ON (stores.id = tickets.store_id) 
WHERE date_time &gt;= '2023-07-01' AND date_time &lt; '2023-08-01' GROUP BY store_name ORDER BY total DESC LIMIT 10
</code></pre><p>Resultando lo siguiente:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/11/image-23.png" class="kg-image" alt="image-23" width="383" height="257" loading="lazy"></figure><p></p><p>Veamos aquellas consultas que sabemos que no tienen agrupamiento:</p><ul><li>Día del primer turno registrado</li></ul><pre><code>SELECT MIN(date_time) FROM tickets t </code></pre><p>De forma rápida apreciamos que usando la función MIN, obtemos el valor mínimo de ese campo.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/11/image-25.png" class="kg-image" alt="image-25" width="244" height="109" loading="lazy"></figure><ul><li>Día del último turno registrado</li></ul><pre><code>SELECT MAX(date_time) FROM tickets t</code></pre><p>Acá apreciamos que logramos obtener el valor máximo del campo fecha del turno.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/11/image-24.png" class="kg-image" alt="image-24" width="244" height="109" loading="lazy"></figure><ul><li>Cantidad de turnos procesados por el sistema</li></ul><p>Consulta básica:</p><pre><code>SELECT COUNT(*) FROM tickets WHERE status = 'Realizado'</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/11/image-26.png" class="kg-image" alt="image-26" width="244" height="109" loading="lazy"></figure><ul><li>Si le agregamos a la tabla de tickets, los minutos de cada turno ejecutado, podemos obtener la suma de tiempo ejecutado.</li></ul><pre><code>SELECT SUM(tiempo) FROM tickets WHERE status = 'Realizado'</code></pre><p>Recuerden que para poder ejecutar la consulta anterior debe agregarse la columna tiempo en la tabla tickets.</p><p>Todo lo realizado hasta aquí lo puedes ver en la práctica en el siguiente video:</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.49999999999999%;" class="fluid-width-video-wrapper">
            <iframe width="200" height="113" src="https://www.youtube.com/embed/QITspJAmAYg?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" title="Funciones de Agregado en SQL: Cómo Usar SUM, AVG, MAX, MIN y Más" name="fitvid2"></iframe>
          </div>
        </div>
      </figure> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Tutorial de combinaciones (joins) en SQL: Cross join, full outer join, inner join, left join, y right join. ]]>
                </title>
                <description>
                    <![CDATA[ Los joins o combinaciones de SQL permiten que nuestros sistemas de administración de base de datos relacionales estén bien "relacionados". Los joins o combinaciones nos permiten reconstruir de nuevo nuestras tablas de base de datos separadas en relaciones que impulsan nuestras aplicaciones. En este artículo, hablaremos de cada uno de ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/tutorial-de-uniones-en-sql/</link>
                <guid isPermaLink="false">6328c00070a5cb0907d694b1</guid>
                
                    <category>
                        <![CDATA[ SQL ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Norvys Gonzalez ]]>
                </dc:creator>
                <pubDate>Tue, 20 Dec 2022 21:28:20 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/09/5f9c98fc740569d1a4ca1d31--1-.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/sql-joins-tutorial/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">SQL Joins Tutorial: Cross Join, Full Outer Join, Inner Join, Left Join, and Right Join.</a>
      </p><p>Los joins o combinaciones de SQL permiten que nuestros sistemas de administración de base de datos relacionales estén bien "relacionados"<em><em>.</em></em></p><p>Los joins o combinaciones nos permiten reconstruir de nuevo nuestras tablas de base de datos separadas en relaciones que impulsan nuestras aplicaciones.</p><p>En este artículo, hablaremos de cada uno de los diferentes tipos de joins o combinaciones de SQL y como usarlas.</p><p>Lo que cubriremos:</p><ul><li>¿Qué es un join o combinación de SQL?</li><li>Configurando tu base de datos</li><li><code>CROSS JOIN</code></li><li>Configurando nuestra data ejemplo (directorios y películas)</li><li><code>FULL OUTER JOIN</code></li><li><code>INNER JOIN</code></li><li><code>LEFT JOIN</code> / <code>RIGHT JOIN</code></li><li>Filtrar usando <code>LEFT JOIN</code></li><li>Múltiples joins o combinaciones</li><li>Joins o combinaciones con condiciones extra</li><li>La verdad sobre escribir queries con joins o combinaciones</li></ul><p>(<em>Alerta de spoiler</em>: cubriremos cinco diferentes tipos—pero solamente necesitas conocer dos de ellos!)</p><h2 id="-qu-es-un-join-o-combinaci-n-en-sql"><strong>¿Qué es un join o combinación en SQL?</strong></h2><p>Un <strong><strong>join</strong></strong> es una operación que combina dos filas juntas en una fila.</p><p>Estas filas usualmente pertenecen a dos tablas diferentes —pero no necesariamente tiene que ser así.</p><p>Antes de ver como escribir un <em>join</em>, veamos como se vería su resultado.</p><p>Tomemos como ejemplo un sistema que almacena información acerca de sus usuarios y sus direcciones.</p><p>Las filas de la tabla que almacena la información del usuario se vería así:</p><pre><code class="language-español"> id |     nombre     |        email        | edad
----+--------------+---------------------+-----
  1 | John Smith     | johnsmith@gmail.com |  25
  2 | Jane Doe       | janedoe@Gmail.com   |  28
  3 | Xavier Wills   | xavier@wills.io     |  3
...
(7 filas)</code></pre><p>Y las filas de la tabla que almacena direcciones podría verse así:</p><pre><code class="language-español"> id |      calle        |     ciudad    | estado| id_usuario
----+-------------------+---------------+-------+---------
  1 | 1234 Main Street  | Oklahoma City | OK    |       1
  2 | 4444 Broadway Ave | Oklahoma City | OK    |       2
  3 | 5678 Party Ln     | Tulsa         | OK    |       3
(3 rows)</code></pre><p>Podríamos escribir por separado consultas que nos traiga tanto información relacionada con los usuarios como la información de la dirección — pero idealmente podemos escribir <em>una consulta</em> y recibir todos los usuarios y las direcciones al mismo tiempo.</p><p>¡Esto es exactamente lo que nos permiten hacer los joins!</p><p>Veremos como escribir estos joins pronto, pero si combinamos nuestra información del usuario a la información de dirección conseguiremos un resultado como este:</p><pre><code class="language-español"> id |     nombre     |        email        | edad | id |      calle      |    ciudad      | estado | id_usuario
----+--------------+---------------------+-----+----+-------------------+---------------+-------+---------
  1 | John Smith   | johnsmith@gmail.com |  25 |  1 | 1234 Main Street  | Oklahoma City | OK    |       1
  2 | Jane Doe     | janedoe@Gmail.com   |  28 |  2 | 4444 Broadway Ave | Oklahoma City | OK    |       2
  3 | Xavier Wills | xavier@wills.io     |  35 |  3 | 5678 Party Ln     | Tulsa         | OK    |       3
(3 filas)
</code></pre><p>Aquí vemos todos los usuarios y sus direcciones en un buen conjunto de resultadoa.</p><p>Además de producir un conjunto de resultado combinado, otro uso importante de los <em>joins</em> es obtener información adicional contra la que podemos filtrar.</p><p>Por ejemplo, si queremos enviar un correo físico a todos los usuarios que viven en la ciudad de Oklahoma, podríamos usar el conjunto de resultado combinado y filtrarlo basado en la columna ciudad.</p><p>Ahora que sabemos el propósito de los Joins, ¡empecemos escribiendo algunos!</p><h2 id="configurando-tu-base-de-datos"><strong>Configurando tu base de datos</strong></h2><p>Antes de que podamos escribir nuestras consultas necesitamos configurar nuestra base de datos.</p><p>Para estos ejemplos estaremos usando PostgreSQL, pero las consultas y conceptos mostrados aquí serán facilmente traducidos a cualquier sistema moderno de base de datos (como MySQL, SQL Server, etc.).</p><p>Para trabajar con nuestra base de datos en &nbsp;PostgreSQL, podemos usar <code><a href="https://www.postgresql.org/docs/current/app-psql.html">psql</a></code>—el programa interactivo de línea de comandos de PostgreSQL. Si tienes otro cliente de base de datos con el que disfrutes trabajar puedes usarlo también.</p><p>Para comenzar vamos a crear nuestra base de datos. Con el PostgreSQL <a href="https://www.postgresql.org/download/">y</a>a instalado, corremos el comando <code>createdb &lt;nombre de la base de datos&gt;</code> en nuestra terminal para crear nuestra base de datos. Llamé a la mia <code>fcc</code>:</p><pre><code class="language-bash">$ createdb fcc
</code></pre><p>Ahora iniciemos la consola interactiva usando el comando <code>psql</code> y nos conectamos a la base de datos que acabamos de crear usando <code>\c &lt;nombre de la base de datos&gt;</code>:</p><pre><code class="language-bash">$ psql
psql (11.5)
Type "help" for help.

john=# \c fcc
You are now connected to database "fcc" as user "john".
fcc=#
</code></pre><blockquote><strong><strong>Not</strong>a<strong>:</strong></strong> Limpié la salida de <code>psql</code> en estos ejemplos para hacerlos más fáciles de leer, así que no te preocupes si la salida que te muestro aquí no es exactamente igual a la que estás viendo en tu terminal.</blockquote><p>Te recomiendo que hagas estos ejemplos conmigo y que corras estas consultas tu mismo. Aprenderás y recordarás mucho más trabajando sobre estos ejemplos en lugar de solo leerlos. &nbsp;</p><p>¡Ahora veamos las combinaciones o <em>joins</em>!</p><h2 id="cross-join"><strong><code>CROSS JOIN</code></strong></h2><p>Los joins más simples que podemos hacer son los &nbsp;<code>CROSS JOIN</code> o <em><em>"</em>Producto cartesiano<em>."</em></em></p><p>Este join toma cada fila de una tabla y la une a cada fila de otra tabla.</p><p>Si tenemos dos listas —una que contiene <code>1, 2, 3</code> y otra que contiene <code>A, B, C</code>—el producto cartesiano de las dos listas sería:</p><pre><code>1A, 1B, 1C
2A, 2B, 2C
3A, 3B, 3C
</code></pre><p>Cada valor de la primera lista es emparejado con cada valor de la segunda lista.</p><p>Escribamos este mismo ejemplo como un query en SQL.</p><p>Primero creamos dos tablas muy simples e insertemos algunos datos en ellas:</p><pre><code class="language-sql">CREATE TABLE letras(
  letra TEXT
);

INSERT INTO letras(letra) VALUES ('A'), ('B'), ('C');

CREATE TABLE numeros(
  num TEXT
);

INSERT INTO numeros(num) VALUES (1), (2), (3);
</code></pre><p>Nuestras dos tablas, <code>letras</code> y <code>numeros</code>, solo tienen una columna: un campo de texto simple.</p><p>Ahora vamos a combinarlas con <code>CROSS JOIN</code>:</p><pre><code class="language-sql">SELECT *
FROM letras
CROSS JOIN numeros;
</code></pre><pre><code> letra | num
--------+--------
 A      | 1
 A      | 2
 A      | 3
 B      | 1
 B      | 2
 B      | 3
 C      | 1
 C      | 2
 C      | 3
(9 filas)

</code></pre><p>Este es el &nbsp;join mas simple que podemos hacer —pero aún en este simple ejemplo podemos ver como trabajan los joins: las dos filas separadas (una de <code>letras</code> y otra de <code>numeros</code>) han sido <em>combinadas</em> para formar una fila.</p><p>Mientras este tipo de join es discutido como un mero ejemplo académico, tiene al menos un buen caso de uso: rangos de fechas.</p><h3 id="cross-join-con-rangos-de-fecha"><strong><code>CROSS JOIN</code> con rangos de fecha</strong></h3><p>Un buen caso de uso del <code>CROSS JOIN</code> es tomar cada fila de una tabla y aplicarla a todos los días dentro de un rango de fecha.</p><p>Digamos por ejemplo que estabas creando una aplicación que hiciera seguimiento a tareas diarias —cosas como cepillarte los dientes, comer tu desayuno, o ducharte.</p><p>Si quisieras generar un registro de <em>cada tarea diaria y por cada día de la semana pasada</em>, podrías usar un <code>CROSS JOIN</code> contra un rango de fechas.</p><p>Para hacer este rango de fechas, podemos usar la &nbsp;función <code><a href="https://www.postgresql.org/docs/current/functions-srf.html">generate_series</a></code>:</p><pre><code class="language-sql">SELECT generate_series(
  (CURRENT_DATE - INTERVAL '5 day'),
  CURRENT_DATE,
  INTERVAL '1 day'
)::DATE AS dia;
</code></pre><p>La función <code>generate_series</code> toma tres parámetros.</p><p>El primer parámetro es el valor inicial. En este ejemplo estamos usando <code>CURRENT_DATE - INTERVAL '5 day'</code>. Esto devuelve la fecha actual menos cinco días —o lo que es lo mismo a "hace cinco días."</p><p>El segundo parámetro es la fecha actual (<code>CURRENT_DATE</code>).</p><p>El tercer parámetro es el "intervalo de paso"—o cuánto queremos incrementar el valor cada vez. Dado que estas son tareas diarias, usaremos el intervalo de un día (<code>INTERVAL '1 day'</code>).</p><p>Poniéndolo todo junto, esto genera una serie de fechas que comienzan hace cinco días, terminan hoy y van un día a la vez.</p><p>Finalmente, eliminamos la porción de tiempo al convertir la salida de estos valores a una fecha usando <code>::DATE</code>, y le asignamos un alias a esta columna usando <code>AS dia</code> para hacer la salida un poco más agradable.</p><p>El resultado de esta consulta son los últimos cinco días más hoy:</p><pre><code>    dia
------------
 2020-08-19
 2020-08-20
 2020-08-21
 2020-08-22
 2020-08-23
 2020-08-24
(6 filas)
</code></pre><p>Volviendo a nuestro ejemplo de tareas por día, creemos una tabla simple que incluya las tareas que queremos completar e insertemos algunas tareas:</p><pre><code class="language-sql">CREATE TABLE tareas(
  nombre TEXT
);

INSERT INTO tareas(nombre) VALUES
('Lavar dientes'),
('Comer desayuno'),
('Ducharse'),
('Vestirse');
</code></pre><p>Nuestra tabla<code>tareas</code> solo tiene una columna, <code>nombre</code>, e insertamos cuatro tareas en esta tabla.</p><p>Ahora hagamos<code>CROSS JOIN</code> a nuestras tareas con la consulta para generar las fechas :</p><pre><code class="language-sql">SELECT
  tareas.nombre,
  dates.day
FROM tareas
CROSS JOIN
(
  SELECT generate_series(
    (CURRENT_DATE - INTERVAL '5 day'),
    CURRENT_DATE,
    INTERVAL '1 day'
  )::DATE	AS dia
) AS fechas
</code></pre><p>(Dado que nuestra consulta de generación de fechas no es una tabla real, simplemente la escribimos como una subconsulta)</p><p>A partir de esta consulta, devolvemos el nombre de la tarea y el día, y el conjunto de resultados se ve así:</p><pre><code>     nombre      |    dia
---------------+------------
 Lavar dientes   | 2020-08-19
 Lavar dientes   | 2020-08-20
 Lavar dientes   | 2020-08-21
 Lavar dientes   | 2020-08-22
 Lavar dientes   | 2020-08-23
 Lavar dientes   | 2020-08-24
 Comer desayuno  | 2020-08-19
 Comer desayuno  | 2020-08-20
 Comer desayuno  | 2020-08-21
 Comer desayuno  | 2020-08-22
 ...
 (24 filas)
</code></pre><p>Como esperábamos, obtenemos una fila para cada tarea por cada día en nuestro rango de fechas.</p><p>El <code>CROSS JOIN</code> es el más simple join que podemos hacer, pero para ver los siguientes tipos, necesitaremos una configuración de tabla más realista.</p><h2 id="creando-directorios-y-pel-culas"><strong>Creando directorios y películas</strong></h2><p>Para ilustrar los siguientes tipos de combinaciones o joins, usaremos el ejemplo de <em>películas</em> y <em>directorios de películas<em>.</em></em></p><p>En esta situación, una película tiene un director, pero no se requiere que una película tenga un director —imagínate que se anuncia una nueva película, pero la elección del director aún no se ha confirmado.</p><p>Nuestra tabla<code>directorios</code> almacenará el nombre de cada director, y la tabla <code>películas</code> almacenará el nombre de la película así como una referencia al director de la película (si tuviera uno).</p><p>Vamos a crear esas dos tablas e insertar algunos datos en ellas:</p><pre><code class="language-sql">CREATE TABLE directorios(
  id SERIAL PRIMARY KEY,
  name TEXT NOT NULL
);

INSERT INTO directorios(name) VALUES
('John Smith'),
('Jane Doe'),
('Xavier Wills')
('Bev Scott'),
('Bree Jensen');

CREATE TABLE peliculas(
  id SERIAL PRIMARY KEY,
  name TEXT NOT NULL,
  director_id INTEGER REFERENCES directorios 
);

INSERT INTO peliculas(name, director_id) VALUES
('Pelicula 1', 1),
('Pelicula 2', 1),
('Pelicula 3', 2),
('Pelicula', NULL),
('Pelicula', NULL);
</code></pre><p>Tenemos cinco directorios, cinco películas, y tres de esas películas tienen directorios asignados. Director ID 1 tiene dos películas, y director ID 2 tiene una.</p><h2 id="full-outer-join"><strong><code>FULL OUTER JOIN</code></strong></h2><p>Ahora que tenemos algunos datos con los que trabajar, veamos el <code>FULL OUTER JOIN</code>.</p><p>Un<code>FULL OUTER JOIN</code> tiene algunas similitudes con un <code>CROSS JOIN</code>, pero tiene un par de diferencias clave.</p><p>La primera diferencia es que un <code>FULL OUTER JOIN</code> requiere una <strong>condición de combinación<strong>.</strong></strong></p><p>Una condición de combinación especifica cómo se relacionan entre sí las filas entre las dos tablas y según qué criterios deben unirse.</p><p>En nuestro ejemplo, nuetras tabla <code>películas</code> tiene una referencia al director a través de la columna <code>director_id</code>, y esta columna coincide con la columna <code>id</code> de la tabla <code>directors</code>. Estas son las dos columnas que usaremos como nuestra condición de combinación.</p><p>Así es como escribimos esta combinación entre nuestras dos tablas:</p><pre><code class="language-sql">SELECT *
FROM peliculas
FULL OUTER JOIN directorios
  ON director.id = peliculas.director_id;
</code></pre><p>Observe la condición de combinación que especificamos que hace coincidir la película con su director: <code>ON peliculas.director_id = directorios.id</code>.</p><p>Nuestro conjunto de resultados parece una especie de producto cartesiano extraño:</p><pre><code>  id  |  nombre   | director_id |  id  |     nombre
------+---------+-------------+------+--------------
    1 | Pelicula 1 |           1 |    1 | John Smith
    2 | Pelicula 2 |           1 |    1 | John Smith
    3 | Pelicula 3 |           2 |    2 | Jane Doe
    4 | Pelicula 4 |        NULL | NULL | NULL
    5 | Pelicula 5 |        NULL | NULL | NULL
 NULL | NULL       |        NULL |    5 | Bree Jensen
 NULL | NULL       |        NULL |    4 | Bev Scott
 NULL | NULL       |        NULL |    3 | Xavier Wills
(8 filas)
</code></pre><p>Las primeras filas que vemos son aquellas en las que la película tenía un director, y nuestra condición de combinación se evaluó como verdadera.</p><p>Sin embargo, después de esas filas, vemos cada una de las filas restantes <em>de cada tabla</em>—pero con valores<code>NULL</code> &nbsp;donde la otra tabla no tiene una coincidencia.</p><blockquote><strong><strong>Note:</strong></strong> Si no estás familiarizado con valores <code>NULL</code> , <a href="https://www.freecodecamp.org/news/sql-operators-tutorial/#dealing-with-missing-data-null-">ve mi explicación aqui </a>en este tutorial de operadores de SQL.</blockquote><p>Aquí también vemos otra diferencia entre el <code>CROSS JOIN</code> y el<code>FULL OUTER JOIN</code>. Un <code>FULL OUTER JOIN</code> devuelve una fila distinta de cada tabla—a diferencia del <code>CROSS JOIN</code> que tiene múltiples.</p><h2 id="inner-join"><strong><code>INNER JOIN</code></strong></h2><p>El siguiente tipo de join, <code>INNER JOIN</code>, es uno de los tipos de join más utilizados.</p><p>Un inner join <strong>solo devuelve filas donde la condición de join es verdadera<strong>.</strong></strong></p><p>En nuestro ejemplo, un inner join entre nuestras tablas <code>peliculas</code> y <code>directorios</code> solo devolvería registros en los que a la película se le haya asignado un director.</p><p>La sintaxis es básicamente la misma que antes:</p><pre><code class="language-sql">SELECT *
FROM peliculas
INNER JOIN directorios
  ON directorios.id = peliculas.director_id;
</code></pre><p>Nuestro resultado muestra las tres películas que tienen un director:</p><pre><code> id |  nombre   | director_id | id |    nombre
----+---------+-------------+----+------------
  1 | Pelicula 1 |           1 |  1 | John Smith
  2 | Pelicula 2 |           1 |  1 | John Smith
  3 | Pelicula 3 |           2 |  2 | Jane Doe
(3 filas)
</code></pre><p>Dado que un inner join solo incluye filas que coinciden con la condición del join, <em>el orden de las dos tablas en el join no importa<em>.</em></em></p><p>Si invertimos el orden de las tablas en la consulta, obtenemos el mismo resultado:</p><pre><code class="language-sql">SELECT *
FROM directorios
INNER JOIN peliculas
  ON peliculas.director_id = directorios.id;
</code></pre><pre><code> id |    nombre    | id |  nombre   | director_id
----+------------+----+---------+-------------
  1 | John Smith |  1 | Pelicula 1 |           1
  1 | John Smith |  2 | Pelicula 2 |           1
  2 | Jane Doe   |  3 | Pelicula 3 |           2
(3 filas)
</code></pre><p>Dado que enumeramos la tabla &nbsp;<code>directorios</code> primero en esta consulta y selecciona todas las columnas (<code>SELECT *</code>), vemos los datos de la columna <code>directorios</code> primero y luego las columnas de <code>peliculas</code>—pero el resultado es el mismo.</p><p>Esta es una propiedad útil de los inner joins, pero no es cierta para todos los tipos de joins—como nuestro próximo tipo de join.</p><h2 id="left-join-right-join"><strong><code>LEFT JOIN</code> / <code>RIGHT JOIN</code></strong></h2><p>Los siguientes tipos de joins usan un modificador (<code>LEFT</code> or <code>RIGHT</code>) que afecta qué datos de la tabla se incluyen en el conjunto de resultados.</p><blockquote><strong><strong>Not</strong>a<strong>:</strong></strong> el <code>LEFT JOIN</code> y<code>RIGHT JOIN</code> también puede ser referido como <code>LEFT OUTER JOIN</code> y <code>RIGHT OUTER JOIN</code>.</blockquote><p>Estos joins se utilizan en consultas en las que queremos devolver todos los datos de una tabla en particular y, <em>si existe</em>, los datos de la tabla asociada también.</p><p>Si los datos asociados no existen, aún recuperamos todos los datos de la tabla "primaria".</p><p>Es una consulta de información sobre algo en particular e información adicional si esta información adicional existe.</p><p>Esto será simple de entender con un ejemplo. Vamos a encontrar todas las películas y sus directorios, pero sin importar si tienen director o no—esto es adicional:</p><figure class="kg-card kg-code-card"><pre><code class="language-sql">SELECT *
FROM peliculas
LEFT JOIN directorios
  ON directorios.id = peliculas.director_id;
</code></pre><figcaption>pe</figcaption></figure><p>La consulta sigue nuestro mismo patrón que antes—acabamos de especificar el join como un <code>LEFT JOIN</code>.</p><p>En este ejemplo, la tabla <code>peliculas</code> es la tabla de la "derecha".</p><p>Si escribimos la consulta en una línea, hace que esto sea un poco más fácil de ver:</p><pre><code class="language-sql">... FROM peliculas LEFT JOIN directorios ...
</code></pre><p><strong>Un<strong> left join </strong>devuelve todos los datos de la tabla de la<strong> "</strong>izquierda<strong>".</strong></strong></p><p>Un left join devuelve cualquier fila de la tabla "derecha" &nbsp;<strong>que coincida con la condición del join.</strong></p><p>Las filas de la tabla de la "derecha" &nbsp;<strong>que no coinciden con la condición del join se devuelven como</strong><code><strong><strong>NULL</strong></strong></code><strong><strong>.</strong></strong></p><pre><code> id |  nombre   | director_id |  id  |    nombre
----+---------+-------------+------+------------
  1 | Pelicula 1 |           1 |    1 | John Smith
  2 | Pelicula 2 |           1 |    1 | John Smith
  3 | Pelicula 3 |           2 |    2 | Jane Doe
  4 | Pelicula 4 |        NULL | NULL | NULL
  5 | Pelicula 5 |        NULL | NULL | NULL
(5 filas)
</code></pre><p>Mirando ese conjunto de resultados, podemos ver por qué este tipo de join es útil para el tipo de consultas <em><em>"</em></em>todo esto y, si existe, algo de eso<em><em>"</em></em> .</p><h3 id="right-join"><strong><code>RIGHT JOIN</code></strong></h3><p>El <code>RIGHT JOIN</code> trabaja exactamente como <code>LEFT JOIN</code>—excepto que las reglas sobre las dos tablas están invertidas.</p><p>En un right join, se devuelven todas las filas de la tabla "derecha" . La tabla &nbsp;"izquierda" se devuelve condicionalmente en función de la condición del join.</p><p>Usemos la misma consulta que arriba, pero sustituyamos <code>LEFT JOIN</code> por <code>RIGHT JOIN</code>:</p><pre><code class="language-sql">SELECT *
FROM peliculas
RIGHT JOIN directorios
  ON directorios.id = peliculas.director_id;
</code></pre><pre><code>  id  |  nombre   | director_id | id |     nombre
------+---------+-------------+----+--------------
    1 | Pelicula 1 |           1 |  1 | John Smith
    2 | Pelicula 2 |           1 |  1 | John Smith
    3 | Pelicula 3 |           2 |  2 | Jane Doe
 NULL | NULL    |        NULL |  5 | Bree Jensen
 NULL | NULL    |        NULL |  4 | Bev Scott
 NULL | NULL    |        NULL |  3 | Xavier Wills
(6 filas)
</code></pre><p>Nuestro conjunto de resultados ahora devuelve la fila de cada director en la tabla <code>directorios</code> y, si existe, los datos de las <code>peliculas</code>.</p><p>Todo lo que hemos hecho es cambiar qué tabla estamos considerando como la "primaria" —la tabla de la que queremos ver todos los datos, independientemente de si existen sus datos asociados.</p><h3 id="left-join-right-join-en-aplicaciones-de-producci-n"><strong><code>LEFT JOIN</code> / <code>RIGHT JOIN</code> en aplicaciones de producción</strong></h3><p>En una aplicación de producción, solo uso <code>LEFT JOIN</code> y nunca uso <code>RIGHT JOIN</code>.</p><p>Hago esto porque, en mi opinión, un <code>LEFT JOIN</code> hace que la consulta sea más fácil de leer y comprender.</p><p>Cuando escribo consultas, me gusta pensar en comenzar con un conjunto de resultados "base", digamos que todas las películas, y entonces traer o sustraer) grupos de cosas de esa base.</p><p>Debido a que me gusta comenzar con una base, el <code>LEFT JOIN</code> se ajusta a esta línea de pensamiento. Quiero todas las filas de mi tabla base (la tabla "izquierda") y condicionalmente quiero las filas de la tabla "derecha".</p><p>En la práctica, no creo haber visto nunca un <code>RIGHT JOIN</code>en una aplicación de producción. No hay nada de malo con un <code>RIGHT JOIN</code>—solo creo que hace que la consulta sea más difícil de entender.</p><h3 id="reescribiendo-right-join"><strong>Reescribiendo <code>RIGHT JOIN</code></strong></h3><p>Si quisiéramos cambiar nuestro escenario anterior y, en su lugar, devolver a todos los directorios y condicionalmente sus películas, podemos reescribir fácilmente <code>RIGHT JOIN</code> en <code>LEFT JOIN</code>.</p><p>Todo lo que tenemos que hacer es cambiar el orden de las tablas en la consulta y cambiar de <code>RIGHT</code> a <code>LEFT</code>:</p><pre><code class="language-sql">SELECT *
FROM directorios
LEFT JOIN peliculas
  ON peliculas.director_id = directorios.id;
</code></pre><blockquote><strong><strong>Not</strong>a<strong>:</strong> </strong>Me gusta poner ON en la tabla que se está uniendo (la tabla "derecha" —en el ejemplo anterior <code>peliculas</code>) primero en la condición del join (<code>ON peliculas.director_id = ...</code>)—pero esa es solo mi preferencia personal.</blockquote><h2 id="filtrado-usando-left-join"><strong>Filtrado usando <code>LEFT JOIN</code></strong></h2><p>Hay dos casos de uso para usar un <code>LEFT JOIN</code> (o<code>RIGHT JOIN</code>).</p><p>El primer caso de uso que ya lo hemos cubierto: devolver todas las filas de una tabla y condicionalmente de otra.</p><p>El segundo caso de uso es devolver filas de la primera tabla <strong>donde los datos de la segunda tabla no están presentes<strong>.</strong></strong></p><p>El escenario sería así: encontrar directorios <em>que<em> </em>no pertenezcan a una película<em>.</em></em></p><p>Para hacer esto, comenzaremos con un <code>LEFT JOIN</code> y nuestra tabla de <code>directorios</code> será la tabla primaria o la tabla "izquierda":</p><pre><code class="language-sql">SELECT *
FROM directorios
LEFT JOIN peliculas
  ON peliculas.director_id = directorios.id;
</code></pre><p>Para un director que no pertenece a una película, las columnas de la tabla <code>peliculas</code> son <code>NULL</code>:</p><pre><code> id |     nombre     |  id  |  nombre   | director_id
----+--------------+------+---------+-------------
  1 | John Smith   |    1 | Pelicula 1 |           1
  1 | John Smith   |    2 | Pelicula 2 |           1
  2 | Jane Doe     |    3 | Pelicula 3 |           2
  5 | Bree Jensen  | NULL | NULL    |        NULL
  4 | Bev Scott    | NULL | NULL    |        NULL
  3 | Xavier Wills | NULL | NULL    |        NULL
(6 filas)
</code></pre><p>En nuestro ejemplo, los ID de director 3, 4, y 5 no pertenecen a una película.</p><p>Para filtrar nuestro conjunto de resultados solo a estas filas, podemos agregar una cláusula <code>WHERE</code> &nbsp;para devolver solo las filas donde los datos de la película son <code>NULL</code>:</p><pre><code class="language-sql">SELECT *
FROM directorios
LEFT JOIN peliculas
  ON peliculas.director_id = directorios.id
WHERE peliculas.id IS NULL;
</code></pre><pre><code> id |     nombre     |  id  | nombre | director_id
----+--------------+------+------+-------------
  5 | Bree Jensen  | NULL   | NULL |        NULL
  4 | Bev Scott    | NULL   | NULL |        NULL
  3 | Xavier Wills | NULL   | NULL |        NULL
(3 filas)
</code></pre><p>¡Y allí están nuestros tres directorios sin película!</p><p>Es común usar la columna<code>id</code> de la tabla para filtrar (<code>WHERE peliculas.id IS NULL</code>), pero todas las columnas de la tabla &nbsp;<code>peliculas</code> son <code>NULL</code>—por lo que cualquiera de ellas funcionaría.</p><p>(Dado que sabemos que todas las columnas de la tabla <code>peliculas</code> serán <code>NULL</code>, en la consulta anterior podríamos escribir <code>SELECT directorios.*</code> en lugar de <code>SELECT *</code> para devolver toda la información del director.)</p><h3 id="usandoleft-join-para-encontrar-coincidencias"><strong>Usando<code>LEFT JOIN</code> para encontrar coincidencias</strong></h3><p>En nuestra consulta anterior encontramos directorios <em>que no</em> pertenecían a películas.</p><p>Usando nuestra misma estructura, podríamos encontrar directorios que <em>si </em>pertenecieran a películas cambiando nuestra condición <code>WHERE</code> &nbsp;para buscar filas donde los datos de la película <em>no sean</em> <code>NULL</code>:</p><pre><code class="language-sql">SELECT *
FROM directorios
LEFT JOIN peliculas
  ON peliculas.director_id = directorios.id
WHERE peliculas.id IS NOT NULL;
</code></pre><pre><code> id |    nombre    | id |  nombre   | director_id
----+------------+----+---------+-------------
  1 | John Smith |  1 | Pelicula 1 |           1
  1 | John Smith |  2 | Pelicula 2 |           1
  2 | Jane Doe   |  3 | Pelicula 3 |           2
(3 filas)
</code></pre><p>Esto puede parecer útil, pero en realidad acabamos de volver a implementar <code>INNER JOIN</code>!</p><h2 id="m-ltiple-joins-o-combinaciones"><strong>Múltiple joins o combinaciones</strong></h2><p>Hemos visto cómo unir dos tablas, pero ¿qué pasa con las combinaciones múltiples seguidas?</p><p>En realidad es bastante simple, pero para ilustrar esto necesitamos una tercera tabla: <code>tickets</code>.</p><p>Esta tabla representará las entradas vendidas para una película:</p><pre><code class="language-sql">CREATE TABLE tickets(
  id SERIAL PRIMARY KEY,
  movie_id INTEGER REFERENCES peliculas NOT NULL
);

INSERT INTO tickets(pelicula_id) VALUES (1), (1), (3);
</code></pre><p>La tabla <code>tickets</code> solo tiene un <code>id</code> y una referencia a la película: <code>pelicula_id</code>.</p><p>También hemos insertado dos boletos vendidos para la película ID 1, y un boleto vendido para la película ID 3.</p><p>¡Ahora, unamos los<code>directorios</code> a las <code>peliculas</code>—y luego <code>peliculas</code> a <code>tickets</code>!</p><pre><code class="language-sql">SELECT *
FROM directorios
INNER JOIN peliculas
  ON peliculas.director_id = directors.id
INNER JOIN tickets
  ON tickets.pelicula_id = peliculas.id;
</code></pre><p>Dado que se trata de inner joins, el orden en que escribimos las combinaciones no importa. Podríamos haber comenzado con los <code>tickets</code>, luego combinar a las <code>peliculas</code>, y luego combinar a los <code>directorios</code>.</p><p>De nuevo, todo se reduce a lo que se está tratando de consultar y lo que hace que la consulta sea más comprensible.</p><p>En nuestro conjunto de resultados, notaremos que hemos reducido aún más las filas que se devuelven:</p><pre><code> id |    nombre    | id |  nombre   | director_id | id | pelicula_id
----+------------+----+---------+-------------+----+----------
  1 | John Smith |  1 | Pelicula 1 |           1 |  1 |        1
  1 | John Smith |  1 | Pelicula 1 |           1 |  2 |        1
  2 | Jane Doe   |  3 | Pelicula 3 |           2 |  3 |        3
(3 filas)
</code></pre><p>Esto tiene sentido porque hemos agregado otro <code>INNER JOIN</code>. En efecto, esto agrega otra condición <em><em>"AND"</em></em>a nuestra consulta.</p><p>Nuestra consulta esencialmente dice: <em><em>"</em>devuelve<em> </em>todos los<em> director</em>io<em>s</em> que pertenezcan a </em>películas<em> <em> </em><strong>pero que también tienen</strong><em> </em>tickets vendidos<em>."</em></em></p><p>Si, en cambio, quisiéramos encontrar directorios que pertenezcan a películas <em>que no hayan vendido tickest todavía</em>, podríamos sustituir nuestro último <code>INNER JOIN</code> por un <code>LEFT JOIN</code>:</p><pre><code class="language-sql">SELECT *
FROM directorios
JOIN peliculas
  ON peliculas.director_id = directorios.id
LEFT JOIN tickets
  ON tickets.pelicula_id = peliculas.id;
</code></pre><p>Podemos ver que la <code>Pelicula 2</code> hora está de vuelta en el conjunto de resultados:</p><pre><code> id |    nombre    | id |  nombre   | director_id |  id  | pelicula_id
----+------------+----+---------+-------------+------+----------
  1 | John Smith |  1 | Pelicula 1 |           1 |    1 |        1
  1 | John Smith |  1 | Pelicula 1 |           1 |    2 |        1
  2 | Jane Doe   |  3 | Pelicula 3 |           2 |    3 |        3
  1 | John Smith |  2 | Pelicula 2 |           1 | NULL |     NULL
(4 filas)
</code></pre><p>Esta película no tuvo ninguna venta de boletos, por lo que anteriormente se excluyó del conjunto de resultados debido a <code>INNER JOIN</code>.</p><p>Dejaré esto como <em><em>E</em>j<em>e</em>rcicio<em> </em>para el lector<em> ™</em></em>, pero ¿cómo encontraría directorios que pertenezcan a películas que <strong>no</strong> tienen venta de boletos?</p><h3 id="orden-de-ejecuci-n-de-la-combinaci-n"><strong>Orden de ejecución de la combinación</strong></h3><p>Al final, realmente no nos importa en qué orden se ejecutan las combinaciones.</p><p>Una de las diferencias clave entre SQL y otros lenguajes de programación modernos es que SQL es un lenguaje <strong>declarativo</strong>.</p><p>Esto significa que especificamos el resultado que queremos, pero no especificamos los detalles de ejecución; esos detalles se dejan al planificador de consultas de la base de datos. Especificamos las combinaciones que queremos y las condiciones en ellas y el planificador de consultas se encarga del resto.</p><p>Pero, en realidad, la base de datos no une tres tablas al mismo tiempo. En su lugar, probablemente unirá las dos primeras tablas en un resultado intermedio y luego unirá ese conjunto de resultados intermedios a la tercera tabla.</p><p>(<strong><strong>Not</strong>a<strong>: </strong></strong>Esta es una explicación algo simplificada.)</p><p>Entonces, como estamos trabajando con múltiples joins en las consultas, podemos pensar en ellas como una serie de joins entre dos tablas, aunque una de esas tablas puede llegar a ser bastante grande.</p><h2 id="joins-con-condiciones-extra"><strong>Joins con condiciones extra</strong></h2><p>El último tema que cubriremos es un join con condiciones adicionales.</p><p>Similar a una cláusula <code>WHERE</code>, podemos agregar tantas condiciones como queramos a nuestras condiciones de join.</p><p>Por ejemplo, si quisiéramos encontrar películas con directorios <em>que no se llamen</em> <em><em>"John Smith"</em></em>, podríamos agregar esa condición extra a nuestra join con un <code>AND</code>:</p><pre><code class="language-sql">SELECT *
FROM peliculas
INNER JOIN directorios
  ON directors.id = peliculas.director_id
  AND directorios.name &lt;&gt; 'John Smith'</code></pre><p>Podemos usar cualquier operador que pondríamos en una cláusula <code>WHERE</code>en esta condición de join.</p><p>También obtenemos el mismo resultado de esta consulta si colocamos la condición en una cláusula <code>WHERE</code> en su lugar:</p><pre><code class="language-sql">SELECT *
FROM peliculas
INNER JOIN directorios
  ON directorios.id = peliculas.director_id
WHERE directorios.name &lt;&gt; 'John Smith';</code></pre><p>Hay algunas diferencias sutiles que ocurren bajo el capó aquí, pero para el propósito de este artículo, el conjunto de resultados es el mismo.</p><p>(Si no está familiarizado con todas las formas en que puede filtrar una consulta SQL, consulte el artículo mencionado anteriormente aquí.)</p><h2 id="la-realidad-acerca-de-escribir-consultas-con-joins"><strong>La realidad acerca de escribir consultas con joins</strong></h2><p>En realidad, solo uso combinaciones de tres maneras diferentes:</p><h4 id="inner-join-1"><strong><code>INNER JOIN</code></strong></h4><p>El primer caso de uso son los registros donde <strong>existe</strong> la relación entre dos tablas. Esto lo cumple el <code>INNER JOIN</code>.</p><p>Estas son situaciones como encontrar "<em>películas que tienen directorios<em>"</em></em> o <em><em>"</em>usuarios con publicaciones<em>".</em></em></p><h4 id="left-join"><strong><code>LEFT JOIN</code></strong></h4><p>El segundo caso de uso son los registros de una tabla —y si existe la relación—los registros de una segunda tabla. Esto lo cumple el <code>LEFT JOIN</code>.</p><p>Estas son situaciones como encontrar <em><em>"</em>películas con directorios si es que tienen uno<em>"</em></em> o <em><em>"</em></em>usuarios con publicaciones si tienen alguna<em><em>."</em></em></p><h4 id="left-join-exclusi-n"><strong><code>LEFT JOIN</code> exclusión</strong></h4><p>El tercer caso de uso más común es nuestro segundo caso de uso para un <code>LEFT JOIN</code>: encontrar registros en una tabla que<em><em> </em></em><strong>no</strong><em><em> </em></em>tienen una relación en la segunda tabla.</p><p>Estas son situaciones como <em><em>"</em>películas sin directorios<em>"</em></em> o <em><em>"</em>usuarios sin publicaciones<em>."</em></em></p><h3 id="dos-tipos-de-combinaciones-o-joins-muy-tiles"><strong>Dos tipos de combinaciones o joins muy útiles</strong></h3><p>Creo que nunca he usado un <code>FULL OUTER JOIN</code> o un <code>RIGHT JOIN</code> en una aplicación de producción. El caso de uso simplemente no aparece con la frecuencia suficiente o la consulta se puede escribir de una manera más clara (en el caso de <code>RIGHT JOIN</code>).</p><p>Ocasionalmente, he usado un <code>CROSS JOIN</code> para cosas como distribuir registros en un rango de fechas (como lo miramos al principio), pero ese escenario tampoco aparece con demasiada frecuencia.</p><p>Entonces, ¡buenas noticias! En realidad, solo hay dos tipos de combinaciones que debe comprender para el 99,9 % de los casos de uso que encontraras: <code>INNER JOIN</code> y <code>LEFT JOIN</code>!</p><p>Si te gustó este artículo, me puedes seguir en <a href="https://twitter.com/johnmosesman">Twitter </a>donde hablo de base de datos y temas relacionados con el desarrollo.</p><p>¡Gracias por leer!</p><p>John</p><p><strong><strong>P.S.</strong></strong> un consejo adicional por haber leido hasta el final: la mayoría de los sistemas de base de datos te permitiran escribir simplemente <code>JOIN</code> en lugar de<code>INNER JOIN</code>—lo que te ahorrará un poco de tipeo adicional. :)</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Los mejores ejemplos de SQL ]]>
                </title>
                <description>
                    <![CDATA[ SQL son las siglas en inglés para "Structured Query Language" (lenguaje de consulta estructurado). Se utiliza con todo tipo de bases de datos relacionales. Ejemplo de sintaxis básica de SQL Esta guía proporciona una descripción básica y de alto nivel de la sintaxis de las declaraciones SQL. SQL es un ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/los-mejores-ejemplos-de-sql/</link>
                <guid isPermaLink="false">62c1cd2ec5b22c08edf8d489</guid>
                
                    <category>
                        <![CDATA[ SQL ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ María Braeuner ]]>
                </dc:creator>
                <pubDate>Sun, 17 Jul 2022 19:26:52 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/07/sql-image.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/sql-example/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">The Best SQL Examples</a>
      </p><p>SQL son las siglas en inglés para "Structured Query Language" (lenguaje de consulta estructurado). Se utiliza con todo tipo de bases de datos relacionales.</p><h2 id="ejemplo-de-sintaxis-b-sica-de-sql">Ejemplo de sintaxis básica de SQL</h2><p>Esta guía proporciona una descripción básica y de alto nivel de la sintaxis de las declaraciones SQL.</p><p>SQL es un estándar internacional (ISO) pero encontrarás muchas diferencias entre las implementaciones. Esta guía utiliza MySQL como ejemplo. Si utilizas uno de los muchos otros Gestores de Bases de Datos Relacionales (DBMS por sus siglas en inglés) tendrás que consultar el manual de ese DBMS si es necesario. </p><h3 id="lo-que-cubriremos">Lo que cubriremos</h3><ul><li>Uso (establece qué base de datos utilizarán las instrucciones)</li><li>Cláusulas <em>Select </em>y <em>From</em></li><li>Cláusula <em>Where</em> (<em>and/or, IN, Between, LIKE)</em></li><li><em>Order by (</em>ASC, DESC)</li><li><em>Group by </em>y <em>Having</em></li></ul><h3 id="c-mo-se-utiliza">Cómo se utiliza</h3><p>Se utiliza para seleccionar la base de datos que contiene las tablas para tus declaraciones SQL:</p><pre><code class="language-SQL">use fcc_sql_guides_database; --selecciona la base de datos de muestras guía</code></pre><h3 id="cl-usulas-select-y-from">Cláusulas <em>Select</em> y <em>From</em></h3><p>La cláusula <em>Select</em> se utiliza normalmente para determinar qué columnas de los datos se quieren mostrar en los resultados. También hay opciones que puedes usar para mostrar datos que no son una columna de la tabla.</p><p>Este ejemplo muestra dos columnas <em>seleccionadas</em> de la tabla "<em>student", </em>y dos columnas calculadas. La primera de las columnas calculadas es un número sin sentido, y la otra es la fecha del sistema.</p><pre><code class="language-SQL">SELECT studentID, FullName, 3+2 as five, now() as currentDate
FROM student;</code></pre><h3 id="cl-usula-where-and-or-in-between-y-like-">Cláusula <em><code>Where</code></em> (<em>and / or, IN, Between</em> y <em>LIKE</em>)</h3><p>La cláusula <em><code>Where</code></em> se utiliza para limitar el número de filas devueltas. </p><p>En este caso se utilizarán las cinco condiciones en un ejemplo un tanto ridículo de la cláusula <em><code>Where</code>.</em></p><p>Compara este resultado con las declaraciones SQL anteriores para seguir esta lógica. </p><p>Se mostrarán las filas que:</p><ul><li>Tengan el ID del estudiante (<em>studentID</em>) entre 1 y 5 (inclusivo)</li><li>o <em>studentID </em>= 8</li><li>o tengan "Maximo" en el nombre</li></ul><p>El siguiente ejemplo es similar, pero especifica además que si alguno de los estudiantes tiene determinadas puntuaciones de SAT (1000, 1400), no se mostrarán: </p><pre><code class="language-SQL">SELECT studentID, FullName, sat_score, recordUpdated
FROM student
WHERE (
	studentID between 1 and 5
    	or studentID = 8
    	or FullName like '%Maximo%'
    	)
    	and sat_score NOT in (1000,1400);</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/07/syntax02.jpg" class="kg-image" alt="syntax02" width="414" height="147" loading="lazy"></figure><h3 id="order-by-asc-desc-"><em><code>Order By</code> (ASC, DESC)</em></h3><p><em><code>Order By</code> </em>(ordenar por) nos da la opción de ordenar los datos resultantes por uno o más elementos de la sección <em><code>SELECT</code>. </em>Aquí está la misma lista de arriba, pero ordenada por el nombre completo (<em>FullName</em>) de los estudiantes. El orden por defecto es ascendente (ASC), pero para ordenar en el orden opuesto (descendente) se utiliza DESC, como en el ejemplo siguiente:</p><pre><code class="language-SQL">SELECT studentID, FullName, sat_score
FROM student
WHERE (studentID between 1 and 5 -- inclusive
	or studentID = 8
    or FullName like '%Maximo%'
    and sat_score NOT in (1000, 1400)
  order by FullName DESC;</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/07/syntax03.jpg" class="kg-image" alt="syntax03" width="302" height="144" loading="lazy"></figure><h3 id="group-by-y-having"><em><code>Group By</code> </em>y<em> <code>Having</code></em></h3><p><em><code>Group By</code></em> (agrupar) nos da una forma de combinar filas y agregar datos. La cláusula <em>Having </em>es como la cláusla <em><code>Where</code></em> anterior, excepto que actúa sobre los datos agrupados. </p><p>Estos datos provienen de los datos de las contribuciones a la campaña que hemos estado utilizando en algunas de estas guías.</p><p>Esta declaración de SQL responde a la pregunta: "¿qué candidatos recibieron el mayor número de contribuciones (no la cantidad de dólares, sino el recuento (*)) en 2016, pero sólo los que tuvieron más de 80 contribuciones?"</p><p>Al ordenar estos datos en orden descendente (DESC), los candidatos con el mayor número de contribuciones se sitúan al principio de la lista.</p><pre><code class="language-SQL">SELECT Candidate, Election_year, sum(Total_$), count(*)
FROM combined_party_data
WHERE Election_year = 2016
GROUP BY Candidate, Election_year
	having count(*) &gt; 80
    order by count(*) DESC;</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/07/syntax04.jpg" class="kg-image" alt="syntax04" width="573" height="176" loading="lazy"></figure><p>Como con todas estas cosas de SQL, hay MUCHO MÁS de lo que encuentras en esta guía introductoria. Espero que esto al menos te dé lo suficiente para empezar. Por favor, consulta el manual de tu gestor de base de datos y diviértete probando diferentes opciones por ti mismo.</p><h2 id="preguntas-comunes-sobre-sql-en-las-entrevistas">Preguntas comunes sobre SQL en las entrevistas</h2><h3 id="-qu-es-un-inner-join-en-sql">¿Qué es un <em><code>inner join</code></em> en SQL?</h3><p>Es el tipo de unión por defecto si no se especifica ninguna unión. Devuelve todas las filas en las que hay al menos una coincidencia en ambas tablas. </p><pre><code class="language-SQL">SELECT * FROM A x JOIN B y ON y.aId = x.Id</code></pre><h3 id="-qu-es-un-left-join-en-sql">¿Qué es un <em><code>left join</code> </em>en SQL?</h3><p>Un <em>left join</em> devuelve todas las filas de la tabla a la izquierda (LEFT) y las filas coincidentes de la tabla a la derecha (RIGHT). Las filas de la tabla a la izquierda se devolverán aunque no haya una coincidencia en la tabla a la dercha. Las filas de la tabla a la izquierda sin coincidencias en la tabla derecha tendrán valores nulos (<code>null</code>) para la tabla a la derecha.</p><pre><code class="language-SQL">SELECT * FROM A x LEFT JOIN B y ON y.aId = x.Id</code></pre><h3 id="-qu-es-un-right-join-en-sql">¿Qué es un <em><code>right join</code></em> en SQL?</h3><p>Un <em>right join</em> devuelve todas las filas de la tabla a la derecha, y las filas coincidentes de la tabla a la izquierda. Contrario al <em>left join</em>, este devuelve todas las filas de la tabla a la derecha incluso cuando no haya ninguna coincidencia en la tabla izquierdo. Las filas de la tabla derecho que no tengan coincidencias en la tabla izquierdo tendrán valores <code>null</code> para las columnas de la tabla izquierdo.</p><pre><code class="language-SQL">SELECT * FROM A x RIGHT JOIN B y ON y.aId = x.Id</code></pre><h3 id="-qu-es-un-full-join-en-sql">¿Qué es un <em><code>full join</code> </em>en SQL?</h3><p>Un <em>full join</em> devuelve todas las filas en donde hay una coincidencia en cualquiera de las tablas. Es decir, si hay filas en la tabla izquierdo que no tienen coincidencias en la tabla derecho, se incluirán. Así como si hay filas en la tabla derecho que no tienen coincidencias en la tabla izquierdo, también se incluirán. </p><pre><code class="language-SQL">SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
FULL OUTER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID
ORDER BY Customers.CustomerName</code></pre><h3 id="-cu-l-es-el-resultado-del-siguiente-comando">¿Cuál es el resultado del siguiente comando?</h3><pre><code class="language-SQL">DROP VIEW view_name</code></pre><p>Aquí se producirá un error porque no podemos realizar una operación DML en una vista. </p><h3 id="-se-puede-realizar-un-rollback-despu-s-de-utilizar-el-comando-alter">¿Se puede realizar un <em>rollback </em>después de utilizar el comando <em><code>ALTER</code></em>?</h3><p>No, porque <em><code>ALTER</code></em> es un comando DDL y el servidor Oracle realiza un <em><code>COMMIT</code></em> automático cuando se ejecutan las declaraciones DDL.</p><h3 id="-cu-l-es-la-nica-restricci-n-que-aplica-reglas-a-nivel-de-columna">¿Cuál es la única restricción que aplica reglas a nivel de columna?</h3><p><em><code>NOT NULL</code></em> es la única restricción que funciona a nivel de columna.</p><h3 id="-cu-les-son-las-pseudo-columnas-en-sql-da-algunos-ejemplos-">¿Cuáles son las pseudo-columnas en SQL? Da algunos ejemplos.</h3><p>Una pseudo-columna es una función que devuelve un valor generado por el sistema. La razón por la que se conoce así es porque una pseudo-columna es un valor asignado por Oracle que se utiliza en el mismo contexto que una columna de la base de datos Oracle, pero que no se almacena en el disco.</p><pre><code class="language-SQL">ROWNUM, ROWID, USER, CURRVAL, NEXTVAL etc</code></pre><p>Crea un usuario my723acct con contraseña kmd26pt. Utiliza los <em>tablespaces </em>de datos de usuario y datos temporales proporcionados por PO8 y proporciona a este usuario 10M de espacio de almacenamiento en datos de usuario (<em>user_data</em>) y 5M de espacio de almacenamiento en datos temporales (<em>temporary_data</em>).</p><pre><code class="language-SQL">CREATE USER my723acct IDENTIFIED BY kmd26pt
DEFAULT TABLESPACE user_data
TEMPORARY TABLESPACE temporary_data
QUOTA 10M on user_data QUOTA 5M on temporary_data</code></pre><h3 id="cree-el-role-role_tables_and_views">Cree el <em><code>ROLE</code></em> <em>role_tables_and_views</em></h3><pre><code class="language-SQL">CREATE ROLE role_tables_and_views</code></pre><p>Concede al rol de la pregunta anterior los privilegios para conectarse a la base de datos y los privilegios para crear tablas y vistas. </p><p>El privilegio para conectarse a la base de datos es <em><code>CREATE SESSION</code></em>. El privilegio para crear una tabla es <em><code>CREATE TABLE</code>. </em>El privilegio para crear una vista es <em><code>CREATE VIEW</code>. </em></p><pre><code class="language-SQL">GRANT Create session, create table, create view TO role_tables_and_views</code></pre><h3 id="concede-el-role-de-la-pregunta-anterior-a-los-usuarios-anny-y-rita">Concede el <em><code>ROLE</code> </em>de la pregunta anterior a los usuarios anny y rita</h3><pre><code class="language-SQL">GRANT role_tables_and_views TO anny, rita</code></pre><p>Escribe un comando para cambiar la contraseña del usuario rita de abcd a dfgh</p><pre><code class="language-SQL">ALTER USER rita IDENTIFIED BY dfgh</code></pre><p>Los usuarios rita y anny no tienen privilegios <em><code>SELECT</code> </em>en la tabla de inventario (<em>INVENTORY</em>) que fue creado por SCOTT. Escribe un comando para permitir que SCOTT le conceda a los usuarios privilegios <em><code>SELECT</code> </em>en estas tablas.</p><pre><code class="language-SQL">GRANT select ON inventory TO rita, anny</code></pre><p>El usuario rita ha sido transferida y ya no necesita el privilegio que se le concedió a través del <em><code>ROLE</code> </em>role_tables_and_views. Escribe un comando para quitarle los privilegios que se le habían otorgado anteriormente, excepto que aún pueda conectarse a la base de datos.</p><pre><code>REVOKE select ON scott.inventory FROM rita
REVOKE create table, create view FROM rita</code></pre><p>El usuario rita, que había sido transferida, ahora se traslada a otra empresa. Dado que los objetos que creó ya no son útiles, escriba un comando para eliminar este usuario y todos sus objetos.</p><p>Aquí la opción <em><code>CASCADE</code> </em>es necesaria para eliminar todos los objetos del usuario en la base de datos.</p><pre><code>DROP USER rita CASCADE</code></pre><h3 id="escribe-una-consulta-sql-para-encontrar-el-en-simo-salario-m-s-alto-de-la-tabla">Escribe una consulta SQL para encontrar el enésimo salario más alto de la tabla</h3><pre><code>SELECT TOP 1 Salary
FROM (
	SELECT DISTINCT TOP N Salary
    FROM Employee
    ORDER BY Salary DESC
    )
ORDER BY Salary ASC</code></pre><h2 id="declaracion-sql-create-view">Declaracion SQL <em>Create View</em></h2><h3 id="-qu-es-una-view-vista-">¿Qué es una <em>View</em> (Vista)?</h3><p>Una Vista es un objeto de la base de datos que presenta los datos existentes en uno o más tablas. Las Vistas se utilizan de manera similar a las tablas, pero no contienen ningún dato. Sólo "apuntan" a los datos que existen en otra parte (tablas o vistas, por ejemplo).</p><h3 id="-por-qu-nos-gustan">¿Por qué nos gustan?</h3><ul><li>Vistas son una forma de limitar los datos presentados. Por ejemplo, los datos del departamento de recursos humanos filtrados para presentar sólo información no sensible. Información sensible en este caso podrían ser números de seguridad social, el sexo del empleado, tasa de pago, dirección de domicilio, etc.</li><li>Los datos complejos de más de una tabla pueden combinarse en una única "Vista". Esto puede facilitar la vida a sus analistas de negocio y programadores. </li></ul><h3 id="consejos-de-seguridad-importantes">Consejos de seguridad importantes</h3><ul><li>Las Vistas son gestionadas por el sistema. Cuando los datos en las tablas relacionados se modifican, añaden o actualizan, la Vista es actualizada por el sistema. Queremos utilizarlas sólo cuando sea necesario gestionar el uso de los recursos del sistema. </li><li>En MySQL, cambios en el diseño de una tabla (es decir, columnas nuevas o eliminadas) realizados DESPUÉS de la creación de una Vista no se actualizan en la propia Vista. La Vista tendría que ser actualizada o recreada. </li><li>Las Vistas son uno de los cuatro tipos de objetos estándar de las bases de datos. Los otros son las tablas, procedimientos almacenados y funciones.</li><li>Las Vistas usualmente pueden ser tratadas como una tabla, pero las actualizaciones están limitadas o no están disponibles cuando la Vista contiene más de una tabla. </li><li>Hay muchos otros detalles sobre las Vistas que están fuera del alcance de esta guía introductoria. Dedique tiempo al manual de su gestor de base de datos y diviértase con este poderoso objeto SQL.</li></ul><p>Sintaxis de la declaración <em>Create View </em>(MySQL)</p><pre><code class="language-SQL">CREATE
	[OR REPLACE]
    [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    [DEFINER = {user | CURRENT_USER}]
    [SQL SECURITY {DESINGER | INVOKER}]
    VIEW view_name[(column_list)]
    AS select_statement
    [WITH [CASCADED | LOCAL] CHECK OPTION]</code></pre><p>Esta guia cubrirá esta parte de la declaración:</p><pre><code class="language-SQL">CREATE
	VIEW view_name[(column_list)]
    AS select_statement</code></pre><h3 id="ejemplo-de-creacion-de-una-vista-view-a-partir-de-las-tablas-de-estudiantes-student-">Ejemplo de creacion de una Vista (<em>View</em>) a partir de las tablas de estudiantes (<em>student</em>)</h3><p>Notas:</p><ul><li>El nombre de la Vista tiene una "v" al final. Se recomienda que el nombre de la Vista indique que es una vista de alguna manera para facilitar la vida a los programadores y administradores de la base de datos. Tu tienda de informática debe tener sus propias reglas para nombrar los objetos.</li><li>Las columnas de la Vista están limitadas por la cláusula <em>SELECT </em> y las filas de datos por la cláusula <em>WHERE.</em></li><li>El carácter "`" alrededor de los nombres de las Vistas es necesario debido al "-" en los nombres. MySQL informa de un error sin ellos. </li></ul><pre><code class="language-SQL">create view `programming-students-v` as
SELECT FullName, programOfStudy
FROM student
WHERE programOfStudy = 'Programming';


SELECT * FROM `programming-students-v`; </code></pre><h3 id="ejemplo-de-uso-de-una-vista-para-combinar-datos-de-m-s-de-una-tabla">Ejemplo de uso de una Vista para combinar datos de más de una tabla</h3><p>Se ha agregado una tabla demográfico de estudiantes a la base de datos para demostrar este uso. Esta Vista combinará estas tablas. </p><p>Notas:</p><ul><li>Para "unir" tablas, las tablas deben tener campos en común (normalmente claves primarias) que identifiquen de forma única cada fila. En este caso es el ID del estudiante.</li><li>Fíjese en el "alias" dado a cada tabla ("s" para estudiante y "sc" para contacto con el estudiante). Se trata de una herramienta para acortar los nombres de las tablas y facilitar la identificación de la tabla que se está utilizando. Es más fácil que escribir repetidamente nombres de tablas largas. En este ejemplo, era necesario porque <em>studentID </em>es el mismo nombre de columna en ambas tablas, y el sistema presentaría un "error de nombre de columna ambiguo" sin especificar qué tabla utilizar. </li></ul><h3 id="gu-a-del-operador-between">Guía del operador <em>Between</em> </h3><p>El operador <em>BETWEEN </em>es útil gracias al Optimizador de Consultas SQL (<em>SQL Query Optimizer</em>). Aunque <em>BETWEEN </em>es funcionalmente lo mismo que: x &lt;= element &lt;= y, el Oprimizador de Consultas reconocerá este comando más rápidamente, y ha optimizado el código para ejecutarlo.</p><p>Este operador se usa en una cláusula <em>WHERE </em>o en una cláusula <em>GROUP BY HAVING.</em></p><p>Se seleccionan las filas que tienen un valor mayor que el valor mínimo y menos que el valor máximo. </p><p>Es importante tener en cuenta que los valores introducidos en el comando se excluyen del resultado. Obtenemos sólo lo que está entre ellos.</p><p>Esta es la sintaxis para utilizar la función en una cláusula <em>WHERE:</em></p><pre><code>SELECT field1, testfield
FROM table1
WHERE testField BETWEEN min and max</code></pre><p>Y aquí un ejemplo utilizando la tabla de estudiantes y la cláusula <em>WHERE</em>:</p><pre><code>-- sin clausula WHERE
SELECT studentID, FullName, studentID
FROM student;

-- clausula WHERE con BETWEEN
SELECT studentID, FullName, studentID
FROM student
WHERE studentID between 2 and 7;
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/07/between01.jpg" class="kg-image" alt="between01" width="567" height="206" loading="lazy"></figure><p>Aquí hay un ejemplo usando la tabla de fondos de campaña y la cláusula <em>HAVING. </em>Esto devolverá las filas en las que la suma de las donaciones de un candidato esté entre 3 y 18 millones de dólares, basándose en la cláusula <em>HAVING</em> en la parte <em>GROUP BY </em>de la declaración. Más información sobre la agregación en esa guía.</p><pre><code>SELECT Candidate, Office_Sought, Election_Year, format(sum(TOTAL_$),2)
FROM combined_party_data
WHERE Election_Year = 2016
GROUP BY Candidate, Office_Sought, Election_Year
HAVING sum(Total_$) BETWEEN 3000000 and 18000000
ORDER BY sum(Total_$) DESC;</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/07/between02.jpg" class="kg-image" alt="between02" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/07/between02.jpg 600w, https://www.freecodecamp.org/espanol/news/content/images/2022/07/between02.jpg 680w" width="680" height="147" loading="lazy"></figure><p>Una tabla es un grupo de datos almacenados en una base de datos. </p><p>Para crear una tabla en una base de datos se utiliza la declaración <em><code>CREATE TABLE</code>. </em>Se le da un nombre a la tabla y una lista de columnas con sus tipos de datos. </p><pre><code class="language-SQL">CREATE TABLE TABLENAME(Attribute1 Datatype, Attribute2 Datatype, ...);</code></pre><p>Aquí hay un ejemplo de creación de una tabla llamado Persona:</p><pre><code class="language-SQL">CREATE TABLE Persona(
	Id int not null,
    Name varchar not null,
    DateOfBirth date not null,
    Gender bit not null,
    PRIMARY KEY(Id)
);</code></pre><p>En el ejemplo anterior, cada Persona tiene un Nombre (<em>Name</em>), fecha de nacimiento (<em>DateOfBirth</em>), y género (<em>Gender</em>). La columna Id es la clave que identifica a una persona en la tabla. Se utiliza la palabra clave <code>PRIMARY KEY</code> para configurar una o más columnas como claves primarias. </p><p>Una columna puede ser <code>not null</code> o <code>null</code> indicando si es obligatoria o no.</p><p>Las consultas de inserción son una forma de insertar datos en una tabla. Digamos que hemos creado una tabla utilizando:</p><pre><code>CREATE TABLE tabla_ejemplo(nombre varchar(255), edad int)</code></pre><p>tabla_ejemplo</p><pre><code>Nombre | Edad
  ---  |  ---</code></pre><p>Ahora para agregar algunos datos a esta tabla, utilizaremos <em>INSERT </em>de la siguiente manera:</p><pre><code class="language-SQL">INSERT INTO tabla_ejemplo(column1, column2) VALUES ("Andrew",23)</code></pre><p>tabla_ejemplo</p><pre><code>Nombre | Edad
  ---  | ---
Andrew | 23</code></pre><p>Incluso lo siguiente funciona, pero siempre es una buena práctica especificar qué datos van en cada columna. </p><pre><code>INSERT INTO tabla_nombre VALUES("John",28)</code></pre><p>tabla_ejemplo</p><pre><code>Nombre | Edad
  ---  | ---
Andrew | 23
John   | 28</code></pre><p><em>AND</em> se utiliza en una cláusula <em>WHERE </em>o en una cláusula <em>GROUP BY HAVING </em>para limitar las filas devueltas por la declaración ejecutada. Se utiliza <em>AND</em> cuando se requiera que se cumpla más de una condición. </p><p>Utilizremos la tabla de estudiantes para presentar ejemplos.</p><p>Aquí está la tabla de estudiantes sin una cláusula WHERE:</p><pre><code>SELECT * FROM student;</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/07/and_operator01.jpg" class="kg-image" alt="and_operator01" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/07/and_operator01.jpg 600w, https://www.freecodecamp.org/espanol/news/content/images/2022/07/and_operator01.jpg 760w" sizes="(min-width: 720px) 720px" width="760" height="247" loading="lazy"></figure><p>Ahora se añade la cláusula <em>WHERE </em>para mostrar sólo los alumnos de programación:</p><pre><code>SELECT * 
FROM student
WHERE programsOfStudy = 'Programming';</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/07/and_operator02.jpg" class="kg-image" alt="and_operator02" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/07/and_operator02.jpg 600w, https://www.freecodecamp.org/espanol/news/content/images/2022/07/and_operator02.jpg 790w" sizes="(min-width: 720px) 720px" width="790" height="179" loading="lazy"></figure><p>Ahora la clausula <em>WHERE </em>se actualiza con <em>AND </em>para mostrar los resultados de los estudiantes de programación que también tienen una puntuación SAT superior a 800:</p><pre><code>SELECT *
FROM student
WHERE programOfStudy = 'Programming'
AND sat_score &gt; 800;</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/07/and_operator03.jpg" class="kg-image" alt="and_operator03" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/07/and_operator03.jpg 600w, https://www.freecodecamp.org/espanol/news/content/images/2022/07/and_operator03.jpg 790w" sizes="(min-width: 720px) 720px" width="790" height="179" loading="lazy"></figure><p>Este es un ejemplo más complejo de la tabla de contribuciones de campaña. Este ejemplo tiene una cláusula <em>GROUP BY </em>con una cláusula <em>HAVING </em>que utiliza un <em>AND </em>para restringir los registros devueltos a los candidatos de 2016 con contribuciones entre 3 y 18 millones de dólares en total.</p><pre><code>SELECT Candidate, Office_Sought, Election_Year, FORMAT(sum(Total_$),2)
FROM combined_party_data
WHERE Office_sought = 'PRESIDENT / VICE PRESIDENT'
GROUP BY Candidate, Office_Sought, Election_Year
HAVING Election_Year = 2016 AND sum(Total_$) BETWEEN 3000000 and 18000000
ORDER BY sum(Total_$) DESC;
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/07/and_operator06.jpg" class="kg-image" alt="and_operator06" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/07/and_operator06.jpg 600w, https://www.freecodecamp.org/espanol/news/content/images/2022/07/and_operator06.jpg 710w" width="710" height="175" loading="lazy"></figure><h2 id="c-mo-utilizar-order-by-en-sql">Cómo utilizar <em>ORDER BY </em>en SQL</h2><h3 id="order-by-asc-desc--1"><em>Order By (ASC, DESC)</em></h3><p><em>ORDER BY</em> nos da una forma de ordenar el conjunto de resultados por uno o más elementos de la sección <em>SELECT</em>. A continuación se muestra un SQL que ordena a los estudiantes por nombre (<em>FullName</em>) en orden descendente. El orden por defecto es ascendente (ASC) por lo que para ordenar en el orden contrario se utiliza DESC. </p><pre><code>SELECT studentId, FullName, sat_score
FROM student
ORDER BY FullName DESC;</code></pre><pre><code>+-----------+------------------------+-----------+
| studentID | FullName               | sat_score |
+-----------+------------------------+-----------+
|         2 | Teri Gutierrez         |       800 |
|         3 | Spencer Pautier        |      1000 |
|         6 | Sophie Freeman         |      1200 |
|         9 | Raymond F. Boyce       |      2400 |
|         1 | Monique Davis          |       400 |
|         4 | Louis Ramsey           |      1200 |
|         7 | Edgar Frank "Ted" Codd |      2400 |
|         8 | Donald D. Chamberlin   |      2400 |
|         5 | Alvin Greene           |      1200 |
+-----------+------------------------+-----------+
9 rows in set (0.00 sec)</code></pre><p>Aquí está la lista de estudiantes actual, no ordenada, para compararla con la anterior: </p><pre><code>SELECT studentID, FullName, sat_score, rcd_updated
FROM student;</code></pre><pre><code>+-----------+------------------------+-----------+---------------------+
| studentID | FullName               | sat_score | rcd_updated         |
+-----------+------------------------+-----------+---------------------+
|         1 | Monique Davis          |       400 | 2017-08-16 15:34:50 |
|         2 | Teri Gutierrez         |       800 | 2017-08-16 15:34:50 |
|         3 | Spencer Pautier        |      1000 | 2017-08-16 15:34:50 |
|         4 | Louis Ramsey           |      1200 | 2017-08-16 15:34:50 |
|         5 | Alvin Greene           |      1200 | 2017-08-16 15:34:50 |
|         6 | Sophie Freeman         |      1200 | 2017-08-16 15:34:50 |
|         7 | Edgar Frank "Ted" Codd |      2400 | 2017-08-16 15:35:33 |
|         8 | Donald D. Chamberlin   |      2400 | 2017-08-16 15:35:33 |
|         9 | Raymond F. Boyce       |      2400 | 2017-08-16 15:35:33 |
+-----------+------------------------+-----------+---------------------+
9 rows in set (0.00 sec)</code></pre><p>Como con todas estas cosas de SQL, hay mucho más de lo que hay en esta guía introductoria. </p><p>Espero que esto al menos te dé lo suficiente para empezar.</p><p>Por favor, consulta el manual de tu gestor de base de datos y diviértete probando diferentes opciones por ti mismo. </p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Sentencia SQL Update — Ejemplo de Consultas para Actualizar los Valores de una Tabla ]]>
                </title>
                <description>
                    <![CDATA[ SQL (pronunciado Seequel) significa lenguaje de consulta estructurado (Structured Query Language). Es un lenguaje de consulta fuertemente tipado [https://es.wikipedia.org/wiki/Tipado_fuerte] (los tipos se comprueban antes del tiempo de ejecución) y estático que apareció por primera vez en 1974 (¡Woah, 46 años!), pero no se publicó inicialmente hasta 1986. Podrías pensar que ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/declaracion-sql-update/</link>
                <guid isPermaLink="false">600476b4a4e0700982a9e6ee</guid>
                
                    <category>
                        <![CDATA[ SQL ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Juan Carrillo ]]>
                </dc:creator>
                <pubDate>Mon, 08 Mar 2021 05:05:21 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/01/markus-winkler-cxoR55-bels-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>SQL (pronunciado Seequel) significa lenguaje de consulta estructurado (Structured Query Language). Es un lenguaje de consulta <a href="https://es.wikipedia.org/wiki/Tipado_fuerte">fuertemente tipado</a> (los tipos se comprueban antes del tiempo de ejecución) y estático que apareció por primera vez en 1974 (¡Woah, 46 años!), pero no se publicó inicialmente hasta 1986.</p><p>Podrías pensar que una herramienta tan "vieja" tienes sus mejores días detrás de ella, pero estarías lejos de estar en lo cierto. En 2019, a través de la <a href="https://scalegrid.io/blog/2019-database-trends-sql-vs-nosql-top-databases-single-vs-multiple-database-use/">encuesta de Scale Grid DeveloperWeek</a>, SQL fue utilizado por el 60.5% de los encuestados, mientras que <a href="https://es.wikipedia.org/wiki/NoSQL">NoSQL</a> fue utilizado por solo el 39.5% de los encuestados.</p><p>Para ser claros, la categoría SQL se dividió en varias subcategorías que incluían <a href="https://es.wikipedia.org/wiki/MySQL">MySQL</a>, <a href="https://es.wikipedia.org/wiki/PostgreSQL">PostgreSQL</a>, <a href="https://es.wikipedia.org/wiki/Microsoft_SQL_Server">SQL Server</a>, etc., mientras que la categoría NoSQL se dividió en subcategorías que contenían <a href="https://es.wikipedia.org/wiki/MongoDB">MongoDB</a>, <a href="https://es.wikipedia.org/wiki/Apache_Cassandra">Cassandra</a>, etc.</p><p>Incluso en 2017, según la <a href="https://insights.stackoverflow.com/survey/2017">Stack Overflow Developer's Survey</a>, el segundo lenguaje más utilizado fue SQL (justo detrás de JavaScript) con el 50% de los 64,000 encuestados diciendo que todavía utilizan SQL en alguna forma.</p><p>Su popularidad se debe, al menos en parte, a la simplicidad del lenguaje, al hecho de que fue construido con datos relacionales en mente, y porque ha demostrado ser fiable para buscar, unir y filtrar datos.</p><p>Basta con decir que SQL no sólo está vivito y coleando, sino que prospera entre la comunidad de desarrollo de hoy en día.</p><p>¡Ahora vamos a ver por qué!</p><h2 id="las-partes-divertidas">Las partes divertidas</h2><p>SQL Server es el sabor preferido de SQL que utilizo en mis actividades cotidianas en el trabajo, por lo que los ejemplos siguientes se ajustarán a esas normas.</p><p>Una de las cosas que más me gusta hacer es actualizar varios registros dentro de una tabla. Ahora podría hacer este registro de uno en uno, pero SQL nos da la capacidad de actualizar múltiples (miles y miles si es necesario) registros a la vez a través de la declaración <code>UPDATE</code>.</p><p>La declaración <code>UPDATE</code> puede utilizarse para actualizar una sola columna, un conjunto más amplio de registros (mediante el uso de condiciones), y/o toda la tabla en una base de datos. La(s) condición(es) puede(n) ser un booleano, una verificación de cadena de texto o una secuencia matemática que se resuelve en un booleano (mayor que, menos que, etc.).</p><p>Aunque puede variar ligeramente de un sabor a otro, la sintaxis general es la siguiente:</p><pre><code class="language-SQL">UPDATE nombre-de-la-tabla
SET nombre-de-la-columna = valor[, nombre-de-la-columna=valor]
[WHERE condición]</code></pre><p>Los corchetes ( [] ) de arriba denotan adiciones opcionales a la consulta.</p><p><strong><u>***Es muy importante tener en cuenta que sin la condición de WHERE, TODOS los registros de la tabla se actualizarán tan pronto como se ejecute la consulta.***</u></strong></p><h2 id="consultas-de-ejemplo">Consultas de ejemplo</h2><p>Como nuestro conjunto de datos, usaré esta tabla llamada <em><strong>Work_Tickets</strong></em>:</p><!--kg-card-begin: html--><table>
        <tbody><tr><th>
          </th></tr><tr>
            <td><strong>SalesOrderNum</strong></td>
            <td><strong>WorkTicketNum</strong></td>
            <td><strong>Customer_Code</strong></td>
              <td><strong>Customer_Contact</strong></td>
            <td><strong>UnitCost</strong></td>
            <td><strong>Billed</strong></td>
            <td><strong>ParentLineKey</strong></td>
            <td><strong>Qty_Ordered</strong></td>
            <td><strong>Qty_Shipped</strong></td>
          </tr>
        
        </tbody><tbody>
          <tr>
            <td>00061356</td>
            <td>000931</td>
            <td>1250</td> 
              <td>sales@wayneindustries.com</td>
            <td>0.00</td>
            <td>False</td>
            <td>079777</td>
            <td>12.0</td>
            <td>0</td>
          </tr>
          <tr>
            <td>00061357</td>
            <td>000932</td>
              <td>1251</td>  
              <td>contact@starkindustries.com</td>
            <td>0.00</td>
            <td>False</td>
            <td>085695</td>
            <td>196.5</td>
            <td>0</td>
          </tr>
          <tr>
            <td>00061358</td>
            <td>000933</td>
              <td>1252</td>
              <td>animation@acmetoons.com</td>
            <td>0.00</td>
            <td>False</td>
            <td>085569</td>
            <td>17.5</td>
            <td>0</td></tr></tbody></table><!--kg-card-end: html--><!--kg-card-begin: html--><table><tbody><tr><td></td>
          </tr>
        </tbody>
      </table><!--kg-card-end: html--><h4 id="consulta-simple-sin-condiciones">Consulta simple sin condiciones</h4><p>Aquí hay una consulta de actualización muy simple que cambiará todos los campos de <code>UnitCost</code> al número <code>131.6152</code>:</p><pre><code class="language-SQL">UPDATE Work_Tickets
SET UnitCost = 131.6152</code></pre><p>Nota que no hay cláusula de <code>WHERE</code>, así que cada línea de la tabla se actualizará y nuestro conjunto de datos se verá así:</p><!--kg-card-begin: html--><table><tbody><tr><th>
          </th></tr><tr>
            <td><strong>SalesOrderNum</strong></td>
            <td><strong>WorkTicketNum</strong></td>
              <td><strong>Customer_Code</strong></td>
              <td><strong>Customer_Contact</strong></td>
            <td><strong>UnitCost</strong></td>
            <td><strong>Billed</strong></td>
            <td><strong>ParentLineKey</strong></td>
            <td><strong>Qty_Ordered</strong></td>
            <td><strong>Qty_Shipped</strong></td>
          </tr>
        
        </tbody><tbody>
          <tr>
            <td>00061356</td>
            <td>000931</td>
              <td>1250</td>
              <td>sales@wayneindustires.com</td>
            <td>131.6152</td>
            <td>False</td>
            <td>079777</td>
            <td>12.0</td>
            <td>0</td>
          </tr>
          <tr>
            <td>00061357</td>
            <td>000932</td>
              <td>1251</td>
              <td>contact@starkindustries.com</td>
            <td>131.6152</td>
            <td>False</td>
            <td>085695</td>
            <td>196.5</td>
            <td>0</td>
          </tr>
          <tr>
            <td>00061358</td>
            <td>000933</td>
              <td>1252</td>
              <td>animation@acmetoons.com</td>
            <td>131.6152</td>
            <td>False</td>
            <td>085569</td>
            <td>17.5</td>
            <td>0</td>
          </tr>
        </tbody>
      </table><!--kg-card-end: html--><h4 id="consultas-simples-con-condici-n-es-">Consultas simples con condición(es)</h4><p>Aquí hay una simple consulta con una declaración de condición:</p><pre><code class="language-SQL">UPDATE Work_Tickets
SET Billed = true
WHERE UnitCost &lt;&gt; 0.00</code></pre><p>Esta consulta actualizará el campo de <code>Billed</code> para que sea <em>true</em> en cada línea que coincida con la condición de <code>UnitCost</code> no igual a 0. Después de ejecutar nuestra consulta, el conjunto de datos se verá así:</p><!--kg-card-begin: html--><table>
        <tbody><tr><th>
          </th></tr><tr>
            <td><strong>SalesOrderNum</strong></td>
            <td><strong>WorkTicketNum</strong></td>
              <td><strong>Customer_Code</strong></td>
              <td><strong>Customer_Contact</strong></td>
            <td><strong>UnitCost</strong></td>
            <td><strong>Billed</strong></td>
            <td><strong>ParentLineKey</strong></td>
            <td><strong>Qty_Ordered</strong></td>
            <td><strong>Qty_Shipped</strong></td>
          </tr>
        
        </tbody><tbody>
          <tr>
            <td>00061356</td>
            <td>000931</td>
              <td>1250</td>
              <td>sales@wayneindustires.com</td>
            <td>131.6152</td>
            <td>True</td>
            <td>079777</td>
            <td>12.0</td>
            <td>0</td>
          </tr>
          <tr>
            <td>00061357</td>
            <td>000932</td>
              <td>1251</td>
              <td>contact@starkindustries.com</td>
            <td>131.6152</td>
            <td>True</td>
            <td>085695</td>
            <td>196.5</td>
            <td>0</td>
          </tr>
          <tr>
            <td>00061358</td>
            <td>000933</td>
              <td>1252</td>
              <td>animation@acmetoons.com</td>
            <td>131.6152</td>
            <td>True</td>
            <td>085569</td>
            <td>17.5</td>
            <td>0</td>
          </tr>
        </tbody>
      </table><!--kg-card-end: html--><p>Abajo hay una consulta en la que cambiamos el <code>ParentLineKey</code> por la cadena <code>000134</code> en la que el <code>SalesOrderNum</code> y el <code>WorkTicketNum</code> coinciden con las cadenas dadas.</p><pre><code class="language-SQL">UPDATE Work_Tickets
SET ParentLineKey = 000134
WHERE SalesOrderNum = 00061358 and WorkTicketNumber = 000933</code></pre><p>Así que, el 085569 en el campo <code>ParentLineKey</code> será reemplazado por 000134 y nuestro conjunto de datos ahora se ve así:</p><!--kg-card-begin: html--><table><tbody><tr><th>
          </th></tr><tr>
            <td><strong>SalesOrderNum</strong></td>
            <td><strong>WorkTicketNum</strong></td>
              <td><strong>Customer_Code</strong></td>
              <td><strong>Customer_Contact</strong></td>
            <td><strong>UnitCost</strong></td>
            <td><strong>Billed</strong></td>
            <td><strong>ParentLineKey</strong></td>
            <td><strong>Qty_Ordered</strong></td>
            <td><strong>Qty_Shipped</strong></td>
          </tr>
        
        </tbody><tbody>
          <tr>
            <td>00061356</td>
            <td>000931</td>
              <td>1250</td>
            <td>sales@wayneindustires.com</td>
            <td>131.6152</td>
            <td>True</td>
            <td>079777</td>
            <td>12.0</td>
            <td>0</td>
          </tr>
          <tr>
            <td>00061357</td>
            <td>000932</td>
              <td>1251</td>
              <td>contact@starkindustries.com</td>
            <td>131.6152</td>
            <td>True</td>
            <td>085695</td>
            <td>196.5</td>
            <td>0</td>
          </tr>
          <tr>
            <td>00061358</td>
            <td>000933</td>
              <td>1252</td>
              <td>animation@acmetoons.com</td>
            <td>131.6152</td>
            <td>True</td>
            <td>000134</td>
            <td>17.5</td>
            <td>0</td>
          </tr>
        </tbody>
      </table><!--kg-card-end: html--><h4 id="actualizando-m-ltiples-campos">Actualizando múltiples campos</h4><p>Digamos que tienes un conjunto de datos mucho más grande que el que estamos usando actualmente y tienes varios campos para actualizar.</p><p>Sería tedioso y aburrido actualizarlos con diferentes declaraciones de actualización. Por suerte para nosotros también es posible actualizar varios campos a la vez con una declaración de actualización (update), siempre y cuando separemos los nombres de las columnas con una coma:</p><pre><code class="language-SQL">UPDATE Work_Tickets
SET UnitCost = 129.8511, Qty_Ordered = 72, Qty_Shipped = 72
WHERE SalesOrderNum = 00061358</code></pre><p>Y aquí está el resultado con los campos actualizados después de ejecutar la consulta:</p><!--kg-card-begin: html--><table><tbody><tr><td><strong>SalesOrderNum</strong></td>
            <td><strong>WorkTicketNum</strong></td>
              <td><strong>Customer_Code</strong></td>
              <td><strong>Customer_Contact</strong></td>
            <td><strong>UnitCost</strong></td>
            <td><strong>Billed</strong></td>
            <td><strong>ParentLineKey</strong></td>
            <td><strong>Qty_Ordered</strong></td>
            <td><strong>Qty_Shipped</strong></td>
          </tr>
        
        </tbody><tbody>
          <tr>
            <td>00061356</td>
            <td>000931</td>
              <td>1250</td>
              <td>sales@wayneindustires.com</td>
            <td>131.6152</td>
            <td>True</td>
            <td>079777</td>
            <td>12.0</td>
            <td>0</td>
          </tr>
          <tr>
            <td>00061357</td>
            <td>000932</td>
              <td>1251</td>
              <td>contact@starkindustries.com</td>
            <td>131.6152</td>
            <td>True</td>
            <td>085695</td>
            <td>196.5</td>
            <td>0</td>
          </tr>
          <tr>
            <td>00061358</td>
            <td>000933</td>
              <td>1252</td>
              <td>animation@acmetoons.com</td>
            <td>129.8511</td>
            <td>True</td>
            <td>000134</td>
            <td>72</td>
            <td>72</td>
          </tr>
        </tbody>
      </table><!--kg-card-end: html--><h4 id="usando-update-en-una-subconsulta">Usando Update en una subconsulta</h4><p>Los ejemplos anteriores son perfectos si se trabaja con una sola fuente de datos. Sin embargo, la mayoría de tus datos no se almacenarán en una sola tabla. Ahí es donde el uso de <em>UPDATE </em>con múltiples fuentes de datos es útil.</p><p>La sintaxis para actualizar una columna/tabla cambia un poco si queremos traer datos de otra tabla:</p><pre><code class="language-SQL">UPDATE nombre-de-la-tabla
SET nombre-de-la-columna = (SELECT nombre de columna(s)
FROM nombre-de-la-tabla2
WHERE condición(es))
[WHERE condición]</code></pre><p>Y aquí están las dos tablas que usaremos para esta consulta - la <strong>tabla</strong> <strong><em>Work_Tickets</em></strong><em>:</em></p><!--kg-card-begin: html--><table><tbody><tr><th>
          </th></tr><tr>
            <td><strong>SalesOrderNum</strong></td>
            <td><strong>WorkTicketNum</strong></td>
              <td><strong>Customer_Code</strong></td>
              <td><strong>Customer_Contact</strong></td>
            <td><strong>UnitCost</strong></td>
            <td><strong>Billed</strong></td>
            <td><strong>ParentLineKey</strong></td>
            <td><strong>Qty_Ordered</strong></td>
            <td><strong>Qty_Shipped</strong></td>
          </tr>
        
        </tbody><tbody>
          <tr>
            <td>00061356</td>
            <td>000931</td>
              <td>1250</td>
              <td>sales@wayneindustires.com</td>
            <td>131.6152</td>
            <td>True</td>
            <td>079777</td>
            <td>12.0</td>
            <td>0</td>
          </tr>
          <tr>
            <td>00061357</td>
            <td>000932</td>
              <td>1251</td>
              <td>contact@starkindustries.com</td>
            <td>131.6152</td>
            <td>True</td>
            <td>085695</td>
            <td>196.5</td>
            <td>0</td>
          </tr>
          <tr>
            <td>00061358</td>
            <td>000933</td>
              <td>1252</td>
              <td>animation@acmetoons.com</td>
            <td>129.8511</td>
            <td>True</td>
            <td>000134</td>
            <td>72</td>
            <td>72</td>
          </tr>
        </tbody>
      </table><!--kg-card-end: html--><p>y la <strong>tabla <em>Customer_Info</em></strong><em>:</em></p><!--kg-card-begin: html--><table><tbody><tr><th></th></tr><tr>
            <td><strong>Name</strong></td>
            <td><strong>Industry</strong></td>
            <td><strong>Code</strong></td>
            <td><strong>Address</strong></td>
              <td><strong>City</strong></td>
            <td><strong>Discount</strong></td>
            <td><strong>PhoneNumber</strong></td>
            <td><strong>Email</strong></td>
          </tr>
        
        </tbody><tbody>
          <tr>
            <td>Wayne Enterprises</td>
            <td>Defense,weaponry,aerospace,enginerring</td>
            <td>NULL</td>
            <td>1631 Dark Knight Way</td>
            <td>Gotham</td>
            <td>19.75</td>
            <td>5556614000</td>
              <td>sales@wayneindustires.com</td>
          </tr>
          <tr>
            <td>Stark Industries</td>
            <td>Defense,weaponry,protection</td>
              <td>1251</td>
            <td>5641 Iron Dr</td>
            <td>Undisclosed</td>
            <td>19.73</td>
            <td>9993126156</td>
            <td>contact@starkindustries.com</td>
          </tr>
          <tr>
            <td>Acme Corp</td>
            <td>Comedy,laughter,animation</td>
            <td>1252</td>
            <td>24569 Smiling St</td>
            <td>Toon Town</td>
            <td>17.53</td>
            <td>3216549877</td>
              <td>animation@acmetoons.com
          </td></tr>
        </tbody>
      </table><!--kg-card-end: html--><p>La declaración <code>UPDATE</code> con la <a href="https://docs.microsoft.com/en-us/sql/relational-databases/performance/subqueries?view=sql-server-ver15">subconsulta</a> se ve así:</p><pre><code class="language-SQL">UPDATE Customer_Info
SET Code = (SELECT Customer_Code
FROM Work_Tickets
WHERE Work_Tickets.Customer_Contact = Customer_Info.Email)
FROM Work_Tickets
WHERE Code IS NULL</code></pre><p>Este ejemplo actualizará el campo <em>Code</em> de la tabla <em>Customer_Info</em> donde la dirección de correo electrónico coincide con la de ambas tablas. Y así es como se ve ahora nuestra tabla <em>Customer_Info</em>:</p><!--kg-card-begin: html--><table>
        <tbody><tr><th>
          </th></tr><tr>
            <td><strong>Name</strong></td>
            <td><strong>Industry</strong></td>
            <td><strong>Code</strong></td>
            <td><strong>Address</strong></td>
              <td><strong>City</strong></td>
            <td><strong>Discount</strong></td>
            <td><strong>PhoneNumber</strong></td>
            <td><strong>Email</strong></td>
          </tr>
        
        </tbody><tbody>
          <tr>
            <td>Wayne Enterprises</td>
            <td>Defense,weaponry,aerospace,enginerring</td>
            <td>1250</td>
            <td>1631 Dark Knight Way</td>
            <td>Gotham</td>
            <td>19.75</td>
            <td>5556614000</td>
              <td>sales@wayneindustires.com</td>
          </tr>
          <tr>
            <td>Stark Industries</td>
            <td>Defense,weaponry,protection</td>
              <td>1251</td>
            <td>5641 Iron Dr</td>
            <td>Undisclosed</td>
            <td>19.73</td>
            <td>9993126156</td>
            <td>contact@starkindustries.com</td>
          </tr>
          <tr>
            <td>Acme Corp</td>
            <td>Comedy,laughter,animation</td>
            <td>1252</td>
            <td>24569 Smiling St</td>
            <td>Toon Town</td>
            <td>17.53</td>
            <td>3216549877</td>
              <td>animation@acmetoons.com
          </td></tr>
        </tbody>
      </table><!--kg-card-end: html--><h2 id="concluyendo">Concluyendo</h2><p>Espero que este artículo te haya sido útil para entender cómo funciona la declaración <em>UPDATE </em>en SQL.</p><p>¡Ahora estás listo para escribir tus propias sentencias SQL <em>UPDATE</em> como un campeón! ¡Después de hacerlo, me encantará que lo compartieras conmigo en redes sociales!</p><p>No olvides visitar mi <a href="https://jonathansexton.me/blog">blog</a> donde frecuentemente publico artículos sobre desarrollo web.</p><p>Ya que estás allí, ¿por qué no te inscribes en mi boletín de noticias? Puedes hacerlo en la parte superior derecha de la página principal del blog. Me gusta enviar artículos interesantes (míos y de otros), recursos y herramientas para desarrolladores de vez en cuando.</p><p>Si tienes preguntas sobre este artículo o en general, mis MDs están abiertos - ven a saludar en <a href="https://twitter.com/jj_goose">Twitter</a> o en cualquiera de mis otras cuentas de redes sociales que puedes encontrar debajo del botón de suscripción del boletín de noticias en la página principal de mi blog o en mi perfil aquí en fCC :)</p><p>¡Qué tengas un día increíble y feliz día programando, amigo!</p><p>Traducido del artículo de <a href="https://www.freecodecamp.org/news/author/jonathan/">Jonathan Sexton</a> - <a href="https://www.freecodecamp.org/news/sql-update-statement-example-queries-for-updating-table-values/">SQL Update Statement — Example Queries for Updating Table Values </a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Declaración SQL Create Table - Con Sintaxis de Ejemplo ]]>
                </title>
                <description>
                    <![CDATA[ SQL es uno de los lenguajes de consulta más confiables y sencillos. Provee una sintaxis clara, la cual se lee fácilmente sin muchas abstracciones alejadas del significado real de la funcionalidad. Si quisieras algo de historia del lenguaje, así como algunos echos interesantes, puedes leer la parte de la introducción ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/create-table-sql-server-con-ejemplo/</link>
                <guid isPermaLink="false">5fd68d2c8c7cd154bb975fb2</guid>
                
                    <category>
                        <![CDATA[ SQL ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Hugo Avila ]]>
                </dc:creator>
                <pubDate>Mon, 21 Dec 2020 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/04/photo-1563891192281-b9fd8adce4d0.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>SQL es uno de los lenguajes de consulta más confiables y sencillos. Provee una sintaxis clara, la cual se lee fácilmente sin muchas abstracciones alejadas del significado real de la funcionalidad.</p><p>Si quisieras algo de historia del lenguaje, así como algunos echos interesantes, puedes leer la parte de la introducción del artículo <a href="https://www.freecodecamp.org/news/sql-update-statement-example-queries-for-updating-table-values/">SQL Update Statement article</a>.</p><p>En este artículo, recorreremos las partes más importantes de la creación de una tabla en SQL. Mi "sabor" preferido de SQL es SQL Server, pero la información acerca de la creación de tablas es algo ubicua entre todas las variaciones de SQL.</p><p>Si nunca antes usaste SQL o no sabes lo que es una tabla, ¡no temas! En resumen, una tabla es un objeto de una base de datos que almacena o contiene los datos dentro de esa porción de la base de datos. Almacena los datos dentro de columnas nombradas y renglones numerados, la cual te será familiar si has utilizado programas de hojas de cálculo. Cada renglón representa un registro de la base de datos completa.</p><p>Si los datos fueran cajas, una tabla sería una sección de los estantes de la bodega donde almacenamos las cajas.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2020/12/imagen-11.png" class="kg-image" alt="imagen-11" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2020/12/imagen-11.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2020/12/imagen-11.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2020/12/imagen-11.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/2020/12/imagen-11.png 2000w" sizes="(min-width: 720px) 720px" width="2000" height="1276" loading="lazy"><figcaption>Foto por <a href="https://unsplash.com/@nananadolgo?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Nana Smirnova</a> en <a href="https://unsplash.com/s/photos/warehouse?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure><p>Estoy simplificando la explicación bastante, y hay mucha más información sobre las tablas SQL, pero eso está fuera del alcance de este artículo. Si estas ansioso por más información sobre tablas, te recomiendo profundizar en la documentación de Microsoft Database Design.</p><p>Antes de aprender cómo crear una tabla, es importante aprender cuales son los tipos de datos que pueden almacenar las columnas.</p><h2 id="tipos-de-datos">Tipos de Datos</h2><p>Las tablas SQL pueden almacenar texto, números, combinaciones de texto y números, así como imágenes y enlaces.</p><p>Cuando se crea una tabla, nosotros designamos el tipo de dato que almacenarán los renglones y columnas. A continuación, la clasificación de datos:</p><ul><li>Numéricos Aproximados</li><li>Cadenas</li><li>Fecha y Hora</li><li>Cadenas de Texto Unicode</li><li>Numéricos Exactos</li><li>Otros</li></ul><p>A continuación, enumeraré algunos de los tipos de datos más comunes abajo.</p><p>Aquí tienes los tipos de datos más comúnmente usados de acuerdo a mi experiencia, sin ningún orden particular:</p><ul><li>char(tamaño) - cadena de tamaño <em>fijo </em>que puede contener letras, números, caracteres especiales</li><li>varchar(tamaño) - cadena de tamaño <em>variable </em>que puede contener letras, números, y caracteres especiales</li><li>boolean - Cero (o valores que son igual a 0) es falso, no-cero es verdadero</li><li>int(<em>tamaño opcional</em>) - un número de hasta 10 caracteres en longitud, acepta números negativos y positivos</li><li>bigint(<em>tamaño opcional</em>) - un numero de hasta 19 caracteres en longitud, acepta números negativos y positivos.</li><li>float(tamaño, d) - un número donde el tamaño total del número es representado por el tamaño y la cantidad de caracteres después del punto decimal representado por una d</li><li>date - fecha en el formato YYYY-MM-DD</li><li>datetime - fecha y hora en el formato YYYY-MM-DD <em>hh:mm:ss</em></li><li>time - tiempo en el formato <em>hh:mm:ss</em></li></ul><p>Bien, ahora que sabemos que tipos de datos pueden contener los renglones y las columnas, ¡vamos a la parte divertida!</p><h2 id="creando-una-tabla">Creando una Tabla</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2020/12/imagen-12.png" class="kg-image" alt="imagen-12" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2020/12/imagen-12.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2020/12/imagen-12.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2020/12/imagen-12.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/2020/12/imagen-12.png 2000w" sizes="(min-width: 720px) 720px" width="2000" height="1330" loading="lazy"><figcaption>Foto por <a href="https://unsplash.com/@nikhilmitra?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Nikhil Mitra</a> en <a href="https://unsplash.com/s/photos/create?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure><p>Antes de que iniciemos, es importante anotar que estaré proporcionando todos mis ejemplos independientes de cualquier programa.</p><p>Sin embargo, si quieres iniciar a escribir consultas y no estás seguro de cómo empezar, echa un vistazo al SQL Server Management Studio. Es gratis, un programa robusto ampliamente usado y soportado por la comunidad.</p><p>Alternativamente, hay muchas opciones incluyendo <a href="https://www.db-fiddle.com/">DB Fiddle</a> que te permite construir esquemas y escribir consultas directamente en tu navegador.</p><p>Empezaremos con una declaración simple para crear una tabla básica:</p><pre><code class="language-sql">CREATE TABLE table_name ( column1_name datatype, column2_name datatype, column3_name datatype, column4_name datatype, column5_name datatype,)</code></pre><p>Hay otros parámetros que podemos adicionar después de <code>datatype</code> para aumentar las columnas:</p><ul><li><code>NOT NULL</code> - pasando este parámetro asegurará que la columna no almacene un valor <code>NULL</code></li><li><code>UNIQUE</code> - pasando este parámetro va a prevenir que la columna almacene el mismo valor más de una vez</li><li><code>UNIQUE KEY</code> - pasando este parámetro designará la columna como identificador único. Esencialmente, es una combinación de los dos parámetros anteriores.</li></ul><p>Ahora, vamos a crear una tabla (nombrada doggo_info, la cual debe adherirse a los identificadores estándar para bases de datos) para almacenar información sobre los residentes de Woof Woff Retreat, un estancia para perros de ficción que se me acaba de ocurrir :)</p><pre><code class="language-sql">CREATE TABLE doggo_info ( ID int UNIQUE KEY, Name varchar(50) NOT NULL, Color varchar(50), Breed varchar(50), Age int, Weight int, Height int, Fav_Food varchar(100), Fav_Toy varchar(100), Dislikes varchar(500), Allergies varchar(500) NOT NULL )	</code></pre><p>Y aquí esta nuestra nueva tabla que acabamos de crear:</p><!--kg-card-begin: html--><table>
    <tbody><tr style="font-weight: bold;">
      <td>Name</td>
      <td>Color</td>
      <td>Breed</td>
      <td>Age</td>
      <td>Weight</td>
      <td>Height</td>
      <td>Fav_Food</td>
      <td>Fav_Toy</td>
      <td>Dislikes</td>
      <td>Allergies</td>
    </tr>
    <tr>
        <td> </td>
        <td> </td>
        <td> </td>
        <td> </td>
        <td> </td>
        <td> </td>
        <td> </td>
        <td> </td>
        <td> </td>
        <td> </td>
    </tr>
</tbody></table><!--kg-card-end: html--><p>‌Notarás que nuestra tabla está completamente vacía y esto es porque no le hemos añadido ningún dato aún. Adicionar datos esta más allá del enfoque de este artículo, pero quería que estuvieras al tanto de esa parte.</p><h3 id="crear-una-tabla-desde-una-tabla-existente">Crear una Tabla desde una Tabla Existente</h3><p>También es posible crear una tabla basándonos en otra tabla preexistente.</p><p>Es muy fácil y no requiere mucha sintaxis adicional. Necesitamos seleccionar la tabla y las columnas desde donde copiar:</p><pre><code class="language-sql">CREATE TABLE new_table_name AS SELECT column1, column2, column3, column4 (usar * para seleccionar todas las columnas para ser adicionadas a la tabla nueva) FROM current_table_name WHERE conditions_exist</code></pre><p>Entonces, convenientemente, he adicionado algunos datos a nuestra tabla <code>doggo_info</code> y ahora se ve como el ejemplo de abajo:</p><!--kg-card-begin: html--><table>
  <tbody><tr><th>
    </th></tr><tr style="font-weight: bold;">
      <td>Name</td>
      <td>Color</td>
      <td>Breed</td>
      <td>Age</td>
      <td>Weight</td>
      <td>Height</td>
      <td>Fav_Food</td>
      <td>Fav_Toy</td>
      <td>Dislikes</td>
      <td>Allergies</td>
    </tr>
  
  </tbody><tbody>
    <tr>
      <td>daisy</td>
      <td>red</td>
      <td>standard dachshund</td>
      <td>1</td>
      <td>14</td>
      <td>6</td>
      <td>salmon flavored kibble</td>
      <td>squeeky ball</td>
      <td>birds flying over the yard</td>
      <td>cats, baths, cleanliness</td>
    </tr>
    <tr>
      <td>chief</td>
      <td>black/tan</td>
      <td>rottweiler</td>
      <td>3</td>
      <td>41</td>
      <td>17</td>
      <td>literally anything</td>
      <td>rope tug</td>
      <td>staying off the couch</td>
      <td>listening, behaving, not slobbering on everything</td>
    </tr>
    <tr>
      <td>sammie</td>
      <td>light honey</td>
      <td>golden retriever</td>
      <td>9</td>
      <td>46</td>
      <td>19</td>
      <td>beef flavored kibble</td>
      <td>her bed</td>
      <td>rambutcious puppies</td>
      <td>none known</td>
    </tr>
  </tbody>
</table><!--kg-card-end: html--><p>Ahora podemos crear otra tabla basada en los datos que tenemos en nuestra tabla <code>doggo_info</code> ejecutando la consulta siguiente:</p><pre><code class="language-sql">CREATE TABLE puppies_only AS SELECT * FROM doggo_info WHERE Age &lt; 4</code></pre><p>Queremos crear una tabla nueva con todas las columnas de la tabla <code>doggo_info</code> pero solo donde las edades son menos de 4. Después de ejecutar esta consulta, nuestra nueva tabla se verá como sigue:</p><!--kg-card-begin: html--><table>
  <tbody><tr><th>
    </th></tr><tr style="font-weight: bold;">
      <td>Name</td>
      <td>Color</td>
      <td>Breed</td>
      <td>Age</td>
      <td>Weight</td>
      <td>Height</td>
      <td>Fav_Food</td>
      <td>Fav_Toy</td>
      <td>Dislikes</td>
      <td>Allergies</td>
    </tr>
  
  </tbody><tbody>
    <tr>
      <td>daisy</td>
      <td>red</td>
      <td>standard dachshund</td>
      <td>1</td>
      <td>14</td>
      <td>6</td>
      <td>salmon flavored kibble</td>
      <td>squeeky ball</td>
      <td>birds flying over the yard</td>
      <td>cats, baths, cleanliness</td>
    </tr>
    <tr>
      <td>chief</td>
      <td>black/tan</td>
      <td>rottweiler</td>
      <td>3</td>
      <td>41</td>
      <td>17</td>
      <td>literally anything</td>
      <td>rope tug</td>
      <td>staying off the couch</td>
      <td>listening, behaving, not slobbering on everything</td>
    </tr>
  </tbody>
</table>
<!--kg-card-end: html--><p>Espero que puedas ver que tan poderosa puede ser esta declaración. &nbsp;Con unas cuantas líneas en nuestra consulta, esencialmente hemos copiado los datos de una tabla a otra, pero solo los renglones que queríamos.</p><p>Esto no solo es una herramienta práctica para tener en tu cinturón de herramientas de desarrollador - esto te ahorrará cantidad de tiempo incalculable cuando necesites mover datos entre tablas. </p><h2 id="resumiendo">Resumiendo</h2><p>Ahora que sabes como crear (o copiar) una tabla en SQL, sin importar la situación que se te presente, ¡puedes ahora iniciar a llenar de datos las columnas y renglones para almacenar!</p><p>La declaración <code>CREATE TABLE</code> es extremadamente útil y poderosa. Tu estas listo para darle buen uso.</p><p>Si este artículo te sirve, revisa el <a href="https://jonathansexton.me/blog">blog</a> (de Jonathan Sexton) donde frecuentemente publica artículos sobre desarrollo web, la vida y aprendizaje.</p><p>Cuando estés ahí, porque no registrarse al boletín. Puedes hacer eso en la parte superior derecha de la página principal del blog. Le gusta enviar artículos interesantes (De Jonathan y de otros), recursos, y herramientas para desarrolladores de vez en cuando.</p><p>Si tienes preguntas sobre este artículo, o solo en genera, déjamelo saber - ven a saludar en <a href="https://twitter.com/jj_goose">Twitter</a> o cualquiera de las otras redes sociales que puedes encontrar abajo el el perfil de FCC :)</p><p>¡Ten un excelente día! ¡Feliz aprendizaje y feliz programación, amigo!</p><p>Traducido del artículo de <strong><a href="https://www.freecodecamp.org/news/author/jonathan/">Jonathan Sexton</a></strong><a href="https://www.freecodecamp.org/news/author/abbey/"> </a>- <strong><a href="https://www.freecodecamp.org/news/sql-create-table-statement-with-example-syntax/">SQL Create Table Statement - With Example Syntax</a></strong></p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
