SQL - Consultas T-SQL Básicas - Between e IN - II

Neste artigo estou continuando o assunto já abordado em - SQL - Operações básicas (T-SQL) - e, se você esta chegando agora sugiro que leia o artigo antes de continuar.

Para os exemplos mostrados neste artigo eu estou usando o SQL Server 2012 Express Edition e o SQL Server Management Studio Express Edition.

Todas as instruções SQL serão executadas no SQL Server Management Studio. (SSMS)

Abaixo vemos a janela do SSMS onde selecionamos o banco de dados Macoratti e abrimos uma nova janela para consulta clicando em New Query.  Eu estou usando o SQL Server Express LocalDB.

SQL Server Express LocalDB é uma versão leve do SQL Server que tem muitas características de programação de um banco de dados SQL Server. O SQL Server Express LocalDB é executado no modo de usuário e tem uma instalação rápida sem a necessidade de configuração.

No Microsoft SQL Server, o banco de dados ou qualquer código Transact-SQL podem ser movidos de SQL Server Express LocalDB para o SQL Server e SQL Azure, sem quaisquer passos de atualização.

Então, o SQL Server Express LocalDB pode ser usado como um ambiente de desenvolvimento para aplicações que utilizem todas as edições do SQL Server.

O SQL Server Express LocalDB permite recursos como procedimentos armazenados, funções definidas pelo usuário e agregados, Integração com NET Framework, tipos espaciais e outros recurso que não estão disponíveis no SQL Server Compact.

A seguir basta digitar a instrução SQL na janela criada e clicar em Execute para obter o resultado:

Vamos agora continuar com algumas instruções SQL básicas usando as cláusulas BETWEEN e IN mas que podem ser muito úteis no dia a dia do desenvolvedor que usa o SQL Server como banco de dados relacional.

Eu vou usar uma tabela chamada Funcionarios criada no SQL Server com seguinte estrutura e dados:

Banco de dados Macoratti - Tabela Funcionarios

USE [master]

GO
CREATE
DATABASE [Macoratti]
CONTAINMENT
= NONE

ON PRIMARY

( NAME = N'Macoratti', FILENAME = N'C:\Users\Mac\Macoratti.mdf' , SIZE = 3136KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )

LOG ON

( NAME = N'Macoratti_log', FILENAME = N'C:\Users\Mac\Macoratti_log.ldf' , SIZE = 784KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)

GO

Script SQL para criar o banco de dados Macoratti

