121
Introdução ao SQL Prof. Claudio Azevedo Passos

Introdução ao SQL

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Introdução ao SQL

Introdução ao SQL

Prof. Claudio Azevedo Passos

Page 2: Introdução ao SQL

Modelo Relacional

• O Modelo Relacional prevê, desde sua concepção, a existência de uma linguagem baseada em caracteres que suporte a definição do esquema físico (tabelas, restrições, etc.), e sua manipulação (inserção, consulta, atualização e remoção)

Page 3: Introdução ao SQL

file: teorica_8.ppt Banco deDados I - Silvia Soares 3

SQL (SQL (StructuredStructured QueryQuery LanguageLanguage))

E. F. Codd: “A Relational Model of Data for LargeShared Data Banks”, junho 1970

Definição de um modelo que propõe uma nova estrutura de armazenamento em banco de dados

Modelo Relacional

Page 4: Introdução ao SQL

4

SQL (SQL (StructuredStructured QueryQuery LanguageLanguage))IBM: linguagem SEQUEL (Structured English QueryLanguage)Ferramenta de acesso ao modelo proposto por CODD

evoluçãoSQL (linguagem padrão para Banco de Dados Relacional)1986 : American National Standards Institute (ANSI) e

International Standards Organization (ISO)

Padrão SQL (SQL 86)

IBM: padrão próprio (System Application ArchitectureDatabase Interface – SAA SQL) em 1987

Page 5: Introdução ao SQL

5

SQL (SQL (StructuredStructured QueryQuery LanguageLanguage))

SQL

SELECTUPDATEDELETEINSERT

CREATEALTERDROP

GRANTREVOKECOMMIT

ROLLBACKSAVEPOINT

SET TRANSACTIONDML DDL

CONTROL

Segurança

Controletransações

Com COMMIT“embutido”

Page 6: Introdução ao SQL

6

SQL (SQL (StructuredStructured QueryQuery LanguageLanguage))

Propósito: interface para um banco de dados relacional(Oracle, DB2, SQL Server, Sybase, ...)

A linguagem SQL tem diversas partes: Linguagem de definição de dados: DDL – comandos para a

definição de esquemas de relações, exclusão de relações, criação de índices e modificação nos esquemas de relações

Linguagem interativa de manipulação de dados: DML –linguagem de consulta baseada na álgebra e no cálculo relacionalde tuplas. Engloba comandos para inserção, exclusão e modificaçãode tuplas no BD

Incorporação DML (embedded DML): para aplicação em linguagens de programação (C, PL/I, COBOL, PHP, VB,...)

Page 7: Introdução ao SQL

7

SQL (SQL (StructuredStructured QueryQuery LanguageLanguage))

Definição de visões: a SQL DDL possui comandos para definição de visões

Autorização: a SQL DDL possui comandos para especificação dedireitos de acesso a relações e visões

Integridade: a SQL DDL possui comandos para especificação deregras de integridade que os dados que serão armazenados no BD devem satisfazer

Controle de transações: a SQL DCL possui comandos para especificação de iniciação e finalização de transações. Algumasimplementações permitem explicitar bloqueios de dados para controle de concorrência.

Page 8: Introdução ao SQL

SQL (Comandos da DDL)

Comando CreateEste comando permite a criação de tabelas no banco de dados ou mesmo de sua criação.

Sintaxe:CREATE DATABASE < nome_db >;

onde:nome_db - indica o nome do Banco de Dados a ser criado.

Page 9: Introdução ao SQL

SQL (Comandos da DDL)• CREATE TABLE é o comando usado para criação da tabela e deve ser seguida pelo nome que daremos à tabela. Dentro do comando, devemos definir os nomes dos campos de acordo com a conveniência do banco de dados, e determinar o tipo de dado que poderá ser incluído neste campo.

• PRIMARY KEY define a chave primária da tabela, isto é, o campo que serve como chave da tabela e que não pode ser repetido.

• NOT NULL é usado quando desejamos que um campo seja de preenchimento obrigatório.

Page 10: Introdução ao SQL

SQL (Comandos da DDL)Comando Create table

Sintaxe:CREATE TABLE < nome_tabela >( nome_atributo1 < tipo > [ NOT NULL ],nome_atributo2 < tipo > [ NOT NULL ],......nome_atributoN < tipo > [ NOT NULL ] )PRIMARY KEY(nome_atributo_x,...) ;

onde:nome_table - indica o nome da tabela a ser criada.nome_atributo - indica o nome do campo a ser criado na tabela.tipo - indica a definição do tipo de atributo ( integer(n), char(n),real(n,m), date... ).n- número de dígitos ou de caracteresm- número de casas decimais

Page 11: Introdução ao SQL

SQL (Comandos da DDL)

Comando Create tableExemplo

CREATE TABLE clima ( cidade varchar(80),temp_min int, temp_max int,Precipitacao real,data date

);

CREATE TABLE cidades (nome varchar(80),localizacao point

);

Page 12: Introdução ao SQL

Tipos de dados

