Você está na página 1de 8

Montagem de consultas (queries) SQL dentro do PHP

Introduo
Grande parte de nosso cdigo PHP no desenvolvimento de projeto de comrcio eletrnico est relacionado s inseres, alteraes, eliminaes e consultas s informaes existentes em nosso banco de dados. O PHP a linguagem de programao que tem a capacidade de trabalhar junto ao banco de dados, na consulta ou gravao de informaes. Podemos perceber que ele no trabalha sozinho. O banco de dados em si uma tecnologia a parte (independente) do PHP e o responsvel pela manipulao destas informaes. O PHP nada mais faz do que solicitar a recuperao ou a gravao das informaes. Podemos dizer que o PHP um cliente do Banco de Dados que efetua solicitaes e que o Banco de Dados serve o PHP com as resultado destas solicitaes, seja enviando ou alterando informaes.. Quem faz o servio a engine de banco de dados. Quando menciono engine, quero dizer qualquer verso de um DBMS DataBase Management System, ou seja, um Sistema Gerenciador de Banco de Dados (Exemplo: MYSQL, ORACLE, DB2, MS-SQL, Postgree, Firebird, etc).

O Banco de dados e as consultas SQL


Antes de nos aventurarmos pelo PHP, devemos ter um bom conhecimento de como manipular um banco de dados. Para isto, devemos entender de que forma possvel manipular as informaes a serem recuperadas ou gravadas nos bancos de dados. A maneira pela qual isto ocorre atravs da execuo das chamadas consultas SQL que so enviadas para um engine de banco de dados. Esta chamada consulta SQL nada mais do que um comando, em ingls, que o banco de dados capaz de interpretar e executar. Basicamente, existem dois tipos de consultas:Consulta de Seleo: Retorna um conjunto de informaes Consulta de Atualizao: Efetua alguma alterao no banco de dados, seja em sua estrutura (altera tabela, colunas, etc) ou em seu contedo (insere, altera ou elimina linhas e colunas) Uma consulta de seleo, uma vez executada, costuma retornar um conjunto de informaes na forma de uma ou mais colunas. Uma consulta de atualizao, uma vez executada, costuma informar o nmero de linhas que foram alteradas por esta consulta.

Montando a estrutura de uma consulta de seleo


Vamos utilizar o conjunto de linhas abaixo para as prximas explicaes:-

Aplicaes Corporativas

Prof. Carlos Majer

Montagem de consultas (queries) SQL dentro do PHP


+--------------+---------------+--------+---------+------------+-------+ | nome | cidade | estado | saldo | ultvenda | ativo | +--------------+---------------+--------+---------+------------+-------+ | Carlos | Sao Paulo | SP | 100 | 2008-05-02 | 1 | | Ana | Gramado | RS | 27.5 | 2007-12-20 | 1 | | Carina | Petropolis | RJ | -590.87 | 2005-10-23 | 0 | | Ana Carolina | Fortaleza | CE | 0 | 2007-10-07 | 1 | | Joao Carlos | Florianopolis | SC | 2520 | 2008-04-12 | 1 | | Joao | Pirapora | SP | 0.72 | 2001-01-15 | 0 | +--------------+---------------+--------+---------+------------+-------+

Onde as colunas foram criadas da seguinte forma:+-----------+------------------+ | Field | Type | +-----------+------------------+ | nome | varchar(50) | | cidade | varchar(30) | | estado | char(2) | | saldo | float | | ultVenda | date | | ativo | tinyint(1) | +-----------+------------------+ O comando abaixo ir selecionar todos as colunas (representado pelo asterisco) da tabela CLIENTES, onde a coluna NOME seja igual string/texto "JOAO". SELECT * FROM CLIENTES WHERE NOME = "JOAO" No importa a caixa (minsculo/maisculo) do comando. Quando trabalhamos com strings (trechos de textos) necessrio delimitar a string utilizando o sinal de aspas que pode ser simples ou duplas, dependendo do sistema de banco de dados. No MYSQL voc pode trabalhar tanto com simples quanto com duplas. Caso voc venha a executar estes comandos no MYSQL, no se esquea de colocar o sinal de ponto e vrgula no final ";" do comando. Note que temos a seguinte estrutura neste comando:SELECT Verbo SELECIONAR (Neste caso, significa SELECIONE) * Representa todas as colunas FROM Palavra DE CLIENTES Nome de uma tabela existente, no banco de dados WHERE Palavra ONDE NOME Coluna da tabela CLIENTES Seja igual = "JOAO" String (texto) a ser localizado Este comando ir selecionar apenas a ltima linha, onde temos a coluna nome = "JOAO". +------+----------+--------+-------+ | nome | cidade | estado | saldo | +------+----------+--------+-------+ | Joao | Pirapora | SP | 0.72 | +------+----------+--------+-------+
Aplicaes Corporativas Prof. Carlos Majer

