Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Funes de agrupamento:
AVG() = Retorna o valor mdio de uma coluna especfica
BINARY_CHECKSUM() = O valor do BINARY_CHECKSUM computado sobre uma linha ou uma tabela
ou sobre uma lista de expresses. BINARY CHECKSUM usada para detectar alteraes em uma linha ou
uma tabela.
CHECKSUM() = O valor de CHECKSUM computado sobre uma linha ou uma tabela, ou sobre uma lista
de expresses. CHECKSUM usada para construir ndices de hash.
CHECKSUM_AGG() = O valor de CHECKSUM de um grupo. Valores nulos so ignorados.
COUNT() = Retorna o nmero de linhas
COUNT_BIG() = igual ao COUNT mas o COUNT_BIG sempre retorna um tipo de dados bigint.
MAX() = Retorna o valor mximo de uma coluna especfica
MIN() = Retorna o valor mnimo de uma coluna especfica
SUM() = Retorna a soma de uma coluna especfica
STDEV() = Desvio padro de todos os valores
STDEVP() = Desvio padro da populao
VAR() = Varincia estatistica de todos os valores
VARP() = Varincia estatstica de todos os valores da populao
Funes de manipulao de strings:
ASCII(string) = pega o valor em ASCII da string
CHAR(integer) = troca inteiro do ASCII em um caracter
LEN(string) = Identifica o comprimento de uma expresso em caracteres
LOWER(string) = converte uma string uppercase para lowercase.
LTRIM(string) = remove os espaos em branco
PATINDEX(posicao, expressao) = devolve a posico de uma string dentro de um texto. Se no encontrar,
retorna zero.
REPLICATE(string, integer) = Repete N vezes um caractere especificado
REVERSE(string) = retorna o inverso de uma expressao
RTRIM (string) = remove os espaos em branco direita de uma string
SPACE(integer) = que retorna o nmero de espaos em branco informados no parmetro
STUFF(string texto, X, Y, string texto_a_inserir) = apaga da string "texto" os y caracteres a partir da
posio x e os substitui por "texto_a_inserir"
SUBSTRING(string texto, posicao_inicial, tamanho) = retorna uma string com o comprimento definido
em "tamanho" extraida da string "texto", a partir da "posicao_inicial"
UPPER(string) = retorna string em maiusculas
Funes de manipulao de data/hora:
nomes das partes de data:
Year = yy, yyyy
Quarter = qualquer, que
Month = mm, m
Dayofyear = dy, y
Day = dd, d
Week = wk, ww
Hour = hh
Minute = mi, n
Second = ss, s
Millisecond = ms
DATEADD (parte, numero, data) = adiciona um valor a parte de uma data
DATEDIFF (parte, data inicial, data final) = subtrai a data inicial da data final, indicando o resultado na
unidade definida em "parte"
GETDATE() = retorna a data atual do sistema
DATENAME (parte, data) = retorna o nome da parte de uma data
DATEPART(parte, data) = retorna a parte de uma data
Funes de Sistema:
CAST(expressao as datatype) = converte uma expressao no datatype informado
COL_LENGTH(nome_da_tabela, nome_da_coluna) = retorna o tamanho da coluna
COL_NAME(id_da_tabela, id_da_coluna) = retorna o nome da coluna
DATALENGTH(expressao) = retorna o numero de bytes usados para armazenar a expressao
DB_ID(nome_do_banco) = retorna o ID do banco informado
DB_NAME(id_do_banco) = retorna o nome do banco
HOST_ID() = retorna a ID da estao que est acessando o SQL Server
HOST_NAME() = retorna o nome da estao que est acessando o SQL Server
IDENT_INCR(nome_da_tabela_ou_view) = retorna o valor incrementado
IDENT_SEED(tabela_ou_view) = retorna o valor inicial da coluna
INDEX_COL(nome_da_tabela, indice_id, chave_id) = retorna o nome da coluna que participa do ndice
ISNULL(expressao, valor) = se a expressao for null, troca pelo valor especificado
ISNUMERIC(expressao) = retorna 1 se a expressao for numerica e 0 se no for
NEWID() = retorna um novo valor do tipo uniqueidentifier
NULLIF(expressao_1, expressao_2) = retorna nulo se as duas expressoes forem equivalentes. Se no
forem, retorna a primeira expressao.
OBJECT_ID(nome_do_objeto) = retorna o ID de um objeto, a partir do nome fornecido
OBJECT_NAME(ID_do_objeto) = retorna o nome do objeto, a partir do ID fornecido
PARSENAME(objeto, parte) = retorna a parte do nome de um objeto, desde que tenha sido qualificado
STATS_DATE(tabela_id, indice_id) = retorna a data em que as estatsticas do ndice foram atualizadas
SUSER_SID(nome_do_usuario) = retorna o ID do usuario informado
SUSER_NAME(usuario_id) = retorna o id do usurio no servidor. O argumento opcional.
SUSER_SNAME(id_do_usuario) = retorna o nome do usuario informado. Se nenhum ID de usuario for
passado para a funo, retorna o nome do usuario logado
USER_ID(nome_do_usuario) = retorna o ID do usuario informado para o BD em uso
USER_NAME(id_do_usuario) = retorna o usuario conectado ao BD
Funes Matematicas:
ABS(numero) = retorna o valor absoluto do numero
ACOS(float) = retorna o arco-coseno do numero informado
ASIN(float) = retorna o arco-seno do numero informado
ATAN(float) = retorna o arco-tangente do numero informado
ATN2(Float expressao_1, float expressao_2) = Arco-tangente do valor definido pela diviso da primeira
expresso pela segunda
CEILING(numero) = retorna o menor inteiro que seja maior ou igual ao numero informado
COS(float) = retorna o coseno do numero informado
COT(float) = retorna o cotangente do numero informado
DEGREES(numero) = converte radianos para graus
EXP(float) = retorna o exponencial de um numero especificado
FLOOR(numero) = retorna o maior inteiro que seja menor ou igual ao numero informado
LOG(float) = retorna o logaritmo natural do numero informado
LOG10(float) = retorna o logaritmo base 10 do numero informado
PI() = retorna o valor de PI 3.1415926535897931.
POWER(numero, potencia) = retorna o valor elevado potencia informada
RADIANS(numero) = converte graus para radianos
RAND(expressao) = um nmero aleatrio entre 0 e 1. Expresso opcional e ser usada como semente da
cadeia pseudo-aleatria
ROUND(numero, precisao, arredonda_ou_trancar) = arredonda ou tranca o numero fornecido de acordo
com a precisao informada. Se o terceiro parametro no for passado para a funao, o numero arredondado.
Se quiser que o numero seja truncado, deve-se fornecer o valor 1
SIGN(numero) = retorna sinal positivo, negativo ou zero do numero
SIN(float) = retorna o seno do angulo especificado
SQRT(float) = retorna a raiz quadrada de um numero
TAN(float) = retorna a tangente de um numero informado
SQUARE(float) = retorna o quadrado de um numero
Funo de converso:
CONVERT(tipo(tamanho), expresso, estilo) = converte a expresso para o tipo de dado. O tamanho e o
estilo so opcionais
No atual post prentende-se discutir/exemplificar alguns pontos que podero serem teis tanto no
entendimento/clareza quanto na performance das queries e stored procedure.
No so regras, so apenas "dicas" cada caso um caso. Utilize-as sempre que possvel, lembrando que
alguns casos poderemos perder em performance para atender determinadas situaes.
Esta dicas podem ser aplicadas em quase todos os bancos de dados que utilizem padro ANSI.
1. Uso do Select *
Sempre que possvel evitar o uso de select * mesmo que a Stored Procedure retorne todos as
colunas de uma tabela. Com isso, garante-se a segurana e manutenabilidade da SP, pois sabe-se
exatamente quais parmetros ela retorna assim que se visualiza o seu cdigo.
2. Uso de > ou >=
Situao: A query :
CODE
select c1,c2 from t where a > 3
e a tabela possui ndice em a..
Se houver muitas linhas com a = 3, o engine do banco de dados far scan de muitas pginas at
encontrar a > 3.
mais eficiente se escrita da forma:
CODE
select c1,c2 from t where a >= 4
No SELECT de um EXISTS tomar cuidado para no colocar * ou colunas que no sejam ndice
cluster, pois o EXISTS
no necessita retornar colunas somente verificar se a linha existe ou no. Assim, utilizar if exists:
CODE
select 1 from t where a > 3
ao invs de if exists:
CODE
( select * from t where a > 3)
select outer.w
from outer, #work
where outer.z = #work.z and outer.y = 1 and outer.x = #work.summ
O bancod de dados copia a clusula search ( y = 1 ) para a subquery, mas no copia clusula join.
Isto porque copiando a clusula search, sempre tornar a query mais eficiente, mas copiando a
clusula join pode em muitos casos tornar a query mais lenta. A cpia da clusula join s eficiente
quando ela extremamente restritiva, mas o banco de dados faz a quebra antes do otimizador atuar.
Ento, para tornar a query mais eficiente, conhecendo previamente a alta restritividade da clusula
join, pode-se copiar a clusula join para a subquery como no exemplo abaixo :
tab_x -> tabela grande
tab_y -> tabela pequena
CODE
select a from tab_x, tab_y
where tab_x.coluna_valor_unico = tab_y.a and tab_x.b = ( select sum from tabela_interna where
tab_x.d = tabela_interna.e and tab_x.coluna_valor_unico = tab_y.a)
7. COUNT x EXISTS
Para testes de existncia sempre mais eficiente utilizar EXISTS do que COUNT. Quando se utiliza
o COUNT o banco de dados no sabe que se est fazendo um teste de existncia e continua
pesquisando todas as linhas qualificadas. J utilizando EXISTS, o banco de dados sabe que um
teste de existncia e interrompe a pesquisa quando encontra a primeira linha qualificada.
Este mesmo raciocnio vlido quando se utiliza COUNT no lugar de IN ou ANY.
8. OR x UNION
O banco de dados no consegue otimizar clusulas de join ligadas por OR. Neste caso mais
eficiente ligar os conjuntos de resultados por UNION.
Por exemplo :
CODE
select a from tab1,tab2 where tab1.a = tab2.a OR tab1.x = tab2.x
A diferena que na segunda forma, so eliminadas as linhas duplicadas, o que pode ser contornado
com UNION ALL.
9. MAX e MIN Agregados
O banco de dados utiliza uma otimizao especial para MAX e MIN quando h um ndice na coluna
agregada. Para o MIN a pesquisa interrompida quando encontra a primeira linha qualificada.
Para o MAX, o banco de dados vai diretamente para o final do ndice e pega a ltima linha.
Os casos onde estas otimizaes especiais no so utilizadas:
- a expresso do MAX ou MIN no uma coluna.
- a coluna do MAX ou MIN no a primeira do ndice
- existe outro comando agregado na query.
- existe uma clusula de GROUP BY.
- se existe clusula WHERE, a otimizao especial de MAX no utilizada.
Se houver possibilidade de se conseguir otimizao especial, vale a pena separar em vrias queries.
mais eficiente utilizar o ndice vrias vzes, do que fazer scan table uma nica vez.
Em alguns casos, pode ser mais eficiente no utilizar a otimizao especial do MIN. Por exemplo, se
h uma clusula where em outro ndice, quanto mais restritivo for o WHERE, menos eficiente fica a
otimizao especial do MIN. A soluo convencer o otimizador a no utilizar a otimizao especial
O banco de dados utilizar aqui a otimizao especial do MIN, e far um scan em quase todo o
ndice, pois a qualificao na clusula WHERE fora esta situao. Se colocarmos mais um
aggregate, convenceremos o otimizador a utilizar o processo normal, criando um plano de acesso
pelo ndice da coluna2, neste caso, mais eficiente que a otimizao especial do MIN.
CODE
select MIN(coluna1), MAX[coluna2)
from tab where coluna2 =
CODE
create procedure s_p @x char(30) as select c1,c2 from tab where coluna_char_30 = @x
Neste tpico vamos aprender como manipular Data (DATETIME ou SMALLDATETIME) no SQL
Server.
No um texto dogmtico nem com pretenso de esgotar o assunto. As dicas e exemplos postados aqui
representam o meu aprendizado dirio. Funcionam! Porm no so verdades absolutas.
1. Sempre criar campos data com o formato DATETIME ou SMALLDATETIME. A diferena entre
os dois tipos podem ser detalhadas nos Books Online. O exemplo a seguir mostra de forma
simplificada como cada tipo atua:
CODE
---Retorna Data do sistema completa: AAAA-MM-DD 00:00:00.000
A funo CONVERT alm de devolver a data formatada, ou parte da mesma, permite efetuar a
converso do campo data para outros formatos. Nesta caso pode-se utilizar a funao CAST para
obter-se o mesmo resultado. Para concatenar um texto com uma data veja os exemplos:
CODE
SELECT CONVERT(VARCHAR(10),GETDATE(),103) + ' a data de hoje'
SELECT CAST(GETDATE() AS VARCHAR(10)) + ' a data de hoje'
Normalmente utilizo o CONVERT e no o CAST, mas cada caso um caso.
Obs: Muita ateno no resultado da converso de datas para outros formatos. As vezes no ocorre a
concatenao e sim uma soma, principalmente na converses para formato numrico.
6. Manipulando partes de data:
CODE
SELECT YEAR(GETDATE()) AS ANO,
MONTH(GETDATE()) AS MES,
DAY(GETDATE()) AS DIA
---Utlizando DATEPART que retorna um INTEIRO contendo informaes
--sobre o campo data
SELECT DATEPART(YEAR, GETDATE()) AS ANO,
DATEPART(MONTH, GETDATE()) AS MES,
DATEPART(DAY, GETDATE()) AS DIA,
DATEPART(DAYOFYEAR, GETDATE()) AS DIA_ANO,
DATEPART(WEEK, GETDATE()) AS SEMANA,
DATEPART(HOUR, GETDATE()) AS HORA,
DATEPART(MINUTE, GETDATE()) AS MINUTO
---Utlizando DATENAME que retorna uma STRING(caracter) contendo informaes
--sobre o campo data
SELECT DATENAME (YEAR, GETDATE()) AS ANO,
DATENAME (MONTH, GETDATE()) AS MES,
DATENAME (DAY, GETDATE()) AS DIA,
DATENAME (DAYOFYEAR, GETDATE()) AS DIA_ANO,
DATENAME (WEEK, GETDATE()) AS SEMANA,
DATENAME (HOUR, GETDATE()) AS HORA,
DATENAME (MINUTE, GETDATE()) AS MINUTO
Mais exemplos e particularidades de cada funo pr-atividade e Books Online(procure por Date
and Time Functions). :assobiando:
7. Datas e matemtica. possvel? :devil:
CODE
---DATEDIFF retorna um INTEITO como resultado de operaes
--entre dua datas
DECLARE @DT_EXEMPLO DATETIME
SET @DT_EXEMPLO = '1966/01/01'
FROM #ATIVIDADES
---USANDO CASE NAS EXPRESSES:
-PRINT 'Data Atual (GETDATE()) - DT_FIM: '
SELECT CONVERT(VARCHAR(10),DT_INI,103) AS DT_INI,
CONVERT(VARCHAR(10),DT_FIM,103) AS DT_FIM,
DATEDIFF(DAY,DT_INI,DT_FIM) AS 'DT_FIM-DT_INI',
DATEDIFF(DAY,DT_INI,GETDATE()) AS 'GETDATE()-DT_INI',
DATEDIFF(DAY,DT_FIM,GETDATE()) AS 'GETDATE()-DT_FIM',
CASE
WHEN GETDATE() BETWEEN DT_INI AND DT_FIM THEN 'Iniciado'
WHEN (DATEDIFF(DAY,DT_FIM,GETDATE())) < 1 THEN 'A iniciar'
ELSE 'Finalizado'
END AS DE_SITUACAO,
CASE
WHEN (DATEDIFF(DAY,DT_FIM,GETDATE())) > 0 THEN '100 %'
ELSE
CASE
WHEN CONVERT(VARCHAR(15),100 - ((100 * (DATEDIFF(DAY,DT_FIM,GETDATE()) *
-1) ) /
DATEDIFF(DAY,DT_INI,DT_FIM))) < 0 THEN '0 %'
ELSE CONVERT(VARCHAR(15),100 - ((100 * (DATEDIFF(DAY,DT_FIM,GETDATE()) * -1) ) /
DATEDIFF(DAY,DT_INI,DT_FIM))) + '%'
END
END AS PERC_REAL
FROM #ATIVIDADES DROP TABLE #ATIVIDADES
Consideraes:
3 parmetros
EXEMPLO_WHERE_DINAMICO('UF','CIDADE','BAIRRO')
2 parmetros
EXEMPLO_WHERE_DINAMICO('UF','CIDADE')
1 parmetro
EXEMPLO_WHERE_DINAMICO('UF')
NENHUM parmetro
EXEMPLO_WHERE_DINAMICO()