terça-feira, 15 de novembro de 2011

Sql/Comandos




Verificando tabela criada.
MYSQL> DESCRIBE "Nome_Tabela";
 
Verificar uma coluna de uma tabela.
MYSQL> SHOWS COLUMNS FROM "nome_tabela"
 
Para obter comando de criação de uma tabela.
MYSQL> SHOW CREATE TABLE "nome_tabela";
 
Para obter comando de criação de um banco de dados.
MYSQL> SHOW CREATE DATABASE "nome_database";

Para verificar os index existentes em uma tabela. 
MYSQL> SHOW INDEX FROM "name_tabela";

Para verificar avisos gerados por um comando SQL.
MYSQL> SHOW WARNINGS;

Alter
Com o comando alter pode alterar tudo em uma tabela sem perder os dados já lançados, tomar cuidado para alterar tipos de dados dependendo da modificação os dados podem ser perdidos.
 
Para acrescentar uma coluna como PRIMARY KEY e auto incremental em uma tabela.
MYSQL> ALTER TABLE "nome_tabela"
              >ADD COLUMN "nome_da_coluna" INT NOT NULL AUTO_INCREMENT
              >FIRST, ADD PRIMARY KEY (nome_da_coluna);

O comando Afeter insere uma coluna após o nome da coluna informado.
MYSQL> ALTER TABLE "nome_tabela"
ADD COLUMN "nome_coluna" VARCHAR(10);
AFTER "nome_coluna_tabela";
 

Pode-se utilizar as palavras chave FIRST (primeiro) E AFTER (após) sua_coluna.
Pode também utilizar BEFORE (antes) sua_coluna e LAST (por ultimo), e também SECOND (segundo), e THIRD (terceiro).
Alterações Datavile
CHANGE(mudar) - o nome e os tipos de dados de uma coluna já existente.
MODIFY(modificar) - os tipos de dados e a posição de uma coluna existente.
ADD (aicionar) - uma coluna a sua tabela - você escolhe os tipos de dados.
DROP (eliminar) - eliminar uma coluna de sua tabela.
 

Alterando nome tabela.MYSQL> ALTER TABLE projeto
RENAME TO lista_projetos;
 

Excluindo PRIMARY KEYS
MYSQL> ALTER TABLE "nome_tabela" DROP PRIMARY KEY;
 

Inserindo AUTO_INCREMENT
MYSQL> ALTER TABLE "nome_tabela" CHANGE "sua_chave" "sua_chave" INT (11) NOT NULL AUTO_INCREMENT;


Para remover o AUTO_INCREMENT
MYSQL> ALTER TABLE "nome_tabela" CHANGE "sua_chave" "sua_chave" INT (11) NOT NULL;

Obs: E importante manter em mente que voce pode ter somente uma campo AUTO_INCREMENT por tabela e ele deve ser do tipo INTEGER e nao pode conter dados do tipo NULL.
Alterando nome de uma coluna e definindo como primary key. 
MYSQL> ALTER TABLE lista_projetos
CHANGE COLUMN numero id_proj INT NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY (`id_proj`);


Alterando tamamanho do tipo de dados de uma tabela.
MYSQL> ALTER TABLE "nome_tabela"
MODIFY COLUMN "nome_coluna"  varchar(50);
 

Alterando nome de mais de uma coluna de uma so vez.
MYSQL> ALTER TABLE "nome_tabela"
CHANGE COLUMN "nome_coluna_antiga"  "nome_coluna_atual" (50),
CHANGE COLUMN "nome_coluna_antiga"  "nome_coluna_atual" (20);
 

Excluindo uma coluna, tudo que esta armazenado ser'a removido junto.
MYSQL> ALTER TABLE "nome_tabela"
drop COLUMN "nome_coluna ;
 

