Professor Luciano Calderoni Histrico Structured Query Language (SQL) Foi desenvolvido pela IBM em meados dos anos 70 como uma linguagem de manipulao de dados (DML - Data Manipulation Language) para suas primeiras tentativas de desenvolvimento de bancos 2 primeiras tentativas de desenvolvimento de bancos de dados relacionais. O SQL tornou-se de fato o padro depois de 1986, quando o American National Standards Institute (ANSI), a organizao responsvel pelos padres industriais nos Estados Unidos, endossou o SQL como linguagem padro para os bancos de dados relacionais. O que SQL O SGBD (Sistema Gerenciador de Banco de Dados) necessita de uma linguagem que permita aos usurios acesso aos dados. SQL (Structured Query Language) a 3 SQL (Structured Query Language) a linguagem de consulta adotada pela maioria dos SGBDs relacionais. Caractersticas SQL Linguagem English-like Processa conjunto de registros (tabelas) ao invs de registros individuais Padronizada Fornece comandos para uma srie de tarefas, 4 Fornece comandos para uma srie de tarefas, como: Recuperao de dados; Incluso, atualizao e excluso de registros; Criar, modificar e excluir objetos do banco; Etc. Comando SQL Comandos DDL (Data Definition Language) Usados para construir e modificar estruturas de tabelas e outros objetos no BD. Tm efeito imediato. 5 Comandos DML(Data Manipulation Language) Usados para trabalhar com os dados nas tabelas. Seu efeito depende do gerenciamento da transao que executou o comando, que poder ser efetivado ou desfeito. Comandos DDL Os principais comandos DDL so: CREATE: usado para criao de tabelas e outros objetos no Banco de Dados. ALTER: usado para alterar a estrutura das tabelas e outros objetos no Banco de Dados. 6 outros objetos no Banco de Dados. DROP: usado para excluir tabelas e outros objetos do Banco de Dados. ATENO: os comando ALTER e DROP no produzem alterao e excluso de dados, mas sim alterao e excluso de estruturas inteiras! Comandos DML Os principais comandos DML so: INSERT: usado incluir dados nas tabelas do Banco de Dados. UPDATE: usado para alterar os dados armanzenados nas tabelas do Banco de Dados. 7 nas tabelas do Banco de Dados. DELETE: usado para excluir os dados das do Banco de Dados. SELECT: usando para selecionar / consultar dados das tabelas do Banco de Dados. ATENO: No confundir ALTER com UPDATE nem DROP com DELETE! Exemplo EMPREGADO CODIGO:NUMBERNOTNULL CODIGO_SUPERVISOR:NUMBERNULL(FK) NOME:VARCHAR2(128)NOTNULL SEXO:VARCHAR2(1)NOTNULL SALARIO:NUMBERNOTNULL DATA_NASCIMENTO:DATENOTNULL CODIGO_DEPARTAMENTO:NUMBERNOTNULL(FK) DEPENDENTES CODIGO_EMPREGADO:NUMBERNOTNULL(FK) CODIGO_DEPENDENTE:NUMBERNOTNULL NOME:VARCHAR2(128)NOTNULL DATA_NASCIMENTO:DATENOTNULL GRAU_PARENTESCO:VARCHAR2(20)NOTNULL 8 DEPARTAMENTO CODIGO:NUMBERNOTNULL NOME:VARCHAR2(128)NOTNULL DATA_INICIO:DATENOTNULL CODIGO_GERENTE:NUMBERNULL(FK) PROJETO NUMERO:NUMBERNOTNULL NOME:VARCHAR2(128)NOTNULL CODIGO_DEPARTAMENTO:NUMBERNOTNULL(FK) TRABALHA_EM CODIGO_EMPREGADO:NUMBERNOTNULL(FK) NUMERO_PROJETO:NUMBERNOTNULL(FK) HORAS:NUMBERNOTNULL Criando Tabelas CREATE TABLE <nome da tabela> (<descrio dos atributos> <descrio das chaves> <descrio das restries); Descrio dos Aributos: Nome do atributo e Tipo de dados 9 Descrio dos Aributos: Nome do atributo e Tipo de dados (varchar2, char, nvarchar2, nchar, number, number(n), number(m,n), date (data hora) blob, clob, nclob). Descrio das Chaves: Definio das chaves primrias e estrangeiras. Descriao das restries: Definies das restries de integridade adicionais para os atributos. Criando Tabelas Tipos de Restrio (Constraints): Primary Key: usada para definio da Chave Primria de uma tabela. Identificada como tipo P pelo SGBD. Foreign Key: usada para definio das Chaves Estrangeiras de uma tabela. Identificada como tipo R Estrangeiras de uma tabela. Identificada como tipo R pelo SGBD. Check: usada para definio de regras de integridade adicionais sobre os campos de uma tabela (por exemplo, salrio de FUNCIONARIO deve ser maior que 0. Criada automaticamente para os campos NOT NULL, porm, dessa forma, tero nomes automticos tambm. 10 Criando Tabelas Exemplo Constraint Primary Key CONSTRAINT XPKFUNCIONARIO PRIMARY KEY (CODIGO_FUNCIONARIO) Exemplo Constraint Foreign Key CONSTRAINT FK_DEPARTAMENTO_FUNCIONARIO FOREIGN KEY (CODIGO_DEPARTAMENTO) REFERENCES DEPARTAMENTO(CODIGO_DEPARTAMENTO) Exemplo Constraint Foreign Key Exemplo Constraint Foreign Key CONSTRAINT CK_SALARIO_FUNC CHECK (SALARIO > 0) 11 Criando Tabelas CREATE TABLE FUNCIONARIO (CODIGO_FUNCIONARIO NUMBER NOT NULL , NOME VARCHAR2(120) NOT NULL , SALARIO NUMBER NOT NULL, CODIGO_DEPARTAMENTO NUMBER NOT NULL, CONSTRAINT XPKFUNCIONARIO PRIMARY KEY (CODIGO_FUNCIONARIO), CONSTRAINT FK_DEPARTAMENTO_FUNCIONARIO FOREIGN KEY (CODIGO_DEPARTAMENTO) REFERENCES 12 (CODIGO_DEPARTAMENTO) REFERENCES DEPARTAMENTO(CODIGO_DEPARTAMENTO), CONSTRAINT CK_SALARIO_FUNC CHECK (SALARIO > 0) ); ATENO: Para criao da FK de Departamento necessrio que a tabela DEPARTAMENTO j tenha sido criada! Criando Tabelas CREATE TABLE FUNCIONARIO (CODIGO_FUNCIONARIO NUMBER NOT NULL , NOME VARCHAR2(120) NOT NULL , SALARIO NUMBER NOT NULL, CODIGO_DEPARTAMENTO NUMBER NOT NULL); ALTER TABLE FUNCIONARIO ADD CONSTRAINT XPKFUNCIONARIO PRIMARY KEY (CODIGO_FUNCIONARIO); ALTER TABLE FUNCIONARIO ADD CONSTRAINT FK_DEPARTAMENTO_FUNCIONARIO FOREIGN KEY 13 ADD CONSTRAINT FK_DEPARTAMENTO_FUNCIONARIO FOREIGN KEY (CODIGO_DEPARTAMENTO) REFERENCES DEPARTAMENTO(CODIGO_DEPARTAMENTO); ALTER TABLE FUNCIONARIO ADD CONSTRAINT CK_SALARIO_FUNC CHECK (SALARIO > 0); Maneira mais indicada de se criar as tabelas, definindo as Chaves e restries usando comandos ALTER. Dessa forma todas as tabelas so criadas antes e depois so definidas as chaves e restries. Ainda assim uma FK s poder ser criada aps a criao da PK na tabela referenciada! Alterando Tabelas Alm do comando ALTER para criao das chaves e restries, vistos anteriormente, podemos us-lo para alterar a estrutura das tabelas, tal como: Adicionar um novo atributo; 14 Adicionar um novo atributo; Modificar as caractersticas de um atributo; Excluir um atributo; Excluir uma CONSTRAINT (PK, FK ou Check). Alterando Tabelas Adicionando um novo atributo: ALTER TABLE FUNCIONARIO ADD SEXO VARCHAR2(1) NULL; ATENO: Caso a tabela alterada j possua dados, apenas campos NULL podem ser adicionados. Caso seja necessrio um campo NOT NULL devemos usar um valor DEFAULT, como abaixo: ALTER TABLE FUNCIONARIO ADD SEXO VARCHAR2(1) DEFAULT M 15 ALTER TABLE FUNCIONARIO ADD SEXO VARCHAR2(1) DEFAULT M NOT NULL; Modificando as caractersticas de um Atributo: Alterando tamanho do atributo: ALTER TABLE FUNCIONARIO MODIFY NOME VARCHAR2(200); Alterando NULL / NOT NULL: ALTER TABLE FUNCIONARIO MODIFY NOME VARCHAR2(200) NULL; ATENO: Campos NULL s podem ser alterados para NOT NULL se ainda no existirem valores nulos no campo que se deseja alterar. O uso de DEFAULT no funciona para esses casos. Alterando Tabelas Eliminando um atributo: ALTER TABLE FUNCIONARIO DROP COLUMN SEXO; ATENO: Caso o atributo eliminado seja uma PK ele no ser eliminado! Caso o atributo seja uma FK ou possua alguma regra de integridade, tanto o atributo quanto a CONSTRAINT relacionada sero eliminados. 16 Eliminando uma Constraint (PK, FK ou Check) ALTER TABLE FUNCIONARIO DROP CONSTRAINT <NOME_CONSTRAINT>; ATENO: Todas as CONSTRAINTS so eliminadas da mesma forma, bastando informar o nome da mesma, usando no momento de sua criao. A eliminao da CONSTRAINT NO elimina o atributo para o qual a CONSTRAINT foi definida. Esta a forma de alterar os atributos para NULL. Para NOT NULL devemos CRIAR uma CONSTRAINT de Check.. Eliminando Tabelas Para eliminar uma tabela usamos o comando abaixo: DROP TABLE <NOME_TABELA>; DROP TABLE TRABALHA_EM; ATENO: 17 ATENO: Para eliminar uma tabela esta no pode possuir nenhuma referncia, via FK, de outra tabela. Se existir, as referncias para a tabela a ser excluda devero ser eliminadas primeiro (ver eliminado CONSTRAINT, em alterando tabelas). Incluindo Dados Comando INSERT INSERT INTO <tabela> (<lista de atributos>) VALUES (<valores>); INSERT INTO DEPARTAMENTO(CODIGO_DEPARTAMENTO, NOME) VALUES (1, Tecnologia Informao); 18 VALUES (1, Tecnologia Informao); ATENO: No momento da incluso, todas as CONSTRAINTS (PK, FK e Checks) e tipos de dados so verificados. Caso algum item seja violado o registro no inserido e o SGDB exibe qual foi a regra violada. Alterando Dados Comando UPDATE UPDATE <tabela> SET atributo1 = valor1, atributo2 = valor2, ... atributoN = valorN [WHERE <condio>]; 19 [WHERE <condio>]; Onde CONDIO: <atributo> <operador_logico> <valor> <operador_relacional> <atributo> <operador_logico> <valor> Operadores Lgicos: =, < >, <, <=, >, >= Operadores Relacionais: AND, OR NOT Alterando Dados Altera o nome de TODOS os departamentos para Tecnologia da Informao: UPDATE DEPARTAMENTO SET NOME = Tecnologia Informao; Altera o nome de um NICO departamento: UPDATE DEPARTAMENTO SET NOME = Tecnologia Informao WHERE CODIGO_DEPARTAMENTO = 1; Altera o salrio dos Funcionrios que ganham menos que R$ 20 Altera o salrio dos Funcionrios que ganham menos que R$ 1.000,00: UPDATE FUNCIONARIO SET SALARIO = SALARIO * 1.1 WHERE SALARIO < 1000; Altera o salrio dos Funcionrios que ganham menos que R$ 1.000,00 e trabalham no Departamento 1: UPDATE FUNCIONARIO SET SALARIO = SALARIO * 1.1 WHERE SALARIO < 1000 AND CODIGO_DEPARTAMENTO = 1; Alterando Dados Altera TODOS os atributos de um Funcionrio: UPDATE FUNCIONARIO SET NOME = Luciano Calderoni SALARIO = 1500 CODIGO_DEPARTAMENTO = 3 WHERE CODIGO_FUNCIONARIO = 1; ATENO: 21 No momento da alterao, todas as CONSTRAINTS (PK, FK e Checks) e tipos de dados so verificados. Caso algum item seja violado o registro no alterado e o SGDB exibe qual foi a regra violada. Apesar de ser possvel, no aconselhvel alterar o valor de um atributo PK. Excluindo Dados Comando DELETE DELETE [FROM] <tabela> [WHERE <condio>]; Onde CONDIO: <atributo> <operador_logico> <valor> 22 <atributo> <operador_logico> <valor> <operador_relacional> <atributo> <operador_logico> <valor> Operadores Lgicos: =, < >, <, <=, >, >= Operadores Relacionais: AND, OR NOT Excluindo Dados Exclui TODOS os departamentos: DELETE FROM DEPARTAMENTO; Exclui um NICO departamento: DELETE FROM DEPARTAMENTO WHERE CODIGO_DEPARTAMENTO = 1; Exclui os Funcionrios que ganham menos que R$ 1.000,00 e trabalham no Departamento 1: 23 trabalham no Departamento 1: DELETE FROM FUNCIONARIO WHERE SALARIO < 1000 AND CODIGO_DEPARTAMENTO = 1; ATENO: No momento da excluso, todas as CONSTRAINTS FK so verificadas e, alguma seja violada, o registro no excludo e o SGDB exibe qual foi a regra violada. Consultando Dados Comando SELECT SELECT <lista_campos> FROM <lista_tabelas> [WHERE <condio>] [ORDER BY <lista_ordenao>]; Onde: <lista_campos>: nome de qualquer campo das tabelas relacionadas <lista_campos>: nome de qualquer campo das tabelas relacionadas em lista_tabelas, separados por vrgula. <lista_tabelas>: nome das tabelas das quais se deseja retornar informaes ou apenas so usadas para juno de tabelas. Condio: <atributo> <operador_logico> <valor> <operador_relacional> <atributo> <operador_logico> <valor> Operadores Lgicos: =, < >, <, <=, >, >= Operadores Relacionais: AND, OR NOT Consultando Dados Retornando dados de uma nica tabela: Buscar o nome e o salrio de TODOS os FUNCIONRIOS: SELECT NOME, SALARIO FROM FUNCIONARIO; Buscar dados dos FUNCIONARIO com salario > R$ 1.000,00 SELECT NOME, SALARIO SELECT NOME, SALARIO FROM FUNCIONARIO WHERE SALARIO > 1000; Buscar TODOS os dados dos FUNCIONARIO com salario > R$ 1.000,00 e trabalhem no departamento de cdigo = 1. SELECT * FROM FUNCIONARIO WHERE SALARIO > 1000 AND CODIGO_DEPARTAMENTO = 1; Consultando Dados LIKE e NOT LIKE: s se aplicam sobre atributos do tipo caracter. Operam como = e < >, utilizando os smbolos % (substitui uma palavra) e _ (substitui um caractere). Os smbolos podem ser usados no incio ou fim da palavra de comparao. Buscar os FUNCIONRIOS com nome que iniciam por Jos: SELECT CODIGO, NOME, SALARIO FROM FUNCIONARIO FROM FUNCIONARIO WHERE NOME LIKE Jos%; Buscar os FUNCIONRIOS que possuam Jos em qualquer parte do nome: SELECT CODIGO, NOME, SALARIO FROM FUNCIONARIO WHERE NOME LIKE %Jos%; Buscar os FUNCIONRIOS possuam o nome terminado em Calderoni: SELECT CODIGO, NOME, SALARIO FROM FUNCIONARIO WHERE NOME LIKE %Calderoni; Consultando Dados BETWEEN e NOT BETWEEN: substituem o uso dos operadores >= e <=, quando desejamos que um determinado campo possua valor dentro de uma determinada faixa. Usado normalmente para campos numricos ou datas. Buscar os FUNCIONRIOS que recebam entre R$ 1.000,00 e R$ 2.000,00: SELECT CODIGO, NOME, SALARIO FROM FUNCIONARIO FROM FUNCIONARIO WHERE SALARIO BETWEEN 1000 AND 2000; OU SELECT CODIGO, NOME, SALARIO FROM FUNCIONARIO WHERE SALARIO >= 1000 AND SALARIO <= 2000; Consultando Dados IN e NOT IN: procuram dados que esto ou no contidos em um dado conjunto de valores (Interseo (IN) e Diferena de conjuntos (NOT IN)). Buscar os FUNCIONRIOS que recebam R$ 1.000,00, R$ 2.000,00 ou R$ 3.000,00 de salario: SELECT CODIGO, NOME, SALARIO FROM FUNCIONARIO FROM FUNCIONARIO WHERE SALARIO IN (1000, 2000, 3000); A lista de valores de uma comparao tambm pode vir de uma Sub-query ou query aninhada, que veremos adiante como funcionam. Consultando Dados IS NULL e IS NOT NULL: identificam valores nulos (ou no) dos atributos. Buscar os PROJETOS que ainda esto em andamento, ou seja, que possuam a DATA_FIM nula: SELECT NOME_PROJETO FROM PROJETOS WHERE DATA_FIM IS NULL; Buscar os PROJETOS que j terminaram, ou seja, que possuam a DATA_FIM no nula: SELECT NOME_PROJETO FROM PROJETOS WHERE DATA_FIM IS NOT NULL; Consultando Dados ORDER BY: Usado para ordenar o resultado de um SELECT. Buscar os PROJETOS que ainda esto em andamento, ou seja, que possuam a DATA_FIM nula. Ordenar o resultado, mostrando primeiro os que comearam primeiro: SELECT NOME_PROJETO FROM PROJETOS WHERE DATA_FIM IS NULL WHERE DATA_FIM IS NULL ORDER BY DATA_INICIO ASC; -- ASC significa ordem CRESCENTE Buscar os PROJETOS que j terminaram, ou seja, que possuam a DATA_FIM no nula. Ordenar o resultado pelos que terminaram por ltimo: SELECT NOME_PROJETO FROM PROJETOS WHERE DATA_FIM IS NOT NULL ORDER BY DATA_FIM DESC; -- DESC significa DECRESCENTE Os resultados podem ser ordenados por vrias colunas, cada uma com seu prprio critrio de ordenao (ASC ou DESC). O tipo padro ASC e, portanto, este pode ser omitido quando usarmos esse tipo de ordenao. Consultando Dados Campos Calculados: Pode-se criar um campo que no pertena tabela a partir de clculos sobre atributos dessa tabela. Mostrar o nome e uma simulao de novo salrio dos empregados calculado com base em um reajuste de 15% para os que ganham abaixo de R$ 1.000,00: SELECT NOME, SALARIO * 1.1 NOVO_SALARIO FROM FUNCIONARIO FROM FUNCIONARIO WHERE SALARIO < 1000 Consultando Dados Funes de Agregao: So funes pr-definidas pela SQL e que operam sobre os conjuntos de dados. MIN(atributo) retorna o MENOR valor para o atributo dentro do conjunto. MAX(atributo) retorna o MAIOR valor para o atributo dentro do conjunto. AVG(atributo) retorna o valor MDIO para o atributo dentro do conjunto. SUM(atributo) retorna a SOMA de valores do atributo dentro do conjunto. COUNT(atributo) retorna a QUANTIDADE de elementos dentro do conjunto. COUNT(atributo) retorna a QUANTIDADE de elementos dentro do conjunto. Para o COUNT o ideal usar algum atributo no nulo, pois valores nulos no so contados. Pode, tambm, ser substitudo por *. ATENO: As funes de agregao somente so disparadas por comandos SELECT e no podem ser usadas diretamente em clusula WHERE! Consultando Dados Funes de Agregao: Buscar o maior salrio dentre os Funcionrios : SELECT MAX(SALARIO) FROM FUNCIONARIO; Buscar o menor salrio dentre os Funcionrios : SELECT MIN(SALARIO) FROM FUNCIONARIO; FROM FUNCIONARIO; Buscar a mdia salarial dos Funcionrios: SELECT AVG(SALARIO) FROM FUNCIONARIO; Buscar a soma dos salrios dos Funcionrios: SELECT SUM(SALARIO) FROM FUNCIONARIO; Buscar a quantidade de Funcionrios da empresa: SELECT COUNT(*) FROM FUNCIONARIO; Consultando Dados GROUP BY: Organiza a seleo de dados em Grupo. Usado em conjunto com as funes de Agregao e, em alguns casos, seu uso obrigatrio. Agrupar a quantidade de clientes por sexo: SELECT COUNT(*) FROM CLIENTE GROUP BY SEXO Funciona, mas no sabemos quantos clientes para cada sexo! Para isso, fazemos como abaixo: SELECT SEXO, COUNT(*) FROM CLIENTE GROUP BY SEXO Quando existirem campos no SELECT, alm da Funo de Agregao, o uso do GROUP BY passa a ser OBRIGATRIO e dever conter a lista de campos do SELECT, com exceo da Funo de Agregao. Consultando Dados Juno de Tabelas (JOIN): Necessrio quando se necessita de informaes que esto em mais de uma tabela. Listar o nome do Funcionrio e o nome do Departamento onde ele est alocado: SELECT F.NOME, D.NOME -uso de ALIAS para campos com mesmo nome FROM FUNCIONARIO F, DEPARTAMENTO D WHERE F.CODIGO_DEPARTAMENTO = D.CODIGO_DEPARTAMENTO; WHERE F.CODIGO_DEPARTAMENTO = D.CODIGO_DEPARTAMENTO; F.CODIGO_DEPARTAMENTO = D.CODIGO_DEPARTAMENTO usado para fazer o JOIN entre as tabelas FUNCIONARIO e DEPARTAMENTO. A regra para o JOIN sempre a Chave Estrangeira de uma tabela (no caso CODIGO_DEPARTAMENTO de FUNCIONARIO, que uma FK para a tabela DEPARTAMENTO) com a respectiva Chave Primria da outra tabela (no caso CODIGO_DEPARTAMENTO, que PK da tabela DEPARTAMENTO). Temos que ter muito cuidado ao fazer o JOIN, pois caso no o faamos, o resultado do SELECT pode conter informaes falsas! JOINs desse tipo, que sempre esperam que a ligao seja verdadeira, so chamados de INNER JOIN. Consultando Dados Juno de Tabelas (JOIN): Listar o nome dos Clientes que possuem Projetos em andamento: SELECT C.NOME FROM CLIENTE C, PROJETO P WHERE C.CODIGO = P.CODIGO_CLIENTE - fazendo o JOIN AND P.DATA_FIM IS NULL; -- filtrando os projetos Para o JOIN, vale a regra da Chave Estrangeira de uma tabela (no caso CODIGO_CLIENTE de PROJETO, que uma FK para a tabela CLIENTE) com a respectiva Chave Primria da outra tabela (no caso CODIGO_CLIENTE, que PK da tabela CLIENTE). Uma dica sempre fazer os JOINs necessrios e apenas depois filtrar as informaes que desejamos, apesar de ser possvel inverter a ordem e at mesmo misturar, no WHERE, o que JOIN e o que filtro. Consultando Dados Juno de mais que duas Tabelas: Listar o nome do Funcionrio e o nome dos Projetos em que o Funcionrio esteja trabalhando: SELECT F.NOME, P.NOME FROM FUNCIONARIO F, FUNCIONARIO_PROJETO FP, PROJETO P WHERE F.CODIGO_FUNCIONARIO = FP.CODIGO_FUNCIONARIO WHERE F.CODIGO_FUNCIONARIO = FP.CODIGO_FUNCIONARIO AND FP.CODIGO_PROJETO = P.CODIGO_PROJETO AND FP.DATA_FIM IS NULL; F.CODIGO_FUNCIONARIO = FP.CODIGO_FUNCIONARIO faz o JOIN entre as tabelas FUNCIONARIO e FUNCIONARIO_PROJETO. FP.CODIGO_PROJETO = P.CODIGO_PROJETO faz o JOIN entre as tabelas FUNCIONARIO_PROJETO e PROJETO. FP_DATAFIM IS NULL o filtro para indicar que o funcionrio ainda trabalha no projeto. Note que no existe a necessidade de se ligar cada uma das tabelas com cada outra existente, bastando apenas ligar as tabelas para que se tenha lgica! Consultando Dados Sub-Query ou Query Aninhada: O resultado de uma consulta utilizado por outra consulta, de forma encadeada e no mesmo comando SQL. O resultado do comando SELECT mais interno (sub-query) usado por outro SELECT mais externo para obter o resultado final. Uma Sub-Query pode aparecer em qualquer uma das 3 partes principais de um SELECT, ou seja, na prpria clusula SELECT, no FROM ou no WHERE. Os tipos mais comuns so encontrados no WHERE. As Sub-Queries devem sempre ser escritas entre parnteses () Consultando Dados Sub-Query ou Query Aninhada: Listar os empregados que trabalham no departamento de chamado Informtica: SELECT NOME FROM FUNCIONARIO WHERE CODIGO_DEPARTAMENTO = (SELECT CODIGO_DEPARTAMENTO FROM DEPARTAMENTO WHERE NOME = Informtica); Note que o mesmo resultado poderia ser obtido fazendo o JOIN. Nesse caso cabe Note que o mesmo resultado poderia ser obtido fazendo o JOIN. Nesse caso cabe ao desenvolvedor escolher a forma que mais lhe agrada. Existem autores que dizem ser prefervel substituir Sub-Query por JOIN onde for possvel, por questes de performance. Listar os empregados cujos salrios so maiores do que a mdia salarial, mostrando a diferena entre o salrio do funcionrio e a mdia. SELECT NOME, (SALARIO (SELECT AVG(SALARIO) FROM FUNCIONARIO)) AS DIFERENCA FROM FUNCIONARIO WHERE SALARIO > (SELECT AVG(SALARIO) FROM FUNCIONARIO); Consultando Dados EXISTS e NOT EXISTS: Foram projetados para uso apenas com Sub-query: EXISTS retorna TRUE se existe pelo menos uma linha produzida pela Sub-query e FALSE quando a sub-query no retorna registros. NOT EXISTS trabalha ao contrrio, ou seja, retorna TRUE se a sub-query no retorna registros e FALSE caso exista ao menos uma linha produzida pela sub- query. Listar os empregados que trabalham no departamento de chamado Informtica: SELECT NOME FROM FUNCIONARIO F WHERE EXISTS (SELECT CODIGO_DEPARTAMENTO FROM DEPARTAMENTO WHERE F.CODIGO_DEPARTAMENTO = CODIGO_DEPARTAMENTO AND NOME = Informtica); Note que o mesmo resultado poderia ser obtido fazendo o JOIN ou da maneira feita em exemplo anterior. Esse exemplo difere do anterior por usar uma comparao dentro da Sub-query, enquanto o anterior usava comparao fora da Sub-query. Nem sempre ser possvel fazer como no exemplo, 3 forma para resolver o mesmo problema, e o desenvolvedor dever escolher a opo correta. Consultando Dados Regras genricas de Sub-Query: A clusula ORDER BY no pode ser usada em uma sub-query. A lista de atributos especificados no SELECT de uma sub-query deve conter um nico elemento, exceto quando usamos EXISTS / NOT EXISTS, que podem ter vrios elementos no SELECT. Nomes de atributos especificados na sub-query esto associados s tabelas listadas na clusula FROM da sub-query. Em uma Sub-Query possvel referir-se a atributos de uma tabela da clusula FROM da consulta mais externa, desde que obrigatriamente utilizando qualificadores de atributos (ALIAS). Quando a Sub-query um dos operandos envolvidos em uma comparao, ela deve aparecer sempre no lado DIREITO da comparao. Anexo Em anexo a este, existe o arquivo ExemploAula.ZIP com os scripts para criao do Banco de Dados de exemplo usados nessa apresentao. So 2 arquivos: script_projetos_alter.sql: Cria as tabelas e as PK 42 script_projetos_alter.sql: Cria as tabelas e as PK e FK usando ALTER; script_projetos_on_create.sql: Cria as tabelas, PKs, FKs e regras de integridade num nico comando.