Banco de Dados Maria Augusta (Magu) •1 Create Database CREATE DATABASE PaisProducaoMineral USE PaisProducaoMineral •2 Criando tabelas (1) Informações importantes: 1. Nome da tabela. (*) 2. Nome e tipo dos dados. (*) 3. Chave primária. 4. Chave(s) estrangeira(s). 5. Outras restrições sobre os campos. (*) Informações essenciais. •3 Tipos de Dados no SQL Server (1) Tipos Numéricos Para armazenar inteiros Para armazenar números reais TINYINT [0 a 256] NUMERIC(18,0) SMALLINT [-32.768 a 32.767] DECIMAL(18,0) INT [-2.147.483.648 a 2.147.483.647] FLOAT [-1.79E + 308 a 1.79E + 308] BIGINT [-9.223.372.036.854.775.808 a -9.223.372.036.854.775.807] REAL [-3.40E + 38 a 3.40E + 38] BIT: Armazena os valores lógicos 0 ou 1. Valores monetários SMALLMONEY:Valores numéricos decimais variando de -214 748.3648 a •4 214 748.3647. MONEY: Decimais variando de -922 337 203 685 477.5808 a +922 337 203 685 477.5807 Tipos de Dados no SQL Server (2) Tipos para datas SMALLDATETIME: Armazena data e hora, com precisão de minutos. DATETIME: Armazena data e hora, com precisão de centésimos de segundos. TIME: Armazena somente hora. Pode armazenar segundos até a fração de 9999999. DATE: Armazena somente data. DATETIME2: É uma combinação dos tipos de dados DATE e TIME. A diferença para o tipo DATETIME é a precisão ao armazenar as horas. DATETIMEOFFSET: Armazena valores data e hora com a combinação da hora do dia com o fuso horário. O intervalo de deslocamento do fuso horário é de -14:00 a +14:00. •5 Tipos de Dados no SQL Server (3) Tipos para texto CHAR(N): Armazena N caracteres fixos (até 8.000) no formato não Unicode. Independente da quantidade de caracteres utilizados, irá sempre armazenar o tamanho de caracteres do campo, sendo preenchido o restante com espaços em branco VARCHAR(N): Armazena N caracteres (até 8.000) no formato não Unicode. VARCHAR(MAX): Armazena caracteres no formato não Unicode. MAX indica que o máximo a ser armazenado pode chegar a 2^31-1 bytes. TEXT: Armazena caracteres no formato não Unicode. Esse tipo de dado suporte até 2.147.483.647 caracteres e existem funções específicas para trabalhar com esse tipo de dado. NCHAR(N): Armazena N caracteres fixos (até 4.000) no formato Unicode. Independente da quantidade de caracteres utilizados, irá sempre armazenar o tamanho de caracteres do campo, sendo preenchido o restante com espaços em branco. NVARCHAR(N): Armazena N caracteres (até 4.000) no formato Unicode. NVARCHAR(MAX): Armazena caracteres no formato Unicode. MAX indica que o máximo a ser armazenado pode chegar a 2^31-1 bytes. NTEXT: Armazena caracteres no formato Unicode. Esse tipo de dado suporte até 1.073.741.823 •6 caracteres e existem funções específicas para trabalhar com esse tipo de dado. Create Table (1) – Apenas os Campos CREATE TABLE Pais1( Nome varchar(50), Pib money ) •7 Create Table (2) – Definição de Chave Primária – Sintaxe 1 CREATE TABLE Pais2( Nome varchar(50) PRIMARY KEY, Pib money ) •8 Create Table (3) – Definição de Chave Primária – Sintaxe 2 CREATE TABLE Pais3( Nome varchar(50), Pib money, PRIMARY KEY(Nome) ) •9 Create Table (4) – Definição de Chave Primária – Sintaxe 3 CREATE TABLE Pais4( Nome varchar(50), Pib money, CONSTRAINT PK_Pais4 PRIMARY KEY(Nome) ) •10 Create Table (5) – Definição de Chave Primária – Sintaxe 3 CREATE TABLE Mineral( Nome varchar(30), Valor money, CONSTRAINT PK_Mineral PRIMARY KEY(Nome) ) •11 Create Table (6) – Definição de Chave Estrangeira – Sintaxe 1 CREATE TABLE PaisMineral1( NomePais varchar(50) REFERENCES Pais4(Nome), NomeMineral varchar(30) REFERENCES Mineral(Nome), ReservaEstimada real, ProducaoAnual real, CONSTRAINT PK_PaisMineral1 PRIMARY KEY(NomePais, NomeMineral)) •12 Create Table (7) – Definição de Chave Estrangeira – Sintaxe 2 CREATE TABLE PaisMineral2( NomePais varchar(50), NomeMineral varchar(30), ReservaEstimada real, ProducaoAnual real, CONSTRAINT PK_PaisMineral2 PRIMARY KEY(NomePais, NomeMineral), FOREIGN KEY (NomePais) REFERENCES Pais4(Nome), FOREIGN KEY (NomeMineral) REFERENCES Mineral(Nome) •13) Create Table (8) – Definição de Chave Estrangeira – Sintaxe 3 CREATE TABLE PaisMineral3( NomePais varchar(50), NomeMineral varchar(30), ReservaEstimada real, ProducaoAnual real, CONSTRAINT PK_PaisMineral3 PRIMARY KEY(NomePais, NomeMineral), CONSTRAINT FK1_PaisMineral3 FOREIGN KEY (NomePais) REFERENCES Pais4(Nome), CONSTRAINT FK2_PaisMineral3 FOREIGN KEY (NomeMineral) REFERENCES Mineral(Nome)) •14 Create Table (9) – Outras Restrições Outras restrições que podem ser impostas sobre um campo (além de chave primária e chave estrangeira): 1. NOT NULL: O campo não pode assumir valores nulos. 2. UNIQUE: O campo não pode assumir valores repetidos. 3. CHECK(condição): O valor do campo deve satisfazer a uma condição expressa na cláusula CHECK. 4. DEFAULT valor: Se nenhum valor for especificado para o campo quando for feita a inserção de um registro no mesmo, então o campo assume o valor “default”. •15 Insert (1) – Comando da DML Comando utilizado para a inserção de registros nas tabelas. Sintaxe 1 INSERT INTO nome_tabela VALUES (valor1, ... , valorN) Ao se usar esta sintaxe, os valores especificados após a cláusula VALUES têm que estar, necessariamente, na mesma ordem em que foram criados. Exemplo: INSERT INTO Pais VALUES (‘Brasil’, 12000) - Certo INSERT INTO Pais VALUES (12000, ‘Brasil’) - Errado •16 Insert (2) – Comando da DML Sintaxe 2 INSERT INTO nome_tabela (campo1, ..., campoN) VALUES (valor1, ... , valorN) Ao se usar esta sintaxe, os valores especificados após a cláusula VALUES têm que estar, necessariamente, na mesma ordem em que o nome dos campos aparecem após o nome da tabela. Exemplo: INSERT INTO Pais (Pib, Nome) VALUES (12000, ‘Brasil’) INSERT INTO Pais (Nome) VALUES ( ‘Argentina’) •17 Exercício– Criação de Tabelas Criar as tabelas a seguir: Genero (CodGenero, NomeGenero) DVD (CodDVD, TituloFilme, ValorLocacao, CodGenero) CE(Genero) Cliente (CodCliente, NomeCliente, Endereco, Telefone) Locacao (CodCliente, CodDVD, DataLocacao, NumeroDias) CE(Cliente) •18 CE(DVD) Voltando às Restrições (1) Se executarmos o comando INSERT abaixo: INSERT INTO Genero(CodGenero) VALUES (1) Verificando o conteúdo da tabela Genero, veremos que consta um NULL para o campo NomeGenero associado ao código de Genero 1. Para impedir a inserção de valores nulos, impomos a restrição NOT NULL quando da declaração do campo. Exemplo: CREATE TABLE Genero1( CodGenero int, NomeGenero varchar(30) NOT NULL, CONSTRAINT PK_Genero1 PRIMARY KEY(CodGenero) ) •19 Voltando às Restrições (2) Se executarmos o comando INSERT abaixo: INSERT INTO Genero1(CodGenero) VALUES (1) veremos que a inserção não ocorre, aparecendo a seguinte mensagem de erro: Não é possível inserir o valor NULL na coluna 'NomeGenero', tabela 'Genero1'; a coluna não permite nulos. Falha em INSERT. •20 Voltando às Restrições (3) Se executarmos os comandos INSERT abaixo: INSERT INTO Genero VALUES (2, ‘Romance’) INSERT INTO Genero VALUES (3, ‘Romance’) Verificando o conteúdo da tabela Genero, veremos que o gênero Romance aparece duas vezes, associado ao código 2 e ao código 3. Para impedir a inserção de valores duplicados de NomeGenero, impomos a restrição UNIQUE quando da declaração do campo. Exemplo: CREATE TABLE Genero2( CodGenero int, NomeGenero varchar(30) UNIQUE, CONSTRAINT PK_Genero2 PRIMARY KEY(CodGenero) •21 ) Voltando às Restrições (3) CREATE TABLE Genero2( CodGenero int, NomeGenero varchar(30), CONSTRAINT PK_Genero2 PRIMARY KEY(CodGenero), CONSTRAINT UQ_Genero2 UNIQUE(NomeGenero) ) •22 Voltando às Restrições (4) Se executarmos os comandos INSERT abaixo: INSERT INTO Genero2 VALUES (2, ‘Romance’) INSERT INTO Genero2 VALUES (3, ‘Romance’) verificamos que a primeira inserção ocorre, porém a segunda não e o SGBD emite a seguinte mensagem de erro: Violação da restrição UNIQUE KEY 'UQ__Genero2__081698E50425A276'. Não é possível inserir a chave duplicada no objeto 'dbo.Genero2'. A instrução foi finalizada. •23 Voltando às Restrições (5) Se executarmos o comando INSERT abaixo: INSERT INTO DVD VALUES (1, ‘A Volta dos que não Foram’, -1.5, 1) estaremos inserindo na base um DVD com valor de locação negativo. •24 Voltando às Restrições (6) Para impedir a inserção de valores de locação negativos, impomos uma restrição através da cláusula CHECK quando da declaração do campo. Exemplo: CREATE TABLE DVD1 ( CodDVD int, TituloFilme varchar(50), ValorLocacao money CHECK(ValorLocacao>0), CodGenero int, CONSTRAINT PK_DVD1 PRIMARY KEY(CodDVD), CONSTRAINT FK1_DVD1 FOREIGN KEY(CodGenero) REFERENCES Genero(CodGenero) ) •25 Voltando às Restrições (6) • Uma outra sintaxe possível para se fazer a mesma declaração é: CREATE TABLE DVD2 ( CodDVD int, TituloFilme varchar(50), ValorLocacao money , CodGenero int, CONSTRAINT PK_DVD2 PRIMARY KEY(CodDVD), CONSTRAINT FK_DVD2 FOREIGN KEY(CodGenero) REFERENCES Genero(CodGenero), CONSTRAINT CK_DVD2 CHECK(ValorLocacao > 0) ) •26 Voltando às Restrições (7) Se executarmos o comando INSERT abaixo: INSERT INTO DVD1 VALUES (1, ‘A Volta dos que não Foram’, -1.5, 1) veremos que não é possível fazer a inserção e o SGBD emite a seguinte mensagem de erro: A instrução INSERT conflitou com a restrição do CHECK "CK__DVD1__ValorLocac__0F975522". O conflito ocorreu no bando de dados "PaisProducaoMinerais", tabela "dbo.DVD1", column 'ValorLocacao'. A instrução foi finalizada. •27 Voltando às Restrições (8) Se executarmos o comando INSERT abaixo: INSERT INTO DVD1 (CodDvd, TituloFilme, ValorLocacao) VALUES (1, ‘A Origem dos Guardiões’, 3.5) estaremos inserindo na base um DVD sem informar qual é o gênero de filme ao qual ele corresponde. Neste caso, ficará constando na coluna CodGenero o valor NULL para este filme. Podemos estabelecer que todo filme que seja inserido sem que se informe o código do gênero, seja considerado como sendo do gênero Infantil (código 1). •28 Voltando às Restrições (9) Fazemos isso por meio da cláusula DEFAULT. Exemplo: CREATE TABLE DVD2 ( CodDVD int, TituloFilme varchar(50), ValorLocacao money, CodGenero int DEFAULT 1, CONSTRAINT PK_DVD2 PRIMARY KEY(CodDVD), CONSTRAINT FK1_DVD2 FOREIGN KEY(CodGenero) REFERENCES Genero(CodGenero) ) •29 Delete (1) – Comando da DML Comando utilizado para a exclusão de registros das tabelas. Sintaxe Completa DELETE FROM nome_tabela WHERE condição Ao se executar um comando de deleção são excluídos da tabela todos os registros que satisfazem à condição especificada. Obs: A cláusula WHERE pode ser omitida. Neste caso, são excluídos todos os registros da tabela. •30 Integridade Referencial e a Criação de Tabelas (1) Quando se tentar excluir um registro de uma tabela e este registro referencia um registro de outra tabela, o comportamento padrão do SGBD é não permitir a exclusão. A tabela que referencia é comumente chamada de tabela filha e a tabela referenciada de tabela pai ou tabela mãe. •31 Integridade Referencial e a Criação de Tabelas (2) Suponhamos, que os tabelas Genero e DVD tenham os seguintes conteúdos: CodGenero NomeGenero 1 Romance 2 Ficção 3 Suspense 4 Terror 5 Infantil 6 Comédia CodDVD TituloFilme ValorLocacao CodGenero 1 Procurando Nemo 3,50 5 2 O Exorcista 3,00 4 3 Titanic 2,50 1 4 Blade Runner 4,00 2 5 A Órfã 3,00 3 Vamos considerar que todas as versões da tabela DVD, que se chamarão DVD1, DVD2, DVD3, etc, terão os mesmos registros representados acima. •32 Integridade Referencial e a Criação de Tabelas (3) • Se tentarmos excluir um registro da tabela Genero, que seja referenciado por algum registro da tabela DVD, como por exemplo: DELETE FROM Genero WHERE CodGenero = 1 o SGBD não permite que se faça a exclusão, uma vez que ele é responsável por manter a integridade referencial na base de dados. • Para excluírmos o gênero Romance (CodGenero = 1) da tabela Genero, temos que, antes, excluir o registro com o filme “Titanic”, que é deste gênero, da tabela DVD. •33 Integridade Referencial e a Criação de Tabelas (4) • Há, entretanto, outros comportamentos que podem ser definidos de tal forma que o SGBD permita a exclusão (ou atualização) de registros referenciados, tomando ações compensatórias, a fim de garantir a integridade referencial. São eles: 1. ON UPDATE/ ON DELETE CASCADE: Faz atualização/exclusão em cascata. 2. ON UPDATE/ ON DELETE SET NULL: Ao se atualizar ou deletar um registro na tabela mãe, coloca um NULL nos campos dos registros que o referenciam, na tabela filha. 3. ON UPDATE/ ON DELETE SET DEFAULT: Ao se atualizar ou deletar um registro na tabela mãe, coloca o valor declarado como DEFAULT nos campos dos registros que o referenciam na tabela filha. •34 Integridade Referencial e a Criação de Tabelas (5) • Assim, se a tabela DVD3 é criada com a cláusula ON ) DELETE CASCADE, como abaixo: CREATE TABLE DVD3 ( CodDVD int, TituloFilme varchar(50), ValorLocacao money, CodGenero int DEFAULT 5, CONSTRAINT PK_DVD3 PRIMARY KEY(CodDVD), CONSTRAINT FK1_DVD3 FOREIGN KEY(CodGenero) REFERENCES Genero(CodGenero) ON UPDATE CASCADE ON DELETE CASCADE ao emitirmos o comando: DELETE FROM Genero WHERE CodGenero = 1 o registro relativo ao filme Titanic também será excluído da tabela DVD3. •35 Integridade Referencial e a Criação de Tabelas (6) • Assim, se a tabela DVD4 é criada com a cláusula ON ) DELETE SET NULL, como abaixo: CREATE TABLE DVD4 ( CodDVD int, TituloFilme varchar(50), ValorLocacao money, CodGenero int DEFAULT 5, CONSTRAINT PK_DVD4 PRIMARY KEY(CodDVD), CONSTRAINT FK1_DVD4 FOREIGN KEY(CodGenero) REFERENCES Genero(CodGenero) ON UPDATE SET NULL ON DELETE SET NULL ao emitirmos o comando: DELETE FROM Genero WHERE CodGenero = 1 o registro relativo ao filme Titanic terá seu campo CodGenero “setado” para NULL na tabela DVD4. •36 Integridade Referencial e a Criação de Tabelas (7) • Assim, se a tabela DVD5 é criada com a cláusula ON ) DELETE SET NULL, como abaixo: CREATE TABLE DVD5 ( CodDVD int, TituloFilme varchar(50), ValorLocacao money, CodGenero int DEFAULT 5, CONSTRAINT PK_DVD5 PRIMARY KEY(CodDVD), CONSTRAINT FK1_DVD5 FOREIGN KEY(CodGenero) REFERENCES Genero(CodGenero) ON UPDATE SET DEFAULT ON DELETE SET DEFAULT ao emitirmos o comando: DELETE FROM Genero WHERE CodGenero = 1 o registro relativo ao filme Titanic terá seu campo CodGenero “setado” para 5 na tabela DVD5. •37 Alterando a Estrutura de Tabelas (1) • Quando uma tabela precisa sofrer alterações estruturais, uma alternativa possível é excluí-la da base de dados e criar outra com a estrutura desejada. • Porém, esta não é a melhor solução quando a tabela em questão já está populada com dados. • Neste caso, é mais conveniente fazer uso do comando ALTER TABLE, que faz parte do grupo de comandos da DDL. •38 Alterando a Estrutura de Tabelas (2) • Com o comando ALTER TABLE, é possível fazer os seguintes tipos de alterações estruturais: 1. 2. 3. 4. 5. •39 Incluir um novo campo. Excluir um campo. Alterar o tipo de um campo. Excluir uma restrição. Incluir uma restrição. Alterando a Estrutura de Tabelas (3) • Para ilustrar as várias possibilidades de uso do comando ALTER TABLE, suponhamos que tenhamos criado a tabela Cliente, com o seguinte comando: CREATE TABLE Cliente ( CodCliente int, NomeCliente varchar(50), Endereco varchar(100), Telefone varchar(11) CONSTRAINT PK_Cliente PRIMARY KEY (CodCliente)) •40 Alterando a Estrutura de Tabelas (4) • Para incluir o campo NumFilhos do tipo int, fazemos: ALTER TABLE Cliente ADD NumFilhos int Exercício: • Inclua agora, nesta mesma tabela, um campo Cpf do tipo varchar(12). •41 Alterando a Estrutura de Tabelas (5) • Para excluir o campo NumFilhos, fazemos: ALTER TABLE Cliente DROP COLUM NumFilhos Exercício: • Exclua agora, desta mesma tabela, o campo Cpf que você incluiu anteriormente. •42 Alterando a Estrutura de Tabelas (6) • Vamos incluir o campo NumFilhos, do tipo int novamente e, em seguida, suponhamos que tenhamos a necessidade de alterar seu tipo para tinyint: ALTER TABLE Cliente ALTER COLUM NumFilhos tinyint Exercício: • Torne a incluir nesta tabela o campo Cpf como varchar(120 e, sem seguida, altere o seu tipo para varchar(11). •43 Alterando a Estrutura de Tabelas (6) • Para excluir da tabela Cliente a restrição PRIMARY KEY fazemos: ALTER TABLE Cliente DROP CONSTRAINT PK_Cliente •44 Alterando a Estrutura de Tabelas (6) • Para incluir na tabela Cliente a restrição PRIMARY KEY de tal forma que agora a chave primária passe a ser o Cpf, fazemos: ALTER TABLE Cliente ADD CONSTRAINT PK_Cliente PRIMARY KEY (Cpf) •45