Alterando posições de uma coluna
MYSQL> ALTER TABLE "nome_tabela"
MIDIFY COLUMN "nome_coluna" AFTER "nome_coluna",
MODIFY COLUMN "nome_coluna" SECOND,
MODIFY COLUMN "nome_coluna" SECOND,
Resumo
Use CHANGE quando quiser alterar o nome e os tipos de dados de uma tabela.
Use MODIFY quando desejar modificar apenas o tipo de dados de uma tabela.
Use DROP COLUMN tem apenas esta funcao: eliminar colunas selecionada da tabela.
Use RENAME para alterar o nome de sua tabela.
Voce pode alterar a ordem das suas colunasusando:
FIRST, LAST, BEFORE "nome_coluna" , AFTER "nome_coluna", SECOND, THIRD, FOURTH, etc.

 
Like
Comando Like (_) e (%).
MYSQL> SELECT  primeiro_nome FROM meus_contatos
WHERE primeiro_nome LIKE '%im'

Resultará em nomes com quaisquer quantidade de caracter antes do "im".
Ex: Efraim, Slim, etc.
MYSQL> SELECT  primeiro_nome FROM meus_contatos
WHERE primeiro_nome LIKE '_im' 
Resulta em nomes com apenas um caracter antes d "im".
EX: Kim e Tim.

Funções String
SUBSTRING_INDEX seleciona tudo que esta antes ou depois de um caracter específico.
MYSQL > SELECT SUBSTRING_INDEX("nome_coluna", 'caracter', 'qual a posição esta procurando');
Ex:
MYSQL > SELECT SUBSTRING_INDEX(local, ',', 1);
Obs: O número 1 quer dizer a primeira virgula.


SUBSTRING(sua_linha_de_texto, posicao_de_inicio, tamanho) fornece parte de sua linha de texto, iniciando pela letra na posicao_de_inicio. Tamanho é o quanto do texto você quer selecionar.
MYSQL> SELECT SUBSTRING ('Camilo', 5, 3);

UPER(sua_linha_de_texto)
e LOWER(sua_linha_de_texto) muda tudo na usa string para caixa alta ou para baixa, respectivamente.
MYSQL> SELECT UPER('uSa');
                 SELECT LOWER ('sapaGHEtthi');

REVERSE(sua_linha_de_texto)
faz justamente o que diz, ele reverte a ordem de letras na sua linha de texto.

MYSQL> SELECT REVERSE ('SpaGHRtti');

LTRIM(sua_linha_de_texto)
e RTRIM(sua_linha_de_texto) retornam sua string espaços extras removidos de antes(à esquerda) ou depois (à direita) da string.
MYSQL> SELECT LTRIM (' comida_cachorro');
                 SELECT RTRIM (' comida_gata');

LENGHT(sua_linha_de_texto)
retornam uma conta de quantos caracteres existem na sua linha de texto.
MYSQ> SELECT LENGHT ('San Antonio, TX ');

SELECT USANDO RIGHT() e LEFT().
Selecionando 2 casas de uma coluna da direita para esquerda.
MYSQL> SELECT RIGHT("nome_coluna" , 2) FROM "nome_tabela" ;

Para selecionar tudo a frente de um valor informado SUBSTRING_INDEX.
Seleciona tudo que esta antes da primeira (,). O numero 1 quer dizer primeira virgula.
MYSQL> SELECT SUBSTRING_INDEX("nome_coluna", ',', 1) FROM "nome_tabela";

Inderindo linhas na coluna estado da tabela meus_contatos, sendo que os valores inseridos sao selecionados na coluna local. Os dois primeiros valores da direita para esquerda.
MYSQL> UPDATE meus_contatos
SET estado = RIGHT(local, 2)
 
Limit  
Limitar o número de linhas é usado quando não queremos listar todas as linhas de uma tabela, seja pelo volume de linhas ou por não haver necessidade.
Em Mysql use o Limit para indicar o limite de linhas desejado na consulta.Pode ser usado de duas formas:
Na Primeira forma com apenas um parâmetro ele retornara as 7 primeiras linhas.
MYSQL> SELECT *
                 FROM empregados limit 7

Na Segunda forma usando dois parâmetros, ele vai retornar a 7ª linha direto conforme expecificado e não vai mostrar outras linhas ateriores devido o parâmetro utilizado foi 0.
MYSQL> SELECT *
                  FROM empregados limit 0,7