Montagem de consultas (queries) SQL dentro do PHP


Note que a linha anterior, onde a coluna NOME est com o valor "Joao Carlos", no foi selecionada.

Uma vez que se sabe a sintaxe bsica do comando, podemos efetuar algumas derivaes mais complexas:Selecione as colunas nome, estado e telefone da tabela clientes onde o estado seja igual a "SP".
SELECT nome, estado FROM clientes WHERE estado="SP"

Para isto, utilizamos a clusula WHERE, que permite definirmos um filtro, neste caso, com base no contedo da coluna estado, que deve ser igual a "SP". O resultado desta consulta retornar as seguintes linhas:+--------+--------+ | nome | estado | +--------+--------+ | Carlos | SP | | Joao | SP | +--------+--------+ Note que podemos exibir as colunas que desejarmos. Tambm que no obrigatrio exibir uma coluna (estado) que faa parte do filtro (WHERE estado="SP"). De forma similar, podemos utilizar o operador de negao "!" (NOT) para NO selecionar linhas conforme um determinado filtro. Exemplo:-

SELECT nome, estado FROM clientes WHERE estado != "SP"

O comando acima ir selecionar os clientes que no sejam de So Paulo. Resultado:+--------------+---------------+--------+ | nome | cidade | estado | +--------------+---------------+--------+ | Ana | Gramado | RS | | Carina | Petropolis | RJ | | Ana Carolina | Fortaleza | CE | | Joao Carlos | Florianopolis | SC | +--------------+---------------+--------+

Selecione as colunas nome, cidade e uf, da tabela clientes, onde a coluna nome tenha em seu contedo a seqncia de caracteres "CAR". SELECT nome, cidade, estado FROM clientes WHERE nome LIKE "%CAR%" Note que o uso do LIKE nos permite efetuar busca de trechos de texto dentro do contedo da coluna. O desenvolvedor deve utilizar o % para isto.
Aplicaes Corporativas Prof. Carlos Majer

Montagem de consultas (queries) SQL dentro do PHP


Ao informar o sinal de porcentagem "%" entre o trecho de texto "CAR", voc est orientando o SQL a localizar as linhas que tenham o trecho de texto "CAR" em qualquer posio da coluna NOME. O resultado desta consulta ser:+--------------+---------------+--------+ | nome | cidade | estado | +--------------+---------------+--------+ | Carlos | Sao Paulo | SP | | Carina | Petropolis | RJ | | Ana Carolina | Fortaleza | CE | | Joao Carlos | Florianopolis | SC | +--------------+---------------+--------+ Voc tambm pode fazer buscas apenas por nomes que comecem com "CAR", retirando o sinal de porcentagem da frente do C. Exemplo:SELECT nome, cidade, estado FROM clientes WHERE nome LIKE "CAR%" Isto retornar as seguintes linhas:+--------+------------+--------+ | nome | cidade | estado | +--------+------------+--------+ | Carlos | Sao Paulo | SP | | Carina | Petropolis | RJ | +--------+------------+--------+ Se podemos selecionar linhas cuja coluna nome comea com um trecho de texto, tambm podemos selecionar uma coluna que finalize com outro trecho de texto. No exemplo abaixo, selecionamos as linhas cuja (coluna) cidade tem a letra "o" em seu final:SELECT nome, cidade, estado FROM clientes WHERE cidade LIKE "%O" O resultado ser:+--------+-----------+--------+ | nome | cidade | estado | +--------+-----------+--------+ | Carlos | Sao Paulo | SP | | Ana | Gramado | RS | +--------+-----------+--------+

