Esta entrada es en mi subjetivo punto de vista, muy buena 😀😄, es un concentrado, un chilcanito de cabeza de pescado Bonito, no muy grande, pero suculento, así que si eres un desarrollador de software y no sabes aún cómo hacer consultas hacia una base de datos este es el post que deberías leer y aprender bien, en cuanto a nivel llegaremos a un básico-intermedio, en futuros posts ahondaremos para que tengas un nivel completo, sin embargo como ya lo decía nuestro amigo Pareto, con este 20% de conocimientos (aunque te daré más porcentaje, yo diría un 50%) cubrirás fácilmente el 80% de las situaciones en el día a día.
Primero un poco de contexto, con el auge actual de los famosos ORM, cada vez menos programadores profundizan en el lenguaje de consulta a base de datos como es T-SQL (aquí más información) esto hace que cuando uno tiene que hacer una consulta muy compleja, o quiere hacer más eficiente la consulta que generó el ORM, entonces tendrá que hacerla manualmente y para esto es que necesita saber la sintaxis de este lenguaje de consulta, pues bien, despídete de tus miedos a consultar la base de datos y empecemos.
Hey BraveDeveloper, ¿Por qué dices que saber SQL te hace un desarrollador más completo? Fácil crack, porque conviertes los datos en conocimiento para la compañía y eso es una ventaja competitiva, si sabes como hacerlo bien, te amarán.
Bravedeveloper, el developer macho
Conceptos básicos
T-SQL es una variante del lenguaje SQL cuyas siglas significan Structured Query Language (lenguaje de consulta estructurado) el cual básicamente usa el lenguaje SQL y le añade algunas pequeñas modificaciones y funcionalidades.
El lenguaje SQL tiene muchas sentencias y estás agrupadas en 4: DDL, DML, DCL y TCL haremos un repaso rápido de cada uno de ellos y nos concentraremos principalmente en DDL y DML que son los tipos que más utilizarás.
- Data definition language (DDL) o lenguaje de definición de datos, son el conjunto de sentencias que permite definir las estructuras de la base de datos donde la información estará almacenada, como la base de datos en sí, las tablas o las vistas.
- Data manipulation language (DML) o lenguaje de manipulación de datos, son las sentencias que nos permiten trabajar con los datos, ya no con las estructuras que lo almacenan, estas sentencias son con las que estarás trabajando el 95% de las veces, así que aquí debes poner tu atención.
- Data control language (DCL) o lenguaje de control de datos son aquellas sentencias que permiten controlar los accesos a los recursos de la base de datos, esto lo hace mediante permisos y roles. No es muy común que los uses.
- Transactional control language (TCL) o lenguaje de control transaccional, son las sentencias que permiten tener el control de las transacciones, las sentencias son pocas y conviene aprenderlas para cuando uno hacer transacciones en la base de datos y aumentar así la seguridad y coherencia en los datos, esto lo veremos en un post futuro acerca de las transacciones en las bases de datos.
Lenguaje de definición de datos (DDL)
Las sentencias más utilizadas aquí son 4:
- CREATE
- ALTER
- DROP
- TRUNCATE
Veamos ejemplos para cada una de ellas:
Si queremos crear una base de datos ejecutamos:
create database DBEjemplo
Y si actualizamos el explorador de objetos podemos ver la base de datos, genial 😎
Ahora, imaginemos que queremos crear una nueva tabla cuyo nombre sea Clientes y que queramos guardar la siguiente información: nombres, apellidos, edad, sexo y comentarios. Los nombres y apellidos serán obligatorios.
Siempre adicionalmente a los campos de una tabla se debe añadir uno que haga la función de PK o Primary Key el cual sea único, por lo general se elige el nombre para este campo como Id y es de tipo entero auto-incremental, obviamente será NOT NULL lo que quiere decir que será un campo obligatorio.
La consulta para llevar a cabo esta tarea sería entonces:
CREATE TABLE Clientes(
id int IDENTITY(1,1) NOT NULL PRIMARY KEY,
nombres VARCHAR(50) NOT NULL,
apellidos VARCHAR(50) NOT NULL,
edad INT,
sexo CHAR(1),
comentarios VARCHAR(100)
)
Recordar que para ejecutar las sentencias es necesario seleccionar en la parte superior del SSMS la base de datos correcta, así como se muestra en la siguiente imagen.
En el SSMS (SQL Server Management Studio) tenemos esto, perfecto crack!
Este es el diseño de la tabla creada:
Ahora imaginemos que queremos borrar esa tabla, eso lo hacemos con:
Recuerda siempre asegurarte bien antes de ejecutar comandos de borrado como este, nunca lo hagas directamente en producción y chequea dos veces antes de proceder! Asegúrate y pregunta! Es mejor caer espeso que tirarse abajo una base de datos 👀
DROP TABLE Clientes
Y si queremos borrar la base de datos completa, OJO DIJE BORRAR LA BASE DE DATOS 😲
USE master;
GO
DROP DATABASE DBEjemplo
En este último ejemplo hemos hecho uso del comando USE para cambiar de base de datos actual, si no lo hacemos nos aparecerá el error: No se puede eliminar la base de datos porque está en uso
Para modificar una tabla, por ejemplo añadir una columna, podemos ejecutar esto:
ALTER TABLE Clientes
ADD Email varchar(255) NOT NULL
Y para eliminar una columna hacemos esto:
ALTER TABLE Clientes
DROP COLUMN comentarios
Si queremos vaciar una tabla por completo, es decir borrar todos sus registros ejecutamos
TRUNCATE TABLE Clientes
Como veremos más adelante también se pueden borrar los registros de una tabla con la sentencia DELETE FROM tabla, sin embargo la diferencia está en que al truncar una tabla reseteamos también el índice del auto-incremental a 1 para el campo PK auto-incremental.
Lenguaje de manipulación de datos (DML)
Son sentencias para trabajar con los datos, las sentencias más utilizadas aquí son:
- SELECT
- INSERT
- UPDATE
- DELETE
Para hacer las pruebas utilizaremos la siguiente estructura de base de datos, pero tu puedes usar la que desees, lo importante es que crees tus tablitas, sus relaciones (te recomiendo que las relaciones las hagas con el diseñador visual de SSMS) y las llenes con datos para que practiques todas las sentencias que aquí veremos:
Una estructura relativamente sencilla, que consta de 4 tablitas con sus respectivas relaciones entre ellas, sus llaves primarias, una tabla tiene una primary key compuesta y no hay mucho más.
Obtener Información: SELECT
Si queremos obtener ciertos, o todos los registros de la tabla Autores ejecutamos:
SELECT
Id
,Nombre
FROM Autores
Se puede especificar un alias estableciéndolo después del nombre del campo o con la sentencia AS
SELECT
Id id
,Nombre as 'Nombre del autor'
FROM Autores
También es posible especificarle cuantos registros queremos traer con TOP y si queremos traer todas las columnas con asterisco:
SELECT TOP 5 *
FROM Autores
Podemos indicarle si queremos filtrar los resultados y ordenarlos:
SELECT *
FROM Autores
WHERE Nombre = 'Gerson Eder'
ORDER BY Id
En el caso del WHERE aquí estamos usando igualdad (=) pero podemos usar mayor que (>), menor que (<), mayor igual (>=), menor igual (<=), distinto (<>), etc... también puede existir más de una condición y jugar con ellas haciendo que se cumplan ambas a la vez con AND, o cualquiera de ellas con OR, esto es muy bueno para investigar, te animo que lo hagas.
Esto merece profundizar un poquito, salgamos del esquema propuesto por un momento, imaginemos una tabla llamada Ventas que contiene 3 campos departamento, anio (por año, no se recomienda tener ñ como nombre de campo) y total. Queremos obtener el ranking de ventas por departamento a partir del año 2018 en adelante y sólo de aquellas ventas que superaron el millón de dólares. La consulta sería algo así:
SELECT *
FROM Ventas
WHERE anio >= 2018 AND total > 1000000
ORDER BY departamento DESC --Ordenamos de forma descendiente para el ranking
Si queremos contar cuantos autores tenemos podemos hacer uso de las llamadas FUNCIONES AGREGADAS, en este caso usaremos COUNT, pero tenemos más por ejemplo SUM, AVG, MAX, MIN, etc. te recomiendo investigarlas, aquí hay buena info, gracias al buen Diego Lázaro.
--Hacemos uso de la función agregada COUNT, por cierto los comentarios empiezan con --
SELECT COUNT(Nombre) as 'Cantidad'
FROM Autores
Insertar registros: INSERT
Si queremos insertar registros en la tabla Autores, podemos ejecutar:
INSERT INTO Autores(Nombre) VALUES ('Gerson Eder')
Si queremos insertar un registro para todos los campos de la tabla no es necesario especificar las columnas
INSERT INTO Autores VALUES ('Gerson Eder')
Siempre tener en cuenta que si un campo es NOT NULL entonces tendremos obligatoriamente que enviarle un valor
Actualizar un registro: UPDATE
Nunca hagas un UPDATE o un DELETE sin WHERE
a menos que quieras afectar a toda la tabla
o quieras quedarte sin empleo 🤣
Si queremos actualizar un autor, por ejemplo cambiarle el nombre ejecutamos:
UPDATE Autores
SET Nombre = 'Gerson Azabache M'
WHERE Id = 1003
Para las sentencias UPDATE y DELETE es muy importante especificar a qué registros queremos afectar con WHERE, ya que si no hacemos esto podemos actualizar o eliminar los registros de toda la tabla 😲. Un TIP que puedo darte es que comiences a escribir la sentencia a modo de SELECT, la pruebes y luego sólo te quedes con el WHERE y recién allí cambies el SELECT por UPDATE o DELETE.
Eliminar registros: DELETE
Si queremos borrar un autor por su Id podemos ejecutar:
DELETE FROM AUTORES
WHERE Id = 1003
En este caso estamos eliminando por Id, pero podría ser por cualquier otra condición como por ejemplo borrar todos los registros que contengan la palabra Carlos en el campo nombre:
DELETE FROM AUTORES
WHERE Nombre LIKE '%Carlos%'
Obtener Información Relacionada: JOIN
En muchas ocasiones querrás traer información no sólo de una tabla, sino también datos relacionados de otra tabla, esto se hace con la sentencia JOIN que a su vez puede ser INNER JOIN, LEFT JOIN y RIGHT JOIN. Hay más joins pero en su mayoría tendremos estos 3.
El saber cual aplicar será motivo para un post entero pero como resumen te puedo decir que el usar LEFT o RIGHT va a depender de qué tabla esté a tu izquierda o derecha en tu consulta o query, aquí puedes encontrar más información.
Como no siempre van a existir registros que se correspondan entre dos tablas, es posible especificar qué tabla va a tener la preferencia si la izquierda (LEFT) o si la derecha (RIGHT).
Sin embargo en la gran mayoría de los casos vas a querer sólo los registros que se correspondan entre las dos tablas y para eso usarás INNER JOIN.
Imaginemos que queremos traer todos los autores y los posts que ha escrito, esa información no la podemos obtener de una sola tabla, sino de Autores y Posts, lo lograremos ejecutando lo siguiente:
SELECT * FROM Autores a
INNER JOIN Posts p ON a.Id = p.AutorId
Como vemos además de añadir la sentencia del JOIN también le tenemos que especificar qué campo hace de nexo entre las tablas con la sentencia ON.
También podemos añadir condicionales WHERE y ordenamiento con ORDER BY a este SELECT si se desea.
Qué sigue? Escribiré una entrada con sentencias más avanzadas del tema pero de momento te va a ayudar aprender temas como: variables, funciones a más profundidad, transacciones y pivots, pero es opcional en el caso que quieras ser un pro del SQL, así que ya la pelota está en tu cancha.
Así que ahora...
Ya sabes lo básico pero sustancial del lenguaje SQL, en especial su variante Transact SQL también llamado T-SQL, con este lenguaje de consulta de base de datos puedes navegar entre la data y obtener resultados, entonces ya sabrás o tendrás una mejor idea al menos, de porqué tu ORM como Entity Framework genera esa consulta, o si te piden reportes muy específicos podrás armarlos tu mismo guardando la consulta como un procedimiento almacenado.
También te servirá mucho aprender este lenguaje de consulta si te quieres dedicar a los datos ya sea como ingeniero de datos, analista de datos, científico de datos y roles relacionados.
Muchas veces en un trabajo, sobre todo si haces de todo un poco y no sólo desarrollas, tu jefe o líder te preguntará cuál es el producto con más rentabilidad, o te pedirá un cuadro con el resumen de las ventas del año pasado, ahora ya tienes una mejor idea y las herramientas para poder obtener esa información directamente de la base de datos y no estarás con tu carita de yo no fui 🤣
Por cierto! en varios suculentos posts menciono que son como un chilcanito de pescado, por si no sabes que és, aquí una imagen, bueno hoy de todas maneras me empujo un chilcano, ya me provocó 😂
Crack, espero esta entrada te haya servido tanto como a mi al redactarla, y si es así te agradecería que la compartieras en toditititas tus redes 😉
Donde hay voluntad hay un camino.