73
SQL Básico 1 SQL

SQL Básico SQL

Embed Size (px)

Citation preview

SQL Básico

1

SQL

SQL Básico

2

1. Conceitos de banco de dados .................................................................................................................5

Banco de dados: .....................................................................................................................................5 Sistema de Gerenciamento de Bancos de Dados (SGBD): ....................................................................5 Sistema de Bancos de Dados .................................................................................................................5

2. O Modelo Relacional .............................................................................................................................6 Definição de Banco de Dados Relacional ..............................................................................................6 Modelo Entidade Relacionamento (MER) .............................................................................................6

Benefícios do Modelo de Relacionamento de Entidades ...................................................................6 Componentes-chave ...........................................................................................................................6 Atributo Identificador ........................................................................................................................6

Exercícios ...............................................................................................................................................7 3. Criando e gerenciando tabelas – Parte I .................................................................................................8

Instruções SQL .......................................................................................................................................8 Comandos DDL .....................................................................................................................................8

Create table ........................................................................................................................................9 Alter table .........................................................................................................................................10 Truncate table ...................................................................................................................................11

Exercícios .............................................................................................................................................11 4. Manipulando Dados – Parte I ..............................................................................................................13

Comandos DML ...................................................................................................................................13 Insert ................................................................................................................................................13 Update ..............................................................................................................................................14 Delete ...............................................................................................................................................14

Exercícios .............................................................................................................................................15 5. Restrições .............................................................................................................................................17

Restrição NOT NULL ......................................................................................................................18 Restrição UNIQUE ..........................................................................................................................18 Restrição de PRIMARY KEY .........................................................................................................18 Restrição de FOREIGN KEY .........................................................................................................19 Restrição CHECK ...........................................................................................................................19 Eliminando uma restrição ................................................................................................................20 Desativando restrições .....................................................................................................................20 Ativando restrições ..........................................................................................................................20 Restrições em cascata ......................................................................................................................21

Exercícios .............................................................................................................................................21 6. Criando instruções SQL Básicas ..........................................................................................................22

Select ....................................................................................................................................................22 Precedência de operadores ...............................................................................................................23 Um apelido de coluna ......................................................................................................................23 Um operador de concatenação .........................................................................................................24 Strings de caracteres literais .............................................................................................................24 Linhas duplicadas .............................................................................................................................25

Exercícios .............................................................................................................................................26 7 Restrigindo e classificando dados .........................................................................................................27

Limitando as linhas selecionadas .....................................................................................................27 Strings de caracteres e datas ............................................................................................................27

SQL Básico

3

Condições de comparação ....................................................................................................................27 Order by ...............................................................................................................................................30 Exercícios .............................................................................................................................................32

8 Funções SQL .........................................................................................................................................33 Funções de Caracter (Conversão de Maiúsculas e Minúsculas) ..........................................................35 Funções de Caracter (Manipulação de caractere) ................................................................................35 Funções numéricas ...............................................................................................................................36 Trabalhando com datas ........................................................................................................................37 Conversão de dados explícita ...............................................................................................................39 Função NVL .........................................................................................................................................42 A expressão CASE ...............................................................................................................................43 A função DECODE ..............................................................................................................................43 Aninhando funções ..............................................................................................................................44 Exercícios .............................................................................................................................................44

9. Exibindo dados de várias tabelas .........................................................................................................46 Definindo Junções ................................................................................................................................46 Tipos de Junções ..................................................................................................................................48

O que é uma Junção idêntica (EQUIJOIN)? ....................................................................................48 O que é uma Junção não-idêntica (NON-EQUIJOIN)? ...................................................................49 O que é uma Junção externa (OUTER JOIN)? ................................................................................50 O que é uma Autojunção (SELF JOIN)? .........................................................................................51 Unindo tabelas usando a sintaxe SQL99 .........................................................................................51

Exercícios .............................................................................................................................................54 10 Funções de grupo ................................................................................................................................55

Função COUNT ...............................................................................................................................55 Funções de Grupo e valores NULOS ...............................................................................................56 Criando Grupos de Dados: group by ...............................................................................................56 Consultas Inválidas Usando Funções de Grupo ...............................................................................57 Excluindo Resultados do Grupo: Cláusula HAVING ....................................................................57

Exercícios .............................................................................................................................................58 11 SUBCONSULTAS .............................................................................................................................60

Subconsultas de única linha .................................................................................................................61 Subconsultas de várias linhas ...............................................................................................................62 Usando subconsulta na Cláusula FROM .............................................................................................62 Usando subconsulta na Cláusula SELECT ..........................................................................................62 Usando o operador EXISTS .................................................................................................................62 Exercícios .............................................................................................................................................63

12 Comandos DDL – Parte II ..................................................................................................................65 Exercício ..............................................................................................................................................65

13 Comandos DML- Parte II ...................................................................................................................66 14 Views ..................................................................................................................................................67

O que é uma View ? .............................................................................................................................67 Por que usar Views? .........................................................................................................................67 Views Simples e Views Complexas ................................................................................................67 Criando uma VIEW .........................................................................................................................67 View no dicionário de dados ............................................................................................................68 Modificando uma view ....................................................................................................................68

SQL Básico

4

Criando uma View Complexa ..........................................................................................................69 Removendo uma VIEW ...................................................................................................................69

Exercícios .............................................................................................................................................69 15 Índices .................................................................................................................................................70

Como são criados ? ..........................................................................................................................70 Criando um índice ............................................................................................................................70 Quando criar um índice ....................................................................................................................70 Quando não criar um índice .............................................................................................................70 Confirmando índices ........................................................................................................................70 Removendo um Índice .....................................................................................................................71

Exercícios .............................................................................................................................................71 16 Operadores SET ..................................................................................................................................72

Operador UNION .............................................................................................................................72 Operador UNION ALL ....................................................................................................................73 Operador INTERSECT ....................................................................................................................73 Operador MINUS .............................................................................................................................73

SQL Básico

5

1. 1. 1. 1. ConceitosConceitosConceitosConceitos de banco de dadosde banco de dadosde banco de dadosde banco de dados

Banco de dados:Banco de dados:Banco de dados:Banco de dados: é uma coleção de dados interrelacionados, representando informações sobre um domínio específico. Exemplos: lista telefônica, controle do acervo de uma biblioteca, sistema de controle dos recursos humanos de uma empresa.

Sistema de Gerenciamento de Bancos de Dados (SGBD):Sistema de Gerenciamento de Bancos de Dados (SGBD):Sistema de Gerenciamento de Bancos de Dados (SGBD):Sistema de Gerenciamento de Bancos de Dados (SGBD): é um software com recursos específicos para facilitar a manipulação das informações dos bancos de dados e o desenvolvimento de programas aplicativos. Exemplos: Oracle, PostgreSQL, MySQL, SqlServer.

Sistema de Bancos de DadosSistema de Bancos de DadosSistema de Bancos de DadosSistema de Bancos de Dados: é um sistema de manutenção de registros por computador, envolvendo quatro componentes principais: • dados, • hardware; • software; • usuários. Existe uma série de métodos, técnicas e ferramentas que visam sistematizar o desenvolvimento de sistemas de bancos de dados. O sistema de bancos de dados deve prover uma visão abstrata de dados para os usuários. A abstração se dá em três níveis: ● Nível físico: nível mais baixo de abstração. Descreve como os dados estão realmente

armazenados, englobando estruturas complexas de baixo nível; ● Nível conceitual: descreve quais dados estão armazenados e seus relacionamentos. Neste nível, o banco de dados é descrito através de estruturas relativamente simples, que podem envolver estruturas complexas no nível físico; ● Nível de visões do usuário: descreve partes do banco de dados, de acordo com as necessidades de cada usuário, individualmente.

SQL Básico

6

2. 2. 2. 2. O Modelo RelacionalO Modelo RelacionalO Modelo RelacionalO Modelo Relacional

Definição de Banco de Dados RelacionalDefinição de Banco de Dados RelacionalDefinição de Banco de Dados RelacionalDefinição de Banco de Dados Relacional

Um banco de dados relacional é um conjunto de relações ou tabelas bidimensionais para armazenar informações. Por exemplo, informações sobre todos os funcionários de uma empresa. Em um banco de dados relacional, você cria várias tabelas para armazenar informações diferentes sobre funcionários, como tabelas de funcionários, departamentos e salários.

Modelo Entidade RModelo Entidade RModelo Entidade RModelo Entidade Relacionamento (MER)elacionamento (MER)elacionamento (MER)elacionamento (MER)

Em um sistema eficiente, os dados são divididos em categorias ou entidades distintas. Um modelo de relacionamento de entidades (ER) é uma ilustração de várias entidades em uma empresa e dos relacionamentos entre elas. Um modelo de relacionamento de entidades é derivado de narrativas ou especificações comerciais e é criado durante a fase de análise do ciclo de vida de desenvolvimento do sistema. Os modelos para relacionamento de entidades separam as informações necessárias para uma empresa das atividades desempenhadas dentro dela. Embora as empresas possam alterar suas atividades, o tipo de informações tende a permanecer constante. Portanto, as estruturas de dados também tendem a ser constantes.

Benefícios do ModeloBenefícios do ModeloBenefícios do ModeloBenefícios do Modelo de Relacionamento dede Relacionamento dede Relacionamento dede Relacionamento de EntidadesEntidadesEntidadesEntidades

• Documenta as informações da organização em formato claro e preciso; • Fornece uma imagem clara do escopo das necessidades de informações; • Fornece um mapa ilustrado facilmente compreendido para o desingn do banco de dados; • Oferece uma estrutura eficiente para a integração de várias aplicações.

ComponentesComponentesComponentesComponentes----chavechavechavechave

• Entidade: Um item importante sobre o qual é necessário obter informações. Os exemplos são departamentos, funcionários e pedidos.

• Atributo: Um item que descreve ou qualifica uma entidade. Por exemplo, para a entidade de funcionários, os atributos são o número, o nome e o cargo do funcionário, além do número do departamento e assim por diante. Cada um desses atributos é necessário ou opcional. Esse estado é chamado de opcionalidade;

• Relacionamento: Uma associação nomeada entre entidades que demonstra opcionalidade e grau. Os exemplos são funcionários e departamentos, além de pedidos e itens.

Atributo IdentificadorAtributo IdentificadorAtributo IdentificadorAtributo Identificador Chave Primária: É aquele atributo que identifica de forma única cada ocorrência na entidade – linha preenchida na tabela. Exemplo: (cód_produto) Chave concatenada ou composta: Quando o identificador é formado por mais de um atributo na

SQL Básico

7

formação da chave primária. Exemplo: (data, boleto) Chave estrangeira: É um atributo importado de outra entidade, para implementar logicamente o relacionamento 1:N. Exemplo: (cod_loja) Exemplo de MER:

• Um professor pode ministrar várias disciplinas; • As disciplinas possuem apenas 1 professor.

Professor Disciplina Cod_prof PK Cod_disc PK Nome_prof Descr_disc Idade_prof carga_hor End_prof Cod_prof FK Tel_prof

ExercíciosExercíciosExercíciosExercícios

Monte o MER das situações abaixo. 1)

• Os clientes podem fazer vários pedidos; • Os pedidos pertencem a um único cliente; • Um pedido pode conter vários produtos. • Cada produto pode estar em vários pedidos.

2)

• Somente existe 1 candidato a presidência por partido; • Cada candidato a presidência apoia pelo menos 1 candidato a governador; • Cada candidato a governador apoia um único candidato a presidência; • Cada partido apoia um único senador; • Cada candidato a governador apoia pelo menos 1 candidato a deputado federal; • Cada candidato a deputado federal tem apoio de um único candidato a governador.

Professor

Disciplina ministra

1 N

1 1

1:N

SQL Básico

8

3. 3. 3. 3. Criando e gerenciando tabelasCriando e gerenciando tabelasCriando e gerenciando tabelasCriando e gerenciando tabelas –––– Parte IParte IParte IParte I SQL é um conjunto de declarações que é utilizado para acessar os dados utilizando gerenciadores de banco de dados. SQL processa conjuntos de registros, ao invés de um por vez, provendo navegação automática através dos dados, permitindo ao usuário manipular tipos complexos de dados.

Objetos do banco de dados Objeto Descrição

Tabela Unidade básica de armazenamento. Composta de linhas e colunas

View Representa logicamente subconjuntos de uma ou mais tabelas

Sequência Gerador de valores numéricos

Índice Melhora o desempenho de algumas consultas

Sinônimo Atribui valores alternativos a objetos Regra para nomeação de tabelas e colunas: • Devem ser iniciados por uma letra; • Devem ter de 1 a 30 caracteres; • Devem conter somente AZ, az, 09, _, $ e #; • Não devem duplicar o nome de outro objeto de propriedade do mesmo usuário; • Não devem ser uma palavra reservada do servidor Oracle.

Instruções SQLInstruções SQLInstruções SQLInstruções SQL

Instrução Tipo Função

SELECT Recuperação de Dados Recupera dados do Banco de Dados. INSERT UPDATE DELETE

DML (Data Manipulation Language) Inclui novas linhas, alteras linhas (informações) existentes e remove linhas indesejáveis no Banco de dados, respectivamente.

CREATE ALTER DROP RENAME TRUNCATE

DDL (Data Definition language) Cria novos objetos (usuários, tabelas, views, etc), altera objetos, mata objetos, renomeia tabelas e trunca as tabelas, respectivamente no Banco de Dados.

COMMIT ROLLBACK SAVEPOINT

Controle de transação Gerencia as alterações feitas por instruções DML, confirmando ou cancelando. É possível agrupar as alterações dos dados em transações lógicas.

GRANT REVOKE

DCL (Data Control Language) Fornece ou remove direitos de acesso ao banco de Dados e estrutura contidas à ele para novos usuários de Banco.

