104
Escola Secundária de Adolfo Portela Redes de Comunicação Curso Profissional de Técnico de Gestão e Programação de Sistemas Informáticos Ano lectivo 2009-2010 :: 11ºH

Linguagem SQL (com MySQL)

Embed Size (px)

DESCRIPTION

Diapositivos de apoio para aulas da disciplina de Sistemas de Informação - Módulo III. Curso profissional de Informática de Gestão

Citation preview

Page 1: Linguagem SQL (com MySQL)

Escola Secundária de Adolfo Portela

Redes de Comunicação

Curso Profissional de Técnico de Gestão e Programação de Sistemas Informáticos

Ano lectivo 2009-2010 :: 11ºH

Page 2: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

Módulo VII (opção 1)acesso a bases de dado remotas via web

Page 3: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

Livros de referência:

“Beginning MySQL”; Robert Sheldon, Geoff Moes; Editora: Wrox; ISBN: 0764579509;

“SQL - Structured Query Language - 6ª Edição Actualizada e Aumentada”; Luís Manuel Dias Damas; Editora: FCA; ISBN: 972-722-443-1;

Webliografia de referência:

http://www.hscripts.com/tutorials/mysql/index.php

http://www.estig.ipbeja.pt/~eidbd/sql.htm

http://www.w3schools.com/sql/default.asp

1. introdução...

a) materiais de suporte

Page 4: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

SQL (do inglês Structured Query Language, ou Linguagem de Consulta Estruturada), é uma linguagem de pesquisa, declarativa, para Bases de Dados Relacionais;

Vamos aprender SQL para aceder e manipular dados no SGBDs MySQL, mas esta linguagem é comum a outros SGBDs: SQL Server, Access, Oracle, DB2 entre outros...

O SQL foi desenvolvido originalmente no início dos anos 70 nos laboratórios da IBM;

O SGBD que vamos utilizar nas aulas será o MySQL

1. introdução...

b) introdução | SQL?!

Page 5: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

A consola (linha de comandos) do MySQL está localizada em mysql\bin e tem o nome mysql.exe. Para ser iniciado como administrador, mysql -u root

Vai ser na consola que iremos executar todas as operações de SQL;

Nota: O comando será apenas executado quando a linha terminar com ; caso contrário, sempre que for premida a tecla ENTER é efectuada apenas uma quebra de linha (-->)

1. introdução...

b) introdução | a consola

Page 6: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

Para termos acesso a uma lista de bases de dados existentes no servidor

show databases;

1. introdução...

c) primeiros passos | show databases

Page 7: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

Para criar uma nova base de dados

create database NomeDaNovaBaseDados;

1. introdução...

c) primeiros passos | create database

Page 8: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

Para utilizar uma base de dados da lista

use NomeDaBaseDados;

Para listar as tabelas da base de dados em uso

show tables;

Nota: no exemplo o resultado mostrado é “Empty set” na medida em que ainda não foram criadas quaisquer tabelas na dita base de dados...

1. introdução...

c) primeiros passos | use e show

Page 9: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

Após criarmos uma tabela podemos visualizar a sua estrutura utilizando o comando DESCRIBE ou simplesmente DESC seguido do nome da tabela, ou o comando SHOW FIELDS FROM nomeTabela ;

DESC nomeTabela ; (show create table nomeTabela -> mais detalhe!)

SHOW FIELDS FROM nomeTabela ;

1. introdução...

c) primeiros passos | describe

Page 10: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

1. introdução...

d) tipos de dados aceites no SQL

Tipo Abreviação Descrição

INTEIRO INT ou

INTEGERNúmeros inteiros. Existem outros tipos de números inteiros de acordo com o

sgbd utilizado.

REAL DOUBLE ou REAL

Números reais. Permitem armazenar todo tipo de número não inteiro. Existem outros tipos de números reais de acordo com o sgbd utilizado.

CARACTER CHAR (x)Caracter. Permite a inclusão de dados alfanuméricos com tamanho pré-

definido. O número de caracteres é definido entre os parênteses. Ocupa sempre o número indicado (com espaços...)

CARACTER VARIÁVEL VARCHAR (x)

Caracter. Permite a inclusão de dados alfanuméricos. O número de caracteres é definido entre os parênteses, porém o número de bytes utilizados pelo

campo é apenas o especificado (número).

DATA DATE Data. Existem diversos tipos de datas de acordo com o sgbd utilizado.

BOOLEANO BOOLEAN Armazena um bit de informação, utilizado para verdadeiro ou falso.

Page 11: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

1. introdução...

d) tipos de dados aceites no MySQLPara valores numérios inteiros temos:

Page 12: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

1. introdução...

d) tipos de dados aceites no MySQLPara valores numérios reais temos:

Page 13: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

1. introdução...

d) tipos de dados aceites no MySQLPara valores do tipo caracter (string) temos:

Page 14: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

1. introdução...

d) tipos de dados aceites no MySQLPara valores tipo data temos:

Page 15: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

DDL - Linguagem de Definição de Dados

DML - Linguagem de Manipulação de Dados

Page 16: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

2. DDL - Linguagem de Definição de Dados

a) definiçãoLinguagem de definição de dados (ou DDL, de Data Definition Language) é um conjunto de comandos dentro do 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 (ou chaves).

Estas instruções SQL permitem definir a estrutura de uma base de dados, incluindo colunas (campos), tabelas, índices (chaves), etc.

Entre os principais comandos DDL estão CREATE (criar), ALTER (alterar) e DROP (apagar).

Page 17: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

