

# Diferencias entre una base de datos relacional (SQL) y DynamoDB al leer datos de una tabla
<a name="SQLtoNoSQL.ReadData"></a>

Con SQL, se utiliza la instrucción `SELECT` para recuperar una o varias filas de una tabla. Se utiliza la cláusula `WHERE` para determinar qué datos se devuelven.

Es diferente de utilizar Amazon DynamoDB, que proporciona las siguientes operaciones para la lectura de datos:
+ `ExecuteStatement` recupera uno o varios elementos de una tabla. `BatchExecuteStatement` recupera varios elementos de tablas diferentes en una sola operación. Ambas operaciones utilizan [PartiQL](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ql-reference.html), un lenguaje de consulta compatible con SQL.
+ `GetItem`: recupera un solo elemento de una tabla. Se trata de la forma más eficiente de leer un único elemento, ya que proporciona acceso directo a la ubicación física del elemento. (DynamoDB también proporciona la operación `BatchGetItem`, que permite llevar a cabo hasta 100 llamadas a `GetItem` en una sola operación).
+ `Query`: recupera todos los elementos que tienen una clave de partición determinada. Dentro del conjunto de esos elementos, puede aplicar una condición a la clave de ordenación y recuperar únicamente un subconjunto de los datos. `Query` proporciona un acceso rápido y eficiente a las particiones en las que se almacenan los datos. (Para obtener más información, consulte ). [Particiones y distribución de datos en DynamoDB](HowItWorks.Partitions.md).)
+ `Scan`: recupera todos los elementos de la tabla especificada. (Esta operación no debe utilizarse con grandes tablas, ya que puede consumir gran cantidad de recursos del sistema).

**nota**  
En una base de datos relacional, puede usar la instrucción `SELECT` para unir los datos de varias tablas y devolver los resultados. Las uniones son fundamentales para el modelo relacional. Con el fin de garantizar que las uniones se ejecuten de forma eficiente, es preciso ajustar continuamente el desempeño de la base de datos y de sus aplicaciones. DynamoDB es una base de datos NoSQL no relacional que no admite uniones de tablas. En lugar de ello, las aplicaciones leen los datos de una tabla cada vez. 

En las siguientes secciones se describen varios casos de uso de la lectura de datos y se explica cómo realizar estas tareas con una base de datos relacional y con DynamoDB.

**Topics**
+ [Diferencias al leer un elemento mediante la clave principal](SQLtoNoSQL.ReadData.SingleItem.md)
+ [Diferencias al consultar una tabla](SQLtoNoSQL.ReadData.Query.md)
+ [Diferencias al analizar una tabla](SQLtoNoSQL.ReadData.Scan.md)

# Diferencias al leer un elemento mediante la clave principal
<a name="SQLtoNoSQL.ReadData.SingleItem"></a>

Un patrón de acceso habitual de acceso a las bases de datos consiste en leer un único elemento de una tabla. Es preciso especificar la clave principal del elemento que se desea.