Comandos Comandos Comandos Comandos DDDDDDDDLLLL

SQL Básico

9

Create tableCreate tableCreate tableCreate table O comando create table permite ao usuário criar uma nova tabela (ou relação). Para cada atributo da relação é definido um nome, um tipo, máscara e algumas restrições. Os princiapis tipos de uma coluna são:

Tipo de dado Descrição

Varchar2(comprimento_máximo) Caracter de tamanho variável podendo atingir o tamanho máximo de até 32767 bytes

Char[comprimento_máximo] Caracter fixo com o tamanho máximo de 32767 bytes. Se o tamanho não for especificado, o default é 1

Number [precisão, escala] Tipo numérico fixo e de ponto flutuante

Binary_integer É o tipo básico para inteiros entre -2.147.483.647 e 2.147.483.647. Utiliza funções da biblioteca interna para executar a aritmética

PLS_INTEGER Inteiro binário com performance superior a BINARY_INTEGER, pois utiliza as instruções de máquina nativa para execução de cálculos

LONG Caracter de tamanho variável podendo ter até 32760 bytes

LONG RAW Tipo binário variável de até 32760 bytes

DATE Tipo para acomodar data e hora

BOOLEAN Armazena três valores lógicos possíveis, TRUE, FALSE e NULL

ROWID Utilizado para armazenar endereços físicos das linhas

UROWID Utilizado para armazenar endereços físicos e lógicos

A restrição not null indica que o atributo deve ser obrigatoriamente preenchido; se não for especificado, então o “default” é que o atributo possa assumir o valor nulo. A sintaxe da instrução create table no Oracle é:

CREATE [ GLOBAL TEMPORARY ] TABLE [esquema.] tabela ( tipo de dados da coluna [DEFAULT expr] [, ...]);

GLOBAL TEMPORARY Especifica que a tabela é temporária e que sua definição está visível em todas as sessões. Os dados em uma tabela temporária são visíveis somente na sessão que insere dados na tabela.

Esquema É o mesmo nome do proprietário tabela É o nome da tabela DEFAULT expr Especifica um valor default se um valor estiver omitido na instrução

INSERT Coluna É o nome da coluna Tipo de dados É o tipo de dados e o comprimento da coluna

SQL Básico

10

Para referenciar tabelas de outros usuários: • As tabelas que pertencem a outros usuários não estão no esquema do usuário; • Você deve usar o nome do proprietário como prefixo destas tabelas. Para a opção default: • Especifique um valor default para uma coluna durante uma inserção; • Valores literais, expressões ou funções SQL são valores válidos; • O nome de outra coluna ou uma pseudocoluna são valores inválidos; • O tipo de dados default deve corresponder ao tipo de dados da coluna; Tabelas no banco de dados Oracle: • Tabelas do usuário:

• São um conjunto de tabelas criadas e mantidas pelo usuário; • Contêm informações sobre o usuário.

• Dicionário de dados: • É um conjunto de tabelas criadas e mantidas pelo servidor Oracle; • Contém informações sobre o banco de dados.

Consultando o dicionário de dados: • Veja os nomes de tabelas de propriedade do usuário:

select table_name from user_tables • Exiba tipos de objetos distintos de propriedade do usuário:

select distinct object_type from user_objects • Exiba tabelas, views, sinônimos e sequências de propriedade do usuário:

select * from user_catalog Alter tableAlter tableAlter tableAlter table Use a instrução alter table para: • Adicionar uma nova coluna; • Modificar uma coluna existente; • Definir um valor default para a nova coluna; • Eliminar uma coluna. ALTER TABLE tabela ADD (coluna tipo_de_dados [DEFAULT expr] [,coluna tipo_de_dados]...); ALTER TABLE tabela MODIFY (coluna tipo_de_dados [DEFAULT expr] [,coluna tipo_de_dados]...); ALTER TABLE tabela DROP (coluna); Eliminando uma tabela: • Todos os dados e a estrutura da tabela serão excluídos; • Todas as transações pendentes sofrerão commit; • Todos os índices serão eliminados; • Você não pode fazer rollback da instrução DROP TABLE.

SQL Básico

11

Alterando o nome de um objeto: • Para alterar o nome de uma tabela, view, seqüência ou sinônimo, execute a instrução RENAME.

RENAME dept TO detail_dept; • Você deve ser o proprietário do objeto. Truncate tableTruncate tableTruncate tableTruncate table Truncando uma tabela: • A instrução TRUNCATE TABLE:

• Remove todas as linhas de uma tabela; • Libera o espaço de armazenamento usado por essa tabela.

TRUNCATE TABLE detail_dept;

Você não poderá fazer rollback da remoção de linhas quando usar TRUNCATE; • Você também tem a opção de remover as linhas usando a instrução DELETE. Adicionando comentários a uma tabela: • Você pode adicionar comentários a uma tabela ou coluna usando a instrução COMMENT;

COMMENT ON TABLE employees is 'Employee information'; • Os comentários podem ser exibidos através das views de dicionário de dados:

• ALL_COL_COMMENTS; • USER_COL_COMMENTS; • ALL_TAB_COMMENTS; • USER_TAB_COMMENTS;

Instrução Descrição

Create table Cria uma tabela

Alter table Modifica a estrutura da tabela

Drop table Remove as linhas e a estrutura da tabela

Rename Altera o nome de uma tabela, view, sequência ou sinônimo

Truncate Remove todas as linhas de uma tabela e libera o espaço de armazenamento

Comment Adiciona comentários a uma tabela ou view

ExercíciosExercíciosExercíciosExercícios

1) Crie o MER para as tabelas employees e departments:

a. Atribua um ou mais funcionários a um departamento; b. Alguns departamentos ainda não tem funcionários atribuídos a eles.

2) Crie a tabela EMPLOYEES com os seguintes campos:

a. Employee_id, number(6), not null, pk; b. First_name, varchar2(20); c. Last_name, varchar2(25), not null; d. Email, varchar2(25), not null;

SQL Básico

12

e. Phone_number, varchar2(20), f. Hire_date, date; g. Job_id, varchar2(10), not null; h. Salary,number(8,2); i. Commission_pct, number(2,2); j. Manager_id, number(6); k. Department_id,number(6)

3) Crie a tabela DEPARTMENTS com os seguintes campos:

a. Department_id, number(6); b. Department_name, varchar2(20); c. Manager_id, number(6); d. Location_id, number(6);

4) Crie a tabela JOG_GRADES com os seguintes campos:

a. Gra, varchar2(1); b. Lowest_sal, number(8,2); c. Highest_sal, number(8,2).

5) Confirme se as tabelas DEPARTMENTS, EMPLOYEES e JOB_GRADES foram armazenadas no dicionário de dados. (Dica: USER_TABLES)

6) Exiba a descrição das tabelas: desc employees; desc departments; desc job_grades;

8) Renomeie a tabela EMPLOYEES para EMP.

9) Elimine a tabela EMP.

SQL Básico

13

4. Manipulando Dados 4. Manipulando Dados 4. Manipulando Dados 4. Manipulando Dados –––– Parte IParte IParte IParte I

Comandos Comandos Comandos Comandos DMDMDMDMLLLL

Uma instrução DML é executada quando você: • Adiciona novas linhas a uma tabela; • Modifica linhas existentes em uma tabela; • Remove linhas existentes de uma tabela

Uma transação consiste em um conjunto de instruções DML que formam uma unidade lógica de trabalho. InsertInsertInsertInsert Adicione novas linhas a uma tabela usando a instrução INSERT. INSERT INTO tabela [(coluna [, coluna ...])] VALUES (valor [, valor ...]);

Somente uma linha é inserida por vez com esta sintaxe. Inserindo novas linhas: • Insira novas linhas contendo valores para cada coluna; • Liste valores na ordem default das colunas na tabela; • Opcionalmente, liste as colunas na cláusula INSERT;

INSERT INTO departments(department_id, department_n ame, manager_id, location_id) VALUES (70, 'Public Relations', 100, 1700); 1 row created.

• Coloque valores de data e de caractere entre aspas simples; • Método implícito: omite a coluna da lista de colunas:

INSERT INTO departments (department_id,department_n ame ) VALUES (30, 'Purchasing'); 1 row created. Método explícito: especifica a palavra-chave NULL na cláusula VALUES: INSERT INTO departments VALUES (100, 'Finance', NULL, NULL); 1 row created. Inserindo valores especiais:

• A função SYSDATE registra a data e a hora atuais. INSERT INTO employees (employee_id, first_name, las t_name, email, phone_number, hire_date, job_id, salary, commission _pct, manager_id, department_id) VALUES (113, 'Louis', 'Popp', 'LPOPP', '515.124.456 7', SYSDATE, 'AC_ACCOUNT', 6900, NULL, 205, 100); 1 row created. Inserindo valores de datas específicos:

SQL Básico

14

• Adicone um novo funcionário: INSERT INTO employees VALUES (114, 'Den', 'Raphealy', 'DRAPHEAL', '515.12 7.4561', TO_DATE('FEB 3, 1999', 'MON DD, YYYY'), 'AC_ACCOUNT', 11000, NULL, 100, 30); 1 row created.

• Verifique a nova adição: SELECT * FROM employees UpdateUpdateUpdateUpdate

Modifique linhas existentes com a instrução UPDATE. Atualize mais de uma linha por vez, se necessário. UPDATE tabela SET coluna = valor [, coluna = valor, ... ] [WHERE condição ];

Atualizando linhas em uma tabela: • Uma ou mais linhas específicas serão modificadas se você especificar a cláusula WHERE;

UPDATE employees SET department_id = 70 WHERE employee_id = 113; 1 row updated.

• Se você omitir a cláusula WHERE, todas as linhas da tabela serão modificadas. UPDATE copy_emp SET department_id = 110; 22 rows updated. Atualizando Linhas: Erro de Restrição de Integridade UPDATE employees SET department_id = 55 WHERE department_id = 110; UPDATE employees * ERROR at line 1: ORA-02291: integrity constraint (HR.EMP_DEPT_FK) vi olated - parent key not found [restrição de integridade (HR.EMP_DEPT_FK) violada - chave mãe não encontrada]

Não existe o número de departamento 55 DeleteDeleteDeleteDelete

SQL Básico

15

Você pode remover linhas de uma tabela usando a instrução DELETE. DELETE [FROM] tabela [WHERE condição ];

• Se você especificar a cláusula WHERE, linhas específicas serão deletadas. DELETE FROM departments WHERE department_name = 'Finance'; 1 row deleted.

• Se você omitir a cláusula WHERE, todas as linhas da tabela serão deletadas. DELETE FROM copy_emp; 22 rows deleted. Deletando linhas: erro de Restrição de Integridade DELETE FROM departments WHERE department_id = 60; DELETE FROM departments * ERROR at line 1: ORA-02292: integrity constraint (HR.EMP_DEPT_FK) vi olated - child record found [restrição de integridade (HR.EMP_DEPT_FK) violada - registro filho encontrado]

Você não pode deletar uma linha que contenha uma ch ave primária usada como chave estrangeira em outra tabela.

ExercíciosExercíciosExercíciosExercícios

1) Insira as linhas abaixo na tabela DEPARTMENTS. Department_id Department_name Manager_id Location

10 Administration 200 1700 20 Marketing 201 1800 50 Shipping 124 1500 60 IT 103 1400 80 Sales 149 2500 90 Executive 100 1700

110 Accounting 205 1700 190 Contracting 1700

2) Insira as linhas abaixo na tabela EMPLOYEES.

Employee_id

First_name Last_name

Email Phone_number

Hire_date Job_id Salary Commision_pct

Manager_id Department_id

SQL Básico

16

Employee_id

First_name Last_name

Email Phone_number

Hire_date Job_id Salary Commision_pct

Manager_id Department_id

100 Steven King SKING 515.123.4567 17-JUN-87 AD_PRES 24000 90

101 Neena Kochhar NKOCHHAR 515.123.4568 21-SEP-89 AD_VP 17000 100 90

102 Lex De Haan LDEHAAN 515.123.4569 13-JAN-93 AD_VP 17000 100 90

103 Alexander Hunold AHUNOLD 590.423.4567 03-JAN-90 IT_PROG 9000

104 Bruce Ernst BERNST 590.423.4568 21-MAY-91 IT_PROG 6000

107 Diana Lorentz DLORENTZ 590.423.5567 07-FEB-99 IT_PROG 4200

124 Kevin Mourgos KMOURGOS 650.123.5234 19-nov-99 ST_MAN 5800 100 50

141 Trenna Rajs TRJAS 650.121.8009 17-oct-95 ST_CLERK 3500 0,02 100

142 Curtis Davies CDAVIES 650.121.2994 29-jan-97 ST_CLERK 3100 0,03

143 Randal Matos RMATOS 650.121.2874 15-mar-98 SA_MAN 10500 100

3) Insira as linhas abaixo na tabela JOB_GRADES. Gra Lowest_sal Highest_sal A 1000 2999 B 3000 5999 C 6000 9999 D 10000 14999 E 15000 24999 F 25000 40000 4) Altere o sobrenome do funcionário 142 para Drexler; 5) Altere o salário para 1000 de todos os funcionários que ganhem menos de 900; 6) Delete Curtis da tabela EMPLOYEES;

SQL Básico

17

5555. Restrições. Restrições. Restrições. Restrições

O que são restrições ? • As restrições impõem regras no nível da tabela; • As restrições evitam que uma tabela seja deletada se houver dependências; • Os seguintes tipos de restrições são válidos:

o NOT NULL o UNIQUE o PRIMARY KEY o FOREIGN KEY o CHECK

Restrição Descrição NOT NULL Especifica que esta coluna não pode conter um valor nulo UNIQUE Especifica uma coluna ou combinação de colunas cujos valores devem ser