• O SQL não diferencia letras maiúsculas e minúsculas nas palavrase nos identificadores, a não ser quando os identificadores estãoentre aspas (") para preservar letras maiúsculas e minúsculas (oque não foi feito acima).

• O PostgreSQL suporta os tipos SQL usuais int, smallint, real, double precision, char(N), varchar(N), date, time, timestamp e interval, assim bem como outros tipos de utilidade geral e um abrangente conjunto de tipos geométricos.

Page 13: Introdução ao SQL

Tipos de dados• Bigint - inteiro de oito bytes com sinal• Bigserial - inteiro de oito bytes com auto-incremento• bit [ (n) ] cadeia de bits de comprimento fixo• bit varying [ (n) ] - cadeia de bits de comprimento variável • Boolean - booleano lógico (verdade/falso)• box - caixa retangular no plano• bytea - dados binários ("matriz de bytes")• character varying [ (n) ] varchar [ (n) ]cadeia de caracteres de comprimento

variável • character [ (n) ] char [ (n) ] cadeia de caracteres de comprimento fixo• cidr endereço de rede IPv4 ou IPv6• circle círculo no plano• date data de calendário (ano, mês,dia)• double precision - número de ponto flutuante de precisão dupla

Page 14: Introdução ao SQL

Tipos de dados• inet endereço de hospedeiro IPv4 ou IPv6• Integer inteiro de quatro bytes com sinal• interval [ (p) ] espaço de tempo• line linha infinita no plano• lseg segmento de linha no plano• macaddr endereço MAC• money quantia monetária• numeric [ (p, s) ] decimal [ (p, s) ] numérico exato com precisão

selecionável• path caminho geométrico no plano• point ponto geométrico no plano• polygon caminho geométrico fechado no plano• Real - float de 4 bytes número de ponto flutuante de precisão simples• Smallint - inteiro de dois bytes com sinal• Serial inteiro de quatro bytes com auto-incremento• text cadeia de caracteres de comprimento variável

Page 15: Introdução ao SQL

Tipos de dados

• time [ (p) ] [ without time zone ] hora do dia• time [ (p) ] with time zone hora do dia, incluindo a zona

horária• timestamp [ (p) ] [ without time zone ] data e hora• timestamp [ (p) ] with time zone data e hora, incluindo a

zona horária

Page 16: Introdução ao SQL

Create Table

• Exemplo:Como exemplo do uso do comando CREATE TABLE, imaginemos a necessidade de uma tabela que deva possuir os dados dos clientes de uma loja.

CREATE TABLE Cliente (Codigo INT NOT NULL,Nome VARCHAR (60) NOT NULL,Data_Nascimento DATE,Telefone CHAR (8),PRIMARY KEY (Codigo) );

Page 17: Introdução ao SQL

Create table

• Neste comando, criamos uma tabela chamada Cliente. Esta tabela contém quatro campos:

O primeiro campo é o Código do cliente. Este campo será utilizado como chave primária de forma que não poderá se repetir nunca. Desta forma o campo deve ser sempre preenchido (NOT NULL), é numérico do tipo inteiro (INT).

O campo Nome é do tipo VARCHAR (60), ou seja aceita dados alfa-numéricos com até 60 caracteres. No entanto se um nome for inserido com menos de 60 caracteres, o número de bytes consumidos pelo campo será de acordo com o nome inserido.

O campo de Data_Nascimento é do tipo DATE, ou seja, uma data, que no entanto não de preenchimento obrigatório (por isto não foi declarado o NOT NULL).

O campo Telefone foi determinado como sendo alfa-numérico com oito caracteres definidos, e mesmo que sejam utilizados menos caracteres, o número de bytes consumidos serão sempre os mesmos independente dos dados. Isto é útil para dados alfanuméricos que não variam de tamanho, como o caso de UF no Brasil, cuja abreviação sempre são de dois caracteres.

A instrução PRIMARY KEY define qual dos campos será a chave primária e não pode ser repetido, sendo o diferenciador entre os diversos clientes que sejam inseridos nesta tabela.

Page 18: Introdução ao SQL

SQL - Visões• As visões permitem encapsular os detalhes da estrutura das

tabelas, que podem mudar na medida em que os aplicativos evoluem, atrás de interfaces consistentes.

• As visões podem ser utilizadas em praticamente todos os lugares em que uma tabela pode ser utilizada. Construir visões baseadas em visões não é raro.

Sintaxe

• CREATE VIEW minha_visao AS SELECT cidade, temp_min, temp_max, prcp, data, localizacao FROM clima, cidades WHERE cidade = nome;

• SELECT * FROM minha_visao;

Page 19: Introdução ao SQL

REGRAS DE INTEGRIDADE

• Ao criarmos uma tabela dentro de um banco de dados devemos ter em mente as Regras de Integridade, que garantam a consistência, integridade e não redundância dos dados. Entre estas regras podemos englobar as chaves primárias, checagem e chave estrangeira.

Page 20: Introdução ao SQL

Restrições de IntegridadeIntegridade de Entidade

• Toda a tabela deve possuir, obrigatoriamente, uma coluna (ou uma composição de colunas) cujo valor é único para todas as instâncias CHAVE PRIMÁRIA (PK)

• As chaves primárias funcionam como os campos que diferenciam os dados uns dos outros, e que não podem ser repetidos de nenhuma forma.

• Eventualmente, outras colunas além da chave primária podem ser únicas CHAVE ALTERNATIVA (AK)

Page 21: Introdução ao SQL

Restrições de IntegridadeIntegridade de Domínio

• Cada coluna da tabela tem seus valores restringidos por– tipos de dados: definem o domínio de uma coluna– cod_cliente NUMBER ( 6 )– username VARCHAR2 ( 20 )

• Restrições a valores nulos: definem se as colunas serão obrigatórias ou opcionais– email VARCHAR2 ( 40 ) NOT NULL– ddd NUMBER ( 3 )

Page 22: Introdução ao SQL

Restrições de IntegridadeIntegridade de Domínio

– valores padrão: define um valor padrão a ser associado a uma coluna se não for fornecido valor (ou for explicitamente fornecido um valor NULL) para esta durante a inserção

importado CHAR ( 1 ) DEFAULT 'N' NOT NULL

– A definição de valores padrões é particularmente importante para colunas NOT NULL

Page 23: Introdução ao SQL

Restrições de IntegridadeIntegridade de Domínio

– restrições de validação: restringem os valores que podem ser atribuídos a uma colunaCONSTRAINT CHK_PROD_IMPORTADO CHECK (importado in ('S','N'))

– tipos definidos pelo usuário: tipo de dado construído a partir de tipos pré-definidos, contendo restrição a valores nulos, regras de validação e um valor padrão

• Não disponível em todos os SGBDs

Page 24: Introdução ao SQL

Restrições de IntegridadeIntegridade Referencial

• As restrições de integridade referencial garantem a consistência dos relacionamentos entre as tabelas

cidadescod_cidade : NUMBER(4, 0)nome : VARCHAR2(40)uf : CHAR(2)

<<PK>> PK_CIDADES()<<FK>> FK_EST_CID()

<<Table>>

estadosuf : CHAR(2)nome : VARCHAR2(20)regiao : CHAR(2)

<<PK>> PK_ESTADOS()

<<Table>><<Non-Identifying>>

0..*11

0..*

Page 25: Introdução ao SQL

Restrições de IntegridadeIntegridade Referencial

• A chave estrangeira é uma cláusula que deve ser incluída quando possuímos mais de duas tabelas em um banco de dados.

• Através da chave estrangeira estabelecemos as relações entre duas ou mais tabelas. A chave estrangeira desta forma referencia o campo que é chave primária de outra tabela.

FOREIGN KEY (Campo1, Campo2, Campo3 ...) REFERENCES Nome_Tabela2 (Nome_Chave);

Page 26: Introdução ao SQL

Restrições de IntegridadeIntegridade Referencial

• No exemplo, a definição da restrição de integridade referencial seria criada como segue

CONSTRAINT FK_EST_CID FOREIGN KEY (uf) REFERENCES estados (uf)

• Esta restrição estabelece uma relação entre o atributo uf da tabela CIDADES e a chave primária da tabela ESTADOS

Page 27: Introdução ao SQL

SQL – Chave Estrangeiras (Exemplo)

• CREATE TABLE cidades (cidade varchar(80) primary key,localizacao point

);

• CREATE TABLE clima (cidade varchar(80) references cidades,temp_min int,temp_max int,prcp real,data date

);

Page 28: Introdução ao SQL

SQL – Chave Estrangeiras• Agora ao se tentar inserir um registroINSERT INTO clima VALUES (’Berkeley’, 45, 53, 0.0, ’1994-11-28’);

• O que acontece :ERROR: <unnamed> referential integrity violation - key referencedfrom clima not found in cidades

O comportamento das chaves estrangeiras pode receber um ajuste fino na aplicação. Não iremos além deste exemplo simples neste tutorial, mas consulte o Guia do Usuário do PostgreSQL para obter mais informações.Usar corretamente as chaves estrangeiras com certeza vai melhorar a qualidade dos seus aplicativos de banco de dados, portanto encorajamos muito que este tópico seja aprendido.

Page 29: Introdução ao SQL

Restrições de IntegridadeIntegridade Referencial

• O SGBD deve prover mecanismos para assegurar que a restrição de integridade seja respeitada, ou seja, uma linha violando a restrição de integridade referencial não poderá existir;

• Estes mecanismos prevêem a execução de uma ação em resposta a uma atualização, a fim de manter a integridade referencial.

Page 30: Introdução ao SQL

Restrições de IntegridadeIntegridade Referencial

• Existem diferentes ações possíveis para evitar que uma operação de atualização viole as restrições de integridade referencial

– RESTRICT: impede a execução da operaçãoInserir uma Sala situada em um Prédio não existente

– CASCADE: propaga a operação para respeitar as restrições de integridade referencialRemover uma Disciplina do Currículo, removendo todos os Pré-requisitos associados a esta

Page 31: Introdução ao SQL

Restrições de IntegridadeIntegridade Referencial

– SET NULL: assegura as restrições de integridade referencial associando um valor NULL à chave estrangeira que poderia violá-lasRemover um Professor, fazendo com que a coluna matricula_professor em DISCIPLINAS_TURMAS fosse atualizada para NULL em todas as disciplinas que atua

NULL não é considerado um valor, portanto, não fere as restrições de integridade referencial

– SET DEFAULT: semelhante à ação de SET NULL, mas associa um valor padrão à chave estrangeira

Page 32: Introdução ao SQL

Definindo Valores Padrão• Pode ser definido um valor padrão para uma

coluna (literais, expressões ou funções)• Se não for definido um valor, será utilizado o

padrão– create table pedidos (num_pedido number ( 7 ),cod_cliente number ( 6 ) not null,cod_endereco number ( 2 ) not null,data_emissao date not null default sysdate,constraint pk_pedidos primary key(num_pedido));

Page 33: Introdução ao SQL

Utilizando Valores Padrão– insert into pedidos (num_pedido, cod_cliente, cod_endereco)values (17645, 540, 290);

• Foi omitida a coluna data_emissão, logo, será utilizado o valor padrão– insert into pedidos (num_pedido, cod_cliente, cod_endereco, data_emissao)values (17645, 540, 290, NULL);

• Foi explicitamente definido NULL

Page 34: Introdução ao SQL

Restrições de IntegridadeIntegridade Definida pelo Usuário

• O Projetista do Banco de Dados pode definir restrições de integridade complexas, utilizando, por exemplo, o conceito de triggers

• Triggers são porções de código ativadas após certos eventos (inserção, atualização ou exclusão de linhas da tabela)

Page 35: Introdução ao SQL

Resumindo, temos : Restrições de Integridade de Tabelas

– CONSTRAINT nome_da_restriçãoPRIMARY KEY (colunas)

– CONSTRAINT nome_da_restriçãoFOREIGN KEY (colunas) REFERENCES nome_da_tabela_pai [ON DELETE CASCADE]

– CONSTRAINT nome_da_restriçãoUNIQUE (colunas)

– CONSTRAINT nome_da_restrição CHECK (expressao)

Page 36: Introdução ao SQL

Restrições de Integridade de Colunas

– CONSTRAINT nome_da_restrição NOT NULL– CONSTRAINT nome_da_restrição PRIMARY KEY– CONSTRAINT nome_da_restrição REFERENCES nome_da_tabela_pai [ON DELETE CASCADE]

– CONSTRAINT nome_da_restrição UNIQUE– CONSTRAINT nome_da_restrição CHECK (expressao)

Page 37: Introdução ao SQL

Exemplo- Restrições de Integridade nas Tabelas e nas Colunas

create table usuarios (cod_usuario number ( 6 ),nome varchar2 ( 100 )

constraint nn_usu_nome not null,cpf char ( 11 )

constraint nn_usu_cpf not null,email varchar2 ( 40 )

constraint nn_usu_email not null,username varchar2 ( 20 )

constraint nn_usu_username not null,password varchar2 ( 20 )

constraint nn_usu_password_not null,constraint pk_usuarios primary key (cod_usuario),constraint ak_usu_cpf unique (cpf),constraint ak_usu_username unique (username));

Page 38: Introdução ao SQL

Exemplo- Restrições de Integridade nas Tabelas e nas Colunas

create table produtos (cod_produto number ( 5 ) not null,titulo varchar2 ( 200 ) not null,ano_lancamento date not null,importado char ( 1 ) not null,preco number ( 10, 2 ) not null,prazo_entrega number ( 3 ) not null,constraint pk_produtos

primary key (cod_produto),constraint chk_prod_importado

check (importado in (‘S',‘N')));

Page 39: Introdução ao SQL

Exemplo- Restrições de Integridade nas Tabelas e nas Colunas

create table administradores (cod_administrador number ( 6 ),nivel_privilegio number ( 1 ) not null,constraint pk_administradores primary key(cod_administrador),constraint fk_usu_adm foreign key(cod_administrador) references usuarios(cod_usuario)

);

Page 40: Introdução ao SQL

SQL (Comandos da DDL)• DROP TABLE — remove uma tabela

• DROP TABLE nome [, ...] [ CASCADE | RESTRICT ]

onde NOME O nome (opcionalmente qualificado pelo esquema) da tabela a ser removida. CASCADE Remove automaticamente os objetos dependentes da tabela (como visões). RESTRICT Recusa remover a tabela se existirem objetos dependentes. Este é o padrão.

Saídas DROP TABLE Mensagem retornada se a execução do comando for bem-sucedida. ERROR: table "nome" does not existSe a tabela especificada não existe no banco de dados.

Page 41: Introdução ao SQL

SQL (Comandos da DDL) – Alter Table• Descrição

O comando ALTER TABLE altera a definição de uma tabela existente. Existem várias formas alternativas:

• ADD COLUMN Esta forma adiciona uma nova coluna à tabela usando a mesma sintaxe do comando CREATE TABLE.

• DROP COLUMN Esta forma remove uma coluna da tabela. Os índices e as restrições da tabela que referenciam a coluna também serão automaticamente excluídos. É necessário especificar CASCADE se algum objeto fora da tabela depender da coluna como, por exemplo, referências de chaves estrangeiras ou visões.

• SET/DROP DEFAULT Estas formas definem ou removem o valor padrão para a coluna. O valor padrão somente é aplicado nos próximos comandos INSERT; as linhas existentes na tabela não são modificadas. Valores padrão também podem ser criados para visões e, neste caso, são inseridos pelo comando INSERT na visãoantes da regra ON INSERT da visão ser aplicada.

Page 42: Introdução ao SQL

SQL (Comandos da DDL) – Alter Table• SET/DROP NOT NULL Estas formas mudam se a coluna está

marcada para permitir valores nulos ou para rejeitar valores nulos. A forma SET NOT NULL somente pode ser utilizada quando não existem valores nulos na coluna.

• SET STATISTICS Esta forma define o valor usado para a coleta de estatísticas por coluna para as próximas operações de ANALYZE. O valor pode ser definido no intervalo de 0 a 1000; como alternativa, pode ser definido como -1 para utilizar o valor padrão do sistema para as estatísticas.

• SET STORAGE Esta forma define o modo de armazenamento para a coluna.

• RENAME A forma RENAME muda o nome de uma tabela (de um índice, de uma seqüência ou de uma visão), ou o nome de uma coluna da tabela. Não ocasiona efeito sobre os dados armazenados.

Page 43: Introdução ao SQL

SQL (Comandos da DDL) – Alter Table• DROP CONSTRAINT Esta forma remove restrições de

tabela. Atualmente, as restrições de tabela não necessitam ter nomes únicos e, portanto, pode haver mais de uma restrição correspondendo ao nome especificado. Todas estas restrições serão removidas.

• OWNER Esta forma muda o dono da tabela, índice, seqüência ou visão como sendo o usuário especificado. É necessário ser o dono da tabela para executar o comando ALTER TABLE, exceto para a forma ALTER TABLE OWNER que somente pode ser executada por um superusuário.

Page 44: Introdução ao SQL

SQL (Comandos da DDL)• ALTER TABLE — SintaxeALTER TABLE [ ONLY ] tabela [ * ] ADD [ COLUMN ] column tipo [ restrição_de_coluna [ ... ] ] ALTER TABLE [ ONLY ] tabela [ * ] DROP [ COLUMN ] coluna [ RESTRICT | CASCADE ] ALTER TABLE [ ONLY ] tabela [ * ] ALTER [ COLUMN ] coluna { SET DEFAULT valor | DROP DEFAULT } ALTER TABLE [ ONLY ] tabela [ * ] ALTER [ COLUMN ] coluna { SET | DROP } NOT NULL ALTER TABLE [ ONLY ] tabela [ * ] ALTER [ COLUMN ] coluna SET STATISTICS inteiro ALTER TABLE [ ONLY ] tabela [ * ] ALTER [ COLUMN ] coluna SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN } ALTER TABLE [ ONLY ] tabela [ * ] RENAME [ COLUMN ] coluna TO novo_nome_da_colunaALTER TABLE tabela RENAME TO novo_nome_da_tabelaALTER TABLE [ ONLY ] tabela [ * ] ADD definição_de_restrição_de_tabelaALTER TABLE [ ONLY ] tabela [ * ] DROP CONSTRAINT nome_da_restrição [ RESTRICT | CASCADE ] ALTER TABLE tabela OWNER TO novo_dono

