introdução a sql - dcc.fc.up.pt

62
Bases de Dados (CC2005) Departamento de Ciência de Computadores Faculdade de Ciências da Universidade do Porto Eduardo R. B. Marques — DCC/FCUP Introdução a SQL

Upload: others

Post on 18-Jul-2022

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Introdução a SQL - dcc.fc.up.pt

Bases de Dados (CC2005) Departamento de Ciência de Computadores

Faculdade de Ciências da Universidade do Porto

Eduardo R. B. Marques — DCC/FCUP

Introdução a SQL

Page 2: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

A SQL (Structured Query Language) é uma linguagem declarativa que permite definir e manipular bases de dados. É a linguagem standard para SGBDs baseados no modelo relacional. A SQL é uma DDL (“Data Definition Language”) porque permite definir a estrutura da BD — o esquema. A SQL é uma DML (“Data Manipulation Language”) porque permite manipular o conteúdo da BD — os dados que instanciam um esquema.

SQL

2

Page 3: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL 3

BD exemplo

Page 4: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

Variante da rede social “Livro das Caras” que vimos nas aulas práticas. U t i l i z a d o r e s , “ p o s t s ” , comentários têm todos um identi f icador numérico único. Código SQL disponível aqui para uma pequena instância com:

11 utilizadores 28 relações de seguimento entre utilizadores 12 “posts” 18 “hashtags” aplicadas a “posts” 15 “likes” 6 comentários a “posts”

4

USER

Num

Login

Joined

Name

BirthDate

Sex

Phone?

Email

POST

Num

Author

Creation

ContentHASHTAG

Post

Tag

COMMENT

Num

Post

Author

Creation

Content

POST_LIKED

User

Post

FOLLOWER

User

Follower

Page 5: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL 5

Criação de tabelas

Page 6: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

Criação de uma tabela em SQL

6

CREATETABLE<NOMEDATABELA>(<NOMEATRIBUTO1><TIPO1><RESTRIÇÕESDEDOMINIO1>,…,<NOMEATRIBUTON><TIPON><RESTRIÇÕESDEDOMINION>…PRIMARYKEY(<ATRIBUTOSQUEFORMAMCHAVEPRIMÁRIA>),…UNIQUE(<ATRIBUTOSQUEFORMAMUMACHAVE(SECUNDÁRIA)>),…FOREIGNKEY(<ATRIBUTOSQUEFORMAMUMACHAVEEXTERNA>)REFERENCES<NOME_DE_OUTRA_TABELA1>(<CHAVE_PRIMÁRIA>)…);

Page 7: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

Chave primária: Login.Tabela não tem chaves externas. Atributos não-opcionais indicados comNOTNULL(todos excepto EMAIL). NOTNULL não precisa de ser especificado para uma chave primária (não são admitidos valores NULL).

Tabela USER (primeira formulação)

7

CREATETABLEUSER(LoginPRIMARYKEYVARCHAR(16),JoinedDATENOTNULL,NameVARCHAR(128)NOTNULL,BirthDateDATENOTNULL,SexENUM('M','F')NOTNULL,PhoneINTDEFAULTNULL,EmailVARCHAR(64)NOTNULL);

USER

Login

Joined

Name

BirthDate

Sex

Phone?

Email

Page 8: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

Referência: MySQLReferenceManual-DataTypes

Tipos principais para campos (MySQL)

8

Números Inteiros

TINYINT(1byte),SMALLINT(2)MEDIUMINT(3),INT(4),

BIGINT(8)

Números de vírgula flutuante

DECIMAL,NUMERIC,FLOAT,DOUBLE

Sequências de caracteres

CHAR,VARCHAR,ENUM,TEXT/MEDIUMTEXT/LONGTEXT

Tempo DATE,DATETIME,TIME,TIMESTAMP,YEAR

Page 9: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

Chave primária: Num

Chave secundária (por via de UNIQUE): Login

Tabela USER — reformulação

9

CREATETABLEUSER(NumINTPRIMARYKEYAUTO_INCREMENT,LoginVARCHAR(16)UNIQUENOTNULL,JoinedDATENOTNULL,NameVARCHAR(128)NOTNULL,BirthDateDATENOTNULL,SexENUM('M','F')NOTNULL,PhoneINTDEFAULTNULL,EmailVARCHAR(64)NOTNULL);

USER

Num

Login

Joined

Name

BirthDate

Sex

Phone?

Email

Page 10: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

O uso de AUTO_INCREMENT permite que o valor de um chave primária tenha um valor sequência associado que é automaticamente incrementado em cada inserção (como veremos depois). É uma solução muitas vezes conveniente, pois facilita referências entre tabelas via chaves externas usando campos que ocupam pouco espaço.

Uso de AUTO_INCREMENT

10