exclusivos para todas as linhas na tabela PRIMARY KEY Identifica exclusivamente cada linha da tabela (Chave primária) FOREIGN KEY Estabelece e impõe um relacionamento de chave estrangeira entre a coluna e a

coluna da tabela referenciada CHECK Especifica uma condição que deve ser verdadeira

Diretrizes sobre restrições: • Dê um nome à restrição ou deixe o servidor Oracle gerar um nome usando o formato

SYS_Cn; • Crie uma restrição:

o No momento em que a tabela for criada ou o Depois que a tabela tiver sido criada

• Defina uma restrição no nível da coluna ou da tabela; • Exiba uma restrição no dicionário de dados.

CREATE TABLE [ esquema.] tabela ( coluna tipo_de_dados [DEFAULT expr ] [ restrição_de_coluna ], ... [ restrição_de_tabela ][,...]); CREATE TABLE employees( employee_id NUMBER(6), first_name VARCHAR2(20), ... job_id VARCHAR2(10) NOT NULL, CONSTRAINT emp_emp_id_pk PRIMARY KEY (EMPLOYEE_ID));

Definindo restrições: • Nível de restrição da coluna

coluna [CONSTRAINT nome_da_restrição ] tipo_de_restrição ,

SQL Básico

18

• Nível de restrição da tabela coluna,... [CONSTRAINT nome_da_restrição ] tipo_de_restrição ( coluna , ...), Restrição NOT NULLRestrição NOT NULLRestrição NOT NULLRestrição NOT NULL

• Assegura que valores nulos não sejam permitidos para as colunas; • É definida no nível da coluna:

