SlideShare a Scribd company logo
1 of 26
Download to read offline
Globalcode – Open4education
Fernando Franquini - Capin
Profissional da área de TIC a mais de 18 anos, atuando a mais de 10 anos
como DBA em projetos de desenvolvimento de Software principalmente
com JAVA.
Boas Práticas de SQL em Banco
Relacional para Devs
Globalcode – Open4education
Agenda
Apresentação
Projeção
Chaves
Joins
Views e Triggers
Bind Variables
ANSI
Exemplo Real
Globalcode – Open4education
Apresentação
Quem sou?
Quem vocês são?
Já criou e executou instrução SQL direto no BD
Já analisou instrução SQL enviada ao BD
Nunca viu SQL!
Agora: Que diabos faz um DBA em uma trilha de
JAVA?
Globalcode – Open4education
Projeção
Todos sabem o que é a Projeção do SQL?
Conteúdo da Projeção
Sub Select na Projeção
Função na Projeção
Globalcode – Open4education
Projeção
/* select
t
from
Team t */
select
team0_.id as id1_11_,
team0_.arena as arena2_11_,
team0_.city as city3_11_,
team0_.creationYear as creation4_11_,
team0_.division_id as division8_11_,
team0_.logo as logo5_11_,
team0_.name as name6_11_,
team0_.version as version7_11_
from
teams team0_
Globalcode – Open4education
Chaves
Chave candidatas
Ex.: CPF e CNPJ
Chaves compostas
Alguns impactos nos frameworks:
Se forem EAGER é um CAOS (balde de Siri)
Em alguns casos mesmo sendo LAZY podem gerar problemas
Índices do tipo Texto
Globalcode – Open4education
Chaves
/* select g
from Game g
where g.dateLegacy = '2016-04-13' */
select
game0_.id as id1_5_,
game0_.arena_name as arena_na9_5_,
game0_.arena_location as arena_l10_5_,
game0_.awayPoints as awayPoin2_5_, game0_.awayTeam_id as
awayTea11_5_, game0_.date as date3_5_, game0_.dateLegacy as
dateLega4_5_, game0_.homePoints as homePoin5_5_,
game0_.homeTeam_id as homeTea12_5_, game0_.time as time6_5_,
game0_.timeLegacy as timeLega7_5_, game0_.version as version8_5_
from games game0_
where game0_.dateLegacy='2016-04-13'
Globalcode – Open4education
Chaves e Joins
Chaves Primárias
Texto
Decimal
Junções (Chaves estrangeiras)
Indexação da junção
Globalcode – Open4education
Chaves e Joins
Recente:
@Entity
@Table(name = "teams", indexes={
@Index(name="TEAM_CITY_NAME_INDEX", unique=true,
columnList="CITY,NAME"),
@Index(name="TEAM_ID_NAME_INDEX", unique=true,
columnList="ID,NAME"),
@Index(name="TEAM_DIVISION_NAME_INDEX", unique=true,
columnList="DIVISION_ID,NAME")
})
public class Team implements Serializable {...
Globalcode – Open4education
Chaves e Joins
Hibernate:
alter table teams add constraint
TEAM_CITY_NAME_INDEX unique (city, name)
Hibernate:
alter table teams add constraint
TEAM_ID_NAME_INDEX unique (arena)
Hibernate:
alter table teams add constraint
TEAM_DIVISION_NAME_INDEX unique (division_id,
name)
Globalcode – Open4education
Views e Triggers
Views
Para que servem?
Quando viram um problema?
Triggers
Como nascem?
Como lembramos?
Globalcode – Open4education
Bind Variables
Mesma instrução executada N vezes
Problema:
SQL dinâmicos (montados em código)
Ex.:
‘Select * from Pais where Nome = ‘ + ‘Brasil’
Ex.:
‘Select * from Pais where Nome = ‘ :1
Using : ‘Brasil’
Segurança contra SQL INJECTION
Globalcode – Open4education
Bind Variables
/* select g
from Game g
where g.date = :date
order by g.time */
SELECT Game0_.Id AS Id1_5_, Game0_.Arena_Name AS Arena_Na9_5_,
Game0_.Arena_Location AS Arena_L10_5_, Game0_.Awaypoints AS
Awaypoin2_5_,
Game0_.Awayteam_Id AS Awaytea11_5_, Game0_.Date AS Date3_5_,
Game0_.Datelegacy AS Datelega4_5_, Game0_.Homepoints AS
Homepoin5_5_,
Game0_.Hometeam_Id AS Hometea12_5_, Game0_.Time AS Time6_5_,
Game0_.Timelegacy AS Timelega7_5_, Game0_.Version AS
Version8_5_
FROM Games Game0_
WHERE Game0_.Date = ?
ORDER BY Game0_.Time
Globalcode – Open4education
ANSI
Funções que são múltiplos Banco de Dados:
CASE
COALESCE
CAST para conversões de tipos de dados
Melhor portabilidade de Banco de Dados
Usem Dialeto do JAVA
Globalcode – Open4education
ANSI
/* select
distinct e.playerContract,
coalesce(
( select sum(ev.value)
from GameEvent ev
where ev.playerContract = e.playerContract
and ev.eventType =
org.nba.model.GameEventType.POINTS_MADE),
0)
from
GameEvent e */
Continuação…
Globalcode – Open4education
ANSI
SELECT DISTINCT Gameevent0_.Playercontract_Id AS Col_0_0_,
Coalesce((SELECT SUM(Gameevent2_.Value)
FROM Game_Events Gameevent2_, Player_Contracts Playercont3_
WHERE Gameevent2_.Playercontract_Id = Playercont3_.Id
AND Gameevent2_.Playercontract_Id =
Gameevent0_.Playercontract_Id
AND Gameevent2_.Eventtype = 5), 0) AS Col_1_0_,
Playercont1_.Id AS Id1_6_, Playercont1_.Finishdate AS
Finishda2_6_, Playercont1_.Player_Id AS Player_I5_6_,
Playercont1_.Startdate AS Startdat3_6_, Playercont1_.Team_Id AS
Team_Id6_6_, Playercont1_.Version AS Version4_6_
FROM Game_Events Gameevent0_
INNER JOIN Player_Contracts Playercont1_
ON Gameevent0_.Playercontract_Id = Playercont1_.Id
Globalcode – Open4education
Função ‘ANSI’ #SQN
/* select FUNCTION('DATE_FORMAT', b.date, '%d/%m/%Y'),
b.awayTeamName,
b.awayPoints,
b.homePoints,
b.homeTeamName
from
BoxScore b */
SELECT Date_Format(Boxscore0_.Date, '%d/%m/%Y') as Col_0_0_,
Boxscore0_.Awayteamname AS Col_1_0_,
Boxscore0_.Awaypoints AS Col_2_0_,
Boxscore0_.Homepoints AS Col_3_0_,
Boxscore0_.Hometeamname AS Col_4_0_
FROM Boxscoreview Boxscore0_
Globalcode – Open4education
Exemplo Real
Tabela1: idGlobalTabela1, idTabela1, ...
TabelaDeLigacao: idGlobalTabela1, idTabela1, idGlobalTabela2,
idTabela2
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumns({
@JoinColumn(name="idGlobalTabela2", insertable=false,
updatable=false),
@JoinColumn(name="idTabela2", insertable=false,
updatable=false) })
Tabela2 tabela2;
Continuação...
Globalcode – Open4education
Exemplo Real
...
Tabela2: idGlobalTabela2, idTabela2, nmTabela2
@OneToMany(fetch=FetchType.LAZY, mappedBy="tabela2")
collection<TabelaDeLigacao> registros;
....
-- Retornar todos os registros da "Tabela2" inseridos na "TabelaDeLigacao"
-- Entrada: idGlobalTabela1 e idTabela1
-- Selecionar em Tabela2
-- Fazer join em TabelaDeLigacao
-- Adicionar as condições idGlobalTabela1=x e idTabela1=y
Continuação...
Globalcode – Open4education
Exemplo Real
CriteriaBuilder criteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaQuery<Tabela2> criteriaQuery =
criteriaBuilder.createQuery(Tabela2.class);
Root<Tabela2> root = criteriaQuery.from(Tabela2.class);
Join<Tabela2, TabelaDeLigacao> join = root.join(Tabela2_.registros);
List<Predicate> predicates = new ArrayList<>();
predicates.add(criteriaBuilder.equal(join.get(TabelaDeLigacao_.tabel
aDeLigacaoPK).get(TabelaDeLigacaoPK_.idGlobalTabela1),
valorIdGlocalTabela ));
Continuação...
Globalcode – Open4education
Exemplo Real
predicates.add(criteriaBuilder.equal(join.get(TabelaDeLigacao_.t
abelaDeLigacaoPK).get(TabelaDeLigacaoPK_.idTabela1),
valorIdTabela2));
criteriaQuery.select(root);
criteriaQuery.where(criteriaBuilder.and(predicates.toArray(new
Predicate[]{})));
criteriaQuery.orderBy(criteriaBuilder.asc(join.get(TabelaDeLigac
ao_.tabela2).get(Tabela2_.nmTabela2)));
TypedQuery<Tabela2> typedQuery =
entityManager.createQuery(criteriaQuery);
List<Tabela2> resultado = typedQuery.getResultList();
Continuação...
Globalcode – Open4education
Exemplo Real
SELECT Tabela2.Idglobaltabela2, Tabela2.Idtabela2, Tabela2. Nmtabela2
FROM Exxx_Tabela2 Tabela2 INNER JOIN Exxx_Tabela_De_Ligacao
Tabeladeligacao
ON Tabela2.Id_Tabela2 = Tabeladeligacao.Id_Tabela2
AND Tabela2.Id_Global_Tabela2 = Tabeladeligacao.Id_Global_Tabela2
CROSS JOIN Exxx_Tabela2 Tabela2_2
WHERE Tabeladeligacao.Id_Tabela2 = Tabela2_2.Id_Tabela2
AND Tabeladeligacao.Id_Global_Tabela2 = Tabela2_2.Id_Global_Tabela2
AND Tabeladeligacao.Id_Global_Tabela1 = Valoridglocaltabela
AND Tabeladeligacao.Id_Tabela1 = Valoridtabela2
ORDER BY Tabela2_2.nmTabela2 ASC;
Continuação...
Globalcode – Open4education
Exemplo Real
Erro:
criteriaQuery.orderBy(criteriaBuilder.asc(join.get(TabelaDeLigac
ao_.tabela2).get(Tabela2_.nmTabela2)));
Correção:
criteriaQuery.orderBy(criteriaBuilder.asc(root.get(Tabela2_.nmTa
bela2)));
Continuação ...
Globalcode – Open4education
Exemplo Real
SELECT Tabela2.Idglobaltabela2, Tabela2.Idtabela2,
Tabela2.Nmtabela2
FROM Exxx_Tabela2 Tabela2
INNER JOIN Exxx_Tabela_De_Ligacao Tabeladeligacao
ON Tabela2.Id_Tabela2 = Tabeladeligacao.Id_Tabela2
AND Tabela2.Id_Global_Tabela2 =
Tabeladeligacao.Id_Global_Tabela2
WHERE Tabeladeligacao.Cd_Sistema_Entidade = Valoridglocaltabela
AND Tabeladeligacao.Cd_Entidade = Valoridtabela2
ORDER BY Tabela2.Nmtabela2 ASC;
Globalcode – Open4education
Encerramento
Twitter: @capin79
LinkedIn: https://br.linkedin.com/in/capin
fernando.franquini@gmail.com
Scripts para base de testes está no Github:
https://github.com/vinnyvoffice/tdcfloripa2016
Globalcode – Open4education
Encerramento
Muito Obrigado!
Twitter: @capin79
LinkedIn: https://br.linkedin.com/in/capin
fernando.franquini@gmail.com
Dúvidas?
Agradecimento Especial ao Vinny pelo apoio
incansável dos exemplos com JPA!

More Related Content

Viewers also liked

Java: o que estudar para o mercado de trabalho
Java: o que estudar para o mercado de trabalhoJava: o que estudar para o mercado de trabalho
Java: o que estudar para o mercado de trabalhoPedro Cavalero
 
The Format of The Research Paper
The Format of The Research PaperThe Format of The Research Paper
The Format of The Research PaperKaushal Desai
 
Suggestions and Ideas for DigitalOcean
Suggestions and Ideas for DigitalOceanSuggestions and Ideas for DigitalOcean
Suggestions and Ideas for DigitalOceanKaan Caliskan
 
Identität und Lebensführung (Ingrid Paus-Hasebrink)
Identität und Lebensführung (Ingrid Paus-Hasebrink)Identität und Lebensführung (Ingrid Paus-Hasebrink)
Identität und Lebensführung (Ingrid Paus-Hasebrink)Jan Schmidt
 
Fisica y su relacion con otras ciencias
Fisica y su relacion con otras cienciasFisica y su relacion con otras ciencias
Fisica y su relacion con otras cienciasGinna Camacho
 
Informe 05 cen mas órganos electorales descentralizados y mesas de votación
Informe 05 cen mas órganos electorales descentralizados y mesas de votaciónInforme 05 cen mas órganos electorales descentralizados y mesas de votación
Informe 05 cen mas órganos electorales descentralizados y mesas de votaciónTania Roja
 
Cyclicity of unit digit
Cyclicity of unit digitCyclicity of unit digit
Cyclicity of unit digitvishalkhare_27
 
TDC2016SP - Depurando Aplicações PHP Like a BOSS
TDC2016SP - Depurando Aplicações PHP Like a BOSSTDC2016SP - Depurando Aplicações PHP Like a BOSS
TDC2016SP - Depurando Aplicações PHP Like a BOSStdc-globalcode
 
10 lições que eu aprendi implantando o Scrum e que ninguém me contou antes
10 lições que eu aprendi implantando o Scrum e que ninguém me contou antes10 lições que eu aprendi implantando o Scrum e que ninguém me contou antes
10 lições que eu aprendi implantando o Scrum e que ninguém me contou antespriscilaelpo
 
TDC2016SP - Trilha DevOps .Net
TDC2016SP - Trilha DevOps .NetTDC2016SP - Trilha DevOps .Net
TDC2016SP - Trilha DevOps .Nettdc-globalcode
 
TDC2016SP - Trilha Data Science
TDC2016SP - Trilha Data ScienceTDC2016SP - Trilha Data Science
TDC2016SP - Trilha Data Sciencetdc-globalcode
 
TDC2016SP - Trilha Management 3.0
TDC2016SP - Trilha Management 3.0TDC2016SP - Trilha Management 3.0
TDC2016SP - Trilha Management 3.0tdc-globalcode
 
TDC2016SP - Trilha Microservices
TDC2016SP - Trilha MicroservicesTDC2016SP - Trilha Microservices
TDC2016SP - Trilha Microservicestdc-globalcode
 
TDC2016SP - Trilha Microservices
TDC2016SP - Trilha MicroservicesTDC2016SP - Trilha Microservices
TDC2016SP - Trilha Microservicestdc-globalcode
 
TDC2016SP - Trilha Microservices
TDC2016SP - Trilha MicroservicesTDC2016SP - Trilha Microservices
TDC2016SP - Trilha Microservicestdc-globalcode
 

Viewers also liked (20)

Web 2
Web 2Web 2
Web 2
 
Java: o que estudar para o mercado de trabalho
Java: o que estudar para o mercado de trabalhoJava: o que estudar para o mercado de trabalho
Java: o que estudar para o mercado de trabalho
 
services
servicesservices
services
 
The Format of The Research Paper
The Format of The Research PaperThe Format of The Research Paper
The Format of The Research Paper
 
Proyecto 54998
Proyecto  54998Proyecto  54998
Proyecto 54998
 
Examen.
Examen.Examen.
Examen.
 
Suggestions and Ideas for DigitalOcean
Suggestions and Ideas for DigitalOceanSuggestions and Ideas for DigitalOcean
Suggestions and Ideas for DigitalOcean
 
Identität und Lebensführung (Ingrid Paus-Hasebrink)
Identität und Lebensführung (Ingrid Paus-Hasebrink)Identität und Lebensführung (Ingrid Paus-Hasebrink)
Identität und Lebensführung (Ingrid Paus-Hasebrink)
 
Fisica y su relacion con otras ciencias
Fisica y su relacion con otras cienciasFisica y su relacion con otras ciencias
Fisica y su relacion con otras ciencias
 
Informe 05 cen mas órganos electorales descentralizados y mesas de votación
Informe 05 cen mas órganos electorales descentralizados y mesas de votaciónInforme 05 cen mas órganos electorales descentralizados y mesas de votación
Informe 05 cen mas órganos electorales descentralizados y mesas de votación
 
Cyclicity of unit digit
Cyclicity of unit digitCyclicity of unit digit
Cyclicity of unit digit
 
TDC2016SP - Depurando Aplicações PHP Like a BOSS
TDC2016SP - Depurando Aplicações PHP Like a BOSSTDC2016SP - Depurando Aplicações PHP Like a BOSS
TDC2016SP - Depurando Aplicações PHP Like a BOSS
 
10 lições que eu aprendi implantando o Scrum e que ninguém me contou antes
10 lições que eu aprendi implantando o Scrum e que ninguém me contou antes10 lições que eu aprendi implantando o Scrum e que ninguém me contou antes
10 lições que eu aprendi implantando o Scrum e que ninguém me contou antes
 
TDC2016SP - Trilha DevOps .Net
TDC2016SP - Trilha DevOps .NetTDC2016SP - Trilha DevOps .Net
TDC2016SP - Trilha DevOps .Net
 
Data driven quality - tdc2016
Data driven quality - tdc2016Data driven quality - tdc2016
Data driven quality - tdc2016
 
TDC2016SP - Trilha Data Science
TDC2016SP - Trilha Data ScienceTDC2016SP - Trilha Data Science
TDC2016SP - Trilha Data Science
 
TDC2016SP - Trilha Management 3.0
TDC2016SP - Trilha Management 3.0TDC2016SP - Trilha Management 3.0
TDC2016SP - Trilha Management 3.0
 
TDC2016SP - Trilha Microservices
TDC2016SP - Trilha MicroservicesTDC2016SP - Trilha Microservices
TDC2016SP - Trilha Microservices
 
TDC2016SP - Trilha Microservices
TDC2016SP - Trilha MicroservicesTDC2016SP - Trilha Microservices
TDC2016SP - Trilha Microservices
 
TDC2016SP - Trilha Microservices
TDC2016SP - Trilha MicroservicesTDC2016SP - Trilha Microservices
TDC2016SP - Trilha Microservices
 

Similar to Boas Práticas de SQL em Banco Relacional para Devs

Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkPablo Dall'Oglio
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHGiovanni Bassi
 
Programação Orientada a Testes
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a TestesGregorio Melo
 
Apresentando o EcmaScript 6
Apresentando o EcmaScript 6Apresentando o EcmaScript 6
Apresentando o EcmaScript 6Giovanni Bassi
 
JSF 2.0: Uma Evolução nas Interfaces Web com Java
JSF 2.0: Uma Evolução nas Interfaces Web com JavaJSF 2.0: Uma Evolução nas Interfaces Web com Java
JSF 2.0: Uma Evolução nas Interfaces Web com JavaDr. Spock
 
Qualidade de Software: Escrevendo Código Limpo
Qualidade de Software: Escrevendo Código LimpoQualidade de Software: Escrevendo Código Limpo
Qualidade de Software: Escrevendo Código LimpoLidiane Taquehara
 
BarCamp 2007 - CodeIgniter e OncologiaPediátrica.org
BarCamp 2007 - CodeIgniter e OncologiaPediátrica.orgBarCamp 2007 - CodeIgniter e OncologiaPediátrica.org
BarCamp 2007 - CodeIgniter e OncologiaPediátrica.orgjqrd
 
Case studies about Layout & View States & Scale in Windows 8 Store Apps
Case studies about Layout & View States & Scale in Windows 8 Store AppsCase studies about Layout & View States & Scale in Windows 8 Store Apps
Case studies about Layout & View States & Scale in Windows 8 Store AppsComunidade NetPonto
 
Criando sua própria linguagem de programação
Criando sua própria linguagem de programaçãoCriando sua própria linguagem de programação
Criando sua própria linguagem de programaçãoronaldoferraz
 
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'C. Augusto Proiete
 
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2Cezar Souza
 
T-SQL na prática com SQL SERVER Express 2012
T-SQL na prática com SQL SERVER Express 2012T-SQL na prática com SQL SERVER Express 2012
T-SQL na prática com SQL SERVER Express 2012Rodrigo Ribeiro
 
JSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysJSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysDr. Spock
 
JSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysJSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysDr. Spock
 

Similar to Boas Práticas de SQL em Banco Relacional para Devs (20)

Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um Framework
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BH
 
Programação Orientada a Testes
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a Testes
 
DDD > Experiências
DDD > ExperiênciasDDD > Experiências
DDD > Experiências
 
Design Patterns em Ruby
Design Patterns em RubyDesign Patterns em Ruby
Design Patterns em Ruby
 
Apresentando o EcmaScript 6
Apresentando o EcmaScript 6Apresentando o EcmaScript 6
Apresentando o EcmaScript 6
 
JSF 2.0: Uma Evolução nas Interfaces Web com Java
JSF 2.0: Uma Evolução nas Interfaces Web com JavaJSF 2.0: Uma Evolução nas Interfaces Web com Java
JSF 2.0: Uma Evolução nas Interfaces Web com Java
 
Qualidade de Software: Escrevendo Código Limpo
Qualidade de Software: Escrevendo Código LimpoQualidade de Software: Escrevendo Código Limpo
Qualidade de Software: Escrevendo Código Limpo
 
BarCamp 2007 - CodeIgniter e OncologiaPediátrica.org
BarCamp 2007 - CodeIgniter e OncologiaPediátrica.orgBarCamp 2007 - CodeIgniter e OncologiaPediátrica.org
BarCamp 2007 - CodeIgniter e OncologiaPediátrica.org
 
Case studies about Layout & View States & Scale in Windows 8 Store Apps
Case studies about Layout & View States & Scale in Windows 8 Store AppsCase studies about Layout & View States & Scale in Windows 8 Store Apps
Case studies about Layout & View States & Scale in Windows 8 Store Apps
 
Falando "Postgrês"
Falando "Postgrês"Falando "Postgrês"
Falando "Postgrês"
 
Desenvolvimento iOS
Desenvolvimento iOSDesenvolvimento iOS
Desenvolvimento iOS
 
Criando sua própria linguagem de programação
Criando sua própria linguagem de programaçãoCriando sua própria linguagem de programação
Criando sua própria linguagem de programação
 
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
 
Testes de software de A a Z
Testes de software de A a ZTestes de software de A a Z
Testes de software de A a Z
 
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
 
T-SQL na prática com SQL SERVER Express 2012
T-SQL na prática com SQL SERVER Express 2012T-SQL na prática com SQL SERVER Express 2012
T-SQL na prática com SQL SERVER Express 2012
 
JSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysJSF 2.0 e ScrumToys
JSF 2.0 e ScrumToys
 
JSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysJSF 2.0 e ScrumToys
JSF 2.0 e ScrumToys
 
Aplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com DjangoAplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com Django
 

Boas Práticas de SQL em Banco Relacional para Devs

