Pesquisar no blog:

segunda-feira, 21 de janeiro de 2013

Alterar valores das tabelas

Drop
Drop é o comando utilizado para eliminar uma tabela inteira de seus banco de dados, então utilize-a com cuidado.
Exemplo:
DROP table funcionarios;

Alter
Com o comando Alter podemos inserir novas colunas em nossas tabelas já existentes e também modifica-las ou excluí-las.
Inserir coluna:
ALTER table funcionarios ADD fun_cep varchar(8);
Alterar coluna:
ALTER table funcionarios modify fun_cep varchar(9);
Excluir coluna:
ALTER table funcionarios DROP fun_cep;

Obs.: em outros SGBD os comandos para inserir, modificar e excluir podem ser diferente.

Describe
Este comando nos da a descrição de todas as colunas da tabela:
describe clientes;
Na imagem acima podemos observar o resultado: é mostrada uma tabela que informa, respectivamente, todos os nossos campos, os tipos dos campos, se podem ser nulos (vazio), se são chave primária, e extra (outras características).

Update
O update altera os valores de um determinado registro ou coluna.
Exemplo:
UPDATE clientes SET cli_estado = "SP";
Neste exemplo acima todos os registros da coluna cli_estado são alterados para "SP".
Para alterarmos apenas um desses valores devemos usar a clausula WHERE.
Exemplo:
UPDATE clientes SET cli_estado = "SP" WHERE cli_codigo = 1;
Neste segundo exemplo definimos que será alterado para "SP" apenas o registro em que o cli_codigo for 1.

Delete
Com o comando delete podemos excluir registros de uma tabela.
Exemplo:
DELETE from clientes;
Essa é a forma mais simples de se usar, e todos os registros da tabela são excluídos. Porém, podemos usar com o DELETE a clausula WHERE da mesma forma que usamos no exemplo do UPDATE:
DELETE from clientes WHERE cli_codigo = 1;

quinta-feira, 17 de janeiro de 2013

Insert into - Manipulando dados das tabelas

Neste tutorial vou explicar como inserir dados em uma tabela.
Usamos o comando INSERT INTO para inserir dados em nossas tabelas.
Sua estrutura é:
INSERT INTO NOME_TABELA (dados_1, dados_2, ... dados_n);
Vamos antes, criar uma tabela onde armazenaremos os dados de clientes de uma empresa fictícia. Se você ainda não sabe como criar seu banco de dados e suas tabelas acesse: Criando um banco de dados no MySQL.
CREATE TABLE CLIENTES
(
cli_codigo integer,
cli_nome varchar(40),
cli_endereco varchar(40),
cli_cidade varchar(15),
cli_estado varchar(2),
cli_cpf varchar(11),
cli_sexo char(1),
cli_data_cadastro date
);

Agora como inserir dados nos registros que criamos?
Pois já temos nossa tabela, mais não há nada cadastrado dentro dela.
Acompanhe então o código para inserir um novo cliente em nossa tabela 'clientes':
INSERT INTO CLIENTES
(
cli_codigo, 
cli_nome, 
cli_endereco, 
cli_cidade, 
cli_estado, 
cli_cpf, 
cli_sexo, 
cli_data_cadastro
) VALUES 
(
1, 
'George Henrique Wurthmann', 
'Rua Anakin Skywalker', 
'Campinas', 
'SP', 
'33621522522', 
'M', 
'2012-01-17'
);

