daniel paulo [email protected]. para este capítulo é necessário incluir o banco de dados...
TRANSCRIPT
Daniel [email protected]
Para este capítulo é necessário incluir o Bancode dados PEDIDO localizado no C:\dadosEXEC sp_attach_db@dbname =‘PEDIDOS’,@filename1=‘c:\dados\pedidos_tabelas.mdf’,@filename2=‘c:\dados\pedidos_indices.ndf’,@filename3=‘c:\dados\pedidos_log.ldf’
Obs: Os modelos estão nos arquivos STRUCT_EMPREGADOS.jpg e STRUCT_PEDIDOS.jpg
Consultando todas as colunas
SELECT * FROM <nome da tabela>
Consultar todas as colunas da tabela Empregados dobanco de dados Pedidos
USE PEDIDOS;
SELECT * FROM EMPREGADOS
Consultando colunas Específicas
SELECT <coluna1> , <coluna2> , .. FROM <nome da tabela>
Consultar as colunas CODFUN, NOME E SALARIO da tabela Empregados
SELECT CODFUN, NOME, SALARIO FROM EMPREGADOS;
Redefinindo os indentgificadores de coluna com uso de alias
SELECT <coluna1> [[AS] <nome_alias>], <coluna2> [[AS] <nome_alias>]
FROM <tabela>
-- Apelido contendo caracteres especiais (espaço)SELECT CODFUN AS Codigo, NOME AS Nome, SALARIO AS
Salario, DATA_ADMISSAO AS [Data de Admissão] FROM EMPREGADOS;
-- Campo calculadoSELECT CODFUN AS Codigo, NOME AS Nome, SALARIO AS Salario, SALARIO * 1.10 [Salário com 10% de Aumento]FROM EMPREGADOS;
Laboratório 1 página 190
Ordenando Dados-- Ordenando os dados na ordem ascendenteSELECT * FROM EMPREGADOS ORDER BY NOMESELECT * FROM EMPREGADOS ORDER BY NOME ASCSELECT * FROM EMPREGADOS ORDER BY SALARIOSELECT * FROM EMPREGADOS ORDER BY SALARIO ASCSELECT * FROM EMPREGADOS ORDER BY DATA_ADMISSAO-- Ordenando os dados na ordem decrescenteSELECT * FROM EMPREGADOS ORDER BY NOME DESCSELECT * FROM EMPREGADOS ORDER BY SALARIO DESCSELECT * FROM EMPREGADOS ORDER BY DATA_ADMISSAO DESC
Obs: Caso não seja especificado ASC ou DESC o padrão é ASC
-- Ordenando por nome da colunaSELECT CODFUN AS Codigo, NOME AS Nome, SALARIO AS Salario, SALARIO * 1.10 [Salário com 10% de Aumento]FROM EMPREGADOSORDER BY 4;
-- Ordenando várias colunasSELECT COD_DEPTO, NOME, DATA_ADMISSAO,
SALARIO FROM EMPREGADOS ORDER BY COD_DEPTO, SALARIO--SELECT COD_DEPTO, NOME, DATA_ADMISSAO,
SALARIO FROM EMPREGADOS ORDER BY COD_DEPTO DESC, SALARIO
ORDER BY com TOP O resultado é selecionado a partir do conjunto ordenado
-- Lista os 5 primeiros empregados de acordo com a chave -- primáriaSELECT TOP 5 * FROM EMPREGADOS
-- Lista os 5 empregados mais antigosSELECT TOP 5 * FROM EMPREGADOS ORDER BY DATA_ADMISSAO
-- Lista os 5 empregados mais novosSELECT TOP 5 * FROM EMPREGADOS ORDER BY DATA_ADMISSAO DESC
-- Lista os 5 empregados que ganham menosSELECT TOP 5 * FROM EMPREGADOS ORDER BY SALARIO
-- Lista os 5 empregados que ganham maisSELECT TOP 5 * FROM EMPREGADOS ORDER BY SALARIO DESC
ORDER BY com TOP WITH TIES-- Listar os 7 funcionários que ganham maisSELECT TOP 7 CODFUN, NOME, SALARIOFROM EMPREGADOS ORDER BY SALARIO DESC-- Listar os 7 funcionários que ganham mais inclusive os que
possuem mesmo valorSELECT TOP 7 WITH TIES CODFUN, NOME, SALARIOFROM EMPREGADOS ORDER BY SALARIO DESC-- Mostrar 10% das linhas da tabela EmpregadosSELECT TOP 10 PERCENT WITH TIES * FROM EMPREGADOS ORDER BY SALARIO DESC
Filtrando consultas
Cláusula para a definição de critérios de com o objetivo de filtrar o resultado de uma consulta.
Obs: Neste capítulo a funcionalidade do WHERE é demonstrada apenas para filtragem de dados
Consultando com operadores de comparação de string= (igual)<> ou != (desigual)> (maior que)< (menor que)>= (maior que ou igual)<= (menor que ou igual)
-- Seleciona todos os Empregados que recebem menos de 1.000SELECT * FROM Empregados WHERE SALARIO < 1000ORDER BY SALARIO-- Seleciona todos os Empregados que recebem mais de 5.000SELECT * FROM Empregados WHERE SALARIO > 5000ORDER BY SALARIO-- Seleciona todos os Empregados que estão alocados nos-- departamento com código menor e igual a 3SELECT * FROM Empregados WHERE COD_DEPTO <= 3ORDER BY COD_DEPTO
-- Seleciona os empregados do código de departamento = 2SELECT * FROM Empregados WHERE COD_DEPTO = 2ORDER BY COD_DEPTO-- Seleciona os empregados do código de departamento -- diferente de 2SELECT * FROM Empregados WHERE COD_DEPTO <> 2ORDER BY COD_DEPTO
Consultando com Operadores Lógicos
AND - Operador que combina duas expressões e exige que sejam verdadeira, ou seja, TRUE
OR - Verifica se uma ou ambas expressões retornam TRUE
NOT - Avalia se no resultado, se a primeira expressão é TRUE e a segunda FALSE
-- Seleciona os empregados do código de -- departamento 2 e que ganham mais de 5000
SELECT * FROM EMPREGADOS WHERE COD_DEPTO = 2 AND SALARIO > 5000-- Seleciona os empregados do código de -- departamento 2 ou que ganham mais de 5000SELECT * FROM EMPREGADOSWHERE COD_DEPTO = 2 OR SALARIO > 5000
-- Execute a consulta abaixo e apresente o resultado
SELECT * FROM EmpregadosWHERE COD_DEPTO = 2 AND COD_DEPTO = 5
/* Na consulta abaixo nenhum valor retornará, pois é
impossível, no modelo atual, um empregado ser ter o código de departamento 2 e 5 ao mesmo tempo
*/SELECT * FROM EmpregadosWHERE COD_DEPTO = 2 AND COD_DEPTO = 5-- O correto neste caso é utilizar o operador ORSELECT * FROM EmpregadosWHERE COD_DEPTO = 2 OR COD_DEPTO = 5
-- Mais ExemplosSELECT * FROM EMPREGADOSWHERE SALARIO >= 3000 AND SALARIO <= 5000ORDER BY SALARIO--SELECT * FROM EMPREGADOSWHERE SALARIO < 3000 OR SALARIO > 5000ORDER BY SALARIO--SELECT * FROM EMPREGADOSWHERE NOT (SALARIO >= 3000 AND SALARIO <= 5000)ORDER BY SALARIO
Consultando um intervalo de valoresA cláusula BETWEEN filtra dados com base em uma faixa de
valores-- Pesquisar intervalo ENTRE dois valoresSELECT * FROM EMPREGADOSWHERE SALARIO >= 3000 AND SALARIO <= 5000ORDER BY SALARIO-- OUSELECT * FROM EMPREGADOSWHERE SALARIO BETWEEN 3000 AND 5000ORDER BY SALARIO
-- Seleciona os empregados com data de -- admissão de 01/01/2000 até 31/12/2000, -- ordenando pela Data de admissão
SELECT * FROM EmpregadosWHERE DATA_ADMISSAO BETWEEN '2000.1.1' AND '2000.12.31'ORDER BY DATA_ADMISSAO
-- Pesquisar valores FORA do intervaloSELECT * FROM EMPREGADOSWHERE SALARIO < 3000 OR SALARIO > 5000ORDER BY SALARIO-- OUSELECT * FROM EMPREGADOSWHERE SALARIO NOT BETWEEN 3000 AND 5000ORDER BY SALARIO
Laboratório 2 página 191
Consultando com base em strings de caractereOperador Like – Comparar cadeias de caracteres.
Utiliza o caracter % como curinga. -- Seleciona todos Empregados que possuam nomes que -- começando por MARIASELECT * FROM EMPREGADOSWHERE NOME LIKE 'MARIA%' -- Seleciona empregados que possuam nomes que -- começando por MASELECT * FROM EMPREGADOSWHERE NOME LIKE 'MA%’
-- Seleciona empregados que possuam nomes que começando por MSELECT * FROM EMPREGADOS WHERE NOME LIKE 'M%' -- Nomes terminando por MARIASELECT * FROM EMPREGADOS WHERE NOME LIKE '%MARIA’-- Nomes terminando por SOUZASELECT * FROM EMPREGADOS WHERE NOME LIKE '%SOUZA‘-- Nomes terminando por ZASELECT * FROM EMPREGADOS WHERE NOME LIKE '%ZA'-- Nomes contendo MARIA SELECT * FROM EMPREGADOS WHERE NOME LIKE '%MARIA%'-- Nomes contendo SOUZASELECT * FROM EMPREGADOS WHERE NOME LIKE '%SOUZA%'-- Nomes contendo ZASELECT * FROM EMPREGADOS WHERE NOME LIKE ‘%ZA%'
Outro caractere coringa é o ( _ ) que representaapenas um caractere-- Nomes que comecem por qualquer caractere e o segundo
seja a letra ASELECT * FROM Empregados WHERE NOME LIKE '_A%‘-- Nomes cuja penúltima letra seja ZSELECT * FROM Empregados WHERE NOME LIKE '%Z_'-- Nomes que terminem com LU seguido de 3 letras
quaisquerSELECT * FROM Empregados WHERE NOME LIKE '%LU___'
Fornecendo várias opções para um determinado caractere
-- Nomes contendo SOUZA ou SOUSASELECT * FROM EMPREGADOSWHERE NOME LIKE '%SOU[SZ]A%'
-- Nomes contendo José ou JoseSELECT * FROM EMPREGADOS WHERE NOME LIKE '%JOS[EÉ]
%'
Operador NOT LIKE
-- Nomes que não contenham a palavra MARIASELECT * FROM EMPREGADOSWHERE NOME NOT LIKE '%MARIA%'
-- Nomes que não contenham a sílaba MASELECT * FROM EMPREGADOSWHERE NOME NOT LIKE '%MA%'
Consultando valores pertencentes ou não a uma lista de elementos-- Operador IN com valores numéricosSELECT * FROM EMPREGADOS WHERE COD_DEPTO IN (1,3,4,7)ORDER BY COD_DEPTO-- Operador IN com caracteresSELECT NOME, ESTADO FROM CLIENTESWHERE ESTADO IN ('AM', 'PR', 'RJ', 'SP')-- Listar todos os estado que Não estão na listaSELECT NOME, ESTADO FROM CLIENTESWHERE ESTADO NOT IN ('AM', 'PR', 'RJ', 'SP')
Lidando com valores nulos
Causas do aparecimento de valores nulos- Criação de linhas sem configuração de valores- Criação de colunas com a palavra chave SPARSE no intuito
de conservar espaçoConsiderações- Nulo não é um valor zero- Retorna um valor desconhecido- Não é uma string vazia- Em cálculos, retorna um valor desconhecido
-- Seleciona os empregados com código de departamento-- igual a NuloSELECT * FROM EmpregadosWHERE COD_DEPTO IS NULL-- Seleciona os empregados com data de nascimento nula SELECT * FROM EmpregadosWHERE DATA_NASCIMENTO IS NULL-- Seleciona os empregados que possuem data de
nascimento SELECT * FROM EmpregadosWHERE DATA_NASCIMENTO IS NOT NULL
Substituindo valores nulos
Função ISNULLSELECT CODFUN, NOME, ISNULL(COD_DEPTO,-1) AS DEPTO,
ISNULL(SALARIO,-1) AS RENDAFROM Empregados--SELECT CODFUN, NOME,
ISNULL(DATA_NASCIMENTO,'1900.1.1') AS DATA_NASCFROM Empregados
FUNÇÂO COALESCE
SELECT CODCLI, NOME,COALESCE(EST_COB,ESTADO,'NC') AS
EST_COBRANCAFROM CLIENTES ORDER BY 3
Laboratório 3 páginas 192
Manipulando campos do tipo DATETIME
SET DATEFORMAT – Utilizado para determinar a ordem Dia, Mês e ano de um valor datetime
SET DATEFORMAT (ordem)
mdy dmy ymd ydmMyd dym
SET DATEFORMAT YMD
GETDATE() - retorna a data e hora atual do sistema
SELECT GETDATE() AS DATA_ATUAL;
-- Qual será a data que o SQL vai retornar ?SELECT GETDATE() + 45
-- A quantos dias cada funcionário foi admitido?SELECT CODFUN, NOME, CAST(GETDATE() - DATA_ADMISSAO AS INT) AS DIAS_NA_EMPRESAFROM EMPREGADOS
-- Extraindo partes da data-- DiaSELECT * FROM EMPREGADOSWHERE DAY(DATA_ADMISSAO) = 1-- MêsSELECT * FROM EMPREGADOSWHERE MONTH(DATA_ADMISSAO) = 12-- AnoSELECT * FROM EMPREGADOSWHERE YEAR(DATA_ADMISSAO) = 2000-- Ano e MêsSELECT * FROM EMPREGADOSWHERE YEAR(DATA_ADMISSAO) = 2000 AND MONTH(DATA_ADMISSAO) = 1
DATEPART – Retorna um inteiro da porção especificada no argumento
SELECT * FROM EMPREGADOSWHERE DATEPART(YEAR, DATA_ADMISSAO)
=2000 AND DATEPART(MONTH, DATA_ADMISSAO) = 12
* Argumentos na pág 107
DATENAME() – Retorna uma string caractere que representa uma porção da data e hora, conforme argumento.
SELECT CODFUN, NOME, DATA_ADMISSAO, DATENAME(WEEKDAY,DATA_ADMISSAO) AS DIA_SEMANA, DATENAME(MONTH,DATA_ADMISSAO) AS MESFROM EMPREGADOSWHERE DATEPART(WEEKDAY, DATA_ADMISSAO) = 6
DATEADD() – Adição com data e hora
-- Hoje mais 45 diasSELECT DATEADD( DAY, 45, GETDATE())-- Hoje mais 6 mesesSELECT DATEADD( MONTH, 6, GETDATE())-- Hoje mais 2 anosSELECT DATEADD( YEAR, 2, GETDATE())
DATEDIFF – Diferença entre datas-- Quantos dias eu viviSELECT DATEDIFF( DAY, '1959.11.12', GETDATE())-- Quantos meses eu viviSELECT DATEDIFF( MONTH, '1959.11.12', GETDATE())-- Quantos anos eu vivi SELECT DATEDIFF( YEAR, '1959.11.12', GETDATE())-- A diferença em anos ou meses não retorna um valor exato-- Retorna 1, mas a diferença somente seria 1 em 20/2SELECT DATEDIFF( MONTH, '2009.1.20', '2009.2.15')-- Retorna 1, mas a diferença somente seria 1 em 20/6/2009SELECT DATEDIFF( YEAR, '2008.6.20', '2009.2.15')
DATEFROMPARTS() – Retorna uma data a partir de valores inteiros
-- Retorna a data 25/12/2013SELECT DATEFROMPARTS (2013,12,25);
TIMEFROMPARTS() – Retorna um horário a partir de valores inteiro
-- Retorna o horário 10:25:15SELECT TIMEFROMPARTS (10,25,15,0,0);
DATETIMEFROMPARTS() – Retorna data e hora-- Retorna a data 15/09/2013 14:00:15.0000SELECT DATETIMEFROMPARTS
(2013,9,15,14,0,15,0);
DATETIME2FROMPARTS() – Retorna um valor do tipo datetime2 a partir dos parâmetros ano, mês, dia, hora, minuto, segundo, fração de segundo e a precisão da fração de segundo
SMALLDATETIMEFROMPARTS() – Retorna data e hora no tipo smalldatetime;
DATETIMEOFFSETFROMPARTS() – Retorna data e hora no tipo datetimeoffset.
EOMonth() Esta função retorna o último dia do mês a partir dos parâmetros
Sintaxe:EOMONTH (data_início [, adicionar_mês]);
SELECT EOMONTH (GETDATE());
Alterando a configuração de idioma a partir do SSMS, página 176
Teste seus conhecimentos página 182 à 187
Laboratório 4, página 193