CREATETABLEUSER(NumINTPRIMARYKEYAUTO_INCREMENT,LoginUNIQUEVARCHAR(16)NOTNULL,JoinedDATENOTNULL,NameVARCHAR(128)NOTNULL,BirthDateDATENOTNULL,SexENUM('M','F')NOTNULL,PhoneINTDEFAULTNULL,EmailVARCHAR(64)NOTNULL);

USER

Num

Login

Joined

Name

BirthDate

Sex

Phone?

Email

Page 11: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

Chaves externas — exemplo

11

CREATETABLEPOST(NumINTPRIMARYKEYAUTO_INCREMENT,AuthorINTNOTNULL,CreationDATETIMENOTNULL,ContentTEXTNOTNULL,FOREIGNKEY(Author)REFERENCESUSER(Num));

POST

Num

Author

Creation

Content

USER

Num

Page 12: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

Chaves externas — outro exemplo

12

CREATETABLEPOST_LIKED(UserINTNOTNULL,PostINTNOTNULL,PRIMARYKEY(User,Post),FOREIGNKEY(User)REFERENCESUSER(Num),FOREIGNKEY(Post)REFERENCESPOST(Num));

POST

Num

USER

Num

POST_LIKED

User

Post

Page 13: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

DROPTABLEremove do esquema da BD uma ou mais tabelas. A tabelas deixa de existir no esquema da BD. … e por inerência os dados associados às tabelas são removidos.

Nota: a cláusula IF EXISTS verifica previamente se as tabelas existem para evitar erros. Analogamente CREATE TABLE suporta a cláusula simétrica IFNOTEXISTS.

A instrução DROPTABLE

13

DROPTABLEIFEXISTSPOST_LIKED,COMMENT,HASHTAG,POST,FOLLOWER,USER;

Page 14: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

Para uma BD já criada empregamos a instrução USE para indicar qual a BD activa para execução de comandos.

CREATEDATABASE/USE/DROPDATABASE

14

CREATEDATABASE[IFNOTEXISTS]SOCIAL_NETWORK;

Deve ser executada para criar uma nova base de dados (sinónimo: CREATESCHEMA) com o nome de dado. Sobre a BD poderemos criar tabelas, inserir dados, etc. Nota: nos PCs dos laboratórios do DCC não podemos criar BDs novas, por questões de configuração estamos limitados ao uso da BD existente guest.

USESOCIAL_NETWORK;

DROPDATABASE[IFEXISTS]SOCIAL_NETWORK;

Remove uma BD por inteiro (tabelas e dados) de forma incondicional!

Page 15: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL 15

Tipos de dados em mais detalhe

Page 16: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

MySQL Reference Manual (11.2.1) O modificador UNSIGNED restringe o domínio a valores não negativos (>= 0), ex. INTUNSIGNED.BOOL/BOOLEANsão implementados comoTINYINTem MySQL (TRUE=1,FALSE=0). INTEGERé sinónimo de INT.

Tipos inteiros — modificador UNSIGNED

16

Page 17: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

FLOATNúmeros reais representáveis em 32 bits com precisão arbitrária

DOUBLENúmeros reais representáveis em 64 bits com precisão arbitrária

DECIMAL(D,P)Números reais representáveis na escala de D dígitos decimais com precisão deP dígitos Exemplo — valores correspondentes a DECIMAL(3,2) podem ser: 100.23-2.352.1-999.99 … mas não 12341.234-1234.567

Tipos de vírgula flutuante

17

Page 18: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

CHAR(N)Sequência de caracteres de tamanho fixo N, onde N <= 255 (28-1). Para um valor de tamanho L <= N , a BD armazena sempre Ncaracteres usando o caracter para “padding” à direita.

VARCHAR(N)Sequência de caracteres de tamanho variável até N caracteres, onde N<=65535(216-1). Para um valor de tamanho L<=N , a BD só armazena Lcaracteres.

ENUM(‘VALOR1’,…,‘VALORN’)Tipo enumerado (como exemplificado para USER.Sex)

TEXT/MEDIUMTEXT/LONGTEXTTexto de comprimento variável até 64 KB / 16 MB / 4GB

Sequências de caracteres

18

Page 19: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

YEARAno

DATERepresentação de datas com a forma YYYY-MM-DD

TIMERepresentação de horas com a forma [H]HH:MM:SS

DATETIME,TIMESTAMPRepresentação de data e hora. Valores com a forma YYYY-MM-DD [H]HH:MM:SS[.dddddd] 6 dígitos de precisão (até micro-segundos)

TIMESTAMP guardado na BD com conversão para “UTC time”

Tipos de dados temporais

19

Page 20: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL 20

Manipulação de registos

Formas básicas das instruções INSERT, SELECT, UPDATE, e DELETE

Page 21: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

INSERTInserção de registos

