BlackTDN :: SQL e a Teoria de Conjuntos
_Créditos das imagens: Grok ### 🚀 Você sabia? SQL e a Teoria de Conjuntos estão mais conectados do que imagina! A linguagem SQL (Structured Query Language) tem suas raízes na teoria de conjuntos, um conceito matemático que trata de coleções de objetos. Em bancos de dados relacionais, cada tabela é um conjunto de linhas (ou tuplas), e operações como SELECT, JOIN, UNION e INTERSECT são inspiradas em operações como união (∪), interseção (∩) e diferença (-). Vamos explorar como isso funciona? 👇 --- ### 🔍 Principais Operações de Conjuntos no SQL Imagine duas tabelas simples: Clientes (Conjunto A): ``` +----+-------+ | ID | Nome | +----+-------+ | 1 | Ana | | 2 | João | | 3 | Maria | +----+-------+ ``` Pedidos (Conjunto B): ``` +----+-----------+ | ID | Cliente_ID| +----+-----------+ | 1 | 1 | | 2 | 2 | | 3 | 1 | +----+-----------+ ``` #### 1. União (UNION) - O que faz: Junta tudo de A e B, sem duplicatas (A ∪ B). - Exemplo: ```sql SELECT id FROM cli...
Naldo parabéns pelo blog, queria te mandar um e-mail não encontrei em nenhum lugar.
ResponderExcluirQuero tirar uma dúvida que não tem a ver com esse post, é a seguinte:
Qual a diferença em usar a função ASCAN do advpl ou procurar o que eu quero utilizando laço FOR?
Essa função tem alguma mágica, é mais rápida?
Jackson,
ExcluirNas aulas que ministro costumo mostrar, usando AdvPL, uma simulação do funcionamento das funções aEval e aSort... Vou montar um exemplo da aScan e publicar.
Mas uma afirmativa é certa: Utilize aScan, vai rodar em C++, no server, muito mais rápida do que um laço For/Next.
Como exemplo:
#include "rwmake.ch"
#include "protheus.ch"
#xtranslate MsgOut([]) => (ConOut([]),MsgBox([]))
//-----------------------------------------------------------------------------
//BlackTDN :: Simulando aSort e aEval
//-----------------------------------------------------------------------------
User Function aOrdena()
Local aArray := {10,9,7,4,3,2,5,6,78,89,0,43,2,4,65}
Local aCopy := aClone(aArray)
Local cMsg := ""
Local cCRLF := CRLF
//-----------------------------------------------------------------------------
//Usando a funcao padrao
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//Função aEval() : http://tdn.totvs.com/display/tec/AEVal
//-----------------------------------------------------------------------------
aEval(aArray,{|nValor|cMsg+=Str(nValor)+cCRLF})
MsgOut(cMsg,OemToAnsi("Eval|aSort Padrão: Resultado Não Ordenado"),"INFO")
cMsg := ""
//-----------------------------------------------------------------------------
//Função aSort() : http://tdn.totvs.com/pages/viewpage.action?pageId=23889126
//-----------------------------------------------------------------------------
aSort(aArray,NIL,NIL,{|nMenor,nMaior|nMenornMaior})
aEval(aArray,{|nValor|cMsg+=Str(nValor)+cCRLF})
MsgOut(cMsg,OemToAnsi("Eval|aSort Padrão: Resultado Ordem Decrescente"),"INFO")
cMsg := ""
//-----------------------------------------------------------------------------
//Usando a funcao customizada
//-----------------------------------------------------------------------------
aSize(aArray,0)
__aEval(aCopy,{|e|aAdd(aArray,e)})
__aEval(aArray,{|nValor|cMsg+=Str(nValor)+cCRLF})
MsgOut(cMsg,OemToAnsi("Eval|aSort Padrão: Resultado Não Ordenado"),"INFO")
cMsg := ""
__aSort(aArray,NIL,NIL,{|nMenor,nMaior|nMenornMaior})
__aEval(aArray,{|nValor|cMsg+=Str(nValor)+cCRLF})
MsgOut(cMsg,OemToAnsi("__aEval|__aSort Customizadas : Resultado Ordem Decrescente"),"INFO")
cMsg := ""
Return(NIL)
//-----------------------------------------------------------------------------
//Simulando aSort padrao
//-----------------------------------------------------------------------------
Static Function __aSort(aArray,nStart,nCount,bEval)
Local nD
Local nJ
Local uTmp
DEFAULT nStart := 1
DEFAULT nCount := Len( aArray )
For nD := nStart To nCount
For nJ := nD To nCount
IF Eval(bEval,aArray[nJ],aArray[nD])
uTmp := aArray[nD]
aArray[nD] := aArray[nJ]
aArray[nJ] := uTmp
EndIF
Next nJ
Next nI
Return(aArray)
//-----------------------------------------------------------------------------
//Simulando aEval padrao
//-----------------------------------------------------------------------------
Static Function __aEval(aArray,bEval,nStart,nCount)
Local nD
Local nJ
DEFAULT nStart := 1
DEFAULT nCount := Len(aArray)
nJ := nCount
For nD := nStart To nJ
//Função Eval() :: http://tdn.totvs.com.br/pages/viewpage.action?pageId=24346635
Eval(bEval,aArray[nD],nD)
Next nD
Return(aArray)
Beleza Naldo obrigado!
ResponderExcluirVocê poderia montar um post com dicas sobre essas funções que são mais rápidas hein.. hehe
Valeu abs!