Arquivo de tag MSSQL

porPaulo Henrique Corrêa Cardoso

JOIN’s SQL – Vamos aprender ?

Olá pessoal, vamos dar continuidade a nossa trilha do SQL. Dessa vez vamos aprender a relacionar tabelas no momento das consultas.

Para isso vamos utilizar a cláusula JOIN e suas cláusulas conjuntas.

Temos algumas variações da cláusula JOIN. Agora vamos entender cada uma delas.

INNER JOIN  ou JOIN

A cláusula INNER JOIN ou somente JOIN, é utilizada para cruzarmos registro trazendo apenas aqueles que existirem em ambas as tabelas.

SELECT Func.NomeFuncionario

      ,Carg.DescCargo

FROM FUNCIONARIO Func

INNER JOIN CARGO Carg  
  ON Carg.Cod = Func.CodCargo

Neste exemplo a consulta retornará todos os registros que contemplem ambos os lados da consulta, ou seja todos os funcionários que possuam cargos.

 

LEFT JOIN

A cláusula LEFT JOIN, é utilizada para cruzarmos registro trazendo todos os da tabela declarada a esquerda e aqueles que existirem em ambas as tabelas.

SELECT Func.NomeFuncionario
      ,Carg.DescCargo
FROM FUNCIONARIO Func
LEFT JOIN CARGO Carg  
  ON Carg.Cod = Func.CodCargo

Neste exemplo a consulta retornará todos os funcionários que tenham cargo e também os que não possuírem, neste caso as informações de cargo virão como NULL.

 

RIGHT JOIN

A cláusula RIGHT JOIN, é utilizada para cruzarmos registro trazendo todos os da tabela declarada a direita e aqueles que existirem em ambas as tabelas.

SELECT Func.NomeFuncionario

      ,Carg.DescCargo

FROM FUNCIONARIO Func

RIGHT JOIN CARGO Carg  

  ON Carg.Cod = Func.CodCargo

Neste exemplo a consulta retornará todos os cargos que tenham funcionários  e também os que não possuírem, neste caso as informações de funcionário virão como NULL.

 

FULL JOIN

A cláusula FULL JOIN, é utilizada para cruzarmos registro trazendo os registros de ambas as tabelas, possuindo cruzamento ou não.

SELECT Func.NomeFuncionario

      ,Carg.DescCargo

FROM FUNCIONARIO Func

FULL JOIN CARGO Carg  

  ON Carg.Cod = Func.CodCargo

Neste exemplo a consulta retornará todos os registros de ambas as tabelas, para as que não possuírem relacionamento, as informação não contempladas virão como NULL.

 

CROSS JOIN

A cláusula CROSS JOIN, realiza o cruzamento de todos os registro da primeira tabela com todos os registros da segunda tabela.

Está cláusula deve ser utilizado com cuidado, pois pode gerar lentidão no seu processamento dependendo do volume de registros.

SELECT Func.NomeFuncionario

      ,Carg.DescCargo

FROM FUNCIONARIO Func

CROSS JOIN CARGO Carg  

No caso a cima, a consulta retornara um cruzamento desconsiderando a chave, e vai cruzar todos os registros de funcionário com os registros de cargo.

Por exemplo

NomeFuncionario DescCargo
Paulo Analista
Paulo Gerente
Paulo Diretor
Maria Analista
Maria Gerente
Maria Diretor
Pedro Analista
Pedro Gerente
Pedro Diretor

 

Pontos muito importantes !!!

  • É sempre muito importante, para termos uma query que desempenhe bem, montarmos a cláusula ON seguindo um índice existente na tabela que será consultada.
  • Também é muito importante deixar as condições relativas a uma tabela sempre dentro do ON da mesma tabela e não no WHERE. No WHERE deixamos as condições da tabela principal.
  • Definirmos os campos que queremos que a consulta retorne, nunca deixar * no SELECT, isso impacta muito na performance do retorno.
  • Utilizar FULL JOIN e CROSS JOIN com prudência, pois os mesmos impactam na performance das consultas.

 

 

Espero que ajude muito a todos.

Até a próxima!!!

porPaulo Henrique Corrêa Cardoso

Consultas SQL – Vamos aprender!!!

