bd sql (1)
TRANSCRIPT
Banco de DadosBanco de DadosSQLSQL
Regis Pires Magalhã[email protected] @regispires
SQLSQLStructured Query Language - SQLEspecificar consultas de forma interativa.DDL - Data Definition Language◦ Linguagem de Definição de Dados
DML - Data Manipulation Language◦ Linguagem de Manipulação de Dados◦ Usada para especificar consultas e
atualizações
DDL permite especificar...DDL permite especificar...Esquema de relações(tabelas);Domínio de valores associados a cada
atributo;Restrições de integridade;Conjunto de índices a serem mantidos
para cada relação;Estrutura de armazenamento físico de
cada relação em disco;Autorização de acesso para cada relação.
SGBD – MySQL – Resumo SGBD – MySQL – Resumo Estabelecer uma conexão pelo console:◦ mysql -u usuario -p
-u usuário / -p password (senha)
Criar um banco de dados◦ create database nome_bd;
Usar um banco de dados como padrão◦ use nome_bd;
Apagar um banco de dados◦ drop database nome_bd;
SGBD – MySQL – Resumo SGBD – MySQL – Resumo Obtendo informações sobre o BD...◦ Mostrar todos os bancos de dados
show databases;
◦ Mostrar todas as tabelas de um BD show tables;
◦ Mostrar o comando de criação de um BD show create database nome_bd;
◦ Mostrar o comando de criação de uma tabela show create table nome_tabela;
MySQL Monitor – Status - \sMySQL Monitor – Status - \s\s
mysql Ver 14.14 Distrib 5.1.61, for debian-linux-gnu (x86_64) using readline 6.2
Connection id: 93
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.1.61-0ubuntu0.11.10.1 (Ubuntu)
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: latin1
Db characterset: latin1
Client characterset: latin1
Conn. characterset: latin1
UNIX socket: /var/run/mysqld/mysqld.sock
Uptime: 1 day 3 hours 15 min 21 sec
Threads: 4 Questions: 2251 Slow queries: 0 Opens: 297 Flush tables: 1
Open tables: 58 Queries per second avg: 0.22
Criação de banco de dadosCriação de banco de dadosCREATE DATABASE nome_bd [[DEFAULT] CHARACTER SET charset_name] [[DEFAULT] COLLATE collation_name]Character set – conjunto de símbolos e codificações. Collation – conjunto de regras para comparação de
caracteres em um conjunto de caracteres.Exemplos:◦ CREATE DATABASE locadora;◦ CREATE DATABASE locadora CHARSET utf8;◦ CREATE DATABASE locadora DEFAULT CHARACTER
SET utf8 COLLATE utf8_general_ci;
MySQL – charset do consoleMySQL – charset do consoleAlterando o charset do MySQL Monitor
para utf8:◦ set charset utf8;
Exclusão de banco de dadosExclusão de banco de dadosDROP DATABASE nome_bd;◦ Exemplo:
DROP DATABASE locadora;
Selecionando o banco de dados Selecionando o banco de dados para usopara usoUSE nome_bd;◦ Exemplo:
USE locadora;
Criação de tabelasCriação de tabelasCREATE TABLE nome-tabela
(nome-coluna tipo-de-dados [not null], [nome-coluna tipo-de-dados [not null] … ], [CONSTRAINT nome-restrição]
UNIQUE nome-coluna | PRIMARY KEY(nome-coluna {, nome-coluna})
| FOREIGN KEY (nome-coluna {, nome-coluna})REFERENCES nome-tabela
[ON DELETE CASCADE | SET NULL | NO ACTION ],[ON UPDATE CASCADE],
| CHECK (predicado) )
Alguns tipos de dados (SQL 92)Alguns tipos de dados (SQL 92)char(n)◦ string de caracteres de tamanho fixo n
varchar(n)◦ string de caracteres de tamanho variável (máximo n)
Integer (int), smallint, tinyint, bigintdecimal(p,d), numeric (p,d)◦ numérico com p dígitos◦ Dos p dígitos, d dígitos representam casas decimais
após a vírgulaReal, float - numérico ponto flutuantedate – datatime – hora datetime, smalldatetime, timestamp – data e hora
Restrições (Constraints)Restrições (Constraints)NOT NULL◦ O atributo deve ser obrigatoriamente preenchido.
DEFAULT◦ Atribui um valor padrão ao atributo, caso não seja
especificado um valor.UNIQUE◦ Garante que o atributo não terá valores repetidos na
tabela.CHECK◦ Verifica se o valor inserido é permitido para o
atributo.
Restrições (Constraints)Restrições (Constraints)PRIMARY KEY (PK)◦ Define a chave primária da relação.
FOREIGN KEY (FK)◦ Implementa o conceito de chave estrangeira e
garante a integridade referencial.◦ Deve referenciar um campo que possua chave
primária ou uma restrição UNIQUE. ON DELETE CASCADE – Se a linha da tabela que tem a PK
for apagada, a linha da tabela que tem a FK também será. ON UPDATE CASCADE – Se a linha da tabela que tem a PK
for modificada, a linha da tabela que tem a FK também será.
Criação de tabelas - InnoDBCriação de tabelas - InnoDBPara usar recursos como integridade
referencial e transações no MySQL, é preciso criar tabelas do tipo InnoDB:◦ CREATE TABLE pessoas (...)
ENGINE=InnoDB;
CREATE DATABASE producao default charset utf8;
use producao;
CREATE TABLE diretor(
id int PRIMARY KEY,
nome varchar(50)
) ENGINE=INNODB;
CREATE TABLE filme(
id int PRIMARY KEY,
titulo varchar(50),
id_diretor int,
FOREIGN KEY (id_diretor) REFERENCES diretor(id)
) ENGINE=INNODB;
Remoção de tabelasRemoção de tabelasDROP TABLE nome-tabela [CASCADE |
RESTRICT]Remove as tuplas da tabela e sua
definição do catálogo◦ CASCADE remove as restrições do tipo
foreign key tabelas que referenciam a tabela removida
ExercícioExercícioDado o modelo relacional a seguir, definir o esquema
físico do banco de dados usando SQL. clientes(id: int, nome: varchar(50), cpf: char(11),
data_cadastro:date, cidade: varchar(50), uf: char(2)) categorias(id: int, nome: varchar(20)) classes (id:int, nome: varchar(20), preco: decimal(10,2)) distribuidores (id: int, nome: varchar(50)) filmes (id: int, titulo: varchar(50), id_distribuidor:
int, ano_lancamento: int(4), id_categoria: int, id_classe: int)
◦ id_distribuidor referencia distribuidores
◦ id_categoria referencia categorias
◦ id_classe referencia classes locacoes (id: int, id_cliente: int, id_filme: int,
dt_locacao: date, dt_devolucao_prevista: date, dt_devolucao:date, valor: decimal(10,2)
◦ id_cliente referencia clientes
◦ id_filme referencia filmes
Criando a tabela clientesCriando a tabela clientesCREATE TABLE clientes (
id int AUTO_INCREMENT,cpf char(11),nome varchar(50),data_cadastro date,cidade varchar(40),uf char(2) DEFAULT 'PI',PRIMARY KEY (id),UNIQUE (cpf)
) ENGINE=InnoDB;
Inserindo dados na tabela clientesInserindo dados na tabela clientes
insert into clientes values (null, '123', 'Regis', '2012-04-11', 'Parnaíba', 'PI');
insert into clientes (cpf, nome, data_cadastro, cidade) values ('124', 'João', '2012-04-11', 'Parnaíba');
CREATE TABLE clientes (id int PRIMARY KEY AUTO_INCREMENT,cpf char(11) UNIQUE,nome varchar(50),data_cadastro date,cidade varchar(40),uf char(2) DEFAULT 'PI' ) ENGINE=InnoDB;
Alteração de tabelasAlteração de tabelasALTER TABLE nome-tabela
[ADD nome-coluna tipo de dados] [DROP nome-coluna ]
[ADD CONSTRAINT nome-restrição] [DROP CONSTRAINT nome-restrição]
[DROP PRIMARY KEY] [ repetir ADD ou DROP em qualquer ordem]
ConsultasConsultas SELECT [ALL | DISTINCT] {* | expr [[AS] c_alias]
{, expr [[AS] c_alias] … }}FROM nome-tabela [[AS] qualificador]
{, nome-tabela [[AS] qualificador] …}WHERE predicado
ALL◦ Retorna todas as tuplas, inclusive repetidas (default)
DISTINCT◦ Retorna apenas tuplas não repetidas
*◦ Retorna todos os atributos da(s) tabela(s)
expr◦ Representa um atributo ou ◦ Expressão matemática envolvendo atributos das tabelas
salario*1.40
ConsultasConsultasFROM◦ Representa o produto cartesiano das tabelas
referenciadas WHERE◦ Corresponde ao predicado de seleção da álgebra
relacionalORDER BY coluna-resultado [ASC | DESC]
{, coluna-resultado [ASC | DESC] …}
ConsultasConsultasPredicados com operações sobre strings◦ Identificação de padrão
% - Casa com qualquer substring _ - Casa com qualquer caracter◦ Operador
like◦ Exemplos
nome like ‘inf%’ Retorna strings que iniciam pelo substring inf
nome like ‘%si_’ Retorna strings que contenham ‘si’ como substring e
terminem com um caracter qualquer após ‘si’ Listar todos empregados com sobrenome ‘pires’
Select nome from empregados where nome like ‘%pires%’
ConsultasConsultasFunções Agregadas◦ Funções embutidas (built-in) aplicadas sobre uma
coleção de valores (colunas) do banco de dados◦ sum
Retorna o somatório dos valores de uma coleção◦ avg
Retorna a média dos valores de uma coleção◦ max
Retorna o maior valor de uma coleção de valores ◦ min
Retorna o menor valor de uma coleção◦ count
Retorna o número de elementos de uma coleção◦ Sintaxe
nome-da-função (nome-da-função (ALLALL | DISTINCT nome-coluna) | | DISTINCT nome-coluna) | count(*)count(*) Não podem ser utilizados na cláusula WHERE
ConsultasConsultasAgrupando tuplas no SQL◦ Aplicar funções agregadas a diferentes grupos
de tuplas◦ Exemplo
Listar a quantidade de empregados por departamento
◦ Cláusula GROUP BY◦ Todas colunas que aparecem na cláusula select
têm que aparecer na cláusula group by Exceto os argumentos da funções agregadas
ConsultasConsultasSelecionando grupos◦ Cláusula havinghaving
Filtro de gruposConsulta com where e having◦ predicado da cláusula where é avaliado
primeiramente Tuplas que satisfazem o predicado são agrupadas
pelo group by◦ Predicado da cláusula having é avaliado
Grupos que satisfazem o predicado aparecem no resultado
ConsultasConsultasChecando valores nulos◦ Predicado IS NULLIS NULL◦ Exemplo
select * from Empregado where dt-nasc is null
ConsultasConsultasConsultas com o operador de união◦ UNION
União de duas relações (consultas) Sem repetições
◦ UNION ALL União de duas relações
Com repetições
◦ Exemplo Considere as seguintes relações
Empregado(matr, nome, ender, dt_nasc, cpf, salário, lotação)
Dependente(nome_dep, data-nasc, matr_resp) Liste o nome e data de nascimento de todos os
funcionários e dependentes existentes na empresaselect nome,dt_nasc from Empregado UNIONselect nome_dep,data_nasc from Dependente
ConsultasConsultasConsultas com o operador de interseção◦ INTERSECT
Interseção entre duas relações (consultas) Sem repetições
◦ INTERSECT ALL Interseção entre duas relações
Com repetições
Consultas com o operador de diferença◦ EXCEPT
Diferença entre duas relações (consultas) Sem repetições
◦ EXCEPT ALL Diferença entre duas relações (consultas)
Com repetições
ConsultasConsultasConsulta SQL aninhada (subconsulta)Consulta SQL aninhada (subconsulta)◦ Consulta SQL especificada dentro de uma
outra consulta SQL◦ Exemplo
Listar todos os empregados que têm salário maior que a média salarial da empresa
select e.nome from Empregado ewhere salário > (select avg(salário) from Empregadoselect avg(salário) from Empregado)
select e.nome from Empregado ewhere salário > (select avg(salário) from Empregadoselect avg(salário) from Empregado)
ConsultasConsultasConsulta SQL aninhada Consulta SQL aninhada (cont.)(cont.)◦ Predicado IN
Verifica a pertinência de elementos em um conjunto
Exemploselect nome from Empregadowhere matr in (1,5,8,9)
ExercíciosExercíciosConsidere o seguinte esquema de banco
de dadosdepartamentos(id, nome, endereco, cidade, uf)empregados(id, matricula, cpf, nome, dt_nasc, endereco,
salario, id_dept)dependentes(id, nome, dt_nasc, id_empr)id_dept em empregados referencia id em departamentos.id_empr em dependentes referencia id em empregados.
◦ Crie as tabelas Departamento e Empregado utilizando a DDL do SQL.
Alterar a tabela empregados para que matricula e cpf não possam ser duplicados.
ExercíciosExercíciosCriar consultas SQL para:◦ Listar os funcionários com salário maior que 3000.◦ Listar funcionários com salários maior que 1000 e
menor que 2000.◦ Listar nome dos funcionários com o nome de seu
departamento.◦ Listar nome dos funcionários com o nome de seu
departamento e uma simulação de seu salário com um aumento de 15%.◦ Listar empregados ordenados por salário na ordem
decrescente e por nome na ordem crescente.
ExercíciosExercícios Encontre o número de empregados lotados no departamento de
Informática. Encontre o montante da folha de pagamento (soma dos salários)
da empresa. Encontre o salário médio pago pela empresa. Listar a quantidade de empregados por departamento. Listar maiores e menores salários de cada departamento. Listar nome dos departamentos cuja média salarial seja maior que
7000. Listar todos dependentes com respectivos responsáveis e nome do
departamento de lotação dos responsáveis. Listar o nome e data de nascimento de todos os funcionários e
dependentes existentes na empresa. Listar matrícula dos empregados que não possuem dependentes. Listar matrícula dos empregados que possuem dependentes.
ExercíciosExercíciosListar nome e média salarial dos departamentos que
possuem mais de 10 empregados lotados.Listar nome e quantidade de empregados dos
departamentos cuja média salarial é maior que 5000.Listar o primeiro e segundo maiores salários da
empresa.Listar nome dos departamentos com média salarial
maior que a média salarial da empresa.Listar todos os empregados que possuem salário maior
que a média salarial de seus departamentos.Listar os empregados lotados nos departamentos
localizados no Piauí.
ReferênciasReferências Elsmari, R., Navathe, Shamkant B. “Sistemas de
Banco de Dados”. 6ª Edição, Pearson Brasil, 2011. Silberschatz, A., Korth, H., Sudarshan, S. “Sistema
de Banco de Dados”. 5ª Edição, Editora Campus, 2006.
Heuser, Carlos Alberto. “Projeto de Banco de Dados”. 6ª Edição, Editora Bookman, 2009.
Slides Prof. José Maria (UFC).
DÚVIDAS?DÚVIDAS?
[email protected] @regispires