**Topics**
+ [Lectura de un elemento usando su clave principal con SQL](#SQLtoNoSQL.ReadData.SingleItem.SQL)
+ [Lectura de un elemento usando su clave principal en DynamoDB](#SQLtoNoSQL.ReadData.SingleItem.DynamoDB)

## Lectura de un elemento usando su clave principal con SQL
<a name="SQLtoNoSQL.ReadData.SingleItem.SQL"></a>

En SQL, se utilizaría la instrucción `SELECT` para recuperar datos de una tabla. Puede solicitar una o varias columnas en el resultado (o todas ellas, si se utiliza el operador `*`). La cláusula `WHERE` determina qué filas se devolverán.

A continuación se muestra una instrucción `SELECT` que recupera una sola fila de la tabla *Music*. La cláusula `WHERE` especifica los valores de la clave principal.

```
SELECT *
FROM Music
WHERE Artist='No One You Know' AND SongTitle = 'Call Me Today'
```

Puede modificar esta consulta para recuperar tan solo un subconjunto de las columnas:

```
SELECT AlbumTitle, Year, Price
FROM Music
WHERE Artist='No One You Know' AND SongTitle = 'Call Me Today'
```

Observe que la clave principal de esta tabla consta de *Artist* y *SongTitle*.

## Lectura de un elemento usando su clave principal en DynamoDB
<a name="SQLtoNoSQL.ReadData.SingleItem.DynamoDB"></a>

En Amazon DynamoDB, puede utilizar la API de DynamoDB o [PartiQL](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ql-reference.html) (un lenguaje de consulta compatible con SQL) para leer un elemento de una tabla.

------
#### [ DynamoDB API ]

Con la API de DynamoDB, se utiliza la operación `PutItem` para agregar un elemento a una tabla.

DynamoDB proporciona la operación `GetItem` para recuperar un elemento por su clave principal. `GetItem` es muy eficiente ya que proporciona acceso directo a la ubicación física del elemento. (Para obtener más información, consulte ). [Particiones y distribución de datos en DynamoDB](HowItWorks.Partitions.md).)

De forma predeterminada, `GetItem` devuelve el elemento completo con todos sus atributos.

```
{
    TableName: "Music",
    Key: {
        "Artist": "No One You Know",
        "SongTitle": "Call Me Today"
    }
}
```

Puede agregar un parámetro `ProjectionExpression` para que solo se devuelvan algunos de los atributos.

```
{
    TableName: "Music",
    Key: {
        "Artist": "No One You Know",
        "SongTitle": "Call Me Today"
    },
    "ProjectionExpression": "AlbumTitle, Year, Price"
}
```

Observe que la clave principal de esta tabla consta de *Artist* y *SongTitle*.

La operación `GetItem` de DynamoDB es muy eficiente. Utiliza los valores de clave principal para determinar la ubicación de almacenamiento exacta del elemento en cuestión y lo recupera directamente desde ella. La eficiencia de la instrucción `SELECT` de SQL es parecida para recuperar elementos por sus valores de clave principal.

La instrucción `SELECT` de SQL admite muchos tipos de consultas y exámenes de tablas. DynamoDB proporciona una funcionalidad semejante con las operaciones `Query` y `Scan`, que se describen en [Diferencias al consultar una tabla](SQLtoNoSQL.ReadData.Query.md) y [Diferencias al analizar una tabla](SQLtoNoSQL.ReadData.Scan.md).

La instrucción `SELECT` de SQL puede llevar a cabo uniones de tablas para permitirle recuperar datos de varias tablas al mismo tiempo. Las uniones son más eficaces cuando las tablas de base de datos están normalizadas y las relaciones entre las tablas están claras. Sin embargo, si se unen demasiadas tablas en una misma instrucción `SELECT`, el rendimiento de la aplicación podría verse afectado. Puede solucionar este problema utilizando la replicación de bases de datos, las vistas materializadas o las reescrituras de consultas.

DynamoDB es una base de datos no relacional y no admite uniones de tablas. Si va a migrar una aplicación existente a partir de una base de datos relacional a DynamoDB, debe desnormalizar el modelo de datos para eliminar la necesidad de uniones.

------
#### [ PartiQL for DynamoDB ]

Con PartiQL, se utiliza la operación `ExecuteStatement` para leer un elemento de una tabla, mediante la instrucción `Select` de PartiQL.

```
SELECT AlbumTitle, Year, Price
FROM Music
WHERE Artist='No One You Know' AND SongTitle = 'Call Me Today'
```

Observe que la clave principal de esta tabla consta de Artist y SongTitle. 

**nota**  
 La instrucción select de PartiQL también se puede utilizar para consultar o analizar una tabla de DynamoDB

Para obtener ejemplos de código mediante `Select` y `ExecuteStatement`, consulte [Instrucciones de selección de PartiQL para DynamoDB](ql-reference.select.md).

------

# Diferencias al consultar una tabla
<a name="SQLtoNoSQL.ReadData.Query"></a>

Otro patrón de acceso habitual consiste en leer varios elementos de una tabla, según los criterios de consulta.

**Topics**
+ [Consulta de una tabla con SQL](#SQLtoNoSQL.ReadData.Query.SQL)
+ [Consulta de una tabla en DynamoDB](#SQLtoNoSQL.ReadData.Query.DynamoDB)

## Consulta de una tabla con SQL
<a name="SQLtoNoSQL.ReadData.Query.SQL"></a>

Al utilizar SQL, la instrucción `SELECT` permite realizar consultas por columnas de clave, columnas que no son de clave o cualquier combinación de ellas. La cláusula `WHERE` determina qué filas se devuelven, como se muestra en los ejemplos siguientes.

```
/* Return a single song, by primary key */

SELECT * FROM Music
WHERE Artist='No One You Know' AND SongTitle = 'Call Me Today';
```

```
/* Return all of the songs by an artist */

SELECT * FROM Music
WHERE Artist='No One You Know';
```

```
/* Return all of the songs by an artist, matching first part of title */

SELECT * FROM Music
WHERE Artist='No One You Know' AND SongTitle LIKE 'Call%';
```

```
/* Return all of the songs by an artist, only if the price is less than 1.00 */

SELECT * FROM Music
WHERE Artist='No One You Know'
AND Price < 1.00;
```

Observe que la clave principal de esta tabla consta de *Artist* y *SongTitle*.

## Consulta de una tabla en DynamoDB
<a name="SQLtoNoSQL.ReadData.Query.DynamoDB"></a>

En Amazon DynamoDB, puede utilizar la API de DynamoDB o [PartiQL](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ql-reference.html) (un lenguaje de consulta compatible con SQL) para consultar un elemento de una tabla.

------
#### [ DynamoDB API ]

Con Amazon DynamoDB, puede utilizar la operación `Query` para recuperar datos de manera parecida. La operación `Query` proporciona un acceso rápido y eficiente a las ubicaciones físicas en las que se almacenan los datos. Para obtener más información, consulte [Particiones y distribución de datos en DynamoDB](HowItWorks.Partitions.md).

Se puede utilizar `Query` con cualquier tabla o índice secundario. Debe especificar una condición de igualdad para el valor de la clave de partición y, si lo desea, puede proporcionar otra condición para el atributo de clave de clasificación si está definido.

El parámetro `KeyConditionExpression` especifica los valores de clave que se desea consultar. Puede utilizar una expresión `FilterExpression` opcional para eliminar algunos elementos de los resultados antes de que se devuelvan.

En DynamoDB, debe usar `ExpressionAttributeValues` como marcador de posición en los parámetros de las expresiones (tales como `KeyConditionExpression` y `FilterExpression`). Esto es análogo al uso de las *variables de vínculo* de las bases de datos relacionales, que se sustituyen en la instrucción `SELECT` por los valores reales en tiempo de ejecución.

Observe que la clave principal de esta tabla consta de *Artist* y *SongTitle*.

A continuación, se muestran algunos ejemplos de `Query` de DynamoDB.

```
// Return a single song, by primary key

{
    TableName: "Music",
    KeyConditionExpression: "Artist = :a and SongTitle = :t",
    ExpressionAttributeValues: {
        ":a": "No One You Know",
        ":t": "Call Me Today"
    }
}
```

```
// Return all of the songs by an artist

{
    TableName: "Music",
    KeyConditionExpression: "Artist = :a",
    ExpressionAttributeValues: {
        ":a": "No One You Know"
    }
}
```

```
// Return all of the songs by an artist, matching first part of title

{
    TableName: "Music",
    KeyConditionExpression: "Artist = :a and begins_with(SongTitle, :t)",
    ExpressionAttributeValues: {
        ":a": "No One You Know",
        ":t": "Call"
    }
}
```

```
// Return all of the songs by an artist, only if the price is less than 1.00

{
    TableName: "Music",
    KeyConditionExpression: "Artist = :a",
    FilterExpression: "Price < :p",
    ExpressionAttributeValues: {
        ":a": "No One You Know",
        ":p": 1.00
    }
}
```

**nota**  
Una `FilterExpression` se aplica después de que las lecturas `Query` coincidan con los elementos, por lo que no reduce la capacidad de lectura consumida. Siempre que sea posible, modele los datos de modo que las condiciones de rango utilicen `KeyConditionExpression` en la clave de clasificación para que las consultas sean eficientes. Para obtener más información, consulte [Consulta de tablas en DynamoDB](Query.md).

------
#### [ PartiQL for DynamoDB ]

Con PartiQL, puede hacer una consulta mediante la operación `ExecuteStatement` y la instrucción `Select` sobre la clave de partición.

```
SELECT AlbumTitle, Year, Price
FROM Music
WHERE Artist='No One You Know'
```

El uso de la instrucción `SELECT` de esta manera devuelve todas las canciones asociadas a este `Artist` en particular.

Para obtener ejemplos de código mediante `Select` y `ExecuteStatement`, consulte [Instrucciones de selección de PartiQL para DynamoDB](ql-reference.select.md).

------

# Diferencias al analizar una tabla
<a name="SQLtoNoSQL.ReadData.Scan"></a>

En SQL, una instrucción `SELECT` sin cláusula `WHERE` devuelve todas las filas de la tabla. En Amazon DynamoDB, la operación `Scan` hace lo mismo. En ambos casos, puede recuperar todos los elementos o solo algunos de ellos.

Tanto si va a usar una base de datos SQL o NoSQL, los exámenes deben utilizarse con moderación, ya que puede consumir gran cantidad de recursos del sistema. En ocasiones, un examen es lo apropiado (por ejemplo, para examinar una tabla pequeña) o algo inevitable (por ejemplo, para realizar una exportación masiva de datos). Sin embargo, por norma general, debe diseñar las aplicaciones de tal forma que se evite la realización de exámenes. Para obtener más información, consulte [Consulta de tablas en DynamoDB](Query.md).

**nota**  
Realizar una exportación masiva también crea al menos 1 archivo por partición. Todos los elementos de cada archivo provienen del espacio de claves hash de esa partición en particular.

**Topics**
+ [Análisis de una tabla con SQL](#SQLtoNoSQL.ReadData.Scan.SQL)
+ [Análisis de una tabla en DynamoDB](#SQLtoNoSQL.ReadData.Scan.DynamoDB)

## Análisis de una tabla con SQL
<a name="SQLtoNoSQL.ReadData.Scan.SQL"></a>

Al utilizar SQL, puede examinar una tabla y recuperar todos sus datos utilizando una instrucción `SELECT` sin especificar una cláusula `WHERE`. Puede solicitar una o más columnas en el resultado. O bien puede solicitar todas ellas si utiliza el carácter comodín (\$1).

En los siguientes ejemplos se utiliza una instrucción `SELECT`.

```
/* Return all of the data in the table */
SELECT * FROM Music;
```

```
/* Return all of the values for Artist and Title */
SELECT Artist, Title FROM Music;
```

## Análisis de una tabla en DynamoDB
<a name="SQLtoNoSQL.ReadData.Scan.DynamoDB"></a>

En Amazon DynamoDB, puede utilizar la API de DynamoDB o [PartiQL](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ql-reference.html) (un lenguaje de consulta compatible con SQL) para analizar una tabla.

------
#### [ DynamoDB API ]

Con la API de DynamoDB, el usuario utiliza la operación `Scan` para devolver uno o más elementos y atributos de elementos mediante el acceso a todos los elementos de una tabla o un índice secundario.

```
// Return all of the data in the table
{
    TableName:  "Music"
}
```

```
// Return all of the values for Artist and Title
{
    TableName:  "Music",
    ProjectionExpression: "Artist, Title"
}
```

La operación `Scan` proporciona además un parámetro `FilterExpression`, que se puede usar para descartar elementos que no desee que aparezcan en los resultados. La expresión `FilterExpression` se aplica después de que analizar la tabla completa, pero antes de que se devuelvan los resultados. (Esto no se recomienda en tablas de gran tamaño, porque se le cobrará la operación `Scan` completa aunque solamente se devuelvan algunos elementos coincidentes).

------
#### [ PartiQL for DynamoDB ]

Con PartiQL, se hace un análisis mediante la operación `ExecuteStatement` para devolver todo el contenido de una tabla mediante la instrucción `Select`.

```
SELECT AlbumTitle, Year, Price
FROM Music
```

Tenga en cuenta que esta instrucción devolverá todos los elementos de la tabla Música. 

Para obtener ejemplos de código mediante `Select` y `ExecuteStatement`, consulte [Instrucciones de selección de PartiQL para DynamoDB](ql-reference.select.md).

------