Baixe o app para aproveitar ainda mais
Prévia do material em texto
Grupo SER Educacional | Tecnologias e Linguagens de Banco de Dados 1 TECNOLOGIAS E LINGUAGENS DE BANCO DE DADOS Tecnologias e Linguagens de Banco de Dados JOÃO DANILO NOGUEIRA COMANDO SELECT E O RELACIONAMENTO ENTRE TABELAS AULA 13 Diretor Executivo DAVID LIRA STEPHEN BARROS Direção Editorial ANDRÉA CÉSAR PEDROSA Projeto Gráfico MANUELA CÉSAR DE ARRUDA Autor JOÃO DANILO NOGUEIRA Desenvolvedor CAIO BENTO GOMES DOS SANTOS O Autor João Danilo Nogueira Olá. Meu nome é João Danilo. Sou graduado em Ciência da Computação pela Faculdade Grande Fortaleza (FGF) e amo programar. Atualmente, o foco de minha expertise é na área de gerenciamento de projetos, teoria dos números, RSA e criptografia. Vai ser um prazer enorme ajudar VOCÊ a se tornar um excelente desenvolvedor de software ou administrador de banco de dados. Conte comigo para lhe ajudar nessa trajetória rumo ao seu desenvolvimento profissional! Muito sucesso para você. JOÃO DANILO NOGUEIRA “ Iconográficos Olá. Meu nome é Manuela César de Arruda. Sou o responsável pelo projeto gráfico de seu material. Esses ícones irão aparecer em sua trilha de aprendizagem toda vez que: INTRODUÇÃO para o início do desenvolvimento de uma nova competência; DEFINIÇÃO houver necessidade de se apresentar um novo conceito; NOTA quando forem necessários observações ou complementações para o seu conhecimento; IMPORTANTE as observações escritas tiveram que ser priorizadas para você; EXPLICANDO MELHOR algo precisa ser melhor explicado ou detalhado; VOCÊ SABIA? curiosidades e indagações lúdicas sobre o tema em estudo, se forem necessárias; SAIBA MAIS textos, referências bibliográficas e links para aprofundamento do seu conhecimento; REFLITA se houver a necessidade de chamar a atenção sobre algo a ser refletido ou discutido sobre; ACESSE se for preciso acessar um ou mais sites para fazer download, assistir vídeos, ler textos, ouvir podcast; RESUMINDO quando for preciso se fazer um resumo acumulativo das últimas abordagens; ATIVIDADES quando alguma atividade de autoaprendizagem for aplicada; TESTANDO quando o desenvolvimento de uma competência for concluído e questões forem explicadas; Sumário 1 COMANDO SELECT E O RELACIONAMENTO ENTRE TABELAS ..................................... 8 1.1 Integridade referencial no MySQL ......................................................................... 8 1.2 Comando SELECT ................................................................................................ 17 1.2.1 Funções do MySQL ................................................................................. 19 1.2.2 Comandos SELECT encadeados ................................................................ 21 Considerações Finais ................................................................................................ 22 Atividades de Autoaprendizagem .............................................................................. 22 Questionário Avaliativo ............................................................................................ 22 Bibliografia .............................................................................................................. 23 Trilha de Aprendizagem Olá. Meu nome é Andréa César. Sou responsável pela direção editorial deste livro didático e de todos os demais recursos relacionados com a sua trilha de aprendizagem. Você está iniciando seus estudos sobre TECNOLOGIAS E LINGUAGENS DE BANCO DE DADOS, e o nosso objetivo é auxiliar você no desenvolvimento das competências necessárias ao seu exercício profissional. Para isto, distribuímos os conteúdos didáticos deste livro em quatro semanas de estudo, onde, em cada uma delas, haverá uma competência a ser construída. Cada uma dessas competências será desenvolvida por meio de quatro atividades de estudo, que podemos chamar de “aulas”. Em cada aula, você terá uma introdução ao tema abordado, os objetivos a serem alcançados, uma atividade de autoaprendizagem proposta e uma lista de exercícios a ser em respondidos. Quer saber quais serão as competências que você irá desenvolver ao longo dessas quatro semanas de estudo? Então vamos a elas: 1. Adquirir uma visão geral sobre os SGBDs disponíveis no mercado, suas funcionalidades, ambientes e linguagens de manipulação de banco de dados. 2. Instalar e configurar servidores de banco de dados, atentando para os aspectos relacionados à segurança e desempenho. 3. Criar, formatar e atualizar bancos de dados em um SGBD. 4. Gerar consultas, procedimentos, gatilhos e visões de bancos de dados em um SGBD. Ao longo desta semana iremos desenvolver a competência de número: 4. Vamos arregaçar as mangas? Ao trabalho! Tecnologias e Linguagens de Banco de Dados | Danilo Nogueira | 7 4ª SEMANA DE ESTUDOS INTRODUÇÃO: urante esta última semana de estudos iremos finalmente aprender a relacionar tabelas no MySQL, para depois empregarmos o comando SELECT nas operações de consulta aos dados dessas tabelas. Atenção, este é o ponto mais importante de toda esta disciplina. Saber empregar bem o comando SELECT consiste na atividade mais importante, tanto da administração do banco de dados, quanto no acesso a suas estruturas por meio de programas. Preparado para uma viagem rumo ao conhecimento? Então, aperte o cinto e boa viagem. OBJETIVOS: Ao término do desenvolvimento desta semana de estudos, você será capaz de: Gerar consultas SQL envolvendo uma ou mais tabelas do banco de dados; Criar procedimentos armazenados no banco de dados, conhecidos como stored procedures; Criar gatilhos para disparar procedimentos programados, conhecidos como triggers; e, Manipular dados por meio de visões (ou views) envolvendo uma ou mais tabelas. Mãos à obra? Conte com a gente! D Tecnologias e Linguagens de Banco de Dados | Danilo Nogueira | 8 1 Comando Select e o Relacionamento entre Tabelas INTRODUÇÃO: Chegamos ao ponto mais importante de nossa disciplina. É nesta aula que iremos praticar os comandos SQL. Como vimos anteriormente, a sigla SQL significa linguagem de consulta estruturada, e o comando que executa essas consultas é o SELECT. O comando SELECT é capaz de gerar uma consulta em tempo real, envolvendo uma ou mais tabelas de um banco de dados. O resultado da execução de um comando SQL é, na realidade, um conjunto de linhas compostas dos dados selecionados das tabelas consultadas, conforme as condições descritas na cláusula WHERE. Mas, antes mesmo de aprendermos a usar o comando SELECT, precisamos retomar a linguagem DDL (Data Definition Language) para entendermos como impor um relacionamento entre duas tabelas. 1.1 Integridade referencial no MySQL Você lembra o que significa integridade referencial? Este conceito é básico e muito importante para quem trabalha com banco de dados, tanto em nível de administração quanto no de programação. Impor integridade referencial entre duas tabelas é relacioná -las com base nos dados contidos em pelo menos duas colunas, uma de cada tabela. Estamos falando, na prática, de relacionar duas tabelas por meio da chave primária de uma delas e da chave estrangeira da outra. Mas, você lembra o que significa uma chave estrangeira? E a primária? OBJETIVO: Ao término desta aula você será capaz de gerar consultas SQL envolvendo uma ou mais tabelas do banco de dados. Tecnologias e Linguagens de Banco de Dados | Danilo Nogueira | 9 No caso de uma chave estrangeira, o conceito é um pouco diferente: Vamos entender melhor tudo isto? Entendemos por chave primária a coluna de uma tabela que contém dados únicos (sem repetição) e que foram concebidos para serem a principal forma de acesso e relacionamento de uma tabela dentro do banco de dados, como por exemplo, o CNPJ dos clientes, a matrícula dos funcionários, o CPF de um cadastro de devedores, ou um simples código sequencial numérico criado para indexar as linhas de uma tabela qualquer. DEFINIÇÃO Uma chave estrangeira nada mais é do que uma coluna de uma tabela que contém, na realidade, dados contidos na coluna “chave primária” de uma outra tabela, estabelecendo assim um relacionamento entre elas, que pode ser de 1:1 (uma linha de uma tabela relacionada apenas a uma linha de uma outra tabela), ou de 1:N (uma linha de uma tabela relacionada a uma ou mais linhas em outra tabela). DEFINIÇÃO Tecnologias e Linguagens de Banco de Dados | Danilo Nogueira | 10 Vamos acionar mais uma vez o PhpMyAdmin, abrir o nosso banco de dados “escolaprime” e clicar no link “New” para criar uma nova tabela, como exibido na figura ao lado. Só que, desta vez, diferentemente de como criamos a tabela “funcionarios", vamos criar a tabela “departamentos” por meio da aba “SQL”, usando, para isto, o comando CREATE TABLE da linguagem DDL. Escreva assim: CREATE TABLE `departamentos` ( numdepto INT(11), nomedepto VARCHAR(60)) ENGINE = InnoDB; Figura 1 - Clique aqui para criar uma nova tabela. Para entendermos melhor, vamos retomar o nosso exemplo. Dentro da nossa tabela “funcionarios” existe uma coluna intitulada “Depto”. Nela foram digitados os códigos de supostos departamentos. Mas, onde estão os nomes desses departamentos? Se fôssemos inserir uma nova coluna na tabela “funcionarios” intitulada “NomeDepto”, estaríamos cometendo um erro de modelagem de dados, mais precisamente um erro de normalização de dados. Para evitar a redundância do nome do departamento em várias linhas da tabela “funcionarios”, vamos recorrer a uma nova tabela, criada especificamente para conter o código e o nome desses departamentos. Assim, eliminaremos a possibilidade da redundância não-controlada, que pode causar inconsistências, do tipo: termos um mesmo departamento escrito de duas formas diferentes. Entenda, no desenrola r a seguir, como se processa o relacionamento entre essas duas tabelas: “funcionarios” e “departamentos”. EXPLICANDO MELHOR Tecnologias e Linguagens de Banco de Dados | Danilo Nogueira | 11 O resultado será este, apresentado na figura a seguir : Figura 2 - Resultado da execução do comando CREATE TABLE. Agora que temos duas tabelas, com um mesmo dado se repetindo em ambas, devemos relacioná-las para impor uma integridade referencial, ou seja, amarrar uma a outra de tal modo que a atualização dos dados referentes a essa coluna em comum respeite a regra de integridade que queremos estabelecer. Mas, como fazer isto? Os campos “depto” e “numdepto” devem ser rigorosamente do mesmo tamanho e tipo: INT(11). IMPORTANTE Chamamos de integridade referencial a propriedade que uma tabela tem de respeitar restrições às chaves estrangeiras, ou seja, aos relacionamentos criados entre esta tabela e as outras que contêm dados relacionados. DEFINIÇÃO Tecnologias e Linguagens de Banco de Dados | Danilo Nogueira | 12 A primeira coisa que precisamos fazer antes de impor uma integridade referencial entre a chave estrangeira “depto” de “funcionarios” e a chave primária “numdepto” de “departamentos”, é torná -la, de fato, a chave primária da tabela “departamentos”. Há duas maneiras de fazermos isto: Você pode optar por utilizar os recursos interativos do PhpMyAdmin, como fizemos anteriormente com a tabela “funcionarios” após sua criação, ou pode executar o seguinte comando DDL sobre a tabela “departamentos”: ALTER TABLE `departamentos` ADD PRIMARY KEY(`numdepto`); Isto faz o mesmo que a seguinte ação no painel da aba “Structure” da tabela “departamentos”. Figura 3 - Transformando "numdepto" em chave primária da tabela "departamentos". Agora que o MySQL já sabe que a chave primária da tabela “departamentos” é a coluna “numdepto”, que tem o mesmo tipo e tamanho da coluna “depto” da tabela “funcionarios” , só falta mesmo avisar a ele que, na tabela “funcionarios”, essa coluna será a chave estrangeira da tabela “departamentos”. Tecnologias e Linguagens de Banco de Dados | Danilo Nogueira | 13 Há duas maneiras de se fazer isto. A mais simples é, como de costume, utilizando a interface do PhpMyAdmin, e a outra é utilizando o comando ALTER TABLE para adicionar as chaves estrangeiras. Vamos iniciar pela mais simples: Selecione a tabela “funcionarios” e, logo em seguida, clique na aba “Structure”. Lá, você irá perceber a aparição de um botão intitulado “Relation view” (ou traduzindo, visão do relacionamento da tabela). Não o localizou? Veja na figura 4 (ao lado). Uma vez clicado, você deverá estar visualizando a seguinte imagem: Figura 5 - Painel de construção de integridades referenciais (ou " Constraints"). Neste painel é possível criarmos quantas relações de integridade referencial desejarmos. Como nossas tabelas-exemplo só dispõem de uma alternativa para chave estrangeira, vamos criar apenas um relacionamento, intitulado, por exemplo, de “FuncionariosDepartamentos”, como demonstrado na figura seguinte: Figura 4 - Botão "Relation view" na aba "Strcture" da tabela "funcionarios". Tecnologias e Linguagens de Banco de Dados | Danilo Nogueira | 14 Figura 6 - Preenchimento dos campos para criação do relacionamento "DeptoFunc". Como podemos observar na figura acima, podemos adicionar outras associações entre as tabelas. Mas a associação que mais nos interessa agora é a que relaciona a coluna “depto” da tabela “funcionarios” à coluna “numdepto” da tabela “departamentos”. Perceba, pelo exposto na figura 6, que foi o que descrevemos nas seleções realizadas. Referimo-nos especificamente aos quatro últimos campos do painel ilustrado anteriormente. Mas, e quanto aos três primeiros campos? Simples. O primeiro é o que pede o nome deste novo relacionamento que está sendo criado: “Constraint name”. Nele, digite o nome do relacionamento: “DeptoFunc”. Os outros dois campos apresentam as seguintes funcionalidades para o relacionamento que estamos criando neste momento: ON DELETE: este campo, que representa uma cláusula do comando ALTER TABLE (como veremos adiante), descreve o que deve acontecer com as tabelas associadas quando houver uma operação de deleção de linhas envolvendo dados relacionados. ON UPDATE: analogamente, este campo descreve o que acontecerá quando um dado relacionado a outra tabela, como chave -estrangeira, for atualizado. Em ambos os casos, o menu cortina que desce é o mesmo, ou seja, é o apresentado na figura 7 ao lado. Vamos descrever cada uma dessas situações: Figura 7 - Opções de "Constraints". Tecnologias e Linguagens de Banco de Dados | Danilo Nogueira | 15 RESTRICT: este parâmetro, que pode estar descrito em uma cláusula “ON DELETE” ou “ON UPDATE”, não permite a remoção de registros ou a alteração de dados que possuamrelacionamentos em outras tabelas . CASCADE: no caso de estar descrito em uma cláusula “ON DELETE”, ao se remover um registro da tabela referenciada pela chave estrangeira , os registros relacionados àquele removido serão eliminados em todas as tabelas relacionadas. Situação análoga ocorre quando se altera um dado de uma tabela que se relaciona com outra, no caso de ter-se utilizado o parâmetro “ON UPDATE”. Em resumo, o parâmetro “CASCADE” repercute deleções e atualizações em cascata nas tabelas relacionadas. SET NULL: este parâmetro, diferentemente do “CASCADE”, atribui o valor nulo às colunas relacionadas em outras tabelas, sempre que houver deleção (e a clausula “ON DELETE” for utilizada) ou atualização do dado relacionado (e a cláusula “ON UPDATE for utilizada). NO ACTION: este parâmetro simplesmente não faz nada ao ser deletada uma linha ou atualizada uma coluna com dados relacionados em outras tabelas. Isto que acabamos de fazer na interface do PhpMyAdmin equivale à execução do seguinte comando em linguagem DDL: ALTER TABLE `funcionarios` ADD CONSTRAINT `DeptoFunc` FOREIGN KEY(`depto`) REFERENCES departamentos`(`numdepto`) ON DELETE RESTRICT ON UPDATE RESTRICT ; Tecnologias e Linguagens de Banco de Dados | Danilo Nogueira | 16 Vamos testar a nossa integridade referencial? A figura a seguir ilustra um procedimento de inserção de nova linha na tabela “funcionarios”. Veja o que ocorre quando tentamos cadastrar um novo funcionário pertencente a um departamento que ainda não existe na tabela “departamentos”: Figura 8 - Comando INSERT sendo executado na tabela "funcionarios" pela interface do PhpMyAdmin, na aba "Insert". Ao executar este comando, o MySQL muito provavelmente irá exibir alguma mensagem de erro, caso encontre alguns dados nas duas tabelas que violem a regra de integridade referencial que acaba de ser especificada no comando ALTER TABLE. Recomendamos que, caso isto ocorra, você aborte o procedimento e verifique manualmente os dados cadastrados. Se a tabela estiver povoada com poucos registros, talvez compense a deleção de todas as linhas para começar tudo do zero. NOTA Tecnologias e Linguagens de Banco de Dados | Danilo Nogueira | 17 Traduzindo a mensagem de erro #1452: “não é possível adicionar ou atualizar uma linha filha, pois a regra de integridade referencial da chave-estrangeira falhou”. Observe ainda que, na interface da mensagem de erro, é possível clicar em um link para editar diretamente o comando SQL. Perceba ainda que, ao término da linha reservada para o campo “depto” no formulário de inserção é possível navegar pelos valores cadastrados na tabela “departamentos”. Para isto, basta clicar no link “Browse foreign v alues”, como ilustrado na figura apresentada anteriormente. Se a tabela “departamento” estiver vazia, você terá que povoá -la antes de cadastrar os funcionários. 1.2 Comando SELECT Chegamos ao ponto mais alto de nossa disciplina. O comando SELECT foi o que deu origem à linguagem SQL, e que é capaz de gerar as consultas dinâmicas e estáticas em um banco de dados, usando mais de uma tabela relacionadas entre si. O comando SELECT suporta muitas outras declarações aninhadas, incluindo funções dentro de suas declarações sintáticas. E por falar em sintaxe, podemos generalizá-la de forma representativa da seguinte maneira: SELECT <lista de campos> FROM <nome da tabela> [WHERE <condição>] [ORDER BY <lista de campos>] Agora é com você. Estude, na prática, o comportamento de cada cláusula com cada parâmetro descrito anteriormente. ATIVIDADES Tecnologias e Linguagens de Banco de Dados | Danilo Nogueira | 18 [...]; Onde: FROM: cláusula que define de onde os dados devem ser extraídos para comporem a consulta, no caso o nome da tabela, referenciada ou não pelo nome do banco de dados. WHERE: cláusula que define a expressão lógica que resultará nas linhas a serem exibidas na consulta. ORDER BY: determina a lista de campos-chaves da consulta, na ordem em que devem aparecer. [...]: Outras cláusulas. Para entendermos melhor como funciona este comando, vamos exemplificar uma série de situações para a elaboração de consultas, começando por algumas consultas simples sobre a primeira tabela com a qual vínhamos trabalhando: “funcionarios”. Figura 9 - Massa de dados para teste em "funcionarios". Queremos consultar apenas os funcionários do departamento 2 que ganham mais de R$ 4.000,00. Neste caso, poderíamos construir a seguinte consulta SQL: SELECT * FROM funcionarios WHERE depto=2 AND salario>4000 Executando esta consulta no PhpMyAdmin, por exemplo , teremos: Figura 10 - Resultado da consulta SQL. Tecnologias e Linguagens de Banco de Dados | Danilo Nogueira | 19 Mas, imagine se quiséssemos incluir, nesta consulta, o nome do departamento, ao invés de seu código! Neste caso, teríamos de e nvolver uma segunda tabela neste comando SELECT, como por exemplo: SELECT matric, nome, depto, departamentos.nomedepto, salario, telefone FROM departamentos INNER JOIN funcionarios ON departamentos.numdepto=funcionarios.depto WHERE depto=2 AND salario>4000 Figura 11 - Resultado da consulta com as duas tabelas: "funcionarios" e "departamentos". Foram utilizadas as cláusulas INNER JOIN e ON para relacionar as duas tabelas envolvidas. Perceba que o campo “nomedepto” teve que ser antecedido do nome da tabela, seguido de um ponto, para identificar a sua origem. 1.2.1 Funções do MySQL Veremos a partir de agora algumas funções úteis, residentes no MySQL, que podem ser utilizadas na cláusula WHERE de consultas SQL. Note que foi utilizada a cláusula INNER JOIN logo após a cláusula FROM, com o objetivo de unir as duas tabelas: “funcionarios” e “departamentos”. Mas, se deixássemos assim, o comando SELECT retornaria simplesmente a união das duas tabelas. Logo, foi utilizado um parâmetro condicional logo após a cláusula ON, que restringiu a consulta à exibição apenas das linhas em que o número do departamento fosse o mesmo em ambas as tabelas. EXPLICANDO MELHOR Tecnologias e Linguagens de Banco de Dados | Danilo Nogueira | 20 NOW(): retorna a data e a hora do servidor MySQL. CURDATE(): retorna a data do servidor MySQL. CONCAT(): retorna a concatenação de uma série de campos e expressões string. Exemplo: SELECT matric, CONCAT(“Nome: “, nome), salario FROM funcionarios. COUNT(): retorna a contagem ao invés das linhas de uma consulta SQL, como no seguinte exemplo: SELECT COUNT(*) FROM funcionarios. SUM(): retorna o somatório de todos os valores de determinada coluna, por exemplo: SELECT SUM(salario) FROM funcionarios. AVG(): retorna a média aritmética de todos os valores de determinada coluna, como por exemplo: SELECT AVG(salario) FROM funcionarios . ROUND(): arredonda os valores resultantes em seu argumento, com a seguinte sintaxe: ROUND(val, #), onde “val” é o resultado do valor a ser arredondado, e # significa a quantidade de casas decimais a serem consideradas no arredondamento. Exemplo: SELECT ROUND(AVG(salario),2) FROM funcionarios . FORMAT(): converte um determinado valor no formato monetário, com a seguinte sintaxe: FORMAT(val, #), onde “val” é o valor a ser formatado e # é a quantidade de casas decimais a ser considerada neste formatomonetário. Por exemplo: FORMAT(4000,2) 4,000.00. RAND(): retorna uma linha aleatória dentro de uma tabela. Esta função deve ser utilizada dentro de cláusula ORDER BY, como neste exemplo: SELECT nome, salario, depto FROM funcionarios ORDER BY RAND() LIMIT 1 . Esta última cláusula utilizada tem por finalidade restringir a quantidade de linhas a ser exibida. No caso, apenas uma linha será exibida aleatoriamente. O MySQL ainda oferece outras funções. Quer saber? Vá até o próximo “Saiba Mais” e descubra. NOTA Tecnologias e Linguagens de Banco de Dados | Danilo Nogueira | 21 1.2.2 Comandos SELECT encadeados É possível utilizarmos vários comandos SELECT encadeados ou aninhados. Para exemplificar, analise o exemplo a seguir: SELECT * FROM funcionarios WHERE depto=2 AND salario>4000 Esta consulta, como já apresentada anteriormente, traz as linhas da tabela “funcionarios” correspondentes aos funcionários do departamento 2, e que, simultaneamente, recebem salários superiores a quatro mil reais. Agora analise esta outra forma de escrever esta mesma consulta: SELECT * FROM (SELECT * FROM funcionarios WHERE salario>4000) WHERE depto=2 Perceba que o resultado desta consulta deverá ser o mesmo. No entanto, primeiramente o MySQL executará a consulta mais interna, que retornará apenas os funcionários que ganham mais de quatro mil reais. Na sequência, este resultado será submetido à consulta mais externa, que somente considerará os que pertencerem ao departamento de número 2. Tecnologias e Linguagens de Banco de Dados | Danilo Nogueira | 22 Considerações Finais SAIBA MAIS: Quer se aprofundar nos temas desta aula? Recomendamos o acesso à seguinte fonte de consulta e aprofundamento: Manual HTML: “Funções da MySQL”, acessível pelo link: http://php.net/manual/pt_BR/ref.mysql.php (Acesso em 12/12/2017). Atividades de Autoaprendizagem ATIVIDADES: Pronto para consolidar seus conhecimentos? Leia atentamente o enunciado de sua atividade de autoaprendizagem proposta para esta aula. Se você está fazendo o seu curso presencialmente, é só abrir o seu caderno de atividades. Se você estiver cursando na modalid ade de EAD (Educação a Distância), acesse a sua trilha de aprendizagem no seu ambiente virtual e realize a atividade de modo online. Você pode desenvolver esta atividade sozinho ou em parceria com seus colegas de turma. Dificuldades? Poste suas dúvidas no fórum de discussões em seu ambiente virtual de aprendizagem. Concluiu a sua atividade? Submeta o resultado em uma postagem diretamente em seu ambiente virtual de aprendizagem e boa sorte! Questionário Avaliativo TESTANDO: Chegou a hora de você provar que aprendeu tudo o que foi abordado ao longo desta aula. Para isto, leia e resolva atentamente as questões do seu caderno de atividades. Se você estiver fazendo este curso a distância, acesse o QUIZ (Banco de Questões) em seu ambiente virtual de aprendizagem. http://php.net/manual/pt_BR/ref.mysql.php Tecnologias e Linguagens de Banco de Dados | Danilo Nogueira | 23 Bibliografia PHP. (12 de Dez de 2017). Funções da MySQL . Fonte: PHP Documentation: http://php.net/manual/pt_BR/ref.mysql.php Tecnologias e Linguagens de Banco de Dados | Danilo Nogueira | 24
Compartilhar