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

```SQL
    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**

```SQL
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**

```SQL
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**

```SQL
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

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

```

<p class="callout info">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.</p>

# Exemplo: Modificador DISTINCT

```SQL
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

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

```

<p class="callout info">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</p>

# Palavras Reservadas

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

<table border="1" id="bkmrk-active-double-numeri" style="border-collapse: collapse; width: 73.5782%; height: 1334px;"><tbody><tr style="height: 29px;"><td class="align-left" style="width: 33.3333%; height: 29px;">ACTIVE</td><td class="align-left" style="width: 33.3333%; height: 29px;">DOUBLE</td><td class="align-left" style="width: 32.4692%; height: 29px;">NUMERIC</td></tr><tr style="height: 29px;"><td class="align-left" style="width: 33.3333%; height: 29px;">ADD</td><td class="align-left" style="width: 33.3333%; height: 29px;">DROP</td><td class="align-left" style="width: 32.4692%; height: 29px;">OF</td></tr><tr style="height: 29px;"><td class="align-left" style="width: 33.3333%; height: 29px;">AND</td><td class="align-left" style="width: 33.3333%; height: 29px;">EDIT</td><td class="align-left" style="width: 32.4692%; height: 29px;">ON</td></tr><tr style="height: 29px;"><td class="align-left" style="width: 33.3333%; height: 29px;">ALL</td><td class="align-left" style="width: 33.3333%; height: 29px;">ELSE</td><td class="align-left" style="width: 32.4692%; height: 29px;">ONLY</td></tr><tr style="height: 29px;"><td class="align-left" style="width: 33.3333%; height: 29px;">ALTER</td><td class="align-left" style="width: 33.3333%; height: 29px;">END</td><td class="align-left" style="width: 32.4692%; height: 29px;">OPEN</td></tr><tr style="height: 29px;"><td class="align-left" style="width: 33.3333%; height: 29px;">ANY</td><td class="align-left" style="width: 33.3333%; height: 29px;">EXECUTE</td><td class="align-left" style="width: 32.4692%; height: 29px;">OR</td></tr><tr style="height: 29px;"><td class="align-left" style="width: 33.3333%; height: 29px;">AS</td><td class="align-left" style="width: 33.3333%; height: 29px;">EXISTS</td><td class="align-left" style="width: 32.4692%; height: 29px;">ORDER</td></tr><tr style="height: 29px;"><td class="align-left" style="width: 33.3333%; height: 29px;">ASC</td><td class="align-left" style="width: 33.3333%; height: 29px;">FILTER</td><td class="align-left" style="width: 32.4692%; height: 29px;">OUTER</td></tr><tr style="height: 29px;"><td class="align-left" style="width: 33.3333%; height: 29px;">ASCENDING</td><td class="align-left" style="width: 33.3333%; height: 29px;">FIRST</td><td class="align-left" style="width: 32.4692%; height: 29px;">PERCENT</td></tr><tr style="height: 29px;"><td class="align-left" style="width: 33.3333%; height: 29px;">AT</td><td class="align-left" style="width: 33.3333%; height: 29px;">FLOAT</td><td class="align-left" style="width: 32.4692%; height: 29px;">PLAN</td></tr><tr style="height: 29px;"><td class="align-left" style="width: 33.3333%; height: 29px;">AVG</td><td class="align-left" style="width: 33.3333%; height: 29px;">FOR</td><td class="align-left" style="width: 32.4692%; height: 29px;">POSITION</td></tr><tr style="height: 29px;"><td class="align-left" style="width: 33.3333%; height: 29px;">BEFORE</td><td class="align-left" style="width: 33.3333%; height: 29px;">FOREIGN</td><td class="align-left" style="width: 32.4692%; height: 29px;">PRECISION</td></tr><tr style="height: 29px;"><td class="align-left" style="width: 33.3333%; height: 29px;">BEGIN</td><td class="align-left" style="width: 33.3333%; height: 29px;">FROM</td><td class="align-left" style="width: 32.4692%; height: 29px;">PREPARE</td></tr><tr style="height: 29px;"><td class="align-left" style="width: 33.3333%; height: 29px;">BETWEEN</td><td class="align-left" style="width: 33.3333%; height: 29px;">FULL</td><td class="align-left" style="width: 32.4692%; height: 29px;">PRIMARY</td></tr><tr style="height: 29px;"><td class="align-left" style="width: 33.3333%; height: 29px;">BLOB</td><td class="align-left" style="width: 33.3333%; height: 29px;">FUNCTION</td><td class="align-left" style="width: 32.4692%; height: 29px;">PROCEDURE</td></tr><tr><td class="align-left" style="width: 33.3333%;">BY</td><td class="align-left" style="width: 33.3333%;">GENERATOR</td><td class="align-left" style="width: 32.4692%;">PUBLIC</td></tr><tr><td class="align-left" style="width: 33.3333%;">CASE</td><td class="align-left" style="width: 33.3333%;">GEN\_ID</td><td class="align-left" style="width: 32.4692%;">REAL</td></tr><tr><td class="align-left" style="width: 33.3333%;">CAST</td><td class="align-left" style="width: 33.3333%;">GROUP</td><td class="align-left" style="width: 32.4692%;">RIGHT</td></tr><tr><td class="align-left" style="width: 33.3333%;">CHAR</td><td class="align-left" style="width: 33.3333%;">HAVING</td><td class="align-left" style="width: 32.4692%;">ROWS</td></tr><tr><td class="align-left" style="width: 33.3333%;">COALESCE</td><td class="align-left" style="width: 33.3333%;">HOUR</td><td class="align-left" style="width: 32.4692%;">SELECT</td></tr><tr><td class="align-left" style="width: 33.3333%;">COLLATE</td><td class="align-left" style="width: 33.3333%;">IF</td><td class="align-left" style="width: 32.4692%;">SET</td></tr><tr><td class="align-left" style="width: 33.3333%;">COLUMN</td><td class="align-left" style="width: 33.3333%;">IN</td><td class="align-left" style="width: 32.4692%;">SIZE</td></tr><tr><td class="align-left" style="width: 33.3333%;">COMMIT</td><td class="align-left" style="width: 33.3333%;">INACTIVE</td><td class="align-left" style="width: 32.4692%;">SOME</td></tr><tr><td class="align-left" style="width: 33.3333%;">CONTINUE</td><td class="align-left" style="width: 33.3333%;">INDEX</td><td class="align-left" style="width: 32.4692%;">SQL</td></tr><tr><td class="align-left" style="width: 33.3333%;">COUNT</td><td class="align-left" style="width: 33.3333%;">INNER</td><td class="align-left" style="width: 32.4692%;">SUM</td></tr><tr><td class="align-left" style="width: 33.3333%;">CREATE</td><td class="align-left" style="width: 33.3333%;">INSERT</td><td class="align-left" style="width: 32.4692%;">TABLE</td></tr><tr><td class="align-left" style="width: 33.3333%;">CURRENT</td><td class="align-left" style="width: 33.3333%;">INTEGER</td><td class="align-left" style="width: 32.4692%;">THEN</td></tr><tr><td class="align-left" style="width: 33.3333%;">CURRENT\_DATE</td><td class="align-left" style="width: 33.3333%;">INTO</td><td class="align-left" style="width: 32.4692%;">TRIGGER</td></tr><tr><td class="align-left" style="width: 33.3333%;">CURRENT\_ROLE</td><td class="align-left" style="width: 33.3333%;">IS</td><td class="align-left" style="width: 32.4692%;">TRUNCATE</td></tr><tr><td class="align-left" style="width: 33.3333%;">CURRENT\_TIME</td><td class="align-left" style="width: 33.3333%;">JOIN</td><td class="align-left" style="width: 32.4692%;">TYPE</td></tr><tr><td class="align-left" style="width: 33.3333%;">CURRENT\_TIMESTAMP</td><td class="align-left" style="width: 33.3333%;">KEY</td><td class="align-left" style="width: 32.4692%;">UNION</td></tr><tr><td class="align-left" style="width: 33.3333%;">CURRENT\_TRANSACTION</td><td class="align-left" style="width: 33.3333%;">LAST</td><td class="align-left" style="width: 32.4692%;">UPDATE</td></tr><tr><td class="align-left" style="width: 33.3333%;">CURRENT\_USER</td><td class="align-left" style="width: 33.3333%;">LEFT</td><td class="align-left" style="width: 32.4692%;">UPDATING</td></tr><tr><td class="align-left" style="width: 33.3333%;">CURSOR</td><td class="align-left" style="width: 33.3333%;">LENGTH</td><td class="align-left" style="width: 32.4692%;">USE</td></tr><tr><td class="align-left" style="width: 33.3333%;">DATABASE</td><td class="align-left" style="width: 33.3333%;">LIKE</td><td class="align-left" style="width: 32.4692%;">USER</td></tr><tr><td class="align-left" style="width: 33.3333%;">DATE</td><td class="align-left" style="width: 33.3333%;">LONG</td><td class="align-left" style="width: 32.4692%;">USING</td></tr><tr><td class="align-left" style="width: 33.3333%;">DAY</td><td class="align-left" style="width: 33.3333%;">MAX</td><td class="align-left" style="width: 32.4692%;">VALUE</td></tr><tr><td class="align-left" style="width: 33.3333%;">DEC</td><td class="align-left" style="width: 33.3333%;">MERGE</td><td class="align-left" style="width: 32.4692%;">VALUES</td></tr><tr><td class="align-left" style="width: 33.3333%;">DECIMAL</td><td class="align-left" style="width: 33.3333%;">MIN</td><td class="align-left" style="width: 32.4692%;">VIEW</td></tr><tr><td class="align-left" style="width: 33.3333%;">DECLARE</td><td class="align-left" style="width: 33.3333%;">MINUTE</td><td class="align-left" style="width: 32.4692%;">WHEN</td></tr><tr><td class="align-left" style="width: 33.3333%;">DEFAULT</td><td class="align-left" style="width: 33.3333%;">MONTH</td><td class="align-left" style="width: 32.4692%;">WHERE</td></tr><tr><td class="align-left" style="width: 33.3333%;">DELETE</td><td class="align-left" style="width: 33.3333%;">NAMES</td><td class="align-left" style="width: 32.4692%;">WHILE</td></tr><tr><td class="align-left" style="width: 33.3333%;">DESC</td><td class="align-left" style="width: 33.3333%;">NO</td><td class="align-left" style="width: 32.4692%;">WITH</td></tr><tr><td class="align-left" style="width: 33.3333%;">DESCENDING</td><td class="align-left" style="width: 33.3333%;">NOT</td><td class="align-left" style="width: 32.4692%;">YEAR</td></tr><tr><td class="align-left" style="width: 33.3333%;">DISTINCT</td><td class="align-left" style="width: 33.3333%;">NULL</td><td class="align-left" style="width: 32.4692%;">YEARDAY</td></tr><tr><td class="align-left" style="width: 33.3333%;">DO</td><td class="align-left" style="width: 33.3333%;">NULLIF</td><td class="align-left" style="width: 32.4692%;"> </td></tr></tbody></table>

# 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

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

**QuotedStr:**

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

```SQL
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

```SQL
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?

# Exemplo: INSERT

## **INSERT com SELECT**  


```SQL
INSERT INTO Tabela(Abrev, Nome, Numero)
     SELECT Abrev, Nome, Numero
       FROM TabelaExemplo
   GROUP BY 1, 2, 3
```

## **INSERT**

```SQL
INSERT INTO Tabela(Abrev, Nome, Numero)
     VALUES (:PAbrev, :PNome, :PNumero)
```