SQL Structured Query Language Juliano Brito da Justa Neves PESCD – Programa de Estágio Supervisionado de Capacitação Docente SQL • Linguagem padrão para SGBDs relacionais – Motivo pelo grande sucesso dos SGBDs relacionais • Linguagem de Definição de Dados (DDL) • Linguagem de Manipulação de Dados (DML) Esquema • Agrupar tabelas e outros elementos (constraints, views...) que pertencem a mesma aplicação de banco de dados CREATE SCHEMA <esquema> AUTHORIZATION <autorização> ; Esquema • Esquemas no Oracle – Criar várias tabelas e views e dar permissões em uma única transação. CREATE SCHEMA AUTHORIZATION <esquema> [create_table, create_view, grant]+ ; Esquema • Esquemas no Oracle – O CREATE SCHEMA não cria realmente um esquema. O esquema é automaticamente criado quando um usuário é criado. • Vamos utilizar um dos usuários previamente criados. Oracle • Conexão com o SGBD Oracle – Putty – SSH: falcon.comp.ufscar.br – Login: Pessoal de cada um – No prompt do linux: • sqlplus • Login: compX X número de 1 a 20 • Senha: igual ao login Estudo de Caso EQUIPE (#Codigo_Equipe,Nome_Equipe,Cidade,Estado) JOGADOR (#Codigo_Jogador,Nome_Jogador,Posição_Jog,#Codigo_Equipe) PARTIDA (#Codigo_Partida,Cidade,Estado,Nome_Juiz,Data) JOGA (#Codigo_Jogador,#Codigo_Partida,Numero_Gols) Tabelas CREATE TABLE [esquema.]tabela ( coluna1 tipo_dado [DEFAULT expr] [constraint_coluna], ... colunaN tipo_dado [DEFAULT expr] [constraint_coluna], [constraint_tabela] ); Tipos de Dados • • • • • • • • • • • • Integer, Float, Real... Char (n) Varchar2 (n) Clob Long Blob Raw e Long Raw Number (p,e) Date Timestamp Interval Year (p) to month Interval Day (dp) to second (sp) Constraints • Grupo 1 – NOT NULL – Unique • Grupo 2 – Check – Primary key – Foreign key CONSTRAINT nome tipo expr constraint cod Primary Key constraint fcod Foreign Key references tabela(coluna) constraint chk Check (uf in (‘SP’, ‘MG’)) Exemplo EQUIPE (#Codigo_Equipe,Nome_Equipe,Cidade,Estado) CREATE TABLE equipe ( codigo_equipe INTEGER constraint equipe_pk Primary Key, nome_equipe Varchar2(20) NOT NULL, cidade Varchar2(10), estado Varchar2(10) ); Exemplo JOGADOR (#Codigo_Jogador,Nome_Jogador,Posição_Jog,#Codigo_Equipe) Codigo_jogador INTEGER Nome_jogador Varchar2(20) Posicao_jog Varchar2(15) Codigo_Time INTEGER Exemplo JOGADOR (#Codigo_Jogador,Nome_Jogador,Posição_Jog,Codigo_equipe) CREATE TABLE jogador ( codigo_jogador INTEGER constraint jogador_pk Primary Key, nome_jogador Varchar2(20) NOT NULL, posicao_jog Varchar2(15), codigo_equipe INTEGER, constraint jogador_fk Foreign Key (codigo_equipe) references equipe(codigo_equipe) ); Exemplo PARTIDA (#Codigo_Partida,Cidade,Estado,Nome_Juiz,Data) Codigo_partida INTEGER cidade Varchar2(10) estado Varchar2(10) nome_juiz Varchar2(20) data date Exemplo PARTIDA (#Codigo_Partida,Cidade,Estado,Nome_Juiz,Data) CREATE TABLE partida ( codigo_partida INTEGER constraint partida_pk Primary Key, cidade Varchar2(10) NOT NULL, estado Varchar2(10), nome_juiz Varchar2(20) NOT NULL, data Date ); Mais Constraints! • ON DELETE – SET NULL – CASCADE – SET DEFAULT • ON UPDATE – SET NULL – CASCADE – SET DEFAULT Exemplo JOGA (#Codigo_Jogador,#Codigo_Partida,Numero _Gols) codigo_jogador Integer Se apagar jogador, apaga. codigo_partida Integer Se apagar partida, apaga. numero_gols Integer Exemplo JOGA (#Codigo_Jogador,#Codigo_Partida,Numero_Gols) CREATE TABLE joga ( codigo_jogador integer, constraint joga1_fk foreign key (codigo_jogador) references jogador(codigo_jogador) on delete cascade, codigo_partida integer, constraint joga2_fk foreign key (codigo_partida) references partida(codigo_partida) on delete cascade, numero_gols integer ); Alteração de tabelas • • • • Criar, alterar ou eliminar colunas Renomear a tabela Criar ou eliminar constraints Habilitar ou desabilitar constraints Alteração de Tabelas ALTER TABLE [esquema.]tabela [add coluna tipo_dado [DEFAULT expr] [constraint_coluna] ] [modify coluna tipo_dado [DEFAULT expr] [constraint_coluna] ] [add constraint_coluna/constraint_tabela] [drop constraint_coluna/constraint_tabela [cascade]] [enable constraint_coluna/constraint_tabela] [disable constraint_coluna/constraint_tabela] ; Exemplo • Alterar a tabela joga para que o valor default de Numero_gols seja 0; ALTER TABLE joga MODIFY numero_gols INTEGER DEFAULT ‘0’; • Adicionar uma Primary Key em joga ALTER TABLE joga ADD constraint joga_pk Primary Key (codigo_jogador, codigo_partida); Apagando Tabelas DROP TABLE [esquema.]tabela [CASDADE CONSTRAINTS]; • CASCADE CONSTRAINTS elimina todas as restrições presentes em outras tabelas que façam referência à tabela que está sendo eliminada. Índices • Criar CREATE [UNIQUE] INDEX índice ON tabela (coluna [ASC | DESC]); • UNIQUE Índice não aceita valores repetidos. • É criado um índice UNIQUE sempre que uma Primary Key é criada. • Apagando o índice DROP INDEX índice; Exemplo select index_name from user_indexes; CREATE UNIQUE INDEX my_index ON partida (nome_juiz); select index_name from user_indexes; Linguagem de manipulação de dados • Inserindo dados INSERT INTO [esquema.]tabela (coluna1, coluna2, ... colunaN) VALUES (valor1, valor2 ... valorN); Inserindo dados • Se for inserir na mesma ordem da definição da tabela: INSERT INTO [esquema.]tabela VALUES (valor1, ... valorN); • Inserção em determinados campos INSERT INTO [esquema.]tabela (colunaX, colunaY) VALUES (valorX, valorY); Exemplo • Criar o time Saravá Saci Soccer INSERT INTO equipe (codigo_equipe,nome_equipe,cida de,estado) VALUES (1,’SSS’,’São Carlos’, ‘São Paulo’); Opção INSERT INTO equipe VALUES (1, ‘SSS’, ‘São Carlos’, ‘São Paulo’); Exemplo • Inserir time “Tiradentes”, de Brasília, DF INSERT INTO equipe VALUES (2,’Tiradentes’,’Brasilia’,’DF’); • Inserir time “Enc97FC” INSERT INTO equipe (codigo_equipe, nome_equipe) VALUES (3,’Enc97FC’); Inserindo dados • Cuidados com as restrições (constraints)! INSERT INTO JOGADOR VALUES (1,’Juliano’,’goleiro’,4); INSERT INTO equipe (codigo_equipe, nome_equipe) VALUES (4, ‘Selecao’); INSERT INTO JOGADOR VALUES (1,’Juliano’,’goleiro’,4); Atualizando dados UPDATE tabela SET coluna = valor [, coluna = valor...] [WHERE condição]; • Exemplo: Juliano mudou para atacante! UPDATE jogador SET posicao_jog = ‘atacante’ where codigo_jogador = 1; Apagando dados DELETE [FROM] tabela [WHERE condição]; • Exemplo: Apagar Enc97FC DELETE FROM equipe WHERE codigo_equipe = 3; Apagando dados • Cuidados com as restrições (constraints)! DELETE FROM equipe WHERE codigo_equipe = 4; FALHA! DELETE jogador; DELETE FROM equipe WHERE codigo_equipe = 4; OK! Consultando dados: SELECT • Até o final da aula! • Álgebra relacional • Endereço do script http://www.dc.ufscar.br/~juliano • Execução do script sqlplus> @ sql.txt Selecionando dados • Forma básica: SELECT <lista de atributos> FROM <lista de tabelas> WHERE <condição> Selecionando dados SELECT [DISTINCT] {*, colunas [AS alias], expressões, funções..} FROM {tabelas [AS alias]} [WHERE condição] [GROUP BY colunas] [HAVING condição] [ORDER BY colunas [ASC | DESC]]; Álgebra Relacional • π(*) jogador SELECT DISTINCT * FROM jogador; • σ(posicao_jog = atacante) jogador SELECT * FROM jogador WHERE posicao_jog = ‘Atacante’; Álgebra Relacional • πnome_jogador(σ(posicao_jog = Atacante)Jogador) SELECT DISTINCT nome_jogador FROM jogador where posicao_jog = ‘Atacante’; • ρNome(πnome_jogador(σ(posicao_jog = Atacante)Jogador)) SELECT DISTINCT nome_jogador AS Nome FROM jogador where posicao_jog = ‘Atacante’; União • R1 πnome_jogador(σ(posicao_jog = Atacante)Jogador) • R2 πnome_jogador(σ(codigo_equipe = 2)Jogador) • Resultado R1 U R2 SELECT DISTINCT nome_jogador FROM jogador WHERE posicao_jog = ‘Atacante’ UNION SELECT DISTINCT nome_jogador FROM jogador WHERE codigo_equipe = 2; Interseção • R1 πnome_jogador(σ(posicao_jog = Atacante)Jogador) • R2 πnome_jogador(σ(codigo_equipe = 2)Jogador) • Resultado R1 ∩ R2 SELECT DISTINCT jogador WHERE ‘Atacante’ INTERSECT SELECT DISTINCT jogador WHERE nome_jogador FROM posicao_jog = nome_jogador FROM codigo_equipe = 2; Subtração • R1 πnome_jogador(σ(posicao_jog = Atacante)Jogador) • R2 πnome_jogador(σ(codigo_equipe = 2)Jogador) • Resultado R1 – R2 SELECT DISTINCT jogador WHERE ‘Atacante’ MINUS SELECT DISTINCT jogador WHERE nome_jogador FROM posicao_jog = nome_jogador FROM codigo_equipe = 2; Produto Cartesiano • R1 πnome_jogador(π(*) Jogador) • R2 πnome_equipe(π(*) Equipe) • Resultado R1 × R2 SELECT DISTINCT nome_jogador, nome_equipe FROM jogador, equipe; Join (Equijoin) • R1 π(*) Jogador • R2 π(*) Equipe • Resultado R1 |x|equipe.codigo_equipe = jogador.codigo_equipe R2 SELECT * FROM jogador, equipe WHERE equipe.codigo_equipe = jogador.codigo_equipe; Theta Join • R1 π(*) Jogador • R2 π(*) Equipe • Resultado R1 |x|equipe.codigo_equipe > jogador.codigo_equipe R2 SELECT * FROM jogador, equipe WHERE equipe.codigo_equipe > jogador.codigo_jogador; Natural Join • R1 πnome_jogador, codigo_equipe(π(*) Jogador) • R2 πnome_equipe, codigo_equipe(π(*) Equipe) • Resultado πnome_jogador,nome_equipe( R1 *codigo_equipe R2) SELECT DISTINCT nome_jogador, nome_equipe, codigo_equipe FROM jogador, equipe WHERE equipe.codigo_equipe = jogador.codigo_equipe; Outer Join ]x| • R1 πnome_jogador, codigo_equipe(π(*) Jogador) • R2 πnome_equipe, codigo_equipe(π(*) Equipe) • Resultado πnome_jogador,nome_equipe( R1 ]x|equipe.codigo_equipe = jogador.codigo_equipe R2) SELECT nome_jogador, nome_equipe FROM jogador, equipe WHERE equipe.codigo_equipe (+) = jogador.codigo_jogador; Divisão • Todos os jogadores que fizeram gol em partidas onde Fabio Simplicio fez gol Fabio σnome_jogador = ‘Fabio Simplicio’(Jogador) F_Par πcodigo_partida(Joga |x|joga.codigo_jogador = Fabio.codigo_jogador Fabio) Jog_Par πcodigo_jogador,codigo_partida(Joga) Result Jog_Par F_Par Divisão SELECT * FROM jogador WHERE nome_jogador = ‘Fabio Simplicio’; SELECT DISTINCT codigo_partida FROM joga WHERE codigo_jogador = 51; SELECT DISTINCT codigo_jogador, codigo_partida FROM joga; SELECT DISTINCT codigo_jogador FROM joga WHERE (codigo_partida = 1 OR codigo_partida = 5) AND (codigo_jogador != 51); Outras consultas • Cobrimos todos os operadores da álgebra relacional. • Veremos agora outros tipos de consultas comuns em SGBDs relacionais. Consultas úteis • Várias condições SELECT nome_jogador FROM Jogador WHERE posicao_jog = ‘Goleiro’ AND codigo_equipe != 2; SELECT nome_jogador FROM Jogador WHERE posicao_jog = ‘Goleiro’ OR posicao_jog = ‘Atacante’; Consultas úteis • DISTINCT SELECT DISTINCT posicao_jog FROM jogador; • LIKE SELECT nome_jogador FROM jogador WHERE nome_jogador LIKE ‘%Luis%’; Consultas úteis • Operadores Matemáticos SELECT codigo_partida, numero_gols * 10 FROM joga; • BETWEEN SELECT codigo_jogador, nome_jogador FROM jogador WHERE codigo_jogador BETWEEN 10 AND 20; Consultas úteis • IN SELECT nome_jogador FROM jogador WHERE codigo_jogador IN (SELECT codigo_jogador FROM joga WHERE numero_gols = 2); • ALL SELECT codigo_jogador FROM joga WHERE numero_gols > ALL (SELECT numero_gols FROM joga WHERE codigo_partida = 2); Consultas úteis • EXISTS SELECT nome_jogador FROM jogador WHERE EXISTS (SELECT * FROM joga WHERE jogador.codigo_jogador = joga.codigo_jogador); • NOT SELECT nome_jogador FROM jogador WHERE NOT EXISTS (SELECT * FROM joga WHERE jogador.codigo_jogador = joga.codigo_jogador); Consultas úteis • SUM, MAX, MIN, AVG SELECT SUM(numero_gols), MAX(numero_gols), MIN(numero_gols), AVG(numero_gols) FROM joga; • COUNT SELECT COUNT(*)FROM jogador WHERE codigo_equipe = 1; Consultas úteis • GROUP BY SELECT COUNT(*), codigo_equipe FROM jogador GROUP BY codigo_equipe; • HAVING SELECT COUNT(*), codigo_equipe FROM jogador GROUP BY codigo_equipe HAVING COUNT(*) > 30; Consultas úteis • IS [NOT] NULL SELECT * FROM partida WHERE nome_juiz IS NULL; SELECT * FROM partida WHERE nome_juiz IS NOT NULL; Exercícios (desafios) • Selecione os nomes das equipes que fizeram gols nos jogos apitados por Silvia πnome_equipe(σ(nome_juiz = ‘Silvia’)( (((Partida |x|partida.codigo_partida joga.codigo_partidaJoga) |x|codigo_jogador = jogador.codigo_jogadorJogador) |x|codigo_equipe = equipe.codigo_equipeEquipe) ) Exercícios (desafios) • Selecione os nomes das equipes que fizeram gols nos jogos apitados por Silvia SELECT DISTINCT nome_equipe FROM equipe e, jogador j, partida p, joga WHERE p.nome_juiz ='Silvia' AND p.codigo_partida = joga.codigo_partida AND joga.codigo_jogador = j.codigo_jogador AND j.codigo_equipe = e.codigo_equipe; Exercícios (desafios) • Selecione os nomes das equipes que fizeram gols nos jogos apitados por Silvia NOME_EQUIPE -------------------Sao Paulo Exercícios (desafios) • Daqueles jogadores que marcaram gols, selecione o nome daqueles que não marcaram gols em Santos SELECT DISTINCT nome_jogador FROM jogador j, joga WHERE joga.codigo_jogador = j.codigo_jogador AND j.codigo_jogador NOT IN (SELECT codigo_jogador FROM joga, partida p WHERE p.cidade = ‘Santos’ AND joga.codigo_partida = p.codigo_partida); Exercícios (desafios) • Daqueles jogadores que marcaram gols, selecione o nome daqueles que não marcaram gols em Santos NOME_JOGADOR -------------------Anderson Carlos Alberto Diego Fabio Simplicio Leandro Amaral Nenem William 7 linhas selecionadas. Exercícios (desafios) • Quantos gols cada equipe já fez? SELECT nome_equipe, SUM(numero_gols) FROM equipe e, joga, jogador j WHERE e.codigo_equipe = j.codigo_equipe AND j.codigo_jogador = joga.codigo_jogador GROUP BY nome_equipe; Exercícios (desafios) • Quantos gols cada equipe já fez? NOME_EQUIPE SUM(NUMERO_GOLS) -------------------- ---------------Corinthians 2 Santos 6 Sao Paulo 7 Exercícios (desafios) • Quem são, para que time jogam, os jogadores que fizeram gols em mais de um jogo? SELECT nome_jogador, nome_equipe FROM jogador j, equipe e WHERE j.codigo_equipe = e.codigo_equipe AND (SELECT COUNT(*) FROM joga WHERE j.codigo_jogador = joga.codigo_jogador) > 1; Exercícios (desafios) • Quem são, para que time jogam, os jogadores que fizeram gols em mais de um jogo? NOME_JOGADOR -------------------Fabio Simplicio Luis Fabiano NOME_EQUIPE -------------------Sao Paulo Sao Paulo