SELECTConsulta (leitura) de registos (não altera BD)

UPDATEActualização de registos já existentes

DELETERemoção de registos

Instruções essenciais de manipulação de dados

21

Page 22: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

É identificado o nome da tabela e os atributos a definir na inserção, seguido dos valores para um conjunto de registos.

Inserção de registos — forma básica

22

INSERTINTO<NOMEDATABELA>(<ATRIBUTO1>,….,<ATRIBUTON>)VALUES(<VALOR1.1>,….,<VALOR1.N>),(<VALOR1.2>,….,<VALOR2.N>),…,(<VALORK.2>,….,<VALORK.N>);

Page 23: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

Números de utilizadores (campo Num) gerados automaticamente. Valor de nº de telefone (Phone) usa valor configurado pela cláusula DEFAULT (no caso NULL).

Exemplo de inserção de registos

23

INSERTINTOUSER(Login,Joined,Name,BirthDate,Sex,Email)VALUES('batman','2019-12-16','BruceWayne','1939-01-01','M','[email protected]'),('catwoman','2019-12-16','SelinaKyle','1940-01-01','F','[email protected]'),('ziggy','2019-12-31','ZiggyStardust','1972-01-01','M','[email protected]'),('lady.z','2020-01-01','LadyStardust','1972-01-01','F','[email protected]');

Page 24: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

Permite a consulta (“query”) dos valores atributos da tabela indicada sob determinada condição de selecção, definida pelo que chama a cláusula WHERE. A “wildcard” * para os atributos define implicitamente todos os atributos.Na ausência da cláusula WHERE os valores são devolvidos para todos os registos da tabela. Vários operadores de seleção podem ser aplicados na cláusula WHERE. Damos a seguir apenas alguns exemplos simples.

Consulta de registos — forma básica

24

SELECT<ATRIBUTO1>,….,<ATRIBUTON>FROM<NOMEDATABELA>WHERE<CONDIÇÃO>;

Page 25: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

Exemplos de consultas

25

/*Consultatodososatributosdetodososutilizadores.*/SELECT*FROMUSER;+-----+------------+------------+----------------+------------+-----+-----------+------------------------------+ | Num | Login | Joined | Name | BirthDate | Sex | Phone | Email | +-----+------------+------------+----------------+------------+-----+-----------+------------------------------+ | 1 | joao.pinto | 2019-12-01 | João Pinto | 1976-12-19 | M | NULL | [email protected] | | 2 | semedo | 2019-12-02 | Carlos Semedo | 1985-06-02 | M | 223774327 | [email protected] | | 3 | maria | 2019-12-02 | Maria Silva | 2005-11-17 | F | 939939939 | [email protected] | | 4 | pedro | 2019-12-10 | Pedro Costa | 1982-01-03 | M | NULL | [email protected] | | 5 | mendocas | 2019-12-11 | Filipa Mendes | 2002-05-03 | F | NULL | [email protected] | | 6 | eva | 2019-12-15 | Eva Mendes | 1975-11-18 | F | NULL | [email protected] | | 7 | pedro2 | 2019-12-16 | Pedro Simões | 1993-02-22 | M | 213884445 | [email protected] | | 8 | batman | 2019-12-16 | Bruce Wayne | 1939-01-01 | M | NULL | [email protected] | | 9 | catwoman | 2019-12-16 | Selina Kyle | 1940-01-01 | F | NULL | [email protected] | | 10 | ziggy | 2019-12-31 | Ziggy Stardust | 1972-01-01 | M | NULL | [email protected] | | 11 | lady.z | 2020-01-01 | Lady Stardust | 1972-01-01 | F | NULL | [email protected] | +-----+------------+------------+----------------+------------+-----+-----------+------------------------------+

/*Consultaloginenomedeutilizadoresdosexomasculino.*/SELECTLogin,NameFROMUSERWHERESEX='M';

+------------+----------------+ | Login | Name | +------------+----------------+ | joao.pinto | João Pinto | | semedo | Carlos Semedo | | pedro | Pedro Costa | | pedro2 | Pedro Simões | | batman | Bruce Wayne | | ziggy | Ziggy Stardust | +------------+----------------+

Page 26: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

Permite a actualização dos valores de um sub-conjunto de atributos para registos que verificam determinada condição. Na ausência da cláusula WHERE todos os registos são considerados para actualização.

Actualização de registos — forma básica

26

UPDATE<NOMEDATABELA>SET<ATRIBUTO1>=<VALOR1>,…<ATRIBUTOK>=<VALORK>WHERE<CONDIÇÃO>;

Page 27: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

Exemplos de actualizações

27

/*Actualizatelefoneeemailparautilizadorcomlogin'batman'.*/UPDATEUSERSETPhone=238488532,Email='[email protected]'WHERELogin='batman';

/*ActualizatodososnúmerosdetelefonecomNULL.*/UPDATEUSERSETPhone=NULL;

/*Actualizahoradecriaçãoparatodosospostscomnúmeroinferiora5feitosem2019*/UPDATEPOSTSETCreation='2020-01-0100:00:00'WHERENum<5ANDYear(Creation)=2019;

Page 28: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

Permite a remoção de registos de uma tabela indicada que verifiquem determinada condição. Na ausência da cláusula WHERE todos os registos são considerados para remoção.

Remoção de registos — forma básica

28

DELETEFROM<NOMEDATABELA>WHERE<CONDIÇÃO>;

Page 29: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

Exemplos de remoções

29

/*Removeseguidoresdoutilizador1*/DELETEFROMFOLLOWERWHEREUser=1;

/*RemovetodososregistosdatabelaFOLLOWER*/DELETEFROMFOLLOWER;

/*Removeregistoparaseguimentodoutilizador1peloutilizador2*/DELETEFROMFOLLOWERWHEREUser=1ANDFollower=2;

Page 30: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL 30

Funções e operadores

Page 31: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

Em SQL estão definidas funções e operadores que podemos usar em associação às instruções em SQL.

Os principais operadores/funções permitem Operações tradicionais como as de índole aritméticas, relacional ou lógica Outras operações específicas sobre tipos de dados como sequências de caracteres ou dados temporais

Referência para MySQL: MySQL Reference Manual - Functions and Operators

Funções e operadores

31

Page 32: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

Alguns dos principais operadores

32

Operadores aritméticos

+-*/%(osusuais)

Operadores relacionais

=(igualdade)<>(desigualdade)

<<=>>=ISNULL

ISNOTNULL

Operadores lógicos

AND/&&OR/||NOT/!

Page 33: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

NOW()Devolve a data e tempo actual (DATETIME)

YEAR(x)MONTH(x)DAY(x)Devolvem o ano, mês, ou dia de um valor DATE ou DATETIME

HOUR(x)MINUTE(x),SECOND(x)Análogo para horas, minutos e segundos para um valor DATETIME ou TIME

TIMESTAMPDIFF(ESCALA,A,B)Calcula diferença entre B e A em determinada escala (ESCALA=YEAR|MONTH|DAY|HOUR|MINUTE|SECOND|…)

Algumas funções sobre datas

33

Page 34: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

LENGTH(S)Devolve tamanho de S

CONCAT(S1,S2,…)Devolve concatenação de strings S1,S2,…

REPLACE(S,A,B)Obtém resultado de substituir A por B em S

REVERSE(S)Obtém S invertida.

S[NOT]LIKE<EXPREGULAR>VerificaS face a expressão regular SQL. _ : um qualquer caracter; %: qualquer sequência de 0 ou mais caracteres

Exemplos de operações sobre strings

34

Page 35: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL 35

Modificadores de consultas ORDERBY, LIMIT, e DISTINCT

Page 36: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

ORDER BY - especifica critério(s) de ordenação para resultados devolvidos por uma consulta.

ASC: ordem ascendente (valor por omissão). DESC: ordem ascendente.

UsodeORDERBY

36

SELECT<Atributos>FROM<TABELA>…ORDERBY<CriterioOrd.1>[ASC|DESC],...,<CriterioOrd.k>[ASC|DESC]

Page 37: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

Uso de ORDERBY- exemplos

37

/*Semcritériodeordenação.*/SELECTLogin,BirthDateFROMUSER;

/*Ordenaporlogin.*/SELECTLogin,BirthDateFROMUSERORDERBYLogin;

| semedo | 1985-06-02 | | maria | 2005-11-17 | | pedro | 1982-01-03 | | mendocas | 2002-05-03 | | eva | 1975-11-18 | | pedro2 | 1993-02-22 | | batman | 1939-01-01 | | catwoman | 1940-01-01 | | ziggy | 1972-01-01 | | lady.z | 1972-01-01 || batman | 1939-01-01 |

| catwoman | 1940-01-01 | | eva | 1975-11-18 | | lady.z | 1972-01-01 | | maria | 2005-11-17 | | mendocas | 2002-05-03 | | pedro | 1982-01-03 | | pedro2 | 1993-02-22 | | semedo | 1985-06-02 | | ziggy | 1972-01-01 |

/*OrdenaporBirthDatedeformadecrescente*/SELECTLogin,BirthDateFROMUSERORDERBYBirthDateDESC;

| maria | 2005-11-17 | | mendocas | 2002-05-03 | | pedro2 | 1993-02-22 | | semedo | 1985-06-02 | | pedro | 1982-01-03 | | eva | 1975-11-18 | | ziggy | 1972-01-01 | | lady.z | 1972-01-01 | | catwoman | 1940-01-01 | | batman | 1939-01-01 |

Page 38: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

ORDERBY— exemplos (cont.)

38

| batman | 1939-01-01 | | catwoman | 1940-01-01 | | lady.z | 1972-01-01 | | ziggy | 1972-01-01 | | pedro | 1982-01-03 | | pedro2 | 1993-02-22 | | mendocas | 2002-05-03 | | semedo | 1985-06-02 | | maria | 2005-11-17 | | eva | 1975-11-18 |

/*Ordenapordiadeaniversário:(mês,diadeBirthDate),depoisanodeBirthDateefinalmenteLogin.*/SELECTLogin,BirthDateFROMUSERORDERBYMONTH(BirthDate),DAY(BirthDate),YEAR(BirthDate),Login;

Page 39: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

LIMIT n : limita número de resultados devolvidos por uma consulta a nUso frequente em conjunção com ORDERBYpara obter os primeirosnregistos pelo critério de ordenação.

UsodeLIMIT

39

SELECT…FROM…[WHERE…][ORDERBY….]LIMITn;

Page 40: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

UsodeLIMIT— exemplos

40

SELECTLogin,BirthDateFROMUSERLIMIT5;

| semedo | 1985-06-02 | | maria | 2005-11-17 | | pedro | 1982-01-03 | | mendocas | 2002-05-03 | | eva | 1975-11-18 |

SELECTLogin,BirthDateFROMUSERORDERBYBirthDateDESCLIMIT5;

| maria | 2005-11-17 | | mendocas | 2002-05-03 | | pedro2 | 1993-02-22 | | semedo | 1985-06-02 | | pedro | 1982-01-03 |

/*DadosdoúltimoPOST*/SELECTCreation,ContentFROMPOSTORDERBYCreationDESCLIMIT1;+---------------------+------------------------------------------------------------+ | Creation | Content | +---------------------+------------------------------------------------------------+ | 2020-02-18 17:00:30 | Joker is a busy man, he has no time for social networking. | +---------------------+------------------------------------------------------------+

Page 41: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

DISTINCT: filtra dados duplicados nos resultados devolvidos por uma consulta:

UsodeDISTINCT

41

SELECTDISTINCT<Campo1>,...,<Campon>FROM……

Page 42: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

Uso de DISTINCT — exemplos

42

/*Obtémtodososautoresqueescreveramalgumpost.*/SELECTDISTINCTAuthorFROMPOSTORDERBYAuthor;

| 2 | | 8 | | 9 | | 10 |

/*Obtémtodososutilizadoresquetêmalgumseguidorporordemdecrescente.*/SELECTDISTINCTUserFROMFOLLOWERORDERBYUserDESC;

| 11 | | 10 | | 9 | | 8 | | 7 | | 5 | | 4 | | 3 | | 2 |

Page 43: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL 43

Preservação / violação de restrições de integridade

Page 44: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

Vamos a seguir ver exemplos práticos de violação de cada um dos tipos de restrições de integridade. Relembremos (dos “slides” de “O Modelo Relacional”)

Integridade de domínio: o valor de um atributo faz parte do domínio do atributo.Integridade de entidade: o valor da chave primária não pode ser NULL(sob pena de não conseguirmos identificar registos). É um caso especial de integridade de domínio.Integridade de chave: dois registos da mesma tabela não podem ter valores iguais para uma chave, em particular para a chave primária. Integridade referencial: um valor definido (≠NULL) para um atributo que seja chave externa deve referir-se a uma chave primária da tabela a que a chave externa se refere.

… e ainda falar sobre algum suporte para manutenção de integridade referencial em SQL em complemento à definição de chaves primárias e externas — cláusulas ONUPDATE e ONDELETEpara chaves externas.

Restrições de integridade

44

Page 45: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

Violação da integridade de domínio

45

INSERTINTOUSER(Login,Joined,Name,BirthDate,Sex,Phone,Email)VALUES('jsilva','2020-03-2000:00:00','JoséSilva','1975-02-30','M',223457500,'[email protected]');

ERROR1292(22007):Incorrectdatevalue:'1975-02-30'forcolumn'BirthDate'atrow1

INSERTINTOUSER(Login,Joined,Name,BirthDate,Sex,Phone,Email)VALUES('jsilva','2020-03-2000:00:00',NULL,'1975-02-28','M',223457500,'[email protected]');

ERROR1048(23000):Column'Name'cannotbenull

INSERTINTOUSER(Login,Joined,Name,BirthDate,Sex,Phone,Email)VALUES('jsilva','2020-03-2000:00:00','JoséSilva','1975-02-28','M','PT-223457500','[email protected]');

ERROR1366(HY000):Incorrectintegervalue:'PT-223457500'forcolumn'Phone'atrow1

/*Definiçãodatabela*/CREATETABLEUSER(NumPRIMARYKEYAUTO_INCREMENT,LoginUNIQUEVARCHAR(16)NOTNULL,JoinedDATENOTNULL,NameVARCHAR(128)NOTNULL,BirthDateDATENOTNULL,SexENUM('M','F')NOTNULL,PhoneINTDEFAULTNULL,EmailVARCHAR(64)NOTNULL);

Page 46: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

Violação da integridade de chave

46

INSERTINTOUSER(Num,Login,Joined,Name,BirthDate,Sex,Phone,Email)VALUES(1,'jsilva','2020-03-2000:00:00','JoséSilva','1975-02-28','M',223457500,'[email protected]');

ERROR1062(23000):Duplicateentry'1'forkey'PRIMARY'

INSERTINTOUSER(Login,Joined,Name,BirthDate,Sex,Phone,Email)VALUES('batman','2020-03-2000:00:00','JoséBatman','1975-02-28','M',223457500,'[email protected]');

ERROR1062(23000):Duplicateentry'batman'forkey'Login'

UPDATEUSERSETLogin='batman'WHERELogin='joao.pinto';

ERROR1062(23000):Duplicateentry'batman'forkey'Login'

/*Definiçãodatabela*/CREATETABLEUSER(NumPRIMARYKEYAUTO_INCREMENT,LoginUNIQUEVARCHAR(16)NOTNULL,JoinedDATENOTNULL,NameVARCHAR(128)NOTNULL,BirthDateDATENOTNULL,SexENUM('M','F')NOTNULL,PhoneINTDEFAULTNULL,EmailVARCHAR(64)NOTNULL);

Page 47: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

Violação da integridade referencial

47

/*User9999doesnotexist.*/INSERTINTOPOST(Author,Creation,Content)VALUES(9999,NOW(),'HelloWorld!');

ERROR1452(23000):Cannotaddorupdateachildrow:aforeignkeyconstraintfails(`guest`.`post`,CONSTRAINT`post_ibfk_1`FOREIGNKEY(`Author`)REFERENCES`USER`(`Num`))

/*User1existsandistheauthorofsomeposts*/DELETEFROMUSERWHERENum=1;

ERROR1451(23000):Cannotdeleteorupdateaparentrow:aforeignkeyconstraintfails(`guest`.`post`,CONSTRAINT`post_ibfk_1`FOREIGNKEY(`Author`)REFERENCES`USER`(`Num`))

/*Definiçãodatabela*/CREATETABLEPOST(NumINTPRIMARYKEYAUTO_INCREMENT,AuthorINTNOTNULL,CreationDATETIMENOTNULL,ContentTEXTNOTNULL,FOREIGNKEY(Author)REFERENCESUSER(Num));

POST

Num

Author

Creation

Content

USER

Num

Page 48: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

Para chaves externas podemos especificar o que deve acontecer quando a entrada correspondente à chave primária referenciada é actualizada (ON UPDATE) ou apagada (ONDELETE).

Uso de ONUPDATE e ONDELETE — forma geral

48

CREATETABLE<NOMEDATABELA>(…FOREIGNKEY(<ATRIBUTOSQUEFORMAMUMACHAVEEXTERNA>)REFERENCES<NOME_DE_OUTRA_TABELA>(<ATRIBUTOSCHAVE>)[ONUPDATE<AÇÃO>][ONDELETE<ACÇÃO>],…);

Page 49: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

ON DELETE CASCADE: apaga entradas em outras tabelas que referenciem a chave primária do registo apagado. Na BD exemplo esta restrição existe para várias chaves externas references a USER(Num) — e também POST(Num)— como é o caso da tabela COMMENTmas não p/a tabelaPOST.

Uso de ONDELETE CASCADE—exemplo

49

CREATETABLECOMMENT(NumINTPRIMARYKEYAUTO_INCREMENT,PostINTNOTNULL,AuthorINTNOTNULL,…FOREIGNKEY(Post)REFERENCESPOST(Num)ONDELETECASCADE,FOREIGNKEY(Author)REFERENCESUSER(Num)ONDELETECASCADE);

USER

Num

POST

Num

COMMENT

Num

Author

Post

Page 50: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

Aplicando ON DELETE CASCADE à chave externa já conseguimos remover o utilizador 1 (anteriormente a operação falhava) e todos os “posts”, comentários, “likes”, … que se referem ao utilizador 1 (as outras tabelas já estavam configuradas desta forma).

Uso de ONDELETE CASCADE—aplicaçãoaPOST

50

CREATETABLEPOST(NumINTPRIMARYKEYAUTO_INCREMENT,AuthorINTNOTNULL,…FOREIGNKEY(Author)REFERENCESUSER(Num)ONDELETECASCADE);

POST

Num

Author

Creation

Content

USER

Num