Page 45: Introdução ao SQL

SQL (Comandos da DML)• SELECT (DISTINCT) (*, COLUNA (SINÔNIMO), ...)FROM tabelaWHERE condição ou condiçõesORDER BY (coluna, expressão) (ASC/DESC)

• Exemplo : SELECT registro, nome, cpf FROM cadastro;

Page 46: Introdução ao SQL

SQL (Comandos da DML)• Note aqueles nomes de colunas estão separados por

uma vírgula.• Ele possibilita selecionar todas as colunas da tabela,

especificando um * (asterisco) depois do SELECT palavra comando.

• SELECT * FROM CADASTRO;

Page 47: Introdução ao SQL

SQL (Comandos da DML)• Outros itens da clausula SELECT

– É possível incluir outros itens na clausula SELECT.– Expressões Aritméticas.

– Colunas sinônimas

– Concatenação de colunas

– Literais

Page 48: Introdução ao SQL

SQL (Comandos da DML)

• Expressões Aritméticas

• Uma expressão é a combinação de um ou mais valores, operadores, e funções os quais avaliam para um valor.

• Expressões Aritméticas podem conter nome de colunas, valores numéricos constantes e operadores aritméticos

Divisão/

Multiplicação*

Subtração-

Adição+

DescriçõesOperadores

