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