mysql>DELETEFROMUSERWHERENum=1;QueryOK,1rowaffected(0.00sec)mysql>SELECT*FROMPOSTWHEREAuthor=1;Emptyset(0.00sec)

Page 51: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

Uso de ONDELETE CASCADE(cont.)

51

mysql> SELECT Num,Post,Author FROM COMMENT ORDER BY Num;+-----+------+--------+| Num | Post | Author |+-----+------+--------+| 1 | 1 | 2 || 2 | 1 | 3 || 3 | 1 | 1 || 4 | 8 | 2 || 5 | 8 | 9 || 6 | 12 | 11 |+-----+------+--------+…mysql> DELETE FROM USER WHERE Num = 1;…mysql> SELECT Num,Post,Author FROM COMMENT ORDER BY Num;+-----+------+--------+| Num | Post | Author |+-----+------+--------+| 4 | 8 | 2 || 5 | 8 | 9 || 6 | 12 | 11 |+-----+------+--------+3 rows in set (0.00 sec)

Comentários ao post nº 1 (numerados de 1 a 3) são todos removidos porque o autor do post nº 1 é também utilizador nº1. Portanto são removidos utilizador nº 1, post nº 1, e todos os comentários relacionados com o utilizador e/ou post em causa.

Page 52: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

ON UPDATE CASCADE: análogo a ON DELETE CASCADE mas para actualizações de uma chave propaga valor da nova chave em chaves externas. Vamos exemplificar a seguir o efeito da mesma.

Uso de ONUPDATE CASCADE

52

CREATETABLEPOST(NumINTPRIMARYKEYAUTO_INCREMENT,AuthorINTNOTNULL,…FOREIGNKEY(Author)REFERENCESUSER(Num)ONDELETECASCADEONUPDATECASCADE);

Page 53: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

Uso de ONUPDATE CASCADE(cont.)

53

mysql> SELECT Num,Post,Author FROM COMMENT ORDER BY Num;+-----+------+--------+| Num | Post | Author |+-----+------+--------+| 1 | 1 | 2 || 2 | 1 | 3 || 3 | 1 | 1 || 4 | 8 | 2 || 5 | 8 | 9 || 6 | 12 | 11 |+-----+------+--------+…mysql> UPDATE USER SET Num = 1001 WHERE Num = 1;…mysql> UPDATE POST SET Num = 9001 WHERE Num = 1;…mysql> SELECT Num,Post,Author FROM COMMENT ORDER BY Num;+-----+------+--------+| Num | Post | Author |+-----+------+--------+| 1 | 9001 | 2 || 2 | 9001 | 3 || 3 | 9001 | 1001 || 4 | 8 | 2 || 5 | 8 | 9 || 6 | 12 | 11 |+-----+------+--------+

Page 54: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

ONUPDATESETNULL/ONDELETESETNULLSubstitui valor da chave externa porNULL.Válido desde que o domínio da chave externa admita o valorNULL.

ONUPDATESETDEFAULT/ONDELETESETDEFAULTSubstitui valor da chave externa por valorDEFAULT.Válido desde que o atributo da chave externa tenha associado um valorDEFAULT.

ON UPDATE RESTRICT / ON DELETE RESTRICT - a definição por omissão!

Operação de actualização / remoção é rejeitada.

Uso de ONUPDATE e ONDELETE — outras opções

54

Page 55: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL 55

Evolução de esquemas — uso de ALTERTABLE —

Page 56: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

Problema geral: O esquema de uma BD tem normalmente necessidade de mudar ao longo do tempo. Por exemplo a nossa “imitação” de rede social poderia “crescer” por forma a termos grupos de utilizadores, tipos de “like”, definições de privacidade, etc. Mudanças ao esquema: não devem levar à perda de dados existentes (a não ser que esse seja o objectivo) ou a perda sua consistência, e idealmente (embora nem sempre possível) sem tornar indisponível o acesso a utilizadores.

Este problema é complexo. Neste contexto damos apenas uma ideia de algumas alterações/evoluções simples de um esquemas usando o comando ALTERTABLE.

Evolução de esquemas

56

Page 57: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

Permite alterar o esquema ou outras propriedades de uma tabela. Entre outros usos, a instrução permite adicionar / modificar remover / rever campos de tabelas. Referência completa → Documentação MySQL

A instrução ALTERTABLE

57

ALTERTABLE<NOMEDATABELA><ACÇÃO><OPÇÕES>;

Forma geral:

Page 58: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

/*AdicionacampoCountryàtabelaUSER,comvalorNULLporomissão.*/ALTERTABLEUSERADDCOLUMNCountryVARCHAR(32)DEFAULTNULL;

/*RemovecampoEmaildatabelaUSER.*/ALTERTABLEUSERDROPCOLUMNEmail;

/*MudatipodocampoName(redefinetamanhomáximode128para256).*/ALTERTABLEUSERMODIFYNameVARCHAR(256)NOTNULL;

1º exemplo — alteração de tablea

58

USER

Num

Login

Joined

Name

BirthDate

Sex

Phone?

Email

Country?

Page 59: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL 59

mysql> desc USER;+-----------+---------------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |+-----------+---------------+------+-----+---------+----------------+| Num | int(11) | NO | PRI | NULL | auto_increment || Login | varchar(16) | NO | UNI | NULL | || Joined | date | NO | | NULL | || Name | varchar(256) | NO | | NULL | || BirthDate | date | NO | | NULL | || Sex | enum('M','F') | NO | | NULL | || Phone | int(11) | YES | | NULL | || Country | varchar(32) | YES | | NULL | |+-----------+---------------+------+-----+---------+----------------+

mysql> desc USER;+-----------+---------------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |+-----------+---------------+------+-----+---------+----------------+| Num | int(11) | NO | PRI | NULL | auto_increment || Login | varchar(16) | NO | UNI | NULL | || Joined | date | NO | | NULL | || Name | varchar(128) | NO | | NULL | || BirthDate | date | NO | | NULL | || Sex | enum('M','F') | NO | | NULL | || Phone | int(11) | YES | | NULL | || Email | varchar(64) | NO | | NULL | |+-----------+---------------+------+-----+---------+----------------+

Page 60: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL 60

mysql> select * FROM USER;+-----+------------+------------+---------------+------------+-----+-----------+---------+| Num | Login | Joined | Name | BirthDate | Sex | Phone | Country |+-----+------------+------------+---------------+------------+-----+-----------+---------+| 1 | joao.pinto | 2019-12-01 | João Pinto | 1976-12-19 | M | NULL | NULL || 2 | semedo | 2019-12-02 | Carlos Semedo | 1985-06-02 | M | 223774327 | NULL || 3 | maria | 2019-12-02 | Maria Silva | 2005-11-17 | F | 939939939 | NULL || 4 | pedro | 2019-12-10 | Pedro Costa | 1982-01-03 | M | NULL | NULL || 5 | mendocas | 2019-12-11 | Filipa Mendes | 2002-05-03 | F | NULL | NULL |… etc …

mysql> select * FROM USER;+-----+------------+------------+---------------+------------+-----+-----------+-------------------------+| Num | Login | Joined | Name | BirthDate | Sex | Phone | Email |+-----+------------+------------+---------------+------------+-----+-----------+-------------------------+| 1 | joao.pinto | 2019-12-01 | João Pinto | 1976-12-19 | M | NULL | [email protected] || 2 | semedo | 2019-12-02 | Carlos Semedo | 1985-06-02 | M | 223774327 | [email protected] || 3 | maria | 2019-12-02 | Maria Silva | 2005-11-17 | F | 939939939 | [email protected] || 4 | pedro | 2019-12-10 | Pedro Costa | 1982-01-03 | M | NULL | [email protected] || 5 | mendocas | 2019-12-11 | Filipa Mendes | 2002-05-03 | F | NULL | [email protected] | … etc …

— Dados não foram perdidos, além dos de email (o que era pretendido). — “Rede social” permite agora a definição do país dos utilizadores quando desejável (NULL por omissão; subentende-se que não vamos assumir a nacionalidade dos utilizadores já existentes.). — Nomes de utilizadores passam a poder ter 256 caracteres.

Page 61: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

2º exemplo: alteração de chaves

61

/*Obrigaaquenºdetelefonesejaúnicoporutilizador.*/ALTERTABLEUSERADDUNIQUE(Phone);

/*Adicionacampoparaautordeuma“hashtag”etorna-oumachaveexternaparaUSER(Num).*/

ALTERTABLEHASHTAGADDCOLUMNAuthorINTDEFAULTNULL;

ALTERTABLEHASHTAGADDFOREIGNKEY(Author)REFERENCESUSER(Num);

USER

Num

POST

Num

HASHTAG

Post

Tag

Author?

Page 62: Introdução a SQL - dcc.fc.up.pt

Bases de Dados Introdução a SQL

3º exemplo — alterações inválidas

62

/*Dadosanterioresnãosãodetipocompatível.*/ALTERTABLEUSERMODIFYCOLUMNNameINTNOTNULL;ERROR1366(HY000):Incorrectintegervalue:'JoãoPinto'forcolumn'Name'atrow1

/*Sópodehaverumachaveprimária.*/ALTERTABLEUSERADDPRIMARYKEY(Login);ERROR1068(42000):Multipleprimarykeydefined

/*Quebraintegridadereferencial*/ALTERTABLEUSERDROPCOLUMN(Num);

ERROR1829(HY000):Cannotdropcolumn'Num':neededinaforeignkeyconstraint'comment_ibfk_2'oftable'guest.comment'