CREATE TABLE employees( employee_id NUMBER(6), last_name VARCHAR2(25) NOT NULL, salary NUMBER(8,2), commission_pct NUMBER(2,2), hire_date DATE CONSTRAINT emp_hire_date_nn NOT NULL , O exemplo acima aplica a restrição NOT NULL à coluna LAST_NAME da tabela EMPLOYEES. Como essas restrições não possuem nome, o Oracle Server criará nomes para elas na seguinte forma SYS_Cn, onde n é um número inteiro para criar um nome de restrição exclusivo. Você pode especificar o nome da restrição ao especificá-la. ... department_id NUMBER(7,2) CONSTRAINT emp_deptno_nn NOT NULL ... RRRRestrição estrição estrição estrição UNIQUE

Uma restrição de integridade UNIQUE KEY requer que cada valor em uma coluna ou conjunto de colunas seja exclusivo. Esse tipo de restrição permite a entrada de valor nulo a menos que você defina as restrições NOT NULL para as mesmas colunas.

• Definida no nível da tabela ou da coluna: CREATE TABLE employees( employee_id NUMBER(6), last_name VARCHAR2(25) NOT NULL, email VARCHAR2(25), salary NUMBER(8,2), commission_pct NUMBER(2,2), hire_date DATE NOT NULL, ... CONSTRAINT emp_email_uk UNIQUE(email)); RRRRestrição de estrição de estrição de estrição de PRIMARY KEY

Uma restrição PRIMARY KEY cria uma chave primária para a tabela. Somente uma chave primária pode ser criada para cada tabela. A restrição PRIMARY KEY é uma coluna ou conjunto de colunas que identifica exclusivamente cada linha em uma tabela. Essa restrição impõe a exclusividade da coluna ou combinação de colunas e assegura que nenhuma coluna que seja parte da chave primária possa conter um valor nulo.

• Definida no nível da tabela ou da coluna: CREATE TABLE departments ( department_id NUMBER(4), department_name VARCHAR2(30)

SQL Básico

19

CONSTRAINT dept_name_nn NOT NULL, manager_id NUMBER(6), location_id NUMBER(4), CONSTRAINT dept_id_pk PRIMARY KEY(department_id)); RRRRestrição de estrição de estrição de estrição de FOREIGN KEY

FOREIGN KEY, ou uma restrição de integridade referencial, designa uma coluna ou combinação de colunas como a chave estrangeira e estabelece um relacionamento entre a chave primária ou uma chave exclusiva na mesma tabela ou uma tabela diferente. No exemplo DEPARTMENT_ID será definida como chave estrangeira na tabela EMPLOYEES (tabela filha ou dependente); ela faz referência à coluna DEPARTMENT_ID da tabela DEPARTMENTS (tabela mãe ou referenciada). Um valor de chave estrangeira deve corresponder a um valor existente na tabela mãe ou ser NULL.

• Definida no nível da tabela ou da coluna: CREATE TABLE employees( employee_id NUMBER(6), last_name VARCHAR2(25) NOT NULL, email VARCHAR2(25), salary NUMBER(8,2), commission_pct NUMBER(2,2), hire_date DATE NOT NULL, ... department_id NUMBER(4), CONSTRAINT emp_dept_fk FOREIGN KEY (department_id) REFERENCES departments(department_id), CONSTRAINT emp_email_uk UNIQUE(email));

Palavras-chave da restrição de FOREIGN KEY: • FOREIGN KEY: define a coluna na tabela filha no nível de restrição da tabela; • REFERENCES: identifica a tabela e a coluna na tabela mãe; • ON DELETE CASCADE: deleta as linhas dependentes da tabela filha quando uma linha da

tabela mãe é deletada; • ON DELETE SET NULL: converte valores de chave estrangeira dependentes em valores

nulos. RRRRestriçãoestriçãoestriçãoestrição CHECK

A restrição CHECK define uma condição que cada linha deve satisfazer. A condição pode usar as mesmas construções que as condições de consulta. Uma única coluna pode ter várias restrições CHECK que fazem referência à coluna na sua definição. Não há limite no número de restrições CHECK que você pode definir em uma coluna.

• Define uma condição que cada linha deve satisfazer; • As expressões a seguir não são permitidas:

o Referências às pseudocolunas CURRVAL, NEXTVAL, LEVEL e ROWNUM; o Chamadas para as funções SYSDATE, UID, USER e USERENV; o Consultas que se referem a outros valores em outras linhas.

..., salary NUMBER(2) CONSTRAINT emp_salary_min CHECK (salary > 0),... Use a instrução ALTER TABLE para:

SQL Básico

20

• Adicionar ou eliminar uma restrição sem modificar sua estrutura; • Ativar ou desativar restrições; • Adicionar uma restrição NOT NULL usando a cláusula MODIFY

ALTER TABLE tabela ADD [CONSTRAINT restrição ] tipo ( coluna ); ALTER TABLE tabela ADD [CONSTRAINT restrição ] tipo ( coluna );

Adicione uma restrição de FOREIGN KEY à tabela EMPLOYEES indicando que já deve existir um gerente como um funcionário válido na tabela EMPLOYEES.

ALTER TABLE employees ADD CONSTRAINT emp_manager_fk FOREIGN KEY(manager_id) REFERENCES employees(employee_id); Table altered. Eliminando uma rEliminando uma rEliminando uma rEliminando uma restriçãoestriçãoestriçãoestrição

• Remova a restrição de gerente da tabela EMPLOYEES; ALTER TABLE employees DROP CONSTRAINT emp_manager_fk; Table altered.

• Remova a restrição de PRIMARY KEY da tabela DEPARTMENTS e elimine a restrição de FOREIGN KEY associada da coluna EMPLOYEES.DEPARTMENT_ID.

ALTER TABLE employees DROP CONSTRAINT emp_manager_fk; Table altered. Desativando Desativando Desativando Desativando rrrrestriçõesestriçõesestriçõesestrições

• Execute a cláusula DISABLE da instrução ALTER TABLE para desativar uma restrição de integridade;

• Aplique a opção CASCADE para desativar restrições de integridade dependentes. ALTER TABLE employees DISABLE CONSTRAINT emp_emp_id_pk CASCADE; Table altered. Ativando rAtivando rAtivando rAtivando restriçõesestriçõesestriçõesestrições

• Ative uma restrição de integridade desativada no momento na definição da tabela, usando a cláusula ENABLE.

ALTER TABLE employees ENABLE CONSTRAINT emp_emp_id_pk; Table altered.

• Um índice UNIQUE ou PRIMARY KEY será automaticamente criado se você ativar uma restrição de chave UNIQUE ou PRIMARY KEY.

SQL Básico

21

RestriRestriRestriRestrições em cções em cções em cções em cascataascataascataascata • A cláusula CASCADE CONSTRAINTS é usada em conjunto com a cláusula DROP COLUMN; • A cláusula CASCADE CONSTRAINTS elimina todas as restrições de integridade referenciais

que remetam às chaves exclusivas e primária definidas nas colunas eliminadas; • A cláusula CASCADE CONSTRAINTS também elimina todas as restrições de várias colunas

definidas nas colunas eliminadas. ALTER TABLE test1 DROP (pk) CASCADE CONSTRAINTS; Table altered. ALTER TABLE test1 DROP (pk, fk, col1) CASCADE CONSTRAINTS; Table altered.

Consulte a tabela USER_CONSTRAINTS para ver todos os nomes e definições de restrições. SELECT constraint_name, constraint_type, search_condition FROM user_constraints WHERE table_name = 'EMPLOYEES';

Veja as colunas associadas aos nomes de restrições na view USER_CONS_COLUMNS. SELECT constraint_name, column_name FROM user_cons_columns WHERE table_name = 'EMPLOYEES';

ExercíciosExercíciosExercíciosExercícios

1. Adicione uma restrição no nível de tabela PRIMARY KEY à tabela EMPLOYEES, usando a coluna EMPLOYEE_ID. A restrição deve ser nomeada quando for criada. 2. Crie uma restrição PRIMARY KEY na tabela DEPARTMENTS usando a coluna DEPARTMENT_ID. A restrição deve ser nomeada quando for criada. 3. Adicione uma referência de chave estrangeira na tabela EMPLOYEES que irá assegurar que o funcionário não seja atribuído a um departamento não existente. 4. Confirme se as restrições foram adicionadas, consultado USER_CONSTRAINTS. Observe os tipos e nomes das restrições. 5. Exiba os tipos e nomes de objeto a partir da view de dicionário de dados USER_OBJECTS para as tabelas EMPLOYEES e DEPARTMENTS.

SQL Básico

22

6. Criando instruções SQL Básicas6. Criando instruções SQL Básicas6. Criando instruções SQL Básicas6. Criando instruções SQL Básicas

SelectSelectSelectSelect

Permite a seleção em uma ou mais tabelas. SELECT *|{[DISTINCT] coluna|expressão [ apelido ],...} FROM tabela; SELECT é uma lista de uma ou mais colunas DISTINCT suprime os itens duplicados * seleciona todas as colunas coluna seleciona uma ou mais colunas nomeadas (específicas) apelido fornece cabeçalhos diferentes às colunas selecionadas FROM tabela especifica a tabela contendo as colunas

Criando e executando instruções SQL

• Instruções SQL não fazem distinção entre maiúsculas e minúsculas; • Podem ser digitadas em uma ou mais linhas. Geralmente separadas para melhor

visualização; • As palavras-chave não podem ser abreviadas ou dividas de uma linha para outra; • Coloque um ponto-e-vírgula ( ; ) no final da última cláusula.

Para selecionar todas as colunas: SELECT * FROM departments Para selecionar colunas específicas: SELECT department_id, location_id FROM departments Você pode criar expressões aritméticas usando os operadores +, -, * e /. SELECT last_name, salary, salary + 300 FROM employees;

Last_name Salary Salary + 300

King 24000 24300

Kochhar 17000 17300

De Haan 17000 17300

Hunold 9000 9300

Ernst 6000 6300

SQL Básico

23

Precedência de operadoresPrecedência de operadoresPrecedência de operadoresPrecedência de operadores • A multiplicação e a divisão têm prioridade sobre a adição e a subtração; • Os operadores com a mesma prioridade são avaliados da esquerda para a direita; • Os parênteses são usados para forçar a avaliação priorizada e para esclarecer as instruções. SELECT last_name, salary, 12 * salary + 100 FROM employees;

Last_name Salary 12* Salary + 100

King 24000 288100

Kochhar 17000 204100

De Haan 17000 204100

Hunold 9000 108100

Ernst 6000 72100

Usando parênteses: SELECT last_name, salary, 12 * (salary + 100) FROM employees; Last_name Salary 12* (Salary + 100)

King 24000 289200

Kochhar 17000 205200

De Haan 17000 205200

Hunold 9000 109200

Ernst 6000 73200

Expressões aritméticas que contêm um valor nulo são avaliadas como nulas: SELECT last_name, commission_pct, 12 * salary * com mission_pct FROM employees;

Last_name Commission_pct 12* Salary * Commission_pc t

King

Kochhar

De Haan 0,2 408000

Hunold 0,3 324000

Ernst 0,2 144000

Um apelido de colunaUm apelido de colunaUm apelido de colunaUm apelido de coluna • Renomeia um cabeçalho de coluna; • É útil para cálculos;

SQL Básico

24

• Segue imediatamente o nome da coluna. Também pode haver a palavra-chave AS opcional entre o nome da coluna e o apelido;

• Necessita de aspas duplas caso contenha espaços ou caracteres especiais ou faça distinção entre maiúsculas e minúsculas.

SELECT last_name as name , commission_pct as comm FROM employees;

Name Comm

King

Kochhar

De Haan 0,2

Hunold 0,3

Ernst 0,2

SELECT last_name as 'Name' , salary * 12 'Annual Sa lary' FROM employees;

Name Annual Salary

King 288000

Kochhar 204000

De Haan 204000

Hunold 108000

Ernst 72000

Um operador de concatenaçãoUm operador de concatenaçãoUm operador de concatenaçãoUm operador de concatenação • Concatena colunas ou strings de caracteres a outras colunas; • É representado por duas barras verticais (||); • Cria uma coluna resultante que é uma expressão de caracteres.

SELECT last_name||job_id as 'Employees' FROM employees;

Employees

KingAD_PRES

KochharAD_VP

De HaanAD_VP

HunoldIT_PROG

ErnstIT_PROG

Strings de caracteres literaisStrings de caracteres literaisStrings de caracteres literaisStrings de caracteres literais • Um literal é um caractere, um número ou uma data incluída na lista SELECT; • Os valores literais de caracteres e datas devem estar entre aspas simples;

SQL Básico

25

• Cada string de caracteres é gerada uma vez para cada linha retornada. SELECT last_name || ' is a ' || job_id as 'Employee s Details' FROM employees;

Employees

King is a AD_PRES

Kochhar is a AD_VP

De Haan is a AD_VP

Hunold is a IT_PROG

Ernst is a IT_PROG

Linhas duplicadasLinhas duplicadasLinhas duplicadasLinhas duplicadas

A exibição default das consultas é de todas as linhas, incluindo linhas duplicadas. SELECT department_id FROM employees;

Department_id

90

90

90

90

90

Elimine linhas duplicadas usando a palabra-chave DISTINCT na cláusula SELECT. SELECT DISTINCT department_id FROM employees;

Department_id

10

20

50

60

80

Use o comando DESCRIBE para exibir esta estrutura.

DESC [RIBE] nome da tabela. Ex.: Desc dept

SQL Básico

26

Name Null? Type ----------------- ---------------- ------------------------- DEPTNO NOT NULL NUMBER(2) DNAME VARCHAR2(14) LOC VARCHAR2(13) Acima está a estrutura da tabela dept. No resultado:

• Null?: Indica se a coluna deve conter dados. NOT NULL indica que uma coluna deve conter dados.

• Type: Exibe o tipo de dado de uma coluna.

ExercíciosExercíciosExercíciosExercícios

1. A instrução SELECT será executada corretamente? Select ename, job, sal Salary From emp; 2. Há quatro erros de codificação nesta instrução. Você pode identificá-los? Select empno, ename Salary x 12 Salario Anual From emp; 3. Mostre a estrutura da tabela DEPT. Selecione todos os dados da tabela DEPT. 4. Mostre a estrutura da tabela EMP. Crie uma consulta para exibir o nome, o cargo, a data de

admissão e o número do funcionário para cada funcionário com o número do funcionário aparecendo primeiro;

5. Crie uma consulta para exibir os cargos exclusivos a partir da tabela EMP; 6. Exiba o nome concatenado com o cargo (job), separado por uma vírgula e espaço, e nomeie a

coluna Employee and Title; 7. Crie uma consulta para exibir todos os dados a partir da tabela EMP. Separe cada coluna por

uma vírgula.

SQL Básico

27

7777 Restrigindo e classificando dadosRestrigindo e classificando dadosRestrigindo e classificando dadosRestrigindo e classificando dados LLLLimitando as linhas selecionadasimitando as linhas selecionadasimitando as linhas selecionadasimitando as linhas selecionadas • Restrinja as linhas retornadas usando a cláusula WHERE; SELECT *| {DISTINCT coluna | expressão [apelido], . ..} FROM tabela WHERE condição • A cláusula WHERE segue a cláusula FROM. Recuperar todos os funcionários do departmento 90: SELECT employee_id, last_name, job_id, department_i d FROM employees WHERE department_id = 90;

Employee_id Last_name Job_id Department_id

100 King AD_PRES 90

101 Kochhar AD_VP 90

102 De Haan AD_VP 90

Strings de caracteres e datasStrings de caracteres e datasStrings de caracteres e datasStrings de caracteres e datas • As strings de caracteres e valores de data aparecem entre aspas simples; • Os valores de caractere fazem distinção entre maiúsculas e minúsculas e os valores de data

fazem distinção entre formatos; • O formato de data default é DD-MON-YY. SELECT last_name, job_id, department_id FROM employees WHERE last_name = 'Kochhar';

Condições de comparaçãoCondições de comparaçãoCondições de comparaçãoCondições de comparação

Usando condições de comparação: SELECT last_name, salary FROM employees WHERE salary <= 3000; Outras condições de comparação:

Operador Significado

Between ... and ... Entre dois valores (inclusive)

SQL Básico

28

Operador Significado

In (set) Corresponde a qualquer valor de uma lista

Like Corresponde a um padrão de caractere

Is null É um valor nulo

• Use a condição BETWEEN para exibir linhas baseadas em uma faixa de valores. SELECT last_name, salary FROM employees WHERE salary BETWEEN 2500 AND 3500; • Use a condição de associação IN para testar valores em uma lista: SELECT employee_id, last_name, salary, manager_id FROM employees WHERE manager_id IN (100, 101, 201); • Use a condição LIKE para executar pesquisas curingas de valores válidos de string de pesquisa; • As condições de pesquisa podem conter caracteres literais ou números:

• % denota zero ou muitos caracteres; • _ denota um caractere. Você pode combinar caracteres de correspondência de padrão.

SELECT last_name FROM employees WHERE last_name LIKE '_o%'; Usando a condição NULL: SELECT last_name, manager_id FROM employees WHERE manager_id IS NULL; Condições lógicas:

Operador Significado

AND Retorna true se ambas as condições de componentes forem verdadeiras

OR Retorna true se uma das condições de componente for verdadeira

NOT Retorna true se a condição seguinte for falsa

Operador AND: exige que ambas as condições sejam verdadeiras. SELECT employee_id, last_name, job_id, salary FROM employees WHERE salary >= 10000 AND job_id LIKE '%MAN%';

Employee_id Last_name Job_id Salary

SQL Básico

29

Employee_id Last_name Job_id Salary

149 Zlotkey SA_MAN 10500

201 Hartstein MK_MAN 13000

Operador OR: exige que uma das condições seja verdadeira. SELECT employee_id, last_name, job_id, salary FROM employees WHERE salary >= 10000 OR job_id LIKE '%MAN%';

Employee_id Last_name Job_id Salary

100 King AD_PRES 24000

101 Kochhar AD_VP 17000

102 De Haan AD_VP 17000

124 Mourgos ST_MAN 5800

149 Zlotkey SA_MAN 10500

174 Abel SA_REP 11000

201 Hartstein MK_MAN 13000

205 Higgins AC_MGR 12000

Operador NOT SELECT last_name, job_id FROM employees WHERE job_id NOT IN ('IT_PROG', 'ST_CLERK', 'SA_REP ');

Last_name Job_id

King AV_PRES

Kochhar AD_VP

De Haan AD_VP

Mourgos ST_MAN

Zlotkey SA_MAN

Whalen AD_ASST

Hartstein MK_MAN

Fay MK_REP

Higgins AC_MGR

Gietz AC_ACCOUNT

Regras de precedência (sobreponha regras de precedência usando parênteses):

SQL Básico

30

Ordem de avaliação Operador

1 Operadores aritméticos

2 Operador de concatenação

3 Condições de comparação

4 Is [not] null, like, [not] in

5 [not] between

6 Condição lógica NOT

7 Condição lógica AND

8 Condição lógica OR

SELECT last_name, job_id, salary FROM employees WHERE job_id = 'SA_REP' OR job_id = 'AD_PRES' AND s alary > 15000; Last_name Job_id Salary

King AD_PRES 24000

Abel SA_REP 11000

Taylor SA_REP 8600

Grant SA_REP 7000

Use parênteses para forçar a prioridade: SELECT last_name, job_id, salary FROM employees WHERE (job_id = 'SA_REP' OR job_id = 'AD_PRES') AND salary > 15000;

Last_name Job_id Salary

King AD_PRES 24000

Order byOrder byOrder byOrder by

Cláusula ORDER BY: • Classifique linhas com a cláusula ORDER BY:

• ASC: ordem crescente, default; • DESC: ordem decrescente;

• A cláusula ORDER BY aparece por último na instrução SELECT. SELECT last_name, job_id, department_id, hire_date FROM employees ORDER BY hire_date;

SQL Básico

31

Last_name Job_id Department_id Hire_date

Zlotkey SA_MAN 80 29-jan-00

Mourgos ST_MAN 50 16-nov-99

Grant SA_REP 24-may-99

Lorentz IT_PROG 60 07-feb-99

Vargas ST_CLERK 50 09-jul-98

Taylor SA_REP 80 24-mar-98

Matos ST_CLERK 50 15-mar-98

Fay MK_REP 20 17-aug-97

Davies ST_CLERK 50 29-jan-97

Classificando por apelido de coluna: SELECT employee_id, last_name, salary*12 annsal FROM employees ORDER BY annsal; Employee_id Last_name Annsal

144 Vargas 30000

143 Matos 31200

142 Davies 37200

141 Rajs 42000

107 Lorentz 50400

200 Whalen 52800

124 Mourgos 69600

104 Ernst 72000

202 Fay 72000

178 Grant 84000

Classificando por várias colunas: SELECT last_name, department_id, salary FROM employees ORDER BY department_id, salary DESC;

Last_name Department_id Salary

Whalen 10 4400

Hartstein 20 13000

Fay 20 6000

Mourgos 50 5800

Rajs 50 3500

SQL Básico

32

Last_name Department_id Salary

Davies 50 3100

Matos 50 2600

Vargas 50 2500

Você também pode classificar por uma coluna que não esteja na lista do SELECT.

ExercíciosExercíciosExercíciosExercícios

1. Crie uma consulta para exibir o nome e o salário dos funcionários que recebem mais de R$ 3000; 2. Crie uma consulta para exibir o nome do funcionário e o número do departamento para o número do

funcionário 101. 3. Modifique a consulta do exercício 1 para exibir o nome e o salário de todos os funcionários cujos salários

não estejam na faixa entre R$ 2500 e R$ 3000. 4. Exiba o nome do funcionário, o cargo e a data de admissão dos funcionários admitidos entre 01 de janeiro

de 1997 e 1 de setembro de 1997. Ordene a consulta de modo crescente pela data inicial. 5. Exiba o nome do funcionário e o número do departamento de todos os funcionários entre os departamentos

10 e 30 por ordem alfabética de nome. 6. Monte uma consulta para listar o nome e o salário dos funcionários que recebem mais de R$ 2800 e que

estão nos departamentos 10 ou 30. Nomeie as colunas Empregado e Salário Mensal , respectivamente. 7. Exiba o nome e a data de admissão de cada funcionário admitido em 1998. 8. Exiba o nome e o cargo de todos os funcionários que não possuem em gerente. 9. Exiba o nome, o salário e a comissão de todos os funcionários que recebem comissão. Classifique os

dados em ordem decrescente de salários e comissões. 10. Exiba os nomes de todos os funcionários que possuem um A na terceira letra de seus nomes. 11. Exiba todos os funcionários que possuem duas letras LL em seus nomes e estão no departamento 30 ou

seu gerente seja o 100. 12. Exiba o nome, o cargo e o salário de todos os funcionários cujos cargos seja Clerk ou Analyst e que seus

salários não sejam iguais a R$ 1000, R$ 3000 ou R$ 5000. 13. Modifique a consulta do exercício 6 para exibir o nome, o salário e a comissão de todos os funcionários

cuja quantia de comissão seja maior que seus salários com 10% de aumento.

SQL Básico

33

8888 Funções SQFunções SQFunções SQFunções SQLLLL

As funções são um recurso avançado de SQL e podem ser usados para realizar o seguinte:

• Executar cálculos usando dados; • Modificar itens de dados individuais; • Manipular saída para grupos de linhas; • Formatar datas e números para exibição; • Converter tipos de dados de coluna.

nome_função [(arg1, arg2, ...)]

SQL Básico

34

SQL Básico

35

Funções de Caracter (Conversão de Maiúsculas e Minúsculas)Funções de Caracter (Conversão de Maiúsculas e Minúsculas)Funções de Caracter (Conversão de Maiúsculas e Minúsculas)Funções de Caracter (Conversão de Maiúsculas e Minúsculas)

Função Objetivo LOWER Converte valores de caractere alfabético para letras minúsculas. UPPER Converte valores de caractere alfabético para letras maiúsculas. INITCAP Converte valores de caractere alfabético para letras maiúsculas na primeira letra de cada

palavra e todas as outras letras em minúsculas.

Exemplos:

Função Resultado

LOWER('SQL Course') sql course

UPPER('SQL Course') SQL COURSE

INITCAP('SQL Course') Sql Course

Usando funções de manipulação de maiúsculas e minúsculas: exibir o número, o nome e o número do departamento do funcionários Higgins: SELECT employee_id, last_name, department_id FROM employees WHERE last_name = 'higgins'; no rows selected SELECT employee_id, last_name, department_id FROM employees WHERE LOWER(last_name) = 'higgins'; Employee_id Last_name Deparment_id

205 Higgins 110

Funções de Caracter (Manipulação de caractere)Funções de Caracter (Manipulação de caractere)Funções de Caracter (Manipulação de caractere)Funções de Caracter (Manipulação de caractere)

Funcção Objetivo CONCAT Concatena o primeiro valor do caractere ao segundo valor do caractere, equivalente ao

operador de concatenação ( || ). SUBSTR (coluna,m,n)

Retorna caracteres específicos a partir do valor de caractere começando na posição m, até n caracteres depois.

LENGHT Retorna o número de caracteres do valor INSTR Retorna a posição numérica do caractere nomeado. LPAD / RPAD (coluna,n,string)

Preenche o valor de caractere com a string, justificando à (esquerda ou direita), preenchendo o tamanho de n posições faltantes da qtde da coluna.

Exemplos:

Função Resultado

SQL Básico

36

Função Resultado

CONCAT('Hello','Word') HelloWord

SUBSTR('HelloWord',1,5) Hello

LENGTH('HelloWord') 10

INSTR('HelloWord','W') 6

LPAD(salary,10,'*') *****24000

RPAD(salary,10,'*') 24000*****

TRIM('H' FROM 'HelloWord') elloWord

Usando as funções de manipulação de caracteres: SELECT employee_id, CONCAT(first_name, last_name) N AME, job_id, LENGTH (last_name), INSTR(last_name, 'a') "Contains 'a'?" FROM employees WHERE SUBSTR(job_id, 4) = 'REP'; Employee_id Name Job_id Length(last_name) Contains 'a'?

174 EllenAbel SA_REP 4 0

176 JonathanTaylor SA_REP 3 2

178 KimberelyGrant SA_REP 5 3

202 PatFay MK_REP 3 2

Funções numéricasFunções numéricasFunções numéricasFunções numéricas

Função Objetivo ROUND(coluna, n) Arredonda a coluna, expressão ou valor para n casas decimais ou se n for

omitido, nenhuma casa decimal (Se n for negativo, os números à esquerda do ponto decimal serão arredondados.)

TRUNC(coluna, n) Trunca a coluna, expressão ou valor para n casas decimais ou se n for omitido, nenhuma casa decimal (Se n for negativo, os números à esquerda do ponto decimal serão truncados para zero.)

MOD(m, n) Retorna o resto de m dividido por n. Usando a função round: SELECT ROUND(45.923,2), ROUND(45.923,0),ROUND(45.92 3,-1) FROM DUAL;

Round(45.923,2) Round(45 .923,0) Round(45.923, -1)

45.92 46 50

Dual é uma tabel fictícia usada para exibir resultados de funções e cálculos. Usando a função trunc:

SQL Básico

37

SELECT TRUNC(45.923,2), TRUNC(45.923),TRUNC(45.923, -2) FROM DUAL; Trunc(45.923,2) Trunc(45.923) Trunc(45.923,-2)

45.92 45 0

Usando a função mod: calcule o que resta de um salário após dividí-lo por 5000 para todos os funcionários cujo cargo seja representante de vendas (SA_REP). SELECT last_name, salary, MOD(salary, 5000) FROM employees WHERE job_id = 'SA_REP';

Last_name Salary Mod(salary,5000)

Abel 11000 1000

Taylor 8600 3600

Grant 7000 2000

Trabalhando com datasTrabalhando com datasTrabalhando com datasTrabalhando com datas

• O banco de dados Oracle armazena datas em um formato de número interno: século, ano, mês, dia, horas, minutos segundos;

• O formato de exibição da data default é DD-MON-YY; • SYSDATE é uma função de retorno de data e hora; • DUAL é uma tabela fictícia usada para visualizar SYSDATE. SELECT last_name, hire_date FROM employees WHERE last_name like 'G%'; Last_name Hire_date

Gietz 07-JUN-94

Grant 24-MAY-99

Sysdate é uma função que retorna: • Data; • Hora. Aritmética com datas: • Adicionar ou subtrair um número de, ou para, uma data para um valor de data resultante; • Subtrair duas datas para localizar o número de dias entre as datas; • Adicionar horas para uma data dividindo o número de horas por 24. Usando operadores aritméticos com datas: SELECT last_name, (SYSDATE-hire_date)/7 AS WEEKS FROM employees

SQL Básico

38

WHERE department_id = 10;

Last_name Weeks

King 744.245395

Kochhar 626.102538

De Haan 453.245395

O exemplo exibe o nome e o número de semanas empregadas por todos os funcionários do

departamento 10. Ele subtrai a data atual (SYSDATE) a partir da data na qual o funcionário foi admitido e divide o resultado por 7 a fim de calcular o número de semanas que o trabalhador está empregado. Funções de data:

Função Descrição

MONTHS_BETWEEN(data1, data2) Localiza o nr. de meses entre a data1 e a data2 .

ADD_MONTHS(data,n) Adiciona um número n de meses de calendário à data . O valor de n pode ser inteiro ou pode ser negativo.

NEXT_DAY(data,’char’) Localiza a data do próximo dias especificado da data seguinte da semana (‘char’). O valor de char pode ser um número representando um dia ou uma string de caractere.

LAST_DAY(data) Localiza a data do último dia do mês que contém a data.

ROUND(data) Arredonda a data

TRUNC(data) Trunca a data

Usando funções de data: • MONTHS_BETWEEN ('01-sep-95','11-jan-94') = 19.67741494 • ADD_MONTHS ('11-JAN-94',6) = '11-JUL-94' • NEXT_DAY ('01-SEP-95','FRIDAY') = '08-SEP-95' • LAST_DAY('01-SEP-95') = '28-FEB-95 Suponha que SYSDATE = '25-JUL-95': • ROUND(SYSDATE,'MONTH') 01-AUG-95 • ROUND(SYSDATE ,'YEAR') 01-JAN-96 • TRUNC(SYSDATE ,'MONTH') 01-JUL-95 • TRUNC(SYSDATE ,'YEAR') 01-JAN-95 Conversão de tipos de dados implícita: Nas designações, o servidor Oracle pode converter automaticamente o seguinte:

De Para

VARCHAR2 ou CHAR NUMBER

VARCHAR2 ou CHAR DATE

NUMBER VARCHAR2

DATE VARCHAR2

SQL Básico

39

Conversão de dados explícitaConversão de dados explícitaConversão de dados explícitaConversão de dados explícita

Função Objetivo TO_CHAR(número/data, [fmt]) Converte números ou datas para tipo de dados VARCHAR2. TO_NUMBER(caractere, [fmt]) Converte um string de caractere contendo dígitos para um

número no formato especificado pelo modelo de formato opcional fmt.

TO_DATE (caractere, [fmt]) Converte uma string de caractere representando uma data para um valor de data de acordo com o fmt especificado. Se o fmt for omitido, o formato é DD-MON-YY.

Função TO_CHAR com Datas. Elemento Descrição SCC ou CC Século; Prefixos S data AC com - Anos em datas YYYY ou SYYYY

Ano; Prefixos S data AC com -

YYY ou YY ou Y Últimos três, dois ou um dígito do ano Y,YYY Ano com vírgula nessa posição IYYY, IYY, IY, I Quatro, três, dois ou um dígito do ano com base no padrão ISO. SYEAR ou YEAR Ano inteiro; Prefixos S data AC com - BC ou AD Indicador AC/DC B.C ou A.D. Indicador com pontos AC/DC Q Trimestre do ano

SQL Básico

40

MM Mês, valor de dois dígitos MONTH Nome do mês preenchido com espaços limitado a nove caracteres. MON Nome do mês, abreviação de três letras RM Mês em números romanos WW ou W Semana do ano ou mês DDD ou DD ou D Dia do ano, mês ou semana DAY Nome do dia preenchido com espaços limitado a nove caracteres. DY Nome do dia; abreviação de três letras J Dia do calendário juliano; o número de dias desde 31 de dezembro

4713 BC Formatos de hora Elemento Descrição AM ou PM Indicador meridiano AM ou P.M Indicador meridiano com pontos HH ou HH12 ou HH24 Horas do dia ou hora (1 a 12) ou hora (0 a 23) MI Minuto (0 a 59) SS Segundo (0 a 59) SSSSS Segundos após a meia-noite (0-86399) Exemplos: SELECT last_name, TO_CHAR(hire_date, 'fmDD Month YY YY') AS HIREDATE FROM employees;

Last_name Hiredate

King 17 june 1987

Kochhar 21 september 1989

De Haan 13 january 1993

Hunold 3 january 1990

Ernst 21 may 1991

Lorentz 7 february 1999

Mourgos 16 november 1999

Obs.: O fm alinha as informações das colunas. Usando a função TO_CHAR com números: estes são alguns dos elementos de formato que podem ser usados com a função TO_CHAR para exibir um valor numérico como um caractere. Element o Descrição Exemplo Resultado 9 Posição numérica (número de 9s determinam o

tamanho da exibição) 999999 1234

0 Exibe zeros à esquerda 099999 001234 $ Sinal de dólar flutuante $99999 $1234 L Símbolo da moeda local flutuante (Moeda do Banco) L99999 FF1234

SQL Básico

41

. Ponto decimal na posição especificada 999999.99 1234.00 , Vírgula na posição especificada 999,999 1,234 MI Sinais de menos à direita (valores negativos) 999999MI 1234- PR Coloca números negativos entre parênteses 999999PR (1234) EEEE Notação científica (formato deve especificar quatro Es) 99.999EEEE 1.234E+03 V Multiplica por 10 n vezes (n = número de 9s após o V) 9999V99 123400 B Exibe valores de zero como espaço, não 0 B9999.99 1234.00 SELECT TO_CHAR(salary, '$99,999.00') SALARY FROM employees WHERE last_name = 'Ernst';

Salary

$6,000.00

Usando as funções TO_NUMBER e TO_DATE: • Converter uma string de caracteres em um formato de número usando a função TO_NUMBER:

TO_NUMBER(caract[, 'modelo_formato']); • Converter uma string de caracteres em um formato de data usando a função TO_DATE:

TO_DATE(caract[, 'modelo_formato']); Formato de data RR:

Ano atual Data especifada Formato RR Formato YY

1995 27-oct-95 1995 1995

1995 27-oct-17 2017 1917

2001 27-oct-17 2017 2017

2001 27-oct-95 1995 2095

Se o ano de dois dígitos especifado for:

0-49 50-99

Se os dois dígitos do ano atual forem:

0-49 A data retornada estará no século atual

A data retornada estará no século anterior

50-99 A data retornada estará no século seguinte

A data retornada estará no século atual

Exemplo de formato de data RR: para determinar os funcionários admitidos antes de 1990, use oformato RR, que produz os mesmos resultados independentemente de o comando ser executado em 1999 ou agora: SELECT last_name, TO_CHAR(hire_date, 'DD-Mon-YYYY') FROM employees WHERE hire_date < TO_DATE('01-Jan-90', 'DD-Mon-RR') ; Last_name to_char(hire_date)

SQL Básico

42

Last_name to_char(hire_date)

King 17-jun-1987

Kochhar 21-sep-1989

Whalen 17-sep-1987

Função NVLFunção NVLFunção NVLFunção NVL

• Converte um valor NULO para um valor real; • Os tipos de dados que podem ser usados são: datas, caracteres e números; • NVL(expr1, expr2)

expr1: é o valor de origem ou expressão que pode conter nulo. Expr2: é o valor de destino para a conversão de nulo.

Tipo de dados Exemplo de Conversão NUMBER NVL ( column_number, 9) DATE NVL (column_date, ‘01-JAN-95’) CHAR ou VARCHAR2 NVL (column_caracter, ‘Não preenchido`) Exemplos: select last_name, comm from emp; Last_name Comm

King Blake Martin 1400 select last_name, NVL(comm, 0) from emp; Last_name Comm King 0 Blake 0 Martin 1400 SELECT last_name, salary, NVL(commission_pct, 0),(salary*12) + (salary*12*NVL (commission_pct, 0)) AN_SAL FROM employees; Last_name Salary Nvl(commission_pct,0) an_sal

King 24000 0 288000

Kochhar 17000 0 204000

De Haan 17000 0 204000

SQL Básico

43

Last_name Salary Nvl(commission_pct,0) an_sal

Hunold 9000 0 108000

Ernst 6000 0 720000

Lorentz 4200 0 50400

Mourgos 5800 0 69600

Rajs 3500 0 42000

Expressões condicionais: propiciam o uso da lógica IF-THEN-ELSE em uma instrução SQL.

A expressão CASEA expressão CASEA expressão CASEA expressão CASE

Facilita as pesquisas condicionais funcionando como uma instrução IF-THEN-ELSE: CASE expr WHEN comparação_expr1 THEN retorna_expr1 [WHEN comparação_expr2 THEN retorna_expr2 WHEN comparação_exprn THEN retorna_exprn ELSE else_expr ] END SELECT last_name, job_id, salary, CASE job_id

WHEN 'IT_PROG' THEN 1.10*salary WHEN 'ST_CLERK' THEN 1.15*salary WHEN 'SA_REP' THEN 1.20*salary

ELSE salary END "REVISED_SALARY" FROM employees;

Last_name Job_id Salary Revised_salary

Lorentz IT_PROG 4200 4620

Mougos ST_MAN 5800 5800

Rajs ST_CLERK 3500 4025

A função DECODEA função DECODEA função DECODEA função DECODE

Facilita as pesquisas condicionais funcionando como uma instrução CASE ou IF-THEN-ELSE DECODE(col|expressão, pesquisa1, resultado1 [ , pesquisa2, resultado2,..., ] [, default ]) SELECT last_name, job_id, salary, DECODE(job_id, 'IT_PROG', 1.10*salary, 'ST_CLERK', 1.15*salary, 'SA_REP', 1.20*salary, salary) REVISED_SALARY FROM employees;

SQL Básico

44

Last_name Job_id Salary Revised_salary

Lorentz IT_PROG 4200 4620

Mourgos ST_MAN 5800 5800

Rajs ST_CLERK 3500 4025

Gietz AC_ACCOUNT 8300 8300

Exibir a alíquota de imposto aplicável para cada funcionário do departamento 80: SELECT last_name, salary, DECODE (TRUNC(salary/2000, 0), 0, 0.00, 1, 0.09, 2, 0.20, 3, 0.30, 4, 0.40, 5, 0.42, 6, 0.44, 0.45) TAX_RATE FROM employees WHERE department_id = 80;

Aninhando funçõesAninhando funçõesAninhando funçõesAninhando funções

• As funções de uma única linha podem ser aninhadas em qualquer nível.; • As funções aninhadas são avaliadas do nível mais interno para o mais externo. F3(F2(F1(col1,arg1),arg2),arg3) SELECT last_name, NVL(TO_CHAR(manager_id), 'Sem ger ente') FROM employees WHERE manager_id IS NULL; Last_ name Nvl(to_char(manager_id), ' Sem gerente ')

King Sem gerente

Para mostrar a data da próxima sexta-feira, que fica seis meses após a data de admissão. A data resultante deve aparecer como Friday, March 12th, 1982. Ordenar os resultados por data de admissão. select TO_CHAR ( NEXT_DAY (ADD_MONTHS( hiredate, 6 ), ‘FRIDAY’), ‘fmdDay, Month ddth, YYYY) “Rever depois de 6 meses” from emp order by hiredate;

ExercíciosExercíciosExercíciosExercícios

1. Crie uma consulta para exibir a data atual. Coloque um label na coluna como Data.

SQL Básico

45

2. Exiba o número do funcionário, o nome, o salário e o aumento salarial de 15% expresso como

número inteiro. Coloque um label na coluna como Novo Salario. 3. Modifique a consulta do exercício 2 para adicionar uma coluna que subtrairá o salário antigo do

novo salário. Coloque um label na coluna Incremento. Execute novamente a consulta. 4. Exiba o nome do funcionário, a data de admissão que é a primeira segunda-feira após seis meses

de serviço. Coloque um label na coluna REVISÃO. Formate as datas que aparecem em formato semelhante a “Sunday, the Seventh of September, 1981”.

5. Para cada funcionário exiba o nome do mesmo e calcule o número de meses entre hoje e a sua

data de admissão. Coloque um label na coluna MESES_TRABALHADOS. Ordene os resultados por número de meses empregado. Arredonde para cima o número de meses para o número inteiro mais próximo.

6. Crie uma consulta que produza as seguintes informações para cada funcionário: <nome do

funcionário> recebe <salário> mensalmente mas deseja <salário multiplicado por 3>. Coloque um label na coluna, como “Sonho Salarial”.

7. Crie uma consulta que exiba o nome e o salário de todos os funcionários. Formate o salário para

ter 15 caracteres e apresentar o sinal $ à esquerda. Coloque um label na coluna como SALÁRIO. 8. Crie uma consulta que exibirá o nome do funcionário com a primeira letra maiúscula e todas as

outras minúsculas, bem como o tamanho de seus nomes, para todos os funcionário cujo nome começa com J, A ou M. Forneça cada coluna um label apropriado.

9. Exiba o nome, a data de admissão e o dia da semana em que o funcionário começou a trabalhar.

Coloque um label na coluna DAY. Ordene os resultados por dia da semana, iniciando por Segunda.

SQL Básico

46

9999. . . . ExibiExibiExibiExibindo dados de várias tabelasndo dados de várias tabelasndo dados de várias tabelasndo dados de várias tabelas

Definindo JunçõesDefinindo JunçõesDefinindo JunçõesDefinindo Junções

Quando são necessários dados de uma ou mais tabelas no banco de dados, usa-se uma condição de junção (JOIN). As linhas de uma tabela podem ser unidas às linhas de outra tabela de acordo com os valores comuns existentes nas colunas correspondentes, isto é, em geral colunas de chave primária e estrangeira. Oracle: Select tabela1.coluna, tabela2.coluna From tabela1, tabela2 Where tabela.coluna1 = tabela2.coluna2;

SQL padrão: Select tabela1.coluna, tabela2.coluna From tabela1 inner join tabela2 On tabela.coluna1 = tabela2.coluna2;

Produto cartesiano: Um produto cartesiano será formado quando: • Uma condição de junção for omitida; • Uma condição de junção for inválida;

SQL Básico

47

• Todas as linhas da primeira tabela forem unidas a todas as linhas da segunda tabela; • Para evitar um produto Cartesiano, sempre inclua uma condição de junção válida em uma

cláusula WHERE. Gerando um produto cartesiano:

Unindo tabelas usando a sintaxe do Oracle: • Crie uma condição de junção na cláusula WHERE; • Coloque o nome da tabela antes do nome da coluna quando aparecer o mesmo nome de coluna

em mais de uma tabela.

SQL Básico

48

SELECT employees.employee_id, employees.last_name, employees.department_id, departments.department_id, departments.location_id FROM employees, departments WHERE employees.department_id = departments.departm ent_id; Exercício : montar o resultado da consulta Qualificando nomes de colunas ambíguos: • Use prefixos de tabela para qualificar nomes de colunas que estão em várias tabelas; • Diferencie colunas que possuem nomes idênticos, mas que residam em tabelas diferentes usando

apelidos de coluna.

Tipos de JunçõesTipos de JunçõesTipos de JunçõesTipos de Junções

Junção Idêntica Junção não-idêntica Junção Externa Autojunção (EQUIJOIN) (NON-EQUIJOIN) (OUTER JOIN) (SELF JOIN)

O O O O que é uma Junção idêntica (EQUIJOIN)?que é uma Junção idêntica (EQUIJOIN)?que é uma Junção idêntica (EQUIJOIN)?que é uma Junção idêntica (EQUIJOIN)? Para determinar o nome do departamento de um funcionário, compare o valor na coluna

DEPTNO na tabela EMPLOYEES com os valores DEPTNO da tabela DEPARTMENTS. O relacionamento entre as tabelas EMPLOYEES e DEPARTMENTS é uma junção idêntica – ou seja,

SQL Básico

49

os valores da coluna DEPTNO das duas tabelas devem ser iguais. Com freqüência, essa junção envolve complementos de chave primária e estrangeira. Obs.: As junções idênticas também são chamadas de junções simples ou junções internas. SELECT employees.employee_id, employees.last_name, employees.department_id, departments.department_id, departments.location_id FROM employees, departments WHERE employees.department_id = departments.departm ent_id;

Usando apelidos de tabelas SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_id FROM employees e, departments d WHERE e.department_id = d.department_id; O que é uma Junção nãoO que é uma Junção nãoO que é uma Junção nãoO que é uma Junção não----idêntica (NONidêntica (NONidêntica (NONidêntica (NON----EQUIJOIN)?EQUIJOIN)?EQUIJOIN)?EQUIJOIN)?

O relacionamento entre a tabela EMPLOYEES e a tabela JOB_GRADES é uma junção não-idêntica, o que significa que nenhuma coluna da tabela EMPLOYEES corresponde diretamente a uma coluna da tabela JOB_GRADES. O relacionamento entre as duas tabelas é que a coluna SAL da tabela EMPLOYEES está entre a coluna LOWEST_SAL e HIGHEST_SAL da tabela JOB_GRADES. O relacionamento é obtido usando um outro operador que não o igual ( = ).

Employees Employee_id Last_name Salary

7839 King 5000 7698 Blake 2850 7782 Clark 2450

Job_Grades Gra Lowest_sal Highest_sal A 1000 2999 B 3000 5999 C 6000 9999 D 10000 14999 E 15000 24999 F 25000 40000 O salário na tabela EMPLOYEES está entre salário inferior e salário superior na tabela JOB_GRADES. SELECT e.last_name, e.salary, s.class FROM employees e, job_grades s WHERE e.salary BETWEEN s.losal AND s.hisal; Last_name Salary Gra King 5000 B Blake 2850 A Clark 2450 A

SQL Básico

50

O que é uma Junção externa (OUTER JOIN)?O que é uma Junção externa (OUTER JOIN)?O que é uma Junção externa (OUTER JOIN)?O que é uma Junção externa (OUTER JOIN)? Se uma linha não satisfizer uma condição de junção, a linha não aparecerá no resultado da

consulta. Por exemplo, na condição de junção idêntica (equijoin) das tabelas EMPLOYEES e DEPARTMENTS, o departamento CONTRACTING não aparece porque ninguém trabalha neste departamento.

. Para trazer este departamento preciso usar o OUTER JOIN. • Usar uma junção externa para ver também todas as linhas que não atendem à condição de

junção; • O operador de junção externa é o sinal de mais (+).

SELECT tabela1.coluna, tabela2.coluna FROM tabela1, tabela2 WHERE tabela1.coluna (+) = tabela 2. coluna ; SELECT tabela1.coluna, tabela2.coluna FROM tabela1, tabela2 WHERE tabela1.coluna = tabela2.coluna (+) ; SELECT e.last_name, e.department_id, d.department_n ame FROM employees e, departments d WHERE e.department_id(+) = d.department_id ; Last_name Department_id Department_name

SQL Básico

51

Last_name Department_id Department_name

Whalen 10 Administration

Hartstein 20 Marketing

Fay 20 Marketing

Mourgos 50 Shipping

Rajs 50 Shipping

Davies 50 Shipping

Contracting

O que é uma Autojunção (SELF JOIN)?O que é uma Autojunção (SELF JOIN)?O que é uma Autojunção (SELF JOIN)?O que é uma Autojunção (SELF JOIN)? Algumas vezes será necessário unir uma tabela a ela mesma. Para localizar o nome do gerente de cada funcionário, é necessário unir a tabela EMPLOYEES a ela mesma ou executar uma autojunção. Por exemplo, para localizar o nome do gerente de Blake, é necessário: • Localizar Blake na tabela EMPLOYEES consultando a coluna last_name; • Localizar o número do gerente de Blake consultando a coluna manager_id. O número do gerente

de Blake é 7839; • Localizar o nome do gerente como o employee_id 7839 consultando a coluna last_name. O

número do funcionário King é 7839, então King é gerente de Blake. SELECT worker.last_name || ‘trabalha para’ || manag er. last_name FROM employees worker, employees manager WHERE worker.manager_id = manager.employee_id; worker.last_name || ‘trabalha para’ || manager. las t_name BLAKE trabalha para KING CLARK trabalha para KING MARTIN trabalha para BLAKE Unindo tabelas usando a sintaxe SQL99Unindo tabelas usando a sintaxe SQL99Unindo tabelas usando a sintaxe SQL99Unindo tabelas usando a sintaxe SQL99 Criando junções com a cláusula ON: SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_id FROM employees e JOIN departments d ON (e.department_id = d.department_id);

Employee_id Last_name Department_id Department_id Location_id

200 Whalen 10 10 1700

201 Hartstein 20 20 1800

202 Fay 20 20 1800

124 Mourgos 50 50 1500

141 Rajs 50 50 1500

142 Davies 50 50 1500

SQL Básico

52

Employee_id Last_name Department_id Department_id Location_id

143 Matos 50 50 1500

Criando junções triplas com a cláusula ON: SELECT employee_id, city, department_name FROM employees e JOIN departments d ON d.department_id = e.department_id JOIN locations l ON d.location_id = l.location_id; Employee_id City Department_name

103 Southlake IT

104 Southlake IT

107 Southlake IT

124 South San Francisco Shipping

141 South San Francisco Shipping

142 South San Francisco Shipping

143 South San Francisco Shipping

144 South San Francisco Shipping

Junções de tabelas externas (outer join): SELECT e.last_name, e.department_id, d.department_n ame FROM employees e LEFT OUTER JOIN departments d ON (e.department_id = d.department_id) ; Last_name Department_id Department_name

Whalen 10 Administration

Fay 20 Marketing

Hartstein 20 Marketing

De Haan 90 Executive

Kochhar 90 Executive

King 90 Executive

Gietz 110 Accounting

Higgins 110 Accounting

Grant

SELECT e.last_name, e.department_id, d.department_n ame FROM employees e RIGHT OUTER JOIN departments d

SQL Básico

53

ON (e.department_id = d.department_id) ;

Last_name Department_id Department_name

King 90 Executive

Kochhar 90 Executive

Whalen 10 Administration

Hartstein 20 Marketing

Fay 20 Marketing

Higgins 110 Accounting

Gietz 110 Accounting

Contracting

SELECT e.last_name, e.department_id, d.department_n ame FROM employees e FULL OUTER JOIN departments d ON (e.department_id = d.department_id) ; Last_name Department_id Department_name

Whalen 10 Administration

Fay 20 Marketing

De Haan 90 Executive

Kochhar 90 Executive

King 90 Executive

Geitz 110 Accounting

Higgins 110 Accounting

Grant

Contracting

Condições adicionais: SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_id FROM employees e JOIN departments d ON (e.department_id = d.department_id) AND e.manager_id = 149 ; Employee_id Last_name Department_id Department_id Location_id

174 Abel 80 80 2500

176 Taylor 80 80 2500

SQL Básico

54

ExercíciosExercíciosExercíciosExercícios

1. Crie uma consulta para exibir o nome, o número e o nome do departamento de todos os

funcionários. 2. Crie uma lista única de todos os cargos existentes no departamento 60. Inclua a localização do

departamento 60 na saída. 3. Crie uma consulta para exibir o nome do funcionário, o nome do departamento e a localização de

todos os funcionários que recebem uma comissão. 4. Exiba o nome do funcionário e o nome do departamento para todos os funcionários que possuem

um “A” em seus nomes. 5. Crie uma consulta para exibir o nome, o cargo, o número e o nome do departamento para todos

os funcionário que tem a função IT_PROG. 6. Exiba o nome e o número do funcionário junto com o nome e o número do gerente. Coloque um

label nas colunas Employee, Emp#, Manager e Mgr#, respectivamente. 7. Modifique o exercício 6 para exibir todos os funcionários incluindo King, que não possuem um

gerente. 8. Crie uma consulta que exibirá o nome dos funcionários, o número do departamento e todos os

funcionários que trabalham no mesmo departamento de um determinado funcionário. Forneça a cada coluna um label apropriado.

9. Mostre a estrutura da tabela JOB_GRADES. Crie uma consulta que exiba o nome, o cargo, o

nome do departamento, o salário e a classificação de todos os funcionários. 10. Crie uma consulta para exibir o nome e a data de admissão de qualquer funcionário admitido

após o funcionário Blake. 11. Exiba todos os nomes de funcionários e as datas de admissão junto com o nome e a data de

admissão do gerente para todos os funcionários admitidos antes de seus gerentes. Coloque um label nas colunas Employee, Emp Hiredate, Manager e Mgr Hiredate, respectivamente.

SQL Básico

55

10 10 10 10 Funções de grupoFunções de grupoFunções de grupoFunções de grupo

As funções de grupo operam em conjuntos de linhas para fornecer um resultado por grupo. Sintaxe das funções de grupo: SELECT [ coluna ,] função_de_grupo(coluna), ... FROM tabela [WHERE condição ] [GROUP BY coluna ] [ORDER BY coluna ];

Exemplos:

Função Descrição AVG ([DISTINCT] n ) Valor médio de n, ignorando valores nulos COUNT ({*|[DISTINCT]EXPR}) Número de linhas, onde expr avalia para algo diferente de nulo (Conte

todas as linhas selecionadas usando *, inclusive duplicadas e linhas com nulos.)

MAX([DISTINCT]expr) Valor máximo de expr , ignorando valores nulos MIN([DISTINCT]expr) Valor mínimo de expr , ignorando valores nulos SUM([DISTINCT]expr) Valores somados de n , ignorando valores nulos SELECT AVG(salary), MAX(salary), MIN(salary), SUM(s alary) FROM employees WHERE job_id LIKE '%REP%'; AVG(salary) MAX(salary) MIN(salary) SUM(salary)

8150 11000 6000 32600

Função COUNTFunção COUNTFunção COUNTFunção COUNT A Função COUNT tem dois formatos: • COUNT(*): Retorna o número de linhas em uma tabela, inclusive linhas duplicadas e linhas contendo

valores nulos em qualquer uma das colunas. Se uma cláusula WHERE estiver incluída na instrução SELECT, COUNT(*) retornará o número de linhas que satisfizer a condição na cláusula WHERE;

• COUNT(expr): retorna o número de linhas não nulas na coluna identificada por expr; • COUNT(DISTINCT expr) retorna o número de valores não-nulos distintos da expr. SELECT COUNT(*) FROM employees WHERE department_id = 50; Count(*) 5 SELECT COUNT(DISTINCT department_id) FROM employees; COUNT(DISTINCT department_id)

SQL Básico

56

5 Funções de Grupo e valores NULOSFunções de Grupo e valores NULOSFunções de Grupo e valores NULOSFunções de Grupo e valores NULOS As funções de grupo ignoram valores nulos na coluna. SELECT AVG(commission_pct) FROM employees; AVG(commission_pct) 0,2125 A função NVL força as funções de grupo a incluírem valores nulos. SELECT AVG(NVL(commission_pct, 0)) FROM employees;

AVG(NVL(commission_pct, 0)) 0,0425 Criando Grupos de Dados: group byCriando Grupos de Dados: group byCriando Grupos de Dados: group byCriando Grupos de Dados: group by Até o momento, todas as funções de grupo trataram a tabela como um grande grupo de informações. Às vezes, é necessário dividir a tabela de informações em grupos menores. Isso pode ser feito usando a cláusula GROUP BY. Todas as colunas na lista SELECT que não estejam em funções de grupo devem estar na cláusula GROUP BY. O salário médio na tabela EMPLOYEES para cada departamento. SELECT department_id, AVG(salary) FROM employees GROUP BY department_id; Department_id AVG(salary)

10 4400 20 9500 50 3500 60 6400 80 10033,333 90 19333,333

110 10150 7000

A coluna GROUP BY não precisa estar na lista SELECT. SELECT AVG(salary) FROM employees GROUP BY department_id; AVG(salary)

4400 9500 3500 6400

SQL Básico

57

10033,333 19333,333

10150 7000

Agrupando por mais de uma coluna: adicione os salários na tabela EMPLOYEES para cada cargo, agrupando por departamento. SELECT department_id dept_id, job_id, SUM(salary) FROM employees GROUP BY department_id, job_id ; Dept_id Job_id SUM(salary) 10 AD_ASST 4400 20 MK_MAN 13000 20 MK_REP 6000 50 ST_CLERK 11700 50 ST_MAN 5800 60 IT_PROG 19200 80 SA_MAN 10500 80 SA_REP 19600 90 AD_PRES 24000 90 AD_VP 34000 110 AC_ACCOUNT 8300 110 AC_MRG 12000 SA_REP 7000 Consultas Inválidas Usando Funções de GrupoConsultas Inválidas Usando Funções de GrupoConsultas Inválidas Usando Funções de GrupoConsultas Inválidas Usando Funções de Grupo Qualquer coluna ou expressão na lista SELECT que não seja uma função agregada deve estar na cláusula GROUP BY. SELECT department_id, COUNT(last_name) FROM employees; SELECT department_id, COUNT(last_name) * ERROR at line 1: ORA-00937: not a single-group group function

Coluna ausente na cláusula GROUP BY

Excluindo Resultados do Grupo: Cláusula HAVINGExcluindo Resultados do Grupo: Cláusula HAVINGExcluindo Resultados do Grupo: Cláusula HAVINGExcluindo Resultados do Grupo: Cláusula HAVING Use a cláusula HAVING para restringir grupos: • As linhas são agrupadas; • A função de grupo é aplicada; • Os grupos que correspondem à cláusula HAVING são exibidos; • Não é possível usar a cláusula WHERE para restringir grupos; • Não é possível usar funções de grupo na cláusula WHERE.

SQL Básico

58

A cláusula HAVING pode preceder a cláusula GROUP BY, mas recomenda-se que você coloque a cláusula GROUP BY primeiro, por ser mais lógico. SELECT department_id, AVG(salary) FROM employees WHERE AVG(salary) > 8000 GROUP BY department_id; WHERE AVG(salary) > 8000 * ERROR at line 3: ORA-00934: group function is not allowed here

Não é possível usar a cláusula WHERE para restringi r grupos O salário máximo por departamento quando por maior que 10.000 SELECT department_id, MAX(salary) FROM employees GROUP BY department_id HAVING MAX(salary)>10000 ; Department_id MAX(salary) 20 13000 80 11000 90 24000 110 12000 SELECT job_id, SUM(salary) PAYROLL FROM employees WHERE job_id NOT LIKE '%REP%' GROUP BY job_id HAVING SUM(salary) > 13000 ORDER BY SUM(salary); Job_id PAYROLL IT_PROG 19200 AD_PRES 24000 AD_VP 34000 Aninhando funções de grupo: exiba o salário médio máximo SELECT MAX(AVG(salary)) FROM employees GROUP BY department_id; MAX(AVG(salary))

19333,333

ExercíciosExercíciosExercíciosExercícios

Determine a validade das afirmações a seguir. Marque Verdadeiro ou Falso.

SQL Básico

59

1. As funções de grupo operam em muitas linhas para produzir um resultado por grupo. Verdadeiro/Falso 2. As funções de grupo incluem nulos nos cálculos. Verdadeiro/Falso 3. A cláusula WHERE restringe as linhas antes da inclusão em um cálculo de grupo. Verdadeiro/Falso 4. Exiba os salários maior, médio, menor e a soma de todos os salários de todos os funcionários.

Coloque um label nas colunas Máximo, Mínimo, Soma e Média, respectivamente. Arredonde os resultados para o número inteiro mais próximo.

5. Modifique o exercício 4 para exibir o salário maior, médio, menor e a soma de todos os salários

para cada tipo de cargo. 6. Crie uma consulta para exibir o número de pessoas com o mesmo cargo. 7. Determine o número de gerentes sem listá-los. Coloque um label na coluna Número de Gerentes. 8. Crie uma consulta para exibir a diferença entre os maiores e menores salários. Coloque um label

na coluna DIFERENÇA. 9. Exiba o número do gerente e o salário do funcionário com menor pagamento sob a supervisão

desse gerente. Exclua todos cujo gerente não seja conhecido. Exclua todos os grupos em que o salário mínimo seja menor do que R$ 1.000. Classifique a saída em ordem decrescente de salário.

10. Crie uma consulta para exibir o nome do departamento, o nome do local, o número de

funcionários e o salário médio de todos os funcionários nesse departamento. Coloque um label nas colunas NOME_DEPT, LOCAL, NR DE PESSOAS e SALARIO, respectivamente. Arredonde o salário médio para duas casas decimais.

11. Crie uma consulta que exiba o número total de funcionários e, desse total, o número total de

funcionários contratados em 1980,1981,1982 e 1983. Coloque os cabeçalhos apropriados nas colunas.

12. Crie uma consulta matriz para exibir o cargo, o salário desse cargo baseado no número do

departamento e o salário total desse cargo para todos os departamentos, colocando em cada coluna um cabeçalho apropriado.

SQL Básico

60

11 11 11 11 SUBCONSULTASSUBCONSULTASSUBCONSULTASSUBCONSULTAS

Você poderá criar subconsultas na cláusula WHERE de outra instrução SQL para obter valores baseados em um valor condicional desconhecido. Esta lição abrange as subconsultas de uma única linha e de várias linhas. • Coloque as subconsultas entre parênteses; • Coloque as subconsultas no lado direito do operador de comparação; • Não adicione uma cláusula ORDER BY a uma subconsulta; • Use operadores de uma única linha com subconsultas de uma única linha; • Use operadores de várias linhas com subconsultas de várias linhas.

Consulta principal Que funcionários têm salários maiores que o de Jones?

Subconsulta Qual é o salário de Jones?

Para resolver este problema, são necessárias duas consultas: uma consulta para descobrir quanto Jones recebe e outra para descobrir quem recebe mais que essa quantia. Você pode resolver combinando as duas consultas, colocando uma consulta dentro da outra consulta. A consulta interna ou a subconsulta retorna um valor que é usado pela consulta externa ou pela consulta principal. Usar uma subconsulta equivale a executar duas consultas seqüenciais e usar o resultado da primeira como o valor de pesquisa na segunda consulta. SELECT lista_de_seleção FROM tabela WHERE operador expr (SELECT lista_de_seleção

FROM tabela ); • A subconsulta (consulta interna) é executada uma vez antes da consulta principal; • O resultado da subconsulta é usado pela consulta principal (consulta externa). SELECT last_name FROM employees WHERE salary > SELECT salary

FROM employees WHERE last_name = 'Abel');

Last_name King Kochhar De Haan Hartstein Higgins

SQL Básico

61

SubcSubcSubcSubconsultas de única linhaonsultas de única linhaonsultas de única linhaonsultas de única linha

Select para exibir funcionários cujo cargo é o mesmo que o do funcionário 7369 e cujo salário é maior que o do funcionário 7876. SELECT last_name, job_id, salary FROM employees WHERE job_id = (SELECT job_id

FROM employees WHERE employee_id = 141)

AND salary > (SELECT salary FROM employees WHERE employee_id = 143)

Last_name Job_id Salary Rajs ST_CLERK 3500 Davies ST_CLERK 3100 Usando funções de grupo em uma subconsulta: SELECT last_name, job_id, salary FROM employees WHERE salary = (SELECT MIN(salary)

FROM employees); Last_name Job_id Salary Vargas ST_CLERK 2500 A Cláusula HAVING com Subconsultas • O servidor Oracle executa primeiro as subconsultas; • O servidor Oracle retorna os resultados para a cláusula HAVING da consulta principal. SELECT department_id, MIN(salary) FROM employees GROUP BY department_id HAVING MIN(salary) > (SELECT MIN(salary)

FROM employees WHERE department_id = 50);

O que há de errado com esta instrução ? SELECT employee_id, last_name FROM employees WHERE salary = (SELECT MIN(salary)

FROM employees GROUP BY department_id);

ERROR at line 4: ORA-01427: single-row subquery returns more than on e row

Operador de uma única linha com subconsulta de vári as linhas

SQL Básico

62

Subconsultas de várias linhasSubconsultas de várias linhasSubconsultas de várias linhasSubconsultas de várias linhas

Você pode usar um operador de várias linhas, em vez de um operador de uma única linha, com uma subconsulta de várias linhas. O operador de várias linhas espera um ou mais valores. SELECT emp.last_name FROM employees emp WHERE emp.employee_id NOT IN (SELECT mgr.manager_id

FROM employees mgr); SELECT emp.last_name FROM employees emp WHERE emp.employee_id IN (SELECT mgr.manager_id

FROM employees mgr);

Diretrizes para o uso de subconsultas: • Coloque as subconsultas entre parênteses; • Coloque as subconsultas no lado direito da condição de comparação; • A cláusula ORDER BY na subconsulta não é necessária, a menos que você esteja executando a

análise Top-N; • Use operadores de uma única linha com subconsultas de uma única linha e use operadores de

várias linhas com subconsultas de várias linhas.

UsanUsanUsanUsando subconsulta na Cláusula FROMdo subconsulta na Cláusula FROMdo subconsulta na Cláusula FROMdo subconsulta na Cláusula FROM

SELECT a.last_name, a.salary, a.department_id, b. salavg FROM employess a,

(SELECT department_id, avg(salary) salavg FROM employess GROUP BY deptno) b

WHERE a.department_id = b. department_id AND a.salary > b.salavg; O exemplo acima exibe nomes de funcionários, salários, números de departamento e salários médios de todos os funcionários que recebem mais que o salário médio nos seus departamentos.

Usando subconsulta na Cláusula SELECTUsando subconsulta na Cláusula SELECTUsando subconsulta na Cláusula SELECTUsando subconsulta na Cláusula SELECT

SELECT a.last_name, a.salary, a.department_id, (select department_name from departments where department_id = a.department_id) department _name FROM employess a

Usando o operador EXISTSUsando o operador EXISTSUsando o operador EXISTSUsando o operador EXISTS

O operador EXISTS testa a existência de linhas no conjunto de resultados da subconsulta. • Se o valor da linha de uma subconsulta for encontrado:

SQL Básico

63

o A pesquisa na consulta interna não continuará; o A condição será indicada por um flag TRUE;

• Se o valor de linha de uma subconsulta não for encontrado: o A condição será indicada por um flag FALSE; o A pesquisa continuará na consulta interna.

Localize os funcionários com no mínimo uma pessoa subordinada a eles: SELECT employee_id, last_name, job_id, department_i d FROM employees outer WHERE EXISTS (SELECT 'X'

FROM employees WHERE manager_id = outer.employee_id);

Usando o operador NOT EXISTS: localize todos os departamentos sem funcionários. SELECT department_id, department_name FROM departments d WHERE NOT EXISTS (SELECT 'X'

FROM employees WHERE department_id = d.department_id);

ExercíciosExercíciosExercíciosExercícios

1. Crie uma consulta para exibir o nome e a data de admissão de todos os funcionários no mesmo

departamento que Blake. Exclua Blake. 2. Crie uma consulta para exibir o número e o nome de todos os funcionários que recebam mais que

o salário médio. Classifique os resultados, por salário, em ordem decrescente. 3. Crie uma consulta para exibir o número e o nome de todos os funcionários que trabalhem em um

departamento com qualquer funcionário cujo nome contenha um T . 4. Exiba o nome do funcionário, o número do departamento e o cargo de todos os funcionários cuja

localização do departamento seja Dallas. 5. Exiba o nome e o salário dos funcionários que se reportem a King. 6. Exiba o número do departamento, o nome e o cargo de todos os funcionários do departamento de

Vendas. 7. Modifique o exercício 3 para exibir o número, o nome e o salário de todos os funcionários que

recebam mais que o salário médio e trabalhem em um departamento com qualquer funcionário cujo nome contenha um T.

8. Crie uma consulta para exibir o nome, o número do departamento e o salário de qualquer

funcionário cujo número do departamento e salário correspondam ao número do departamento e salário de qualquer funcionário que receba comissão.

SQL Básico

64

9. Exiba o nome, o nome do departamento e o salário de qualquer funcionário cujo salário e cuja comissão correspondam ao salário e à comissão de qualquer funcionário localizado em Dallas.

10. Crie uma consulta para exibir o nome, a data de admissão e o salário de todos os funcionários

que tenham o mesmo salário e a mesma comissão que Scott. 11. Crie uma consulta para exibir os funcionários que recebem um salário maior que o de todos os

escriturários. Classifique os resultados sobre salários do maior para o menor.

SQL Básico

65

12 12 12 12 Comandos DDL Comandos DDL Comandos DDL Comandos DDL –––– Parte IIParte IIParte IIParte II Create table Criando uma tabela usando uma sintaxe de subconsulta: • Crie uma tabela e insira linhas combinando a instrução CREATE TABLE e a opção AS

subconsulta: create table tabela [(coluna, coluna, ....)] as subconsulta

• Estabeleça uma correspondência entre o número de colunas especificadas e o número de colunas da subconsulta;

Exemplo: create table dept80 as select employee_id, last_name, salary*12 annual_s al, hire_date from employees where department_id = 80

ExercícioExercícioExercícioExercício

1) Crie a tabela EMPLOYEES2 de acordo com a estrutura da tabela EMPLOYEES. Inclua apenas as colunas EMPLOYEE_ID, LAST_NAME e DEPARTMENT_ID. Nomeie as colunas com ID, LAST_NAME e DEPT_ID na nova tabela, respectivamente.

SQL Básico

66

13 13 13 13 Comandos Comandos Comandos Comandos DMDMDMDMLLLL---- Parte IIParte IIParte IIParte II Insert Para criar uma instrução INSERT com subconsulta: INSERT INTO sales_reps(id, name, salary, commission _pct) SELECT employee_id, last_name, salary, commission_p ct FROM employees WHERE job_id LIKE '%REP%'; 4 rows created.

• Não use a cláusula VALUES; • Estabeleça a correspondência entre o número de colunas da cláusula INSERT e o da

subconsulta. Update

Atualizando duas colunas com uma subconsulta: atualize o cargo e o salário do funcionário 114 para que correspondam aos do funcionário 205. UPDATE employees SET job_id = (SELECT job_id FROM employees WHERE e mployee_id = 205),

salary = (SELECT salary FROM employees WHERE employ ee_id = 205) WHERE employee_id = 114; 1 row updated. Delete

Deletando linhas com base em outra tabela: use subconsultas nas instruções DELETE para remover linhas de uma tabela com base em valores de outra tabela. DELETE FROM employees WHERE department_id = ( SELECT department_id

FROM departments WHERE department_name LIKE '%Public%');

1 row deleted.

SQL Básico

67

14 14 14 14 VVVViewsiewsiewsiews

O que é uma View ?O que é uma View ?O que é uma View ?O que é uma View ?

Você pode apresentar combinações ou subconjuntos lógicos de dados criando views de

tabelas. Uma view é uma tabela lógica baseada em uma tabela ou outra view. Uma view não contém dados próprios, mas é como uma janela através da qual os dados das tabelas podem ser vistos ou alterados. As tabelas nas quais uma view é baseada são chamadas tabelas-base. A view é armazenada como uma instrução SELECT no dicionário de dados. Por que usar Views?Por que usar Views?Por que usar Views?Por que usar Views? • Para restringir o acesso a dados; • Para facilitar consultas complexas; • Para permitir independência de dados; • Para apresentar diferentes views dos mesmos dados. Views Simples e Views ComplexasViews Simples e Views ComplexasViews Simples e Views ComplexasViews Simples e Views Complexas View simples: • Cria dados a partir de somente uma tabela; • Não contém funções ou grupos de dados; • Pode executar a DML através da view. View complexa: • Cria dados a partir de várias tabelas; • Contém funções ou grupos de dados; • Nem sempre executa a DML através da view. Criando uma VIEWCriando uma VIEWCriando uma VIEWCriando uma VIEW CREATE [OR REPLACE] view [( apelido [ , apelido ]...)] AS subconsulta [WITH CHECK OPTION [CONSTRAINT restrição ]] [WITH READ ONLY]; OR REPLACE recria a view se ela já existir View é o nome da view Apelido especifica nomes para as expressões selecionadas pela consulta da

view (O número de apelidos deve corresponder ao número de expressões selecionadas pela view).

Subconsulta é uma instrução SELECT completa (Você pode usar apelidos para as colunas na lista SELECT).

WITH CHECK OPTION especifica que somente linhas acessíveis à view podem ser inseridas ou atualizadas.

SQL Básico

68

Restrição é o nome atribuído à restrição CHECK OPTION WITH READ ONLY assegura que as operações DML não possam ser executadas nesta

view. Criando uma view

• Crie uma view, EMPVU80, que contenha detalhes dos funcionários do departamento 80. CREATE VIEW empvu80 AS SELECT employee_id, last_name, salary FROM employees WHERE department_id = 80; View created.

• Descreva a estrutura: desc empvu80

• Crie uma view usando apelidos de coluna na subconsulta. CREATE VIEW salvu50 AS SELECT employee_id ID_NUMBER, last_name NAME, salary*12 ANN_SALARY FROM employees WHERE department_id = 50; View created.

• Selecione as colunas nesta view pelos nomes de apelidos atribuídos. SELECT * FROM salvu50; View no dicionário de dadosView no dicionário de dadosView no dicionário de dadosView no dicionário de dados

Depois que a view for criada, você pode consultar a tabela do dicionário de dados chamada USER_VIEWS para ver o nome e a definição da view. O texto da instrução SELECT que constitui a view é armazenado em uma coluna LONG. Modificando uma viewModificando uma viewModificando uma viewModificando uma view

• Modifique a view EMPVU80 usando a cláusula CREATE OR REPLACE VIEW. Adicione um apelido para cada nome de coluna:

CREATE OR REPLACE VIEW empvu80 (id_number, name, sal, department_id) AS SELECT employee_id, first_name || ' ' || last_na me, salary, department_id FROM employees WHERE department_id = 80; View created.

• Os apelidos de coluna na cláusula CREATE VIEW estão listados na mesma ordem que as colunas na subconsulta.

SQL Básico

69

Criando uma View ComplexaCriando uma View ComplexaCriando uma View ComplexaCriando uma View Complexa • Criando uma view complexa que contenha funções de grupo para exibir os valores a partir de

duas tabelas. CREATE VIEW dept_sum_vu (name, minsal, maxsal, avgsal) AS SELECT d.department_name, MIN(e.salary), MAX(e.salary),AVG(e.salary) FROM employees e, departments d WHERE e.department_id = d.department_id GROUP BY d.department_name; View created. Removendo uma VIEWRemovendo uma VIEWRemovendo uma VIEWRemovendo uma VIEW DROP VIEW empvu10; View dropped.

ExercíciosExercíciosExercíciosExercícios

1. Crie uma view chamada EMP_VU baseada no nome e número do funcionário e número de

departamento na tabela EMPLOYESS. Altere o cabeçalho do nome do funcionário para EMPLOYEE.

2. Exiba o conteúdo da view EMP_VU. 3. Selecione o texto e o nome da view a partir do dicionário de dados USER_VIEWS. 4. Usando a view EMP_VU, crie uma consulta para exibir todos os nomes dos funcionários e os

números de departamento. 5. Crie uma view nomeada DEPT20 que contenha o número e o nome do funcionário e o número

de departamento de todos os funcionários no departamento 20. Coloque um label nas coluna da view de EMPLOYEE_ID, LAST_NAME, e DEPARTMENT_ID.

6. Exiba a estrutura e o conteúdo da view DEPT20. 7. Crie uma view chamada SALARY_VU baseada no nome do funcionário, nome do departamento,

salário e grau de salário de todos os funcionários. Coloque um label nas colunas de Employee, Department e Salary, respectivamente.

SQL Básico

70

15 15 15 15 ÍndicesÍndicesÍndicesÍndices Um índice:

• É um objeto de esquema; • É usado pelo servidor Oracle para acelerar a recuperação de linhas usando um ponteiro; • Pode reduzir a E/S do disco usando um método de acesso rápido a caminhos a fim de

localizar os dados rapidamente; • É independente da tabela que indexa; • É usado e mantido automaticamente pelo servidor Oracle.

Como são criadosComo são criadosComo são criadosComo são criados ???? Automaticamente: Um índice é criado sempre que você define uma restrição PRIMARY KEY ou UNIQUE em uma definição de tabela. Manualmente: Os usuários podem criar índices não-exclusivos em colunas para acelerar o tempo de acesso às linhas. Criando um Criando um Criando um Criando um ííííndicendicendicendice

• Crie um índice em uma ou mais colunas: CREATE INDEX índice ON tabela ( coluna [, coluna ]...);

• Aumente a velocidade de acesso de consulta à coluna LAST_NAME da tabela EMPLOYEES:

CREATE INDEX emp_last_name_idx ON employees(last_name); Index created.

Quando Quando Quando Quando ccccriar um riar um riar um riar um ííííndicendicendicendice • Uma coluna contiver uma ampla faixa de valores; • Uma coluna contiver um grande número de valores nulos; • Uma ou mais colunas forem usadas juntas com freqüência em uma cláusula WHERE ou em

uma condição de junção; • A tabela for grande e a expectativa for de que a maioria das consultas recuperará menos que

2 a 4% das linhas

Quando não criar um Quando não criar um Quando não criar um Quando não criar um ííííndicendicendicendice • A tabela for pequena; • As colunas não forem utilizadas com freqüência como uma condição na consulta; • A expectativa for de que a maioria das consultas recuperará mais que 2 a 4% das linhas da

tabela; • A tabela for atualizada com freqüência; • Forem feitas referências às colunas indexadas como parte de uma expressão.

Confirmando índicesConfirmando índicesConfirmando índicesConfirmando índices • A view de dicionário de dados USER_INDEXES contém o nome do índice e sua

exclusividade; • A view USER_IND_COLUMNS contém os nomes do índice, da tabela e da coluna.

SQL Básico

71

SELECT ic.index_name, ic.column_name, ic.column_pos ition col_pos, ix.uniqueness FROM user_indexes ix, user_ind_columns ic WHERE ic.index_name = ix.index_name AND ic.table_name = 'EMPLOYEES';

Removendo um ÍndiceRemovendo um ÍndiceRemovendo um ÍndiceRemovendo um Índice DROP INDEX índice ;

ExercíciosExercíciosExercíciosExercícios

1. Crie um índice não-exclusivo na coluna de chave estrangeira (department_id) na tabela

EMPLOYEES.

2. Exiba os índices e as exclusividades existentes no dicionário de dados para a tabela

EMPLOYEES.

SQL Básico

72

16 16 16 16 Operadores SETOperadores SETOperadores SETOperadores SET Union/Union All

Intersect

Minus

As tabelas usadas neste capítulo são: • EMPLOYEES: fornece os detalhes relativos a todos os funcionários atuais; • JOB_HISTORY: registra os detalhes da data inicial e da data final do cargo anterior, além do

número de identificação do cargo e do departamento, quando um funcionário muda de cargo. OOOOperador UNIONperador UNIONperador UNIONperador UNION

Retorna o resultado de duas consultas após eliminar duplicações; • Exiba os detalhes dos cargos anterior e atual de todos os funcionários. Exiba cada funcionário

somente uma vez: SELECT employee_id, job_id FROM employees UNION SELECT employee_id, job_id FROM job_history;

SQL Básico

73

Operador UNIONOperador UNIONOperador UNIONOperador UNION ALLALLALLALL

Retorna o resultado de duas consultas, incluindo todas as duplicações; • Exiba os departamentos anterior e atual de todos os funcionários:

SELECT employee_id, job_id, department_id FROM employees UNION ALL SELECT employee_id, job_id, department_id FROM job_history ORDER BY employee_id; Operador Operador Operador Operador INTERSECTINTERSECTINTERSECTINTERSECT

• Exiba os IDs de funcionário e os IDs de cargo dos funcionários com o mesmo cargo que ocupavam antes do início do período de permanência na empresa:

SELECT employee_id, job_id FROM employees INTERSECT SELECT employee_id, job_id FROM job_history; Operador Operador Operador Operador MINUSMINUSMINUSMINUS

• Exiba os IDs dos funcionários que nunca mudaram de cargo. SELECT employee_id,job_id FROM employees MINUS SELECT employee_id,job_id FROM job_history;