Selecionando coluna com contedo baseado em valores


Para selecionarmos uma coluna que tenha um valor (inteiro ou flutuante, isto , com casas decimais) no necessrio delimit-la entre aspas:SELECT nome, saldo FROM clientes WHERE saldo > 50
Aplicaes Corporativas Prof. Carlos Majer

Montagem de consultas (queries) SQL dentro do PHP


Isto ir retornar as seguintes linhas:+-------------+-------+ | nome | saldo | +-------------+-------+ | Carlos | 100 | | Joao Carlos | 2520 | +-------------+-------+ Perceba que podemos aplicar o conceito de saldo negativo, uma vez que existe uma linha com a coluna saldo menor do que zero:SELECT nome, saldo FROM clientes WHERE saldo < 0 Isto ir retornar a seguinte linha:+--------+---------+ | nome | saldo | +--------+---------+ | Carina | -590.87 | +--------+---------+

Selecionando linhas com coluna com contedo baseado em datas


Para selecionarmos uma coluna que tenha um valor (inteiro ou flutuante, isto , com casas decimais) necessrio identificar qual o delimitador (que separa/delimita) da data, que pode variar conforme o engine de banco de dados. No MYSQL, a data deve ser delimitada entre aspas (da mesma forma que uma string) e os valores a serem informados so o ano, ms e dia, separados por um sinal de menos "-". No exemplo abaixo, estamos delimitando uma coluna data com o dia 30 de Abril de 2008:"2008-04-30" Desta forma, caso desejemos verificar as vendas efetuadas para os clientes no ano de 2008, deveramos executar o comando abaixo:Selecione as colunas nome, saldo e ultvenda, da tabela clientes, onde a coluna ultvenda seja maior ou igual data 01 de Janeiro de 2008. Traduzindo este comando para o SQL, temos a seguinte consulta:SELECT nome, saldo,ultvenda FROM clientes WHERE ultvenda >= "2008-01-01" O resultado disto ser:+-------------+-------+------------+ | nome | saldo | ultvenda | +-------------+-------+------------+ | Carlos | 100 | 2008-05-02 | | Joao Carlos | 2520 | 2008-04-12 | +-------------+-------+------------+ Note que as datas apareceram no formato ano, ms e dia.
Aplicaes Corporativas Prof. Carlos Majer

Montagem de consultas (queries) SQL dentro do PHP


Selecionando linhas com coluna com contedo baseado em valores lgicos
Ao verificarmos a coluna ativo, notamos que a mesma foi criada conforme o tipo tinyint(1). Este tipo o equivalente a um valor booleano, isto , um valor lgico que equivale a zero (0) ou um (1). Na lgica booleana, quando um valor zero, significa que ele falso e quando um valor um, significa que ele verdadeiro. Isto nos permite utilizar criar colunas para armazenar situaes lgicas, isto , que so verdadeiras ou falsas. Exemplos disto podem ser facilmente identificados:Se o cliente est ativo Se o usurio deseja receber e-mails Se um usurio do tipo administrador Isto quer dizer que podemos criar colunas para armazenar este tipo de informao, uma vez que os dois valores possveis seriam 0 (significando falso) ou 1 (significando verdadeiro). Na consulta abaixo, iremos selecionar os clientes que esto ativos:SELECT nome FROM clientes WHERE ativo = "1" Isto ir retornar:+--------------+ | nome | +--------------+ | Carlos | | Ana | | Ana Carolina | | Joao Carlos | +--------------+ Uma vez que o SQL consegue entender condies lgicas, a consulta acima poderia ser tambm escrita da seguinte forma:SELECT nome FROM clientes WHERE ativo O engine vai entender que a coluna ativo s deve ser listada se ela for verdadeira, isto , sele ela conter o valor 1.

Ordenando o resultado
Muitas vezes temos um grande conjunto de linhas advindo de uma consulta SQL que desejamos que estivesse numa determinada ordem. Exemplos prticos disto so:Clientes em ordem alfabtica (da coluna nome) Clientes com em ordem de saldo Clientes em ordem de estado e em seguida de cidade