Fala pessoal, tudo bem ?

Dando continuidade nos nossos artigos referente ao conhecimento do SQL, vamos ver hoje um pouco de uma parte da linguagem SQL chamada de DQL (Data Query Language ou Linguagem de Consulta de Dados).

Essa parte da linguagem trata especificamente de comandos utilizados para realizar consultas no banco de dados.

Estrutura Básica.

A estrutura básica deste comando é a seguinte:

SELECT [campo1],[campo2],[campo3] FROM [Tabela] WHERE [condicao1] = [valorCondicao]

Olhando bem essa estrutura, vemos que a mesma é composta pela clausula SELECT, que é utilizada para definirmos os campos que queremos retornar em nossa consulta ao lado, lembrando que caso necessitemos trazer todos os campos, podemos utilizar o operador coringa *, porém o mesmos deve ser utilizado com cautela, pois em uma consulta com muitos registros e colunas, pode acabar gerando lentidões desnecessárias.

Na sequência utilizamos a clausula FROM, que definirá a tabela que gostaríamos de buscar os registros.

Depois temos a clausula opcional (mas que podemos quase sempre considerar indispensável), WHERE, a mesma é utilizada para definir os parâmetros de busca de nossa consulta.

Temos mais algumas clausulas que podemos utilizar e veremos mais a frente.

Agora veja um exemplo da utilização deste estrutura.

SELECT IdProduto, DescProduto, Preco 
FROM Produto 
WHERE IdProduto = 1

Neste exemplo, buscamos 3 colunas da nossa tabela Produto onde o IdProduto = 1

Na clausula WHERE temos alguns operadores lógicos e relacionais que podemos utilizar:

Operadores SQL
Operador Descrição Exemplo
= Igual IdProduto = 1
<> ou != Diferente IdProduto <> 1
> Maior que Preco > 1000
>= Maior ou igual que Preco >= 1000
< Menor que Preco < 1000
<= Menor ou igual que Preco <= 1000
IN Está contido IdProduto IN (1,2,3)
NOT IN Não está contido IdProduto NOT IN (2,3)
BETWEEN Intervalo entre IdProduto BETWEEN 1 AND 2
LIKE Parte do registro DescProduto LIKE ‘TV%’
AND Ambas condições verdareiras IdProduto BETWEEN 1 AND 2 AND Preco > 1000
OR Uma condição verdadeira IdProduto BETWEEN 1 AND 2 OR Preco > 1000

Agrupando registros e suas funções.

Também temos alguma funções de agregação que podemos utilizar. Estas função dependem da utilização da clausula GROUP BY que deve ser utilizada após a clausula WHERE.

MAX

Função responsável por retornar o maior valor dentro da busca e do agrupamento solicitado na consulta.

SELECT MAX(Preco) MaiorPreco, IdCategoria
FROM Produto 
WHERE Ativo = 1
GROUP BY IdCategoria

No exemplo acima estamos buscando o maior preço de produto, agrupado pela categoria.

Veja que definimos a clausula GROUP BY com o campo IdCategoria.


MIN

Função responsável por retornar o menor valor dentro da busca e do agrupamento solicitado na consulta.

SELECT MIN(Preco) MenorPreco, IdCategoria
FROM Produto 
WHERE Ativo = 1
GROUP BY IdCategoria

No exemplo acima estamos buscando o menor preço de produto, agrupado pela categoria.


AVG

Função responsável por retornar a média de um valor dentro da busca e do agrupamento solicitado na consulta.

SELECT AVG(Preco) MenorPreco, IdCategoria
FROM Produto 
WHERE Ativo = 1
GROUP BY IdCategoria

No exemplo acima estamos buscando a média do preço de produto, agrupado pela categoria.


SUM

Função responsável por somar valores dentro da busca e do agrupamento solicitado na consulta.

SELECT SUM(Preco) SomaPreco, IdCategoria
FROM Produto 
WHERE Ativo = 1
GROUP BY IdCategoria

No exemplo acima estamos buscando a soma do preço dos produtos, agrupado pela categoria.


COUNT

Função responsável por contar as linhas dentro da consulta.

Esta função possui a seguinte estrutura:
COUNT ( { [ [ ALL | DISTINCT ] coluna1 ] | * } )

