Baixe o app para aproveitar ainda mais
Prévia do material em texto
PDF gerado usando o pacote de ferramentas em código aberto mwlib. Veja http://code.pediapress.com/ para mais informações. PDF generated at: Fri, 06 Dec 2013 10:38:38 UTC SQL Conteúdo Páginas Introdução ao SQL 1 Banco de dados Relacional 3 Linguagem de definição de dados 6 Criando tabelas 7 Alterando tabelas 10 Removendo tabelas 11 Linguagem de manipulação de dados 12 Inserindo dados 12 Alterando dados 12 Removendo dados 13 Linguagem de consulta de dados 13 Ordenação 14 Agrupamento 15 Funções de agregação 16 Junções 17 Referências Fontes e Editores da Página 21 Fontes, Licenças e Editores da Imagem 22 Licenças das páginas Licença 23 Introdução ao SQL 1 Introdução ao SQL SQL (do inglês Structured Query Language, ou Linguagem de Consulta Estruturada), é uma linguagem de pesquisa declarativa para Bancos de Dados Relacionais (base de dados relacional). Ela é uma linguagem para consultar, adicionar, atualizar, ou remover informações de um banco de dados. Pode ser usada também para manipular metadados de um banco de dados. SQL é uma linguagem declarativa onde os resultados ou operações são dadas sem muita especificação detalhada sobre como completar as tarefas. Os passos requeridos para executar demonstrações SQL são manuseados de forma transparente pelo banco de dados SQL. Algumas vezes essa linguagem é caracterizada como não-procedural porque linguagens procedurais geralmente precisam que detalhes das operações sejam especificados, tal como abertura e fechamento de tabelas, carregamento e busca, ou flushing buffers e escrição de dados para sistemas de arquivo. Contudo, SQL é considerada uma linguagem de alto nível, que abstrai o nível das operações realizadas e a maneira como estas são realizadas. Instruções são dadas na forma de declarações, consistindo de declarações específicas do SQL, parâmetros adicionais e operandos que aplicam esses comandos. As declarações SQL e seus modificadores são baseados no oficial SQL standart e certas extensões que cada fornecedor de banco de dados implementa. As declarações mais comuns estão agrupadas nas categorias que citaremos abaixo. História do SQL O SQL foi desenvolvido originalmente no início dos anos 70 nos laboratórios da IBM em San Jose, dentro do projeto w:System R, que tinha por objetivo demonstrar a viabilidade da implementação do modelo relacional proposto por E. F. Codd. O nome original da linguagem era SEQUEL, acrônimo para "Structured English Query Language" (Linguagem de Consulta Estruturada em Inglês), vindo daí o fato de, até hoje, a sigla, em inglês, ser comumente pronunciada "síquel" ao invés de "és-kiú-él", letra a letra. No entanto, em português, a pronúncia mais corrente é a letra a letra: "ésse-quê-éle". SQL como linguagem padrão A linguagem SQL é um grande padrão de banco de dados. Isto decorre da sua simplicidade e facilidade de uso. Ela se diferencia de outras linguagens de consulta a banco de dados no sentido em que uma consulta SQL especifica a forma do resultado e não o caminho para chegar a ele. Ela é uma linguagem declarativa em oposição a outras linguagens procedurais. Isto reduz o ciclo de aprendizado daqueles que se iniciam na linguagem. Embora o SQL tenha sido originalmente criado pela IBM, rapidamente surgiram vários "dialetos" desenvolvidos por outros produtores. Essa expansão levou à necessidade de ser criado e adaptado um padrão para a linguagem. Esta tarefa foi realizada pela w:American National Standards Institute (ANSI) em 1986 e ISO em 1987. SQL foi revisto em 1992 e a esta versão foi dado o nome de SQL-92. Foi revisto novamente em 1999 e 2003 para se tornar SQL-99 (SQL3) e SQL:2003, respectivamente. No entanto embora o SQL, seja padronizado pela ANSI e ISO, possui muitas variações e extensões produzidos pelos diferentes fabricantes de sistemas gerenciadores de bases de dados. Tipicamente a linguagem pode ser migrada de plataforma para plataforma, sem mudanças estruturais principais. Introdução ao SQL 2 Subconjuntos A linguagem SQL é dividida em subconjuntos de acordo com as operações que queremos efetuar sobre um banco de dados. DDL - Linguagem de Definição de Dados Linguagem de definição de dados (ou DDL, de Data Definition Language) é um conjunto de comandos dentro da SQL usada para a definição das estruturas de dados, fornecendo as instruções que permitem a criação, modificação e remoção das tabelas, assim como criação de índices. Estas instruções SQL permitem definir a estrutura de uma base de dados, incluindo as linhas, colunas, tabelas, índices, e outros metadados. Entre os principais comandos DDL estão: •• CREATE - Usado para criar uma nova tabela, uma visão de uma tabela, ou outro objeto em um banco de dados. •• ALTER - Usado para modificar um objeto existente de um banco de dados, como uma tabela. •• DROP - Usado para apagar toda uma tabela, uma visão de uma tabela ou outro objeto em um banco de dados. DML - Linguagem de Manipulação de Dados Linguagem de manipulação de dados (ou DML, de Data Manipulation Language) é o grupo de comandos dentro da linguagem SQL utilizado para a recuperação, inclusão, remoção e modificação de informações em bancos de dados. Os principais comandos DML são INSERT (Inserção de Dados), UPDATE (Atualização de Dados) e DELETE (Exclusão de Dados). Data Query Language (DQL) É linguagem de consulta de dados, que é um subconjunto de linguagem de manipulação. O comando é SELECT, usado para obter certos dados ou registros a partir de uma mais tabelas. DCL - Linguagem de Controle de Dados Linguagem de controle de dados (ou DCL, de Data Control Language) é o grupo de comandos que permitem ao administrador de banco de dados controlar o acesso aos dados deste banco. Alguns exemplos de comandos DCL são: •• GRANT: Permite dar permissões a um ou mais usuários e determinar as regras para tarefas determinadas; •• REVOKE: Revoga permissões dadas por um GRANT. As tarefas básicas que podemos conceder ou barrar permissões são: •• CONNECT •• SELECT •• INSERT •• UPDATE •• DELETE •• USAGE Banco de dados Relacional 3 Banco de dados Relacional Antes de aprender SQL, bancos de dados relacional possuem diversos conceitos que devem ser aprendidos e compreendidos primeiro. Motivação A unidade principal por trás de um banco de dados relacional tem como função aumentar a precisão, aumentando a eficiência com que os dados são armazenados. Por exemplo, os nomes de cada uma das milhões de pessoas que imigraram para os Estados Unidos através das Ilhas Ellis durante o século XX foram escritos à mão e guardados em um grande quantidade de folhas de papel; pessoas da cidade de Londres tiveram seu país de origem definido como Inglaterra, ou Grã-Bretanha, ou Reino Unido ou ainda de alguma dessas formas abreviadas. Múltiplas maneiras de guardar a mesma informação geram confusão quando houver necessidade de saber algo simples como quantas pessoas vieram do país hoje conhecido como Reino. A soluções moderna para esse problema é o banco de dados. Um único registro é dado para cada país, por exemplo, em uma lista de referência que deve ser chamada de tabela de país. Quando alguém precisar indicar o Reino Unido, será necessário apenas ter uma escolha disponível para ela a partir da lista: uma simples lista de letras (ou string), "Reino Unido" como única representação do país, e qualquer outra informação que precisar desse país pode usar o mesmo termo a partir da lista para se referir ao mesmo país. Por exemplo, uma lista com os códigos de telefone do país e uma lista dos castelos europeus, ambos precisam se referir ao país; pelo uso da mesma lista de países para prover informações idênticas para as duas novas listas. Nós estabelecemos um novo relacionamento entre listas diferentes, com apenas um ítem em comum: país. Um banco de dados relacional, assim, é simplesmente uma coleção de listas que distribuem alguma parte da informação. Bancos de dadosrelacionais Bancos de dados armazenam dados de um sistema de informação. Nós reagrupamos dados através de grupos de dados comparáveis (todos os empregados, todos os projetos, todos os escritórios, por exemplo). Para cada grupo de dados comparáveis, é criada uma tabela. Essa tabela é especialmente desenhada para atender esses tipos de dados (seus atributos). Por exemplo, uma tabela nomeada empregados que guarda todos os empregados seria feita assim: empregados a tabela id_empregado a chave primária um número inteiro primeiro nome uma coluna uma string de caracteres uma coluna tipo último nome uma string de caracteres telefone 10 numeros endereço uma string de caracteres E os funcionários da empresa seriam armazenados assim: Banco de dados Relacional 4 empregado id_empregado primeiro-nome último-nome telefone endereço 1 um valor de coluna Big BOSS 936854270 big.boss@company.com 2 Jonas Xavier 936854271 jonas.xavier@company.com 3 Linus TORVALDS 936854272 linus.torvalds@company.com 4 Jimmy WALES 936854273 jimmy.wales@company.com 5 Larry PAGE 936854274 larry.page@company.com Os dados guardados em uma tabela são chamados entidades. Como uma tabela é usualmente representada como uma matriz, os atributos do dados (primeiro nome, último nome, ...) são chamados colunas e os registros (cada um dos empregados) são chamadas linhas. Uma chave primária é normalmente sublinhada. Qualquer atributo único (por exemplo, o endereço) ou grupo de atributos (como o primeiro nome e o último nome) podem ser a chave primária de uma tabela, mas isso é recomendado para a técnica do id, como no exemplo id_empregado como chave primária. A função da chave primária é simplesmente diferenciar uma das linhas, ou registros, que fazem parte de uma tabela. Vamos criar um segunda tabela chamada projeto que guardará os projetos da empresa: empregado id_empregado um inteiro primeiro-nome uma string de caracteres último-nome uma string de caracteres phone 10 números endereço uma string de caracteres projeto id_projeto um inteiro nome uma string de caracteres data-da-criação uma data data-término uma data # gerente um inteiro E os projetos da companhia seriam armazenados no banco da seguinte forma: empregado id_empregado primeiro-nome último-nome telefone endereço 1 Big BOSS 936854270 big.boss@company.com 2 John DOE 936854271 john.doe@company.com 3 Linus TORVALDS 936854272 linus.torvalds@company.com 4 Jimmy WALES 936854273 jimmy.wales@company.com 5 Larry PAGE 936854274 larry.page@company.com projetos id_project nome data-criação data-término # gerente 1 Google 1998-09-08 NULL 5 2 Linux 1991-01-01 NULL 3 3 Wikipedia 2001-01-01 NULL 4 id_project é a chave primária da tabela projeto e manager é a chave estrangeira. Uma chave estrangeira é uma chave primária de uma tabela, fazendo referência ou ligação com algum valor de outra tabela. Fazendo isso, o projeto Google está conectado ao empregado Larry PAGE. Essa ligação, ou conexão, se chama relacionamento. Uma chave estrangeira é usualmente precedida por um símbolo sharp, ou jogo-da-velha (#). Note que diversos projetos podem apontar para o mesmo gerente, então um mesmo empregado pode ser gerente de vários projetos. Agora, nós queremos criar, não apenas uma única ligação, mas múltiplas. Então criamos uma tabela de junção. Uma tabela de junção é uma tabela que não é usada para guardar dados, mas as ligações entre entidades de outras tabelas. É a tabela onde as ligações, ou relacionamentos, entre as tabelas são guardadas. Vamos criar uma tabela chamada Banco de dados Relacional 5 membros que liga empregados com projeto: empregado id_empregado um inteiro primeiro-nome uma string de caracteres último-nome uma string de caracteres telefone 10 numeros endereço uma string de caracteres membros # id_empregado um inteiro # id_projeto um inteiro projeto id_projeto um inteiro nome uma string de caracteres data-criação uma data data-término uma data # gerente um inteiro E os empregados e os projetos podem ser ligados assim: empregado id_employee primeiro-nome último-nome telefone endereço 1 Big BOSS 936854270 big.boss@company.com 2 Augusto XAVIER 936854271 augusto.xavier@company.com 3 Linus TORVALDS 936854272 linus.torvalds@company.com 4 Jimmy WALES 936854273 jimmy.wales@company.com 5 Larry PAGE 936854274 larry.page@company.com 6 Max THE GOOGLER 936854275 max.the-googler@company.com 7 Jenny THE WIKIPEDIAN 936854276 jenny.the-wikipedian@company.com projeto id_project nome data-criação data-término # gerente 1 Google 1998-09-08 NULL 5 2 Linux 1991-01-01 NULL 3 3 Wikipedia 2001-01-01 NULL 4 membros # id_empregado # id_projeto 3 2 2 1 4 3 5 1 2 3 6 1 7 3 Um empregado pode estar ligado com vários projetos e um projeto pode ser associado a vários empregados, o que é impossível com apenas uma chave estrangeira. Uma tabela de junção não tem chave primária próprias. Sua chave primária é o par de chaves estrangeiras, pois esse casal é único. Uma tabela de junção pode ligar mais de duas tabelas contendo entidade por mais colunas. Banco de dados Relacional 6 Relacionamentos Então vamos listar os diferentes tipos de relacionamento: •• Um para um, •• Um para muitos (como exemplo, o gerente de um projeto), •• Muitos para muitos (como exemplo, os membros de um projeto). Linguagem de definição de dados Linguagem de definição de dados (ou DDL, de Data Definition Language) é um conjunto de comandos dentro da SQL usada para a definição das estruturas de dados, fornecendo as instruções que permitem a criação, modificação e remoção das tabelas, assim como criação de índices. Uma vez compilados, os parâmetros DDL são armazenados num conjunto de arquivos denominado dicionário de dados (ou catálogo). O dicionário de dados contém os metadados (dados a respeito das estruturas de armazenamento). O SGBD sempre consulta os metadados a cada operação sobre o banco de dados. Estas instruções SQL permitem definir a estrutura de uma base de dados, incluindo as linhas, colunas, tabelas, índices, e outros metadados. DDL instruções SQL são mais parte do SGBD e têm grandes diferenças entre as variações SQL. DDL comandos SQL incluem o seguinte: CREATE Uma declaração CREATE permite a criação de uma nova base de dados, tabela, índice, ou consulta armazenada, sendo os tipos de objetos que podem ser criados definidos pelo SGBD que está sendo utilizado. Entre os principais comandos inclusos estão CREATE DATABASE (criar banco de dados) , CREATE TABLE (criar tabela) e outros. Exemplo: Crie um banco de dados com o nome registro_de_alunos: CREATE DATABASE registro_de_alunos; Agora crie uma tabela alunos para este BD criado com as seguintes colunas: nome, matricula, curso. USE registro_de_alunos; CREATE TABLE alunos ( nome CHAR(50) NOT NULL, matricula INT NOT NULL, curso CHAR(50) NOT NULL, PRIMARY KEY(matricula)); Linguagem de definição de dados 7 DROP Uma declaração DROP permite remover (destruir) uma base de dados existente, tabela, índice, ou view, sendo os tipos de objetos que podem ser removidos definidos pelo SGBD que está sendo utilizado. Entre os principais comandos inclusos estão DROP DATABASE (elimina um banco de dados inteiro) , DROP TABLE (excluir tabela) e outros. ALTER Uma declaração ALTER permite alterar um objeto de um banco de dados, sendo os tipos de objetos que podem ser alterados definidos pelo SGBD que está sendo utilizado. Entre os principais comandos estão ALTER TABLE ADD (adicionar uma coluna na tabela), ALTER TABLE DROP (excluir uma coluna na tabela) Criando tabelas Podemos criar uma tabela qualquer dentro de um banco de dados. A sintaxe básica para criarmos é: CREATE TABLE nome_tabela ( nome_campo_1 tipo_1, nome_campo_2 tipo_2, ... nome_campo_ntipo_n, PRIMARY KEY ( campo_x,...)); CREATE TABLE é o comando para criação da tabela e deve ser seguida pelo nome que daremos à tabela. Dentro do comando, devemos definir os nomes dos campos de acordo com a conveniência do banco de dados, e determinar o tipo de dado que poderá ser incluído neste campo. Na seção abaixo Tipo de Dados estão especificados os tipos mais comuns encontrados nos SGBDs. PRIMARY KEY define a chave primária da tabela, isto é, o campo que serve como chave da tabela e que não pode ser repetido. Se desejamos que um campo seja de preenchimento obrigatório, devemos inserir NOT NULL na frente do campo determinado. CREATE TABLE nome_tabela ( nome_campo_1 tipo_1 NOT NULL, nome_campo_2 tipo_2, ... nome_campo_n tipo_n, PRIMARY KEY(campo_x,...)); Se desejamos que um campo seja de auto-incremento, devemos inserir AUTO_INCREMENT na frente do campo determinado. Isto pode ser utilizado por exemplo, para automatizar um código que sirva de chave primária de uma tabela: CREATE TABLE nome_tabela ( nome_campo_1 tipo_1 NOT NULL AUTO_INCREMENT, nome_campo_2 tipo_2, ... Criando tabelas 8 nome_campo_n tipo_n, PRIMARY KEY (campo_x,...)); Tipos de Dados Tipos de dados definem os tipos de informação que podem ser inseridos em um campo. Somente dados do mesmo tipo do campo poderão ser inseridos. Os tipos suportados por um banco de dados podem variar de SGBD para SGBD, mas descrevemos a seguir os principais tipos encontrados na maior parte dos gerenciadores: ! Tipo Explicação Valores permitidos Exemplo BOOLEAN Armazena um bit de informação, utilizado para verdadeiro ou falso. false] true VARCHAR(n) Uma string com tamanho máximo n [0-9a-zA-Z]+{n} "foo" CHAR(n) Uma string com tamanho fixo n [0-9a-zA-Z]{n} "foo" SMALLINT Número inteiro com 16 bits de precisão \-?[0-9]+ 584 INTEGER Número inteiro com 32 bits de precisão \-?[0-9]+ -8748 FLOAT Número decimal \-?[0-9]+[\.[0-9]+]? 48.96 NUMBER(n,[d]) Um número com n dígitos (e d dígitos decimais se mencionado) \-?[0-9]+[\.[0-9]+]? 484.65 DATE Uma data [0-9][0-9][0-9][0-9]\-[0-1][0-9]\-[0-3][0-9] 2009-03-24 TIME Um período de sessenta minutos; 1/24 de um dia [0-2][0-9]\:[0-5][0-9]\:[0-5][0-9] 11:24:56 TIMESTAMP Data e hora [0-9]+ 18648689595962 BLOB Qualquer dado Qualquer Exemplo Como exemplo do uso do comando CREATE TABLE, imaginemos a necessidade de uma tabela que deva possuir os dados dos clientes de uma loja. CREATE TABLE Cliente ( Codigo INT NOT NULL AUTO_INCREMENT, Nome VARCHAR (60) NOT NULL, Data_Nascimento DATE, Telefone CHAR (8), PRIMARY KEY (Codigo) ); Neste comando, criaremos uma tabela chamada Cliente. Esta tabela contém quatro campos: o primeiro campo é o Código do cliente. Este campo será utilizado como chave primária de forma que não poderá se repetir nunca. Desta forma o campo deve ser sempre preenchido (NOT NULL), é numérico do tipo inteiro (INT) e deve auto-incrementar de acordo com o número de clientes que for incluído. O campo Nome é do tipo VARCHAR (60), ou seja aceita dados alfa-numéricos com até 60 caracteres. No entanto se um nome for inserido com menos de 60 caracteres, o número de bytes consumidos pelo campo será de acordo com o nome inserido. O campo de Data_Nascimento é do tipo DATE, ou seja, uma data, que no entanto não de preenchimento obrigatório (por isto não foi declarado o NOT NULL). O campo Telefone foi determinado como sendo alfa-numérico com oito caracteres definidos, e mesmo que sejam utilizados menos caracteres, o número de bytes consumidos serão sempre os mesmos independente dos dados. Criando tabelas 9 Isto é útil para dados alfanuméricos que não variam de tamanho, como o caso de UF no Brasil, cuja abreviação sempre são de dois caracteres. A instrução PRIMARY KEY define qual dos campos será a chave primária e não pode ser repetido, sendo o diferenciador entre os diversos clientes que sejam inseridos nesta tabela. Describe Após criarmos uma tabela, elas podem ser manipuladas de diversas formas, inserindo, alterando ou excluindo dados. Podemos visualizar a estrutura e campos de uma tabela criada utilizando o comando DESCRIBE ou DESC: DESCRIBE Nome_Tabela; Ou: DESC Nome_Tabela; Regras de Integridade Estudamos acima como criar uma tabela simples. No entanto, ao criarmos uma tabela dentro de um banco de dados devemos ter em mente as Regras de Integridade, que garantam a consistência, integridade e não redundância dos dados. Entre estas regras podemos englobar as chaves primárias, checagem e chave estrangeira. Chave primária No exemplo acima vimos a seguinte declaração na criação da tabela: PRIMARY KEY ( campo_x,...); Esta declaração diz que os campos inseridos entre os parênteses formam a chave primária da tabela. A chave primária funcionam como os campos que diferenciam os dados uns dos outros, e que não podem ser repetidos de nenhuma forma. Por exemplo, em nossa tabela Cliente, o código do Cliente funciona como a chave-primária, ou seja, os clientes podem até ter o mesmo nome, endereço ou telefone, mas terão códigos diferentes uns dos outros. Se dois códigos iguais forem inseridos o SGBD retornará erro. Checagem Podemos inserir em uma tabela depois do campo chave primária e antes do último parêntese a cláusula: CHECK Nome _Campo IN (valor1 , valor2, valor n); Esta cláusula força a um campo a aceitar apenas os valores especificados entre os parênteses. Isto pode ser útil para definir, por exemplo, campos como sexo. Desta forma forçamos as opções através de: CHECK Sexo IN ('M','F'); Onde o campo Sexo só podem assumir a forma M (Masculino) ou F (Feminino). Criando tabelas 10 Chave estrangeira A chave estrangeira é uma cláusula que deve ser incluída quando possuímos mais de duas tabelas em um banco de dados. Através da chave estrangeira estabelecemos as relações entre duas ou mais tabelas. A chave estrangeira desta forma referencia o campo que é chave primária de outra tabela. Tabela. FOREIGN KEY (Campo1, Campo2, Campo3 ..) REFERENCES Nome_Tabela2 (Nome_Chave); Alterando tabelas Após criarmos uma tabela em um banco de dados, podemos alterar sua estrutura com o uso da cláusula ALTER TABLE. Deve-se notar que esta alteração é sempre sobre a estrutura da tabela, e não sobre os dados da tabela (este tipo de alteração será vista mais adiante). Esta alteração da tabela é efetuada de duas formas: ou acrescentando um novo campo (utilizando ADD) ou alterando-se as propriedades de um campo já existente (utilizando-se MODIFY). O comando ALTER TABLE segue a seguinte sintaxe: ALTER TABLE Nome_Tabela ADD Nome_Campo Nova_Regra MODIFY Nome_Campo Nova_Regra; ADD Podemos utilizar a cláusula ADD para adicionar um novo campo em uma tabela, onde devemos definir seu tipo da mesma forma como fazemos ao criar um campo em uma nova tabela. Por exemplo, imaginemos que devemos inserir mais um campo chamado Telefone Comercial no final da tabela Cliente: ALTER TABLE Cliente ADD Tel_Comercial INT; Da mesma forma, campos com tamanhos definidos, devem ter seu tamanho especificado. Assim se desejamos inserir mais um campo do tipo VarChar, chamado por exemplo de Nome da Mãe em nossa tabela Cliente fazemos: ALTER TABLE Cliente ADD Nome_Mae VARCHAR(60); Caso desejemos que um campo seja inserido antes ou depois de um determinado campo de nossa tabela, utilizamos a seguinte sintaxe: ALTER TABLE Nome_Tabela ADD Nome_Campo Nova_Regra [FIRST|AFTER] Campo_Determinado; Assim, se inserirmos FIRST, o novo campo será criado antes do campo escolhido da tabela. Se utilizarmos AFTER, depois. Desta forma se quisermos incluir o campo Nome_Mãe imediatamente depois do Nome do Cliente, digitamos: ALTER TABLE Cliente ADD Nome_Mae VARCHAR(60)AFTER Nome; Alguns gerenciadores também utilizam a cláusula ADD COLUMN ao invés de somente ADD. Podemos também utilizar ADD para adicionarpor exemplo uma chave primária em uma tabela. Em nossa tabela, se quisermos que Alterando tabelas 11 nome seja uma chave primária também, podemos fazer: ALTER TABLE Cliente ADD PRIMARY KEY(Nome); Se desejarmos eliminar uma coluna de nossa tabela, utilizamos a seguinte sintaxe: ALTER TABLE Nome_Tabela DROP nome_campo; Alguns gerenciadores também utilizam a cláusula DROP COLUMN ao invés de somente DROP. MODIFY Podemos utilizar a cláusula MODIFY para modificar as propriedades de um campo em uma tabela. Por exemplo, imaginemos que devemos modificar o tamanho de nosso campo Nome na tabela Cliente, que é de 60 para 100. Então podemos escrever: ALTER TABLE Cliente MODIFY Nome(100); Com a cláusula MODIFY, também podemos alterar o tipo de um campo. Imaginemos que por um motivo qualquer desejemos alterar o tipo do campo Nome de VarChar para Char: ALTER TABLE Cliente MODIFY Nome CHAR (100); Removendo tabelas Podemos excluir uma tabela qualquer dentro de um banco de dados. A sintaxe básica para criarmos é: DROP TABLE nome_tabela; No entanto, devemos nos atentar que ao excluir uma tabela que possui relacionamento com outras tabelas, o SGBD retornará erro. Neste caso se realmente for necessário excluir uma tabela, deve-se fazer as alterações necessárias em todas as tabelas relacionadas. Constraints Esta página é somente um esboço. Ampliando-a você ajudará a melhorar o Wikilivros. Linguagem de manipulação de dados 12 Linguagem de manipulação de dados Uma linguagem de manipulação de dados é usada para modificar registros em um banco de dados. O ideal é que isso aconteça sem modificar o esquema do banco de dados (como por exemplo: recursos de tabela, relacionamentos, ...). As declarações podem ser de 3 tipos: INSERT, UPDATE, DELETE. Inserindo dados Em um banco de dados, inserir dados em uma tabela, significa preencher uma linha de determinada tabela com dados correspondentes aos tipos determinados naquela tabela. Esta inserção de dados deve seguir as regras de integridade da tabela, assim como respeitar as regras de chave primária estabelecidas na tabela. Na linguagem SQL, para inserirmos dados em uma tabela, utilizamos o seguinte comando: INSERT INTO Nome_Tabela VALUES (valor 1, valor2, valor3,...); Os valores valor1 , valor2, etc..., seguem a ordem dos campos da tabela, sendo utilizado valor vazio (' ') para campos que não necessitem de preenchimento. Dados de tipo numérico podem ser escritos sem a necessidade de aspas simples. Dados do tipo caracter (como char e varchar), devem ser escritos entre aspas simples. Exemplo: INSERT INTO Clientes VALUES (1, 'José Pereira', '1111-1111,...); Alterando dados Em um banco de dados, alterar dados de uma tabela significa atualizar um dado de uma determinada tabela, por outro dado de mesmo tipo daquele que é atualizado. Na linguagem SQL, para alterarmos dados em uma determinada tabela, utilizamos o seguinte comando: UPDATE Nome_Tabela SET coluna a ser atualizada= valor atualizado ['''WHERE''' ''condição'']; O comando Update pode ser realizado sem o WHERE. Neste caso todas as linhas da tabela serão atualizadas com o valor determinado no comando. Para os casos onde se necessite atualizar apenas linhas que cumpram determinada condição, esta condição é estabelecida com a inclusão do comando WHERE. Exemplo: UPDATE Clientes SET nome= 'Antônio Pereira' ; Ou: UPDATE Clientes SET telefone= '2222-2222' WHERE nome='José Pereira'; Removendo dados 13 Removendo dados Em um banco de dados, apagar dados de uma tabela significa eliminar um dado de uma determinada tabela. Para isto utilizamos a instrução DELETE. Na linguagem SQL, para apagar dados em uma determinada tabela, utilizamos a seguinte sintaxe: DELETE FROM Nome_Tabela [WHERE condição ]; O comando Delete pode ser realizado sem o WHERE. Neste caso todas as linhas da tabela determinada serão excluídas. Utilizamos WHERE quando desejamos eliminar os registros que obedeçam certa condição. Exemplo: DELETE FROM Clientes; Neste caso são eliminados todos os registros da tabela Clientes. Ou: DELETE FROM Clientes WHERE nome='José Pereira'; Neste caso só serão eliminados os registros cujo campo nome seja igual a José Pereira. Os registros com nomes diferentes permanecerão intactos. Linguagem de consulta de dados Linguagem de consulta de dados é usada para, fazer o que o nome diz, consultas, extrair informações de um banco de dados. É importante que essas consultas aconteçam sem causar mudanças no banco de dados, caso contrário dados valiosos poderiam ser prejudicados. O comando de consulta é SELECT. Em um banco de dados, selecionar dados significa efetuar uma consulta enviando o comando que retornará com as informações solicitadas se existirem. Para efetuar estas consultas utilizamos o comando SELECT. Na linguagem SQL, para efetuar consultas , utilizamos a seguinte sintaxe: SELECT Nome_ campo FROM Nome_Tabela [WHERE condição]; O comando Select deve conter o nome do campo que deve ser retornado, de qual tabela e quando contêm a claúsula WHERE, as condições que o registro deve obedecer para retornar os valores. Quando desejamos trazer todos os campos utilizamos o asterisco (*). Exemplo: SELECT * FROM Clientes; Neste caso são trazidos todos os registros da tabela Clientes. Mas se, por exemplo, só quisermos trazer o nome e o telefone da tabela Clientes, utilizamos : SELECT nome, telefone FROM Clientes; Linguagem de consulta de dados 14 Com o uso da cláusula WHERE, podemos filtrar os registros que são retornados. Neste caso podemos por exemplo trazer apenas os registros cujo nome seja José da Silva: SELECT nome, telefone FROM Clientes WHERE nome='José da Silva'; Distinct A função Distinct não permite que valores iguais de uma mesma coluna sejam retornados. Sua sintaxe é: SELECT DISTINCT(Nome_Campo) FROM Nome_tabela; Ordenação Podemos ordenar os resultados de uma consulta por um ou diversos campos de uma tabela. Na linguagem SQL, utilizamos o comando ORDER BY para efetuar esta ordenação: SELECT Nome_ campo FROM Nome_Tabela [WHERE condição ORDER BY Nome_campo [ASC|DESC]]; Exemplo: SELECT * FROM Clientes WHERE Salario>1000 ORDER BY Nome; Neste caso são trazidos todos os registros da tabela Clientes cujo campo Salario seja maior do que 1000, sendo ordenado por nome. O ORDER BY normalmente efetua a ordenação em ordem crescente (isto é, ascendente). No entanto podemos especificar se queremos que a ordenação seja em ordem crescente ou decrescente: SELECT * FROM Clientes WHERE Salario>1000 ORDER BY Nome ASC; Neste caso os registros serão ordenados de forma ascendente por nome. SELECT * FROM Clientes WHERE Salario>1000 ORDER BY Nome DESC; Neste caso os registros serão ordenados de forma descendente por nome. Agrupamento 15 Agrupamento group by Podemos agrupar dados utilizando a cláusula GROUP BY que permite unir em uma única linha todas as linhas selecionadas que possuam os mesmos valores. Sua sintaxe é: SELECT coluna1, coluna3 FROM Tabela GROUP BY coluna1, coluna3 Exemplo: SELECT departamento, MAX(idade) FROM Funcionarios GROUP BY departamento having Conforme aprendemos anteriormente utilizamos a cláusula WHERE quando queremos definir uma condição de retorno de um comando SELECT. No entanto a cláusula WHERE determina os dados que serão agregados, e não podem definir as condições de retorno de uma agregação. Neste caso, utilizamos a cláusula Having que seleciona grupos de linhas após as agregações e agrupamentos serem efetuados. Exemplo: SELECT Codigo,Max(Idade) FROM Cliente HAVING Max(Idade)<60; SELECT DepartmentName, COUNT(*) FROM Employee, Department WHERE Employee.DepartmentID = Department.DepartmentID GROUP BY DepartmentNameHAVING COUNT(*)>1; Funções de agregação 16 Funções de agregação Sum A função Sum permite a soma de um campo numérico. Sua sintaxe é: SELECT SUM(Nome_Campo) FROM Nome_tabela; Avg A função Avg retorna o valor médio entre os conjuntos de valores de um campo numérico. Sua sintaxe é: SELECT AVG(Nome_Campo) FROM Nome_tabela; Count A função Count conta a quantidade de dados de um campo dado. Sua sintaxe é : SELECT COUNT(Nome_Campo) FROM Nome_tabela; Max A função Max retorna o maior valor encontrado entre os dados de um campo dado. Sua sintaxe é: SELECT MAX(Nome_Campo) FROM Nome_tabela; Min A função Min retorna o menor valor encontrado entre os dados de um campo dado. Sua sintaxe é: SELECT MIN(Nome_Campo) FROM Nome_tabela; Junções 17 Junções Em um banco de dados podemos ter duas ou mais tabelas relacionadas. É comum ao elaborarmos uma consulta termos a necessidade de trazer dados de diferentes tabelas. Para criarmos esta seleção devemos definir os critérios de agrupamento para trazer estes dados. Estes critérios são chamados de Junções. Uma junção de tabelas criar uma pseudo-tabela derivada de duas ou mais tabelas de acordo com as regras especificadas, e que são parecidas com as regras da teoria dos conjuntos. Junção de produto cartesiano Uma junção de produto cartesiano é uma junção entre duas tabelas que origina uma terceira tabela constituída por todos os elementos da primeira combinadas com todos os elementos da segunda. Para trazer apenas os campos necessários da consulta: • No SELECT utilizamos em vez do nome do campo simples, o nome_tabela_campo.nome_campo; •• Em FROM utilizamos os nomes das tabelas que possuem os campos que queremos trazer; •• Em WHERE determinamos a dependência das tabelas, lembrando que a relação entre as tabelas é efetuada pela chave estrangeira.Desta forma o WHERE sempre especifica as chaves estrangeiras que ligam as tabelas. Como exemplo, vamos imaginar que possuímos duas tabelas relacionadas: Cliente e Profissao. A tabela Profissão contém o código e profissão armazenado: CREATE TABLE Profissao ( Codigo INT NOT NULL AUTO_INCREMENT, Cargo VARCHAR (60) NOT NULL, PRIMARY KEY (Codigo) ); A tabela Cliente armazena os dados pessoais do Cliente: CREATE TABLE Cliente ( Codigo INT NOT NULL AUTO_INCREMENT, Nome VARCHAR (60) NOT NULL, Data_Nascimento DATE, Telefone CHAR (8), Profissao INT, PRIMARY KEY (Codigo) ), FOREIGN KEY (Profissao) REFERENCES Profissao(Codigo); Agora inserimos dados nestas tabelas. Em Profissao vamos inserir três profissões básicas: INSERT INTO Profissao VALUES (1,'Programador') INSERT INTO Profissao VALUES (2,'Analista de BD') INSERT INTO Profissao VALUES (3,'Suporte') Possuímos agora três profissões com respectivos códigos. Agora vamos inserir dados na tabela Cliente: INSERT INTO Cliente VALUES (1,'João Pereira',19820606,'12345678',1) INSERT INTO Cliente VALUES (2,'José Manuel',19750801,'21358271',2) INSERT INTO Cliente VALUES (3,'Maria Mercedes',19851001,'85412587',3) Para visualizarmos todos os dados contidos nas duas tabelas após a inserção dos dados, podemos utilizar: Junções 18 SELECT * FROM Cliente,Profissao; Porém, se quisermos trazer apenas o Nome do Cliente e o seu Cargo, podemos fazer uma junção de produto cartesiano: SELECT Cliente.Nome,Profissao.Cargo FROM Cliente,Profissao WHERE Cliente.Profissao=Profissao.Codigo; Nesta seleção, trazemos um campo de cada tabela após o SELECT, mencionamos as tabelas de quais elas se originam no FROM, e no WHERE especificamos a ligação entre as tabelas. Note que Cliente.Profissao é a chave estrangeira da tabela Cliente, que referencia diretamente a chave primária da tabela Profissao. Junção Interna (Inner Join) Uma Junção Interna é caracterizada por uma seleção que retorna apenas os dados que atendem às condições de junção, isto é, quais linhas de uma tabela se relacionam com as linhas de outras tabelas. Para isto utilizamos a cláusula ON, que é semelhante à cláusula WHERE. Podemos especificar duas formas diferentes de expressar esta junção: a explícita utiliza a palavra JOIN, enquanto a implícita utiliza ',' para separar as tabelas a combinar na cláusula FROM do SELECT. Então sempre é gerado o produto cruzado do qual são selecionadas as combinações que cumpram a cláusula WHERE. É necessário ter algum cuidado quando se combinam colunas com valores nulos (NULL), já que o valor nulo não se combina com outro valor, ou outro valor nulo, exceto quando se agregam predicados como IS NULL ou IS NOT NULL. Como exemplo, a consulta seguinte traz todos os registros da tabela Cliente e encontra todas as combinações com a tabela Profissao. A cláusula JOIN compara os valores da coluna Profissao de Cliente com a coluna Codigo da Profissao. Quando não existe aos dados não atendem as condições especificadas, eles não são retornados. SELECT Cliente.nome,Pedido.cod_cliente,Pedido.num_pedido FROM Cliente INNER JOIN Pedido ON Cliente.Cod_cliente = Pedido.Cod_cliente Junção Externa (Outer Join) Uma Junção Externa é uma seleção que não requer que os registros de uma tabela possuam registros equivalentes em outra. O registro é mantido na pseudo-tabela se não existe outro registro que lhe corresponda. Este tipo de junção se subdivide dependendo da tabela do qual admitiremos os registros que não possuem correspondência: a tabela esquerda, a direita ou ambas. Left Outer Join O resultado desta seleção sempre contém todos os registros da tabela esquerda (isto é, a primeira tabela mencionada na consulta), mesmo quando não exista registros correspondentes na tabela direita. Desta forma, esta seleção retorna todos os valores da tabela esquerda com os valores da tabela direita correspondente, ou quando não há correspondência retorna um valor NULL. Se por exemplo inserimos na tabela Cliente um Cliente que não possua valor em seu campo Profissao, ou possua um valor que não tem correspondente no Codigo na tabela Profissão, e efetuarmos a seleção com LEFT OUTER JOIN a seleção será efetuada trazendo todos os dados da tabela Cliente, e os correspondentes na tabela Profissao, e quando não houver estes correspondentes, trará o valor NULL. Junções 19 SELECT distinct * FROM Cliente LEFT OUTER JOIN Profissao ON Cliente.Profissao=Profissao.Codigo; Right Outer Join Esta operação é inversa à anterior e retorna sempre todos os registros da tabela à direita (a segunda tabela mencionada na consulta), mesmo se não existir registro correspondente na tabela à esquerda. Nestes casos, o valor NULL é retornado quando não há correspondência. Como exemplo, imaginemos que possuímos diversas Profissões com respectivos códigos que não possuem correspondentes na tabela Clientes. Esta consulta traz todas estas Profissões mesmo que não haja esta correspondência: SELECT * FROM Cliente RIGHT OUTER JOIN Profissao ON Cliente.Profissao = Profissao.Codigo; Full Outer Join Esta operação apresenta todos os dados das tabelas à esquerda e à direita, mesmo que não possuam correspondência em outra tabela. A tabela combinada possuirá assim todos os registros de ambas as tabelas e apresentará valores nulos para os registros sem correspondência. SELECT * FROM Cliente FULL OUTER JOIN Profissao ON Cliente.Profissao=Profissao.Codigo; Ou ainda: SELECT * FROM Cliente LEFT JOIN Profissao ON Cliente.Profissao=Profissao.Codigo UNION SELECT * FROM Cliente RIGHT JOIN Profissao ON Cliente.Profissao=Profissao.Codigo WHERE Cliente.Profissao IS NULL; Junções 20 Resumo Junção de produto cartesiano é uma junção entre duas tabelas que origina uma terceira tabela constituída por todos os elementos da primeira combinadas com todos os elementos da segunda. Junção Interna todas linhas de uma tabela se relacionam com todas as linhas de outras tabelas se elas tiveremao menos 1 campo em comum Junção Externa é uma seleção que não requer que os registros de uma tabela possuam registros equivalentes em outras • Left Outer Join todos os registros da tabela esquerda mesmo quando não exista registros correspondentes na tabela direita. • Right Outer Join todos os registros da tabela direita mesmo quando não exista registros correspondentes na tabela esquerda. • Full Outer Join Esta operação apresenta todos os dados das tabelas à esquerda e à direita, mesmo que não possuam correspondência em outra tabela Fontes e Editores da Página 21 Fontes e Editores da Página Introdução ao SQL Fonte: http://pt.wikibooks.org/w/index.php?oldid=244162 Contribuidores: Abacaxi, Jonas AGX Banco de dados Relacional Fonte: http://pt.wikibooks.org/w/index.php?oldid=258283 Contribuidores: Abacaxi, Jonas AGX, 2 edições anónimas Linguagem de definição de dados Fonte: http://pt.wikibooks.org/w/index.php?oldid=244147 Contribuidores: Abacaxi Criando tabelas Fonte: http://pt.wikibooks.org/w/index.php?oldid=255459 Contribuidores: Abacaxi, Jonas AGX Alterando tabelas Fonte: http://pt.wikibooks.org/w/index.php?oldid=244145 Contribuidores: Abacaxi Removendo tabelas Fonte: http://pt.wikibooks.org/w/index.php?oldid=244146 Contribuidores: Abacaxi Linguagem de manipulação de dados Fonte: http://pt.wikibooks.org/w/index.php?oldid=207877 Contribuidores: Jonas AGX Inserindo dados Fonte: http://pt.wikibooks.org/w/index.php?oldid=244150 Contribuidores: Abacaxi Alterando dados Fonte: http://pt.wikibooks.org/w/index.php?oldid=244149 Contribuidores: Abacaxi Removendo dados Fonte: http://pt.wikibooks.org/w/index.php?oldid=244148 Contribuidores: Abacaxi Linguagem de consulta de dados Fonte: http://pt.wikibooks.org/w/index.php?oldid=247511 Contribuidores: Abacaxi, Jonas AGX Ordenação Fonte: http://pt.wikibooks.org/w/index.php?oldid=244154 Contribuidores: Abacaxi Agrupamento Fonte: http://pt.wikibooks.org/w/index.php?oldid=248702 Contribuidores: Abacaxi Funções de agregação Fonte: http://pt.wikibooks.org/w/index.php?oldid=244160 Contribuidores: Abacaxi Junções Fonte: http://pt.wikibooks.org/w/index.php?oldid=244153 Contribuidores: Abacaxi Fontes, Licenças e Editores da Imagem 22 Fontes, Licenças e Editores da Imagem Imagem:Rekopis chopin.jpg Fonte: http://pt.wikibooks.org/w/index.php?title=Ficheiro:Rekopis_chopin.jpg Licença: Public Domain Contribuidores: Andreagrossmann, Kevyn, Maire, Man vyi, Niki K, Subitosera, Tsca Licença 23 Licença Creative Commons Attribution-Share Alike 3.0 //creativecommons.org/licenses/by-sa/3.0/
Compartilhar