# 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:
ACTIVEDOUBLENUMERIC
ADDDROPOF
ANDEDITON
ALLELSEONLY
ALTERENDOPEN
ANYEXECUTEOR
ASEXISTSORDER
ASCFILTEROUTER
ASCENDINGFIRSTPERCENT
ATFLOATPLAN
AVGFORPOSITION
BEFOREFOREIGNPRECISION
BEGINFROMPREPARE
BETWEENFULLPRIMARY
BLOBFUNCTIONPROCEDURE
BYGENERATORPUBLIC
CASEGEN\_IDREAL
CASTGROUPRIGHT
CHARHAVINGROWS
COALESCEHOURSELECT
COLLATEIFSET
COLUMNINSIZE
COMMITINACTIVESOME
CONTINUEINDEXSQL
COUNTINNERSUM
CREATEINSERTTABLE
CURRENTINTEGERTHEN
CURRENT\_DATEINTOTRIGGER
CURRENT\_ROLEISTRUNCATE
CURRENT\_TIMEJOINTYPE
CURRENT\_TIMESTAMPKEYUNION
CURRENT\_TRANSACTIONLASTUPDATE
CURRENT\_USERLEFTUPDATING
CURSORLENGTHUSE
DATABASELIKEUSER
DATELONGUSING
DAYMAXVALUE
DECMERGEVALUES
DECIMALMINVIEW
DECLAREMINUTEWHEN
DEFAULTMONTHWHERE
DELETENAMESWHILE
DESCNOWITH
DESCENDINGNOTYEAR
DISTINCTNULLYEARDAY
DONULLIF
# 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?