USE [Macoratti]
GO
CREATE TABLE [dbo].[Funcionarios](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[nome] [nvarchar](50) NULL,
	[endereco] [nvarchar](80) NULL,
	[estado] [nchar](2) NULL,
	[nascimento] [datetime] NULL,
	[sexo] [nchar](1) NULL,
	[setor] [nchar](10) NULL,
	[salario] [money] NULL,
	[cargo] [nvarchar](50) NULL,
	[admissao] [date] NULL,
 CONSTRAINT [PK_Funcionarios] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

Script SQL para criar a tabela Funcionarios

1 - Encontrando valores em um intervalo - BETWEEN

Uma maneira de encontrar valores em um intervalo é usar a cláusula BETWEEN que quando avaliada para um linha, se o valor aparecer dentro do intervalo a mesma será incluída no resultado.

A sintaxe usada é a seguinte:

SELECT "nome_coluna"
FROM "nome_tabela"
WHERE "nome_coluna" BETWEEN ''valor1' AND ''valor2';

Esta cláusula pode ser usada quando desejamos extrair informações em um intervalo de datas.

Quando for trabalhar com datas você deve tomar muito cuidado pois quando usamos datas pois no SQL Server podemos definir uma data como do tipo date e também datetime.

O tipo date não inclui o elemento time já o tipo datetime inclui o elemento time. Assim um campo tipo date é expresso no formato : dd/mm/yyyy enquanto o tipo datetime usa o formato dd/mm/yyyy hh:mm:ss

Nota: No SQL Server as datas são exibidas no formato yyyy/mm/dd

Quando a data não especificar o elemento time, ou seja a hora, ela é assumida como sendo igual 12:00:00.

Vejamos um exemplo usando a consulta para obter valores entre as datas '1990/12/31' e '1994/04/13':(poderíamos ter usado o formato '19901231' AND '19940413' para as datas:

Veja que a somente a linha referente ao campo nascimento com valor igual a 1994-04-13 00:00:00.000 foi retornada pois na cláusula Between utilizamos o formado aaaa/mm/dd :

 

Para obter todos os valores para data 13-04-1994 temos que especificar o elemento time. Vejamos duas possibilidades uma com retorno parcial e outra que inclui todos as linhas para o intervalo:

 

Também  podemos usar o operador NOT com a cláusula BETWEEN.

No exemplo a seguir serão exibidas TODAS as linhas que NÃO se encontram no intervalo informado:

Para especificar um intervalo exclusivo, use os operadores maior que (>) e menor do que (<).

Vejamos uma comparação de utilização da cláusula BETWEEN e dos operadores > e <:

1- Usando BETWEEN

USE Macoratti;

GO

SELECT Nome, Salario, Cargo, Setor

FROM Funcionarios

WHERE

salario between 2500 AND 3000

order by salario

GO

 

2- Usando os operadores > e <

USE Macoratti;

GO

SELECT Nome, Salario, Cargo, Setor

FROM Funcionarios

WHERE

salario > 2500 AND salario < 3000

order by salario

GO

 

Note que os operadores maior que (>) e menor que (<) retornam um número menor de linhas pois não incluem os valores dos intervalos.

Para concluir vejamos um exemplo com BETWEEN usando valores textos na lista de consulta:

A consulta a cima retorna todas as linhas com o campo nome começando com qualquer letra entre A e M.

2 - Comparando valores em uma lista - IN

Para obter valores existentes coincidentes com os valores de uma lista ou relação podemos usar a cláusula IN e uma lista de valores separados por vírgulas entre aspas simples.

A cláusula IN determina se um valor especificado corresponde a qualquer valor em uma subconsulta ou uma lista.

Sintaxe:

expressão_teste [ NOT ] IN ( subconsulta | expressão [ ,...n ] ) 
Argumentos
expressão_teste
É qualquer expressão válida.
subconsulta
É uma subconsulta que tem um conjunto de resultado de uma coluna. Esta coluna deve ser do mesmo tipo de dados da expressão_teste.
expressão[ ,... n ]
Uma lista de expressões para testar a coincidência. Todas as expressões precisam ser to mesmo tipo da expressão_teste.

Retorno
     Boolean

Se o valor da expressão_teste for igual a qualquer valor retornado pela subconsulta ou for igual a qualquer expressão da lista, separada por vírgulas, o valor do resultado é TRUE; caso contrário, o valor do resultado é FALSE.

Exemplo usando a cláusula IN e NOT IN:

Vejamos agora um exemplo de utilização da cláusula IN em uma subconsulta:

Atenção !!

Quaisquer valores nulos retornados pela subconsulta ou expressão que são comparados com expressão_teste usando IN ou NOT IN retornam UNKNOW(DESCONHECIDO).

Assim usar valores nulos em conjunto com IN ou NOT IN pode produzir resultados inesperados.

Tito 1:15 Tudo é puro para os que são puros, mas para os corrompidos e incrédulos nada é puro; antes tanto a sua mente como a sua consciência estão contaminadas.


Veja os Destaques e novidades do SUPER DVD VB (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Veja mais sistemas completos para a plataforma .NET no Super DVD .NET , confira...

Quer aprender C# ??

Chegou o Super DVD C# com exclusivo material de suporte e vídeo aulas com curso básico sobre C#
 

   Gostou ?   Compartilhe no Facebook    Compartilhe no Twitter

Referências:


José Carlos Macoratti