Desta forma conseguimos contar uma determinada coluna, e os valores nulos serão desconsiderados na contagem, ou podemos contar uma coluna utilizando a clausula DISTINCT e retornar somente a quantidade de valores diferentes ou então contar todas as linhas da consulta utilizando o operador *.

Veja os exemplos.

SELECT IdCategoria, COUNT(IdCategoria)QtdCateg 
FROM Produto 
WHERE Ativo = 1
GROUP BY IdCategoria


SELECT IdCategoria, COUNT(DISTINCT IdCategoria)QtdCateg 
FROM Produto 
WHERE Ativo = 1
GROUP BY IdCategoria

SELECT  COUNT(*)QtdProdutos 
FROM Produto 
WHERE Ativo = 1

No primeiro exemplo, utilizamos o COUNT com o campo e também utilizamos o GROUP BY para retornar a quantidade de itens dentro de uma categoria.

No segundo exemplo fizemos o mesmo SELECT, porem utilizando o DISTINCT dentro do COUNT, veja que ele trouxe tudo com o valor 1 pois desconsiderou as duplicidades no campo informado. Imagine que neste exemplo você pode desconsiderar, produtos cadastrado com o mesmo código de barras ou desconsiderar qualquer tipo de duplicidade.

No terceiro exemplo contamos todas as linhas da tabela Produto.

Agora que já aprendemos a usar as funções de agregação vamos aprender a filtrar nossa consulta a partir da agregação realiza.

Para isso vamos utilizas a clausula HAVING. Esta clausula tem a mesma função do WHERE, porém ela é especifica para as funções de agregação, isso é necessário porque a clausula WHERE não comporta esse tipo de função.

Vamos aos exemplos.

SELECT SUM(Preco) SomaPreco, IdCategoria
FROM Produto 
WHERE Ativo = 1
GROUP BY IdCategoria
HAVING SUM(Preco) > 1000


SELECT SUM(Preco) SomaPreco, IdCategoria
WHERE Ativo = 1
GROUP BY IdCategoria
HAVING SUM(Preco) < 1000

Nestes exemplos utilizamos a clausula HAVING para filtrar a soma de preço das categorias.

No primeiro caso, buscamos as categorias que possuem a soma do preço maior que 1000.

No segundo caso, buscamos as categorias que possuem a soma do preço menor que 1000.

Ordenando registro.

Por último em nossa apresentação da parte básica do DQL, temos a clausula ORDER BY que é responsável pela ordenação dos registros.

Esta clausula deve ser utilizada ao final da consulta e deve seguir a estrutura abaixo.

ORDER BY [coluna1][ASC|DESC], [coluna2][ASC|DESC]

Neste caso, ASC ou DESC são utilizados para definirmos se a ordenação da coluna será crescente ou decrescente, lembrando que não é necessário utilizar o ASC, pois o mesmo é o default para a ordenação.

Vamos ao exemplo.

SELECT IdProduto, DescProduto, Preco 
FROM Produto 
WHERE Ativo = 1
ORDER BY Preco DESC, DescProduto


SELECT IdProduto, DescProduto, Preco 
FROM Produto 
WHERE Ativo = 1
ORDER BY Preco

No primeiro exemplo definimos que o resultado venha ordenado de forma decrescente pelo preço, e caso tenha produtos com preços iguais os mesmo sejam ordenados de forma crescente pela descrição.

No segundo exemplo o resultado foi ordenado de forma crescente pelo preço.

Bom pessoal, está é a parte básica da estrutura do SELECT e da parte da DQL da Linguagem SQL.

No próximo artigo vamos avançar um pouco mais.

Espero que ajude muito a todos.

Até a próxima!!!

porPaulo Henrique Corrêa Cardoso

Criando tabelas – Microsoft SQL Server

Fala pessoal, tudo bem ?

Hoje eu vou passar um conteúdo para quem esta começando a aprender a linguagem SQL. Vamos aprender a criar tabelas, colunas e chaves, utilizando o banco de dados Microsoft SQL Server.

Vamos aprender comandos de uma parte da linguagem SQL chamada de DDL (Data Definition Language), ou seja, linguagem de definição de dados.