Update
Populando tabela com update.
Imagine a seguinte situação, uma tebela tinha uma coluna interesses e nesta coluna tinha no máximo quatro interesses todos juntos e separados por virgula o que não estava de acordo com a 1FN. Para resolver esta situação foi criado novas colunas interesse1, interesse2, interesse3 e interesse4.

 ALTER TABLE meus_contatos
ADD COLUMN interesse1 VARCHAR (50),
ADD COLUMN interesse2 VARCHAR (50),
ADD COLUMN interesse3 VARCHAR (50),
ADD COLUMN interesse4 VARCHAR (50);
 
Agora precisamos popular estas novas colunas obtendo o valor que esta na coluna "interesses".

UPDATE meus_contatos
SET interesse1 = SUBSTRING_INDEX (interesse, ',' , 1);
Obs.: Este comando vai pegar tudo que está antes da primeira virgula na coluna "interesses" e inserir na nova coluna interesse 1.
Agora precisamos remover o primeiro interesse do campo interesses, já que ele foi armazenado na coluna interesse1.

UPDATE meus_contatos
SET interesses = TRIM(RIGTH(interesses,
(LENGTH(interesses) - LENGTH(interesse1) -1)));
 
Obs:
TRIM -
Remove o espaço deixado na frente da linha de texto depois de termos removidos em frente à virgula.
RIGTH - 
exibe parte da coluna interesses, começando do lado direito.
 
A parte que parece ser mais complicada calcula quanto da coluna interesses nos precisamos.
Ela pega o tamanho total da coluna interesses e subtrai o tamanho da parte que subtraímos para interesse1. Então subtraímos mais um, para começarmos depois da virgula.
Agora basta fazer isto para outras colunas interesses.

UPDATE meus_contatos
SET interesse2 = SUBSTRING_INDEX (interesse, ',' , 1);

UPDATE meus_contatos
SET interesses = TRIM(RIGTH(interesses,
(LENGTH(interesses) - LENGTH(interesse2) -1)));
 

UPDATE meus_contatos
SET interesse3 = SUBSTRING_INDEX (interesse, ',' , 1);

UPDATE meus_contatos
SET interesses = TRIM(RIGTH(interesses,
(LENGTH(interesses) - LENGTH(interesse3) -1)));
 
Por fim tudo que resta na coluna interesses é só um valor.

UPDATE meus_contatos SET interesse4 = interesses;



Substr

Função SUBSTR no UPDATE.

Separando o primeiro Interesse1.
UPDATE interesses SET
interesse1 = SUBSTRING_INDEX (interesses, ',', 1);
  • O código acima procura na coluna "interesses" o valor que está antes da primeira virgula e insere na coluna "interesse1".
  •  O símbolo ',' representa a separação entre os interesses que estão na coluna interesses.
  • O Numeral 1 quer dizer primeira virgula.
Agora nos iremos utilizar outra função substring_index para remover da coluna interesses os dados que acabamos de mover para a coluna interesses1.
interesses = SUBSTR(interesses, LENGTH(interesse1)+ 2);
  •  A parte "LENGTH(interesse1)" conta o tamanho do campo interesse1.
  •   A parte "+ 2" acrescenta mais dois caracteres um para a virgula e outro para o espaço.
  • SUBSTR retorna parte da linha de texto original nesta coluna. Ela pega a linha e corta a primeira parte que especifica entre os parênteses, e retorna a segunda parte.
Agora é só prosseguir para outras colunas interesses...
Interesse2
interesse2 = SUBSTRING_INDEX (interesses, ',', 1);
interesses = SUBSTR(interesses, LENGTH(interesse2)+ 2);
Interesse3
interesse3 = SUBSTRING_INDEX (interesses, ',', 1);
interesses = SUBSTR(interesses, LENGTH(interesse3)+ 2);
Interesse4
interesse4 = interesses;


Três maneiras de criar tabelas já inserindo dados.

Neste exemplo já temos uma tabela chamada profissao1, com  nomes de profissões redundantes.