Ex. : SELECT nome, SAL*12FROM cadastro;

Page 49: Introdução ao SQL

SQL (Comandos da DML)

• Colunas Sinônimas• Quando mostramos o resultado de uma pesquisa, o PgAdmin

normalmente usa o nome as colunas selecionadas como cabeçalho. Em alguns exemplos ele pode ser sem sentido. Você pode modificaro cabeçalho de uma coluna usando sinônimos(alias).

• Uma coluna sinônima é um cabeçalho de coluna alternativo na saída. Especifique o sinônimo (alias) depois da coluna na lista do SELECT. O cabeçalho sinônimo padrão será fornecido sem espaços em branco, amenos que o sinônimo esteja dentro de aspas duplos (“ “).

• Exemplo : select registro, nome, datanasc “data de nascimento” from cadastro

Page 50: Introdução ao SQL

SQL (Comandos da DML)

• O Operador de ConcatenaçãoO Operador de Concatenação (||) permite que as colunas sejam juntadas com outras colunas, expressões aritméticas ou valores constantes para criar uma expressão alfanumérica. Colunas ficam lado a lado com operadores para formarem uma única coluna.

• Exemplo : SELECT registro||nome FROM cadastro;

Page 51: Introdução ao SQL

SQL (Comandos da DML)

• Literais• Um literal são um ou mais caracteres, expressões, números incluídos na lista do SELECT o qual não é um nome de coluna ou de um sinônimo• Um literal na lista do SELECT terá uma saída para cada linha retornada. Literais de livre formatos de textos podem ser incluídos no resultado da pesquisa, e são tratados como uma coluna na lista do SELECT.•Datas e caracteres alfanuméricos devem ser colocados entre aspassimples(‘); números não precisam de aspas simples.• As declarações seguintes contém literais selecionados com concatenação e colunas sinônimas.

Exemplo : select registro||’-’||nome from cadastro

Page 52: Introdução ao SQL

SQL (Comandos da DML)• Prevenindo a Seleção de Linhas DuplicadasA menos que você indique de outra maneira, SQL*Plus mostrará os resultados da pesquisa sem eliminar as duplicações.Para listar todos os números de departamentos da tabela EMP, faça:• Exemplo :

SELECT DEPTBASE FROM CADASTRO;

• A clausula DISTINCTPara eliminar valores duplicados no resultado, incluímos o DISTINCT qualificador no comando SELECT.

Para eliminar os valores Duplicados mostrados no exemplo anterior, faça:Exemplo :

SELECT DEPTBASE FROM CADASTRO;

Page 53: Introdução ao SQL

SQL (Comandos da DML)• A clausula ORDER BY• Normalmente a ordem das linhas retornadas de uma pesquisa é indefinida. A clausula ORDER BY pode ser usada para ordenar as linhas. Se usado, o ORDER BY precisa sempre ser a última clausula da declaração SELECT.Para ordenar pelo nome, faça:

• Exemplo : SELECT nome, deptobase FROM cadastro

ORDER BY nome;

SELECT nome, deptobase FROM cadastroORDER BY 1;

Page 54: Introdução ao SQL

SQL (Comandos da DML)• Ordenação por várias colunas.• É possível na clausula ORDER BY usar mais de uma coluna. O limite de colunas é de fato o número de colunas da tabela. Na clausula ORDER BY especifica-se as colunas pelo que as linhas serão ordenadas, separando as por vírgula. Se algumas ou todas são invertidas especifique DESC depois de alguma ou cada uma das colunas

• Exemplo :

SELECT DEPTBASE, NOME FROM CADASTROORDER BY DEPTBASE, NOME DESC;

Page 55: Introdução ao SQL

SQL (Comandos da DML)• A Clausula WHEREA clausula WHERE corresponde aos Operadores de Restrições da Álgebra Relacional.Ele contém condições nas quais a linha precisa se encontrar em ordem para ser mostrada.

Estrutura da seleção com restrições.SELECT coluna(s)FROM tabela(s)WHERE certa condição a ser encontrada

Page 56: Introdução ao SQL

SQL (Comandos da DML)A clausula WHERE pode comparar valores em uma coluna, valores literais, expressões aritméticas ou funções. A clausula WHERE conta com três elementos.1- Um nome de coluna2- Um operador de comparação3- Um nome de coluna, um constante, ou lista de valores.Operadores de Comparação são usados na clausula WHERE e podem ser divididos em duas categorias, Lógicos e SQL.

Operadores LógicosEsses operadores lógicos testam as seguintes condições:

menor e igual a<=

menor que<

maior e igual a>=

maior que>