Depois do comando INSERT INTO CLIENTES informamos entre parenteses os registros onde serão armazenados os dados que vamos inserir nessa tabela. Em seguida, após o comando VALUES informamos entre os parenteses o dados a serem inseridos na tabela. Observe que os dados do tipo texto (varchar) e também o de data (date) são colocados entre aspas simples (').

terça-feira, 15 de janeiro de 2013

Tabela de Sockets de Processadores

Desde quando comecei dar aulas de manutenção de computadores muitos alunos me pedem uma lista de socket com os processadores que podem ser encaixados neles. Inicialmente procurei na internet e nunca encontrei nada que pudesse repassar para meus alunos pois as tabelas tentavam abranger todos processadores de todos os sockets, e a tornava enorme.
Então eu mesmo criei uma tabela mais simplificada, contendo o nome do socket, os principais processadores que são encaixados nele e a quantidade de pinos desse socket.
Isso ajudou bastante os alunos, por que sempre tem aquela confusão: "Esse socket é de processadores da AMD ou da Intel?", "Quais processadores posso usar nesse socket?", etc.
Segue abaixo a tabela utilizada, e que pode ser muito útil para consultas rápidas ou até mesmo para tirar aquela dúvida de um socket antigo.

Socket
Processadores
Pinos
Socket 1
486 SX, 486 DX, 486 DX2 e DX4 Overdrive
169
Socket 2
Intel 486 SX, 486 DX, 486 DX2, 486 DX4, DX4 Overdrive, Pentium OverDrive
238
Socket 3
486DX, 486SX, 486DX2,  486DX4, AMD 5x86, Cyrix 5x86, Pentium OverDrive 63, Pentium OverDrive 83.
237
Socket 4
Intel Pentium
273
Socket 5
Intel Pentium (75 - 133 MHz)
Intel Pentium Overdrive (125 - 166 MHz)
Intel Pentium Overdrive MMX (125 - 200 MHz)
AMD K5 (PR75 - PR200)
IDT WinChip (180 - 200 MHz)
IDT WinChip-2 (200 - 240 MHz)
IDT WinChip-2a (233 MHz)
320
Socket 6
Intel 486
235
Socket 7
Pentium (75 MHz+), Pentium MMX, K5, K6, K6-2, K6-III, K6-2+, K6-III+, 6x86,
6X86MX, Pentium Overdrive
321
Socket 8
Pentium Pro, Pentium II OverDrive
387
Slot 1
Celeron, Pentium II, Pentium III
SLOT
Slot A
Athlon
SLOT
Socket 370
Intel Celeron Mendocino (PPGA, 300–533 MHz, 2.0 V)
Intel Celeron Coppermine (FC-PGA, 533–1100 MHz, 1.5–1.75 V)
Intel Celeron Tualatin (FC-PGA2, 900–1400 MHz, 1.475–1.5 V)
Intel Pentium III Coppermine (FC-PGA, 500–1133 MHz, 1.6–1.75 V)
Intel Pentium III Tualatin (FC-PGA2, 1000–1400 MHz, 1.45–1.5 V)
VIA Cyrix III/C3 (500–1200 MHz, 1.35–2.0 V)
370
Socket 462 ou Socket A
Athlon Thunderbird, Athlon XP/MP 3200+, Duron, Sempron
453
Socket 423
Primeiros Pentium 4
423
Socket 754
Athlon 64 (2800+ a 3700+), Sempron (2500+), Turion 64
754
Socket 775 ou Socket T
Pentium 4, Pentium D, Celeron, Celeron D, Core 2 Duo, Core 2 Quad, Core 2 Extreme
775
Socket 940
Athlon 64 FX-51, Athlon 64 FX-53, Opteron
940
Socket939
Athlon 64 (3000+ a 4400+), Athlon 64 FX (53, 55, 57, 60), Athlon 64 X2 (3800+ a 4800+), Opteron
939
Socket AM2
Athlon 64 (3000+ a 4000+), Athlon 64 X2 (3600+ a 6400+), Athlon 64 FX-62,       Sempron AM2 (2800+ a 3800+)
940
Socket AM3
Phenom II X2
Phenom II X3
Phenom II X4
938
LGA 771 ou Soquete J
Dual-Core, Quad Core
771
LGA1366 ou Soquete B
Core i3, Core i5, Core i7, Xeon    (Processadores high-end)
1366
LGA1156 ou Soquete H
Core i3, Core i5, Core i7, Xeon    (Processadores mid-end)
1156
LGA1155 ou Soquete H2
Core i3, Core i5, Core i7, Xeon
1155
Socket FS1
APU - Liano (Fusion): A4, A6, A8 (notebooks)
722
Socket FM1
APU - Liano (Fusion): A4, A6, A8
905
Socket FM2
Trinity A10
904
AM3+
Bulldozer FX
942

Faça o download da tabela aqui.

segunda-feira, 14 de janeiro de 2013

Tipos de dados de um SGBD

Durante o armazenamento de informações em um banco de dados, deve-se analisar cuidadosamente qual o tipo do dado que sera armazenado.
Segue uma tabela com os tipos de dados básicos de um SGBD.

Tipo de dado
Descrição
char
 Uma string de caracteres com tamanho definido pelo usuário. Podemos usar a forma completa character no lugar de char.
varchar
 String de tamanho variável com o tamanho máximo especificado pelo usuário. Podemos usar a forma completa character varying no lugar de varchar.
int
Um número inteiro. Podemos usar em seu lugar a forma completa: integer.
smallint
Um número inteiro pequeno.
numeric
Um número de ponto flutuante (real) com precisão especificada pelo usuário. Exemplo: numeric(3,1) sendo um dos dígitos a esquerda reservado para o sinal.
double
Números de ponto flutuante (real) de precisão dupla.
float
Número de ponto flutuante (real).
date
Uma data de calendário contendo um ano (quatro dígitos), mês e dia do mês. Exemplo: ‘2013-01-14’
time
Hora do dia: Horas, minutos e segundos. Exemplo: ’21:43:00’
timestamp
Combinação de date e time. Exemplo: ‘2013-01-14 ’21:43:00’

fontes de pesquisa:
SILBERSCHATZ, Abraham. KORTH, Henry F.. SUDARXHAN, S.. Sistema de Banco de Dados. 5ª Ed.

segunda-feira, 7 de janeiro de 2013

Ponteiros - Linguagem C

Ponteiros são variáveis que permitem que você acesse outras variáveis sem referência-las diretamente.
Como o nome sugere, seu objetivo é apontar para uma variável. Mais especificamente para o endereço onde a variável apontada se encontra.
Os ponteiros dão a linguagem C grandes possibilidades para manipular endereços de memória e é representado por um asterisco (*) antes do nome da variável. Exemplo: *var

Como funcionam os ponteiros?
Exemplo: temos a variável x = 5 e a variável ponteiro *y = &x.
A variável x é uma variável comum com o valor 5 armazenado. Já a variável *y esta apontando para o endereço da variável x (&x).
O operador "&" na frente de uma variável sempre retornará seu endereço de memória, por isso que ao ler uma variável com a função "scanf" utilizamos as variáveis com este sinal na frente.
Neste caso, então, *y tem o endereço de x. Isso significa que se eu fizer a seguinte operação:
*y = 10
Estarei mudando o valor de x que era 5 para 10.

Exemplo:
main()
{
      int a = 3, b = 7, *pa = &a, *pb = &b, aux;
      printf("a = %d\nb =%d\n",a,b);
      printf("Invertendo...\n");
      system("pause");
      aux = a;
      *pa = b;
      *pb = aux;
      printf("a = %d\nb =%d\n",a,b);
      system("pause");
      return 0;
}

A tabela a seguir representa o conteúdo das variáveis usadas nesse simples programa.
Endereço
Variável
Conteúdo
0x0100
a
3
0x0101
b
7
0x0102
pa
0x0100
0x0103
pb
0x0101
0x0102
*pa
3
0x0103
*pb
7

Observe que o conteúdo dos ponteiros sem o asterisco (*) são endereços.
Mais quando colocamos o asterisco (*) estou indicando que ela deve apontar para o endereço. Então quando informo que *pa = b é a mesma coisa que dizer que o endereço de memória 0x0100 = b ou que a variável a = b.

Como ou quando usar os ponteiros?
Ponteiros são utilizado principalmente em funções, quando há a necessidade de retornar mais valores para o programa principal.
Se você não conhece funções na linguagem C acesse este link.
Sabemos que funções retornam apenas um valor por função. Sabemos também que as variáveis de uma função são destruídas depois que a função é executada. Então a solução para isso é mandar para uma função o endereço da variável que você deseja alterar, assim você estará alterando a variável do programa principal.

Exemplo: função para inverter valores de variáveis.
void troca(int *px, int *py)
{
     int aux;
     aux = *px;
     *px = *py;
     *py = aux;
}

main()
{
      int x = 3, y = 7;
      printf("x = %d\ny =%d\n",x,y);
      printf("Invetendo...\n");
      system("pause");
      troca(&x,&y);
      printf("x = %d\ny =%d\n",x,y);
      system("pause");
      return 0;
}

Na função "troca" foi criado dois ponteiros apontando para os endereços das variáveis do programa principal (x e y) e usando esses ponteiros invertemos os valores das variáveis do programa principal.
Essa inversão é muito utilizada em muitos algoritmos e essa seria uma solução para não precisar repetir essas linhas sempre que precisar inverter variáveis.
As matrizes são ponteiros representados de uma maneira diferente.
Se você não sabe o que são matrizes acesse esse link.
As matrizes são armazenadas em sequencia nas células de memórias. Sabemos que cada célula possui 1 Byte (8 bits), então se tivermos um valor do tipo inteiro armazenado em um ponteiro e somarmos 1 a esse endereço ele irá pular 4 células, ou seja, 4 Bytes onde está armazenado o valor da variável.
Aqui temos um programa que comprova isso:
main()
{
      int i, a[5] = {2000,2001,2002,2003,2004}, *pa = &a;
      for(i = 0; i < 5; i++)
           printf("Endereço atual: %d\nValor: %d\n",&a[i],*pa+i);
      system("pause");
      return 0;
}

Criamos um vetor (a) simples com 5 posições e percorremos ele com um ponteiro (*pa) sendo incrementado por i.
A cada vez que o ponteiro é incrementado é mostrado o endereço do vetor e seu valor, oque comprova que ao incrementar o ponteiro ele pula as 4 células (4 Bytes).
Veja o resultado na imagem abaixo: