<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Arquivo para Bancos de Dados - Bóson Treinamentos em Ciência e Tecnologia</title>
	<atom:link href="https://www.bosontreinamentos.com.br/tag/bancos-de-dados/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.bosontreinamentos.com.br/tag/bancos-de-dados/</link>
	<description>Artigos e Tutoriais sobre Desenvolvimento de Software, Bancos de Dados SQL, Linux, Lógica de Programação, Inteligência Artificial, Hardware, Eletrônica, Arduino, Técnicas e Teorias de Estudo e Aprendizagem, Carreira em TI, Ciências Cognitivas, e muito mais!</description>
	<lastBuildDate>Wed, 09 Jul 2025 11:09:45 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.5</generator>
	<item>
		<title>Funções de Manipulação de Strings no SQL Server</title>
		<link>https://www.bosontreinamentos.com.br/sql-com-sql-server/funcoes-de-manipulacao-de-strings-no-sql-server/</link>
					<comments>https://www.bosontreinamentos.com.br/sql-com-sql-server/funcoes-de-manipulacao-de-strings-no-sql-server/?noamp=mobile#comments</comments>
		
		<dc:creator><![CDATA[Fábio dos Reis]]></dc:creator>
		<pubDate>Fri, 27 Sep 2024 11:22:05 +0000</pubDate>
				<category><![CDATA[SQL com SQL Server]]></category>
		<category><![CDATA[Bancos de Dados]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQL Server]]></category>
		<guid isPermaLink="false">https://www.bosontreinamentos.com.br/?p=20294</guid>

					<description><![CDATA[<p>Manipulação de Strings no SQL Server A Manipulação de Strings (cadeias de caracteres) é uma tarefa trivial em bancos de dados e programação em geral. Tarefas como contar caracteres de uma string, converter letras de maiúsculas para minúsculas e vice-versa, obter partes de uma palavra ou frase, limpar caracteres indesejados e diversas outras são realizadas de forma corriqueira para tratar os dados que são armazenados e consultados em bancos de dados. Os SGBDs possuem, normalmente, diversas funções internas que permitem realizar essas tarefas, e o Microsoft SQL Server possui um bom conjunto de funções de manipulação de strings disponível. Neste artigo, veremos algumas das funções para manipular caracteres mais comuns presentes no SQL Server, com suas sintaxes, aplicações e exemplos práticos de uso. Funções de Manipulação de Strings no SQL Server As funções que serão vistas nesse artigo são as seguintes: Função LEN Função LOWER Função UPPER Função LTRIM Função RTRIM Função TRIM Função LEFT Função RIGHT Função REPLACE Função SUBSTRING Função CONCAT Função LEN A função LEN, do inglês &#8220;length&#8221; (&#8220;comprimento&#8221;), é uma das funções de manipulação de strings no SQL Server mais utilizadas, sendo empregada para retornar o número de caracteres de uma string, ou seja, seu comprimento. [...]</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/sql-com-sql-server/funcoes-de-manipulacao-de-strings-no-sql-server/">Funções de Manipulação de Strings no SQL Server</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Manipulação de Strings no SQL Server</h1>
<p>A Manipulação de Strings (cadeias de caracteres) é uma tarefa trivial em <a href="https://www.bosontreinamentos.com.br/category/bancos-de-dados/">bancos de dados</a> e programação em geral. Tarefas como contar caracteres de uma string, converter letras de maiúsculas para minúsculas e vice-versa, obter partes de uma palavra ou frase, limpar caracteres indesejados e diversas outras são realizadas de forma corriqueira para tratar os dados que são armazenados e consultados em bancos de dados.</p>
<p>Os SGBDs possuem, normalmente, diversas funções internas que permitem realizar essas tarefas, e o Microsoft SQL Server possui um bom conjunto de funções de manipulação de strings disponível.</p>
<p>Neste artigo, veremos algumas das funções para manipular caracteres mais comuns presentes no SQL Server, com suas sintaxes, aplicações e exemplos práticos de uso.</p>
<h2>Funções de Manipulação de Strings no SQL Server</h2>
<p>As funções que serão vistas nesse artigo são as seguintes:</p>
<ul>
<li><a href="#len">Função LEN</a></li>
<li><a href="#lower-right">Função LOWER</a></li>
<li><a href="#lower-right">Função UPPER</a></li>
<li><a href="#trim-rtrim-ltrim">Função LTRIM</a></li>
<li><a href="#trim-rtrim-ltrim">Função RTRIM</a></li>
<li><a href="#trim-rtrim-ltrim">Função TRIM</a></li>
<li><a href="#left-right">Função LEFT</a></li>
<li><a href="#left-right">Função RIGHT</a></li>
<li><a href="#replace">Função REPLACE</a></li>
<li><a href="#substring">Função SUBSTRING</a></li>
<li><a href="#concat">Função CONCAT</a></li>
</ul>
<h2 id="len">Função LEN</h2>
<div>A função LEN, do inglês &#8220;length&#8221; (&#8220;comprimento&#8221;), é uma das funções de manipulação de strings no SQL Server mais utilizadas, sendo empregada para retornar o número de caracteres de uma string, ou seja, seu comprimento. Geralmente a usamos em consultas SQL para validar e manipular dados textuais, como verificar o número de caracteres em uma senha ou em um código.</div>
<div> </div>
<div>Sintaxe</div>
<pre><span style="color: #800080;"><strong>LEN(<em>expressão</em>)</strong></span></pre>
<div>Onde <em>expressão</em> é a string ou coluna de texto cujo comprimento se deseja calcular.</div>
<div> </div>
<div>Exemplos</div>
<div> </div>
<div><strong>Exemplo 1: Contar o número de caracteres nos títulos de livros</strong></div>
<div> </div>
<div>Este exemplo consulta a tabela Livro e retorna os nomes dos livros juntamente com a contagem de caracteres de cada título.</div>
<pre><strong>SELECT NomeLivro, LEN(NomeLivro) 'Tamanho do Título'</strong>
<strong>FROM Livro;</strong></pre>
<div><strong>Exemplo 2: Validar o comprimento do ISBN13</strong></div>
<div> </div>
<div>O ISBN13 deve conter exatamente 13 caracteres. Podemos usar a função LEN para verificar se algum registro na tabela Livro possui um ISBN com um número incorreto de caracteres:</div>
<pre>SELECT NomeLivro, ISBN13, LEN(ISBN13) AS 'Tamanho do ISBN'
FROM Livro
WHERE LEN(ISBN13) &lt;&gt; 13;</pre>
<div>Essa consulta retornará todos os livros cujo campo ISBN13 não contém exatamente 13 caracteres, indicando assim possíveis erros de inserção.</div>
<div> </div>
<div>
<div><strong>Exemplo 3:  Qual livro tem o título mais curto?</strong></div>
<pre>SELECT Nome_Livro, LEN(Nome_Livro)  'Tamanho do Título'
FROM tbl_Livro
WHERE LEN(Nome_Livro) = (
    SELECT MIN(LEN(Nome_Livro))
    FROM tbl_Livro
);</pre>
</div>
<div>Serão retornados os nomes dos livros que possuam o título mais curto. Para isso, combinamos a função LEN com a <a href="https://www.bosontreinamentos.com.br/sql-com-sql-server/19-t-sql-funcoes-agregadas-sum-count-max-min-avg-sql-server/">função de agregação</a> MIN em uma subconsulta.</div>
<div> </div>
<div><strong>Exemplo 4: Ordenar livros pelo comprimento do título</strong></div>
<div> </div>
<div>Também podemos ordenar os resultados de uma consulta com base no comprimento de uma string, como no exemplo a seguir, que lista os livros com os títulos mais curtos primeiro.</div>
<pre>SELECT NomeLivro
FROM Livro
ORDER BY LEN(NomeLivro) ASC;</pre>
<div><strong>Exemplo 5:  Retornar as editoras cujos nomes tenham um tamanho fixo</strong></div>
<div> </div>
<div>Se quisermos localizar editoras cujo nome contém exatamente 10 caracteres, podemos usar a seguinte consulta:</div>
<pre>SELECT NomeEditora, LEN(NomeEditora) AS Tamanho_Nome
FROM Editora
WHERE LEN(NomeEditora) = 10;</pre>
<div>Esse tipo de análise pode ser útil para verificar padrões de nomenclatura ou para fins de organização.</div>
<div> </div>
<div><strong>Exemplo 6: Exibir autores com nomes longos</strong></div>
<div> </div>
<div>Podemos usar a função LEN para identificar autores que possuem nomes ou sobrenomes extensos.</div>
<pre>SELECT NomeAutor, SobrenomeAutor, LEN(NomeAutor) + LEN(SobrenomeAutor) AS 'Tamanho do Nome Completo'
FROM Autor
WHERE (LEN(NomeAutor) + LEN(SobrenomeAutor)) &gt; 20;</pre>
<div>Essa consulta retornará os autores cujo nome completo (nome + sobrenome) contém mais de 20 caracteres.</div>
<div> </div>
<h2 id="lower-right">Funções LOWER e UPPER</h2>
<div>As funções LOWER e UPPER permitem converter os caracteres de uma string para letras minúsculas e maiúsculas, respectivamente.</div>
<div> </div>
<div>Sintaxes</div>
<pre><span style="color: #800080;">LOWER(<em>expressão</em>)
UPPER(<em>expressão</em>)</span></pre>
<div>Onde <em>expressão</em> é o texto ou coluna de texto que se deseja transformar em minúsculas ou maiúsculas.</div>
<div> </div>
<div><strong>Exemplo 1: Converter nomes de livros para minúsculas</strong></div>
<div> </div>
<div>Este exemplo consulta a tabela Livro e retorna os títulos dos livros em letras minúsculas.</div>
<pre>SELECT NomeLivro, LOWER(NomeLivro) AS 'Nome Minúsculo'
FROM Livro;</pre>
<div>O resultado exibirá o nome original do livro ao lado de sua versão em minúsculas, útil quando se deseja padronizar a exibição dos títulos.</div>
<div> </div>
<div><strong>Exemplo 2: Comparar títulos de livros sem distinção de maiúsculas/minúsculas</strong></div>
<div> </div>
<div>Para verificar a existência de um livro independentemente do uso de maiúsculas ou minúsculas, pode-se utilizar LOWER na condição de uma consulta.</div>
<pre>SELECT NomeLivro
FROM Livro
WHERE LOWER(NomeLivro) = 'a arte da eletrônica';</pre>
<div>Essa consulta permitirá encontrar o livro &#8220;A Arte da Eletrônica&#8221; mesmo que seu título esteja registrado com diferentes combinações de maiúsculas e minúsculas.</div>
<div> </div>
<div><strong>Exemplo 3: Padronizar assuntos em letras maiúsculas</strong></div>
<div> </div>
<div>Se os registros na tabela Assunto contiverem uma mistura de letras maiúsculas e minúsculas, podemos usar UPPER para padronizar a exibição desses dados.</div>
<pre>SELECT UPPER(NomeAssunto) AS Assunto
FROM Assunto;</pre>
<div>Essa prática pode facilitar a leitura e garantir que os dados sejam exibidos de forma uniforme em relatórios ou interfaces.</div>
<div> </div>
<div><strong>Exemplo 4: Inserir novos registros padronizados</strong></div>
<div> </div>
<div>Ao inserir novos registros em uma tabela, podemos usar UPPER ou LOWER para garantir que o valor seja armazenado no banco de dados de forma padronizada.</div>
<div> </div>
<div>Exemplo de inserção de um novo autor com o nome e sobrenome convertidos para letras maiúsculas:</div>
<pre>INSERT INTO Autor (NomeAutor, SobrenomeAutor)
VALUES (UPPER('Fábio'), UPPER('dos Reis'));</pre>
<div>Essa técnica pode ajudar a evitar discrepâncias no banco de dados, onde o mesmo nome pode ser inserido com diferentes formas de capitalização.</div>
<div> </div>
<div><strong>Exemplo 5: Converter os nomes e sobrenomes de autores para maiúsculas</strong></div>
<div> </div>
<div>Neste exemplo, podemos exibir os nomes completos dos autores (nome e sobrenome) em letras maiúsculas para um formato mais padronizado.</div>
<pre>SELECT NomeAutor, SobrenomeAutor,
    UPPER(NomeAutor) AS NomeMaiusculo,
    UPPER(SobrenomeAutor) AS SobrenomeMaiusculo
FROM Autor;</pre>
<div>Esse formato é útil quando se deseja uma apresentação visual consistente de dados textuais.</div>
<div> </div>
<h2 id="trim-rtrim-ltrim">Funções LTRIM, RTRIM e TRIM</h2>
<div>As funções LTRIM, RTRIM e TRIM são usadas para remover espaços em branco (ou caracteres específicos) no início, no final ou em ambos os lados de uma string. Úteis quando se deseja limpar ou padronizar dados textuais.</div>
<div> </div>
<div>Sintaxes</div>
<pre><span style="color: #800080;">LTRIM(expressão)</span>
<span style="color: #800080;">RTRIM(expressão)</span>
<span style="color: #800080;">TRIM([caracteres FROM] expressão)</span></pre>
<div>Onde:</div>
<ul>
<li><strong>expressão</strong>: string que será modificada.</li>
<li><strong>caracteres</strong>: Caracteres que se deseja remover. Se omitido, remove espaços em branco.</li>
</ul>
<div> </div>
<div>Exemplos</div>
<div> </div>
<div><strong>Exemplo 1: Remover espaços em branco no início dos nomes de livros</strong></div>
<div> </div>
<div>Se houver registros na tabela Livro com espaços em branco antes do nome do livro, podemos usar LTRIM em uma consulta para remover esses espaços ao exibi-los.</div>
<pre>SELECT NomeLivro, LTRIM(NomeLivro) 'Nome Ajustado'
FROM Livro;</pre>
<div>Neste exemplo, a consulta retornará o nome original do livro e sua versão sem os espaços em branco no início. Isso é útil para garantir que os dados sejam exibidos de forma consistente.</div>
<div> </div>
<div>Exemplo 2: Remover espaços antes do sobrenome dos autores</div>
<div>Se os sobrenomes dos autores contiverem espaços em branco indesejados no início, podemos usar LTRIM para remover esses espaços.</div>
<div> </div>
<div>SELECT SobrenomeAutor, LTRIM(SobrenomeAutor) AS SobrenomeAjustado</div>
<div>FROM Autor;</div>
<div> </div>
<div>Isso garante que os sobrenomes sejam exibidos corretamente, sem espaços extras no início.</div>
<div> </div>
<div><strong>Exemplo 2: Remover espaços em branco no final dos nomes de editoras</strong></div>
<div> </div>
<div>Caso algum nome de editora na tabela Editora tenha sido registrado com espaços em branco no final, RTRIM pode ser usado para corrigir isso.</div>
<pre>SELECT NomeEditora, RTRIM(NomeEditora) AS 'Nome da Editora Ajustado'
FROM Editora;</pre>
<div>Neste exemplo, o nome da editora será retornado sem os espaços extras no final, garantindo que os dados estejam corretamente formatados.</div>
<div> </div>
<div>Exemplo 5: Remover espaços em branco no início e no final dos títulos de livros ao mesmo tempo</div>
<div> </div>
<div>Para garantir que os títulos dos livros na tabela Livro estejam sem espaços em branco no início e no final em ua consulta, podemos usar a função TRIM.</div>
<pre>SELECT NomeLivro, TRIM(NomeLivro) AS NomeLivroAjustado
FROM Livro;</pre>
<div>Isso remove qualquer espaço em branco extra no início e no final do título dos livros, garantindo que os dados estejam limpos.</div>
<div> </div>
<div><strong>Exemplo 3: Remover caracteres específicos de uma string</strong></div>
<div> </div>
<div>A função TRIM também pode ser usada para remover outros caracteres além dos espaços em branco. Suponha que, por algum motivo, os títulos de alguns livros foram armazenados com um caractere de asterisco (*) no início e no final. Podemos usar TRIM para remover esses caracteres.</div>
<pre>SELECT NomeLivro, TRIM('*' FROM NomeLivro) AS NomeLivroLimpo
FROM Livro;</pre>
<div>Esse exemplo remove os asteriscos do início e do final dos nomes dos livros, garantindo que apenas o título adequado seja exibido.</div>
<div> </div>
<div><strong>Exemplo 4: Atualizar registros para remover espaços indesejados</strong></div>
<div> </div>
<div>Ao identificar espaços em branco indesejados nos dados, podemos usar as funções LTRIM, RTRIM e TRIM em uma cláusula UPDATE para corrigir permanentemente os valores no banco de dados.</div>
<div> </div>
<div>Por exemplo, para remover espaços no início e no final dos nomes das editoras cadastradas, alterando esses dados na tabela, podemos usar TRIM:</div>
<pre>UPDATE Editora
SET NomeEditora = TRIM(NomeEditora);</pre>
<div>Esse comando atualiza todos os registros da tabela Editora, removendo qualquer espaço extra no início ou no final dos nomes. Note que não usamos cláusula WHERE aqui, pois queremos que a atualização seja aplicada a todas as linhas da tabela.</div>
<div> </div>
<div><strong>Exemplo 5: Inserir dados sem espaços indesejados</strong></div>
<div> </div>
<div>Ao inserir novos dados, também é possível utilizar TRIM para garantir que os valores sejam armazenados corretamente. Por exemplo, ao cadastrar um novo autor, podemos garantir que o nome e sobrenome sejam armazenados sem espaços indesejados porventura digitados pelo usuário:</div>
<pre>INSERT INTO Autor (NomeAutor, SobrenomeAutor)
VALUES (TRIM(' Fábio '), TRIM(' dos Reis '));</pre>
<div>Essa técnica impede que valores com espaços indesejados sejam armazenados no banco de dados.</div>
<div> </div>
<h2 id="left-right">Funções LEFT e RIGHT</h2>
<div>As funções LEFT e RIGHT são usadas para extrair partes de uma string, com base no número de caracteres contados a partir da esquerda ou da direita, respectivamente.</div>
<div> </div>
<div>A função LEFT retorna os primeiros &#8220;n&#8221; caracteres de uma string, a partir da esquerda. Já a função RIGHT retorna os últimos &#8220;n&#8221; caracteres de uma string, contados a partir da direita.</div>
<div> </div>
<div>Sintaxes:</div>
<pre><span style="color: #800080;">LEFT(string, número_de_caracteres)</span></pre>
<div>onde:</div>
<ul>
<li><strong>string</strong>: A string original da qual se deseja extrair os caracteres.</li>
<li><strong>número_de_caracteres</strong>: O número de caracteres a ser extraído, começando pela esquerda.</li>
</ul>
<pre><span style="color: #800080;">RIGHT(string, número_de_caracteres)</span></pre>
<div><strong>Exemplo 1: Extrair os 4 últimos caracteres do ISBN com RIGHT</strong></div>
<div> </div>
<div>Em nosso banco de dados, a tabela Livro contém a coluna ISBN13, que armazena o número ISBN dos livros. Podemos querer extrair os últimos 4 caracteres do ISBN para identificar o título e dígito verificador da obra.</div>
<pre>SELECT ISBN13,
    RIGHT(ISBN13, 4) AS 'Título e DV'
FROM Livro;</pre>
<div><strong>Exemplo 2: Extrair as iniciais dos nomes dos autores</strong></div>
<div> </div>
<div>Na tabela Autor, temos os nomes armazenados na coluna NomeAutor. Caso queiramos extrair os primeiros 2 caracteres dos nomes dos autores, podemos usar a função LEFT.</div>
<pre>SELECT NomeAutor,
    LEFT(NomeAutor, 2) AS 'Iniciais Autor'
FROM Autor;</pre>
<div><strong>Exemplo 3: Extrair o ano de publicação com LEFT</strong></div>
<div> </div>
<div>Caso a data de publicação dos livros esteja armazenada na coluna DataPub no formato YYYY-MM-DD, podemos usar a função LEFT para extrair o ano da publicação (os 4 primeiros dígitos internamente).</div>
<pre>SELECT NomeLivro,
    LEFT(CAST(DataPub AS VARCHAR), 4) AS AnoPublicacao
FROM Livro;</pre>
<div>Na verdade o ideal, neste caso, seria usar uma função de manipulação de datas, que é mais adequado.</div>
<div> </div>
<h2 id="replace">Função REPLACE</h2>
<div>A função REPLACE é usada para substituir todas as ocorrências de uma substring por outra dentro de uma string. É útil para realizar transformações em dados de texto.</div>
<div> </div>
<div>Sintaxe</div>
<pre><span style="color: #993366;">REPLACE(string_original, substring_antiga, substring_nova)</span></pre>
<div>onde:</div>
<ul>
<li><strong>string_original:</strong> A string na qual a substituição será realizada.</li>
<li><strong>substring_antiga</strong>: O texto que será substituído.</li>
<li><strong>substring_nova</strong>: O novo texto que substituirá a substring antiga.</li>
</ul>
<div>Exemplos</div>
<div> </div>
<div><strong>Exemplo 1: Trocar todas as ocorrências de &#8220;Server 2010&#8221; por &#8220;Server 2020&#8221; nos nomes dos livros</strong></div>
<pre><strong>UPDATE Livro</strong>
<strong>SET NomeLivro = REPLACE(NomeLivro, '2010', '2020')</strong>
<strong>WHERE NomeLivro LIKE '%Server 2010%';</strong>
<span style="color: #339966;"><strong>-- Teste:</strong></span>
<strong>SELECT * FROM Livro;</strong></pre>
<div><strong>Exemplo 2: Remover traços do ISBN dos livros</strong></div>
<div> </div>
<div>Se os números de ISBN dos livros forem inseridos com traços (por exemplo, 978-85-254-0417-9), pode ser necessário removê-los para padronizar o formato. Podemos usar a função REPLACE para remover os traços.</div>
<div>
<pre>UPDATE Livro
SET ISBN13 = REPLACE(ISBN13, '-', '')
WHERE ISBN13 LIKE '%-%';</pre>
</div>
<div>Neste caso, mandamos substituir os traços por nada, denotado pelas aspas simples sem conteúdo (nem mesmo um espaço em branco) no terceiro parâmetro passado à função.</div>
<div> </div>
<h2 id="substring">Função SUBSTRING</h2>
<div>A função SUBSTRING é utilizada para extrair uma parte de uma string a partir de uma posição inicial e com um comprimento específico. Permite selecionar trechos de texto dentro de colunas de tipos de caracteres, como VARCHAR, CHAR, TEXT</div>
<div> </div>
<div>Sintaxe</div>
<pre><span style="color: #800080;">SUBSTRING(expressão, início, comprimento)</span></pre>
<div>onde:</div>
<ul>
<li><strong><em>expressão</em>:</strong> A expressão de string ou a coluna da qual se deseja extrair uma parte.</li>
<li><strong><em>início</em></strong>: A posição inicial (1 baseada) da extração.</li>
<li><strong><em>comprimento</em></strong>: O número de caracteres a serem extraídos.</li>
</ul>
<div>Exemplos</div>
<div> </div>
<div><strong>Exemplo 1: Extrair os três primeiros caracteres de um título de livro</strong></div>
<div> </div>
<div>Suponha que queiramos extrair os três primeiros caracteres da coluna NomeLivro da tabela Livro. Esta operação pode ser útil para criar códigos ou siglas a partir dos títulos dos livros.</div>
<pre>SELECT NomeLivro, SUBSTRING(NomeLivro, 1, 3) AS SiglaLivro
FROM Livro;</pre>
<div><strong>Exemplo 2: Alterar nomes das editoras para que iniciem com uma letra maiúscula</strong></div>
<div> </div>
<div>Primeiramente vamos colocar os nomes das editoras em letras maiúsculas:</div>
<pre>UPDATE Editora
SET NomeEditora = UPPER(NomeEditora);

SELECT * FROM Editora;</pre>
<div>Agora vamos alterar os nomes das editoras para que apenas iniciem com uma letra maiúscula, com o restante do nome em minúsculas.</div>
<pre>UPDATE Editora
SET NomeEditora = UPPER(LEFT(NomeEditora, 1)) + LOWER(SUBSTRING(NomeEditora, 2, LEN(NomeEditora)))
WHERE NomeEditora IS NOT NULL;</pre>
<div><strong>3. Extrair o ano de publicação a partir da coluna DataPub</strong></div>
<div> </div>
<div>No caso da coluna DataPub que armazena a data de publicação dos livros no formato YYYY-MM-DD, pode-se usar a função SUBSTRING para extrair o ano diretamente a partir da string da data. Vamos considerar que a coluna DataPub seja uma VARCHAR.</div>
<pre>SELECT NomeLivro, DataPub, SUBSTRING(DataPub, 1, 4) AS AnoPublicacao
FROM Livro;</pre>
<div>Uma outra alternativa para executar esta tarefa é usar funções de manipulação de <a href="https://www.bosontreinamentos.com.br/sql-com-sql-server/tipos-de-data-e-hora-no-sql-server/">data e hora</a>, que possuem recursos mais adequados para o tratamento deste tipo de dado.</div>
<div> </div>
<h2 id="concat">Função CONCAT</h2>
<div>Uma das funções de manipulação de strings mais usadas no SQL Server, a função CONCAT permite concatenar (unir) duas ou mais strings em uma única string. Útil quando precisamos combinar dados de diferentes colunas ou acrescentar textos adicionais para formar uma nova informação.</div>
<div> </div>
<div>Esta função aceita múltiplos parâmetros, as strings a serem unidas. O SQL Server converte automaticamente os valores não strings em texto</div>
<div> </div>
<div>Sintaxe</div>
<pre><span style="color: #800080;">CONCAT(valor1, valor2, valor3, ...)</span></pre>
<div>onde:</div>
<ul>
<li><em><strong>valor1, valor2, &#8230;</strong></em>: Valores que serão concatenados. Podem ser colunas, literais ou expressões.</li>
</ul>
<div>Exemplos</div>
<div> </div>
<div><strong>Exemplo 1: Concatenação simples de strings.</strong></div>
<pre>SELECT CONCAT('Fábio ', 'dos Reis') AS 'Nome Cliente';</pre>
<div><strong>Exemplo 2: Concatenar nomes e sobrenomes dos autores</strong></div>
<div> </div>
<div>A tabela Autor possui as colunas NomeAutor e SobrenomeAutor, que armazenam, respectivamente, o nome e o sobrenome dos autores. Para exibir o nome completo, podemos concatenar essas duas colunas.</div>
<pre>SELECT CONCAT(NomeAutor, ' ', SobrenomeAutor) AS 'Nome Completo do Autor'
FROM Autor;</pre>
<div><strong>Exemplo 3: Concatenar ISBN e Nome do Livro</strong></div>
<div> </div>
<div>Na tabela Livro, podemos querer criar uma coluna que mostre tanto o nome do livro quanto o número ISBN13 em uma única string, para facilitar a identificação.</div>
<pre>SELECT NomeLivro,
    ISBN13,
    CONCAT(NomeLivro, ' (ISBN: ', ISBN13, ')') AS LivroComISBN
FROM Livro;</pre>
<div><strong>Exemplo 4: Concatenar Data de Publicação Formatada</strong></div>
<div> </div>
<div>Em alguns casos, podemos querer exibir a data de publicação de um livro com um formato específico. Usando CONCAT, é possível combinar a data com outras informações para gerar um texto descritivo.</div>
<pre>SELECT NomeLivro,
    DataPub,
    CONCAT('O livro "', NomeLivro, '" foi publicado em ', DataPub) AS DescricaoPublicacao
FROM Livro;</pre>
<h3>Conclusão</h3>
<div>Neste artigo estudamos as <a href="https://learn.microsoft.com/en-us/sql/t-sql/functions/string-functions-transact-sql?view=sql-server-ver16" target="_blank" rel="noopener">funções para manipulação de strings</a> mais comuns no SQL Server, incluindo suas sintaxes e alguns exemplos de uso de cada uma delas. O SQL Server oferece uma grande quantidade de funções para a realização de diversas tarefas, além da manipulação de strings, que incluem cálculos numéricos, manipulação temporal (data e hora), funções administrativas, e muitas outras que estudaremos nos próximos artigos.</div>
<div> </div>
<p>O post <a href="https://www.bosontreinamentos.com.br/sql-com-sql-server/funcoes-de-manipulacao-de-strings-no-sql-server/">Funções de Manipulação de Strings no SQL Server</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bosontreinamentos.com.br/sql-com-sql-server/funcoes-de-manipulacao-de-strings-no-sql-server/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Procedimentos Armazenados em PostgreSQL (Stored Procedures)</title>
		<link>https://www.bosontreinamentos.com.br/postgresql-banco-dados/procedimentos-armazenados-em-postgresql-stored-procedures/</link>
					<comments>https://www.bosontreinamentos.com.br/postgresql-banco-dados/procedimentos-armazenados-em-postgresql-stored-procedures/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Fábio dos Reis]]></dc:creator>
		<pubDate>Tue, 03 Sep 2024 14:56:25 +0000</pubDate>
				<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[Bancos de Dados]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[SQL]]></category>
		<guid isPermaLink="false">http://www.bosontreinamentos.com.br/?p=18799</guid>

					<description><![CDATA[<p>Procedimentos Armazenados em PostgreSQL (Stored Procedures) Procedimentos armazenados são uma forma de armazenar a lógica do banco de dados no lado do servidor e podem ser executados por vários clientes. Eles são uma ferramenta muito útil para administradores e programadores de banco de dados, pois permitem encapsular a lógica complexa em uma única unidade chamável, reduzindo o código duplicado, aumentando a segurança e melhorando o desempenho. Um procedimento armazenado no PostgreSQL é um bloco nomeado de instruções PL/pgSQL que podem ser executadas com um único comando. A sintaxe para criar um procedimento armazenado no PostgreSQL é a seguinte: CREATE [OR REPLACE PROCEDURE] nome_procedimento(arg1 tipo_dado1, arg2 tipo_dado2, ...) RETURNS tipo_dado_retorno LANGUAGE plpgsql AS $$ DECLARE -- declaração de variáveis locais, se houver BEGIN -- declarações PL/pgSQL END; $$; Onde: nome_procedimento é o nome do procedimento armazenado arg1, arg2, etc. são os parâmetros do procedimento armazenado tipo_dado1, tipo_dado2, etc. são os tipos de dados dos parâmetros tipo_dado_retorno é o tipo de dados do valor de retorno e a seção DECLARE é usada para declarar variáveis locais, se necessário. A lógica real do procedimento armazenado é escrita dentro de blocos BEGIN e END, usando instruções da linguagem PL/pgSQL. A cláusula LANGUAGE especifica o [...]</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/postgresql-banco-dados/procedimentos-armazenados-em-postgresql-stored-procedures/">Procedimentos Armazenados em PostgreSQL (Stored Procedures)</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Procedimentos Armazenados em PostgreSQL (Stored Procedures)</h2>
<p>Procedimentos armazenados são uma forma de armazenar a lógica do banco de dados no lado do servidor e podem ser executados por vários clientes. Eles são uma ferramenta muito útil para administradores e programadores de banco de dados, pois permitem encapsular a lógica complexa em uma única unidade chamável, reduzindo o código duplicado, aumentando a segurança e melhorando o desempenho.</p>
<p>Um procedimento armazenado no <a href="https://www.bosontreinamentos.com.br/curso-completo-de-postgresql/">PostgreSQL</a> é um bloco nomeado de instruções PL/pgSQL que podem ser executadas com um único comando. A sintaxe para criar um procedimento armazenado no PostgreSQL é a seguinte:</p>
<pre><span style="color: #800080;"><strong>CREATE [OR REPLACE PROCEDURE] nome_procedimento(arg1 tipo_dado1, arg2 tipo_dado2, ...)</strong></span>
<span style="color: #800080;"><strong>RETURNS tipo_dado_retorno</strong></span>
<span style="color: #800080;"><strong>LANGUAGE plpgsql</strong></span>
<span style="color: #800080;"><strong>AS $$</strong></span>
<span style="color: #800080;"><strong>DECLARE</strong></span>
<span style="color: #339966;"><strong>-- declaração de variáveis locais, se houver</strong></span>
<span style="color: #800080;"><strong>BEGIN</strong></span>
<span style="color: #339966;"><strong>-- declarações PL/pgSQL</strong></span>
<span style="color: #800080;"><strong>END;</strong></span>
<span style="color: #800080;"><strong>$$;</strong></span></pre>
<p>Onde:</p>
<ul>
<li><strong>nome_procedimento</strong> é o nome do procedimento armazenado</li>
<li><strong>arg1, arg2, etc</strong>. são os parâmetros do procedimento armazenado</li>
<li><strong>tipo_dado1, tipo_dado2, etc</strong>. são os <a href="https://www.bosontreinamentos.com.br/postgresql-banco-dados/tipos-de-dados-no-postgresql/">tipos de dados</a> dos parâmetros</li>
<li><strong>tipo_dado_retorno</strong> é o tipo de dados do valor de retorno</li>
</ul>
<p>e a seção <strong>DECLARE</strong> é usada para declarar variáveis locais, se necessário. A lógica real do procedimento armazenado é escrita dentro de blocos BEGIN e END, usando instruções da linguagem <strong>PL/pgSQL</strong>.</p>
<p>A cláusula <strong>LANGUAGE</strong> especifica o idioma do procedimento armazenado, que é <em><strong>plpgsql</strong></em> neste caso.</p>
<h3>O símbolo $$</h3>
<p>O símbolo $$ usado na última linha de um procedimento PL/pgSQL é usado para definir o início e o fim do corpo do procedimento. É uma sintaxe especial usada para definir uma string literal que abrange várias linhas. Na prática, é possível usar qualquer string com essa finalidade, desde que não seja uma palavra reservada da linguagem.</p>
<p>Em um procedimento PL/pgSQL, o $$ é usado para envolver todo o corpo do procedimento, que inclui a declaração de variáveis, a definição de estruturas de controle e qualquer outra lógica que você queira implementar. O primeiro $$ marca o início do corpo do procedimento e o segundo $$ marca o fim do corpo do procedimento.</p>
<p>Outra opção é usar a estrutura &#8220;<strong>BEGIN ATOMIC</strong>&#8221; &#8230; &#8220;<strong>END</strong>&#8221; no lugar de &#8220;<strong>AS $$</strong>&#8220;.</p>
<h3><strong>O que é PL/pgSQL?</strong></h3>
<p>PL/pgSQL é uma linguagem procedural usada no PostgreSQL para escrever stored procedures, triggers e funções. É uma linguagem estruturada em blocos semelhante a outras linguagens procedurais, como PL/SQL no Oracle e T-SQL no Microsoft SQL Server. Essa linguagem fornece estruturas de controle, como instruções IF-THEN-ELSE, LOOP e EXIT, bem como a capacidade de declarar variáveis, realizar tratamento de exceções e usar cursores.</p>
<p>O PL/pgSQL oferece uma interface procedural de alto nível para o banco de dados que permite criar lógica de negócios complexa e automatizar as operações do banco de dados. Por exemplo, podemos usar PL/pgSQL para implementar regras de negócios, validar dados ou realizar cálculos complexos em dados armazenados no banco de dados.</p>
<p>Assim, podemos escrever lógica que pode ser facilmente testada e reutilizada, tornando-a uma maneira eficiente de gerenciar operações de banco de dados.</p>
<p>Trata-se de uma linguagem do lado do servidor, o que significa que o código é executado no servidor de banco de dados, e não no cliente. Isso o torna mais rápido e eficiente do que executar o script do lado do cliente, dentro de uma aplicação de usuário, além de fornecer melhor segurança para seus dados.</p>
<p>Outras opções de linguagens suportadas pelo Postgres incluem SQL padrão e linguagem C, além da possibilidade de trabalhar com extensões para outras linguagens como PL/Python, PL/Perl, etc.</p>
<p>A instrução <strong>LANGUAGE plpgsql</strong> é necessária ao criar procedimentos armazenados no PostgreSQL porque define a linguagem de programação que será usada para escrever o corpo do procedimento.</p>
<h3>Como executar o procedimento armazenado</h3>
<p>Podemos chamar um procedimento armazenado no PostgreSQL usando a seguinte sintaxe:</p>
<pre><span style="color: #800080;"><strong>CALL nome_procedimento(arg1_valor, arg2_valor, ...);</strong></span></pre>
<p>Aqui, arg1_valor, arg2_valor, etc. são os valores dos parâmetros passados para o procedimento armazenado. O resultado do procedimento armazenado será retornado na forma de uma tabela.</p>
<p>Vejamos agora alguns exemplos de criação e execução de procedimentos armazenados em PostgreSQL.</p>
<h3>Exemplo 01 &#8211; Inserir uma linha em uma tabela</h3>
<p>Procedimento armazenado em PostgreSQL (somente SQL) que insere uma nova linha em uma tabela, composta por três colunas: nome, sobrenome e idade:</p>
<p>Criar a tabela de teste:</p>
<pre><span style="color: #ff0000;"><strong>CREATE TABLE pessoas (</strong></span>
<span style="color: #ff0000;"><strong>    nome varchar(20),</strong></span>
<span style="color: #ff0000;"><strong>    sobrenome varchar(40),</strong></span>
<span style="color: #ff0000;"><strong>    idade smallint</strong></span>
<span style="color: #ff0000;"><strong>);</strong></span></pre>
<p>Vamos a um exemplo de procedimento armazenado em PL/pgSQL que insere uma nova linha em uma tabela com três colunas: nome, sobrenome e idade. O procedimento armazenado usa três parâmetros: p_nome, p_sobrenome e p_idade e insere esses valores na tabela.</p>
<pre><span style="color: #ff0000;"><strong>CREATE OR REPLACE PROCEDURE cadastra_pessoa(p_nome varchar(20), p_sobrenome varchar(40), p_idade smallint)</strong></span>
<span style="color: #ff0000;"><strong>  LANGUAGE plpgsql
AS $$
BEGIN</strong></span>
<span style="color: #ff0000;"><strong>    INSERT INTO pessoas (nome, sobrenome, idade)</strong></span>
<span style="color: #ff0000;"><strong>    VALUES (p_nome, p_sobrenome, p_idade);</strong></span>
<span style="color: #ff0000;"><strong>END</strong></span>
<span style="color: #ff0000;"><strong>$$</strong></span></pre>
<p><strong>Teste</strong></p>
<p>Para executar o procedimento armazenado, basta chamá-lo com os valores desejados como parâmetros, assim:</p>
<pre><span style="color: #ff0000;"><strong>CALL cadastra_pessoa('Fábio'::varchar, 'dos Reis'::varchar, 48::smallint);</strong></span></pre>
<p>E verificar se a tabela foi atualizada com o novo registro:</p>
<pre><span style="color: #ff0000;"><strong>SELECT * FROM pessoas;</strong></span></pre>
<p><img decoding="async" class="aligncenter wp-image-18802 size-full" title="Procedimento armazenado no PostgreSQL" src="http://www.bosontreinamentos.com.br/wp-content/uploads/2023/02/postgresql-stored-procedure-2.png" alt="Procedimento armazenado no PostgreSQL" width="426" height="77" srcset="https://www.bosontreinamentos.com.br/wp-content/uploads/2023/02/postgresql-stored-procedure-2.png 426w, https://www.bosontreinamentos.com.br/wp-content/uploads/2023/02/postgresql-stored-procedure-2-420x76.png 420w" sizes="(max-width: 426px) 100vw, 426px" /></p>
<h4>Especificar tipos de dados na chamada do procedimento</h4>
<p>Ao chamar um procedimento armazenado no PostgreSQL, a necessidade de especificar explicitamente os tipos de dados para os argumentos (por exemplo, &#8216;Fábio&#8217;::varchar) geralmente surge devido a questões de desambiguação e coerção de tipos.</p>
<p>Os principais motivos para especificar tipos de dados ao chamar um procedimento armazenado no PostgreSQL são os seguntes:</p>
<ol>
<li><strong>Desambiguação</strong>: Quando o PostgreSQL possui múltiplos procedimentos com o mesmo nome, mas com assinaturas diferentes (ou seja, com diferentes tipos de parâmetros ou números de parâmetros), ele precisa saber exatamente qual procedimento deve ser chamado. Especificar o tipo de dado ajuda o PostgreSQL a escolher a versão correta do procedimento.</li>
<li><strong>Coerção de Tipos</strong>: O PostgreSQL é uma linguagem fortemente tipada, o que significa que cada valor tem um tipo de dado associado, e algumas operações requerem tipos específicos. Quando se passa um literal (como &#8216;<strong>Fábio</strong>&#8216;), ele é inicialmente interpretado como um text, a menos que se indique explicitamente um tipo diferente, como o varchar.</li>
<li><strong>Prevenção de Erros de Tipagem</strong>: Quando o tipo de dado esperado pelo procedimento não corresponde ao tipo inferido pelo PostgreSQL, o banco de dados pode não ser capaz de fazer a coerção automaticamente, resultando em erros. Especificar o tipo assegura que o valor será tratado corretamente.</li>
</ol>
<h3>Exemplo 02 &#8211; Inserir um novo produto na tabela</h3>
<p>Vamos criar um procedimento armazenado que permita inserir um novo produto na tabela de produtos de nosso banco de dados.</p>
<pre><span style="color: #ff0000;"><strong>CREATE OR REPLACE PROCEDURE inserir_produto (</strong></span>
<span style="color: #ff0000;"><strong>    p_cod_produto INT,</strong></span>
<span style="color: #ff0000;"><strong>    p_nome_produto VARCHAR(30),</strong></span>
<span style="color: #ff0000;"><strong>    p_descricao TEXT,</strong></span>
<span style="color: #ff0000;"><strong>    p_preco NUMERIC,</strong></span>
<span style="color: #ff0000;"><strong>    p_qtde_estoque SMALLINT</strong></span>
<span style="color: #ff0000;"><strong>)</strong></span>
<span style="color: #ff0000;"><strong>language plpgsql</strong></span>
<span style="color: #ff0000;"><strong>AS $$</strong></span>
<span style="color: #ff0000;"><strong>BEGIN</strong></span>
<span style="color: #ff0000;"><strong>    INSERT INTO Produtos(cod_produto, nome_produto, descricao, preco, qtde_estoque)</strong></span>
<span style="color: #ff0000;"><strong>    VALUES (p_cod_produto, p_nome_produto, p_descricao, p_preco, p_qtde_estoque);</strong></span>
<span style="color: #ff0000;"><strong>    RAISE NOTICE 'Produto % cadastrado com sucesso.', p_nome_produto;</strong></span>
<span style="color: #ff0000;"><strong>END;</strong></span>
<span style="color: #ff0000;"><strong>$$;</strong></span></pre>
<p>A instrução <strong>RAISE NOTICE</strong> emite uma mensagem para o console confirmando a inserção do registro.</p>
<p>Para executar o procedimento:</p>
<pre><span style="color: #ff0000;"><strong>CALL inserir_produto(4,'Detergente'::varchar,'Detergente neutro 500 ml'::text, 2.35, 2::smallint);</strong></span></pre>
<p>E então podemos verificar se produto foi inserido corretamente realizando uma consulta simples ao banco de dados:</p>
<pre><span style="color: #ff0000;"><strong>SELECT * FROM Produtos;</strong></span></pre>
<h3>Exemplo 03 &#8211; Atualizar o preço de um produto.</h3>
<p>Este procedimento atualiza o preço de um produto específico, identificado pelo seu código de produto:</p>
<pre><span style="color: #ff0000;"><strong>CREATE OR REPLACE PROCEDURE atualizar_preco(</strong></span>
<span style="color: #ff0000;"><strong>    p_cod_produto INT,</strong></span>
<span style="color: #ff0000;"><strong>    p_novo_preco NUMERIC</strong></span>
<span style="color: #ff0000;"><strong>)</strong></span>
<span style="color: #ff0000;"><strong>LANGUAGE plpgsql</strong></span>
<span style="color: #ff0000;"><strong>AS $$</strong></span>
<span style="color: #ff0000;"><strong>BEGIN</strong></span>
<span style="color: #ff0000;"><strong>    UPDATE Produtos</strong></span>
<span style="color: #ff0000;"><strong>    SET preco = p_novo_preco</strong></span>
<span style="color: #ff0000;"><strong>    WHERE cod_produto = p_cod_produto;</strong></span>
<span style="color: #ff0000;"><strong>    RAISE NOTICE 'Preço do produto % atualizado para %', p_cod_produto, p_novo_preco;</strong></span>
<span style="color: #ff0000;"><strong>END;</strong></span>
<span style="color: #ff0000;"><strong>$$;</strong></span></pre>
<p>Para executar o procedimento:</p>
<pre><span style="color: #ff0000;"><strong>CALL atualizar_preco(1, 3.80);</strong></span></pre>
<p>E então podemos verificar se produto teve seu preço corretamente atualizado realizando novamente uma consulta ao banco de dados:</p>
<pre><span style="color: #ff0000;"><strong>SELECT * FROM Produtos;</strong></span></pre>
<h3>Exemplo 04 &#8211; Procedimento para consultar produtos com estoque baixo</h3>
<p>Este procedimento retorna todos os produtos com quantidade em estoque abaixo de um valor especificado na chamada da procedure.</p>
<pre><span style="color: #ff0000;"><strong>CREATE OR REPLACE PROCEDURE consultar_estoque_baixo (</strong></span>
<span style="color: #ff0000;"><strong>    p_limite_estoque INTEGER</strong></span>
<span style="color: #ff0000;"><strong>)</strong></span>
<span style="color: #ff0000;"><strong>LANGUAGE plpgsql</strong></span>
<span style="color: #ff0000;"><strong>AS $$</strong></span>
<span style="color: #ff0000;"><strong>DECLARE resultado RECORD;</strong></span>
<span style="color: #ff0000;"><strong>BEGIN</strong></span>
<span style="color: #ff0000;"><strong>    FOR resultado in</strong></span>
<span style="color: #ff0000;"><strong>        SELECT cod_produto, nome_produto, qtde_estoque</strong></span>
<span style="color: #ff0000;"><strong>        FROM Produtos</strong></span>
<span style="color: #ff0000;"><strong>        WHERE qtde_estoque &lt; p_limite_estoque</strong></span>
<span style="color: #ff0000;"><strong>    LOOP</strong></span>
<span style="color: #ff0000;"><strong>        RAISE NOTICE 'Produto: %, Estoque: % ', resultado.nome_produto, resultado.qtde_estoque;</strong></span>
<span style="color: #ff0000;"><strong>    END LOOP;</strong></span>
<span style="color: #ff0000;"><strong>END;</strong></span>
<span style="color: #ff0000;"><strong>$$;</strong></span></pre>
<p>Para executar o procedimento:</p>
<pre><strong><span style="color: #ff0000;">CALL consultar_estoque_baixo(3);</span></strong></pre>
<p>Aqui, consultamos todos os produtos cujo estoque está abaixo de 3 unidades.</p>
<p>Devemos notar alguns detalhes interessantes sobre a consulta realizada pelo procedimento armazenado deste exemplo:</p>
<h4>Destino dos dados</h4>
<p>Quando se usa a instrução SELECT em um procedimento armazenado no PostgreSQL, o resultado deve ser direcionado para algum lugar, como uma variável, uma tabela temporária, ou ser retornado ao chamador da função ou procedimento.</p>
<p>Caso contrário, o PostgreSQL gera a mensagem &#8220;consulta não tem destino para os dados resultantes&#8221; (no inglês: &#8220;<em>query has no destination for result data</em>&#8220;).</p>
<p>Se for necessário apenas exibir os resultados no console em um procedimento armazenado, sem retorná-los em uma consulta, podemos usar um loop para iterar sobre os resultados e então exibi-los com RAISE NOTICE.</p>
<h4>O tipo RECORD</h4>
<p>O tipo RECORD é um tipo de dado genérico no PL/pgSQL que pode acomodar uma linha de dados com colunas de diferentes tipos. Ao contrário de outros tipos de variáveis, que têm um tipo de dado específico (como INTEGER, VARCHAR, etc.), o RECORD pode armazenar qualquer linha inteira de resultado, independentemente de quantas colunas ou de quais tipos de dados essas colunas têm.</p>
<p>A instrução DECLARE r RECORD; em PL/pgSQL é usada para declarar uma variável de tipo RECORD.</p>
<p>Quando usamos o RECORD dentro de um loop FOR IN que itera sobre os resultados de uma consulta, o RECORD é automaticamente &#8220;preenchido&#8221; com os valores das colunas para cada linha retornada. Isso permite acessar os valores dessas colunas dentro do corpo do loop.</p>
<p>Além disso, uma vez que a linha é armazenada no RECORD, podemos acessar as colunas individuais usando a notação r.coluna, onde r é o nome da variável RECORD e coluna é o nome da coluna que desejamos acessar.</p>
<h3>Exemplo 05 &#8211; Inserir e atualizar valores no mesmo procedimento.</h3>
<p>Exemplo: criar um procedimento armazenado que insira um novo produto na tabela de produtos, ao mesmo tempo em que aplica um desconto percentual especificado a todos os produtos logo após.</p>
<pre><span style="color: #ff0000;"><strong>CREATE OR REPLACE PROCEDURE insere_atualiza (</strong></span><span style="color: #ff0000;"><strong>cod int, prod varchar(30), descr text, valor numeric, qtde smallint, desc_perc numeric)</strong></span>
<span style="color: #ff0000;"><strong>LANGUAGE plpgsql</strong></span>
<span style="color: #ff0000;"><strong>AS $$</strong></span>
<span style="color: #ff0000;"><strong>BEGIN</strong></span>
<span style="color: #ff0000;"><strong>    INSERT INTO produtos(cod_produto, nome_produto, descricao, preco, qtde_estoque)</strong></span>
<span style="color: #ff0000;"><strong>    VALUES (cod, prod, descr, valor, qtde);</strong></span>
<span style="color: #ff0000;"><strong>    UPDATE produtos SET preco = preco * (100 - desc_perc) / 100;</strong></span>
<span style="color: #ff0000;"><strong>END;</strong></span>
<span style="color: #ff0000;"><strong>$$;</strong></span></pre>
<p>Executar o procedimento:</p>
<pre><span style="color: #ff0000;"><strong>CALL insere_atualiza(6,'Alvejante'::varchar(30),'Alvejante de roupas'::text, 12.30, 12::smallint, 10);</strong></span></pre>
<p>Obs.: O tipo numeric geralmente não precisa ser informado (cast) na chamada do procedimento.</p>
<h2>Como excluir um procedimento armazenado</h2>
<p>Para excluir um procedimento armazenado no PostgreSQL devemos usar a declaração DROP PROCEDURE, como segue:</p>
<pre><span style="color: #800080;"><strong>DROP PROCEDURE nome_procedimento;</strong></span></pre>
<p>Por exemplo, para excluir o procedimento <strong><em>consultar_estoque_baixo</em></strong>:</p>
<pre><span style="color: #ff0000;"><strong>DROP PROCEDURE consultar_estoque_baixo;</strong></span></pre>
<p>Se houver mais de um procedimento armazenado como mesmo nome, mas com quantidade e tipos de parâmetros distintos (<strong>polimorfismo</strong>), devemos indicar os tipos de dados dos argumentos ao exclui-lo:</p>
<pre><span style="color: #ff0000;"><strong>DROP PROCEDURE insere_atualiza(int,varchar,text,numeric,smallint,numeric);</strong></span></pre>
<h2>Conclusão</h2>
<p>Neste artigo vimos como começar a trabalhar com procedimentos armazenados no PostgreSQL. com alguns exemplos simples de criação de procedures simples. O recurso é muito útil para simplificar código e facilitar a programação de tarefas no banco de dados, principalmente quando as declarações SQL precisam ser executadas a partir de uma aplicação escrita em alguma linguagem de programação para acesso direto dos usuários.</p>
<p>Estudaremos recursos mais avançados de procedimentos armazenados nos próximos artigos, assim como outras formas de programação existentes para bancos de dados PostgreSQL, como Funções e Triggers.</p>
<p>Para saber mais sobre Procedimentos Armazenados no PostgreSQL, assista ao vídeo a seguir da Bóson Treinamentos no YouTube:</p>
<p><iframe loading="lazy" title="YouTube video player" src="https://www.youtube.com/embed/Ig1hGqiPROI?si=ywRszZBlyo3BYNW0" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<p>O post <a href="https://www.bosontreinamentos.com.br/postgresql-banco-dados/procedimentos-armazenados-em-postgresql-stored-procedures/">Procedimentos Armazenados em PostgreSQL (Stored Procedures)</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bosontreinamentos.com.br/postgresql-banco-dados/procedimentos-armazenados-em-postgresql-stored-procedures/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Como apagar linhas de uma tabela com DELETE FROM  &#8211; SQL Server</title>
		<link>https://www.bosontreinamentos.com.br/sql-com-sql-server/como-apagar-linhas-de-uma-tabela-com-delete-from-sql-server/</link>
					<comments>https://www.bosontreinamentos.com.br/sql-com-sql-server/como-apagar-linhas-de-uma-tabela-com-delete-from-sql-server/?noamp=mobile#comments</comments>
		
		<dc:creator><![CDATA[Fábio dos Reis]]></dc:creator>
		<pubDate>Thu, 11 Jul 2024 11:14:56 +0000</pubDate>
				<category><![CDATA[SQL com SQL Server]]></category>
		<category><![CDATA[Bancos de Dados]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQL Server]]></category>
		<guid isPermaLink="false">https://www.bosontreinamentos.com.br/?p=20191</guid>

					<description><![CDATA[<p>DELETE FROM &#8211; Apagar Registros no SQL Server A cláusula DELETE FROM em SQL é usada para remover registros de uma tabela. Esta cláusula permite apagar uma ou mais linhas de uma tabela com base em uma condição especificada na cláusula WHERE. Se a cláusula WHERE não for usada, todos os registros da tabela serão removidos (cuidado!!!). Sintaxe Básica DELETE FROM nome_da_tabela WHERE condição; Exemplos 1. Apagar registros específicos Se quisermos remover todos os livros da tabela Livro cujo preço é maior que R$ 100,00: DELETE FROM Livro WHERE PrecoLivro &#62; 100.00; 2. Apagar todas as linhas de uma tabela Podemos remover todos os registros da tabela Autor, deixando a tabela vazia: DELETE FROM Autor; Observações importantes Integridade Referencial: Ao excluir registros que são referenciados por chaves estrangeiras em outras tabelas, é importante considerar as restrições de integridade referencial para evitar a violação dessas restrições. Backups: Antes de executar operações de exclusão em massa, é altamente recomendável fazer backup dos dados, pois a operação de DELETE é irreversível (não tem Ctrl+Z!!!). Performance: Para limpar totalmente tabelas grandes, operações de DELETE podem ser lentas e consumir muitos recursos. Em alguns casos, pode ser mais eficiente truncar a tabela (usando TRUNCATE TABLE) [...]</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/sql-com-sql-server/como-apagar-linhas-de-uma-tabela-com-delete-from-sql-server/">Como apagar linhas de uma tabela com DELETE FROM  &#8211; SQL Server</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>DELETE FROM &#8211; Apagar Registros no SQL Server</h2>
<p>A cláusula <strong>DELETE FROM</strong> em SQL é usada para remover registros de uma tabela. Esta cláusula permite apagar uma ou mais linhas de uma tabela com base em uma condição especificada na <a href="https://www.bosontreinamentos.com.br/sql-com-sql-server/13-t-sql-where-filtrando-registros-em-uma-consulta-sql-server/">cláusula WHERE</a>. Se a cláusula WHERE não for usada, todos os registros da tabela serão removidos (cuidado!!!).</p>
<h3>Sintaxe Básica</h3>
<pre><span style="color: #800080;"><strong>DELETE FROM nome_da_tabela</strong></span>
<span style="color: #800080;"><strong>WHERE condição;</strong></span></pre>
<h3>Exemplos</h3>
<p>1. Apagar registros específicos</p>
<p>Se quisermos remover todos os livros da tabela Livro cujo preço é maior que R$ 100,00:</p>
<pre><strong>DELETE FROM Livro</strong>
<strong>WHERE PrecoLivro &gt; 100.00;</strong></pre>
<p>2. Apagar todas as linhas de uma tabela</p>
<p>Podemos remover todos os registros da tabela Autor, deixando a tabela vazia:</p>
<pre><strong>DELETE FROM Autor;</strong></pre>
<h3>Observações importantes</h3>
<p><strong>Integridade Referencial</strong>: Ao excluir registros que são referenciados por chaves estrangeiras em outras tabelas, é importante considerar as restrições de integridade referencial para evitar a violação dessas restrições.<br />
<strong>Backups</strong>: Antes de executar operações de exclusão em massa, é altamente recomendável fazer <a href="https://www.bosontreinamentos.com.br/sql-com-sql-server/como-realizar-backup-e-restore-no-microsoft-sql-server/">backup dos dados</a>, pois a operação de DELETE é irreversível (não tem Ctrl+Z!!!).<br />
<strong>Performance</strong>: Para limpar totalmente tabelas grandes, operações de DELETE podem ser lentas e consumir muitos recursos. Em alguns casos, pode ser mais eficiente truncar a tabela (usando <a href="https://www.bosontreinamentos.com.br/sql-com-sql-server/9-t-sql-truncate-table-excluindo-todos-os-dados-de-uma-tabela-sql-server/">TRUNCATE TABLE</a>) ou recriá-la.</p>
<p>Para saber mais sobre SQL DELETE, assista a um vídeo da Bóson Treinamentos no YouTube:</p>
<p><iframe loading="lazy" title="YouTube video player" src="https://www.youtube.com/embed/XW37gfHvofE?si=5wu4UW_rjuYGYIgf" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<h3>Colabore com a Bóson Treinamentos</h3>
<p>Ajude o canal adquirindo meus cursos na Udemy:</p>
<ul>
<li>Bancos de Dados com MySQL Básico: <a href="https://bit.ly/35QdWE4" target="_blank" rel="noopener">https://bit.ly/35QdWE4</a></li>
<li>Lógica de Programação com Português Estruturado: <a href="https://bit.ly/3QKPn22" target="_blank" rel="noopener">https://bit.ly/3QKPn22</a></li>
<li>Programação em Python do Zero: <a href="https://bit.ly/python-boson" target="_blank" rel="noopener">https://bit.ly/python-boson</a></li>
</ul>
<p>Adquira também livros e outros itens na loja da Bóson Treinamentos na Amazon e ajude o canal a se manter e crescer: <a href="https://www.amazon.com.br/shop/bosontreinamentos" target="_blank" rel="noopener">https://www.amazon.com.br/shop/bosontreinamentos</a></p>
<p>O post <a href="https://www.bosontreinamentos.com.br/sql-com-sql-server/como-apagar-linhas-de-uma-tabela-com-delete-from-sql-server/">Como apagar linhas de uma tabela com DELETE FROM  &#8211; SQL Server</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bosontreinamentos.com.br/sql-com-sql-server/como-apagar-linhas-de-uma-tabela-com-delete-from-sql-server/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Como usar os tipos de dados char, nchar, varchar e nvarchar no SQL Server</title>
		<link>https://www.bosontreinamentos.com.br/sql-com-sql-server/como-usar-os-tipos-de-dados-char-nchar-varchar-e-nvarchar-no-sql-server/</link>
					<comments>https://www.bosontreinamentos.com.br/sql-com-sql-server/como-usar-os-tipos-de-dados-char-nchar-varchar-e-nvarchar-no-sql-server/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Fábio dos Reis]]></dc:creator>
		<pubDate>Thu, 04 Jul 2024 11:42:32 +0000</pubDate>
				<category><![CDATA[SQL com SQL Server]]></category>
		<category><![CDATA[Bancos de Dados]]></category>
		<category><![CDATA[Modelagem de Dados]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[SQL Server]]></category>
		<guid isPermaLink="false">http://www.bosontreinamentos.com.br/?p=13125</guid>

					<description><![CDATA[<p>Tipos de dados char, nchar, varchar e nvarchar &#8211; SQL Server Os tipos de dados CHAR, NCHAR, VARCHAR e NVARCHAR são usados para armazenar dados de texto no SQL Server. Cada um é empregado em uma situação distinta, e saber escolher o tipo de dados adequado pode afetar a performance e o uso de espaço no banco de dados. Neste tutorial vou mostrar cada um desses tipos, suas diferenças e quando usá-los. Tipos de Texto no SQL Server Os tipos nchar e nvarchar permitem armazenar caracteres Unicode, ao passo que char e varchar não o permitem &#8211; é até possível armazenar Unicode com esses tipos, mas por meio de alguns &#8220;truques&#8221; no código. Porém, os tipos nchar e nvarchar ocupam o dobro de espaço de armazenamento. Desta forma, recomenda-se utilizá-los apenas caso seja necessário suporte a Unicode na tabela &#8211; o que é bastante comum. Os tipos char e nchar são tipos de tamanho fixo, o que significa que eles reservam espaço de armazenamento para a quantidade de caracteres que foi especificada em suas declarações, mesmo que o espaço não seja totalmente utilizado. Por exemplo, podemos criar um campo char ou nchar para 20 caracteres mas armazenar apenas 15 &#8211; [...]</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/sql-com-sql-server/como-usar-os-tipos-de-dados-char-nchar-varchar-e-nvarchar-no-sql-server/">Como usar os tipos de dados char, nchar, varchar e nvarchar no SQL Server</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Tipos de dados char, nchar, varchar e nvarchar &#8211; SQL Server</h2>
<p>Os tipos de dados CHAR, NCHAR, VARCHAR e NVARCHAR são usados para armazenar dados de texto no SQL Server. Cada um é empregado em uma situação distinta, e saber escolher o tipo de dados adequado pode afetar a performance e o uso de espaço no banco de dados.</p>
<p>Neste tutorial vou mostrar cada um desses tipos, suas diferenças e quando usá-los.</p>
<h3>Tipos de Texto no SQL Server</h3>
<p>Os tipos nchar e nvarchar permitem armazenar caracteres Unicode, ao passo que char e varchar não o permitem &#8211; é até possível armazenar Unicode com esses tipos, mas por meio de alguns &#8220;truques&#8221; no código. Porém, os tipos nchar e nvarchar ocupam o dobro de espaço de armazenamento. Desta forma, recomenda-se utilizá-los apenas caso seja necessário suporte a Unicode na tabela &#8211; o que é bastante comum.</p>
<p>Os tipos char e nchar são tipos de tamanho fixo, o que significa que eles reservam espaço de armazenamento para a quantidade de caracteres que foi especificada em suas declarações, mesmo que o espaço não seja totalmente utilizado. Por exemplo, podemos criar um campo char ou nchar para 20 caracteres mas armazenar apenas 15 &#8211; os outros 5 que ficaram vagos irão ocupar espaço da mesma maneira.</p>
<p>Recomenda-se usar esses tipos caso os dados armazenados sempre ocupem o tamanho máximo especificado na declaração da coluna.</p>
<p>Já os tipos varchar e nvarchar são tipos de tamanho variável, de modo que o espaço ocupado corresponderá à quantidade de caracteres que efetivamente são armazenados + 2 (2 bytes de registro do comprimento &#8211; overhead), independente do tamanho máximo declarado.</p>
<h3>Características dos tipos CHAR, NCHAR, VARCHAR e NVARCHAR</h3>
<p><strong>CHAR</strong></p>
<ul>
<li>Descrição: Armazena dados de texto com comprimento fixo.</li>
<li>Tamanho: O comprimento é definido ao criar a coluna e todos os valores terão exatamente esse tamanho &#8211; ou seja, o comprimento é fixo. <em>Espaços em branco são adicionados para preencher o comprimento se necessário</em>.</li>
<li>Uso: Dados de tamanho fixo, como códigos de produtos ou identificadores.</li>
</ul>
<p><strong>NCHAR</strong></p>
<ul>
<li>Descrição: Similar ao CHAR (também comprimento fixo), mas armazena dados de texto em formato Unicode.</li>
<li>Tamanho: Cada caractere ocupa 2 bytes, permitindo armazenar caracteres de múltiplos idiomas.</li>
<li>Uso: Usado para dados de texto internacionalizados ou quando é necessário suportar vários idiomas.</li>
</ul>
<p><strong>VARCHAR</strong></p>
<ul>
<li>Descrição: Armazena dados de texto com comprimento variável.</li>
<li>Tamanho: O comprimento máximo é definido ao criar a coluna, mas apenas o espaço necessário para armazenar o valor real é utilizado. Ou seja, ocupa espaço de acordo com o valor armazenado na coluna.</li>
<li>Uso: Ideal para colunas onde os tamanhos dos valores podem variar significativamente, como nomes, descrições ou endereços.</li>
</ul>
<p><strong>NVARCHAR</strong></p>
<ul>
<li>Descrição: Similar ao VARCHAR, mas armazena dados de texto em formato Unicode.</li>
<li>Tamanho: Cada caractere ocupa 2 bytes, semelhante ao NCHAR, mas o espaço é utilizado de forma mais eficiente para comprimentos variáveis.</li>
<li>Uso: Usado para dados de texto internacionalizados ou quando é necessário suportar vários idiomas, com comprimentos variáveis.</li>
</ul>
<h3>Performance dos tipos de texto</h3>
<p>Com relação à performance desses tipos de texto no SQL Server, temos que:</p>
<ul>
<li>CHAR e NCHAR podem ser mais rápidos para acesso em colunas onde todos os valores têm tamanho fixo.</li>
<li>Já os tipos VARCHAR e NVARCHAR são mais eficientes em termos de espaço para colunas onde os tamanhos dos valores variam.</li>
</ul>
<h3>Exemplos de uso</h3>
<h4>1. Tipos CHAR e NCHAR</h4>
<p>Criamos uma tabela com dois campos, um do tipo CHAR e outro do tipo NCHAR</p>
<pre><strong>CREATE TABLE ExemploCharNChar (</strong>
<strong>Codigo CHAR(5),</strong>
<strong>Item NCHAR(10)</strong>
<strong>);</strong></pre>
<p>Inserimos uma linha de teste nessa tabela. Para o campo &#8220;Item&#8221; usarei um dado em outro idioma, inclusive com outro conjunto de caracteres &#8211; no caso, caracteres japoneses.</p>
<p>Note o caractere &#8216;N&#8217; que precede o valor a ser armazenado, para indicar ao SQL Server que se trata de um valor Unicode.</p>
<pre><strong>INSERT INTO ExemploCharNChar (Codigo, Item)</strong>
<strong>VALUES ('012', N'ピザ');</strong></pre>
<p>Consegue descobrir que item foi inserido?</p>
<p>E realizamos uma consulta para ver o dado inserido.</p>
<pre><strong>SELECT * FROM ExemploCharNChar;</strong></pre>
<p><strong>Resultado:</strong></p>
<pre><span style="color: #000000;"><strong>Codigo  Item</strong></span>
<span style="color: #000000;"><strong>012     ピザ </strong></span></pre>
<h4>2. Tipos VARCHAR e NVARCHAR</h4>
<p>Agora vamos criar outra tabela também com dois campos, um do tipo VARCHAR e outro do tipo NVARCHAR</p>
<pre><strong>CREATE TABLE ExemploVarcharNVarchar (</strong>
<strong>Descricao VARCHAR(50),</strong>
<strong>Pedido NVARCHAR(100)</strong>
<strong>);</strong></pre>
<p>Inserimos uma linha de teste nessa tabela. Para o campo &#8220;Pedido&#8221; usarei novamente um dado em idioma japonês, desta vez com mais caracteres.</p>
<pre><strong>INSERT INTO ExemploVarcharNVarchar (Descricao, Pedido)</strong>
<strong>VALUES ('Prato Típico Italiano', N'ピザが食べたい.');</strong></pre>
<p>E realizamos a consulta para ver o dado inserido.</p>
<pre><strong>SELECT * FROM ExemploVarcharNVarchar;</strong></pre>
<p><strong>Resultado:</strong></p>
<pre><span style="color: #000000;"><strong>Descricao             Pedido</strong></span>
<span style="color: #000000;"><strong>Prato Típico Italiano ピザが食べたい.</strong></span></pre>
<h3>Importante</h3>
<p>Uma dica importante é a seguinte: Hoje em dia, os sistemas operacionais e plataformas de desenvolvimento usam internamente o sistema Unicode.</p>
<p>Sendo assim, se usarmos os tipos nvarchar em vez de varchar, e nchar em vez de char, evitamos que ocorram conversões de codificação sempre que operaçoes de leitura ou escrita forem realizadas no banco de dados.</p>
<p>Essas conversões consomem recursos do servidor e podem ocasionar erros, ainda que raramente, além do que não é fácil recuperar de erros de conversão em uma tabela.</p>
<h3>Conclusão</h3>
<p>Neste tutorial estudamos os tipos de dados CHAR, NCHAR, VARCHAR e NVARCHAR no SQL Server, suas diferenças e exemplos de uso.</p>
<p>Ao escolher o tipo de dados para colunas de texto, considere o tamanho dos dados que você espera armazenar, a necessidade de suporte a múltiplos idiomas e a eficiência de armazenamento. Para texto que precisa ser armazenado em múltiplos idiomas, use os tipos <strong>NCHAR</strong> ou <strong>NVARCHAR</strong>. Para texto de tamanho fixo, use <strong>CHAR</strong>, e para tamanho variável, use <strong>VARCHAR</strong>.</p>
<p>Lembre-se:</p>
<ul>
<li>Usamos CHAR e NCHAR quando o comprimento dos dados for fixo.</li>
<li>Usamos VARCHAR e NVARCHAR quando o comprimento dos dados for variável.</li>
<li>A letra &#8216;N&#8217; antes dos tipos Unicode (NCHAR e NVARCHAR) indica que eles suportam caracteres Unicode.</li>
</ul>
<p>* <strong>ピザ</strong> significa &#8220;pizza&#8221; e <strong>ピザが食べたい</strong> significa &#8220;quero comer pizza&#8221; (&#8220;piza ga tabetai&#8221;).</p>
<h3>Colabore com a Bóson Treinamentos</h3>
<p>Ajude o canal adquirindo meus cursos na Udemy:</p>
<ul>
<li>Bancos de Dados com MySQL Básico: <a href="https://bit.ly/35QdWE4" target="_blank" rel="noopener">https://bit.ly/35QdWE4</a></li>
<li>Lógica de Programação com Português Estruturado: <a href="https://bit.ly/3QKPn22" target="_blank" rel="noopener">https://bit.ly/3QKPn22</a></li>
<li>Programação em Python do Zero: <a href="https://bit.ly/python-boson" target="_blank" rel="noopener">https://bit.ly/python-boson</a></li>
</ul>
<p>Adquira também livros e outros itens na loja da Bóson Treinamentos na Amazon e ajude o canal a se manter e crescer: <a href="https://www.amazon.com.br/shop/bosontreinamentos" target="_blank" rel="noopener">https://www.amazon.com.br/shop/bosontreinamentos</a></p>
<p>O post <a href="https://www.bosontreinamentos.com.br/sql-com-sql-server/como-usar-os-tipos-de-dados-char-nchar-varchar-e-nvarchar-no-sql-server/">Como usar os tipos de dados char, nchar, varchar e nvarchar no SQL Server</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bosontreinamentos.com.br/sql-com-sql-server/como-usar-os-tipos-de-dados-char-nchar-varchar-e-nvarchar-no-sql-server/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Como Exportar Tabela MySQL para CSV – Tutorial Prático</title>
		<link>https://www.bosontreinamentos.com.br/mysql/como-exportar-dados-de-uma-tabela-como-arquivo-csv-no-mysql/</link>
					<comments>https://www.bosontreinamentos.com.br/mysql/como-exportar-dados-de-uma-tabela-como-arquivo-csv-no-mysql/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Fábio dos Reis]]></dc:creator>
		<pubDate>Mon, 03 Jun 2024 17:47:40 +0000</pubDate>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Bancos de Dados]]></category>
		<guid isPermaLink="false">http://www.bosontreinamentos.com.br/?p=18279</guid>

					<description><![CDATA[<p>Exportar dados de uma tabela como arquivo CSV no MySQL Em um artigo anterior mostrei como carregar um arquivo CSV em uma tabela no MySQL. Agora vou mostrar como realizar o processo inverso &#8211; como exportar os dados de uma tabela de um banco de dados MySQL para um arquivo CSV, usando declarações SQL. Para tal usaremos a declaração SQL INTO OUTFILE (literalmente, &#8220;dentro de um arquivo externo&#8220;), cuja sintaxe básica é a seguinte: SELECT colunas FROM tabela INTO OUTFILE 'caminho/arquivo.csv' FIELDS TERMINATED BY 'delimitador' ENCLOSED BY 'caractere' LINES TERMINATED BY 'tipo_quebra'; Onde temos que: SELECT &#8211; Aqui informamos os nomes das colunas que farão parte do arquivo CSV FROM &#8211; Especificamos a tabela a ser consultada (para incluir dados de mais de uma tabela, podemos usar INNER JOIN) INTO OUTFILE – Determina o nome do arquivo e local onde o conteúdo da tabela será exportado no formato CSV. FIELDS TERMINATED BY – Aqui devemos informar qual delimitador (separador de campos) é desejado no arquivo CSV. ENCLOSED BY – Usado para especificar que aspas duplas &#8220;&#8221; englobam valores de dados LINES TERMINATED BY – Especifica o código ou caractere usado para indicar quebra de linha. Vamos a alguns exemplos de [...]</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/mysql/como-exportar-dados-de-uma-tabela-como-arquivo-csv-no-mysql/">Como Exportar Tabela MySQL para CSV – Tutorial Prático</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Exportar dados de uma tabela como arquivo CSV no MySQL</h1>
<p>Em um artigo anterior mostrei <a href="http://www.bosontreinamentos.com.br/mysql/como-carregar-um-arquivo-csv-em-tabela-no-mysql/">como carregar um arquivo CSV em uma tabela no MySQL</a>. Agora vou mostrar como realizar o processo inverso &#8211; como exportar os dados de uma tabela de um banco de dados MySQL para um arquivo CSV, usando declarações SQL.</p>
<p>Para tal usaremos a declaração SQL <strong>INTO OUTFILE</strong> (literalmente, &#8220;<em>dentro de um arquivo externo</em>&#8220;), cuja sintaxe básica é a seguinte:</p>
<pre><strong><span style="color: #800080;">SELECT colunas</span></strong>
<strong><span style="color: #800080;">FROM tabela</span></strong>
<strong><span style="color: #800080;">INTO OUTFILE '<em>caminho/arquivo.csv</em>'</span></strong>
<strong><span style="color: #800080;">FIELDS TERMINATED BY '<em>delimitador'</em></span></strong>
<strong><span style="color: #800080;">ENCLOSED BY '<em>caractere'</em></span></strong>
<strong><span style="color: #800080;">LINES TERMINATED BY '<em>tipo_quebra'</em>;</span></strong></pre>
<p>Onde temos que:</p>
<ul>
<li><strong>SELECT</strong> &#8211; Aqui informamos os nomes das colunas que farão parte do arquivo CSV</li>
<li><strong>FROM</strong> &#8211; Especificamos a tabela a ser consultada (para incluir dados de mais de uma tabela, podemos usar <a href="https://www.bosontreinamentos.com.br/mysql/mysql-inner-join-consultar-dados-em-duas-ou-mais-tabelas-29/">INNER JOIN</a>)</li>
<li><strong>INTO OUTFILE</strong> – Determina o nome do arquivo e local onde o conteúdo da tabela será exportado no formato CSV.</li>
<li><strong>FIELDS TERMINATED BY</strong> – Aqui devemos informar qual delimitador (separador de campos) é desejado no arquivo CSV.</li>
<li><strong>ENCLOSED BY</strong> – Usado para especificar que aspas duplas &#8220;&#8221; englobam valores de dados</li>
<li><strong>LINES TERMINATED BY</strong> – Especifica o código ou caractere usado para indicar quebra de linha.</li>
</ul>
<p>Vamos a alguns exemplos de exportação de arquivos CSV no MySQL.</p>
<h3>Exemplo 01</h3>
<p>Vejamos um exemplo, usando a tabela de autores que importamos na lição passada. Vamos exportar o conteúdo dessa tabela para um arquivo CSV de nome autores_bkp.csv:</p>
<pre><strong><span style="color: #ff0000;">SELECT ID_autor, Nome_Autor, Sobrenome_Autor</span></strong>
<strong><span style="color: #ff0000;">FROM tbl_autores</span></strong>
<strong><span style="color: #ff0000;">INTO OUTFILE 'C:/SQL/autores_bkp.csv';</span></strong></pre>
<div id="attachment_18297" style="width: 427px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-18297" class="wp-image-18297 size-full" title="Exportar arquivo CSV de tabela em banco MySQL" src="https://www.bosontreinamentos.com.br/wp-content/uploads/2022/06/exportar-arquivo-csv-mysql-01.png" alt="Exemplo de comando SELECT INTO OUTFILE no MySQL" width="417" height="215" /><p id="caption-attachment-18297" class="wp-caption-text">Tabela exportada como CSV</p></div>
<p>Se nenhuma opção for informada, será empregado o caractere de tabulação como delimitador, por padrão.</p>
<h3>Exemplo 02</h3>
<p>Podemos especificar um delimitador diferente e outras configurações da seguinte forma:</p>
<pre><strong><span style="color: #ff0000;">SELECT ID_autor, Nome_Autor, Sobrenome_Autor</span></strong>
<strong><span style="color: #ff0000;">FROM tbl_autores</span></strong>
<strong><span style="color: #ff0000;">INTO OUTFILE 'C:/SQL/autores_bkp.csv'</span></strong>
<strong><span style="color: #ff0000;">FIELDS TERMINATED BY ','</span></strong>
<strong><span style="color: #ff0000;">ENCLOSED BY '"'</span></strong>
<strong><span style="color: #ff0000;">LINES TERMINATED BY '\n';</span></strong></pre>
<div id="attachment_18298" style="width: 412px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-18298" class="wp-image-18298 size-full" title="Exportar arquivo CSV de tabela em banco MySQL" src="http://www.bosontreinamentos.com.br/wp-content/uploads/2022/06/exportar-arquivo-csv-mysql-02.png" alt="Exportar arquivo CSV de tabela em banco MySQL" width="402" height="212" /><p id="caption-attachment-18298" class="wp-caption-text">Tabela exportada com opções diferentes</p></div>
<p>Neste caso usamos a vírgula como delimitador, e as aspas duplas &#8220;&#8221; para englobar os valores de dados.</p>
<h3>Exemplo 03</h3>
<p>E se quisermos incluir também os nomes das colunas como títulos? Neste caso, podemos usar a declaração UNION, como segue:</p>
<pre><strong><span style="color: #ff0000;">(SELECT 'ID_autor', 'Nome_Autor', 'Sobrenome_Autor')</span></strong>
<strong><span style="color: #ff0000;">UNION</span></strong>
<strong><span style="color: #ff0000;">SELECT ID_autor, Nome_Autor, Sobrenome_Autor</span></strong>
<strong><span style="color: #ff0000;">FROM tbl_autores</span></strong>
<strong><span style="color: #ff0000;">INTO OUTFILE 'C:/SQL/autores_bkp.csv'</span></strong>
<strong><span style="color: #ff0000;">FIELDS TERMINATED BY ','</span></strong>
<strong><span style="color: #ff0000;">LINES TERMINATED BY '\n';</span></strong></pre>
<div id="attachment_18299" style="width: 585px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-18299" class="wp-image-18299 size-full" title="Exportar arquivo CSV de tabela em banco MySQL" src="http://www.bosontreinamentos.com.br/wp-content/uploads/2022/06/exportar-arquivo-csv-mysql-03.png" alt="Exportar arquivo CSV de tabela em banco MySQL" width="575" height="245" srcset="https://www.bosontreinamentos.com.br/wp-content/uploads/2022/06/exportar-arquivo-csv-mysql-03.png 575w, https://www.bosontreinamentos.com.br/wp-content/uploads/2022/06/exportar-arquivo-csv-mysql-03-420x179.png 420w" sizes="auto, (max-width: 575px) 100vw, 575px" /><p id="caption-attachment-18299" class="wp-caption-text">Tabela exportada com CSV com cabeçalhos de colunas</p></div>
<p>Note agora que a primeira linha do arquivo contém nomes de colunas, conforme informado na primeira declaração SELECT, antes da palavra-chave UNION. Não usei nesse caso as aspas duplas para englobar os dados (opção ENCLOSED BY).</p>
<p>É isso aí! Mostrei um processo simples para salvar os dados de tabelas do MySQL em um arquivo separado por vírgulas (CSV), com alguns exemplos de codificação, que pode ser aberto em editores de planilhas ou ainda importado em outros bancos de dados.</p>
<p>Prefere assistir a uma aula? Então assista ao vídeo da Bóson Treinamentos no YouTube sobre Arquivos CSV no MySQL:</p>
<p><iframe loading="lazy" title="YouTube video player" src="https://www.youtube.com/embed/5ddHcVBusQg?si=mV4STXday0y_XeLq" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<h3>Leia Também: <a href="https://www.bosontreinamentos.com.br/mysql/curso-de-mysql-grant-e-revoke-definindo-privilegios-de-acesso-aos-bancos-de-dados/">Definir privilégios de acesso a bancos de dados MySQL</a></h3>
<h2>Perguntas Frequentes (FAQ)</h2>
<h4><strong>1. Como eu exporto uma tabela inteira do MySQL  para CSV usando SQL?</strong></h4>
<p>Para isso podemos usar a instrução SQL a seguir:</p>
<pre><strong>SELECT * </strong>
<strong>FROM nome_da_tabela </strong>
<strong>INTO OUTFILE '/caminho/arquivo.csv' </strong>
<strong>FIELDS TERMINATED BY ',' </strong>
<strong>OPTIONALLY ENCLOSED BY '"' </strong>
<strong>LINES TERMINATED BY '\n';</strong></pre>
<p>Isso exporta todas as linhas e colunas para o arquivo especificado.</p>
<h4><strong>2. Posso customizar o formato do CSV, como separador ou delimitação de texto?</strong></h4>
<p>Sim, você pode, usando por exemplo as seguintes opções:</p>
<ul>
<li>TERMINATED BY &#8216;,&#8217; para definir o separador de campos (como vírgula ou ponto e vírgula),</li>
<li>OPTIONALLY ENCLOSED BY &#8216;&#8221;&#8216; para envolver campos de texto com aspas,</li>
<li>LINES TERMINATED BY &#8216;\n&#8217; (ou &#8216;\r\n&#8217;) para controlar a quebra de linha</li>
</ul>
<h4>3. Onde o arquivo CSV é criado após a exportação?</h4>
<p>Se não for empregado um caminho absoluto, o arquivo será salvo no diretório de dados do servidor MySQL.<br />
Mas se você deseja salvá-lo outro local, use o caminho completo no INTO OUTFILE e tenha a permissão adequada.</p>
<h4>4. Preciso de permissões especiais para usar INTO OUTFILE?</h4>
<p>Sim, a conta do MySQL precisa da permissão FILE, e o diretório de saída deve permitir que o servidor grave.<br />
Caso contrário, ocorrerá erro de acesso ou de permissão negada .</p>
<h4>5. Como garantir que o arquivo CSV tenha cabeçalho com nomes de colunas?</h4>
<p>O INTO OUTFILE só exporta dados, sem cabeçalhos.<br />
Para incluir nomes de colunas, pode-se usar uma cláusula UNION ou aplicar um SELECT &#8216;col1&#8217;, &#8216;col2&#8217;, … UNION ALL SELECT * … antes do INTO OUTFILE.</p>
<h4>6. INTO OUTFILE sobrescreve arquivos existentes?</h4>
<p>Não. Se o arquivo já existir, o MySQL retorna um erro.<br />
Você deve removê-lo manualmente antes de executar novamente o comando.</p>
<h4>7. Há limitações para exportar via SELECT INTO OUTFILE em conjuntos Unix ou combinados UNION?</h4>
<p>Sim, INTO OUTFILE deve vir no final da instrução SELECT.<br />
Evite colocá-lo dentro de <a href="https://www.bosontreinamentos.com.br/bancos-de-dados/o-que-e-uma-subconsulta-sql-subquery/">subconsultas</a> ou antes de cláusulas UNION para evitar erros</p>
<h4>8. Posso usar INTO DUMPFILE em vez de OUTFILE para CSV?</h4>
<p>Não. A opção INTO DUMPFILE gera um único registro bruto sem delimitadores, sendo útil apenas para binários. Para arquivos CSV, devemos usar a opção INTO OUTFILE.</p>
<h3>Colabore com a Bóson Treinamentos</h3>
<p>Ajude o canal adquirindo meus cursos na Udemy:</p>
<ul>
<li>Bancos de Dados com MySQL Básico: <a href="https://bit.ly/35QdWE4" target="_blank" rel="noopener">https://bit.ly/35QdWE4</a></li>
<li>Lógica de Programação com Português Estruturado: <a href="https://bit.ly/3QKPn22" target="_blank" rel="noopener">https://bit.ly/3QKPn22</a></li>
<li>Programação em Python do Zero: <a href="https://bit.ly/python-boson" target="_blank" rel="noopener">https://bit.ly/python-boson</a></li>
</ul>
<p>Adquira também livros e outros itens na loja da Bóson Treinamentos na Amazon e ajude o canal a se manter e crescer: <a href="https://www.amazon.com.br/shop/bosontreinamentos" target="_blank" rel="noopener">https://www.amazon.com.br/shop/bosontreinamentos</a></p>
<p>O post <a href="https://www.bosontreinamentos.com.br/mysql/como-exportar-dados-de-uma-tabela-como-arquivo-csv-no-mysql/">Como Exportar Tabela MySQL para CSV – Tutorial Prático</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bosontreinamentos.com.br/mysql/como-exportar-dados-de-uma-tabela-como-arquivo-csv-no-mysql/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Tipos de Dados no SQLite e tipos correspondentes em Python</title>
		<link>https://www.bosontreinamentos.com.br/programacao-em-python/tipos-de-dados-no-sqlite-e-tipos-correspondentes-em-python/</link>
					<comments>https://www.bosontreinamentos.com.br/programacao-em-python/tipos-de-dados-no-sqlite-e-tipos-correspondentes-em-python/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Fábio dos Reis]]></dc:creator>
		<pubDate>Tue, 21 May 2024 13:23:06 +0000</pubDate>
				<category><![CDATA[Programação em Python]]></category>
		<category><![CDATA[Bancos de Dados]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[SQLite]]></category>
		<guid isPermaLink="false">https://www.bosontreinamentos.com.br/?p=20077</guid>

					<description><![CDATA[<p>Tipos de Dados no SQLite e os tipos correspondentes em Python Neste artigo vamos discutir brevemente os tipos de dados disponíveis no SQLite, juntamente com os tipos de dados correspondentes no Python. O que são Tipos de Dados? Os tipos de dados representam os diferentes formatos e faixas de valores que podem ser armazenados em um banco de dados. Eles definem o tipo de informação que pode ser armazenado em uma coluna de uma tabela, e seu domínio (faixa de valores válidos). Também determinam como os dados serão armazenados em disco, como serão manipulados e quais operações podem (ou não) ser realizadas sobre eles. Os tipos em um banco de dados são importantes porque garantem a integridade dos dados e ajudam a otimizar o armazenamento e a recuperação de informações. Cada um tem suas próprias características e restrições, e é importante escolher o tipo mais apropriado para cada coluna com base no tipo de informação que será armazenada. Classificação dos tipos de dados Podemos classificar os tipos de dados em bancos de dados da seguinte forma: Tipos numéricos: Armazenam valores numéricos, como valores inteiros, números de ponto flutuante e números decimais. Tipos de caracteres: Armazenam strings de caracteres, como nomes, endereços [...]</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/programacao-em-python/tipos-de-dados-no-sqlite-e-tipos-correspondentes-em-python/">Tipos de Dados no SQLite e tipos correspondentes em Python</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Tipos de Dados no SQLite e os tipos correspondentes em Python</h2>
<p>Neste artigo vamos discutir brevemente os tipos de dados disponíveis no SQLite, juntamente com os tipos de dados correspondentes no Python.</p>
<h3>O que são Tipos de Dados?</h3>
<p>Os <a href="https://www.bosontreinamentos.com.br/programacao-em-python/5-python-variaveis-tipos-de-dados-e-o-comando-type/">tipos de dados</a> representam os diferentes formatos e faixas de valores que podem ser armazenados em um banco de dados. Eles definem o tipo de informação que pode ser armazenado em uma coluna de uma tabela, e seu domínio (faixa de valores válidos).</p>
<p>Também determinam como os dados serão armazenados em disco, como serão manipulados e quais operações podem (ou não) ser realizadas sobre eles.</p>
<p>Os tipos em um banco de dados são importantes porque garantem a integridade dos dados e ajudam a otimizar o armazenamento e a recuperação de informações. Cada um tem suas próprias características e restrições, e é importante escolher o tipo mais apropriado para cada coluna com base no tipo de informação que será armazenada.</p>
<h3>Classificação dos tipos de dados</h3>
<p>Podemos classificar os tipos de dados em bancos de dados da seguinte forma:</p>
<ul>
<li>Tipos numéricos: Armazenam valores numéricos, como valores inteiros, números de ponto flutuante e números decimais.</li>
<li>Tipos de caracteres: Armazenam strings de caracteres, como nomes, endereços e descrições. Podem incluir tipos de caracteres fixos (char) e variáveis (varchar).</li>
<li>Tipos de data e hora: Armazenam datas, horas ou data e hora combinadas. Isso pode incluir tipos como DATE, TIME, DATETIME e TIMESTAMP.</li>
<li>Tipos booleanos: Armazenam valores booleanos, como verdadeiro (true) ou falso (false).</li>
<li>Tipos de sequência: Armazenam sequências de bytes, como imagens, arquivos de áudio ou arquivos binários.</li>
<li>Tipos de coleção: Permitem armazenar coleções de valores, como listas, conjuntos e dicionários.</li>
<li>Tipos especiais: Alguns bancos de dados oferecem tipos de dados especiais para armazenar dados geoespaciais, JSON, endereços de rede, XML, etc.</li>
</ul>
<p>Vejamos agora como são classificados os tipos de dados no SQLite.</p>
<h3>Classe de Armazenamento em SQLite</h3>
<p>Uma classe de armazenamento é, basicamente, uma <em>coleção</em> de tipos de dados similares, como tipos inteiros, de ponto flutuante ou de strings. Em SQLite existem as seguintes cinco classes de armazenamento (tipos de dados) disponíveis:</p>
<table style="border-collapse: collapse; width: 86.657%; height: 83px;" border="1">
<tbody>
<tr>
<th style="width: 39.2887%; text-align: center;"><strong>Classe de Armazenamento</strong></th>
<th style="width: 60.7113%; text-align: center;"><strong>Valores Armazenados (Domínio)</strong></th>
</tr>
<tr>
<td style="width: 39.2887%; text-align: center;">NULL</td>
<td style="width: 60.7113%; text-align: center;">Valor nulo (NULL) ou ausente</td>
</tr>
<tr>
<td style="width: 39.2887%; text-align: center;">INTEGER</td>
<td style="width: 60.7113%; text-align: center;">Números inteiros com sinal, com até 8 bytes de tamanho. Também para data e hora no formato de tempo Unix (número de segundos decorridos desde 01/01/1970 00:00:00 UTC).</td>
</tr>
<tr>
<td style="width: 39.2887%; text-align: center;">REAL</td>
<td style="width: 60.7113%; text-align: center;">Valores de ponto flutuante de precisão dupla, no padrão IEEE com 8 bytes de comprimento</td>
</tr>
<tr>
<td style="width: 39.2887%; text-align: center;">TEXT</td>
<td style="width: 60.7113%; text-align: center;">Strings de texto de comprimento variável, codificadas em UTF-8, UTF-16BE ou UTF-16LE. Também empregado para armazenar dados de data e hora, no formato de strings no padrão ISO 8601.</td>
</tr>
<tr>
<td style="width: 39.2887%; text-align: center;">BLOB</td>
<td style="width: 60.7113%; text-align: center;">Dados armazenados exatamente como inseridos, geralmente em formato binário, como imagens, arquivos, etc.</td>
</tr>
</tbody>
</table>
<h4>E o tipo booleano (lógico)?</h4>
<p>O SQLite não possui uma classe de armazenamento separada para dados booleanos. Em vez disso, valores booleanos são armazenados na forma de números inteiros 0 (equivalente a falso) e 1 (equivalente a verdadeiro).</p>
<p>O sistema também reconhece as palavras-chave &#8220;TRUE&#8221; e &#8220;FALSE&#8221;, a partir da versão 3.23.0, sendo, na verdade, apenas grafias alternativas para os literais inteiros 1 e 0, respectivamente.</p>
<p>Na tabela a seguir comparamos os tipos de dados em SQLite e seus tipos correspondentes em Python:</p>
<table style="border-collapse: collapse; width: 86.5845%; height: 106px;" border="1">
<tbody>
<tr>
<th style="width: 49.9162%; text-align: center;"><strong>Classe de Armazenamento SQLite</strong></th>
<th style="width: 50.0838%; text-align: center;"><strong>Tipo de Dado (Classe) em Python</strong></th>
</tr>
<tr>
<td style="width: 49.9162%; text-align: center;">NULL</td>
<td style="width: 50.0838%; text-align: center;">NoneType</td>
</tr>
<tr>
<td style="width: 49.9162%; text-align: center;">INTEGER</td>
<td style="width: 50.0838%; text-align: center;">int</td>
</tr>
<tr>
<td style="width: 49.9162%; text-align: center;">REAL</td>
<td style="width: 50.0838%; text-align: center;">float</td>
</tr>
<tr>
<td style="width: 49.9162%; text-align: center;">TEXT</td>
<td style="width: 50.0838%; text-align: center;">str</td>
</tr>
<tr>
<td style="width: 49.9162%; text-align: center;">BLOB</td>
<td style="width: 50.0838%; text-align: center;">bytes</td>
</tr>
</tbody>
</table>
<p>É importante lembrar que o SQLite é um banco de dados de tipagem <em>dinâmica</em>, ou ainda <a href="https://www.sqlite.org/flextypegood.html">tipagem <em>flexível</em></a>, o que significa que ele é flexível em relação aos tipos de dados e pode converter automaticamente entre tipos, se for necessário, em vez de usar tipos rígidos por padrão (que também estão disponíveis). Mas o que significa isso? Significa que:</p>
<p><em>No SQLite, o tipo de dados de um valor está associado ao próprio valor, não ao seu contêiner (no caso, uma coluna de tabela).</em></p>
<p>Além disso, o sistema de tipos dinâmicos do SQLite é compatível com versões anteriores dos sistemas de tipos estáticos mais comuns de outros mecanismos de banco de dados, no sentido de que as instruções SQL que funcionam em bancos de dados de tipo estaticamente funcionam da mesma maneira no SQLite.</p>
<h3>O tipo de dados ANY</h3>
<p>Quando o tipo de dados de uma coluna é &#8220;<strong>ANY</strong>&#8220;, significa que qualquer tipo de dados &#8211; números inteiros, de ponto flutuante, strings ou blobs binários &#8211; pode ser inserido nessa tabela e seu valor e tipo de dados serão preservados exatamente como foram inseridos. Atualmente, o SQLite é o único mecanismo de banco de dados SQL que suporta esse recurso.</p>
<p>O comportamento de ANY é ligeiramente diferente em uma tabela STRICT (de tipagem rígida) e em uma tabela comum. Em uma tabela STRICT, uma coluna do tipo ANY sempre preserva os dados exatamente como eles são recebidos. Já em uma tabela comum não estrita, uma coluna do tipo ANY tentará converter strings que se parecem com números em um valor numérico e, se não ocorrerem erros, armazenará o valor numérico em vez da string original.</p>
<h3>O que é Afinidade de Tipos</h3>
<p><em><strong>Afinidade de Tipos</strong></em> é um conceito no SQLite de como são associados os tipos de dados de colunas a uma das cinco categorias de tipos que ele suporta internamente, explicadas acima.</p>
<p>Apesar do SQLite ser um banco de dados de tipo dinâmico e permitir a inserção de qualquer tipo de dado em qualquer coluna, ele ainda possui esse sistema de afinidade de tipos que ajuda a interpretar e armazenar os dados de maneira eficiente e consistente.</p>
<p>Para isso algumas regras são definidas, descritas na sequência.</p>
<h4>Regras de Afinidade de Tipos no SQLite</h4>
<p>Quando uma tabela é criada no SQLite e especificamos os tipos de dados para as colunas, são aplicadas regras de afinidade de tipos para determinar a categoria interna mais adequada. Essas regras são baseadas nos nomes dos tipos de dados fornecidos.</p>
<p>Vejamos algumas regras gerais.</p>
<ul>
<li>INTEGER: Qualquer coluna com &#8220;INT&#8221; no tipo terá afinidade INTEGER.</li>
<li>TEXT: Qualquer coluna com &#8220;CHAR&#8221;, &#8220;VARCHAR&#8221;, &#8220;CLOB&#8221;, ou &#8220;TEXT&#8221; no tipo terá afinidade TEXT.</li>
<li>BLOB: Qualquer coluna com o tipo &#8220;BLOB&#8221; terá afinidade BLOB.</li>
<li>REAL: Qualquer coluna com &#8220;REAL&#8221;, &#8220;FLOAT&#8221;, ou &#8220;DOUBLE&#8221; no tipo terá afinidade REAL.</li>
<li>NUMERIC: Qualquer coluna que não se encaixe nas regras acima terá afinidade NUMERIC.</li>
</ul>
<p>Ao inserir dados em uma coluna, o SQLite tentará converter o valor para o tipo de afinidade da coluna.</p>
<p>Para saber mais e se aprofundar em tipos de dados no SQLite, visite a página da documentação oficial: <a href="https://www.sqlite.org/datatype3.html">Tipos de Dados no SQLite</a>.</p>
<h3>Colabore com a Bóson Treinamentos</h3>
<p>Ajude o canal adquirindo meus cursos na Udemy:</p>
<ul>
<li>Bancos de Dados com MySQL Básico: <a href="https://bit.ly/35QdWE4" target="_blank" rel="noopener">https://bit.ly/35QdWE4</a></li>
<li>Lógica de Programação com Português Estruturado: <a href="https://bit.ly/3QKPn22" target="_blank" rel="noopener">https://bit.ly/3QKPn22</a></li>
<li>Programação em Python do Zero: <a href="https://bit.ly/python-boson" target="_blank" rel="noopener">https://bit.ly/python-boson</a></li>
</ul>
<p>Adquira também livros e outros itens na loja da Bóson Treinamentos na Amazon e ajude o canal a se manter e crescer: <a href="https://www.amazon.com.br/shop/bosontreinamentos" target="_blank" rel="noopener">https://www.amazon.com.br/shop/bosontreinamentos</a></p>
<p>O post <a href="https://www.bosontreinamentos.com.br/programacao-em-python/tipos-de-dados-no-sqlite-e-tipos-correspondentes-em-python/">Tipos de Dados no SQLite e tipos correspondentes em Python</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bosontreinamentos.com.br/programacao-em-python/tipos-de-dados-no-sqlite-e-tipos-correspondentes-em-python/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Como consultar nomes de tabelas e de colunas no MySQL</title>
		<link>https://www.bosontreinamentos.com.br/mysql/como-consultar-nomes-de-tabelas-e-de-colunas-no-mysql/</link>
					<comments>https://www.bosontreinamentos.com.br/mysql/como-consultar-nomes-de-tabelas-e-de-colunas-no-mysql/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Fábio dos Reis]]></dc:creator>
		<pubDate>Wed, 08 May 2024 18:07:03 +0000</pubDate>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Bancos de Dados]]></category>
		<guid isPermaLink="false">http://www.bosontreinamentos.com.br/?p=18248</guid>

					<description><![CDATA[<p>Consultar nomes de tabelas e de colunas no MySQL Consultar os nomes de tabelas e colunas em um banco de dados MySQL é uma tarefa importante para entender a estrutura e o conteúdo dos dados armazenados, principalmente quando trabalhamos em um banco que não conhecemos muito bem. Desta forma, podemos obter uma visão abrangente da organização dos dados e identificar os elementos essenciais para  a execução de consultas subsequentes e operações variadas de manipulação de dados. Neste artigo abordo dois métodos que podem ser empregados para consultar nomes de tabelas e colunas em bancos MySQL, auxiliando a compreensão da estrutura de seus bancos de dados. 1. Mostrar os nomes das tabelas de um banco de dados específico SELECT TABLE NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'db_biblioteca'; Neste exemplo: SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES: Aqui especificamos que queremos selecionar a coluna TABLE_NAME, que contém os nomes das tabelas em um banco de dados. Essa coluna pertence à tabela interna INFORMATION_SCHEMA.TABLES, que é uma tabela especial no MySQL que contém informações sobre as tabelas em um banco de dados WHERE TABLE_SCHEMA = &#8216;db_biblioteca&#8217;;: Esta parte da declaração filtra os resultados para incluir apenas as tabelas que pertencem ao banco de dados especificado, de [...]</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/mysql/como-consultar-nomes-de-tabelas-e-de-colunas-no-mysql/">Como consultar nomes de tabelas e de colunas no MySQL</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Consultar nomes de tabelas e de colunas no MySQL</h2>
<p>Consultar os nomes de tabelas e colunas em um banco de dados MySQL é uma tarefa importante para entender a estrutura e o conteúdo dos dados armazenados, principalmente quando trabalhamos em um banco que não conhecemos muito bem.</p>
<p>Desta forma, podemos obter uma visão abrangente da organização dos dados e identificar os elementos essenciais para  a execução de consultas subsequentes e operações variadas de manipulação de dados.</p>
<p>Neste artigo abordo dois métodos que podem ser empregados para consultar nomes de tabelas e colunas em bancos MySQL, auxiliando a compreensão da estrutura de seus bancos de dados.</p>
<p><strong>1. Mostrar os nomes das tabelas de um banco de dados específico</strong></p>
<pre><span style="color: #ff0000;"><strong>SELECT TABLE NAME FROM INFORMATION_SCHEMA.TABLES</strong></span>
<span style="color: #ff0000;"><strong>WHERE TABLE_SCHEMA = 'db_biblioteca';</strong></span></pre>
<p>Neste exemplo:</p>
<ul>
<li><strong>SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES</strong>: Aqui especificamos que queremos selecionar a coluna TABLE_NAME, que contém os nomes das tabelas em um banco de dados.<br />
Essa coluna pertence à tabela interna INFORMATION_SCHEMA.TABLES, que é uma tabela especial no MySQL que contém informações sobre as tabelas em um banco de dados</li>
<li><strong>WHERE TABLE_SCHEMA = &#8216;db_biblioteca&#8217;;</strong>: Esta parte da declaração filtra os resultados para incluir apenas as tabelas que pertencem ao banco de dados especificado, de nome db_biblioteca no exemplo.<br />
TABLE_SCHEMA é uma coluna na tabela INFORMATION_SCHEMA.TABLES que contém os nomes dos bancos de dados aos quais as tabelas pertencem.</li>
</ul>
<p><strong>Resultado:</strong><img loading="lazy" decoding="async" class="aligncenter wp-image-18249 size-full" title="Descobrir nomes de tabelas em um banco de dados MySQL" src="http://www.bosontreinamentos.com.br/wp-content/uploads/2022/06/nomes-tabelas-mysql-banco-de-dados.png" alt="Descobrir nomes de tabelas em um banco de dados MySQL" width="97" height="117" /></p>
<p><strong>2. Mostrar os nomes das colunas de uma tabela específica no banco</strong></p>
<pre><span style="color: #ff0000;"><strong>SELECT COLUMN_NAME </strong></span><span style="color: #ff0000;"><strong>FROM INFORMATION_SCHEMA.COLUMNS</strong></span>
<span style="color: #ff0000;"><strong>WHERE TABLE_SCHEMA='db_biblioteca' AND TABLE_NAME='tbl_autores';</strong></span></pre>
<p>Neste exemplo temos que:</p>
<p><strong>SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS</strong>: Vamos consultar os nomes das colunas da tabela INFORMATION_SCHEMA.COLUMNS, que é uma tabela especial no MySQL que contém informações sobre as colunas em todas as tabelas de todos os bancos de dados. </p>
<p><strong>WHERE TABLE_SCHEMA=&#8217;db_biblioteca AND TABLE_NAME=&#8217;tbl_autores&#8221;</strong>: Aqui filtramos os resultados para incluir apenas as tabelas que pertencem ao banco de dados db_biblioteca,combinado com nome da tabela do banco de dados desejada (no caso, tbl_autores) por meio de um operador lógico AND. </p>
<h3>Resultado:<img loading="lazy" decoding="async" class="aligncenter wp-image-18250 size-full" title="Descobrir nomes de colunas em uma tabela de banco de dados MySQL" src="http://www.bosontreinamentos.com.br/wp-content/uploads/2022/06/nomes-colunas-tabela-mysql-banco-de-dados.png" alt="Descobrir nomes de colunas em uma tabela de banco de dados MySQL" width="130" height="87" /></h3>
<p>É isso aí! Com essas técnicas podemos verificar rapidamente a estrutura de um banco de dados, descobrindo os nomes de suas tabelas e respectivas colunas no MySQL.</p>
<h3>Referências</h3>
<ul>
<li>INFORMATION_SCHEMA Tables. <a href="https://dev.mysql.com/doc/refman/8.0/en/information-schema.html" target="_blank" rel="noopener">https://dev.mysql.com/doc/refman/8.0/en/information-schema.html</a></li>
</ul>
<h3>Colabore com a Bóson Treinamentos</h3>
<p>Ajude o canal adquirindo meus cursos na Udemy:</p>
<ul>
<li>Bancos de Dados com MySQL Básico: <a href="https://bit.ly/35QdWE4" target="_blank" rel="noopener">https://bit.ly/35QdWE4</a></li>
<li>Lógica de Programação com Português Estruturado: <a href="https://bit.ly/3QKPn22" target="_blank" rel="noopener">https://bit.ly/3QKPn22</a></li>
<li>Programação em Python do Zero: <a href="https://bit.ly/python-boson" target="_blank" rel="noopener">https://bit.ly/python-boson</a></li>
</ul>
<p>Adquira também livros e outros itens na loja da Bóson Treinamentos na Amazon e ajude o canal a se manter e crescer: <a href="https://www.amazon.com.br/shop/bosontreinamentos" target="_blank" rel="noopener">https://www.amazon.com.br/shop/bosontreinamentos</a></p>
<p>O post <a href="https://www.bosontreinamentos.com.br/mysql/como-consultar-nomes-de-tabelas-e-de-colunas-no-mysql/">Como consultar nomes de tabelas e de colunas no MySQL</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bosontreinamentos.com.br/mysql/como-consultar-nomes-de-tabelas-e-de-colunas-no-mysql/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Criar banco de dados SQLite em Python com sqlite3</title>
		<link>https://www.bosontreinamentos.com.br/programacao-em-python/criar-banco-de-dados-sqlite-em-python-com-sqlite3/</link>
					<comments>https://www.bosontreinamentos.com.br/programacao-em-python/criar-banco-de-dados-sqlite-em-python-com-sqlite3/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Fábio dos Reis]]></dc:creator>
		<pubDate>Tue, 09 Apr 2024 11:52:41 +0000</pubDate>
				<category><![CDATA[Programação em Python]]></category>
		<category><![CDATA[Bancos de Dados]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[SQLite]]></category>
		<guid isPermaLink="false">https://www.bosontreinamentos.com.br/?p=20029</guid>

					<description><![CDATA[<p>Criar banco de dados SQLite em Python com sqlite3 Neste tutorial veremos como criar um banco de dados usando o SGBD SQLite e como acessá-lo para realizar tarefas variadas a partir de um script em Python. Para tal, faremos uso da biblioteca built-in sqlite3, explorando sua funcionalidade básica na criação e acesso a dados armazenados em um banco de dados. Primeiramente, vamos conceituar o que é o SQLite. O que é o SQLite O SQLite é uma biblioteca de software que fornece um sistema de gerenciamento de bancos de dados relacional (SGBDR). Trata-se de uma biblioteca muito leve (daí o termo &#8220;lite&#8220;) em termos de configuração, administração do BD e recursos necessários. Presente em todos os smartphones e na maioria dos computadores e outros equipamentos, é software livre e de código aberto. Site oficial: https://www.sqlite.org/ Características principais do SQLite Autocontido: O SQLite é independente, o que significa que requer suporte mínimo do sistema operacional ou biblioteca externa. Isso o torna utilizável em qualquer ambiente, especialmente em dispositivos incorporados como iPhones, telefones Android, consoles de jogos, reprodutores de mídia portáteis, etc. É desenvolvido usando ANSI-C. O código-fonte está disponível nos arquivos sqlite3.c e seu arquivo de cabeçalho sqlite3.h. Se precisarmos desenvolver [...]</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/programacao-em-python/criar-banco-de-dados-sqlite-em-python-com-sqlite3/">Criar banco de dados SQLite em Python com sqlite3</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Criar banco de dados SQLite em Python com sqlite3</h2>
<p>Neste tutorial veremos como criar um banco de dados usando o SGBD SQLite e como acessá-lo para realizar tarefas variadas a partir de um script em Python. Para tal, faremos uso da biblioteca built-in sqlite3, explorando sua funcionalidade básica na criação e acesso a dados armazenados em um banco de dados.</p>
<p>Primeiramente, vamos conceituar o que é o SQLite.</p>
<h3>O que é o SQLite</h3>
<p><span style="font-weight: 400;">O SQLite é uma biblioteca de software que fornece um sistema de gerenciamento de bancos de dados relacional (SGBDR). Trata-se de uma biblioteca muito leve (daí o termo &#8220;<em>lite</em>&#8220;) em termos de configuração, administração do BD e recursos necessários.</span></p>
<p>Presente em todos os smartphones e na maioria dos computadores e outros equipamentos, é software livre e de código aberto.</p>
<p>Site oficial: <a href="https://www.sqlite.org/">https://www.sqlite.org/</a></p>
<h4><strong>Características principais do SQLite</strong></h4>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;"><strong>Autocontido</strong>: O SQLite é independente, o que significa que requer suporte mínimo do sistema operacional ou biblioteca externa. Isso o torna utilizável em qualquer ambiente, especialmente em dispositivos incorporados como iPhones, telefones Android, consoles de jogos, reprodutores de mídia portáteis, etc.</span><span style="font-weight: 400;"><br />
</span><span style="font-weight: 400;">É desenvolvido usando <a href="https://www.bosontreinamentos.com.br/category/programacao-em-linguagem-c/">ANSI-C</a>. O código-fonte está disponível nos arquivos sqlite3.c e seu arquivo de cabeçalho sqlite3.h. Se precisarmos desenvolver uma aplicação que utilize SQLite, basta colocar esses arquivos no projeto e compilá-lo com seu código.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;"><strong>Sem servidor (serverless)</strong>: Normalmente, um SGBDR como <a href="https://www.bosontreinamentos.com.br/curso-completo-de-mysql/">MySQL</a>, <a href="https://www.bosontreinamentos.com.br/curso-completo-de-postgresql/">PostgreSQL</a>, etc., requer um processo de servidor separado para operar. As aplicações que desejam acessar o servidor de banco de dados utilizam o protocolo <a href="https://www.bosontreinamentos.com.br/redes-computadores/curso-de-redes-protocolo-tcp-transmission-control-protocol/">TCP/IP</a> para enviar e receber solicitações. Isso é chamado de </span><i><span style="font-weight: 400;">arquitetura cliente/servidor</span></i><span style="font-weight: 400;">.</span><span style="font-weight: 400;"><br />
</span><span style="font-weight: 400;">Já o SQLite NÃO requer um servidor para funcionar.</span><span style="font-weight: 400;"><br />
</span><span style="font-weight: 400;">O banco de dados SQLite é integrado à aplicação que acessa o banco de dados. Os aplicativos interagem com o banco de dados SQLite lendo e escrevendo diretamente dos arquivos do banco de dados armazenados no disco.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;"><strong>Configuração zero</strong>: Devido à arquitetura serverless, não precisamos “instalar” o SQLite antes de usá-lo. Não há nenhum processo do servidor que precise ser configurado, iniciado e interrompido.</span><span style="font-weight: 400;"><br />
</span><span style="font-weight: 400;">Além disso, o SQLite não usa nenhum arquivo de configuração específico.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;"><strong>Transacional</strong>: Todas as <a href="https://www.bosontreinamentos.com.br/bancos-de-dados/conceitos-de-bancos-de-dados-o-que-e-uma-transacao/">transações</a> no SQLite são totalmente compatíveis com as <a href="https://www.bosontreinamentos.com.br/bancos-de-dados/conceitos-de-bancos-de-dados-o-que-significa-acid/">propriedades ACID</a>. Isso significa que todas as consultas e alterações são atômicas, consistentes, isoladas e duráveis.</span><span style="font-weight: 400;"><br />
</span><span style="font-weight: 400;">Em outras palavras, todas as alterações em uma transação ocorrem completamente ou não ocorrem, mesmo quando ocorre uma situação inesperada, como falha de aplicativo, falha de energia ou falha do sistema operacional.</span></li>
</ul>
<p><span style="font-weight: 400;">O SQLite também tem suporte a subconsultas, transações, junções, pesquisa em texto (full text search), restrições de chave estrangeira, entre outras funcionalidades.</span></p>
<h4><b>Outros Recursos do SQLite</b></h4>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">O SQLite usa tipos dinâmicos para tabelas. Isso significa podemos armazenar qualquer valor em qualquer coluna, independentemente do tipo de dados.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Permite que uma única conexão de banco de dados acesse vários arquivos de banco de dados simultaneamente. Isso fornece muitos recursos interessantes, como unir tabelas em bancos de dados diferentes ou copiar dados entre bancos de dados em um único comando.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">O SQLite é capaz de criar bancos de dados na memória de acesso muito rápido.</span></li>
</ul>
<h4><b>Observações sobre o SQLite</b></h4>
<p><span style="font-weight: 400;">É importante notar que, por não ter um servidor para seu gerenciamento, o SQLite não provê um acesso direto pela rede. As soluções existentes para acesso remoto são no geral &#8220;caras&#8221; e ineficientes.</span></p>
<p><span style="font-weight: 400;">Além disso, o SQLite não possui suporte à autenticação, com usuários e permissões definidas. Estamos falando aqui sobre <a href="https://www.bosontreinamentos.com.br/mysql/curso-de-mysql-grant-e-revoke-definindo-privilegios-de-acesso-aos-bancos-de-dados/">usuários do banco de dados</a>, que têm permissão para criar tabela, inserir registros etc.</span></p>
<p><span style="font-weight: 400;">Porém, apesar do SQLite não ter suporte à autenticação, é claro que podemos e devemos implementar nosso próprio controle de acesso para nossa aplicação.</span></p>
<p>Finalmente, O SQLite é <em>case-insensitive</em>, ou seja, <strong>não</strong> diferencia letras maiúsculas de minúsculas.</p>
<h4><b>Ferramentas GUI para gerenciamento do SQLite</b></h4>
<p>Diversas ferramentas gráficas existem para auxiliar no gerenciamento de bancos de dados criados com SQLite, disponíveis em várias plataformas e sob vários tipos de licenciamento. Algumas das mais populares incluem o SQLiteStudio, DBeaver e o DB Browser for SQLite, citadas a seguir:</p>
<ul>
<li style="font-weight: 400;" aria-level="1"><strong>SQLiteStudio</strong><span style="font-weight: 400;"><br />
</span><span style="font-weight: 400;">O SQLiteStudio é uma ferramenta GUI gratuita para gerenciar bancos de dados SQLite.</span><span style="font-weight: 400;"><br />
</span><span style="font-weight: 400;">É gratuito, portátil, intuitivo e multiplataforma.</span><span style="font-weight: 400;"><br />
</span><span style="font-weight: 400;">A ferramenta também fornece alguns dos recursos mais importantes para trabalhar com bancos de dados SQLite, como importação e exportação de dados em vários formatos, incluindo <a href="https://www.bosontreinamentos.com.br/mysql/como-carregar-um-arquivo-csv-em-tabela-no-mysql/">CSV</a>, XML e JSON.<br />
</span>Download: <a href="https://github.com/pawelsalawa/sqlitestudio/releases">https://github.com/pawelsalawa/sqlitestudio/releases</a></li>
</ul>
<p><span style="font-weight: 400;">Além do SQLite Studio, também temos disponíveis as seguintes ferramentas GUI gratuitas para SQLite: </span></p>
<ul>
<li><span style="font-weight: 400;"><strong>DBeaver</strong>: Ferramenta gratuita de banco de dados multiplataforma. Suporta todos os principais sistemas de banco de dados relacionais populares como <a href="https://www.bosontreinamentos.com.br/curso-completo-de-mysql/">MySQL</a>, <a href="https://www.bosontreinamentos.com.br/curso-completo-de-postgresql/">PostgreSQL</a>, <a href="https://www.bosontreinamentos.com.br/category/oracle-database/">Oracle Database</a>, IBM DB2, <a href="https://www.bosontreinamentos.com.br/curso-de-microsoft-sql-server/">Microsoft SQL Server</a>, Sybase, Firebird, além é claro do SQLite.<br />
Download: <a href="https://dbeaver.io/download/" target="_blank" rel="noopener">https://dbeaver.io/download/</a></span></li>
<li><span style="font-weight: 400;"><strong>DB Browser for SQLite</strong>: Ferramenta de código aberto para gerenciar arquivos de banco de dados compatíveis com SQLite.</span><span style="font-weight: 400;"><br />
</span><span style="font-weight: 400;">Download: </span><a href="https://sqlitebrowser.org/"><span style="font-weight: 400;">https://sqlitebrowser.org/</span></a></li>
</ul>
<h3>Módulo sqlite3</h3>
<p>O <a href="https://docs.python.org/3/library/sqlite3.html" target="_blank" rel="noopener">módulo SQLite3</a> é uma biblioteca embutida em Python, compatível com a especificação DB-API 2.0 (descrita pelo <a href="https://peps.python.org/pep-0249/">PEP 249</a>), que permite a interação com bancos de dados SQLite. Esse módulo fornece uma API simples mas bastante eficaz para realizar operações variadas de consulta, atualização e gerenciamento em bancos de dados SQLite diretamente a partir de scripts Python.</p>
<p>O SQLite3 é amplamente utilizado devido à sua natureza leve, rápida e autônoma. Ele não requer um servidor separado para funcionar, pois todo o banco de dados é armazenado em um único arquivo, o que facilita a distribuição e o compartilhamento de aplicativos.</p>
<p>Além disso, essa biblioteca suporta a maioria das funcionalidades comuns de <a href="https://www.bosontreinamentos.com.br/bancos-de-dados/o-que-e-um-banco-de-dados-relacional/">bancos de dados relacionais</a>, incluindo tipos de dados, consultas SQL complexas, <a href="https://www.bosontreinamentos.com.br/bancos-de-dados/conceitos-de-bancos-de-dados-o-que-significa-acid/">transações ACID</a> (Atomicidade, Consistência, Isolamento e Durabilidade) e outras. Fornece classes e métodos para executar consultas SQL, inserir dados, atualizar registros, excluir dados, gerenciar transações e manipular exceções de maneira eficiente.</p>
<p>Apesar de não ser necessário instalá-lo (por se tratar de um módulo built-in), o módulo sqlite3 requer a versão SQLite 3.7.15 ou mais recente para funcionar.</p>
<h3>Como criar um banco de dados SQLite com sqlite3</h3>
<p>Para criar um novo banco de dados, ou abrir um banco de dados já existente, o primeiro passo é importar a biblioteca sqlite3 com a declaração import no script Python:</p>
<pre>import sqlite3 as s</pre>
<p>Logo após, criamos / conectamos um banco de dados usando o método connect() do sqlite3 para criar um objeto de conexão:</p>
<pre><strong>conexao = s.connect(banco_teste.db')</strong></pre>
<p>Nesta instrução, passamos o nome do banco entre aspas como argumento para o método connect, atribuindo seu retorno a uma variável objeto que batizamos aqui de <strong>conexao</strong>. Caso o banco de dados não exista, será criado no mesmo diretório onde reside o script python; se já existir, o banco será aberto para acesso. Usaremos o nome banco_teste como nome do banco de dados, com a extensão <strong>.db</strong>.</p>
<p>Na sequência, criaremos um cursor que nos permitirá executar as declarações SQL no banco de dados em si, como comandos para criar tabelas, inserir registros, atualizar linha e excluir elementos, entre outros. Para isso usamos o método <em>cursor()</em> do objeto <strong>conexao</strong> criado:</p>
<pre>cursor = conexao.cursor()</pre>
<p>Agora podemos escrever uma declaração SQL a ser executada no banco. Por exemplo, vamos criar uma tabela usando a declaração CREATE TABLE, e então executar essa declaraçãop no banco de dados usando o método execute() do cursor criado:</p>
<pre>sql = "CREATE TABLE teste(coluna1, coluna2, coluna3);"
cursor.execute(sql)</pre>
<p>Como estamos executando um comando que realiza alterações no banco de dados, precisamos efetuar um commit logo após para efetivar a <a href="https://www.bosontreinamentos.com.br/bancos-de-dados/conceitos-de-bancos-de-dados-o-que-e-uma-transacao/">transação</a>, caso contrário as alterações requisitadas não serão tornadas permanentes no arquivo do banco. Para isso, executamos o método commit() da conexão:</p>
<pre>conexao.commit()</pre>
<p>Finalmente, verificamos se a tabela foi criada efetuando uma consulta na tabela mestra do sqlite, que se chama sqlite-master. Usamos na sequência o método fetchall() para acessar todos os registros retornados pela consulta a um objeto batizado de res ( de &#8220;resultado&#8221;):</p>
<pre>res = cursor.execute("SELECT name FROM sqlite_master")
print(res.fetchall())</pre>
<p><strong>Código completo:</strong></p>
<pre><span style="color: #ff0000;"><strong>import sqlite3 as s

</strong></span><span style="color: #339966;"><strong># Criar objeto de conexão e conectar ao banco</strong></span>
<span style="color: #ff0000;"><strong>conexao = s.connect('banco_teste.db')

</strong></span><span style="color: #339966;"><strong># Criar cursor</strong></span>
<span style="color: #ff0000;"><strong>cursor = conexao.cursor()

</strong></span><span style="color: #339966;"><strong># Determinar declarações SQL a serem executadas e executá-las no banco</strong></span>
<span style="color: #ff0000;"><strong>sql = "CREATE TABLE teste(coluna1, coluna2, coluna3);"</strong></span>
<span style="color: #ff0000;"><strong>cursor.execute(sql)

</strong></span><span style="color: #339966;"><strong># Efetivar a transação (comitar)</strong></span>
<span style="color: #ff0000;"><strong>conexao.commit()

</strong></span><span style="color: #339966;"><strong># Verificar se tabelas foram criadas</strong></span>
<span style="color: #ff0000;"><strong>res = cursor.execute("SELECT name FROM sqlite_master")</strong></span>
<span style="color: #ff0000;"><strong>print(res.fetchall())</strong></span></pre>
<p><em><strong>Resultado:</strong></em></p>
<pre><span style="color: #000000;"><strong>[('teste',)]</strong></span></pre>
<p>Note que foi retornada uma lista de tuplas, com um único elemento, que representa o nome da tabela de teste criada.</p>
<p>É isso aí! Criamos um banco de dados com SQLite e <a href="https://www.bosontreinamentos.com.br/programacao-com-python/">Python</a>, além de uma tabela simples, e testamos a existência da tabela por meio de instruções no script. Na próxima lição veremos como inserir dados nesta tabela (criar registros) e testar essa inserção.</p>
<p>Case prefira, assista a um vídeo da Bóson Treinamentos sobre Python com SQLite:</p>
<p><iframe loading="lazy" title="YouTube video player" src="https://www.youtube.com/embed/GZGPf1LrLdg?si=Tv3xzcZlCPty3cYZ" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<p>O post <a href="https://www.bosontreinamentos.com.br/programacao-em-python/criar-banco-de-dados-sqlite-em-python-com-sqlite3/">Criar banco de dados SQLite em Python com sqlite3</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bosontreinamentos.com.br/programacao-em-python/criar-banco-de-dados-sqlite-em-python-com-sqlite3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Importar arquivo CSV no SQL Server para inserir registros em uma tabela</title>
		<link>https://www.bosontreinamentos.com.br/sql-com-sql-server/importar-arquivo-csv-no-sql-server-para-inserir-registros-em-uma-tabela/</link>
					<comments>https://www.bosontreinamentos.com.br/sql-com-sql-server/importar-arquivo-csv-no-sql-server-para-inserir-registros-em-uma-tabela/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Fábio dos Reis]]></dc:creator>
		<pubDate>Thu, 21 Mar 2024 12:06:54 +0000</pubDate>
				<category><![CDATA[SQL com SQL Server]]></category>
		<category><![CDATA[Bancos de Dados]]></category>
		<category><![CDATA[CSV]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQL Server]]></category>
		<guid isPermaLink="false">https://www.bosontreinamentos.com.br/?p=20025</guid>

					<description><![CDATA[<p>Como importar arquivo CSV no SQL Server Neste tutorial mostro como importar um arquivo no formato CSV para uma tabela de um banco de dados SQL Server, de modo a realizar a inserção de múltiplos registros de uma só vez, por meio de uma operação INSERT INTO. Para tal vamos usar dois arquivos: o arquivo CSV propriamente dito, contendo os dados a serem inseridos na tabela, e um arquivo especificador de formatos para ajustar os dados do arquivo CSV com as colunas específicas da tabela, além é claro do código SQL que executará a tarefa de inserção dos registros em bulk (vários de uma vez). O que é um arquivo CSV? Um arquivo CSV (Comma-Separated Values / Valores Separados por Vírgulas) é um tipo de arquivo de texto simples que armazena dados tabulares de forma estruturada, empregado com frequência para importar e exportar dados entre diferentes programas, sistemas e plataformas. Neste tipo de arquivo, cada linha representa uma entrada de dados (um registro) e cada campo (coluna) é separado por um caractere delimitador, geralmente uma vírgula (&#8220;,&#8221;), ponto e vírgula (&#8220;;&#8221;) ou tabulação (&#8220;tab&#8221;). O mais comum é usar a vírgula, daí o nome do formato. Cada linha no arquivo [...]</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/sql-com-sql-server/importar-arquivo-csv-no-sql-server-para-inserir-registros-em-uma-tabela/">Importar arquivo CSV no SQL Server para inserir registros em uma tabela</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Como importar arquivo CSV no SQL Server</h2>
<p>Neste tutorial mostro como importar um arquivo no formato CSV para uma tabela de um banco de dados SQL Server, de modo a realizar a inserção de múltiplos registros de uma só vez, por meio de uma operação <a href="https://www.bosontreinamentos.com.br/sql-com-sql-server/8-t-sql-insert-into-values-inserir-dados-nas-tabelas-sql-server/">INSERT INTO</a>.</p>
<p>Para tal vamos usar dois arquivos: o arquivo CSV propriamente dito, contendo os dados a serem inseridos na tabela, e um arquivo especificador de formatos para ajustar os dados do arquivo CSV com as colunas específicas da tabela, além é claro do código SQL que executará a tarefa de inserção dos registros em bulk (vários de uma vez).</p>
<h3>O que é um arquivo CSV?</h3>
<p>Um arquivo <strong>CSV</strong> (<em>Comma-Separated Values</em> / Valores Separados por Vírgulas) é um tipo de arquivo de texto simples que armazena dados tabulares de forma estruturada, empregado com frequência para importar e exportar dados entre diferentes programas, sistemas e plataformas.</p>
<p>Neste tipo de arquivo, cada linha representa uma entrada de dados (um registro) e cada campo (coluna) é separado por um caractere delimitador, geralmente uma vírgula (&#8220;,&#8221;), ponto e vírgula (&#8220;;&#8221;) ou tabulação (&#8220;tab&#8221;). O mais comum é usar a vírgula, daí o nome do formato.</p>
<p>Cada linha no arquivo representa um registro e os campos podem conter texto, números, datas ou outros tipos de dados quaisquer. Usamos arquivos csv em aplicativos de planilhas, bancos de dados, programas para análise de dados e diversas outras aplicações, pois são bastante simples e fáceis de manipular.</p>
<p>Vamos usar neste tutorial um arquivo CSV de nome Livros.csv, que conterá dados a serem inseridos em uma tabela de nome <strong>Livro</strong>, e com ele vamos cadastrar vários registros de forma rápida e simples.</p>
<h3>Arquivo CSV de exemplo: Livros.csv</h3>
<p>A seguir temos o conteúdo do arquivo a ser usado no exemplo de inserção de linhas na tabela. Neste arquivo, a primeira linha é uma linha de cabeçalho, contendo os nomes das colunas da tabela que receberá os dados (tabela de nome <strong>Livro</strong>), separados por vírgulas. Você deve alterar o conteúdo desse arquivo de acordo com a tabela do banco que está usando, seguindo as instruções na sequência.</p>
<p>As linhas subsequentes contém os dados em si, sendo que cada linha do arquivo corresponde a uma linha a ser inserida na tabela (um registro), também separadas por vírgulas, seguindo a mesma ordem das colunas descritas no cabeçalho:</p>
<pre><span style="color: #800080;"><strong>NomeLivro,ISBN13,DataPub,PreçoLivro,NumeroPaginas,IdEditora,IdAssunto</strong></span>
<span style="color: #800080;"><strong>2001 - Um Odisséia no Espaço,9788576571551,20200930,55.86,336,3,1</strong></span>
<span style="color: #800080;"><strong>Fahrenheit 451,9788525052247,20120601,43.56,216,3,1</strong></span>
<span style="color: #800080;"><strong>Admirável mundo novo,9788525056009,20140101,50.32,312,3,1</strong></span>
<span style="color: #800080;"><strong>1984,9788535914849,20090721,29.67,416,14,1</strong></span>
<span style="color: #800080;"><strong>A volta ao mundo em 80 dias,9788537816134,18730101,59.41,256,11,5</strong></span>
<span style="color: #800080;"><strong>O Nome da Rosa,9788501115829,20191216,51.99,592,18,5</strong></span>
<span style="color: #800080;"><strong>Memórias Póstumas de Brás Cubas,9788525433131,18810101,34.90,240,14,6</strong></span>
<span style="color: #800080;"><strong>O Evangelho Segundo Jesus Cristo,9788535905595,19910101,49.90,512,14,6</strong></span>
<span style="color: #800080;"><strong>Cidades Invisíveis,9788535907445,19720101,42.80,176,14,6</strong></span>
<span style="color: #800080;"><strong>Windows Server 2016: Installing &amp; Configuring,9781535074094,20160712,432.00,436,4,11</strong></span>
<span style="color: #800080;"><strong>Ensaio Sobre a Cegueira,9788571645118,19950101,39.90,312,14,6</strong></span>
<span style="color: #800080;"><strong>Ulisses,9780141184432,19220202,78.90,450,16,6</strong></span>
<span style="color: #800080;"><strong>Practical Electronics for Inventors,9781259587542,20160711,212.58,1056,9,3</strong></span>
<span style="color: #800080;"><strong>Eu Robô,9788576571667,19501202,35.00,300,3,1</strong></span>
<span style="color: #800080;"><strong>Dom Casmurro,9788525404186,19000101,19.90,256,14,6</strong></span></pre>
<p>Insira esse conteúdo em um arquivo de texto simples vazio, como um arquivo do bloco de notas no Windows, e salve com o nome de Livros.csv. Caso queira, acrescente mais livros à listagem. Não é necessário usar aspas para delimitar os dados do tipo VARCHAR ou DATE.</p>
<p>Obs.: Tome cuidado ao salvar o arquivo para não salvá-lo com a extensão <strong>.txt</strong>!!! Para evitar esse problema, selecione &#8220;<em>Todos os arquivos</em>&#8221; em &#8220;<em>Tipo</em>&#8221; na caixa de diálogo Salvar, e certifique-se de usar a codificação <strong>UTF-8</strong>, como segue:</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-20026" title="Como salvar um arquivo no formato CSV no Bloco de Notas" src="https://www.bosontreinamentos.com.br/wp-content/uploads/2024/03/salvar-arquivo-csv-boson.jpg" alt="Como salvar um arquivo no formato CSV no Bloco de Notas" width="600" height="133" srcset="https://www.bosontreinamentos.com.br/wp-content/uploads/2024/03/salvar-arquivo-csv-boson.jpg 780w, https://www.bosontreinamentos.com.br/wp-content/uploads/2024/03/salvar-arquivo-csv-boson-420x93.jpg 420w, https://www.bosontreinamentos.com.br/wp-content/uploads/2024/03/salvar-arquivo-csv-boson-768x170.jpg 768w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p>A seguir criaremos o arquivo de formato XML a ser usado com esse csv.</p>
<h3>Arquivo de Formato XML</h3>
<p>Um arquivo de formato é um arquivo do tipo XML (<em>e<strong>X</strong>tensible <strong>M</strong>arkup <strong>L</strong>anguage</em>) que descreve a estrutura dos dados contidos no arquivo CSV, especificando como os campos são delimitados, o comprimento máximo de cada campo e como esses campos são mapeados para as colunas da tabela do banco de dados durante o processo de importação de dados em massa..</p>
<p>O arquivo que usaremos possui o nome formato.xml. Crie-o com um editor de textos, usando o conteúdo a seguir, e salve-o no mesmo diretório do arquivo Livros.CSV:</p>
<pre class="a-b-r-La"><strong>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" 
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;
  &lt;RECORD&gt;
    &lt;FIELD ID="1" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="100"/&gt;
    &lt;FIELD ID="2" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="13"/&gt;
    &lt;FIELD ID="3" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="8"/&gt;
    &lt;FIELD ID="4" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="19"/&gt;
    &lt;FIELD ID="5" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="10"/&gt;
    &lt;FIELD ID="6" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="5"/&gt;
    &lt;FIELD ID="7" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="5"/&gt;
  &lt;/RECORD&gt;
  &lt;ROW&gt;
    &lt;COLUMN SOURCE="1" NAME="NomeLivro" xsi:type="SQLVARYCHAR"/&gt;
    &lt;COLUMN SOURCE="2" NAME="ISBN13" xsi:type="SQLVARYCHAR"/&gt;
    &lt;COLUMN SOURCE="3" NAME="DataPub" xsi:type="SQLDATE"/&gt;
    &lt;COLUMN SOURCE="4" NAME="PrecoLivro" xsi:type="SQLMONEY"/&gt;
    &lt;COLUMN SOURCE="5" NAME="NumeroPaginas" xsi:type="SQLSMALLINT"/&gt;
    &lt;COLUMN SOURCE="6" NAME="IdEditora" xsi:type="SQLSMALLINT"/&gt;
    &lt;COLUMN SOURCE="7" NAME="IdAssunto" xsi:type="SQLTINYINT"/&gt;
  &lt;/ROW&gt;
&lt;/BCPFORMAT&gt;</strong></pre>
<p>O funcionamento deste arquivo é o seguinte:</p>
<ul>
<li><strong>&lt;BCPFORMAT&gt;</strong>: Elemento raiz do arquivo XML que define o formato do arquivo de dados.</li>
<li><strong>&lt;RECORD&gt;</strong>: Define a estrutura de cada registro (linha) no arquivo CSV.</li>
<li><strong>&lt;FIELD&gt;</strong>: Define os campos (colunas) do registro. Cada tag <strong>&lt;FIELD&gt;</strong> especifica o identificador do campo (ID), o tipo de terminador que separa os campos (TERMINATOR), e o comprimento máximo (MAX_LENGTH) do campo.</li>
<li><strong>&lt;ROW&gt;</strong>: Define a correspondência entre os campos do arquivo CSV e as colunas da tabela do banco de dados.</li>
<li><strong>&lt;COLUMN&gt;</strong>: Especifica como cada campo do arquivo CSV (<em>SOURCE</em>) é mapeado para uma coluna na tabela do banco de dados (<em>NAME</em>). Além disso, define o tipo de dados da coluna (xsi:type), que pode ser:
<ul>
<li><strong>SQLVARYCHAR</strong> para strings</li>
<li><strong>SQLDATE</strong> para datas</li>
<li><strong>SQLMONEY</strong> para valores monetários</li>
<li><strong>SQLSMALLINT</strong> para números inteiros pequenos</li>
<li><strong>SQLTINYINT</strong> para números inteiros muito pequenos.</li>
</ul>
</li>
</ul>
<h3>Código SQL</h3>
<p>E a seguir temos o código SQL que deverá ser executado no SQL Server, por exemplo usando o SSMS (SQL Server Management Studio):</p>
<pre><strong>INSERT INTO Livro (NomeLivro, ISBN13, DataPub, PrecoLivro, NumeroPaginas, IdEditora, IdAssunto)</strong>
<strong>SELECT </strong>
<strong>    NomeLivro, ISBN13, DataPub, PrecoLivro, NumeroPaginas, IdEditora, IdAssunto</strong>
<strong>FROM OPENROWSET(</strong>
<strong>    BULK 'C:\SQL\Livros.CSV',</strong>
<strong>    FORMATFILE = 'C:\SQL\Formato.xml',</strong>
<strong>CODEPAGE = '65001',  -- UTF-8</strong>
<strong>FIRSTROW = 2</strong>
<strong>) AS LivrosCSV;</strong></pre>
<div>O código opera da seguinte forma:</div>
<div>
<p>1. A linha &#8220;<strong>INSERT INTO Livro (NomeLivro, ISBN13, DataPub, PrecoLivro, NumeroPaginas, IdEditora, IdAssunto)</strong>&#8221; é a declaração SQL usada para inserir os dados na tabela Livro. Serão preenchidos os campos NomeLivro, ISBN13, DataPub, PrecoLivro, NumeroPaginas, IdEditora e IdAssunto.</p>
<p>2. O comando &#8220;<strong>SELECT NomeLivro, ISBN13, DataPub, PrecoLivro, NumeroPaginas, IdEditora, IdAssunto</strong>&#8221; determina quais colunas do arquivo CSV serão selecionadas para inserção na tabela de livros.</p>
<p>3. &#8220;<strong>FROM OPENROWSET(BULK &#8216;C:\SQL\Livros.CSV&#8217;, FORMATFILE = &#8216;C:\SQL\Formato.xml&#8217;, CODEPAGE = &#8216;65001&#8217;, FIRSTROW = 2)</strong>&#8220;: Aqui, estamos usando a função OPENROWSET para abrir e ler o arquivo CSV especificado. Os parâmetros desta função são:</p>
<ul>
<li><strong>BULK &#8216;C:\SQL\Livros.CSV&#8217;</strong>: Indica o caminho do arquivo CSV que será lido (no caso o arquivo está na pasta SQL dentro da raiz do sistema).</li>
<li><strong>FORMATFILE = &#8216;C:\SQL\Formato.xml</strong>&#8216;: Especifica o arquivo de formato XML que descreve a estrutura do arquivo CSV. Este arquivo de formato é utilizado para especificar detalhes sobre o layout do arquivo CSV, como a ordem das colunas e o delimitador utilizado.</li>
<li><strong>CODEPAGE = &#8216;65001&#8217;</strong>: Define a codificação de caracteres a ser usada durante a leitura do arquivo CSV. Neste caso, o valor 65001 representa a codificação UTF-8.</li>
<li><strong>FIRSTROW = 2</strong>: Indica que a leitura do arquivo CSV começará a partir da segunda linha, de modo a ignorar o cabeçalho do arquivo CSV (que é a primeira linha).</li>
</ul>
<p>4. <strong>AS LivrosCSV;</strong>: Define um <em>alias</em> (nome de correlação) para os dados extraídos do arquivo CSV, permitindo que esses dados sejam referenciados dentro da consulta como se fossem uma tabela temporária chamada LivrosCSV. É um parâmetro obrigatório aqui.</p>
<p>Execute o comando acima no SQL Server, e, se nenhum erro for retornado, verifique a inserção dos registros com um SELECT simples:</p>
<pre><strong>SELECT * FROM Livro;</strong></pre>
</div>
<h3>Conclusão</h3>
<p>Inserir alguns poucos registros em uma tabela de banco de dados é uma tarefa simples e rápida. Porém, cadastrar muitos registros &#8211; centenas, milhares ou até mesmo milhões &#8211; pode se tornar extremamente trabalhoso e demorado, e neste caso podemos recorrer à importação em massa dos dados. Neste tutorial vimos uma forma simples de fazer isso no SQL Server: usando arquivos de texto do tipo CSV.</p>
<p>Nos próximos tutoriais veremos outras formas de importação (e também exportação) de dados em bancos de dados.</p>
<p>Prefere assistir a uma aula? Então assista ao vídeo da Bóson Treinamentos no YouTube sobre Arquivos CSV no MySQL:</p>
<p><iframe loading="lazy" title="YouTube video player" src="https://www.youtube.com/embed/5ddHcVBusQg?si=mV4STXday0y_XeLq" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<h3>Colabore com a Bóson Treinamentos</h3>
<p>Ajude o canal adquirindo meus cursos na Udemy:</p>
<ul>
<li>Bancos de Dados com MySQL Básico: <a href="https://bit.ly/35QdWE4" target="_blank" rel="noopener">https://bit.ly/35QdWE4</a></li>
<li>Lógica de Programação com Português Estruturado: <a href="https://bit.ly/3QKPn22" target="_blank" rel="noopener">https://bit.ly/3QKPn22</a></li>
<li>Programação em Python do Zero: <a href="https://bit.ly/python-boson" target="_blank" rel="noopener">https://bit.ly/python-boson</a></li>
</ul>
<p>Adquira também livros e outros itens na loja da Bóson Treinamentos na Amazon e ajude o canal a se manter e crescer: <a href="https://www.amazon.com.br/shop/bosontreinamentos" target="_blank" rel="noopener">https://www.amazon.com.br/shop/bosontreinamentos</a></p>
<p>O post <a href="https://www.bosontreinamentos.com.br/sql-com-sql-server/importar-arquivo-csv-no-sql-server-para-inserir-registros-em-uma-tabela/">Importar arquivo CSV no SQL Server para inserir registros em uma tabela</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bosontreinamentos.com.br/sql-com-sql-server/importar-arquivo-csv-no-sql-server-para-inserir-registros-em-uma-tabela/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>As 12 Regras de Codd para Sistemas de Bancos de Dados Relacionais</title>
		<link>https://www.bosontreinamentos.com.br/modelagem-de-dados/as-12-regras-de-codd-para-sistemas-de-bancos-de-dados-relacionais/</link>
					<comments>https://www.bosontreinamentos.com.br/modelagem-de-dados/as-12-regras-de-codd-para-sistemas-de-bancos-de-dados-relacionais/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Fábio dos Reis]]></dc:creator>
		<pubDate>Mon, 08 Jan 2024 18:22:19 +0000</pubDate>
				<category><![CDATA[Modelagem de Dados]]></category>
		<category><![CDATA[Bancos de Dados]]></category>
		<guid isPermaLink="false">http://www.bosontreinamentos.com.br/?p=19863</guid>

					<description><![CDATA[<p>As 12 Regras de Codd para Sistemas de Bancos de Dados Relacionais As Doze Regras de Codd são um conjunto de (na verdade) treze regras (enumeradas de zero a doze) publicadas pelo cientista da computação Edgar F. Codd em outubro de 1985, com o intuito de definir o que é necessário para que um sistema de gerenciamento de banco de dados possa ser considerado realmente um sistema relacional, ou seja, um SGBDR. Edgar Frank &#8220;Ted&#8221; Codd (19 de agosto de 1923 &#8211; 18 de abril de 2003) foi um cientista da computação inglês que, enquanto trabalhava para a IBM, inventou o modelo relacional para gerenciamento de banco de dados, a base teórica para bancos de dados relacionais e sistemas de gerenciamento de banco de dados relacionais. À medida que o modelo relacional de bancos de dados se popularizou no início dos anos 1980, Codd travou uma campanha por vezes complicada para evitar que o termo fosse mal utilizado por fornecedores de bancos de dados que apenas acrescentaram um verniz relacional à tecnologias mais antigas. Como parte desta campanha, ele publicou suas 12 regras para definir o que constituía um banco de dados relacional. Isso tornou sua posição na IBM cada [...]</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/modelagem-de-dados/as-12-regras-de-codd-para-sistemas-de-bancos-de-dados-relacionais/">As 12 Regras de Codd para Sistemas de Bancos de Dados Relacionais</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>As 12 Regras de Codd para Sistemas de Bancos de Dados Relacionais</h2>
<p>As Doze Regras de Codd são um conjunto de (na verdade) treze regras (enumeradas de zero a doze) publicadas pelo cientista da computação <a href="https://pt.wikipedia.org/wiki/Edgar_Frank_Codd" target="_blank" rel="noopener">Edgar F. Codd</a> em outubro de 1985, com o intuito de definir o que é necessário para que um sistema de gerenciamento de banco de dados possa ser considerado realmente um sistema relacional, ou seja, um <a href="http://www.bosontreinamentos.com.br/mysql/mysql-bancos-de-dados-sgbdr-e-grupos-de-comandos-04/">SGBDR</a>.</p>
<p>Edgar Frank &#8220;Ted&#8221; Codd (19 de agosto de 1923 &#8211; 18 de abril de 2003) foi um cientista da computação inglês que, enquanto trabalhava para a IBM, inventou o modelo relacional para gerenciamento de banco de dados, a base teórica para bancos de dados relacionais e sistemas de gerenciamento de banco de dados relacionais.</p>
<p>À medida que o <a href="http://www.bosontreinamentos.com.br/bancos-de-dados/o-que-e-um-banco-de-dados-relacional/">modelo relacional de bancos de dados</a> se popularizou no início dos anos 1980, Codd travou uma campanha por vezes complicada para evitar que o termo fosse mal utilizado por fornecedores de bancos de dados que apenas acrescentaram um verniz relacional à tecnologias mais antigas.</p>
<p>Como parte desta campanha, ele publicou suas 12 regras para definir o que constituía um banco de dados relacional. Isso tornou sua posição na IBM cada vez mais difícil, e então ele saiu para formar uma empresa de consultoria com <a href="http://www.bosontreinamentos.com.br/livros/os-10-livros-tecnicos-mais-importantes-que-eu-ja-li/">Christopher J. Date</a> e outros.</p>
<div id="attachment_19870" style="width: 547px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-19870" class="size-full wp-image-19870" src="http://www.bosontreinamentos.com.br/wp-content/uploads/2024/01/edgar-frank-codd-banco-dados.jpg" alt="Edgar Frank Codd" width="537" height="416" srcset="https://www.bosontreinamentos.com.br/wp-content/uploads/2024/01/edgar-frank-codd-banco-dados.jpg 537w, https://www.bosontreinamentos.com.br/wp-content/uploads/2024/01/edgar-frank-codd-banco-dados-420x325.jpg 420w" sizes="auto, (max-width: 537px) 100vw, 537px" /><p id="caption-attachment-19870" class="wp-caption-text">Edgar Frank Codd</p></div>
<p>A seguir trago o texto integral traduzido para o português com as 12 regras mais a regra 0, de acordo como publicado em duas matérias na revista Computerworld no mês de outubro de 1985: &#8220;<em>Is your DBMS really relational?</em>&#8220;, Computerworld. 14/10/1985, Vol. 19, e &#8220;<em>Does your DBMS run by the rules?</em>&#8220;, Computerworld. 21/10/1985, Vol. 19.</p>
<h3>Texto integral traduzido das 12 Regras de Codd</h3>
<p><span style="font-family: verdana, geneva, sans-serif;">As 12 regras</span><br />
<span style="font-family: verdana, geneva, sans-serif;">Por E. F. Codd</span><br />
<span style="font-family: verdana, geneva, sans-serif;">Outubro 1985</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">Doze regras são citadas abaixo como parte de um teste para determinar se um produto que se afirma ser totalmente relacional o é realmente. O emprego do termo “totalmente relacional” neste relatório é ligeiramente mais rigoroso do que no meu artigo de Turing (escrito em 1981). Isso ocorre em parte porque os fornecedores em seus anúncios e manuais traduziram o termo “minimamente relacional” para “totalmente relacional” e em parte porque neste relatório estamos lidando com SGBDs relacionais e não com sistemas relacionais em geral, o que incluiria meros sistemas de relatórios de consultas.</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">No entanto, as 12 regras tendem a explicar porque é que o suporte total ao modelo relacional é do interesse dos usuários. Nenhum novo requisito é adicionado ao modelo relacional. Posteriormente, um esquema de notas é definido e utilizado para medir o grau de fidelidade ao modelo relacional.</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">Primeiro, defino essas regras. Embora eu tenha definido cada regra em artigos anteriores, acredito que esta seja a primeira ocorrência de todas as 12 juntas.</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">Nas regras de oito a 11, especifico e exijo quatro tipos diferentes de independência destinados a proteger os investimentos dos clientes em programas de aplicação, atividades de terminal e treinamento. As regras oito e nove — independência física e lógica dos dados — têm sido amplamente discutidas há muitos anos.</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">As regras 10 e 11 — independência de integridade e independência de distribuição — são aspectos da abordagem relacional que não receberam atenção adequada até à data, mas que provavelmente se tornarão tão importantes quanto a oito e a nove.</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">Estas regras se baseiam em uma única regra fundamental, que chamarei de Regra Zero:</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;"><strong>Regra Zero.</strong></span><br />
<span style="font-family: verdana, geneva, sans-serif;"><strong>Regra 0: Para qualquer sistema anunciado como, ou que se alega ser, um sistema de gerenciamento de banco de dados relacional, esse sistema deve ser capaz de gerenciar bancos de dados inteiramente por meio de suas capacidades relacionais.</strong></span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">Esta regra deve ser válida quer o sistema suporte ou não quaisquer capacidades não relacionais de gerenciamento de dados. Qualquer SGBD que não satisfaça esta Regra Zero não vale a pena ser classificado como um SGBD relacional.</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">Uma consequência desta regra: qualquer sistema que se alega ser um SGBD relacional deve suportar inserção, atualização e exclusão em banco de dados no nível relacional (múltiplos registros por vez). Outra consequência é a necessidade de dar suporte à regra da informação e à regra do acesso garantido.</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">“Múltiplos registros por vez” inclui como casos especiais aquelas situações em que zero ou um registro é recuperado, inserido, atualizado ou excluído. Em outras palavras, uma relação (tabela) pode ter zero tuplas (linhas) ou uma tupla e ainda assim ser uma relação válida.</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">Qualquer declaração nos manuais de um sistema alegado ser um SGBD relacional que aconselhe os usuários a reverter para algumas capacidades não relacionais “para alcançar um desempenho aceitável” – ou por qualquer razão que não seja a compatibilidade com programas escritos no passado em sistemas de banco de dados não relacionais – deve ser interpretado como uma desculpa do fornecedor. Tal afirmação indica que o fornecedor não realizou o trabalho necessário para alcançar um bom desempenho com a abordagem relacional.</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">Qual é o perigo para compradores e usuários de um sistema que é considerado um SGBD relacional e que falha na Regra Zero?</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">Compradores e usuários esperarão todas as vantagens de um SGBD verdadeiramente relacional e não conseguirão obter essas vantagens. Agora descreverei as 12 regras que, juntamente com os nove recursos estruturais, 18 manipulativos e três de integridade do modelo relacional, determinam em detalhes específicos a extensão da validade da reivindicação de um fornecedor de ter um “SGBD totalmente relacional”.</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">Todas as 12 regras são motivadas pela Regra Zero definida acima, mas um SGBD pode ser verificado mais facilmente quanto à conformidade com essas 12 do que com a Regra Zero.</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;"><strong>A regra da informação.</strong></span><br />
<span style="font-family: verdana, geneva, sans-serif;"><strong>Regra 1: Todas as informações em um banco de dados relacional são representadas explicitamente no nível lógico e exatamente de uma maneira — por valores em tabelas.</strong></span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">Até mesmo nomes de tabelas, nomes de colunas e nomes de domínio são representados como cadeias de caracteres em algumas tabelas. As tabelas que contêm esses nomes normalmente fazem parte do catálogo interno do sistema. O catálogo é, portanto, uma base de dados relacional em si &#8211; dinâmica e ativa e que representa os metadados (dados que descrevem o restante dos dados no sistema). A regra de informação é aplicada não apenas para a produtividade do usuário, mas também para tornar um trabalho razoavelmente simples para os fornecedores de software definir pacotes de software adicionais (como auxílios ao desenvolvimento de aplicativos, sistemas especialistas e assim por diante) que fazem interface com SGBD relacionais e, por definição, estão bem integrados ao SGBD.</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">Ou seja, esses pacotes recuperam informações já existentes no catálogo e, conforme a necessidade, colocam novas informações no catálogo pelo próprio ato de utilizar o SGBD.</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">Uma razão adicional para aplicar esta regra é tornar a tarefa do administrador da base de dados de manter a base de dados num estado de integridade geral mais simples e mais eficaz. Não há nada mais embaraçoso para um administrador de base de dados do que ser questionado se a sua base de dados contém certas informações específicas e ele responder, após uma semana de exame da base de dados, que ele não sabe.</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;"><strong>Regra de acesso garantido.</strong></span><br />
<span style="font-family: verdana, geneva, sans-serif;"><strong>Regra 2: É garantido que todo e qualquer dado (valor atômico) em um banco de dados relacional seja logicamente acessível recorrendo a uma combinação de nome de tabela, valor de chave primária e nome de coluna.</strong></span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">Claramente, cada dado em um banco de dados relacional pode ser acessado em uma rica variedade – possivelmente milhares – de maneiras logicamente distintas. No entanto, é importante ter pelo menos uma forma, independente da base de dados relacional específica, que seja garantida, porque a maioria dos conceitos orientados para o computador (como a varredura de endereços sucessivos) foram deliberadamente omitidos do modelo relacional.</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">Observe que a regra de acesso garantido representa um esquema de endereçamento associativo exclusivo do modelo relacional. A regra não depende em nada do endereçamento usual orientado por computador. No entanto, o conceito de chave primária é uma parte essencial dele.</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;"><strong>Tratamento sistemático de valores nulos.</strong></span><br />
<span style="font-family: verdana, geneva, sans-serif;"><strong>Regra 3: Valores nulos (distintos da sequência de caracteres vazia ou de uma sequência de caracteres em branco e distintos de zero ou qualquer outro número) são suportados em SGBDs totalmente relacionais para representar informações ausentes e informações inaplicáveis de forma sistemática, independente do tipo de dados.</strong></span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">Para suportar integridade do banco de dados, deve ser possível especificar “nulos não permitidos” para cada coluna de chave primária e para quaisquer outras colunas onde o administrador do banco de dados considere uma restrição de integridade apropriada (por exemplo, certas colunas de chave estrangeira).</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">As técnicas anteriores envolviam a definição de um valor especial (peculiar a cada coluna ou campo) para representar a informação faltante. Isto seria muito assistemático em um banco de dados relacional porque os usuários teriam que empregar técnicas diferentes para cada coluna ou domínio — uma tarefa difícil devido ao alto nível de linguagem em uso (e uma tarefa que acredito que diminuiria a produtividade do usuário).</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;"><strong>Catálogo on-line dinâmico baseado no modelo relacional.</strong></span><br />
<span style="font-family: verdana, geneva, sans-serif;"><strong>Regra 4: A descrição do banco de dados é representada no nível lógico da mesma forma que os dados comuns, de modo que os usuários autorizados possam aplicar à sua interrogação a mesma linguagem relacional que aplicam aos dados regulares.</strong></span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">Uma consequência disso é que cada usuário (seja um programador de aplicação ou um usuário final) precisa aprender apenas um modelo de dados &#8211; uma vantagem que os sistemas não relacionais geralmente não oferecem (o IMS da IBM, juntamente com seu dicionário, exige que o usuário aprenda dois modelos de dados distintos).</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">Outra consequência é que os usuários autorizados podem facilmente estender o catálogo para se tornar um dicionário de dados relacional ativo e completo sempre que o fornecedor não o fizer.</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;"><strong>Regra abrangente de sublinguagem de dados.</strong></span><br />
<span style="font-family: verdana, geneva, sans-serif;"><strong>Regra 5: Um sistema relacional pode suportar diversas linguagens e vários modos de uso de terminal (por exemplo, o modo de preencher as lacunas). No entanto, deve haver pelo menos uma linguagem cujas instruções sejam expressáveis, de acordo com alguma sintaxe bem definida, como cadeias de caracteres e que seja abrangente no suporte a todos os itens a seguir:</strong></span></p>
<ul>
<li><span style="font-family: verdana, geneva, sans-serif;">Definição de dados.</span></li>
<li><span style="font-family: verdana, geneva, sans-serif;">Definição de Views.</span></li>
<li><span style="font-family: verdana, geneva, sans-serif;">Manipulação de dados (interativa e por programa).</span></li>
<li><span style="font-family: verdana, geneva, sans-serif;">Restrições de integridade.</span></li>
<li><span style="font-family: verdana, geneva, sans-serif;">Autorização.</span></li>
<li><span style="font-family: verdana, geneva, sans-serif;">Limites de transação (início, confirmação e reversão).</span></li>
</ul>
<p><span style="font-family: verdana, geneva, sans-serif;">A abordagem relacional é altamente dinâmica de forma intencional — ou seja, raramente será necessário interromper a atividade do banco de dados (em contraste com um SGBD não relacional). Portanto, não faz sentido separar os serviços listados acima em linguagens distintas.</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">Em meados dos anos 70, o Comitê de Planejamento e Requisitos de Padrões Ansi gerou um documento defendendo 42 interfaces distintas e (potencialmente) 42 linguagens distintas para SGBD. Felizmente, essa ideia aparentemente foi abandonada.</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;"><strong>Regra de atualização de visões</strong></span><br />
<span style="font-family: verdana, geneva, sans-serif;"><strong>Regra 6: Todas as visões que são teoricamente atualizáveis também são atualizáveis pelo sistema.</strong></span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">Observe que uma visão é teoricamente atualizável se existir um algoritmo independente de tempo para determinar inequivocamente uma única série de mudanças nas relações de base que terão como efeito precisamente as mudanças solicitadas na visão. A este respeito, “atualização” pretende incluir inserção e exclusão, bem como modificação.</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;"><strong>Inserção, atualização e exclusão de alto nível.</strong></span><br />
<span style="font-family: verdana, geneva, sans-serif;"><strong>Regra 7: A capacidade de tratar uma relação base ou uma relação derivada como um único operando aplica-se não apenas à recuperação de dados, mas também à inserção, atualização e exclusão de dados.</strong></span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">Este requisito dá ao sistema muito mais espaço para otimizar a eficiência de suas ações em tempo de execução. Ele permite que o sistema determine quais caminhos de acesso explorar para obter o código mais eficiente. Também pode ser extremamente importante para obter um tratamento eficiente de transações em um banco de dados distribuído. Neste caso, os usuários prefeririam que os custos de comunicação fossem poupados, evitando a necessidade de transmitir um pedido separado para cada registro obtido de locais remotos.</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;"><strong>Independência física de dados.</strong></span><br />
<span style="font-family: verdana, geneva, sans-serif;"><strong>Regra 8: Os programas aplicativos e as atividades do terminal permanecem logicamente inalterados sempre que qualquer alteração é feita nas representações de armazenamento ou nos métodos de acesso.</strong></span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">Para lidar com isso, o SGBD deve suportar uma fronteira clara e nítida entre os aspectos lógicos e semânticos, por um lado, e os aspectos físicos e de desempenho das tabelas base, por outro; os programas aplicativos devem lidar apenas com os aspectos lógicos.</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">SGBDs não relacionais raramente fornecem suporte completo para esta regra – na verdade, não conheço nenhum que o faça.</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;"><strong>Independência lógica de dados.</strong></span><br />
<span style="font-family: verdana, geneva, sans-serif;"><strong>Regra 9: Os programas aplicativos e as atividades de terminal permanecem logicamente intactos quando alterações de qualquer tipo que preservem informações e que teoricamente permitam a integridade são feitas nas tabelas base.</strong></span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">Tomemos os dois exemplos a seguir: dividir uma tabela em duas tabelas, seja por linhas usando conteúdo de linha ou por colunas usando nomes de coluna, se as chaves primárias forem preservadas em cada resultado; ou combinar duas tabelas em uma por meio de uma junção sem perdas (os autores da Universidade de Stanford e do MIT chamam essas junções de “sem perdas”). Para fornecer este serviço sempre que possível, o SGBD deve ser capaz de lidar com inserções, atualizações e exclusões em todas as visões que são teoricamente atualizáveis. Esta regra permite que o design do banco de dados lógico seja alterado dinamicamente se, por exemplo, tal alteração melhorar o desempenho.</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">As regras de independência de dados físicos e lógicos permitem que os projetistas de bancos de dados para SGBDs relacionais cometam erros em seus projetos sem as pesadas penalidades impostas pelos SGBDs não relacionais. Isso, por sua vez, significa que é muito mais fácil começar com um SGBD relacional porque não é necessário tanto planejamento orientado ao desempenho antes da “decolagem”.</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;"><strong>Independência de integridade.</strong></span><br />
<span style="font-family: verdana, geneva, sans-serif;"><strong>Regra 10: As restrições de integridade específicas de um banco de dados relacional em particular devem ser definíveis na sublinguagem de dados relacionais e armazenáveis no catálogo, e não nos programas aplicativos.</strong></span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">Além das duas regras de integridade (integridade de entidade e integridade referencial) que se aplicam a todos os bancos de dados relacionais, há uma necessidade clara de poder especificar restrições de integridade adicionais que reflitam políticas de negócios ou regulamentações governamentais.</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">Suponha que o modelo relacional seja refletido fielmente. Então, as restrições de integridade adicionais são definidas em termos da sublinguagem de dados de alto nível e das definições armazenadas no catálogo, não nos programas aplicativos. Informações sobre objetos identificados inadequadamente nunca são registradas em um banco de dados relacional. Para ser mais específico, as duas regras de integridade a seguir se aplicam a todos os bancos de dados relacionais:</span></p>
<ul>
<li><span style="font-family: verdana, geneva, sans-serif;">Integridade da entidade. Nenhum componente de uma chave primária pode ter um valor nulo.</span></li>
<li><span style="font-family: verdana, geneva, sans-serif;">Integridade referencial. Para cada valor de chave estrangeira não nulo distinto em um banco de dados relacional, deve existir um valor de chave primária correspondente do mesmo domínio.</span></li>
</ul>
<p><span style="font-family: verdana, geneva, sans-serif;">Se, como às vezes acontece, as políticas empresariais ou as regulamentações governamentais mudarem, provavelmente será necessário alterar as restrições de integridade. Normalmente, isso pode ser feito em um SGBD totalmente relacional, alterando uma ou mais instruções de integridade armazenadas no catálogo.</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">Em muitos casos, nem os programas aplicativos nem as atividades do terminal são prejudicadas logicamente.</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">SGBDs não relacionais raramente suportam esta regra como parte do mecanismo do SGBD, ao qual ela pertence. Em vez disso, eles dependem de um pacote de dicionário, que pode ou não estar presente e pode ser facilmente ignorado.</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;"><strong>Independência de distribuição.</strong></span><br />
<span style="font-family: verdana, geneva, sans-serif;"><strong>Regra 11: Um SGBD relacional possui independência de distribuição.</strong></span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">Por independência de distribuição, quero dizer que o SGBD possui uma sublinguagem de dados que permite que programas aplicativos e atividades de terminal permaneçam logicamente intactos:</span></p>
<ul>
<li><span style="font-family: verdana, geneva, sans-serif;">Quando a distribuição de dados é introduzida pela primeira vez (se o SGBD instalado originalmente gerencia apenas dados não distribuídos);</span></li>
<li><span style="font-family: verdana, geneva, sans-serif;">Quando os dados são redistribuídos (se o SGBD gerencia dados distribuídos).</span></li>
</ul>
<p><span style="font-family: verdana, geneva, sans-serif;">Note que a definição é cuidadosamente redigida para que tanto o SGBD distribuído quanto o não distribuído possam suportar totalmente a Regra 11. O SQL/DS e DB2 da IBM, Oracle Corp. da Oracle e Ingres da Relational Technology, Inc. (todos não distribuídos nos <em>releases</em> atuais) suportam totalmente esta regra.</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">Isso foi demonstrado da seguinte forma: programas SQL foram escritos para operar em dados não distribuídos (usando o System R), rodam corretamente em versões distribuídas desses dados (usando System R*, o protótipo do IBM San Jose Research Laboratory), e o projeto distribuído Ingres na Universidade da Califórnia em Berkeley mostrou a mesma capacidade para a linguagem Quel de Ingres.</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">É importante distinguir o processamento distribuído dos dados distribuídos. No primeiro caso, o trabalho (por exemplo, programas) é transmitido aos dados; neste último caso, os dados são transmitidos para o trabalho. Muitos DBMS não relacionais suportam processamento distribuído, mas não dados distribuídos. Os únicos sistemas que suportam o conceito de fazer com que todos os dados distribuídos pareçam locais são SGBDs relacionais – estes são protótipos no momento.</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">No caso de um SGBD relacional distribuído, uma única transação pode abranger vários locais remotos. Isso é gerenciado inteiramente nos bastidores – o sistema pode ter que executar a recuperação em vários locais. Cada programa ou atividade de terminal trata a totalidade dos dados como se fossem todos locais do site onde o programa aplicativo ou atividade de terminal está sendo executado.</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">Um SGBD totalmente relacional que não suporta bancos de dados distribuídos tem a capacidade de ser estendido para fornecer esse suporte, deixando os programas aplicativos e as atividades do terminal logicamente intactos, tanto no momento da distribuição inicial quanto sempre que a redistribuição posterior for feita.</span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">Existem quatro razões importantes pelas quais um SGBD relacional desfruta desta vantagem:</span></p>
<ul>
<li><span style="font-family: verdana, geneva, sans-serif;">Flexibilidade de decomposição na decisão de como implantar os dados.</span></li>
<li><span style="font-family: verdana, geneva, sans-serif;">Poder de recomposição dos operadores relacionais ao combinar os resultados de subtransações executadas em diferentes sites.</span></li>
<li><span style="font-family: verdana, geneva, sans-serif;">Economia de transmissão resultante do fato de não ser necessário enviar uma mensagem de solicitação para cada registro a ser recuperado de qualquer site remoto.</span></li>
<li><span style="font-family: verdana, geneva, sans-serif;">Analisabilidade da intenção (devido ao nível muito alto das linguagens relacionais) para uma otimização de execução amplamente melhorada.</span></li>
</ul>
<p><span style="font-family: verdana, geneva, sans-serif;"><strong>Regra de não subversão.</strong></span><br />
<span style="font-family: verdana, geneva, sans-serif;"><strong>Regra 12: Se um sistema relacional tiver uma linguagem de baixo nível (registro único por vez), esse baixo nível não pode ser usado para subverter ou contornar as regras e restrições de integridade expressas na linguagem relacional de nível superior (múltiplos registros por vez).</strong></span></p>
<p><span style="font-family: verdana, geneva, sans-serif;">Na abordagem relacional, a preservação da integridade é independente da estrutura lógica de dados para alcançar a independência da integridade. Esta regra é extremamente difícil para um sistema “nascido de novo” obedecer porque tal sistema já suporta uma interface abaixo da interface de restrição relacional. Os fornecedores de sistemas “nascidos de novo” não parecem ter dado a devida atenção a este problema.</span></p>
<p>Essas foram as 12 regras de Codd para sistemas de bancos de dados relacionais. Note que, embora essas regras fossem bastante válidas para a época da publicação dos artigos, sua intenção e seu público, hoje em dia é mais apropriado levar em consideração os artigos batizados de &#8220;O Terceiro Manifesto&#8221;, escritos por Christopher J. Date e Hugh Darwen sobre o modelo relacional, que podem ser acessados em <a href="http://thethirdmanifesto.com" target="_blank" rel="noopener">http://thethirdmanifesto.com</a>.</p>
<p>Fonte do texto e referências: <a href="https://reldb.org/c/index.php/twelve-rules/" target="_blank" rel="noopener">https://reldb.org/c/index.php/twelve-rules/</a></p>
<p>Aproveite e assista a um vídeo sobre as 12 Regras de Codd no canal da Bóson Treinamentos no YouTube:</p>
<p><iframe loading="lazy" title="YouTube video player" src="https://www.youtube.com/embed/r2JE38rqrxQ?si=8X_M9qNYdO9lFYGl" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<h3>Colabore com a Bóson Treinamentos</h3>
<p>Ajude o canal adquirindo meus cursos na Udemy:</p>
<ul>
<li>Bancos de Dados com MySQL Básico: <a href="https://bit.ly/35QdWE4" target="_blank" rel="noopener">https://bit.ly/35QdWE4</a></li>
<li>Lógica de Programação com Português Estruturado: <a href="https://bit.ly/3QKPn22" target="_blank" rel="noopener">https://bit.ly/3QKPn22</a></li>
<li>Programação em Python do Zero: <a href="https://bit.ly/python-boson" target="_blank" rel="noopener">https://bit.ly/python-boson</a></li>
</ul>
<p>Adquira também livros e outros itens na loja da Bóson Treinamentos na Amazon e ajude o canal a se manter e crescer: <a href="https://www.amazon.com.br/shop/bosontreinamentos" target="_blank" rel="noopener">https://www.amazon.com.br/shop/bosontreinamentos</a></p>
<p>O post <a href="https://www.bosontreinamentos.com.br/modelagem-de-dados/as-12-regras-de-codd-para-sistemas-de-bancos-de-dados-relacionais/">As 12 Regras de Codd para Sistemas de Bancos de Dados Relacionais</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bosontreinamentos.com.br/modelagem-de-dados/as-12-regras-de-codd-para-sistemas-de-bancos-de-dados-relacionais/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
