# Curso SQL - DÍA 1
## Qué es una tabla, registro, campo
### Tabla
Las tablas son objetos fundamentales de una base de datos porque en ellas es donde se conserva toda la información o los datos.
Una tabla está compuesta por:
- **Campo:** Corresponde al nombre de la columna. Debe ser único y debe tener un tipo de dato asociado.
- **Registro:** Corresponde a cada fila que compone la tabla.
## Tipos de datos de un campo
### Tipo numéricos
|Nombre|Tamaño de almacenamiento|Descripción|Distancia|
|-|-|-|-|
|smallint|2 bytes|Entero de rango pequeño|-32768 a +32767|
|integer|4 bytes|Elección típica para entero|-2147483648 a +2147483647|
|bigint|8 bytes|Entero de gran alcance|-9223372036854775808 a 9223372036854775807|
|decimal|variable|Precisión especificada por el usuario, exacta|Hasta 131072 dígitos antes del punto decimal; hasta 16383 dígitos después del punto decimal|
|numeric|variable|Precisión especificada por el usuario, exacta|Hasta 131072 dígitos antes del punto decimal; hasta 16383 dígitos después del punto decimal|
|real|4 bytes|Precisión variable, inexacta|Precisión de 6 dígitos decimales|
|double precision|8 bytes|Precisión variable, inexacta|Precisión de 15 dígitos decimales
|smallserial|2 bytes|Pequeño entero autoincrementador|1 a 32767|
|serial|4 bytes|Entero autoincrementador|1 a 2147483647|
|bigserial|8 bytes|Gran entero autoincrementador|1 a 9223372036854775807|
### Tipos monetarios
|Nombre|Tamaño de almacenamiento|Descripción|Distancia|
|-|-|-|-|
|money|8 bytes|cantidad de moneda|-92233720368547758.08 a +92233720368547758.07|
### Tipo caracteres
|string|Nombre y descripción|
|-|-|
|1|**character varying(n), varchar(n)** - Longitud variable con límite|
|2|**character(n), char(n)** -Longitud fija, acolchada en blanco|
|3|**text** - Longitud ilimitada variable|
### Tipo datos binarios
|Nombre|Tamaño de almacenamiento|Descripción|
|-|-|-|
|bytea|1 o 4 bytes más la cadena binaria real|cadena binaria de longitud variable|
### Tipos de fecha / hora
Las fechas se cuentan según el calendario gregoriano. Aquí, todos los tipos tienen una resolución de 1 microsegundo / 14 dígitos, excepto el tipo de fecha, cuya resolución es el día.
|Nombre|Tamaño de almacenamiento|Descripción|Valor bajo|Valor alto|
|-|-|-|-|-|
|timestamp \[\(p\)\] ***[without time zone]***|8 bytes|Tanto la fecha como la hora (sin zona horaria)|4713 BC|294276 AD|
|TIMESTAMPTZ|8 bytes|Tanto la fecha como la hora, con zona horaria|4713 BC|294276 AD|
|date|4 bytes|Fecha (sin hora del día)|4713 BC|5874897 AD|
|time \[\(p\)\] ***[without time zone]***|8 bytes|Hora del día (sin fecha)|00:00:00|24:00:00|
|time \[\(p\)\] ***with time zone***|12 bytes|Solo horas del día, con zona horaria|00:00:00+1459| 24:00:00-1459|
|interval [fields] \[\(p\)\]|12 bytes|Intervalo de tiempo|-178000000 years|178000000 years|
Para más tipos de datos e información, sugerimos visitar la [documentacion oficial](https://www.postgresql.org/docs/current/datatype.html).
## Como crear una tabla
En Postgresql, la sintaxis para la creación de una tabla es la siguiente:
```sql=
CREATE TABLE [IF NOT EXISTS] table_name (
column1 datatype(length) column_constraint,
column2 datatype(length) column_constraint,
column3 datatype(length) column_constraint,
table_constraints
);
```
En donde:
- ``table_name`` representa el nombre de la tabla.
- ``column1``, ``column2`` y ``column3`` representan las columnas de la tabla.
- ``datatype(length)`` representa el tipo de dato de la columna.
- ``column_constraint`` representa las restricciones de la columna (de esto se va a hablar en otro capítulo).
- ``table_constraints`` representa las restricciones de la tabla (de esto se va a hablar en otro capítulo).
Un ejemplo de cómo se crea una tabla sencilla sería el siguiente:
```sql=
CREATE TABLE roles (
role_id serial PRIMARY KEY,
role_name VARCHAR (255) UNIQUE NOT NULL
);
```
Para obtener más información al respecto, visite la [documentación oficial](https://www.postgresql.org/docs/current/sql-createtable.html).
## Laboratorio I
### Crear la tabla "Usuarios"
Se debe crear la tabla ``usuarios`` que contenga los siguientes campos:
- DNI
- Nombre y Apellido
- Email
- Usuario
- Contraseña
- Fecha de Nacimiento
- Edad
- Tipo de usuario (donde puede tomar los valores "ADMIN", "USER" o "GER")
Como consigna a esto, se pide utilizar los tipos de datos adecuados y óptimos para cada campo.