SQL

Neste capítulo se encontram os padrões de código adotados para SQL e alguns exemplos ilustrativos, caso mesmo com os exemplos descritos, ainda restem dúvidas, não hesite em perguntar

Considerações Iniciais

Introdução

Para rotinas em SQL, deve-se observar as seguintes considerações: 

  1. Palavras reservadas devem ser escritas todas com as letras maiúsculas.
  2. Nomes de tabelas e campos devem utilizar notação PascalCase.
  3. Parâmetros devem possuir o prefixo "P" e utilizar notação PascalCase.
  4. Para facilitar a implementação e leitura de cláusulas, deve existir uma coluna do início ao fim da cláusula em que é feita a separação de palavras reservadas e campos/tabelas, como no exemplo abaixo:
    SELECT SUM(T1.Campo1) Campo1,
           T2.Campo1
      FROM Tabela1 T1
INNER JOIN Tabela T2
        ON T2.Campo2 = T1.Campo1
     WHERE T1.Campo3 = :PTabela1Campo3
       AND T2.Campo3 = :PTabela2Campo3
  GROUP BY T2.Campo1
 UNION ALL
    SELECT (SELECT Campo 1
              FROM Tabela 3) Campo1, 
           T2.Campo1
      FROM Tabela4 T4
INNER JOIN (SELECT Campo1
              FROM Tabela5) T5
        ON T5.Campo1 = T4.Campo1
     WHERE T4.Campo3 = :PTabela4Campo3
  ORDER BY 1

Perceba que na cláusula exemplo acima, as linhas 4 e 14 possuem as maiores palavras reservadas/expressões da cláusula, logo todas as outras palavras reservadas recebem a adição de pelo menos um espaço em branco à sua esquerda, para que o fim de todas as expressões finalizem na mesma coluna. Formando assim, uma coluna do início ao fim da cláusula que divide palavras reservadas para a esquerda e campos/tabelas para a direita.

Exemplo: CASE

Sem expressão no CASE

SELECT T1.Campo1, T1.Campo2
  FROM Tabela1 T1
 WHERE T1.Campo2 = :PInformacao1
   AND T1.Campo3 = :PInformacao2
   AND CASE
         WHEN
           T1.Campo4 IS NOT NULL
         THEN
           T1.Campo4 = :PInformacao3
         ELSE
           T1.Campo5 = :PInformacao3
       END

Com expressão no CASE

SELECT T1.Campo1, T1.Campo2
  FROM Tabela1 T1
 WHERE T1.Campo2 = :PInformacao1
   AND T1.Campo3 = :PInformacao2
   AND CASE COALESCE(T1.Campo4, "")
         WHEN
           ""
         THEN
           T1.Campo5 ||
           SUBSTRING(T1.Campo6 FROM 1 FOR 1) ||
           SUBSTRING(T1.Campo6 FROM 3 FOR 5)
         ELSE
           T1.Campo7
       END ApelidoDoCampo

Com CASE no SELECT

SELECT
  CASE
    WHEN
      EXISTS (SELECT 1
		        FROM Tabela1
               WHERE Campo1 = :PCampo1
                 AND Campo2 = :PCampo2)
      AND EXISTS (SELECT 1 
                    FROM Tabela1
                   WHERE Campo1 = :PCampo1
                     AND Campo2 = :PCampo2)
    THEN 
	  "True"
    ELSE 
	  "False"
  END AS Resultado
  FROM RDB$DATABASE;

Exemplo: DELETE

DELETE
  FROM TabelaExemplo
 WHERE Abrev = :PAbrev
   AND Tipo = :PTipo
   AND Categoria = :PCategoria

As comparações realizadas nas linhas 3-5 poderiam ter seus operadores alinhados na mesma coluna, entretanto essa não é uma prática recomendada para cláusulas mais extensas.

Exemplo: Modificador DISTINCT

SELECT DISTINCT T.Campo1, T.Campo2, T.Campo3
                T.Campo4, T.Campo5, T.Campo6
           FROM Tabela T
     INNER JOIN OutraTabela O
             ON O.Campo1 = T.Campo7
          WHERE T.Campo1 = :Param1
            AND T.Campo8 = :Param2

Exemplo: UPDATE

UPDATE TabelaExemplo
   SET Numero = :PNumero,
       Nome = :PNome
 WHERE Categoria = :PCategoria
   AND Tipo = :PTipo

As comparações realizadas nas linhas 2-5 poderiam ter seus operadores alinhados na mesma coluna, entretanto essa não é uma prática recomendada para cláusulas mais extensas

Palavras Reservadas

As palavras reservadas em SQL  devem ser escritas com todas as letras maiúsculas:

ACTIVE DOUBLE NUMERIC
ADD DROP OF
AND EDIT ON
ALL ELSE ONLY
ALTER END OPEN
ANY EXECUTE OR
AS EXISTS ORDER
ASC FILTER OUTER
ASCENDING FIRST PERCENT
AT FLOAT PLAN
AVG FOR POSITION
BEFORE FOREIGN PRECISION
BEGIN FROM PREPARE
BETWEEN FULL PRIMARY
BLOB FUNCTION PROCEDURE
BY GENERATOR PUBLIC
CASE GEN_ID REAL
CAST GROUP RIGHT
CHAR HAVING ROWS
COALESCE HOUR SELECT
COLLATE IF SET
COLUMN IN SIZE
COMMIT INACTIVE SOME
CONTINUE INDEX SQL
COUNT INNER SUM
CREATE INSERT TABLE
CURRENT INTEGER THEN
CURRENT_DATE INTO TRIGGER
CURRENT_ROLE IS TRUNCATE
CURRENT_TIME JOIN TYPE
CURRENT_TIMESTAMP KEY UNION
CURRENT_TRANSACTION LAST UPDATE
CURRENT_USER LEFT UPDATING
CURSOR LENGTH USE
DATABASE LIKE USER
DATE LONG USING
DAY MAX VALUE
DEC MERGE VALUES
DECIMAL MIN VIEW
DECLARE MINUTE WHEN
DEFAULT MONTH WHERE
DELETE NAMES WHILE
DESC NO WITH
DESCENDING NOT YEAR
DISTINCT NULL YEARDAY
DO NULLIF  

Dúvidas Frequentes

Espaço dedicado para a inclusão de dúvidas comuns durante o desenvolvimento em SQL. Caso sua dúvida não esteja aqui, talvez seja interessante adicioná-la.


Quando utilizar parâmetros, QuotedStr ou aspas duplas?

Parâmetros: 

Utilizar principalmente para as condições da cláusula

SELECT *
  FROM Tabela
 WHERE Campo1 = :PParametro1
   AND Campo2 = :PParametro2
   AND Campo3 = :PParametro3   

QuotedStr:

Utilizar quando for preciso concatenar uma variável string na consulta

SELECT Campo1, Campo2, Campo3
	   CASE
	     WHEN 
('	       Campo4 = QuotedStr(LVariavel)');
	     THEN
	       Campo4
	     ELSE
	       Campo5
	   END ApelidoDoCampo
  FROM Tabela
 WHERE Campo1 IS NOT NULL

Aspas duplas:

Utilizar quando uma string fixa for inserida na cláusula

SELECT Campo1, Campo2, Campo3
  FROM Tabela
 WHERE Campo1 = "NFE"

 

A utilização da palavra reservada "AS" é obrigatória para apelidar campos ou tabelas?

 

Qual a diferença entre a utilização de um UNION e UNION ALL?

 

Qual JOIN devo utilizar na cláusula?