# Curso SQL - DÍA 2 ## Manipulacion de datos (INSERT, UPDATE, DELETE) En esta sección, vamos a aprender a como manipular los datos en una tabla de base de datos sql. ### INSERT La estructura del INSERT te permite insertar 1 o varios registros a una tabla (SÓLO 1 tabla). La estructura básica de un INSERT se compone de la siguiente manera: ```sql= INSERT INTO table_name (column1, column2, column3, ...., columnN) VALUES (value1, value2, value3, ..., valueN); ``` En donde: - ***table_name*** corresponde al nombre de la tabla donde queremos insertar un registro. - ***column1, column2, column3, columnN*** corresponde a las columnas específicas que queremos especificar el valor a tomar. - ***value1, value2, value3, valueN*** corresponde los valores que se van a tomar para las columnas especificadas, el orden del valor corresponde al orden de la columna; por ejemplo, el ``value1``, es el valor que se va a setear para dicho registro en el campo ``column1``, el ``value2`` con el ``column2`` y así sucesivamente. ***Nota:*** la cantidad de values debe coincidir con la cantidad de columns. ***Nota 2:*** No es necesario especificar todas las columnas de una tabla. Por ej., si la tabla permite que un campo sea null, y queres que al insertar un registro dicho campo siga siendo null, entonces bastaría con no agregarlo como columna (y por consecuente, como valor tampoco). Ejemplo: ```sql= INSERT INTO films (code, title, did, date_prod, kind) VALUES ('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'); ``` Tambien se podrían agregar varios valores al mismo insert de la siguiente manera: ```sql= INSERT INTO films (code, title, did, date_prod, kind) VALUES ('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'), ('HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy'); ``` Para más informacion sobre el ``INSERT``, se recomienda leer la [documentacion oficial](https://www.postgresql.org/docs/current/sql-insert.html). ### UPDATE La sintaxis del ``UPDATE`` te permite actualizar 1 o varios registros de una tabla (SÓLO 1 tabla). La estructura básica de un ``UPDATE`` se compone de la siguiente manera: ```sql= UPDATE table_name SET column1 = value1, column2 = value2 WHERE id = idValue; ``` En donde: - ***table_name*** corresponde al nombre de la tabla donde queremos actualizar el(los) registro(s). - ***column1, column2*** corresponde a las columnas que queremos actualizar de el(los) registro(s) de la tabla. - ***value1, value2*** corresponde al valor (o a los valores) que van a tomar dichas columnas. - ***Sentencia WHERE***: filtra sobre qué registros se va a realizar la actualización de campos. Si la sentencia ``WHERE`` no está presente a la hora de ejecutar el ``UPDATE``, entonces la actualización se va a aplicar a TODOS los registros de la tabla. Ejemplo: ```sql= UPDATE films SET kind = 'Dramatic' WHERE kind = 'Drama'; ``` Tambien se puede tomar valores del registro y alterarlos para no tener que obtener el valor previamente, como se ve en el siguiente ejemplo: ```sql= UPDATE employees SET sales_count = sales_count + 1; ``` Para más informacion sobre el ``UPDATE``, se recomienda leer la [documentacion oficial](https://www.postgresql.org/docs/current/sql-update.html). ### DELETE La estructura del ``DELETE`` te permite eliminar 1 o varios registros de una tabla (SÓLO 1 tabla). La estructura básica de un ``DELETE`` se compone de la siguiente manera: ```sql= DELETE FROM table_name WHERE column1 = value1; ``` En donde: - ***tablename*** corresponde al nombre de la tabla en la cual queremos eliminar registros. - ***Sentencia WHERE:*** Filtra los registros que se quieren eliminar. Si la sentencia no se especifica, entonces se eliminan TODOS los registros de la tabla. Para más informacion sobre el ``DELETE``, se recomienda leer la [documentacion oficial](https://www.postgresql.org/docs/current/sql-delete.html). ## Consultas (SELECT, WHERE (LIKE, =, <, >, IN), ORDER BY, LIMIT) La sentencia SELECT te permite consultar los datos de 1 o varias tablas. NOTA: por ahora nos vamos a limitar a consultar sobre 1 tabla. Para ver cómo consultar en varias tablas al mismo tiempo (o relacionadas), recomendamos leer Consultas 2 de este mismo curso. La sentencia básica del ``SELECT`` se compone de la siguiente manera: ```sql= SELECT column1, column2, column3 FROM table_name; ``` En donde: - ``column1``, ``column2`` y ``column3`` son las columnas que nos interesan que se devuelvan. Si se especifica ``*`` en lugar de un listado de columnas, entonces se devolverían todos los campos de la tabla(s) consultada(s). - ``table_name`` es la tabla a la cual vamos a consultar, donde estan definidas dichas columnas. Ahora bien, si no nos interesan consultar todos los registros, podemos aplicar el WHERE para filtrar los registros, como se muestra en el siguiente ejemplo: ```sql= SELECT column1, column2, column3 FROM table_name WHERE id = 1; ``` En este caso, estamos buscando todos los registros de la tabla ``table_name`` cuyo ``id`` sean igual a ``1``. De la misma manera, en vez de aplicar el ``=``, se pueden aplicar el ``<``, ``>`` o ``<>`` para buscar por menor, mayor y distinto, respectivamente. ### LIKE en WHERE Dentro del ``WHERE`` se puede aplicar el filtro por ``LIKE``. Esto es útil a la hora de buscar un texto (substring) dentro de un campo tipo string. La forma de aplicarlo sería de la siguiente manera: ```sql= SELECT * FROM usuarios WHERE nombre LIKE '%pepe%'; ``` De esta manera, buscaría aquellos registros en la tabla ``usuarios`` que contentan en el campo ``nombre`` el valor ``pepe``. [Más información sobre el LIKE](https://www.postgresqltutorial.com/postgresql-tutorial/postgresql-like/). **Nota**: Cabe destacar que, el LIKE es ``case sensitive``. Existe la sentencia ILIKE que es case insensitive y se utiliza de la misma forma. Esto es algo EXCLUSIVO de Postgresql. [Informacion más detallada](https://www.postgresql.org/docs/current/functions-matching.html). ### IN en WHERE Dentro del ``WHERE`` se puede aplicar el filtro por ``IN``, el cual nos permite filtrar por un conjunto de valores. Esto nos ahorra tener que añadir ``OR`` con un ``=`` para todos los valores. La forma de aplicarlo sería de la siguiente manera: ```sql= SELECT * FROM usuarios WHERE rol IN ('ADMIN', 'GER'); ``` De esta manera, la consulta devolvería aquellos registros de la tabla ``usuarios`` que en el campo ``rol`` posea el valor ``ADMIN`` o ``GER``. [Mas información acerca del IN](https://www.postgresqltutorial.com/postgresql-tutorial/postgresql-in/). ### ORDER BY La sentencia ORDER BY, nos permite ordenar el resultado del SELECT. Se puede hacer de la siguiente manera: ```sql= --SIN WHERE SELECT * FROM usuarios ORDER BY id DESC; --CON WHERE SELECT * FROM usuarios WHERE rol IN ('ADMIN', 'GER') ORDER BY id; ``` Se puede ordenar por ``ASC`` (ascendente) o ``DESC`` (descendente), pero sino se especifica, el valor por defecto es ``ASC``. [Más información acerca del ORDER BY](https://www.postgresqltutorial.com/postgresql-tutorial/postgresql-order-by/). ### LIMIT El LIMIT nos permite filtrar la cantidad de registros que queremos obtener, por ejemplo: ```sql= --CON ORDER BY SELECT * FROM usuarios ORDER BY id LIMIT 10; --SIN ORDER BY SELECT * FROM usuarios LIMIT 10; ``` Esta consulta nos va a devolver los primeros 10 registros. [Más información acerda del LIMIT](https://www.postgresqltutorial.com/postgresql-tutorial/postgresql-limit/). ## Laboratorio II ### Manipular los datos de la tabla ``Usuarios`` Se requiere hacer una consulta donde se agreguen usuarios a la tabla creada en el Laboratorio I. Se requiere que hayan POR LO MENOS 2 usuarios tipo ``ADMIN``, 7 usuarios tipo ``USER`` y 3 usuarios tipo ``GER``. Se deben especificar TODOS los campos creados con valores DIFERENTES. ### Hacer consultas filtradas Realizar una consulta que devuelva todos los usuarios del tipo ``USER`` y ``GER``, que tengan una edad comprendida entre los ``18`` (inclusive) y ``27`` años (inclusive), cuyas direcciones de mail sean de ``gmail``. ### Los 3 usuarios más viejos de tipo USER Obtener los 3 usuarios más viejos que sean del tipo ``USER``.