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