Programa DCC011 Introdução a Banco de Dados SQL select Mirella M. Moro Departamento de Ciência da Computação Universidade Federal de Minas Gerais mirella@dcc.ufmg.br Introdução Conceitosbásicos, característicasda abordagemde banco de dados, modelosde dados, esquemase instâncias, arquiteturade um sistemade banco de dados, componentesde um sistemade gerênciade banco de dados. Modelos de dados e linguagens Modeloentidade-relacionamento(ER), modelorelacional, álgebra relacional, SQL. Projetode bancosde dados Fasesdo projetode bancosde dados, projetológicode bancos de dados relacionais, normalização. Novas Tecnologias e Aplicações de Banco de Dados 2 SQL: Consultas 0. Exemplos 1. Consultas Básicas 2. Facilidades Adicionais 3. Consultas Complexas Problema Dado um conjunto de tabelas e seus dados Como recuperar os dados? Como realizar consultas a esses dados? Me diz aí os nomes das alunas do curso de Ciência da Computação ordenados alfabeticamente ALUNOS Matr Nome Sexo Cur 1 A F CC 2 B M CC 3 C M CC 4 D F MC 5 E M MC 6 F M SI 7 G F SI 8 H F SI 9 I M SI 10 J M ECA 4 Solução: SQL select-from Solução: SQL select-from-where 1. SELECT Matr 2. SELECT Cur 3. SELECT Matr, Cur 4. SELECT Matr, Nome, Sexo, Cur 5. SELECT * 1. SELECT Matr FROM ALUNOS WHERE Sexo = F ; 2. SELECT Nome FROM ALUNOS WHERE Sexo = F AND Cur = SI ; 3. SELECT Matr FROM ALUNOS WHERE Sexo = F AND Cur <> CC ; 5 6
Mais Problemas 1. Nomes de todos os alunos acompanhados dos nomes de seus cursos 2. Nomes de todos os alunos acompanhados das disciplinas matriculadas neste semestre 7 ALUNOS Matr Nome Sexo Cur 1 A F CC 2 B M CC 3 C M CC 4 D F MC 5 E M MC 6 F M SI 7 G F SI 8 H F SI 9 I M SI 10 J M ECA CURSOS Cur Nome Depto Coord CC MC SI ECA Ciência da Computação DCC RG Matemática Computacional DCC TN Sistemasde Informação DCC CDJ Engenharia de Controle e ENG XYZ Automação MATRICULAS Matr Disc T Sem 1 DCC011 Z 20162 1 DCC851 A 20162 1 DCC834 A 20161 2 DCC011 Z 20161............ 8 Em formato texto ALUNOS (Matr, Nome, Sexo, Cur) Cur referencia CURSOS CURSOS (Cur, Nome, Depto, Coord) Depto referencia DEPARTAMENTOS Coord referencia PROFESSORES MATRICULAS (Matr, Disc, T, Sem) Matr referencia ALUNOS Disc referencia DISCIPLINAS DEPARTAMENTOS (...) PROFESSORES (...) DISCIPLINAS (...) Mais Problemas 1. Nomes de todos os alunos acompanhados dos nomes de seus cursos 9 10 Mais Problemas Mais Problemas 1. Nomes de todos os alunos acompanhados dos nomes de seus cursos SOLUÇÃO A SELECT Nome, Nome FROM ALUNOS, CURSOS; SOLUÇÃO B SELECT ALUNOS.Nome, CURSOS.Nome FROM ALUNOS, CURSOS; SOLUÇÃO C SELECT A.Nome, C.Nome FROM ALUNOS as A, CURSOS as C; SOLUÇÃO D SELECT A.Nome, C.Nome FROM ALUNOS as A, CURSOS as C WHERE A.Cur = C.Cur; 2. Nomes de todos os alunos acompanhados das disciplinas matriculadas neste semestre 11 12
Mais Problemas 2. Nomes de todos os alunos acompanhados das disciplinas matriculadas neste semestre SOLUÇÃO A SELECT Nome, Disc FROM ALUNOS, MATRICULAS; SOLUÇÃO B SELECT Nome, Disc FROM ALUNOS, MATRICULAS WHERE Sem= 20162 ; SOLUÇÃO C SELECT Nome, Disc FROM ALUNOS, MATRICULAS WHERE Sem= 20162 AND ALUNOS.Matr = MATRICULAS.Matr; Organizando as Ideias 13 1. Formato básico do comando SELECT: SELECT <lista de atributos> FROM <lista de tabelas> [ WHERE <condição>; ] Exemplo: EM PORTUGUÊS EMPREGADO (ssn, pnome, minicial, unome, datanasc, endereco, sexo, salario, superssn, dno) superssn REFERENCIA EMPREGADO dno REFERENCIA DEPARTAMENTO DEPARTAMENTO (dnumero, dnome, gerssn, gerdatainicio) gerssn REFERENCIA EMPREGADO.ssn SELECT datanast, endereco FROM EMPREGADO WHERE pnome= John AND minicial= B AND unome= Smith ; π Bdate,Address σ Fname= John AND Minit= B AND Lname= Smith (EMPLOYEE) 15 (Q8) B. Atributos Ambíguos e Pseudônimos (alias) SELECT dname, dlocation FROM DEPARTMENT, DEPT_LOCATIONS WHERE DEPARTMENT.dnumber = DEPT_LOCATIONS.dnumber; SELECT e.fname, e.lname, s.fname, s.lname FROM EMPLOYEE ASE, EMPLOYEE ASS WHERE e.superssn=s.ssn; EM INGLÊS PROJECT (pnumber, pname, plocation, dnum) dnum REFERENCIA DEPARTAMENT DEPT_LOCATIONS (dnumber,dlocation) dnumber REFERENCIA DEPARTAMENT 16 (Q2) B. Atributos Ambíguos e Pseudônimos (alias) SELECT pnumber, dnum, lname, address, bdate PROJECT P, DEPARTMENT D, EMPLOYEE E WHERE plocation= Stafford AND FROM C. SELECT FROM sem owhere SELECT ssn, lname, salary condição de seleção D.dnum=P.dnum AND D.mgrssn=E.ssn; (Q10) SELECT lname, dname condição de junção π pnumber,dnum,lname,address,bdate σ plocation= Stafford (EMPLOYEE ssn=mgrssn (DEPARTMENT PROJECT)) PROJECT (pnumber, pname, plocation, dnum) dnum DCC011 REFERENCIA - profa. Mirella M. Moro DEPARTAMENT 17 WHERE dno=dnumber; com a junção Atenção! A consulta em vermelho corresponde a um produto cartesiano das tabelas EMPLOYEE e DEPARTMENT : π lname,dname (EMPLOYEE x DEPARTMENT) 18
(Q1C) (Q1D) D. TODOS OS ATRIBUTOS Consultas a todos os atributos SELECT * FROM EMPLOYEE WHERE Dno=5; SELECT* WHERE Dname= Research AND Dno=Dnumber; E. TABELAS COMO CONJUNTOS SQL trata uma tabela como um multi-conjunto Tuplas duplicadas PODEM aparecer em uma tabela E no resultadode uma consulta SQL não elimina automaticamente as duplicatas porque Eliminação de duplicatas é uma operação cara (ordenar) O usuário pode estar interessado nelas Funções de agregação utilizam duplicatas (funções de agregação serão explicadas a seguir) Operações SELECT DISTINCT, SELECT ALL : UNION, : EXCEPT, : INTERSECT 19 20 (Q11) (Q4) Tabelas como Conjuntos SELECT salary Não elimina linhas (tuplas) duplicatas Para eliminar precisa usar DISTINCT, por exemplo: SELECT DISTINCT salary PROJECT (pnumber, pname, plocation, dnum) dnum REFERENCIA DEPARTAMENT (SELECT pnumber FROM PROJECT, DEPARTMENT, EMPLOYEE WHEREdnum=dnumber AND mgrssn=ssn AND lname= Smith ) UNION (SELECT pnumber FROM PROJECT, WORKS_ON, EMPLOYEE WHEREpnumber=pno AND essn=ssn AND lname= Smith ); 21 2. Facilidades Adicionais Uso do operador JOIN, na cláusula FROM SELECT FNAME, LNAME, ADDRESS FROM (EMPLOYEE JOINDEPARTMENT ON DNO=DNUMEBR) WHERE DNAME= Research ; A cláusula FROM contém então uma única tabela resultante da junção de Empregado e Departamento 22 Facilidades Adicionais Facilidades Adicionais Pode-se especificar outros tipos de junção na cláusula FROM Junção natural: equijoin em cada par de atributos com o mesmo nome SELECT DNAME, DLOCATION FROM (DEPARTMENT NATURAL JOIN DEPT_LOCATIONS); Renomeando atributos para o natural join: SELECT pnome, unome, dnome FROM (EMPREGADO NATURAL JOIN (DEPARTMENTO AS DEPT (dno, dnome, gerssn, gerdatainicio))) WHERE dnome = Pesquisa ; DEPT_LOCATIONS (dnum, dlocal) dnum REFERENCIA DEPARTAMENT 23 EMPREGADO (ssn, pnome, minicial, unome, superssn, dno) superssn REFERENCIA EMPREGADO dno REFERENCIA DEPARTAMENTO DEPARTAMENTO (dnumero, dnome, gerssn, gerdatainicio) gerssn REFERENCIA EMPREGADO.ssn 24
Facilidades Adicionais SELECT fname, lname, dependent_name FROM(EMPLOYEE JOIN DEPENDENT ONssn=essn); [INNER] JOIN..ON: pares empregado/dependente OUTERJOIN..ON: pares + empregadosquenãotêm dependente [NATURAL] LEFT/RIGHT/FULL OUTER JOIN.. ON SELECT fname, lname, dependent_name FROM(EMPLOYEE LEFT OUTER JOIN DEPENDENT ONssn=essn); 25 Outer Join Matr Cur 1 CC INSERE dois cursos{enf,med} select A.Matr, C.Curfrom ALUNOS A RIGHT OUTER JOIN CURSOS C ON A.Cur=C.Cur SE a únicacolunaemcomumfosse Cur: select A.Matr, C.Cur from ALUNOS A NATURAL RIGHT OUTER JOIN CURSOS C 2 CC 3 CC 4 MC 5 MC 6 SI 7 SI 8 SI 9 SI 10 ECA null null ENF MED 26 Cuidado com o número de colunas do resultado quando se realiza junção natural NATURAL JOIN NATURAL LEFT OUTER JOIN NATURAL RIGHT OUTER JOIN PraticandoSQL Item(Cod_Item, Descricao, Preco_Unit) Pedido(Num_Pedido, Data, Cod_Cliente, Valor_Total), Cod_Cliente--> Cliente Item_Pedido(Num_Pedido, Cod_Item, Quantidade) Num_Pedido--> Pedido, Cod_Item--> Item SQL #Colunas #Linhas select* from Item, Item_Pedido 6 234 select * from Item I, Item_PedidoIP where I.Cod_Item=IP.Cod_Item 6 18 select * from Item NATURAL JOIN Item_Pedido 5 18 select* fromitem I JOINItem_PedidoIP? 6 18 ON I.Cod_Item=IP.Cod_Item select * from (Item I LEFT OUTER JOIN Item_PedidoIP 6 19 ON I.Cod_Item=IP.Cod_Item) select * from (Item NATURAL OUTER JOIN Item_Pedido) 5 19 27 28 A B A B FROM A LEFT JOIN B A B FROM A LEFT JOIN B WHERE B.key IS NULL SQL JOINS A FROM A INNER JOIN B A B A B FROM A FULL OUTER JOIN B B FROM A FULL OUTER JOIN B WHERE A.key IS NULL OR B.key IS NULL FROM A RIGHT JOIN B A B FROM A RIGHT JOIN B WHERE A.key IS NULL 29 Facilidades Adicionais B. FUNÇÕES DE AGREGAÇÃO Funções de agregação: COUNT, SUM, MAX, MIN, AVG SELECT SUM(SALARY), MAX(SALARY), MIN(SALARY), AVG(SALARY) SELECT SUM(SALARY), MAX(SALARY), MIN(SALARY), AVG(SALARY) WHERE DNO=DNUMBER AND DNAME= Research ; SELECT COUNT(*) WHERE DNO=DNUMBER AND DNAME= Research ; 30
Exemplos funções agregação select count(*) from ALUNOS; select count(*) as Qtde from ALUNOS where sexo = F ; select max(matr) as max, min(matr) as min from ALUNOS; select sum(matr) as sum, avg(matr) as avg from ALUNOS where sexo = F ; max count(*) 10 Qtde 4 min 10 1 sum avg 20 5 31 DEPARTMENT(DNAME, DNUMBER, MGRSSN, MGRSTARTDATE) mgrssn é o gerente MGRSSN referencia EMPLOYEE DEPENDENT(ESSN, DEPENDENT_NAME, SEX, BDATE, RELATIONSHIP) ESSN referencia EMPLOYEE DEPT_LOCATIONS(DNUMBER, DLOCATION) DNUMBER referencia DEPARTMENT EMPLOYEE(FNAME, MINIT, LNAME,SSN, BDATE, ADDRESS, SEX, SALARY, SUPERSSN, DNO) SUPERSSN referencia EMPLOYEE; DNO referencia DEPARTMENT PROJECT(PNAME, PNUMBER, PLOCATION, DNUM) DNUM referencia DEPARTMENT WORKS_ON(ESSN, PNO, HOURS) ESSN referencia EMPLOYEE ; PNO referencia PROJECT Exercícios podem ser executados no site www.lbd.dcc.ufmg.br/praticandosql selecionar o banco de dados COMPANY 1. Retorne o SSN dos empregados: a. que trabalham no departamento 4; b. que trabalham no departamento 4 ou 5; c. que trabalham no departamento gerenciado pelo empregado 987654321; d. que trabalham mais de 9 horas no projeto 10; 2. Retorne o total de horas que o empregado 333445555 trabalha em projetos; 3. Retorne o máximo, mínimo e média de horas que os empregados trabalham no projeto 30; 4. Retorne todos os projetos (incluindo os sem empregados) seguidos do ssn dos seus empregados; 32 SSN dos empregados: a. quetrabalhamno departamento 4; SSN dos empregados: c. quetrabalhamno departamento gerenciado pelo empregado 987654321; b. quetrabalhamno departamento 4 ou 5; d. quetrabalhammaisde 9 horas no projeto 10; 33 34 2. Retorneo total de horas que o empregado 333445555 trabalha em projetos; 3. Retorneo máximo, mínimoe médiade horasqueos empregados trabalham no projeto 30; 4. Retorne todos os projetos(incluindo os semempregados) seguidosdo ssndos seus empregados; Revisão: definição de dados Comando CREATE SCHEMA CREATE SCHEMA COMPANY AUTHORIZATION JS; Comando CREATE TABLE CREATE TABLE <nome da tabela> (<definições de colunas> <definição da chave primária> <definições de chaves alternativas> <definições de chaves estrangeiras>); 35 36
Revisão: definição de dados Revisão: restrição de integridade Opções de remoção (cláusula ON DELETE): CASCADE (propagação) SET NULL (substituição por nulos) SET DEFAULT (substituição por um valor default) Opção default: bloqueio (RESTRICT) As mesmas opções se aplicam à cláusula ON UPDATE 37 38 Revisão: drop e alter Comandos DROP SCHEMAeDROP TABLE DROP SCHEMA COMPANY CASCADE (RESTRICT); RESTRICT: apenas se não tem elementos DROP TABLE DEPENDENT CASCADE (RESTRICT); RESTRICT: se a tabela não é referenciada em qualquer restrição ou visão Comando ALTER TABLE ALTER TABLE COMPANY.EMPLOYEE ADD JOB VARCHAR(12); Inicialmente Null para todas as tuplas ALTER TABLE COMPANY.EMPLOYEE DROP ADDRESS CASCADE (RESTRICT); RESTRICT: se nenhuma visão ou restrição referencia a coluna Consultas básicas e Álgebra Operações Básicas Seleção(σ) Seleciona em sub-conjunto de linhas da relação FROM, WHERE Projeção(π) Mantém apenas colunas específicas SELECT Junção: WHERE 39 40 A. SELECT FROM WHERE (Q1) SELECT fname,lname,address FROM EMPLOYEE, DEPARTAMENT WHERE dname= Research AND dno=dnum; condição de seleção condição de junção π fname,lname,address σ dname= Research (EMPLOYEE dno=dnum DEPARTMENT) 41