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
- Exemplo: CASE
- Exemplo: DELETE
- Exemplo: Modificador DISTINCT
- Exemplo: UPDATE
- Palavras Reservadas
- Dúvidas Frequentes
- Exemplo: INSERT
Considerações Iniciais
Introdução
Para rotinas em SQL, deve-se observar as seguintes considerações:
- Palavras reservadas devem ser escritas todas com as letras maiúsculas.
- Nomes de tabelas e campos devem utilizar notação PascalCase.
- Parâmetros devem possuir o prefixo "P" e utilizar notação PascalCase.
- 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?
Exemplo: INSERT
INSERT com SELECT
INSERT INTO Tabela(Abrev, Nome, Numero)
SELECT Abrev, Nome, Numero
FROM TabelaExemplo
GROUP BY 1, 2, 3
INSERT
INSERT INTO Tabela(Abrev, Nome, Numero)
VALUES (:PAbrev, :PNome, :PNumero)