igual a=

SignificadoOperador

Page 57: Introdução ao SQL

SQL (Comandos da DML)• Para listar os nomes e departamentos de todos os empregados do departamento 1402

• SELECT nome, deptobase FROM cadastroWHERE deptbase=1402;

• Para encontrar todos os nomes de departamentos com número de departamento maior que 1500, faça

SELECT nome, deptobase FROM cadastroWHERE deptbase > 1500;

Page 58: Introdução ao SQL

SQL (Comandos da DML)Comparando uma coluna com outra coluna na mesma linha:Você pode comparar uma coluna com outra coluna na mesma linha, da mesma forma com um valor constante.

Por exemplo, suponhamos que você quer encontrar os empregados osquais a comissão está maior que seu salário, faça:

SELECT nome FROM cadastroWHERE Com >= Sal;

Page 59: Introdução ao SQL

SQL (Comandos da DML)• Operadores SQLExistem quatro operadores SQL os quais opera, com todos tipos de dados:

é um valor nuloIS NULL

Compara um parâmetro alfanuméricoLIKE

compara uma lista de valoresIN(Lista)

Entre dois valores (inclusive)BETWEEN ... AND ...

SignificadoOperador

Page 60: Introdução ao SQL

SQL (Comandos da DML)• O Operador BETWEEN

Testa para um faixa de valores, e inclusive do menor a maior faixa.Suponhamos que nós quisemos ver aqueles empregados nascidos depois de 1960

SELECT nome, datanasc from cadastroWHERE datanasc BETWEEN '1960-01-01' AND '2007-01-31';

Page 61: Introdução ao SQL

SQL (Comandos da DML)• O Operador IN

Testa os valores especificados em uma lista.Para encontrar empregados que esteja um dos três departamentos, faça:

SELECT nome, deptobase FROM cadastroWHERE deptobase IN (1402,1502,1503)

Page 62: Introdução ao SQL

SQL (Comandos da DML)• O Operador LIKE

Algumas vezes você precisa procurar valores que você não conhece exatamente Usando o operador LIKE é possível selecionar linhas combinando parâmetros alfanuméricos. Dois símbolos podem ser usados para construir uma linha de procura.

um número desejado de caracteres

_

Várias seqüência de zero ou mais caracteres

%RepresentaSímbolo

Page 63: Introdução ao SQL

SQL (Comandos da DML)• O Operador LIKE

Para listar todos os empregados os quais o nome começa com a letra S, faça:

SELECT nome FROM cadastroWHERE nome LIKE 'S%';

Eles podem ser usados para encontrar um determinado número de caracteres.Por exemplo para listar todos empregados que tenham exatamente quatro caracteres de tamanho do nome.

SELECT NOME FROM CADASTROWHERE NOME LIKE '____'

Page 64: Introdução ao SQL

SQL (Comandos da DML)• Operador IS NULLUnicamente encontrar todos os empregados que não tenham telefone, você testará um valor nulo:

SELECT nome FROM cadastro WHERE telefoneres IS NULL;

Page 65: Introdução ao SQL

SQL (Comandos da DML)• Expressões NegativasOs operadores seguintes são testes de negação:

não maior queNOT COLUNA_NOME>

não igual queNOT COLUNA_NOME=

não igual para (todos sistemas operacionais)

<>não igual para (IBM)^=não igual para (VAX,UNIX,PC)!=DescriçãoOperador

Page 66: Introdução ao SQL

SQL (Comandos da DML)• Operadores SQL

tudo que não for nuloIS NOT NULLtudo que não conter a linha de caracteresNOT LIKEtudo que não estiver na listaNOT INtudo que estiver fora da faixaNOT BETWEENDescriçãoOperador

Para encontrar aqueles empregados cujo os nomes não comecem com a letra M, faça:

SELECT NOME, DEPTOBASE FROM CADASTROWHERE NOME NOT LIKE 'M%';

Page 67: Introdução ao SQL

SQL (Comandos da DML)Você pode combinar AND e OR na mesma expressão lógica.Quando AND e OR aparecer na mesma clausula WHERE,

todos os ANDs serão feitos primeiros e então todos os Orsserão feitos.

Se AND não interfere sobre o OR a seguinte declaração SQL retornará todos os gerentes com salário acima de 1500, e todos os vendedores.

SELECT EMPNO, ENAME, JOB, SAL, DEPTNOFROM EMP WHERE SAL > 1500 AND JOB = 'MANAGER‘ OR JOB = 'SALESMAN'

Page 68: Introdução ao SQL

SQL (Comandos da DML) Extraindo Dados de Mais de uma Tabela

Ligações (Joins)

• Uma ligação é usada quando a pesquisa SQL requer dados de mais de uma tabela do Banco de Dados.

• Linhas em uma tabela devem ser ligadas a outras linhas de acordo com o valor comum existente na coluna correspondente.

Existem dois tipos principais de condições de ligações:1. Equi-join2. Non-equi-join

Page 69: Introdução ao SQL

SQL (Comandos da DML) Extraindo Dados de Mais de uma Tabela

Equi-Join• Na ordem para descobrir, manualmente, qual

departamento vários empregados estão, nós comparamos a coluna DEPTOBASE da tabela CADASTRO com a mesmo valor de DEPTOBASE na tabela DEPT.

• O relacionamento entre a tabela EMP e a DEPT é um equi-join, em que o valor da coluna DEPTNO seja igual para ambas as tabelas( o = operador de comparação é usado).

Page 70: Introdução ao SQL

SQL (Comandos da DML) Extraindo Dados de Mais de uma Tabela

Uma condição de ligação é especificada na clausula WHERE:

SELECT coluna(s)FROM tabela(s)WHERE condição de ligação

Para ligar as duas tabelas CADASTRO e DEPTO, faça:SELECT CADASTRO.NOME, DEPTO.NOMEFROM CADASTRO, DEPTOWHERE CADASTRO.DEPTOBASE = DEPTO.CODIGO;

Page 71: Introdução ao SQL

SQL (Comandos da DML) Extraindo Dados de Mais de uma Tabela

Usando Tabelas com Sinônimos

• Pode ser tedioso repetir o nome inteiro de um tabela em uma coluna. Nomes temporários (ou sinônimos) podem ser usados na clausula FROM. Estes nomes temporários valem unicamente para a declaraçãode SELECT corrente. Tabelas sinônimas devem então ser declaradas na clausula SELECT. Isso agiliza a pesquisa em que a declaração contém muitas informações.

• Tabelas Sinônimas estão sendo usadas na seguinte declaração:

SELECT C.NOME, D.NOMEFROM CADASTRO C, DEPTO DWHERE C.DEPTOBASE = D.CODIGOORDER BY D.CODIGO

Page 72: Introdução ao SQL

SQL (Comandos da DML) Extraindo Dados de Mais de uma Tabela

Nom-Equi-Join• O relacionamento entre as tabelas CADASTRO e SALFAIXA é um nom-equi-join, em que a coluna na CADASTRO corresponde direto a uma coluna na SALFAIXA. O relacionamento é obtido usando um outro operador que o igual(=). • Para avaliar um grau do salário de um empregado é necessário que o salário esteja entre o menor e maior faixa de salário.

• O operador BETWEEN é usado para construir a condição, faça:SELECT C.NOME, C.SAL, S.FAIXAFROM CADASTRO C, SALFAIXA SWHERE C.SAL BETWEEN S.LOSAL AND S.HISAL;

Page 73: Introdução ao SQL

SQL (Comandos da DML) Extraindo Dados de Mais de uma Tabela

1. Mostra todos os nomes dos empregados e o nome de seus departamentos em ordem de nome de departamento

2. Mostrar o nome de todos os empregados, nome e número do departamento

3. Mostrar o nome e departamento dos empregados que nasceram antes de 1966.

4. Mostrar todos os alunos do curso de cinema (225) 5. Mostrar matricula, nome, curso e disciplina dos alunos do

curso de filosofia que já cursaram a disciplina FIL311.

Page 74: Introdução ao SQL

SQL (Comandos da DML)

Funções de Grupo• Funções de grupo operam sobre conjuntos de linhas.

Elas retornam resultados baseados sobre um grupo de linhas, antes que um resultado por linha tenha retornado como uma função de linha única.

Group by• Como padrão todas as linhas de um tabela são trilhadas

como um grupo. A clausula GROUP BY da declaração do SELECT é usada para dividir as linhas em menores grupos.

Page 75: Introdução ao SQL

SQL (Comandos da DML)

variação de n, ignorando valores nulos.VARIANCE([DISTINCT/ALL],n)

Valor soma de n, ignorando valores nulos.

SUM([DISTINCT/ALL]n)

Desvio padrão de n, ignorando valores nulos.

STDDEV([DISTINCT/ALL]n)

valor mínimo da expressãoMIN([DISTINCT/ALL]expr)

valor máximo da expressãoMAX([DISTINCT/ALL]expr)

* conta todas as linhas selecionadas, incluindo duplicadas e linhas nulas

ContadorCOUNT([DINSTINCT/ALL]expr*)

Valor médio de n, ignorando os valores nulos.

AVG([DINSTINCT/ALL]n)

Valor RetornadoFunção

Page 76: Introdução ao SQL

SQL (Comandos da DML)

Todas as funções do slide anterior operam sobre um número de linhas (por exemplo, uma tabela inteira) e são portanto funções de GRUPO.

• DISTINCT faz uma função de grupo considerar valores não duplicados;

• ALL considera todos os valores sua declaração não é necessária.

•Todas as funções de grupo exceto o COUNT(*) ignoram os valores nulos

Page 77: Introdução ao SQL

SQL (Comandos da DML)Funções de Grupo

• AVGPara calcular a média das GQs dos alunos

do curso 047 :

SELECT AVG(gq1+gq2+gq3) FROM srhac01;SELECT AVG(sal) FROM cadastro;

Page 78: Introdução ao SQL

SQL (Comandos da DML)Funções de Grupo

MINUma função de grupo pode ser usada para subconjunto de linhas de uma tabela usando a clausula WHERE.Para encontrar o funcionário mais velho da UGF, do deptobase 1711 faça:

• SELECT MIN(datanasc) FROM CADASTRO WHERE deptobase = ‘1711';

Page 79: Introdução ao SQL

SQL (Comandos da DML)Funções de Grupo

COUNTPara encontrar o número de empregados do departamento 1711, faça:

SELECT COUNT(*) FROM CADASTROWHERE DEPTOBASE = 1711;

Nota: A função COUNT usada dessa forma COUNT(1) tem o mesmo resultado que a acima e é mais rápida.

Page 80: Introdução ao SQL

SQL (Comandos da DML)Funções de Grupo

A clausula GROUP BY•A clausula GROUP BY pode ser usada para dividir as linhas de uma tabela em um menor grupo. Funções de grupo devem ser usadas para resumir informações por cada grupo.

Para mostrar os funcionários mais velhos por departamento, faça:• SELECT deptobase, min(datanasc) FROM cadastroGROUP BY deptobase;

Page 81: Introdução ao SQL

SQL (Comandos da DML)Funções de GrupoExcluindo linhas quando estiver Usando o GROUP BYLinhas devem ser excluídas com a clausula WHERE, antes da divisão por grupos.

Para mostrar o funcionário mais velho por deptobaseexcluindo o deptobase 1711, faça:

SELECT deptobase, min(datanasc) FROM cadastro

WHERE deptobase <> ‘1711‘GROUP BY deptobase;

Page 82: Introdução ao SQL

SQL (Comandos da DML)Funções de Grupo

Grupos dentro de Grupos

Nós podemos então usar a clausula GROUP BY para prover resultados para grupos dentro de grupos.

Mostre o funcionário mais novo por cada função dentro de um departamento, faça:

SELECT deptobase, funcao, max(datanasc) FROM cadastro GROUP BY deptobase, funcao;

Page 83: Introdução ao SQL

SQL (Comandos da DML)Funções de Grupo

Funções de Grupo e Resultados IndividuaisA seguinte declaração SQL retorna a maior idade para cada grupo. O resultado não é significativo porque o deptobase não é mostrado no resultado.• SELECT MIN(datanasc) FROM cadastroGROUP BY deptobase;

Mostrando o Departamento• SELECT MIN(datanasc),deptobase FROM cadastro GROUP BY deptobase;

Page 84: Introdução ao SQL

SQL (Comandos da DML)Funções de Grupo

Suponha na mente a seguinte regra quando usar funções de grupo:

Se você inclui uma função de grupo no comando SELECT, você não deve selecionar resultados que não estejam declarados no GROUP BY.

Page 85: Introdução ao SQL

SQL (Comandos da DML)Funções de Grupo

Por exemplo:SELECT DEPTOBASE, MIN(DATANASC) FROM CADASTRO;

•ERROR: column "cadastro.deptobase" mustappear in the GROUP BY clause or be used in an aggregate function.O comando é inválido porque DEPTOBASE tem um valor para cada linha da tabela, enquanto MIN(DATANASC) tem um valor para tabela inteira.

Page 86: Introdução ao SQL

SQL (Comandos da DML)Funções de Grupo

Para corrigir o erro, nós devemos agrupar o item individual:

SELECT DEPTOBASE, MIN(DATANASC) FROM CADASTROGROUP BY DEPTOBASE;

Page 87: Introdução ao SQL

SQL (Comandos da DML)Funções de Grupo

A clausula HAVINGUse a clausula HAVING se você quiser especificar o qual grupo será mostrado.

Para mostrar todos os departamentos que tiverem mais de três empregados, faça:SELECT DEPTOBASE FROM CADASTROGROUP BY DEPTNO HAVING COUNT(1) > 3;

Page 88: Introdução ao SQL

SQL (Comandos da DML)Funções de Grupo

Para mostrar só os departamentos, onde existe funcionários nascidos antes de 1930-01-01, faça:

SELECT deptobase, datanasc FROM cadastroGROUP BY deptobase, datanaschaving min(datanasc)<='1930-01-01'

Page 89: Introdução ao SQL

SQL (Comandos da DML)Funções de Grupo

A clausula WHERE não pode ser usada para restringir itens de grupo.A seguinte declaração da clausula WHERE é errada.

SELECT deptobase, datanasc FROM cadastroGROUP BY deptobase, datanascWHERE min(datanasc)<='1930-01-01'

Você pode unicamente usar WHERE para restringir linhas individuais. Para restringir colunas de grupos usa-se a clausula HAVING.

Page 90: Introdução ao SQL

SQL (Comandos da DML)Funções de Grupo

Nota: Você pode excluir todos os “gerentes” usando a clausula WHERE quando estiver agrupando por cargo.