Mas antes de começarmos a criação da nossa tabela, vamos primeiro aprender um pouco sobre a tipagem de dados utilizados na maioria dos bancos.

Os bancos tem alguns tipos de dados específicos, por isso vou citar os principais e deixar um link com todos os tipos disponíveis para o Microsoft SQL Server.

Tipagem de Dados

int – O tipo de dados int é o tipo de dados inteiros, seu intervalo de dados vai de -2.147.483.648 até 2.147.483.647 e ocupa 4 bytes de armazenamento.

decimal – O tipo decimal guarda dados que possuem casas decimais de precisão, ou seja definimos o tamanho exato de quantidade de casas que o numero poderá ter entre números inteiros e casas decimais. Por exemplo, o número 123,45 tem uma precisão de 5 e uma escala de 2, sua definição fica da seguinte forma decimal(5,2).

A precisão máxima padrão do tipo decimal é 38 e o mesmo tem uma ocupação de armazenamento representado pela tabela abaixo:

Precisão Bytes de armazenamento
1 – 9 5
10–19 9
20–28 13
29-38 17

float – O tipo float é um tipo dados numéricos aproximados para uso com dados numéricos de ponto flutuante. Como são aproximados nem todos os valores no intervalo de tipo de dados podem ser representados de maneira exata.

Sua definição fica da seguinte forma : float(n) em que n é o número de bits usado para armazenar a mantissa do número float na notação científica e, portanto, exige a precisão e o tamanho do armazenamento. Se n for especificado, ele precisará ser um valor entre 1 e 53. O valor padrão de n é 53.

O armazenamento é representado pela tabela abaixo:

Valor de n Precisão Bytes de armazenamento
1-24 7 dígitos 4 bytes
25-53 15 dígitos 8 bytes

datetime – Define uma data combinada com uma hora do dia que inclui frações de segundos e se baseia em um período de 24 horas. Exemplo: 2020-07-21 20:32:00.520

Intervalo de datas Janeiro 1, 1753, a dezembro 31, 9999
Intervalo de horas 00:00:00 a 23:59:59.997

Seu tamanho é de 8 bytes.

char – Tipo de dados de caractere de tamanho fixo, ou seja, o valor que será armazenado possuirá o tamanho definido na declaração deste tipo.

Exemplo, ao definir uma coluna da tabela como char(10) e realizar o input da informação ‘ABC’, a mesma será gravada como ‘ABC ‘.

varchar – Tipo de dados de caractere de tamanho variável,ou seja, o valor que será armazenado possuirá o tamanho variável no memento da gravação, sempre respeitando o tamanho limite definido na declaração do tipo.

Exemplo, ao definir uma coluna da tabela como varchar(10) e realizar o input da informação ‘ABC’, a mesma será gravada como ‘ABC’.

bit – É um tipo dado inteiro que pode aceitar um valor 1, 0 ou NULL. Os valores de cadeia de caracteres TRUE e FALSE podem ser convertidos em valores bit: TRUE é convertido em 1 e FALSE é convertido em 0.

Para mais tipos de dados aceitos pelo Microsoft SQL Server, consulte Aqui

Bom, agora que falamos sobre os tipos de dados mais comuns, podemos a começar entrar na definição de comandos para criar uma tabela dentro do banco de dados.

Criando uma tabela.

Primeiramente vamos utilizar o comando CREATE TABLE para criar a tabela, definindo as colunas da mesma.

Veja o exemplo:

CREATE TABLE Produto (
  IdProduto   INT           IDENTITY(1,1) NOT NULL,
  DescProduto VARCHAR(60)                 NOT NULL,
  Preco       DECIMAL(14,2)               NOT NULL,
  Peso        FLOAT                       NOT NULL,
  Ativo       BIT                         NOT NULL,
  IdCategoria INT                         NOT NULL,
  DataCriacao DATETIME                    NOT NULL
)

Veja que ao definir as colunas, foram utilizados exemplos de alguns tipos explicados anteriormente.

A primeira coluna definida, possui duas informações diferentes das demais. A propriedade IDENTITY(1,1) define que a coluna será auto-incrementada, iniciando no valor 1 e acrecendo 1 a cada novo registro.

Lembrando que a propriedade IDENTITY é opcional.