Aplicaes Corporativas

Prof. Carlos Majer

Montagem de consultas (queries) SQL dentro do PHP


Para isto, podemos utilizar a clausula ORDER BY que nos permite ordenar o resultado de uma consulta por um ou mais colunas. No exemplo abaixo, iremos ordenar todos os clientes de nossa tabela em ordem de nome:SELECT * FROM clientes ORDER BY nome
+--------------+---------------+--------+---------+------------+-------+ | nome | cidade | estado | saldo | ultvenda | ativo | +--------------+---------------+--------+---------+------------+-------+ | Ana | Gramado | RS | 27.5 | 2007-12-20 | 1 | | Ana Carolina | Fortaleza | CE | 0 | 2007-10-07 | 1 | | Carina | Petropolis | RJ | -590.87 | 2005-10-23 | 0 | | Carlos | Sao Paulo | SP | 100 | 2008-05-02 | 1 | | Joao | Pirapora | SP | 0.72 | 2001-01-15 | 0 | | Joao Carlos | Florianopolis | SC | 2520 | 2008-04-12 | 1 | +--------------+---------------+--------+---------+------------+-------+

No exemplo abaixo, exibo apenas as colunas nome, estado e cidade ordenando as linhas primeiro por estado e em seguida por cidade:-

SELECT nome, estado, cidade FROM clientes ORDER BY estado, cidade +--------------+--------+---------------+ | nome | estado | cidade | +--------------+--------+---------------+ | Ana Carolina | CE | Fortaleza | | Carina | RJ | Petropolis | | Ana | RS | Gramado | | Joao Carlos | SC | Florianopolis | | Joao | SP | Pirapora | | Carlos | SP | Sao Paulo | +--------------+--------+---------------+ No prximo exemplo, ordeno as linhas conforme o saldo, filtrando apenas os clientes ativos:SELECT * FROM clientes WHERE ativo ORDER BY saldo
+--------------+---------------+--------+-------+------------+-------+ | nome | cidade | estado | saldo | ultvenda | ativo | +--------------+---------------+--------+-------+------------+-------+ | Ana Carolina | Fortaleza | CE | 0 | 2007-10-07 | 1 | | Ana | Gramado | RS | 27.5 | 2007-12-20 | 1 | | Carlos | Sao Paulo | SP | 100 | 2008-05-02 | 1 | | Joao Carlos | Florianopolis | SC | 2520 | 2008-04-12 | 1 | +--------------+---------------+--------+-------+------------+-------+

A clausula ORDER BY deve vir no final da consulta SQL.

Exerccios
Desenvolva uma tabela de produtos e preencha-a com os campos e as linhas necessrios, para executar as consultas abaixo.
Aplicaes Corporativas Prof. Carlos Majer

Montagem de consultas (queries) SQL dentro do PHP


Mostre a estrutura da tabela criada e seus valores (linhas) Desenvolva as seguintes consultas:1) Selecione todos os produtos que no estejam ativos 2) Selecione todos os produtos que estejam ativos a. Que sejam da categoria 1 (Computadores) b. Que sejam da categoria 2 (Impressoras) c. Que estejam em promoo i. Que sejam da categoria 3 (Perifricos) d. Que estejam na faixa de preo de 100 a 500 reais e. Que tenham em estoque f. Que tenham HP dentro do nome do produto 3) Selecione todos os pedidos a. Que sejam de So Paulo b. Que tenha sido feito neste ano c. Que tenham sido confirmados 4) Selecione todos os clientes a. Que no sejam de So Paulo

Concluso
Verificamos que possvel selecionar um conjunto de linhas atravs das consultas (comandos) SQL, filtrando os valores possveis das colunas que podem ser de vrios tipos (string, nmero, data). Identificamos tambm a maneira pela qual conseguimos filtrar os valores de determinadas colunas para restringir o nmero de informaes. Por final, modificamos a ordem pela qual as linhas resultantes so exibidas. O prximo passo ser estudarmos como utilizar estas consultas SQL via PHP.

Aplicaes Corporativas

Prof. Carlos Majer