SELECT funcao FROM cadastroWHERE funcao <> ‘035013'GROUP BY funcao;

Page 91: Introdução ao SQL

SQL (Comandos da DML)Funções de Grupo

Exercícios1. Encontrar o funcionário mais antigo 2. Encontrar o funcionário mais antigo e o mais novo3. Listar o mais novo e o mais velho funcionário por

cargo4. Encontrar quantos funcionários lecionam5. Mostre o departamento e a sua descrição que

tiverem mais de 40 empregados6. Cheque se todos os números de funcionários são

únicos

Page 92: Introdução ao SQL

SQL (Comandos da DML)INSERT

insert into nomedatabela(campo 1,...,campo n)Values (valor 1,...,valor n)

Exemplo 1: INSERT INTO alunovestibular(matricula,notaobjetiva,notaredacao,classificacao)VALUES (‘20061000001’,’20’,’2.5’,1);

Page 93: Introdução ao SQL

SQL (Comandos da DML)INSERT

insert into nomedatabela(campo 1,...,campo n)Values (valor 1,...,valor n)

Exemplo 2: INSERT INTO alunovestibular

VALUES (‘20061000001’,’20’,’2.5’,1);

Page 94: Introdução ao SQL

SQL (Comandos da DML)UPDATE

UPDATE nomedatabelaSET campo 1 = valor 1,..., campo n = valor n

Exemplo : "UPDATE alunovestibularSET notaobjetiva=’20’,

notaredacao=‘3.5’,classificacao=‘2'

WHERE matricula='".$matricula."'";

Page 95: Introdução ao SQL

SQL (Comandos da DML)DELETE

DELETE FROM nomedatabelaWHERE <CONDIÇÃO>

Exemplo : ?

Page 96: Introdução ao SQL

SQL (Comandos da DML)Sub-Pesquisas• Pesquisas contendo na clausula WHERE ou HAVING de outra declaração SQL

• Uma sub-pesquisa é uma declaração SELECT que é aninhada com outra declaração SELECT e a qual retorna resultados intermediários.

• Por exemplo:SELECT coluna1, coluna2, ...FROM tabelaWHERE coluna = (SELECT coluna

FROM tabelaWHERE condição)

Page 97: Introdução ao SQL

SQL (Comandos da DML)Sub-Pesquisas

• A sub-pesquisa é geralmente referida como SUB-SELECT ou SELECT interno;

• Geralmente executa primeiro e a saída é usada para completar a condição da pesquisa principal ou outra pesquisa.

Page 98: Introdução ao SQL

SQL (Comandos da DML)Sub-Pesquisas de Linha Única

• Para encontrar o empregado que ganha o mínimo salário na companhia (o mínimo salário é uma quantidade desconhecida), dois passos devem ser seguidos:

1. Encontrar o salário mínimo:SELECT MIN(salario) FROM cadastro;

Page 99: Introdução ao SQL

SQL (Comandos da DML)Sub-Pesquisas de Linha Única

• 2. Encontrar o empregado que ganha o salário mínimo:

SELECT nome, salario FROM cadastroWHERE salario = (menor salário o qual é

desconhecido)

Page 100: Introdução ao SQL

SQL (Comandos da DML)Sub-Pesquisas de Linha Única

• Nós podemos combinar os dois comandos como uma sub-pesquisa aninhada:

SELECT nome, salario FROM cadastroWHERE salario = SELECT MIN(salario)

FROM cadastro;

Page 101: Introdução ao SQL

SQL (Comandos da DML)Sub-Pesquisas de Linha Única• Como são processadas as Sub-pesquisas

Aninhadas?• Uma declaração SELECT pode ser considerada

como uma pesquisa em bloco. O exemplo anterior consiste de duas pesquisas em bloco - a principal pesquisa e a pesquisa interna.

• A interna declaração SELECT é executada primeiro, produzindo um resultado : 800. A principal pesquisa em bloco está então processando e usa o valor retornado pela pesquisa interna para completar a condição procurada.

Page 102: Introdução ao SQL

SQL (Comandos da DML)Sub-Pesquisas de Linha Única• Na essência, a principal pesquisa finaliza-se

olhando como isso:SELECT nome, salario FROM cadastroWHERE salario = 800;

• No exemplo acima, o 800 é um valor único. A sub-pesquisa que retorna o valor 800 é chamada de sub-pesquisa de linha única. Quando uma sub-pesquisa retorna uma única linha: uma linha ou operador lógico deve ser usado. Por exemplo: =, <, >, <=, etc.

Page 103: Introdução ao SQL

SQL (Comandos da DML)Sub-Pesquisas de Linha Única• Para encontrar todos os empregados que trabalham no

mesmo departamento do Camarão nós fazemos:

