Después de unos años como SQLero, aprendi y adopté ciertas reglas para la escritura de queries que me gustaría compartir con el público en general. Las reglas explicadas a continuación serán ejemplos de TSQL pero obviamente pueden ser aplicadas a cualquier otro SQL lenguaje :)
- Palabras reservadas con MAYÚSCULA
Esto ayuda bastante a distinguir las palabras reservadas de los nombres de campos, tablas, variables, etc.
SELECT t1.Col1, t1.Col2, t2.Col3FROM Tabla1 t1
INNER JOIN Tabla2 t2 ON t1.Id = t2.Tabla1IdWHERE t1.Vigente = 1 AND t1.Nombre = 'Test' - Marca Inicio y Fin de cada Consulta o Query:
En este caso es bueno tener una tabulación todas las lineas después de la sentencia la primera sentencia, de tal forma se siempre se sabe donde comienza y terminan los queriesSELECT t1.Col1, t1.Col2, t2.Col3
FROM Tabla1 t1
INNER JOIN Tabla2 t2 ON t1.Id = t2.Tabla1IdWHERE t1.Vigente = 1 AND t1.Nombre = 'Test'
INSERT INTO Tabla3(col1, col2, col3)VALUES (1, 2, 3)
UPDATE Tabla2 SET Col2 = 5FROM Tabla1 t1
INNER JOIN Tabla2 t2 ON t1.Id = t2.Tabla1IdWHERE t2.Valor > 5
De esta forma es más claro donde comienza y termina una sentencia. Se puede usar la tabulación de preferencia, pues vi que algunas personas utilizan 2 espacios para tabulaciones y otras como yo utilizamos 4. - Las líneas hijas de la sentencia deberían ir con una tabulación más que la padre.|
SELECT t1.Col1, t1.Col2, t2.Col3, t2.Col4 , t2.Col6FROM Tabla1 t1
INNER JOIN Tabla2 t2 ON t1.Id = t2.Tabla1IdAND t2.Fecha > '01/01/2010'WHERE zt1.Vigente = 1 AND t1.Nombre = 'Test'AND t1.Apellido = 'TestApellido'
Esta claro que de este modo sentencias mas complejas aún se tornarán menos difíciles de leer. A mi me tocó revisar algún query con 32 JOINs y muchas subconsultas y de principio tuve que antes ordenar para poder después tratar de entender la lógica del mismo. - Es mejor Vertical que Horizontal y con comas u operaciones lógicas al principio de cada linea.
CREATE PROCEDURE MiProc1@Param1 int , @Param2 varchar(100) , @param3 bit ASSELECT t1.Col1, t1.Col2, t2.Col3FROM Tabla1 t1
INNER JOIN Tabla2 t2 ON t1.Id = t2.Tabla1IdAND t2.Fecha > '01/01/2010'WHERE t1.Vigente = @Param3AND t1.Nombre = @Param2AND t2.Id = @Param1
La razón es muy sencilla, de esta forma es fácil comentar una línea y correr el query, comentar otra línea y correr el query sin tener que preocuparnos que si comentamos una líneas debemos agregar o quitar la coma de la línea anterior, o la operación lógica - Todos los JOINs una nueva línea, con el ON a lado. Nuevos creterios una línea abajo (AND/OR)
SELECT t1.Col1, t1.Col2, t2.Col3, ISNULL(t3.CargoNombre, '--Sin Cargo--')FROM Tabla1 t1
INNER JOIN Tabla2 t2 ON t1.Id = t2.Tabla1IdAND t2.Fecha > '01/01/2010'LEFT JOIN Tabla3 t3 ON t2.IdCargo = t3.IdAND t2.TipoCargo = 3WHERE t1.Vigente = 1 AND t1.Nombre = 'Test' - Declaraciones de variables con tabulaciones.
CREATE PROCEDURE MiProc@Param1 int @param2 varchar(100) @ParamMuyLargo3 bit ASDECLARE@var1 bigint , @var2 DateTime ,@varMuyMuyLarga3 varchar(200)
como se ve es mejor tener todos los tipos de alineados aunque haya parámetros o variables con nombres muy largos.
Es todo cuando se me ocurre en este momento.... ya lo iré actualizando con nuevas buenas costumbres SQLeras :)
Hasta una próxima...
Sip... completamente de acuerdo.
ResponderEliminarEstán muy buenas las sugerencias la única que nunca me gustó es la 5, "FROM Tabla1 t1 INNER JOIN Tabla2 t2 ON t1.Id = t2.Tabla1Id", yo prefiero poner los JOINS una linea más abajo. Me parece más legible. Pero vale el aporte !!!!
ResponderEliminarYup, agree.... los JOINs en una nueva línea :)
ResponderEliminar