2. DDL - Linguagem de Definição de Dados

a) cad - create, alter, dropCREATEUma declaração CREATE permite a criação de uma nova base de dados, tabela, índice, ou consulta armazenada. Entre os principais comandos incluidos estão CREATE DATABASE (criar base de dados) e CREATE TABLE (criar tabela);

ALTERUma declaração ALTER permite alterar um objeto de um base de dados. Entre os principais comandos estão ALTER TABLE ADD (adicionar uma coluna na tabela), ALTER TABLE DROP (excluir uma coluna na tabela), entre outros...

DROPUma declaração DROP permite remover (destruir) uma base de dados existente, tabela ou índice.Entre os principais comandos incluídos estão o DROP DATABASE (eliminar uma base de dados inteira), DROP TABLE (excluir tabela) entre outros...

Page 18: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

create table

2. DDL - Linguagem de Definição de Dados

a) cad - create, alter, drop

Page 19: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

2. DDL - Linguagem de Definição de Dados

b1) CREATE TABLECREATE TABLE é o comando para a criação de tabelas e deve ser seguido pelo nome que queremos dar à tabela;

Dentro do comando, devemos definir os nomes dos campos de acordo com a conveniência da base de dados, e determinar o tipo de dados que poderão ser incluídos nesse campo.

CREATE TABLE nomeTabela ( fieldName1 dataType(size) , fieldName2 dataType(size) ...) [ ENGINE = engineUtilizada ] ;

Tipos de "engine" da base de dados no SGBD MySQL:

ENGINE = {BDB | MEMORY | ISAM | INNODB | MERGE | MYISAM}

CREATE TABLE student (studID INT ,name VARCHAR(30) ,address VARCHAR(40)) ENGINE = InnoDB ;

Page 20: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

2. DDL - Linguagem de Definição de Dados

b1) CREATE TABLE | auto-incrementSe desejamos que o valor de um campo seja de auto-incremento (numeração automática sequêncial) devemos inserir AUTO_INCREMENT na frente do campo pretendido;

Isto pode ser utilizado por exemplo, para automatizar um nº que sirva de chave primária na tabela

CREATE TABLE student (studID INT PRIMARY KEY AUTO_INCREMENT ,name VARCHAR(30) ,address VARCHAR(40)) ENGINE = InnoDB ;

Nota: cada tabela pode ter apenas UM CAMPO com AUTO_INCREMENT e o mesmo terá de ser obrigatoriamente definido como chave primária ( PRIMARY KEY )!

Page 21: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

2. DDL - Linguagem de Definição de Dados

b1) CREATE TABLE | defaultValor predefinido para um campo da tabela

CREATE TABLE student (studID INT,name VARCHAR(30) ,address VARCHAR(40) DEFAULT ‘ Aveiro ‘) ENGINE = InnoDB ;

Page 22: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

constraints

2. DDL - Linguagem de Definição de Dados

b2) CREATE TABLE | constraints

Page 23: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

2. DDL - Linguagem de Definição de Dados

b2) create | constraintsHá diversas regras de “constraint” que podem ser aplicadas aos campos que formam uma tabela.

A sua definição pode ser feita de duas formas: inline ou com a palavra constraint (com a excepção do NOT NULL que pode apenas ser definida inline)

Eis as mais importantes:

NOT NULL (definido apenas inline)

UNIQUE

PRIMARY KEY

FOREIGN KEY

CHECK

Page 24: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

2. DDL - Linguagem de Definição de Dados

b2) create | constraints: not null (nn)O constrangimento NOT NULL força um campo a não aceitar valores NULL (vazios), ou seja, obriga a que este seja sempre preenchido (tal como explicado anteriormente).

Eis um pequeno exemplo onde o constrangimento é definido inline:

CREATE TABLE student (studID INT NOT NULL ,name VARCHAR(30) ,address VARCHAR(40)) ENGINE = InnoDB ;

Page 25: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

2. DDL - Linguagem de Definição de Dados

b2) create | constraints: unique (un)O constrangimento UNIQUE identifica de forma única cada registo da tabela da base de dados (não permite que o valor se repita).

Tem o mesmo efeito prático da PRIMARY KEY.

CREATE TABLE student (studID INT ,name VARCHAR(30) ,address VARCHAR(40) ,CONSTRAINT un_nomeConstricao UNIQUE ( studID )) ENGINE = InnoDB ;

Obs 1) O constrangimento PRIMARY KEY implementa automaticamente este UNIQUE;

Obs 2) Podemos ter vários campos com o constrangimento UNIQUE.

Nota: un_nomeConstricao é o nome do constraint. Tipicamente tem um prefixo (nn, un, pk, fk,ck), seguido de underscore e o nome "simbólico" para a regra de constrangimento.

Nota2: O MySQL é case sensitive (sensível às maiúsculas) no nome do constraint! nn_nomeConstricao e un_nomeconstricao seriam duas regras de constrangimento diferentes!

inline:

CREATE TABLE student (studID INT UNIQUE ,name VARCHAR(30) ,address VARCHAR(40)) ENGINE = InnoDB ;

Page 26: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

2. DDL - Linguagem de Definição de Dados

b2) create | constraints: primary key (pk)O constrangimento PRIMARY KEY define a chave primária da tabela.

O valor introduzido não pode ser nem repetido nem nulo (implementa automaticamente os constrangimentos UNIQUE e NOT NULL).

CREATE TABLE student (studID INT AUTO_INCREMENT,name VARCHAR(30) ,address VARCHAR(40) ,CONSTRAINT pk_nomeConstricao PRIMARY KEY ( studID ) ) ENGINE = InnoDB ;

O constrangimento PRIMARY KEY implementa automaticamente o UNIQUE.

Lembra-te: podemos ter vários campos com o constrangimento UNIQUE mas apenas UMA PRIMARY KEY por tabela.

inline:

CREATE TABLE student (studID INT PRIMARY KEY ,name VARCHAR(30) ,address VARCHAR(40)) ENGINE = InnoDB ;

Page 27: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

2. DDL - Linguagem de Definição de Dados

b2) create | constraints: primary key (pk)CREATE TABLE student (studID INT UNSIGNED AUTO_INCREMENT ,name VARCHAR(30) ,address VARCHAR(40) ,

CONSTRAINT pk_nomeConstricao PRIMARY KEY ( studID )

);

Page 28: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

2. DDL - Linguagem de Definição de Dados

b2) create | constraints: foreign key (fk)A chave estrangeira (foreign key) é uma cláusula que deve ser incluída quando possuímos duas tabelas relacionadas numa base de dados.

Através da chave estrangeira estabelecemos as relações entre duas ou mais tabelas.

A chave estrangeira desta forma referencía o campo que é chave primária na tabeça relacionada.

CREATE TABLE student (studID INT PRIMARY KEY ,name VARCHAR(30) ,address VARCHAR(40) ,

FOREIGN KEY ( campoChaveEstrangeira ) REFERENCES Nome_outraTabela ( Nome_da_Chave )

) ENGINE = InnoDB ;

Page 29: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

2. DDL - Linguagem de Definição de Dados

b2) create | constraints: foreign key (fk)Implementando a chave estrangeira através do método de CONSTRAINT:

CREATE TABLE student (studID INT PRIMARY KEY ,name VARCHAR(30) ,address VARCHAR(40) ,class INT ,

CONSTRAINT fk_nomeConstricao FOREIGN KEY ( CampoChaveEstrangeira ) REFERENCES Nome_outraTabela( Nome_da_Chave )

) ENGINE = InnoDB ;

Page 30: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

2. DDL - Linguagem de Definição de Dados

b2) create | constraints: check (ck)Validação dos valores introduzidos ( “regra de validação” )

Deve ser incluida em campos que estejam DEPOIS da chave primária.

Eis um exemplo para uma regra aplicada ao campo class que só aceita turmas com número compreendido entre 1 e 10:

CREATE TABLE student (studID INT PRIMARY KEY ,name VARCHAR(30) ,address VARCHAR(40) ,class INT ,

CONSTRAINT ck_nomeConstricao CHECK ( class BETWEEN 0 AND 10 )

) ENGINE = InnoDB ;

inline:

CREATE TABLE student (studID INT PRIMARY KEY ,name VARCHAR(30) ,address VARCHAR(40) ,class INT ,

CHECK ( class BETWEEN 0 AND 10 )

) ENGINE = InnoDB ;

Page 31: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

Page 32: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

alter table

2. DDL - Linguagem de Definição de Dados

c) cad - create, alter, drop

Page 33: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

2. DDL - Linguagem de Definição de Dados

c) ALTER TABLEApós criarmos uma tabela podemos alterar sua estrutura com o uso da cláusula ALTER TABLE. Lembra-te que esta alteração é sempre sobre a estrutura da tabela, e não sobre os dados.

Esta alteração à tabela pode ser efectuada de duas formas:

ou acrescentando um novo campo (utilizando ADD)

ou alterando-se as propriedades de um campo já existente (utilizando-se CHANGE ou MODIFY).

O comando ALTER TABLE tem a seguinte sintaxe (a excepção é para mudar nome a uma tabela >> ALTER TABLE nomeActual RENAME novoNome):

ALTER TABLE Nome_Tabela[ADD Nome_Campo Nova_Regra | nova_regraMODIFY Nome_Campo NovoTipo ou Nova_RegraCHANGE Nome_Campo_actual novo_Nome_Campo NovoTipo [e Nova_Regra]DROP Nome_Campo | RegraConstraint];

Page 34: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

2. DDL - Linguagem de Definição de Dados

c1) ALTER TABLE | ADDPodemos utilizar a cláusula ADD para adicionar um novo campo à tabela.

Para isso, além do nome, devemos definir também o seu tipo da mesma forma como fazemos ao criar o campo numa nova tabela:

ALTER TABLE Nome_TabelaADD nomeCampo TipoDados ;

ALTER TABLE ClienteADD Nome_Mae VARCHAR ( 60 ) ;

Caso desejemos que um campo seja inserido numa ordem específica ( INÍCIO ou DEPOIS de um determinado campo ), utilizamos a seguinte sintaxe:

ALTER TABLE ClienteADD Nome_Mae VARCHAR ( 60 ) FIRST;

ALTER TABLE ClienteADD Nome_Mae VARCHAR ( 60 ) AFTER nomeCampo;

Page 35: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

2. DDL - Linguagem de Definição de Dados

c1) ALTER TABLE | ADDCom o ADD podemos adicionar também regras a um dado campo.

Na nossa tabela, se quisermos que o campo nome seja chave primária, podemos fazer:

ALTER TABLE ClienteADD PRIMARY KEY ( Nome ) ;

Se quisermos que o campo dataNascimento tenha valores entre 1980-12-31 e 2009-12-31, podemos fazer:

ALTER TABLE ClienteADD CHECK ( nome LIKE ‘ a% ‘ ) ;

ou através da forma de declaração da regra de constrangimento via constraint:

ALTER TABLE ClienteADD CONSTRAINT ck_nomeConstricao CHECK ( class BETWEEN 0 AND 10 )

Podiamos inclusivamente adicionar uma chave estrangeira (foreign key):

ALTER TABLE ClienteADD FOREIGN KEY ( campoChaveEstrangeira ) REFERENCES Nome_outraTabela ( Nome_da_Chave )

Page 36: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

2. DDL - Linguagem de Definição de Dados

c2) ALTER TABLE | MODIFYAltera as especificações de um campo da tabela (tipo de dados, regras, etc) mas o nome mantém-se.

Sintaxe:

ALTER TABLE nomeDaTabela MODIFY campo novoTipoDados NovaRegra;

Ex.

ALTER TABLE student MODIFY stud_name VARCHAR ( 50 ) ;

ou mais complexo...

ALTER TABLE student MODIFY stud_name VARCHAR ( 60 ) NOT NULL DEFAULT ‘ helder ’;

Page 37: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

2. DDL - Linguagem de Definição de Dados

c3) ALTER TABLE | CHANGEAltera o nome de um campo (coluna) e do respectivo tipo de dados (type) e as suas regras

Nota: quando se muda o nome a uma coluna com o CHANGE, somos obrigados a especificar novamente o seu tipo de dados mesmo que este se mantenha (terá de ser repetido).

Sintaxe:

ALTER TABLE nomeDaTabela CHANGE nomeDoCampoActual novoNome novoTipoDados [ novas regras ] ;

Ex.

ALTER TABLE student CHANGE name numTelefone INT NOT NULL UNIQUE ;

Page 38: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

2. DDL - Linguagem de Definição de Dados

c4) ALTER TABLE | DROPSe desejarmos ELIMINAR algo da estrutura da nossa tabela, utilizamos a seguinte sintaxe:

ALTER TABLE Nome_Tabela[DROP COLUMN nome_campo];[DROP FOREIGN KEY fk_simbolo];[DROP PRIMARY KEY];

Exemplos:

ALTER TABLE student DROP COLUMN stud_name ;

ou

ALTER TABLE student DROP FOREIGN KEY fk_simbolo ;

ou

ALTER TABLE student DROP PRIMARY KEY ;

Page 39: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

DROP TABLE

2. DDL - Linguagem de Definição de Dados

d) cad - create, alter, drop

Page 40: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

2. DDL - Linguagem de Definição de Dados

d) DROP TABLESe desejarmos ELIMINAR uma tabela intera da base de dados:

DROP TABLE nomeTabela;

Page 41: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

Informação avulsa... :)

mysqldump e show createSe desejarmos EXPORTAR toda a estrutura e o conteúdo de uma base de dados no MySQL, devemos proceder da seguinte forma (convém criar um atalho para simplificar o processo...)

mysqldump -u root nomeBaseDados > nomeFicheiro.sql

Caso tenham necessidade de ver a estrutura de uma tabela em detalhe, podem utilizar:

show create table nomeTabela

Page 42: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

DDL - Linguagem de Definição de Dados

DML - Linguagem de Manipulação de Dados

Page 43: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

a) definiçãoMostrar os campos (colunas) de uma tabela:

Os principais comandos DML são:

INSERT ( Inserção de Dados )

SELECT ( Seleção de Dados )

UPDATE ( Actualização de Dados )

DELETE ( Eliminação de Dados )

Page 44: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

inserção de dados | INSERT

Page 45: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

Vamos agora perceber como podemos introduzir novos registos numa tabela da nossa base de dados. Caso se pretenda preencher todos os campos pela ordem definida na própria estrutura da tabela, utilizamos a seguinte sintaxe:

INSERT INTO nomeTabela VALUES ( valor_campo1 , ‘ valor_campo2 ‘ , ... ) ;

Caso haja necessidade de preencher apenas alguns campos, há a necessidade de especificar quais são os campos e os respectivos valores. Já os campos omitidos ficam com valor NULL.

INSERT INTO nomeTabela (campo1 , campo2 , ... ) VALUES ( valorNumerico1 , ' valorString1 ' , ... ) ;

ou então assim:

INSERT INTO nomeTabela SET campo1 = valorNumerico1, campo2 = ‘ valorString1 ‘ , ... = ... ;

NOTA: strings e datas deverão ser delimitadas por aspas. Valores numéricos não necessitam.

3. DML - Linguagem de Manipulação de Dados

c) inserção de dados | INSERT

Page 46: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

INSERT INTO Books VALUES (12786, "Letters to a Young Poet", 1934), (13331, "Winesburg, Ohio", 1919), (14356, "Hell\"s Angels", 1966), (15729, "Black Elk Speaks", 1932), (16284, "Noncomformity", 1996), (17695, "A Confederacy of Dunces", 1980), (19264, "Postcards", 1992), (19354, "The Shipping News", 1993);

INSERT INTO AuthorBook VALUES (1006, 14356), (1008, 15729), (1009, 12786), (1010, 17695), (1011, 15729), (1012, 19264), (1012, 19354), (1014, 16284);

INSERT INTO Authors VALUES (1006, "Hunter", "S.", "Thompson"), (1007, "Joyce", "Carol", "Oates"), (1008, "Black", NULL, "Elk"), (1009, "Rainer", "Maria", "Rilke"), (1010, "John", "Kennedy", "Toole"), (1011, "John", "G.", "Neihardt"), (1012, "Annie", NULL, "Proulx"), (1013, "Alan", NULL, "Watts"), (1014, "Nelson", NULL, "Algren");

3. DML - Linguagem de Manipulação de Dados

c) inserção de dados | INSERT | Exemp.

Page 47: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

consulta de dados | SELECT

Page 48: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

Depois de haver registos inseridos nas tabelas, temos de ser capazes de efectuar consultas sobre eles. A sintaxe é a seguinte:

SELECT campo1, campo2, ... FROM nomedaTabela ;

Também aqui podemos utilizar o símbolo * para seleccionar TODOS os campos da tabela:

SELECT * FROM nomedaTabela ;

3. DML - Linguagem de Manipulação de Dados

d1) consulta de dados | SELECT

Page 49: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

Se houver a necessidade de ordenar os registos do resultado de uma consulta, tal pode ser feito bastando para isso especificar quais os campos envolvidos, e qual a ordem a aplicar em cada um deles - ascendente (ASC) ou descendente (DESC):

SELECT * FROM nomedaTabela ORDER BY nomeCampo [ ASC | DESC ] ;

Exemplos:SELECT * FROM cds ORDER BY titel ASC ; SELECT * FROM cds ORDER BY id DESC ;

3. DML - Linguagem de Manipulação de Dados

d3) consulta de dados | SELECT ORDER BY

Page 50: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

Podemos ainda “mascarar” o nome verdadeiro de um campo da tabela utilizando a função AS utilizando a seguinte sintaxe:

SELECT nomedoCampo1 AS novoNome, nomedoCampo2 AS novoNome2, ... FROM nomedaTabela ;

Exemplo:SELECT titel AS titulo, interpret AS artista, jahr AS dataPublic FROM cds;

3. DML - Linguagem de Manipulação de Dados

d3) consulta de dados | SELECT AS (alias)

Page 51: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

Por vezes há a necessidade de introduzir cláusulas ou critérios na consulta. Utilizamos para isso o WHERE:

SELECT * FROM nomedaTabela WHERE condição

Exemplo:SELECT * FROM cds WHERE jahr = 2001 ;

3. DML - Linguagem de Manipulação de Dados

d4) consulta de dados | critérios WHERE

Page 52: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

Aqui temos um exemplo mais complexo (tem uma condição maior) mas que obedece às mesmas regras de construção da anterior:

SELECT CDName, Category, InStock+OnOrder-Reserved AS Available FROM CDs WHERE ( Category = " Blues " OR Category = " Jazz " ) AND ( InStock+OnOrder-Reserved ) > 20 ;

3. DML - Linguagem de Manipulação de Dados

d4) consulta de dados | critérios WHERE

Page 53: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

Quando os valores que utilizamos como critério não são exactos e sabemos apenas alguns detalhes deles, podemos utilizar a palavra LIKE.

% representa diversos caracteres que desconhecemos;

_ (underscore) representa um caracter que desconhecemos;

SELECT campos FROM nomedaTabela WHERE nomeCampo [NOT LIKE | LIKE ] valor ;

3. DML - Linguagem de Manipulação de Dados

d4) consulta de dados | WHERE ... LIKE

Page 54: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

Exemplos:

1) vamos procurar todos registos da tabela CDs cujo titulo comece com a letra g

SELECT * FROM CDs WHERE titel LIKE ‘ g% ‘ ;

3. DML - Linguagem de Manipulação de Dados

d4) consulta de dados | WHERE ... LIKE

Page 55: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

Exemplos:

2) vamos agora procurar todos registos da tabela CDs cujo titulo não tenha apenas 5 letras e cujo ano de lançamento (campo jahr) seja superior ao ano 2000

SELECT * FROM CDs WHERE titel NOT LIKE ‘_ _ _ _ _ ‘ AND jahr > 2000 ;

3. DML - Linguagem de Manipulação de Dados

d4) consulta de dados | WHERE ... LIKE

Page 56: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

d4) consulta de dados | WHERE ... outros...Além do LIKE existem ainda outros operadores que podem ser usados como critério na utilização da cláusula WHERE:

BETWEEN / NOT BETWEEN

IS NULL / IS NOT NULL

Ex.SELECT * FROM CDs WHERE jahr BETWEEN 2000 AND 2001 ;

Page 57: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

d4) consulta de dados | WHERE | AND ORPodemos ainda juntar diversos critérios com os operadores AND e OR:

Exemplo com o operador AND (E):

SELECT BookName , Category , InStock , OnOrder FROM Books WHERE Category= ’ Fiction ’ AND ( InStock+OnOrder ) > 40 ORDER BY BookName;

Exemplo com o operador OR (OU) e o símbolo diferente ( < > )

SELECT BookName , Category , InStock , OnOrder FROM Books WHERE InStock > 30 OR OnOrder < > 60 ORDER BY BookName;

Page 58: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

Caso o resultado da consulta tenha demasiados registos, o programador poderá especificar um limite máximo:

SELECT campo1, campo2, ... FROM nomedaTabela LIMIT numeroMáximo ;

Caso não queiramos começar a consulta a partir do primeiro registo mas avançar X registos (ideal quando se quer dividir o resultado por páginas), utilizamos a seguinte estrutura:

SELECT campo1, campo2, ... FROM nomedaTabela LIMIT offset , numeroMáximo ; ou SELECT campo1, campo2, ... FROM nomedaTabela LIMIT numeroMáximo OFFSET numeroRegInicial ;

Exemplos implementados das duas formas mas com o mesmo resultado final:

SELECT * FROM student LIMIT 5 , 10 || SELECT * FROM student LIMIT 10 OFFSET 5

No exemplo, a consulta vai mostrar no máximo 10 registos, e começa a contar a partir do 5º registo da tabela em diante. Ou seja, se todos os registos tivessem um campo idStudent com números de 1 a 100... mostraria os alunos onde idStudent fosse entre 6 e 15.

3. DML - Linguagem de Manipulação de Dados

d2) consulta de dados | SELECT LIMIT

Page 59: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

e) consulta de dados | COUNTPor vezes há a necessidade de contar registos. Nesses casos utiliza-se a função COUNT.

Exemplo:

SELECT count ( * ) FROM cds;

Page 60: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

f) consulta de dados | GROUP BYPodemos agrupar dados utilizando a cláusula GROUP BY que permite unir numa única linha todas as linhas selecionadas que possuem os mesmos valores.

Exemplo: aqui vão ser agrupados os registos cujo intérprete se repita

SELECT interpret , count ( interpret ) FROM cds GROUP BY interpret;

Page 61: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

g) consulta de dados | DISTINCTPor vezes há necessidade de ignorar registos com valores duplicados. Nesses casos podemos utilizar a função DISTINCT.

SELECT DISTINCT nomeCampo FROM nomeTabela;

Page 62: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

h) consulta de dados | FUNCTIONSOs SGBDs actuais suportam diversas funções de cálculo estatístico simples como:

Ex. de utilização:

SELECT SUM (Amount) AS SumOfAmount COUNT (Amount) AS CountOfAmount AVG (Amount) AS AvgOfAmount MIN (Amount) AS MinOfAmount MAX (Amount) AS MaxOfAmount FROM SALES;

Resultado do exemplo apresentado:

Page 63: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

actualização de dados | UPDATE

Page 64: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

i) actualização de dados | UPDATEO comando UPDATE serve então para efectuar uma actualização a um registo e pode ser realizado sem a cláusula WHERE.

No entanto, é a cláusula WHERE que vai definir exactamente qual/quais é/serão os registos a serem ACTUALIZADOS. Caso seja omitido, TODOS OS REGISTOS SERÃO ACTUALIZADOS POR IGUAL!!

Sintaxe de utilização:

UPDATE nomeTabela SET nomeColuna1=valor1 [, nomeColuna2=valor2 ...][WHERE condição];

Page 65: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

i) actualização de dados | UPDATEExemplo:

Vamos alterar o nome do intérprete Groove Armada por Groovy em todos os registos da tabela CDs.

UPDATE cds SET interpret = ' Groovy ' WHERE interpret = ' Groove Armada ' ;

Page 66: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

i) actualização de dados | UPDATEOutros exemplos:

UPDATE student SET address = ' welling street ' WHERE name = ' jack ' ;ouUPDATE student SET marks=marks+2 WHERE name = ' david ' ;

E se a actualização for em duas ou mais tabelas em simultâneo?

UPDATE tabela1, tabela2 , ...SET

tabela1.Quantity = tabela1.Quantity + 1 , tabela2.InStock = tabela2.InStock - 1

WHERE tabela1.BookID = tabela2.BookID AND tabela1.OrderID = 1002 ;

Page 67: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

Page 68: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

eliminação de dados | DELETE

Page 69: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

j) eliminação de dados | DELETEO comando DELETE serve então para apagar registos das tabelas e pode ser utilizado sem o WHERE. No entanto, neste caso, todas as linhas da tabela indicada serão excluídas!! Portanto, vamos utilizar o WHERE quando desejamos eliminar os registros que obedeçam a uma certa condição.

Sintaxe de utilização:

DELETE FROM nomeTabela[WHERE condição];[LIMIT numeroLinhas]

Exemplo 1)DELETE FROM Clientes;

Neste exemplo 1) seriam eliminados TODOS os registros da tabela Clientes na medida em que não foi especificado nenhum critério (WHERE).

Exemplo 2)DELETE FROM student WHERE name = ' michael ' LIMIT 10 ;

Já no exemplo 2, serão apagados no máximo 10 registos cujo name tenha o valor michael

Page 70: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

Page 71: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

operadores lógicos

Page 72: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

k) operadores lógicosUma vez que estamos a utilizar o SGBD MySQL nas aulas, o MySQL suporta os seguintes operadores lógicos:

AND ( && )

OR ( || )

NOT ( ! )

Page 73: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

k) operadores lógicos | AND (&&)The logical AND (&&) operator indicates whether the both operands are true. Lets see a statement using AND operator.

Sintaxe de utilização:

SELECT studid, name FROM student WHERE marks > 80 AND marks < 100 ;

ou

SELECT studid, name FROM student WHERE marks > 80 && marks < 100 ;

Page 74: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

k) operadores lógicos | OR ( | | )The logical OR ( | | ) operator indicates whether the both operands are true. Lets see a statement using AND operator.

Exemplo de utilização:

SELECT name, marks, address FROM student WHERE name like ' a% ' OR name like ' s% ' ;

ou

SELECT name, marks, address FROM student WHERE name like ' a% ' | | name like ' s% ' ;

Page 75: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

k) operadores lógicos | NOT ( ! )The logical NOT ( ! ) operator have only one operand and it returns the inverse of the value.

Exemplo de utilização:

SELECT * FROM cds WHERE jahr != 1999;ouSELECT * FROM cds WHERE NOT ( jahr = 1999 );ouSELECT * FROM cds WHERE ! ( jahr = 1999 );

Page 76: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

Page 77: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

consultas com JUNÇÕES DE TABELAS

Page 78: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

l) consultas c/ junção tabelas

INNER JOIN

Page 79: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

Caso exista uma relação entre as duas tabelas (1-1, 1-N), podemos fazer a consulta cujo resultado mostra APENAS registos de ambas as tabelas que estejam unidos por uma chave (chave primária e chave estrangeira).

Exemplo de aplicação com as tabelas CARROS e EMPREGADOS, onde cada empregado (tabela EMPREGADOS) pode ter associado um carro (da tabela CARROS) via campo chave idCarro

3. DML - Linguagem de Manipulação de Dados

l) consultas c/ junção tabelas | INNER JOIN

Page 80: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

l) consultas c/ junção tabelas | INNER JOIN

SELECT EMPREGADOS.nomeEmpregado, EMPREGADOS.funcao, CARROS.fabricante, CARROS.modeloFROM CARROS INNER JOIN EMPREGADOSON CARROS.idCarro = EMPREGADOS.idCarro ;

Page 81: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

l) consultas c/ junção tabelas | INNER JOIN

Page 82: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

l) consultas c/ junção tabelas

LEFT JOIN

Page 83: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

l) consultas c/ junção tabelas | LEFT JOINNeste caso, com o LEFT JOIN são obtidos TODOS os carros, porque a primeira tabela referenciada no JOIN (LEFT) é a tabela CARROS, e os registos que existirem relacionados com esses carros na tabela de EMPREGADOS.

Para os carros que estão atribuídos a um empregado, a respectiva informação é incluída na tabela. Os carros que não estão atribuidos, os campos nomeEmpregado e funcao aparecem vazios (NULL)

SELECT EMPREGADOS.nomeEmpregado, EMPREGADOS.funcao, CARROS.fabricante, CARROS.modeloFROM CARROS LEFT JOIN EMPREGADOSON CARROS.idCarro = EMPREGADOS.idCarro ;

Page 84: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

l) consultas c/ junção tabelas | LEFT JOIN

Page 85: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

l) consultas c/ junção tabelas

RIGHT JOIN

Page 86: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

l) consultas c/ junção tabelas | RIGHT JOINNeste caso, com o RIGHT JOIN são obtidos TODOS os empregados, porque a segunda tabela referenciada no JOIN (RIGHT) é a tabela EMPREGADOS.

Para os funcionários a que está atribuído um carro, a respectiva informação é incluída na tabela. Naqueles funcionários que têm o campo CarNo na tabela EMPLOYEES, os campos Make e Model aparecem por consequência vazios...

SELECT EMPREGADOS.nomeEmpregado, EMPREGADOS.funcao, CARROS.fabricante, CARROS.modeloFROM CARROS RIGHT JOIN EMPREGADOSON CARROS.idCarro = EMPREGADOS.idCarro ;

Page 87: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

l) consultas c/ junção tabelas | RIGHT JOIN

Page 88: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

Page 89: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

transacções

Page 90: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

n) transacções | conceitoUma transacção num SGBD é uma sequência de instruções que deverá ser lida como uma instrução indivisível. Todo o trabalho realizado pelas várias instruções deverá ser completado ou então não poderá ser feito, mas nunca deverá ficar uma parte feita e outra não. (definição e exemplo em http://www.php-pt.com/index.php?

option=com_content&task=view&id=65&Itemid=28)

Sintaxe:START TRANSACTION ;instrucções de SQL ;[ ROLLBACK ; ]COMMIT ;

Ex. Imaginemos uma transferência de 1000€ da bancária da conta 2 para a conta 1

START TRANSACTION;UPDATE contas SET saldo = saldo – 1000 WHERE numero_conta = 2;UPDATE contas SET saldo = saldo + 1000 WHERE numero_conta = 1;

Caso algo corresse mal, poderíamos anular esta transacçãoROLLBACK;Caso tudo tivesse corrido bem:COMMIT;

Page 91: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

Page 92: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

integridade referencial

Page 93: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

m) integridade referencial | conceitosNo MySQL também é possível propagar a integridade referencial entre os registos de tabelas relacionadas entre si.

Essa propagação pode acontecer em dois momentos diferentes:

Quando acontece uma ACTUALIZAÇÃO do valor de uma chave primária (PRIMARY KEY);

Quando há uma ELIMINAÇÃO de um registo com um campo cuja chave primária está envolvida em relações noutras tabelas (como chave estrangeira - FOREIGN KEY).

Page 94: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

m) integridade referencial | conceitosQuando o valor de um campo que é chave primária (primary key) for alterado ou o registo em si for simplesmente apagado e essa chave deixar de existir, o SGBD poderá providenciar uma destas cinco medidas que recairão sobre todos os registos que contenham a chave primária sob a qual está a recair a operação de modificação/eliminação como chave estrangeira - foreign key:

1. RESTRICT

2. CASCADE

3. SET NULL

4. NO ACTIONPre50505050

Page 95: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

m) integridade referencial | RESTRICT1. RESTRICT

Enquanto houver registos na base de dados cuja chave estrangeira é a chave primária da tabela sobre a qual está a recair a operação de actualização / eliminação, a dita operação será sempre abortada. Assim, esta medida obriga a que todas as ocorrências dessa chave sejam apagadas primeiro.

Exemplo:

Se tentarmos apagar o produto Cadeira da tabela PRODUTOS, uma vez quehá registos na tabela ENCOM_PROD com ID_Produto igual a 1, o SGBD nãoserá deixará alterar o ID_Produto de 1 para outro número nem permitirá que o produto Cadeira (com o ID_Produto 1) seja apagado da tabelaPRODUTOS!

Pre50505050

Page 96: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

m) integridade referencial | CASCADE2. CASCADE

Como o nome indica, aqui a propagação é efectuada em CASCATA. Assim, esta medida obriga a que o SGBD efectue a actualização do novo valor da chave em todos os registos relacionados ou efectue a eliminação de todas as ocorrências que tenham referência a essa chave.

Exemplo:

Se tentarmos apagar o produto Cadeira da tabela PRODUTOS, uma vez quehá registos na tabela ENCOM_PROD com ID_Produto igual a 1, o SGBD iráapagar todos os registos da tabelaENCOM_PROD que tenham como ID_

Produto o número 1. Caso contrário, ficariam encomendas comreferência a um produto que já não existia... (órfão!)

Em caso de uma actualização do valor ID_Produto da Cadeira da tabela PRODUTOS (de 1 para 100 por exemplo), TODOS os registos da tabela ENCOM_PROD onde actualmente têm ID_PRoduto igual a 1, seriam actualizados pelo SGBD para 100.

Pre5050505044

44

Page 97: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

m) integridade referencial | SET NULL3. SET NULL

Neste caso, o SGBD deixa que os valores dos campos chave sejam modificados ou mesmo eliminados.

No entanto, o valor das chaves que fazem referência a este campo terão o seu valor actualizado para NULL. Útil pois posteriormente podemos fazer uma consulta e averiguar que registos têm referências a chaves que já não existem (contêm valor NULL) e poderão depois ser tratados da forma que se achar conveniente - SELECT * FROM nomeTabelaRelacionada WHERE nomeCampoChaveEstrangeira is NULL;

Pre50505050

NULL

NULL

NULL

Page 98: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

m) integridade referencial | NO ACTION4. NO ACTION

Neste caso, o SGBD “fecha os olhos” ao erro grave de quebra de integridade que está a acontecer... não acontece nada aos registos que têm referência a esta chave que acabou de ser alterada ou apagada.

Esta situação será de eviar na medida em que haverá registos que vão ficar orfãos! Senão vejamos: Se apagarmos o PRODUTO com ID_Produto 2 da tabela PRODUTOS ( mesa de sala ), vai continuar a haver registos referentes a esse produto perdidos e sem “pai” na tabela ENCOM_PROD!

Pre50505050Qual é o nome do produto

com ID_Produto = 2?!Não existe nenhum produto com

ID_Produto = 2...

Page 99: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

m) integridade referencial | SET DEFAULT4. SET DEFAULT

Ainda não suportado pelo SGBD MySQL!!

Na prática acontece quase o mesmo do que na opção SET NULL mas em vez dos valores da chave estrangeira ficarem vazios (NULL) ficarão com o seu valor predefinido (DEFAULT).

Page 100: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

m) integridade referencial | revisão fkA chave estrangeira (foreign key) é uma cláusula que deve ser incluída quando possuímos duas tabelas relacionadas numa base de dados.

Através da chave estrangeira estabelecemos as relações entre duas ou mais tabelas.

A chave estrangeira desta forma referencía o campo que é chave primária na tabeça relacionada.

CREATE TABLE student (studID INT PRIMARY KEY ,name VARCHAR(30) ,address VARCHAR(40) ,

FOREIGN KEY ( campoChaveEstrangeira ) REFERENCES Nome_outraTabela ( Nome_da_Chave )

) ENGINE = InnoDB ;

Page 101: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

m) integridade referencial | revisão fkImplementando a chave estrangeira através do método de CONSTRAINT:

CREATE TABLE student (studID INT PRIMARY KEY ,name VARCHAR(30) ,address VARCHAR(40) ,class INT ,

CONSTRAINT fk_nomeConstricao FOREIGN KEY ( CampoChaveEstrangeira ) REFERENCES Nome_outraTabela ( Nome_da_Chave )

) ENGINE = InnoDB ;

Page 102: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

3. DML - Linguagem de Manipulação de Dados

m) integridade referencial | implementaçãoNo MySQL também é possível propagar a integridade referencial entre os registos de tabelas relacionadas entre si.

A sintaxe é a seguinte:

[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT }]

[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT }]

Page 103: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

Implementando a propagação da ELIMINAÇÃO ( ON DELETE ) através do método de escrita em linha:

3. DML - Linguagem de Manipulação de Dados

m) integridade referencial | implementação

CREATE TABLE student (studID INT PRIMARY KEY ,name VARCHAR(30) ,address VARCHAR(40) ,

FOREIGN KEY ( campoChaveEstrangeira ) REFERENCES Nome_outraTabela ( Nome_da_Chave )[ ON DELETE { RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT } ]

[ ON UPDATE { RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT } ]

) ENGINE = InnoDB ;

Page 104: Linguagem SQL (com MySQL)

Marco Pinheiro | [email protected] Secundária de Adolfo Portela

Implementando a propagação da ELIMINAÇÃO ( ON DELETE ) através do método de CONSTRAINT:

CREATE TABLE student (studID INT PRIMARY KEY ,name VARCHAR(30) ,address VARCHAR(40) ,class INT ,

CONSTRAINT fk_nomeConstricao FOREIGN KEY ( CampoChaveEstrangeira ) REFERENCES Nome_outraTabela ( Nome_da_Chave )

[ ON DELETE { RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT } ]

[ ON UPDATE { RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT } ]

) ENGINE = InnoDB ;

3. DML - Linguagem de Manipulação de Dados

m) integridade referencial | implementação