SELECT nome, deptobaseFROM cadastroWHERE deptobase = (SELECT deptobase

FROM cadastroWHERE nome = ‘Camarão');

A pesquisa interna retorna o departamento do Camarão, o qual é usado na condição WHERE da pesquisa principal

Page 104: Introdução ao SQL

SQL (Comandos da DML)Sub-Pesquisas que Retorna mais de Uma Linha

• A seguinte pesquisa atende para encontrar os empregados que ganham o menor salário nos departamentos.

SELECT nome, salario, deptobaseFROM cadastroWHERE salario IN (SELECT MIN(salario)

FROM cadastroGROUP BY deptobase);

Page 105: Introdução ao SQL

SQL (Comandos da DML)Sub-Pesquisas que Retorna mais de Uma Linha

Note que a pesquisa interna tem a clausula GROUP BY. Isso significa que ele pode retornar mais que um valor.

Nós precisamos para usar múltiplas linhas de um operador de comparação. Neste caso o operador IN deve ser usado porque específica uma lista de valores

Page 106: Introdução ao SQL

SQL (Comandos da DML)Sub-Pesquisas que Retorna mais de Uma Linha

• Comparando mais de um valor

A seguinte pesquisa encontrará aqueles empregados que ganham o menor salário no seu respectivo departamento:

A seguinte pesquisa encontrará aqueles empregados que ganham o menor salário no seu respectivo departamento:

SELECT nome, salario, deptobase FROM cadastroWHERE (salario,deptobase) IN (SELECT MIN(salario), deptobase

FROM cadastroGROUP BY deptobase);

Page 107: Introdução ao SQL

SQL (Comandos da DML)Sub-Pesquisas que Retorna mais de Uma Linha

• Erros EncontradosQuando uma sub-pesquisa retorna mais que uma linha e um operador de linha única é usado, a seguinte mensagem de erro:

SELECT nome, salario, deptobaseFROM cadastroWHERE salario = (SELECT MIN(salario)

FROM cadastroGROUP BY deptobase);

ERROR -> more than one row returned by a subquery used as anexpression

Page 108: Introdução ao SQL

SQL (Comandos da DML)Operadores ANY ou ALL

• Os operadores ANY ou ALL devem ser usados para sub-pesquisas que retornam mais de uma linha. Eles são usados na clausula WHERE ou HAVING em conjunto com os operadores lógicos. (=,<>, <, >, >=, <=).• ANY compara um valor para cada valor retornado em uma sub-pesquisa.Para mostrar os empregados que ganham mais que o menor salário no departamento 3003, faça:

SELECT nome, salario, funcao, deptobase FROM cadastroWHERE salario >ANY (SELECT DISTINCT salario

FROM cadastro WHERE deptobase = 3003)ORDER BY salario DESC;

Page 109: Introdução ao SQL

SQL (Comandos da DML)Operadores ANY ou ALL

• O menor salário do departamento 3003 é 500. A principal pesquisa tem que retornar os empregados que ganham o salário maior que o menor salário no departamento 3003.

• ‘< ANY’ é equivalente ao IN.

• Quando usamos ANY, a palavra chave DISTINCT é usada para prevenir a seleção de linhas ocupadas.

Page 110: Introdução ao SQL

SQL (Comandos da DML)Operadores ANY ou ALL• ALL compara um valor com todos os valores retornados em uma sub-pesquisa • A seguinte pesquisa encontra os empregados que ganham mais que todos os empregados no departamento 3003.

SELECT nome, salario, funcao, deptobaseFROM cadastroWHERE salario>ALL (SELECT DISTINCT salario

FROM cadastroWHERE deptobase = 3003)

ORDER BY salario DESC;

O maior salário no departamento 3003 é 6500, a pesquisa tem que retornar aqueles empregados que ganham mais que 6500. Existe salário maior que o maior do departamento 3003.

O operador NOT podem ser usado com IN, ANY ou ALL.

Page 111: Introdução ao SQL

SQL (Comandos da DML)Operadores Exists• O operador EXISTS é freqüentemente usado com Sub-pesquisas correlatas. Ele testa quando um valor existe. (NOT EXISTS garante que não existe). Se o valor existir será retornado Verdadeiro, se não existir será retornado Falso.

• Para encontrar os empregados que tem no mínimo uma pessoa subordinada a ele, faça:

SELECT EMPNO, ENAME, JOB, DEPTNOFROM EMP EWHERE EXISTS (SELECT EMPNO

FROM EMPWHERE EMP.MGR = E.EMPNO)

ORDER BY EMPNO;

Page 112: Introdução ao SQL

SQL (Comandos da DML)Operadores Exists• Encontrar os empregados que o departamento não é o da tabela DEPT:

SELECT, ENAME, DEPTNOFROM EMPWHERE NOT EXISTS (SELECT DEPTNO

FROM DEPTWHERE DEPT.DEPTNO = EMP.DEPTNO);

• Outro caminho para encontrar o departamento que não tem nenhum empregado é:

SELECT DEPTNO, DNAMEFROM DEPT DWHERE NOT EXISTS (SELECT 'X'

FROM EMP EWHERE E.DEPTNO = D.DEPTNO);

• Note que o SELECT interno não precisa retornar um valor específico, unicamente um literal para ser selecionado.

Page 113: Introdução ao SQL

SQL (Comandos da DML)Clausula HAVING com Sub-pesquisas aninhadas

• Lembre-se que WHERE refere-se para linha única e HAVING a grupos de linhas especificadas na clausula GROUP BY.• Por exemplo, para mostrar os departamentos que tenham a média salarial maior que a do departamento 3003, faça:

SELECT deptobase, AVG(salario) FROM cadastroHAVING AVG(salario) > (SELECT AVG(salario)

FROM cadastroWHERE deptobase = 3003)GROUP BY deptobase;

Page 114: Introdução ao SQL

SQL (Comandos da DML)Clausula HAVING com Sub-pesquisas aninhadas

Para construir uma pesquisa que encontre a função com maior média salarial, faça:

SELECT funcao, AVG(salario)FROM cadastroGROUP BY funcaoHAVING AVG(salario) = (SELECT MAX(AVG(salario))

FROM cadastroGROUP BY funcao);

Page 115: Introdução ao SQL

SQL (Comandos da DML)Sub-pesquisas aninhadas

Sub-pesquisas devem ser aninhadas (usadas com outras sub-pesquisas):• Mostrar o nome, cargo e admissão para os empregados cuja o salário seja maior que o maior salário do departamento ‘NUCLEO DE TEC DA INFORMACAO ’.

SELECT nome, funcao, dataadmissao, salario FROM cadastroWHERE salario > (SELECT MAX(salario) FROM cadastro

WHERE deptobase = (SELECT deptobase FROM deptofuncWHERE descricao = ' NUCLEO DE TEC DA

INFORMACAO '));

Page 116: Introdução ao SQL

SQL (Comandos da DML)

• Performance depende do uso dos índices, o número de linhas retornadas pela pesquisa, o tamanho da tabela e se tabelas temporárias são requeridas para avaliar resultados temporários. • As tabelas temporárias geradas pelo SGBD não são indexadas, e essa pode levar para o degradamento na performance para sub-pesquisas usando IN, ANY e ALL.

Page 117: Introdução ao SQL

SQL (Comandos da DML)Sub-pesquisas aninhadas

Exercícios1. Encontrar os empregados que ganham o maior salário em cada

função e ordenar o salário da forma descendente 2. Encontrar os empregados que ganham o mínimo salário para sua

função. Mostrar o resultado em ordem ascendente de salário.3. Encontrar o mais recente admitido empregado em cada

departamento. Ordenado por admissão. 4. Mostre o nome, salário e departamento para qualquer empregado

que ganhe um salário maior que a média para seu departamento. Ordenar pelo número de departamento.

5. Lista todos os departamentos onde não existem empregados. (Usando dessa vez um sub-pesquisa).

Page 118: Introdução ao SQL

SQL (Comandos da DCL)Comandos da DCL

• GRANT• GRANT — concede privilégios de acesso • Sinopse • GRANT { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES |

TRIGGER } [,...] | ALL [ PRIVILEGES ] } ON [ TABLE ] nome_da_tabela [, ...] TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...]

• GRANT { { CREATE | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] } ON DATABASE nome_bd [, ...] TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...]

• GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON FUNCTION nome_da_função ([tipo, ...]) [, ...] TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...]

• GRANT { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGE nome_da_linguagem [, ...] TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...]

• GRANT { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] } ON SCHEMA nome_do_esquema [, ...] TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...]

Page 119: Introdução ao SQL

SQL (Comandos da DML)Comandos da DDL

• O comando GRANT concede privilégios específicos sobre um objeto (tabela, visão, seqüência, banco de dados, função, linguagem procedural ou esquema) para um ou mais usuários ou grupos de usuários.

• Estes privilégios são adicionados aos já concedidos, caso existam.

• Exemplos:1. GRANT SELECT ON minha_tabela TO PUBLIC; 2. GRANT SELECT,UPDATE,INSERT ON minha_tabela TO GROUP

todos;

Page 120: Introdução ao SQL

SQL (Comandos da DML)Comandos da DDL

Exemplos : Conceder, para todos os usuários, o privilégio de inserir na tabela filmes:

• GRANT INSERT ON filmes TO PUBLIC;

Conceder todos os privilégios na visão tipos para o usuário manuel:

• GRANT ALL PRIVILEGES ON tipos TO manuel;

Page 121: Introdução ao SQL

SQL (Comandos da DML)Comandos da DDL

• O comando REVOKE é utilizado para revogar privilégios de acesso.

Exemplos :• Revogar o privilégio de inserção na tabela filmes concedido para todos os usuários: REVOKE INSERT ON filmes FROM PUBLIC;

• Revogar todos os privilégios concedidos ao usuário manuelrelativos à visão vis_tipos:

REVOKE ALL PRIVILEGES ON vis_tipos FROM manuel;