MySQL - Operações com SQL básico Para testar se o MySQL esta instalado corretamente , execute a seguinte linha no prompt do DOS: c:\mysql\bin\mysql Se tudo estiver nos seus devidos lugares você vai receber a seguinte tela: Vamos então a partir daqui mostrar alguns conceitos básicos relacionados com comandos SQL para o MySQL no Windows usando o prompt de comandos. Embora existam programas com interfaces gráficas que fazem este serviço acho bom você conhecer esta opção. Os comandos serão digitados na linha de comando ; após o termino de cada linha tecle Enter e para executar o comando tecle ; e Enter. 1- Para exibir os banco de dados disponíveis use o comando : Show DataBases O resultado do comando esta exibindo os três banco de dados que eu tenho disponível no meu MySQL Nota: O comando Select Database(); exibe o database atual. 2- Agora eu vou criar um novo banco de dados chamado Teste usando o comando : Create Database e a seguir irei exibir os banco de dados existentes , conforme abaixo: 3- Para trabalhar com um banco de dados usamos o comando : Use <nome_do_banco_de_dados> . Vamos usar o banco de dados Teste e exibir as tabelas existentes usando o comando Show Tables: O comando Show tables não encontrou nenhuma tabela no banco de dados Teste Nota: Para excluir um banco de dados use comando : DROP DATABASE <nome_do_banco_de_dados> 4- Vamos criar uma tabela no banco de dados Teste. Para isto usamos o comando Create Table com a seguinte sintaxe: CREATE TABLE table_name (column_name1 type [modifiers] [, column_name2 type [modifiers]]) Vamos criar uma tabela chamada Clientes com seguinte estrutura: • • • • Codigo - chave primária Nome - VarChar(30) Endereco - VarChar(30) Estado - char(2) nota: Para definir a coluna como do tipo autoincremental basta acrescentar :AUTO_INCREMENT na definição da coluna. Para o exemplo acima faríamos: CODIGO BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT 5- Para inserir dados na tabela usamos o comando Insert Into : INSERT INTO table_name (column1, column2, ..., columnN) VALUES (value1, value2, ..., valueN) Vamos inserir um registro na tabela usando a instrução SQL abaixo: INSERT INTO CLIENTES (Codigo,Nome, endereco, estado) VALUES(1,'Macoratti', 'Av. Mirassol 100', 'SP'); 6- Se quisermos obter informações detalhadas da estrutura da tabela usamos o comando : DESCRIBE <NOME_DA_TABELA> Nota: Temos abaixo os principais tipos de dados Tipo de Dados Descrição INT Representa um valor inteiro. Pode ser com sinal ou sem sinal REAL Representa um valor com ponto flutuante. Oferece uma grande precisão e uma extensa faixa de valores CHAR(n) Representa um valor caractere com tamanho fixo. TEXT Representa um valor para caractere com tamanho variável DATE Representa um valor de data padrão. Formato : YYYY-MM-DD (200101-01) TIME Representa um valor de tempo padrão. Armazena a hora de um dia independente de uma data particular. Formato : hh:mm:ss (06:00:00) 7- Para excluir uma tabela basta usar o comando DROP <nome_da_tabela> 8- Para atualizar uma coluna podemos usar o comando : UPDATE . Abaixo uma das sintaxes possíveis onde atualizamos a coluna Endereco. A sintaxe para o comando UPDATE é : UPDATE table_name SET column1=value1, column2=value2, ..., columnN=valueN [WHERE clause] 9 - Para excluir uma linha da tabela usamos o comando DELETE . Abaixo estou excluindo a linha inserida acima . Note que é aconselhável especificar a condição na cláusula WHERE. A sintaxe é : DELETE FROM table_name [WHERE clause] 10 - Vamos realizar uma junção de duas tabelas. Para isto vamos criar uma tabela chamada veículos que estará relacionada coma tabela teste criada acima e conterá os dados dos veículos de cada cliente: Exibindo as tabelas existentes e a estrutura da tabela criada teremos: Vamos agora incluir alguns dados na tabela teste e na tabela veículos usando INSERT INTO. Obs: Podemos usar a notação Insert Into values() : Ex: insert into veiculos values( 1, 'MERCEDES', 'BRANCA', 1, 3000) Abaixo temos o resultado final das incluções: Vamos fazer a nossa junção. Usamos para isto a cláusula SELECT e definimos a tabela e o nome do campo que desejamos exibir separados por um ponto ; a seguir relacionamos as tabelas de dados na cláusula FROM e definimos a condição na cláusual WHERE . O resultado é exibido abaixo: O que foi mostrado aqui é apenas a ponto do iceberg , mas com os conceitos expostos você pode se virar usando comandos SQL básicos na linha de comando do prompt do MySQL. ALTER TABLE nome_da_tabela especificações_para_alteração; As especificações para anteração devem ser listadas e separadas por vírgula, a natureza delas pode variar: excluir colunas, adicionar colunas, modificar uma coluna, adicionar/renomear um índice/chave, etc. Algumas das especificações mais comumente usadas são: • • • • ADD COLUMN nome_da_nova_coluna DROP COLUMN nome_da_coluna MODIFY COLUMN nome_da_coluna definições_da_coluna ADD INDEX/KEY nome_do_indice (lista_de_colunas) • • • DROP INDEX/KEY nome_do_indice ADD PRIMARY KEY (lista_de_colunas) DROP PRIMARY KEY Veja alguns exemplos: ALTER TABLE tabela MODIFY COLUMN coluna_6 INT NOT NULL; Isso modificaria a coluna chamada coluna_6 para INT e NOT NULL. ALTER TABLE tabela ADD INDEX indice(coluna_1, coluna_2); O comando acima adiciona à tabela de nome tabela um índice de nome indice referente às colunas coluna_1 e coluna_2. ALTER TABLE tabela DROP PRIMARY KEY, ADD PRIMARY KEY (coluna_1, coluna_3, coluna_4); Este comando apara a atual chave primária da tabala chamada tabela e adiciona, em seguida, uma nova com as colunas coluna_1, coluna_3 e coluna_4. ALTER TABLE tabela DROP COLUMN coluna_0; Este último comando elimina a coluna coluna_0 da tabela chamada tabela. Seleção de tabelas I Como realizar seleções eficientemente. Exemplos práticos. A seleção total ou parcial de uma tabela se realiza mediante a instrução Select. Em tal seleção há que especificar: -Os campos que queremos selecionar -A tabela na qual fazemos a seleção Em nossa tabela modelo de clientes poderíamos fazer, por exemplo, uma seleção do nome e endereço dos clientes com uma instrução deste tipo: Select nome, endereço From clientes Se quiséssemos selecionar todos os campos, ou seja, toda a tabela, poderíamos utilizar o asterisco * da seguinte forma: Select * From clientes Também é muito útil filtrar os registros mediante condições que vêem expressas depois da cláusula Where. Se quiséssemos mostrar os clientes de uma determinada cidade usaríamos uma expressão como esta: Select * From clientes Where cidade Like 'Rio de janeiro' Ademais, poderíamos ordenar os resultados em função de um ou vários de seus campos. Para este último exemplo poderíamos ordená-los por nome assim: Select * From clientes Where cidade Like 'Rio de janeiro' Order By nome Tendo em conta que pode haver mais de um cliente com o esmo nome, poderíamos dar um segundo critério que poderia ser o sobrenome: Select * From clientes Where cidade Like 'Rio de Janeiro' Order By nome, sobrenome Se invertêssemos a ordem " nome,sobrenome " por " sobrenome, nome ", o resultado seria diferente. Teríamos os clientes ordenados por sobrenome e aqueles que tivessem sobrenomes idênticos se sub-classificariam pelo nome. É possível também classificar por ordem inversa. Se por exemplo quiséssemos ver nossos clientes por ordem de pedidos realizados tendo aos maiores em primeiro lugar escreveríamos algo assim: Select * From clientes Order By pedidos Decres Uma opção interessante é a de efetuar seleções sem coincidência. Se por exemplo, buscássemos saber em que cidades se encontram nossos clientes sem a necessidade de que para isso apareça várias vezes a mesma cidade, usaríamos uma sentença desta classe: Select Distinct cidade From clientes Order By cidade Assim evitaríamos ver repetido Rio de Janeiro tantas vezes quantos clientes tivermos nessa cidade. Seleção de tabelas II Lista de operadores e exemplos práticos para realizar seleções. Quisemos compilar na forma de tabela certos operadores que podem ser úteis em determinados casos. Estes operadores serão utilizados depois da cláusula Where e podem ser combinados habilmente mediante parênteses para otimizar nossa seleção a níveis bastante altos. Operadores matemáticos: > Maior que < Menor que >= Maior ou igual que <= Menor ou igual que <> Diferente = Igual Operadores lógicos And Or Not Outros operadores Like Seleciona os registros cujo valor de campo se assemelhe, não tendo em conta maiúsculas e minúsculas. In e Not In Dá um conjunto de valores para um campo para os quais a condição de seleção é (ou não) válida Is Null e Is Not Null Seleciona aqueles registros onde o campo especificado está (ou não) vazio. Between...And Seleciona os registros compreendidos em um intervalo Distinct Seleciona os registros não coincidentes Desc Classifica os registros por ordem inversa Curingas * Substitui a todos os campos % Substitui a qualquer coisa ou nada dentro de uma cadeia _ Substitui só um caractere dentro de uma cadeia Vejamos a seguir aplicações práticas destes operadores. Nesta sentença selecionamos todos os clientes de Salvador cujo nome não seja Jose. Como se pode ver, empregamos Like ao invés de = simplesmente para evitar inconvenientes devido ao emprego ou não de maiúsculas. Select * From clientes Where cidade Like 'salvador' And Not nome Like 'Jose' Se quiséssemos recolher em uma seleção aos clientes de nossa tabela cujo sobrenome começa por A e cujo número de pedidos esteja compreendido entre 20 e 40: Select * From clientes Where sobrenomes like 'A%' And pedidos Between 20 And 40 O operador In, será visto mais adiante, é muito prático para consultas em várias tabelas. Para casos em uma única tabela é empregada da seguinte forma: Select * From clientes Where cidade In ('Salvador','Fortaleza','Florianopolis') Desta forma selecionamos aqueles clientes que vivem nessas três cidades. Seleção de tabelas III Como realizar seleções sobre várias tabelas. Exemplos práticos baseados em uma aplicação de e-comercio. Um banco de dados pode ser considerado como um conjunto de tabelas. Estas tabelas, em muitos casos, estão relacionadas entre elas e se complementam unas com outras. Fazendo referência ao nosso clássico exemplo de um banco de dados para uma aplicação de e- comercio, a tabela clientes que estivemos falando pode estar perfeitamente coordenada com uma tabela onde armazenamos os pedidos realizados por cada cliente. Esta tabela de pedidos pode por sua vez, estar conectada com uma tabela onde armazenamos os dados correspondentes a cada artigo do inventário. Deste modo poderíamos facilmente obter informações contidas nessas três tabelas como pode ser a designação do artigo mais popular em uma determinada região onde a designação do artigo seria obtida na tabela de artigos, a popularidade (quantidade de vezes que esse artigo foi vendido) viria da tabela de pedidos e a região estaria compreendida obviamente na tabela clientes. Este tipo de organização baseada em múltiplas tabelas conectadas nos permite trabalhar com tabelas muito mais manejáveis e ao mesmo tempo, nos evita copiar o mesmo campo em vários lugares já que podemos acessa-lo a partir de uma simples chamada à tabela que o contém. Neste capítulo veremos como, usando o que foi aprendido até agora, podemos realizar facilmente seleções sobre várias tabelas. Definiremos antes de nada as diferentes tabelas e campos que vamos utilizar em nossos exemplos: Tabela de clientes Nome campo Tipo campo id_cliente Numérico inteiro nome Texto sobrenomes Texto endereço Texto cidade Texto cep Texto telefone Numérico inteiro email Texto Tabela de pedidos Nome campo Tipo campo id_pedido Numérico inteiro id_cliente Numérico inteiro id_artigo Numérico inteiro data Data quantidade Numérico inteiro Tabela de artigos Nome campo Tipo campo id_artigo Numérico inteiro titulo Alfanumérico autor Alfanumérico editorial Alfanumérico preço Numérico real Estas tabelas podem ser utilizadas simultaneamente para extrair informações de todo tipo. Suponhamos que queremos enviar um mailing a todos aqueles que tiverem realizado um pedido nesse mesmo dia. Poderíamos escrever algo assim: Select clientes.sobrenomes, clientes.email From clientes,pedidos Where pedidos.data like '25/02/00' And pedidos.id_cliente= clientes.id_cliente Como pode ser visto desta vez, depois da cláusula From, introduzimos o nome das duas tabelas de onde tiramos as informações. Ademais, o nome de cada campo vai precedido da tabela de proveniência separado ambos por um ponto. Nos campos que possuem um nome que só aparece em uma das tabelas, não é necessário especificar sua origem embora na hora de ler sua sentença possa ser mais claro tendo esta informação mais precisa. Neste caso, o campo data poderia ter sido designado como "data" ao invés de "pedidos.data". Vejamos outro exemplo mais para consolidar estes novos conceitos. Desta vez queremos ver o título do livro correspondente a cada um dos pedidos realizados: Select pedidos.id_pedido, artigos.titulo From pedidos, artigos Where pedidos.id_artigo=artigos.id_artigo Na verdade a filosofia continua sendo a mesma que para a consulta de uma única tabela. Seleção de tabelas IV O emprego de funções para a exploração dos campos numéricos e outras utilidades. Exemplos práticos. Além dos critérios até agora explicados para realizar as consultas em tabelas, SQL permite também aplicar um conjunto de funções pré-definidas. Estas funções, embora sejam básicas, podem nos ajudar em alguns momentos a expressar nossa seleção de uma maneira mais simples sem ter que recorrer a operações adicionais por parte do script que estivermos executando. Algumas destas funções são representadas na seguinte tabela: Função Descrição Soma(campo) Calcula a soma dos registros do campo especificado Avg(Campo) Calcula a média dos registros do campo especificado Count(*) Proporciona o valor do número de registros que foram selecionados Max(Campo) Indica qual é o valor máximo do campo Min(Campo) Indica qual é o valor mínimo do campo Dado que o campo da função não existe no banco de dados, pois o estamos gerando virtualmente, isto pode criar inconvenientes quando estivermos trabalhando com nossos scripts na hora de tratar seu valor e seu nome de campo. É por isso que o valor da função tem que ser recuperada a partir de um apelido que nós especificaremos na sentença SQL a partir da instrução AS. A coisa poderia ficar assim: Select Soma(total) As soma_pedidos From pedidos A partir desta sentença calculamos a soma dos valores de todos os pedidos realizados e armazenamos esse valor em um campo virtual chamado soma_pedidos que poderá ser utilizado como qualquer outro campo por nossas páginas dinâmicas. Obviamente, tudo que foi visto até agora pode ser aplicado neste tipo de funções de modo que, por exemplo, podemos estabelecer condições com a cláusula Where construindo sentenças como esta: Select Soma(quantidade) as soma_artigos From pedidos Where id_artigo=6 Isto nos proporcionaria a quantidade de exemplares de um determinado livro que foram vendidos. Outra propriedade interessante destas funções é que permitem realizar operações com vários campos dentro de um mesmo parênteses: Select Avg(total/quantidade) From pedidos Esta sentença dá como resultado o preço médio que estão sendo vendidos os livros. Este resultado não tem porquê coincidir com o do preço médio dos livros presentes no inventário, já que, pode ser que as pessoas tenham tendência a comprar os livros caros ou os baratos: Select Avg(precio) as preco_venda From artigos Uma cláusula interessante no uso das funções é Group By. Esta cláusula nos permite agrupar registros aos quais vamos aplicar a função. Podemos por exemplo calcular o dinheiro gastado por cada cliente: Select id_cliente, Soma(total) as soma_pedidos From pedidos Group By id_cliente Ou saber o número de pedidos que foram realizados: Select id_cliente, Count(*) as numero_pedidos From pedidos Group By id_cliente As possibilidades como vemos são numerosas e pode ser práticas. Agora tudo fica à disposição de nossas ocorrências e imaginação. Vejamos o Diagrama Entidade-Relacionamento abaixo: Neste diagrama existem duas entidades, uma chamada cliente outra tipo cliente e um relacionamento que interliga essas entidades. Em um banco de dados é necessário definir fisicamente esse relacionamento, e ele é definido pela chave estrangeira (Foreing Key). Implementando em um banco as duas tabelas teríamos: mysql>create table cliente( codigo int not null primary key, nome varchar(50), tipo int, endereco varchar(100), cidade varchar(30), uf varchar(2), datanascimento date, datacadastro date); mysql> create table tipocliente( codigotipo int not null primary key, descricao varchar(500)); Assim ficaram as tabelas: mysql> describe cliente; +----------------+-----------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------------+-----------------+------+-----+---------+-------+ | codigo | int(11) | NO | PRI | 0 | | | nome | varchar(100) | YES | | NULL | | | tipo | int | YES | | NULL | | | endereco | varchar(100) | YES | | NULL | | | cidade | varchar(30) | YES | | NULL | | | uf | varchar(2) | YES | | NULL | | | datanascimento | date | YES | | NULL | | | datacadastro | date | YES | | NULL | | +----------------+-----------------+------+-----+---------+-------+ 8 rows in set (0.03 sec) mysql> describe tipocliente; +----------------+-----------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------------+-----------------+------+-----+---------+-------+ | codigotipo | int(11) | NO | PRI | 0 | | | descricao | varchar(500) | YES | | NULL | | +----------------+-----------------+------+-----+---------+-------+ 2 rows in set (0.03 sec) Mas ainda não existe a implementação da ligação dessas duas tabelas,