A Linguagem SQL Introdução Originalmente proposta para o System R desenvolvido nos laboratórios da IBM na década de 70 SEQUEL (Structured English QUEry Language) Objeto de um esforço de padronização coordenado pelo ANSI/ISO: SQL1 (SQL-86) SQL2 (SQL-92) SQL3 (SQL-99) 1
Introdução SQL = LDD + LMD + LCD Principais comandos: LDD: CREATE SCHEMA / TABLE / VIEW DROP SCHEMA / TABLE / VIEW ALTER TABLE LMD: SELECT, INSERT, UPDATE, DELETE LCD: GRANT, REVOKE Do ponto de vista de consulta, SQL é uma linguagem relacionalmente completa, ou seja, possui o mesmo poder de expressão da álgebra e do cálculo relacional Definição de Dados em SQL Comando CREATE SCHEMA CREATE SCHEMA COMPANY AUTORIZATION 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>); CREATE TABLE <esquema>.<nome da tabela> 2
Definição de Dados em SQL Exemplo de um comando CREATE TABLE CREATE TABLE EMPLOYEE (FNAME VARCHAR(15) NOT NULL, MINIT CHAR, LNAME VARCHAR(15) NOT NULL, SSN CHAR(9) NOT NULL, SUPERSSN CHAR(9), DNO INT NOT NULL, PRIMARY KEY (SSN), FOREIGN KEY (SUPERSSN) REFERENCES EMPLOYEE (SSN) ON DELETE SET NULL, FOREIGN KEY (DNO) REFERENCES DEPARTMENT (DNUMBER)); Definição de Dados em SQL Comando CREATE DOMAIN CREATE DOMAIN TIPO_SSN AS CHAR(9); CREATE TABLE EMPLOYEE (... SSN TIPO_SSN NOT NULL,...); Especificação de restrições sobre atributos DNUMBER INT NOT NULL CHECK (DNUMBER > 0 AND DNUMBER < 21) Alternativamente: CREATE DOMAIN D_NUMBER AS INTEGER CHECK (D_NUMBER > 0 AND D_NUMBER < 21); CREATE TABLE DEPARTMENT (DNAME VARCHAR(15) NOT NULL, DNUMBER D_NUMBER NOT NULL,...); 3
Definição de Dados em SQL 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 Entretanto esta cláusula NÃO deve ser utilizada para se evitar que as chaves primárias sejam modificadas Definição de Dados em SQL Restrição de Integridade Referencial FOREIGN KEY (SUPERSSN) REFERENCES EMPLOYEE(SSN) ON DELETE SET NULL FOREIGN KEY (DNO) REFERENCES DEPARTMENT(DNUMBER) FOREIGN KEY (MGRSSN) REFERENCES EMPLOYEE(SSN) FOREIGN KEY (DNUMBER) REFERENCES DEPARTMENT(DNUMBER) ON DELETE CASCADE FOREIGN KEY (DNUM) REFERENCES DEPARTMENT(DNUMBER) FOREIGN KEY (ESSN) REFERENCES EMPLOYEE(SSN) FOREIGN KEY (PNO) REFERENCES PROJECT(PNUMBER) FOREIGN KEY (ESSN) REFERENCES EMPLOYEE(SSN) ON DELETE CASCADE 4
Definição de Dados em SQL Restrição de Integridade Referencial Definição de Dados em em SQL Restrição de Integridade Referencial CREATE TABLE EMPLOYEE ( SSN CHAR(9) NOT NULL, SUPERSSN CHAR(9), DNO INT NOT NULL DEFAULT 1, PRIMARY KEY (SSN), FOREIGN KEY (SUPERSSN) REFERENCES EMPLOYEE (SSN) ON DELETE SET NULL, FOREIGN KEY (DNO) REFERENCES DEPARTMENT (DNUMBER) ON DELETE SET DEFAULT ON UPDATE CASCADE); 5
Definição de Dados em em SQL Restrição de Integridade Referencial CREATE TABLE EMPLOYEE (, DNO INT NOT NULL DEFAULT 1, CONSTRAINT EMPPK PRIMARY KEY (SSN), CONSTRAINT EMPSUPERFK FOREIGN KEY (SUPERSSN) REFERENCES EMPLOYEE (SSN) ON DELETE SET NULL, CONSTRAINT EMPDEPTFK FOREIGN KEY (DNO) REFERENCES DEPARTMENT (DNUMBER) ON DELETE SET DEFAULT ON UPDATE CASCADE); Definição de Dados em SQL Comandos para Modificação de Esquema Comandos DROP SCHEMA e DROP TABLE DROP SCHEMA COMPANY CASCADE; DROP TABLE DEPENDENT CASCADE; Comando ALTER TABLE ALTER TABLE COMPANY.EMPLOYEE ADD JOB VARCHAR(12); ALTER TABLE COMPANY.EMPLOYEE DROP ADDRESS CASCADE; 6
Consultas Básicas em SQL Formato básico do comando SELECT: SELECT <lista de atributos> FROM <lista de tabelas> WHERE <condição>; Exemplo: SELECT BDATE, ADDRESS FROM EMPLOYEE WHERE FNAME= John AND MINIT= B AND LNAME= Smith ; Consultas Básicas em SQL SELECT FNAME, LNAME, ADDRESS FROM EMPLOYEE, DEPARTMENT WHERE DNAME= Research AND DNO=DNUMBER; condição de seleção condição de junção SELECT PNUMBER, DNUM, LNAME, ADDRESS, BDATE FROM PROJECT, DEPARTMENT, EMPLOYEE WHERE PLOCATION= Stafford AND DNUM=DNUMBER AND MGRSSN=SSN; 7
Consultas Básicas em SQL 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 AS E, EMPLOYEE AS S WHERE E.SUPERSSN=S.SSN; Consultas Básicas em SQL Consultas sem a cláusula WHERE SELECT SSN, LNAME, SALARY FROM EMPLOYEE; SELECT LNAME, DNAME FROM EMPLOYEE, DEPARTMENT WHERE DNO=DNUMBER; Atenção: A ausência da cláusula WHERE torna a consulta acima um produto cartesiano das tabelas EMPLOYEE e DEPARTMENT. 8
Consultas Básicas em SQL Manipulando tabelas como conjuntos SELECT SALARY FROM EMPLOYEE; Não elimina linhas (tuplas) duplicatas SELECT DISTINCT SALARY FROM EMPLOYEE; (SELECT PNUMBER FROM PROJECT, DEPARTMENT, EMPLOYEE WHERE DNUM=DNUMBER AND MGRSSN=SSN AND LNAME= Smith ) UNION (SELECT PNUMBER FROM PROJECT, WORKS_ON, EMPLOYEE WHERE PNUMBER=PNO AND ESSN=SSN AND LNAME= Smith ); Consultas Complexas em SQL Consultas aninhadas SELECT FNAME, LNAME, ADDRESS FROM EMPLOYEE WHERE DNO IN (SELECT DNUMBER FROM DEPARTMENT WHERE DNAME= Research ); é equivalente à consulta SELECT FNAME, LNAME, ADDRESS FROM EMPLOYEE, DEPARTMENT WHERE DNO=DNUMBER AND DNAME= Research ; 9
Consultas Complexas em SQL Comparação de conjuntos SELECT DISTINCT PNUMBER FROM PROJECT WHERE PNUMBER IN (SELECT PNUMBER FROM PROJECT, DEPARTMENT, EMPLOYEE WHERE DNUM =DNUMEBR AND MGRSSN=SSN AND LNAME= Smith ) OR PNUMBER IN (SELECT PNO FROM WORKS_ON, EMPLOYEE WHERE ESSN=SSN AND LNAME= Smith ); Consultas Complexas em SQL Comparação de conjuntos SELECT DISTINCT ESSN FROM WORKS_ON WHERE (PNO, HOURS) IN (SELECT PNO, HOURS FROM WORKS_ON WHERE ESSN= 123456789 ); SELECT LNAME, FNAME FROM EMPLOYEE WHERE SALARY > ALL (SELECT SALARY FROM EMPLOYEE WHERE DNO=5); 10
Consultas Complexas em SQL Uso da função EXISTS SELECT E.FNAME, E.LNAME FROM EMPLOYEE AS E WHERE EXISTS (SELECT * FROM DEPENDENT WHERE E.SSN=ESSN AND E.SEX=SEX AND E.FNAME=DEPENDENT_NAME); SELECT FNAME, LNAME FROM EMPLOYEE WHERE NOT EXISTS (SELECT * FROM DEPENDENT WHERE SSN=ESSN); Consultas Complexas em SQL Uso do operador CONTAINS SELECT FNAME, LNAME FROM EMPLOYEE WHERE ((SELECT PNO FROM WORKS_ON WHERE SSN=ESSN) CONTAINS (SELECT PNUMBER FROM PROJECT WHERE DNUM=5)); Esta consulta SQL corresponde a uma operação de divisão na álgebra relacional 11
Facilidades Adicionais Uso do operador JOIN SELECT FNAME, LNAME, ADDRESS FROM (EMPLOYEE JOIN DEPARTMENT ON DNO=DNUMBER) WHERE DNAME= Research ; SELECT DNAME, DLOCATION FROM (DEPARTMENT NATURAL JOIN DEPT_LOCATIONS); SELECT FNAME, LNAME, DEPENDENT_NAME FROM (EMPLOYEE LEFT OUTER JOIN DEPENDENT ON SSN=ESSN); Facilidades Adicionais Funções de agregação SELECT SUM(SALARY), MAX(SALARY), MIN(SALARY), AVG(SALARY) FROM EMPLOYEE; SELECT SUM(SALARY), MAX(SALARY), MIN(SALARY), AVG(SALARY) FROM EMPLOYEE, DEPARTMENT WHERE DNO=DNUMBER AND DNAME= Research ; SELECT COUNT(*) FROM EMPLOYEE, DEPARTMENT WHERE DNO=DNUMBER AND DNAME= Research ; 12
Facilidades Adicionais Agrupamento SELECT DNO, COUNT(*), AVG(SALARY) FROM EMPLOYEE GROUP BY DNO; Facilidades Adicionais Agrupamento com a cláusula HAVING SELECT PNUMBER, PNAME, COUNT(*) FROM PROJECT, WORKS_ON WHERE PNUMBER=PNO GROUP BY PNUMBER, PNAME HAVING COUNT(*) > 2; 13
3 3 3 3 14
Atualizações em SQL Comando INSERT INSERT INTO EMPLOYEE VALUES ( Richard, K, Marini, 653258653, 1962-12-30, 98 Oak Forest, Katy, TX,37000, 987654321,4); INSERT INTO EMPLOYEE(FNAME, LNAME, SSN, DNO) VALUES ( Richard, Marini, 653258653,4); INSERT INTO EMPLOYEE(FNAME, LNAME, SSN, DNO) SELECT * FROM INPUT; Atualizações em SQL Comando DELETE DELETE FROM EMPLOYEE WHERE LNAME= Brown ; DELETE FROM EMPLOYEE WHERE DNO IN (SELECT DNUMBER FROM DEPARTMENT WHERE DNAME= Research ); DELETE FROM EMPLOYEE; 15
Atualizações em SQL Comando UPDATE UPDATE PROJECT SET PLOCATION= Bellaire, DNUM=5 WHERE PNUMBER=10; UPDATE EMPLOYEE SET SALARY=SALARY*1.1 WHERE DNO IN (SELECT DNUMBER FROM DEPARTMENT WHERE DNAME= Research ); Visões em SQL Uma visão em SQL é uma tabela derivada de tabelas base (definidas no esquema) de um banco de dados ou de visões previamente definidas Comando CREATE VIEW CREATE VIEW <nome da visão> [(<atributos>)] AS <comando SELECT>; Visões simplificam a interface com o usuário e constituem um mecanismo eficiente de seguraça 16
Visões em SQL Exemplos: WORKS_ON1(FNAME, LNAME, PNAME, HOURS) CREATE VIEW WORKS_ON1 AS SELECT FNAME, LNAME, PNAME, HOURS FROM EMPLOYEE, PROJECT, WORKS_ON WHERE SSN=ESSN AND PNO=PNUMBER; DEPT_INFO (DEPT_NAME, NO_OF_EMPS, TOTAL_SAL) CREATE VIEW DEPT_INFO (DEPT_NAME, NO_OF_EMPS, TOTAL_SAL) AS SELECT DNAME, COUNT(*), SUM(SALARY) FROM DEPARTMENT, EMPLOYEE WHERE DNUMBER=DNO GROUP BY DNAME; Visões em SQL Visões podem ser consultadas como qualquer outra tabela SELECT LNAME, HOURS FROM WORKS_ON1 WHERE PNAME= ProductX ; Visões sempre refletem o estado do banco de dados não são materializadas quando definidas 17
Implementação de Visões Processamento de uma consulta sobre uma visão depende da estratégia adotada para sua implementação Materizalização da visão (view materialization) A consulta é executada diretamente sobre a visão materializada Modificação da consulta (query modification) A consulta é modificada de acordo com a definição da visão e então executada sobre o banco de dados Implementação de Visões Estratégia de modificação da consulta SELECT LNAME, HOURS FROM WORKS_ON1 WHERE PNAME= ProductX ; SELECT LNAME, HOURS FROM EMPLOYEE, PROJECT, WORKS_ON WHERE SSN=ESSN AND PNO=PNUMBER AND PNAME= ProductX ; 18
Atualização de Visões Em geral, visões não podem ser atualizadas Por exemplo, seja a seguinte operação de atualização sobre a visão WORKS_ON1: UPDATE WORKS_ON1 SET PNAME= ProductY WHERE LNAME= Smith AND FNAME= John AND PNAME= ProductX ; Como propagar esta atualização para as tabelas base? Atualização de Visões Opções para atualização de WORKS_ON1 Opção 1: UPDATE WORKS_ON SET PNO=(SELECT PNUMBER FROM PROJECT WHERE PNAME= ProductY ) WHERE ESSN=(SELECT SSN FROM EMPLOYEE WHERE LNAME= Smith AND FNAME= John ) AND PNO=(SELECT PNUMBER FROM PROJECT WHERE PNAME= ProductX ); Opção 2 (menos elaborada): UPDATE PROJECT SET PNAME= ProductY WHERE PNAME= ProductX ; 19
Atualização de Visões Visões definidas sobre uma única tabela são atualizáveis se seus atributos incluem a chave primária (ou uma das chave alternativas) da tabela base Visões definidas sobre múltiplas relações através de junções em geral não são atualizáveis Visões definidas usando-se agrupamento e funções de agregação não são atualizáveis Restrições de Integridade Gerais Comando CREATE ASSERTION CREATE ASSERTION SALARY-CONSTRAINT CHECK (NOT EXISTS(SELECT * FROM EMPLOYEE E, EMPLOYEE M, DEPARTMENT D WHERE E.SALARY>M.SALARY AND E.DNO=D.DNUMBER AND D.MGRSSN=M.SSN)); Cláusula CHECK CREATE DOMAIN D_NUMBER AS INTEGER CHECK (D_NUMBER > 0 AND D_NUMBER < 21); 20