Cosas Interesantes para Ver

viernes, 2 de diciembre de 2011

Queries claros, consultas para toda la vida

Casi todos los programadores sabemos escribir una consulta SQL, de una u otra forma nos toca abrir el DBMS que usemos y comenzamos a escribir nuestra consulta para integrar a nuestros programas. Ahora la pregunta es, sabemos escribir un buen query? bueno depende mucho del conocimiento que se tenga respecto al lenguaje usado, pero un requisito muy importante dentro de un query es el orden, pues después de nosotros habrán mas personas que realizar algun tipo de mantenimiento a nuestro programa y obviamente también tendrán que mantener los queries escritos en el.

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 :)



  1. 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.Col3
    FROM Tabla1 t1
        INNER JOIN Tabla2 t2 ON t1.Id = t2.Tabla1Id
    WHERE t1.Vigente = 1 AND t1.Nombre = 'Test'


  2. 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 queries
    SELECT t1.Col1, t1.Col2, t2.Col3
    FROM Tabla1 t1
        INNER JOIN Tabla2 t2 ON t1.Id = t2.Tabla1Id
    WHERE t1.Vigente = 1 AND t1.Nombre = 'Test'

    INSERT INTO Tabla3(col1, col2, col3)
    VALUES (1, 2, 3)

    UPDATE Tabla2 SET Col2 = 5
    FROM Tabla1 t1
        INNER JOIN Tabla2 t2 ON t1.Id = t2.Tabla1Id
    WHERE 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.

  3. 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.Col6
    FROM Tabla1 t1
        INNER JOIN Tabla2 t2 ON t1.Id = t2.Tabla1Id
       AND 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.

  4. Es mejor Vertical que Horizontal y con comas u operaciones lógicas al principio de cada linea.

    CREATE PROCEDURE MiProc1
    @Param1int
    , @Param2varchar(100)
    , @param3bit
    AS
    SELECT t1.Col1
    , t1.Col2
    , t2.Col3
    FROM Tabla1 t1
         INNER JOIN Tabla2 t2 ON t1.Id = t2.Tabla1Id
        AND t2.Fecha > '01/01/2010'
    WHERE t1.Vigente = @Param3
    AND t1.Nombre = @Param2
    AND 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

  5. 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.Tabla1Id
    AND t2.Fecha > '01/01/2010'
    LEFT JOIN Tabla3 t3 ON t2.IdCargo = t3.Id
    AND t2.TipoCargo = 3
    WHERE t1.Vigente = 1 AND t1.Nombre = 'Test'


  6. Declaraciones de variables con tabulaciones.

    CREATE PROCEDURE MiProc
    @Param1int
    @param2varchar(100)
    @ParamMuyLargo3bit
    AS
    DECLARE
    @var1bigint
    , @var2DateTime
    ,@varMuyMuyLarga3varchar(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...

3 comentarios:

  1. Está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 !!!!

    ResponderEliminar
  2. Yup, agree.... los JOINs en una nueva línea :)

    ResponderEliminar

Tuitealo ;)

FB Comentarios