Disciplina: Tópicos Especiais em TI – PHP Este material foi produzido com base nos livros e documentos citados abaixo, que possuem direitos autorais sobre o conteúdo. Favor adquiri-los para dar continuidade ao curso. Livro: Desenvolvendo Websites com PHP Apostila da Divisão de Serviços à Comunidade – Centro de Computação – Unicamp Banco de Dados: MySQL Este módulo da disciplina irá abordar a utilização de um banco de dados em nossos scripts PHP. Existem diversos banco de dados no mercado, abordaremos o uso do MySQL. Como criar o banco de dados Para criar um banco de dados no MySQL utilizamos o utilitário mysql. Assim, se você não tiver permissão para a criação de um banco de dados, deve-se solicitar ao administrador para que ele crie seu banco de dados inicial. Para a criação basta digitar: mysql > create database bdteste; > use bdteste; Para acessar a sua base de dados você digitará o comando: mysql –u username –p O primeiro parâmetro deve ser o caminho onde o mysql está localizado. A opção –u indica que será digitado o nome de usuário e a opção –p indica que será digitado a senha (password) para conexão. Tipos de dados aceitos pelo MySQL Tipo Tinyint[(M)] Bit, bool, boolean Smallint [(M)] Mediumint [(M)] Int [(M)] Bigint [(M)] Float(precisão) Float [(M,D)] Double [(M,D)] Real [(M,D)] Descrição Inteiro pequeno. Varia de –128 até +127 Sinônimo de tinyint. Inteiro variando de –32768 até +32767. Inteiro variando de –8388608 até +8388607 Inteiro normal, variando de –2147483648 até +2147483647 Inteiro grande, variando de – 9223372036854775808 até +9223372036854775807 Ponto flutuante com precisão definida Ponto flutuante de precisão simples Ponto flutuante normal É um sinônimo para double 1 Decimal [(M,D)] Date Datetime Timestamp [(M)] Time Year [(2|4)] Char (M) Varchar (M) Tinytext text Esse tipo pode ser usado como uma string. Cada número corresponde a um caractere. Armazena uma data no formato yyy-mmdd. Pode variar de 1000-01-01 até 999912-31 Armazena data e hora. O intervalo suportado é de 1000-01-01 00:00:00 até 9999-12-31 23:59:59 Armazena a data em formato=padrão UNIX Armazena um tempo. Armazena um ano com 2 ou 4 dígitos String de tamanho fixo String de tamanho variável. Possui no máximo 255 caracteres Texto contendo até 255 caracteres Texto com até 65535 caracteres Observações: - M representa o tamanho máximo para exibição - D representa o número de dígitos após o ponto decimal - Os colchetes indicam as partes opcionais Como criar tabela em um banco de dados Após a criação do banco de dados podemos acessá-lo e começar a criar as tabelas que armazenarão os dados. Isso é feito por meio do comando CREATE TABLE, que possui a seguinte sintaxe: CREATE TABLE <nome_tabela> ( <nome_campo> tipo_de_dado [NULL | NOT NULL] [DEFAULT valor_padrão], ... ); Significado: nome_tabela: representa o nome da tabela que será criada. Não pode haver nomes de tabelas repetidos. nome_campo: representa o nome pelo qual o campo será referenciado. tipo_de_dado: deve ser substituído por um dos tipos aceitos pelo banco de dados. NULL|NOT NULL: define se o campo pode aceitar valores nulos ou não. DEFAULT: define um valor padrão para inserções na tabela. Esse valor será utilizado se nenhum valor para este campo for informado. Exemplo: Criação de tabelas para um loja virtual. As seguintes tabelas serão criadas – produtos, categorias e subcategorias. CREATE TABLE produtos( codigo_produto smallint NOT NULL, nome_produto varchar(80) NOT NULL, descricao_produto text, preco float NOT NULL, peso float, cod_categoria smallint NOT NULL, 2 ); cod_subcategoria smallint NOT NULL, adicionais text CREATE TABLE categorias( codigo_categoria smallint NOT NULL, nome_categoria varchar(60) NOT NULL, ); CREATE TABLE subcategorias( codigo_subcategoria smallint NOT NULL, nome_categoria varchar(60) NOT NULL, codigo_categoria smallint NOT NULL, ); Os campos seguidos da cláusula NOT NULL não aceitarão valores nulos no momento da inserção no banco de dados. Visualizando com o mysql Para mostrar o nome das tabelas criadas digitamos no gerenciador do MySQL: show tables; E para visualizar a estrutura de determinada tabela: describe <nome_tabela>; ou desc <nome_tabela>; Você verá uma tela com os nomes dos campos, o tipo, se aceitam valores NULL, os valores-padrão e outras características da tabela consultada. Inserindo informações em um banco de dados Cada linha de uma tabela de banco de dados é chamada de registro. Para inserir registros na tabela, utilizamos o comando SQL INSERT. Sintaxe: INSERT INTO <nome_tabela> VALUES (valor1, valor2, ..., valorn); INSERT INTO <nome_tabela> (nome_campo1, nome_campo 2, ..., nome_campox) VALUES (valor1, valor2, ..., valorx); No primeiro caso, os valores digitados no lugar de valor1, valor2, ..., valorn serão incluídos na mesma ordem em que foram definidos os campos no momento da criação da tabela. Os valores numéricos não devem ser delimitados por aspas. Já os dados do tipo char, varchar, date e outros devem ser delimitados por aspas simples. No segundo caso, os valores valor1, valor2, ..., valorx serão inseridos nos campos campo1, campo2, ..., campox da tabela. Os campos não listados receberão o valor 3 NULL ou um valor padrão (caso exista). Se os campos não listados foram criados com NOT NULL então ocorrerá um erro na execução do comando. Exemplo: INSERT INTO produtos VALUES( 1, ‘Camisa do gremio’, ‘Camisa com listras azuis’, 89.95, 1.5, 5, 2, ‘Disponivel com as numerações 3,5 e 9’); INSERT INTO produtos (codigo_produto, nome_produto, preco, cod_categoria, cod_subcategoria) VALUES (2, ‘Camisa do flamengo’, 49.95, 5, 2); A mensagem exibida após a execução deve ser: Query OK, 1 row affected (0.05 sec) Alterando um banco de dados Podemos alterar a estrutura de uma tabela ou os valores dos registros da tabela. Essas alterações podem ser realizadas pelos comandos UPDATE e ALTER TABLE. Comando UPDATE: Realiza alterações nos valores dos registros da tabela. Sintaxe: UPDATE <nome_tabela> SET campo1=valor1 [, campo2=valor2, … , campon=valorn] [WHERE <condicoes>]; Caso a cláusula WHERE não seja utilizada, a alteração será efetuada em todos os registros da tabela. Exemplos: Alteração do código de uma categoria: UPDATE categorias SET codigo_categoria=6 WHERE codigo_categoria=5; Alteração do código de todos os produtos que pertenciam a essa categoria: UPDATE produtos SET cod_categoria=6 WHERE cod_categoria=5; O gerenciador do banco de dados sempre informará o número de registros afetados após a execução do comando UPDATE. Comando ALTER TABLE: Realiza alterações na estrutura da tabela (inclui campos, altera nome de um campo ou de uma tabela). Sintaxe: ALTER TABLE <nome_tabela> ADD <nome_campo> tipo_de_dado; ALTER TABLE <nome_tabela> CHANGE tipo_de_dado not null; <nome_campo> <novo_nome_campo> 4 ALTER TABLE <nome_tabela> RENAME TO <novo_nome_tabela>; Exemplo: ALTER TABLE produtos ADD fabricante varchar(50); ALTER TABLE produtos CHANGE codigo_produto cod_prod (varchar(50)) not null; O campo fabricante será incluído como o último campo da tabela produtos. OBS: Não é possível excluir campos de uma tabela. Se precisarmos excluir um campo devemos apagar a tabela e criá-la novamente. Excluindo informação de um banco de dados Podemos realizar dois tipos de exclusões: excluir uma tabela ou excluir registros de uma tabela. Isto pode ser feito através dos comandos DELETE e DROP TABLE. Comando DELETE: Esse comando exclui um ou mais registros de uma tabela.Sintaxe: DELETE FROM <nome_tabela> [WHERE <condições>]; Caso a cláusula WHERE não seja utilizada todos os registros da tabela serão excluídos. Exemplos: Exclusão da categoria Artigos Esportivos da tabela categorias: DELETE FROM categorias WHERE nome_categoria=’Artigos Exportivos’; Exclusão de todos os produtos da categoria áudio e vídeo (3): DELETE FROM produtos WHERE cod_categoria=3; Exclusão de todos os produtos existentes na tabela: DELETE FROM produtos; O gerenciador do banco de dados sempre informará o número de registros afetados após a execução do comando DELETE. Comando DROP TABLE: Serve para excluir uma tabela de um banco de dados. Sintaxe: DROP TABLE <nome_tabela1> [ , <nome_tabela2, ... ]; Exemplo: DROP TABLE produtos, categorias, subcategorias; Fazendo consultas em um banco de dados O comando SELECT é responsável pelos diversos tipos de consultas que podem ser feitas. 5 Comando SELECT: Com este comando podemos selecionar todas as linhas de uma ou mais tabelas, ou apenas uma parte delas. Sintaxe: SELECT <lista_campos> FROM <lista_tabelas> [WHERE <condições>]; Se <lista_campos> for substituída por um asterisco (*), serão retornados todos os campos existentes na(s) tabela(s) em uso. Se a cláusula WHERE for omitida, serão mostrados todos os registros das tabelas determinadas em <lista_tabelas>. Exemplos: Listar todas as categorias existentes na tabela categorias: SELECT * FROM categorias; Listar o código, o nome e o preço de todos os produtos (da tabela produtos): SELECT codigo_produto, nome_produto, preco FROM produtos; - Utilizando a cláusula WHERE para determinar quais registros devem ser retornados: Obtendo o nome e a descrição dos produtos que custam mais de R$50,00: SELECT nome_produto FROM produtos WHERE preco>50; Listar todas as subcategorias pertencentes a uma categoria da loja: SELECT nome_subcategoria FROM subcategorias WHERE codigo_categoria=5; O comando WHERE deve ser seguido por uma ou mais condições. Essas condições podem conter os operadores de comparação >, <, >=, <=, =, e <>. Se houver mais de uma condição a ser analisada, utilizamos os operadores lógicos AND e OR entre elas. Quando for necessário podemos utilizar o parênteses para determinar a ordem de avaliação das expressões. Exemplo: O comando abaixo irá retornar o nome de todos os produtos que pertencem à categoria Artigos Esportivos e à subcategoria Camisetas de Futebol ou retorna o nome dos produtos que possuem o código da subcategoria igual a 3, independentemente da categoria. SELECT nome_produto FROM produtos cod_subcategoria=2 OR cod_subcategoria=3; WHERE cod_categoria=5 AND Utilizando o parênteses para informar a ordem de avaliação das expressões: SELECT nome_produto FROM produtos (cod_subcategoria=2 OR cod_subcategoria=3); WHERE cod_categoria=5 AND Comando LIKE: A linguagem SQL oferece o operador LIKE que é utilizado para fazer consultas mais complicadas. Com ele, pode-se descobrir por exemplo todos os produtos que começam 6 com a letra “E”, ou todos que terminar com a letra “A”, ou todos que contenham a letra “O”. Podemos também buscar por palavras dentro de um campo dos registros de uma tabela. Exemplo: Pesquisa em uma tabela de veículos todos os carros que possuem o adicinal arcondicionado: SELECT * FROM veiculos WHERE adicionais LIKE ‘%ar-condicionado%’; Selecionar todas as categorias cujo nome terminam com a letra “o”: SELECT * FROM categorias WHERE nome_categoria LIKE ‘%o’; O comando LIKE é utilizado com o símbolo %, que representa uma sequencia de caracteres, ou com o símbolo _, que representa um caracter qualquer. Formas de uso: Operador LIKE ‘_E%’ LIKE ‘%O’ LIKE ‘A%E%O’ NOT LIKE ‘%@%’ Descrição A letra E está na segunda posição. Termina com a letra O. Começa com a letra A, termina com a letra O e possui a letra E no meio. Retorna aqueles que NÃO contêm o caractere @. Podemos utilizar, por exemplo, para verificar se existem e-mails digitados incorretamente em um banco de dados, já que o caractere @ deve existir em todos os e-mails. OBS: É importante lembrar que existe a distinção entre as letras maiúsculas e minúsculas. Por isso é interessante que as informações sejam armazenadas no banco de dados sempre em letras maiúsculas ou minúsculas para facilitar a pesquisa. Comando DISTINCT: Esta opção é utilizada sempre que queremos excluir valores repetidos do resultado de um consulta. Exemplo: Visualizar o nome de todas as cidades existentes no banco de dados. SELECT DISTINCT (cidade) FROM usuarios; Comando COUNT: Pode ser usado para contar o número de registros existentes na tabela. Exemplo: SELECT COUNT(*) FROM produtos; SELECT COUNT(*) FROM produtos WHERE cod_categoria=1; 7 Comando SUM: (usada apenas para dados do tipo numérico) Soma os valores de determinado campo de uma tabela. Exemplo: SELECT SUM (preco) FROM produtos; Comando MAX/MIN: Retorna o registro que possui determinado campo de maior/menor valor. Exemplo: SELECT MAX (preco) FROM produtos; Comando AVG: (usada apenas para dados do tipo numérico) Calcula a média dos valores de determinado campo. Exemplo: SELECT AVG (preco) FROM produtos; Comando GROUP BY: Permite agrupar os resultados de uma consulta. Exemplo: Para saber quantos produtos existem em cada uma das categorias, em vez de digitar um comando com COUNT para cada uma, podemos fazer da seguinte forma: SELECT cod_categoria,COUNT(*) FROM produtos GROUP BY cod_categoria; Também pode ser utilizado com a opção HAVING que seleciona alguns registros retornados pelo GROUP BY. Exemplo: SELECT cod_categoria,COUNT(*) FROM produtos GROUP BY cod_categoria HAVING COUNT(*)=1; Consultas utilizando mais de uma tabela: Ecemplo: Mostrar o nome da categoria com o número de ocorrências de produtos de cada código de categoria: SELECT cod_categoria,COUNT(*) FROM produtos,categorias codigo_categoria-cod_categoria GROUP BY nome_categoria; WHERE Ordenando resultados de uma consulta Para ordenar registros retornados por uma consulta a um banco de dados, utilizamos a opção ORDER BY. 8 Exemplo: Ordenar em ordem alfabética o nome de todos os produtos da loja. SELECT codigo_produto,nome_produto FROM produtos ORDER BY nome_produto; SELECT codigo_categoria,nome_subcategoria FROM subcategorias ORDER BY codigo_categoria,nome_subcategoria; Opção DESC: Ordenação decrescente dos resultados. Ex.: SELECT codigo_produto,nome_produto nome_produto DESC; FROM produtos ORDER BY Determinando o número de linhas retornadas Utilizando a opção LIMIT podemos determinar o número máximo de registros que uma consulta pode retornar. Exemplo: SELECT * FROM produtos WHERE nome_produto LIKE ‘CD%’ LIMIT 10; Desta forma será exibida a lista de CDs de 10 em 10 por página. Para mostrar o resultado sempre na mesma ordem ao usuário é necessário usar a opção ORDER BY. SELECT * FROM produtos WHERE nome_produto LIKE ‘CD%’ ORDER BY nome_produto LIMIT 10; Opção OFFSET: Utilizado em conjunto com o LIMIT para determinar a partir de qual registro a consulta deve retornar. SELECT * FROM produtos WHERE nome_produto LIKE ‘CD%’ ORDER BY nome_produto LIMIT 10 OFFSET 10; Utilizando INSERT e SELECT para inserir registros Podemos utilizar a combinação dos comandos INSERT e SELECT para inserir os registros de uma tabela em outra. Exemplo: INSERT INTO tabela_precos SELECT nome_produto, preco FROM produtos WHERE codigo_produto>=6 AND codigo_produto<=55; Criando e utilizando sequências Sequência é um recurso que utilizamos para fazer uma numeração automática de determinado campo de uma tabela. Utilizando-se MySQL pode-se criar um campo com a propriedade de auto-incremento da seguinte forma: 9 CREATE TABLE produto( codigo int NOT NULL AUTO_INCREMENT, nome varchar(70) NOT NULL, primary key(codigo) ); O campo com numeração automática deve ser declarado como chave primária da tabela para evitar a gravação de chaves repetidas. E para inserir registros na tabela: INSERT INTO produto (nome) VALUES (‘Taco de Baseball’); 10