Primeira forma: CREATE, SELECT, e INSERT a (quase) o mesmo tempo.
CREATE TABLE profissao2 (
id INT IDENTITY PRIMARY KEY NOT NULL,
profissao_tab2 VARCHAR(20) NOT NULL
);
INSERT INTO profissao2 (profissao_tab2)
SELECT profissao_tab1 FROM profissao1
GROUP BY profissao_tab1
ORDER BY profissao_tab1
Obs: A Clausula GROUP BY serve para nao inserir dados repetidos em nossa nova tabela.


Segunda forma: CREATE TABLE com SELECT, dai use o ALTER para adicionar a chave primaria.
CREATE TABLE profissao2 AS
SELECT profissao_tab1 FROM profissao1
GROUP BY profissao_tab1
ORDER BY profissao_tab1;

ALTER TABLE profissao2
ADD COLUMN id INT NOT NULL AUTO_INCREMENT FIRST;
ADD PRIMARY KEY (id);

Terceira forma: CREATE, SELECT e INSERT ao mesmo tempo.
CREATE TABLE profissao2 (
id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
profissao_tab2 varchar(20) NOT NULL
) AS
SELECT profissao_tab1 FROM profissao1
GROUP BY profissao_tab1
ORDER BY profissao_tab1
Obs: A clausula "AS" esta afunilando todos os dados de saída para uma nova tabela.
Ele povoou a nova tabela com o resultado do SELECT.

ALL, ANY e SOME
Esta três palavras trabalham com operadores de comparação e conjunto de resultados.

Utilizando o ALL
SELECT nome, nota FROM nota_restaurante
WHERE nota > ALL
(SELECT nota FROM nota_restaurante
WHERE nota > 3 AND nota < 9)


SELECT nome, nota FROM nota_restaurante
WHERE nota > ALL
(SELECT nota FROM nota_restaurante
WHERE nota > 3 AND nota < 9)


Maior que ALL (maior que todos) encontra qualquer valor maior que o maior valor do conjunto.

Menor que ALL (menor que todos) encontra qualquer  valor menor que o menor valor no conjunto.

Usando ANY (qualquer)
ANY avalia como verdadeiro se qualquer valor do conjunto combinar com a condição. Observe o seguinte exemplo:
SELECT nome, nota FROM  nota_restaurante
WHERE nota > ANY
(SELECT nota FROM nota_restaurante WHERE nota > 3 AND nota < 9);


Maior que ANY (maior que qualquer) encontra qualquer valor maior que o menor valor no conjunto.
Menor que ANY (menor que qualquer) encontra qualquer valor menor que o maior valor no conjunto.

Criando uma tabela temporária

Só precisamos adicionar ao comando a plavra TEMPORARY.

CREATE TEMPORARY TABLE nome_tabela
(
    id INT,
    Coluna VARCHAR(50)
);

Um atalho para tabela temporária:
CREATE TEMPORARY TABLE minha_tabela_temporaria AS
SELECT * FROM minha_tabela_permanente;


CAST
As vezes você tem uma  tem uma coluna de um certo tipo de dados, mas quer que ela seja de um tipo diferente de dados ao ser exibida. SQL tem uma função chamada CAST()  que pode fazer dados de um tipo serem convertidos em outro.
A sintaxe é esta:
CAST (sua_coluna, TIPO)

Tipo pode ser qualquer um destes:
CHAR()
DATE
DATETIME
DECIMAL
SIGNED [INTERGER]
TIME
UNSIGNED [INTERGER]


Converter uma linha de texto com data em tipo DATE:
SELECT CAST(‘2005-01-01’ AS DATE);
Converter um tipo integer para decimal:
SELECT CAST(2 AS DECIMAL);

Você pode utilizar o INTEGER nestas situações
Decimal para integer
TIME, DATE, DATETIME, CHAR para DECIMAL, ou INTEGER.

Outros lugares que você pode utilizar CAST(), incluir lista de valores de um comando INSERT e dentro da lista de coluna SELECT.

Para saber qual usuário está conectado ao MySQL digite;
SELECT CURRENT_USER;

 
Para saber data e hora atual digite:
SELECT CURRENT_DATE;
SELECT CURRENT_TIME;
SELECT CURRENT_USER;


INSERT com SELECT
INSERT  INTO new.empregado(cd_nome, nome)
(SELECT cd_nome, nome FROM old.empregado)  ;