Temos também a propriedade NOT NULL, que define que a coluna não aceitará valores nulos, podemos também utilizar a propriedade NULL para permitindo o caso contrario.

Ao executar esses comandos no Microsoft SQL Server teremos nossa primeira tabela criada.

Alterando uma tabela

Mas e se eu precisar adicionar ou alterar uma coluno dentro de uma tabela existente, como posso fazer?

Para isso entramos nos comandos de alteração de tabela, o ALTER TABLE.

O comando ALTER TABLE tem diversas propriedades, vamos abordar algumas principais que você vai utilizar no dia a dia.

A Primeira é o comanda para adicionar uma nova coluna na tabela. Para isso utilizaremos o comando ADD.

Veja o exemplo:

ALTER TABLE Produto
ADD CodBarras CHAR(13)    NULL,
    Cor       VARCHAR(10) NULL

Neste exemplo adicionamos duas novas colunas em nossa tabela, utilizando os comandos ALTER TABLE + o comando ADD.

Se precisarmos modificar uma coluna existente, utilizaremos o comando ALTER COLUMN, da seguinte forma:

ALTER TABLE Produto
ALTER COLUMN Cor VARCHAR(20) NOT NULL

Veja que neste exemplo alteramos o tamanho e a propriedade NOT NULL da coluna Cor, utilizando os comandos ALTER TABLE + ALTER COLUMN.

Caso precisemos excluir uma coluna, vamos utilizar o comando DROP COLUMN, da seguinte forma:

ALTER TABLE Produto
DROP COLUMN Cor

Veja que a coluna foi excluída com esse comando.

Chaves da tabela.

Agora que aprendemos os comandos básicos para criação de uma tabela, vamos entender um pouco sobre chaves da tabela.

Existem dois tipos de chaves que utilizamos em uma tabela. A Primary Key (chave primaria) e as Foreign Key’s (chaves estrangeiras).

Uma tabela pode ter apenas uma Primary Key, e seu valor não poderá se repetir entre os registros.

A criação dessa chave pode ser feita no momento da criação to campo na tabela, ou posteriormente com um comando especifico.

Veja o comando para adicionar a Primary Key posteriormente a criação da tabela:

ALTER TABLE Produto
ADD CONSTRAINT PK_Produto_IdProduto PRIMARY KEY CLUSTERED (IdProduto)

Onde “PK_Produto_IdProduto” é o nome que definimos pra nossa Primary Key e IdProduto é o campo que fará parte da chave.

Já as Foreign Key’s são chaves de relacionamento com outras tabelas, e servem para garantir a integridade de registros entre as mesmas.

Para esse exemplo vou criar uma tabela de Categoria para a classificação dos Produtos.

CREATE TABLE Categoria(
  IdCategoria  INT          IDENTITY(1,1) NOT NULL,
  Descricao    VARCHAR(100)               NOT NULL, 
  CONSTRAINT PK_Categoria_IdCategoria    PRIMARY KEY CLUSTERED (IdCategoria)
)

Veja que nesse exemplo eu criei a Primary Key no momento da criação da tabela.

Agora vamos criar uma Foreign Key na tabela de Produtos, relacionando o campo IdCatetoria da tabela Produto com o da tabela Categoria.

ALTER TABLE Produto
ADD CONSTRAINT FK_ProdutoCategoria
FOREIGN KEY (IdCategoria) REFERENCES Categoria(IdCategoria)

Onde “FK_ProdutoCategoria” é o nome da Foreign Key , “(IdCatetoria)” é o campo chave de relacionamento da tabela Produto e “Categoria(IdCategoria)” é a referencia com a tabela de Categoria e com o campo Primary Key da mesma.

Dessa forma quando tentar inserir um registro na tabela de Produtos com uma categoria que não exista o banco de dados não permitira a inclusão do registro, da mesma forma que não será permitido excluir uma categoria que esteja vinculada com algum produto.

Excluindo uma tabela.

Para deletar uma tabela, temos o comando DROP TABLE, que deve ser utilizado da seguinte forma:

DROP TABLE Categoria

Bom pessoal, esse foi o conteúdo do Post de hoje.

Espero que ajude muito vocês!!!

Qualquer dúvida, deixe nos comentários.

Até a próxima!!!