  • 1. Globalcode – Open4education Fernando Franquini - Capin Profissional da área de TIC a mais de 18 anos, atuando a mais de 10 anos como DBA em projetos de desenvolvimento de Software principalmente com JAVA. Boas Práticas de SQL em Banco Relacional para Devs
  • 3. Globalcode – Open4education Apresentação Quem sou? Quem vocês são? Já criou e executou instrução SQL direto no BD Já analisou instrução SQL enviada ao BD Nunca viu SQL! Agora: Que diabos faz um DBA em uma trilha de JAVA?
  • 4. Globalcode – Open4education Projeção Todos sabem o que é a Projeção do SQL? Conteúdo da Projeção Sub Select na Projeção Função na Projeção
  • 5. Globalcode – Open4education Projeção /* select t from Team t */ select team0_.id as id1_11_, team0_.arena as arena2_11_, team0_.city as city3_11_, team0_.creationYear as creation4_11_, team0_.division_id as division8_11_, team0_.logo as logo5_11_, team0_.name as name6_11_, team0_.version as version7_11_ from teams team0_
  • 6. Globalcode – Open4education Chaves Chave candidatas Ex.: CPF e CNPJ Chaves compostas Alguns impactos nos frameworks: Se forem EAGER é um CAOS (balde de Siri) Em alguns casos mesmo sendo LAZY podem gerar problemas Índices do tipo Texto
  • 7. Globalcode – Open4education Chaves /* select g from Game g where g.dateLegacy = '2016-04-13' */ select game0_.id as id1_5_, game0_.arena_name as arena_na9_5_, game0_.arena_location as arena_l10_5_, game0_.awayPoints as awayPoin2_5_, game0_.awayTeam_id as awayTea11_5_, game0_.date as date3_5_, game0_.dateLegacy as dateLega4_5_, game0_.homePoints as homePoin5_5_, game0_.homeTeam_id as homeTea12_5_, game0_.time as time6_5_, game0_.timeLegacy as timeLega7_5_, game0_.version as version8_5_ from games game0_ where game0_.dateLegacy='2016-04-13'
  • 8. Globalcode – Open4education Chaves e Joins Chaves Primárias Texto Decimal Junções (Chaves estrangeiras) Indexação da junção
  • 9. Globalcode – Open4education Chaves e Joins Recente: @Entity @Table(name = "teams", indexes={ @Index(name="TEAM_CITY_NAME_INDEX", unique=true, columnList="CITY,NAME"), @Index(name="TEAM_ID_NAME_INDEX", unique=true, columnList="ID,NAME"), @Index(name="TEAM_DIVISION_NAME_INDEX", unique=true, columnList="DIVISION_ID,NAME") }) public class Team implements Serializable {...
  • 10. Globalcode – Open4education Chaves e Joins Hibernate: alter table teams add constraint TEAM_CITY_NAME_INDEX unique (city, name) Hibernate: alter table teams add constraint TEAM_ID_NAME_INDEX unique (arena) Hibernate: alter table teams add constraint TEAM_DIVISION_NAME_INDEX unique (division_id, name)
  • 11. Globalcode – Open4education Views e Triggers Views Para que servem? Quando viram um problema? Triggers Como nascem? Como lembramos?
  • 12. Globalcode – Open4education Bind Variables Mesma instrução executada N vezes Problema: SQL dinâmicos (montados em código) Ex.: ‘Select * from Pais where Nome = ‘ + ‘Brasil’ Ex.: ‘Select * from Pais where Nome = ‘ :1 Using : ‘Brasil’ Segurança contra SQL INJECTION
  • 13. Globalcode – Open4education Bind Variables /* select g from Game g where g.date = :date order by g.time */ SELECT Game0_.Id AS Id1_5_, Game0_.Arena_Name AS Arena_Na9_5_, Game0_.Arena_Location AS Arena_L10_5_, Game0_.Awaypoints AS Awaypoin2_5_, Game0_.Awayteam_Id AS Awaytea11_5_, Game0_.Date AS Date3_5_, Game0_.Datelegacy AS Datelega4_5_, Game0_.Homepoints AS Homepoin5_5_, Game0_.Hometeam_Id AS Hometea12_5_, Game0_.Time AS Time6_5_, Game0_.Timelegacy AS Timelega7_5_, Game0_.Version AS Version8_5_ FROM Games Game0_ WHERE Game0_.Date = ? ORDER BY Game0_.Time
  • 14. Globalcode – Open4education ANSI Funções que são múltiplos Banco de Dados: CASE COALESCE CAST para conversões de tipos de dados Melhor portabilidade de Banco de Dados Usem Dialeto do JAVA
  • 15. Globalcode – Open4education ANSI /* select distinct e.playerContract, coalesce( ( select sum(ev.value) from GameEvent ev where ev.playerContract = e.playerContract and ev.eventType = org.nba.model.GameEventType.POINTS_MADE), 0) from GameEvent e */ Continuação…
  • 16. Globalcode – Open4education ANSI SELECT DISTINCT Gameevent0_.Playercontract_Id AS Col_0_0_, Coalesce((SELECT SUM(Gameevent2_.Value) FROM Game_Events Gameevent2_, Player_Contracts Playercont3_ WHERE Gameevent2_.Playercontract_Id = Playercont3_.Id AND Gameevent2_.Playercontract_Id = Gameevent0_.Playercontract_Id AND Gameevent2_.Eventtype = 5), 0) AS Col_1_0_, Playercont1_.Id AS Id1_6_, Playercont1_.Finishdate AS Finishda2_6_, Playercont1_.Player_Id AS Player_I5_6_, Playercont1_.Startdate AS Startdat3_6_, Playercont1_.Team_Id AS Team_Id6_6_, Playercont1_.Version AS Version4_6_ FROM Game_Events Gameevent0_ INNER JOIN Player_Contracts Playercont1_ ON Gameevent0_.Playercontract_Id = Playercont1_.Id
  • 17. Globalcode – Open4education Função ‘ANSI’ #SQN /* select FUNCTION('DATE_FORMAT', b.date, '%d/%m/%Y'), b.awayTeamName, b.awayPoints, b.homePoints, b.homeTeamName from BoxScore b */ SELECT Date_Format(Boxscore0_.Date, '%d/%m/%Y') as Col_0_0_, Boxscore0_.Awayteamname AS Col_1_0_, Boxscore0_.Awaypoints AS Col_2_0_, Boxscore0_.Homepoints AS Col_3_0_, Boxscore0_.Hometeamname AS Col_4_0_ FROM Boxscoreview Boxscore0_
  • 18. Globalcode – Open4education Exemplo Real Tabela1: idGlobalTabela1, idTabela1, ... TabelaDeLigacao: idGlobalTabela1, idTabela1, idGlobalTabela2, idTabela2 @ManyToOne(fetch=FetchType.LAZY) @JoinColumns({ @JoinColumn(name="idGlobalTabela2", insertable=false, updatable=false), @JoinColumn(name="idTabela2", insertable=false, updatable=false) }) Tabela2 tabela2; Continuação...
  • 19. Globalcode – Open4education Exemplo Real ... Tabela2: idGlobalTabela2, idTabela2, nmTabela2 @OneToMany(fetch=FetchType.LAZY, mappedBy="tabela2") collection<TabelaDeLigacao> registros; .... -- Retornar todos os registros da "Tabela2" inseridos na "TabelaDeLigacao" -- Entrada: idGlobalTabela1 e idTabela1 -- Selecionar em Tabela2 -- Fazer join em TabelaDeLigacao -- Adicionar as condições idGlobalTabela1=x e idTabela1=y Continuação...
  • 20. Globalcode – Open4education Exemplo Real CriteriaBuilder criteriaBuilder=entityManager.getCriteriaBuilder(); CriteriaQuery<Tabela2> criteriaQuery = criteriaBuilder.createQuery(Tabela2.class); Root<Tabela2> root = criteriaQuery.from(Tabela2.class); Join<Tabela2, TabelaDeLigacao> join = root.join(Tabela2_.registros); List<Predicate> predicates = new ArrayList<>(); predicates.add(criteriaBuilder.equal(join.get(TabelaDeLigacao_.tabel aDeLigacaoPK).get(TabelaDeLigacaoPK_.idGlobalTabela1), valorIdGlocalTabela )); Continuação...
  • 21. Globalcode – Open4education Exemplo Real predicates.add(criteriaBuilder.equal(join.get(TabelaDeLigacao_.t abelaDeLigacaoPK).get(TabelaDeLigacaoPK_.idTabela1), valorIdTabela2)); criteriaQuery.select(root); criteriaQuery.where(criteriaBuilder.and(predicates.toArray(new Predicate[]{}))); criteriaQuery.orderBy(criteriaBuilder.asc(join.get(TabelaDeLigac ao_.tabela2).get(Tabela2_.nmTabela2))); TypedQuery<Tabela2> typedQuery = entityManager.createQuery(criteriaQuery); List<Tabela2> resultado = typedQuery.getResultList(); Continuação...
  • 22. Globalcode – Open4education Exemplo Real SELECT Tabela2.Idglobaltabela2, Tabela2.Idtabela2, Tabela2. Nmtabela2 FROM Exxx_Tabela2 Tabela2 INNER JOIN Exxx_Tabela_De_Ligacao Tabeladeligacao ON Tabela2.Id_Tabela2 = Tabeladeligacao.Id_Tabela2 AND Tabela2.Id_Global_Tabela2 = Tabeladeligacao.Id_Global_Tabela2 CROSS JOIN Exxx_Tabela2 Tabela2_2 WHERE Tabeladeligacao.Id_Tabela2 = Tabela2_2.Id_Tabela2 AND Tabeladeligacao.Id_Global_Tabela2 = Tabela2_2.Id_Global_Tabela2 AND Tabeladeligacao.Id_Global_Tabela1 = Valoridglocaltabela AND Tabeladeligacao.Id_Tabela1 = Valoridtabela2 ORDER BY Tabela2_2.nmTabela2 ASC; Continuação...
  • 23. Globalcode – Open4education Exemplo Real Erro: criteriaQuery.orderBy(criteriaBuilder.asc(join.get(TabelaDeLigac ao_.tabela2).get(Tabela2_.nmTabela2))); Correção: criteriaQuery.orderBy(criteriaBuilder.asc(root.get(Tabela2_.nmTa bela2))); Continuação ...
  • 24. Globalcode – Open4education Exemplo Real SELECT Tabela2.Idglobaltabela2, Tabela2.Idtabela2, Tabela2.Nmtabela2 FROM Exxx_Tabela2 Tabela2 INNER JOIN Exxx_Tabela_De_Ligacao Tabeladeligacao ON Tabela2.Id_Tabela2 = Tabeladeligacao.Id_Tabela2 AND Tabela2.Id_Global_Tabela2 = Tabeladeligacao.Id_Global_Tabela2 WHERE Tabeladeligacao.Cd_Sistema_Entidade = Valoridglocaltabela AND Tabeladeligacao.Cd_Entidade = Valoridtabela2 ORDER BY Tabela2.Nmtabela2 ASC;
  • 25. Globalcode – Open4education Encerramento Twitter: @capin79 LinkedIn: https://br.linkedin.com/in/capin fernando.franquini@gmail.com Scripts para base de testes está no Github: https://github.com/vinnyvoffice/tdcfloripa2016
  • 26. Globalcode – Open4education Encerramento Muito Obrigado! Twitter: @capin79 LinkedIn: https://br.linkedin.com/in/capin fernando.franquini@gmail.com Dúvidas? Agradecimento Especial ao Vinny pelo apoio incansável dos exemplos com JPA!