SlideShare uma empresa Scribd logo
1 de 248
Baixar para ler offline
BANCO DE DADOS
https://www.facebook.com/alvarofpinheiroaulas/
br.linkedin.com/in/alvarofpinheiro/
http://www.alvarofpinheiro.eti.br
Objetivos
●Visão abrangente da Linguagem SQL e suas extensões;
●Conhecimento dos conceitos de banco de dados relacionais;
●Conhecimento detalhado dos comandos SQL ANSI;
●Apresentação de ferramentas para manipulação de SQL;
●Conhecimento dos comandos DDL, DML, DCL, DTL e DQL;
●Criação de consultas complexas;
●Otimização de consultas; e
●Utilização de SQL Embutido.
http://www.alvarofpinheiro.eti.br
Referências
●HEUSER, Carlos. Projeto de Banco de Dados. Porto Alegre: Editora Sagra,
1998.
●DATE, C. Introdução a Sistemas de Banco de Dados. São Paulo: Editora
Campos, 2008.
●XAVIER, Fabrício. SQL dos Conceitos às Consultas Complexas. São Paulo:
Editora Ciência Moderna, 2009.
●OLIVEIRA, Haley. Postgresql 8 Referencia. The PostgreSQL Global
Development Group, 2005.
●OLIVEIRA, Haley. Postgresql 8 Tutorial. The PostgreSQL Global
Development Group, 2005.
●MISTRY, Ross. Introducing Microsoft SQL Server 2008 R2. Washington:
Microsoft Press, 2010.
●ORACLE. MySQL 5.5 Reference Guide. 2011
http://www.alvarofpinheiro.eti.br
SQL
Definições
●Linguagem de Consulta Estruturada é uma linguagem
de pesquisa declarativa para banco de dados
relacional baseadas na álgebra relacional.
●O SQL surgiu na década de 70 na IBM baseado no
modelo relacional de Codd. É o padrão para banco de
dados relacionais e é mantido pela American National
Standards Institute (ANSI) e International Standards
Organization (ISO). Existindo várias versões revisadas
do SQL ANSI/ISO, as quais são: 1986, 1987, 1992,
1999 e 2003. E além desses padronizações, existem
as extensões inseridas pelos desenvolvedores de
banco de dados.
http://www.alvarofpinheiro.eti.br
Características:
Pode ser utilizado por uma grande faixa de usuários,
mesmo com pouca experiência em programação;
É uma linguagem não procedural;
Reduz o tempo necessário para a criação e manutenção
de sistemas;
É uma linguagem similar ao inglês.
SQL
http://www.alvarofpinheiro.eti.br
o Create Table
o Create Index
o Alter Table
o Insert
o Update
o Delete
o Select
o Projeção
o Seleção
o Junção
o Consulta Básica
o Alias
o Campos Calculados
o Valores Nulos
o Duplicidade
Linguagem
http://www.alvarofpinheiro.eti.br
o Condicionamento
o Ordenação
o Funções
o Funções Unica Linha
o Funções de Grupo
o Funções Caractere
o Funções Numérica
o Funções Data
o Funções Aninhamento
o Funções Conversão
o CASE
o Produto Cartesiano
o Equijunção
o Não-equijunção
o Junção externa
o Autojunção
o Aninhamento de Grupo de Dados
o Subconsultas
Linguagem
http://www.alvarofpinheiro.eti.br
o Grupo de Dados
o Grupo de Dados com ROLLUP
o Grupo de Dados com CUBE
o Subconsultas com ANY
o Subconsultas com ALL
o Subconsultas Correlatas
o Subconsultas com EXISTS
o União
o Intersecção
o Subtração
o Macrosubstituição
o Seleção de Seleção
o Análise Top-N
o Transações
o Visões
o Visões Simples
o Visões Complexas
Linguagem
http://www.alvarofpinheiro.eti.br
o Data Definition Language (DDL)
 (Create ..., Drop ..., Alter ...);
o Data Manipulation Language (DML)
 (Insert ..., Update ..., Delete ...);
o Data Query Language (DQL)
 (Select ...);
o Data Transaction Language (DTL)
 (Savepoint ..., Rollback ..., Commit ...);
o Data Control Language (DCL)
 (Grant ..., Revoke ...);
SQL Categorias
http://www.alvarofpinheiro.eti.br
SQL
Data Definition Language (DDL)
●Comandos para definição de estruturas de
dados, também conhecidos como metadados:
●CREATE TABLE
●CREATE INDEX
●CREATE VIEW
●DROP TABLE
●DROP INDEX
●DROP VIEW
●ALTER TABLE
http://www.alvarofpinheiro.eti.br
SQL
Data Definition Language (DDL)
●Constraints:
●UNIQUE
●PRIMARY KEY
●FOREIGN KEY
●Rules:
●RESTRICT
●CASCADE
http://www.alvarofpinheiro.eti.br
SQL
Data Manipulation Language (DML)
●Comandos usados para manutenção dos dados:
●INSERT
●UPDATE
●DELETE
http://www.alvarofpinheiro.eti.br
SQL
Data Query Language (DQL)
●Comando para consultas de dados:
●SELECT
http://www.alvarofpinheiro.eti.br
SQL
Data Transaction Language (DTL)
●Comandos para controle de transações:
●BEGIN TRANSACTION | START TRANSACTION
●COMMIT
●ROLLBACK
http://www.alvarofpinheiro.eti.br
SQL
Data Control Language (DCL)
●Comando para autorização de acesso aos dados:
●GRANT
●REVOKE
http://www.alvarofpinheiro.eti.br
SQL
Argumento do SELECT
●SELECT
●FROM
●IN
●JOIN
●WHERE
●GROUP BY
●HAVING
●ORDER BY
http://www.alvarofpinheiro.eti.br
SQL
Operadores Lógicos
AND
OR
NOT
http://www.alvarofpinheiro.eti.br
SQL
Operadores de Comparação
< <= > >= = !=
IS NULL
LIKE
IN
BETWEEN
EXISTS
http://www.alvarofpinheiro.eti.br
SQL
Funções Agregadas
●COUNT()
●SUM()
●AVG()
●MAX()
●MIN()
http://www.alvarofpinheiro.eti.br
SQL
Predicados
ALL
TOP
DISTINCT
http://www.alvarofpinheiro.eti.br
SQL
Subqueries
●EXISTS
●Seleção da Seleção
●SubConsulta
http://www.alvarofpinheiro.eti.br
●SQLServer
o Usuário: sa; Senha: senha definida.
●Postgre
 Usuário: root; Senha: sem senha.
●Oracle
o Usuário: SYSTEM; Senha: manager.
●MySQL
 Usuário: root; Senha: sem senha.
●Firebird
 Usuário: sysdba; Senha: masterkey.
BD Acesso
http://www.alvarofpinheiro.eti.br
TINYINT: Armazena valores numéricos inteiros.
SMALLINT: Armazena valores numéricos inteiros.
INT: Armazena valores numéricos inteiros.
BIGINT: Armazena valores numéricos inteiros.
NUMERIC(18,0): Armazena valores numéricos com casas decimais, utilizando precisão.
DECIMAL(18,0): Tem as mesmas funcionalidades do tipo NUMERIC.
FLOAT: Armazena valores numéricos aproximados com precisão de ponto flutuante.
REAL: Armazena valores numéricos aproximados com precisão de ponto flutuante.
BIT: Armazena bits ou seja somente poderá conter os valores lógicos 0 ou 1.
SMALLDATETIME: Armazena data e hora, com precisão de minutos.
DATETIME: Armazena data e hora, com precisão de centésimos de segundos.
TIME: Armazena somente hora. Pode armazenar segundos até a fração de 9999999
DATE: Armazena somente data.
CHAR(N): Armazena N caracteres fixos (até 8.000) no formato não Unicode, com espaços em branco.
VARCHAR(N): Armazena N caracteres (até 8.000) no formato não Unicode
TEXT: Armazena caracteres no formato não Unicode.
NCHAR(N): Armazena N caracteres fixos (até 4.000) no formato Unicode, com espaços em branco.
NVARCHAR(N): Armazena N caracteres (até 4.000) no formato Unicode.
NTEXT: Armazena caracteres no formato Unicode.
IMAGE: Armazena dados no formato binário.
BD SQLServer (Principais Tipos de Dados)
http://www.alvarofpinheiro.eti.br
BD Postgre (Principais Tipos de Dados)
bigint: inteiro de oito bytes com sinal.
bit: cadeia de bits de comprimento fixo.
varbit(n): cadeia de bits de comprimento variável.
Bool: booleano lógico (verdade/falso).
bytea: dados binários.
varchar(n): cadeia de caracteres de comprimento variável.
char(n): cadeia de caracteres de comprimento fixo.
date: data de calendário (ano, mês,dia).
float8: número de ponto flutuante de precisão dupla.
Int: inteiro de quatro bytes com sinal.
numeric[(p, s)]: numérico exato com precisão selecionável.
decimal [(p, s)] : numérico exato com precisão selecionável.
real: número de ponto flutuante de precisão simples.
smallint: inteiro de dois bytes com sinal.
text: cadeia de caracteres de comprimento variável.
time: hora do dia.
timestamp: data e hora.
http://www.alvarofpinheiro.eti.br
BD Oracle (Principais Tipos de Dados)
VARCHAR2(n): Conjunto de caracteres de tamanho variável.
NUMBER(p, e): Representa um número.
LONG: Conjunto de caracteres de tamanho variável.
DATE: Um valor de data.
LONG RAW: Dados binários..
CHAR(n): Conjunto de caracteres de tamanho fixo.
BLOB, CLOB, NCLOB e BFILE: Tipos de dados para conteúdos binários..
http://www.alvarofpinheiro.eti.br
BD MySQL (Principais Tipos de Dados)
BOOL: Booleano.
SMALLINT: inteiros pequenos.
INT: inteiros regulares.
INTEGER: o mesmo que INT.
BIGINT: inteiros grandes.
FLOAT(precisão): números de ponto flutuante de precisão simples ou dupla.
DOUBLE: números de ponto flutuante de precisão dupla.
DECIMAL[(M,D)]: número de ponto flutuante armazenado como char.
DATE: data. Exibido como YYYY-MM-DD.
TIME: hora. Exibido como HH:MM:SS.
DATETIME: data e hora. Exibido como YYYY-MM-DD HH:MM:SS.
CHAR: o mesmo que CHAR(1).
VARCHAR(n): variável string de tamanho variável.
TINYBLOB: BLOB pequeno.
TINYTEXT: TEXT pequeno.
BLOB: BLOB normal.
TEXT: TEXT normal.
LONGBLOB: BLOB longo.
LONGTEXT: TEXT longo.
http://www.alvarofpinheiro.eti.br
CREATE TABLE nome_tabela [(definição_create,...)] [table_options] [select_statement]
definição_create:
nome_coluna tipo [NOT NULL | NULL] [DEFAULT valor_padrão]
[[PRIMARY] KEY]
| [CONSTRAINT [symbol]] PRIMARY KEY (index_col_name,...)
| INDEX [nome_indice] (index_nome_coluna,...)
| [CONSTRAINT [symbol]] UNIQUE [INDEX] [index_name] (index_col_name,...)
| [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,...)
definição_referência:
REFERENCES nome_tabela [(index_nome_coluna,...)]
[ON DELETE opção_referência]
[ON UPDATE opção_referência]
opção_referência:
RESTRICT | CASCADE | SET NULL | SET DEFAULT
Criar Tabelas
http://www.alvarofpinheiro.eti.br
●Dica:
o É possível criar uma tabela a partir de uma subconsulta.
● CREATE TABLE tabela [coluna, ...] AS subconsulta;
Criar Tabelas
http://www.alvarofpinheiro.eti.br
●Tmp:
o Número (PK).
●Cargo:
o Número (PK), número inteiro, auto-incremento;
o Nome, literal variável(30), não nulo.
●Departamento:
o Número (PK), número inteiro;
o Nome, literal variável(30), não nulo;
o Fator, número real.
●Empregado:
o Número (PK), numérico;
o Nome, literal variável (50), não nulo;
o Departamento, (FK) numérico,
 atualização cascata, exclusão restrita.
Criar Tabelas
http://www.alvarofpinheiro.eti.br
--SQLServer
CREATE TABLE CARGO (
NUMERO INTEGER IDENTITY( 1, 1),
NOME VARCHAR(30) NOT NULL,
PRIMARY KEY (NUMERO)
);
--Postgre|Oracle
CREATE TABLE CARGO (
NUMERO INTEGER,
NOME VARCHAR(30) NOT NULL,
PRIMARY KEY (NUMERO)
);
CREATE SEQUENCE CARGOSEQ INCREMENT BY 1 START WITH 1;
Criar Tabelas (Autonumeração)
http://www.alvarofpinheiro.eti.br
--MySQL
CREATE TABLE CARGO (
NUMERO INTEGER AUTO_INCREMENT,
NOME VARCHAR(30) NOT NULL,
PRIMARY KEY (NUMERO)
);
--Firebird
CREATE TABLE CARGO (
NUMERO INTEGER,
NOME VARCHAR(30) NOT NULL,
PRIMARY KEY (NUMERO)
);
CREATE GENERATOR CARGOGEN;
CREATE TRIGGER CARGOTRI FOR CARGO
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
NEW.NUMERO = GEN_ID(CARGOGEN, 1);
END;
Criar Tabelas (Autonumeração)
http://www.alvarofpinheiro.eti.br
CREATE TABLE TMP (
NUMERO INTEGER PRIMARY KEY
);
CREATE TABLE DEPARTAMENTO (
NUMERO INTEGER,
NOME VARCHAR(30) NOT NULL,
FATOR DECIMAL(3,2),
PRIMARY KEY (NUMERO)
);
Criar Tabelas
http://www.alvarofpinheiro.eti.br
--SQLServer | Postgre | MySQL | Firebird
CREATE TABLE EMPREGADO (
NUMERO INTEGER,
NOME VARCHAR(50) NOT NULL,
DEPARTAMENTO INTEGER,
PRIMARY KEY (NUMERO),
FOREIGN KEY (DEPARTAMENTO) REFERENCES DEPARTAMENTO (NUMERO) ON UPDATE
CASCADE
);
--Oracle
CREATE TABLE EMPREGADO (
NUMERO INTEGER,
NOME VARCHAR(50) NOT NULL,
DEPARTAMENTO INTEGER,
PRIMARY KEY (NUMERO),
FOREIGN KEY (DEPARTAMENTO) REFERENCES DEPARTAMENTO (NUMERO)
);
Criar Tabelas
http://www.alvarofpinheiro.eti.br
INSERT [INTO] nome_tabela [(nome_coluna,...)]
VALUES ((expressão | DEFAULT),...),(...),...
| [INTO] nome_tabela [(nome_coluna,...)]
SELECT ...
Inserir Linhas
http://www.alvarofpinheiro.eti.br
●Dicas:
o Pode-se inserir linha a linha;
o Pode-se dependendo do BD inserir uma lista;
o Pode-se inserir linhas de uma tabela em
outra;
 Não se usa a cláusula VALUE e sim SELECT.
Inserir Linhas
http://www.alvarofpinheiro.eti.br
●Cargo:
o Número, Nome;
o 1, Analista Trainee;
o 2, Analista Junior;
o 3, Analista Pleno;
o 4, Analista Sênior;
o 5, Analista Master.
Inserir Registros
http://www.alvarofpinheiro.eti.br
--SQLServer | MySql | Firebird
INSERT INTO CARGO (NOME) VALUES ('ANALISTA TRAINEE');
INSERT INTO CARGO (NOME) VALUES ('ANALISTA JUNIOR');
INSERT INTO CARGO (NOME) VALUES ('ANALISTA PLENO');
INSERT INTO CARGO (NOME) VALUES ('ANALISTA SÊNIOR');
INSERT INTO CARGO (NOME) VALUES ('ANALISTA MASTER');
INSERT INTO CARGO (NOME) VALUES ('CONSULTOR');
--Postgre
INSERT INTO CARGO (NUMERO, NOME) VALUES (nextval('CARGOSEQ'), 'ANALISTA TRAINEE');
INSERT INTO CARGO (NUMERO, NOME) VALUES (nextval('CARGOSEQ'), 'ANALISTA JUNIOR');
INSERT INTO CARGO (NUMERO, NOME) VALUES (nextval('CARGOSEQ'), 'ANALISTA PLENO');
INSERT INTO CARGO (NUMERO, NOME) VALUES (nextval('CARGOSEQ'), 'ANALISTA SÊNIOR');
INSERT INTO CARGO (NUMERO, NOME) VALUES (nextval('CARGOSEQ'), 'ANALISTA MASTER');
INSERT INTO CARGO (NUMERO, NOME) VALUES (nextval('CARGOSEQ'), 'CONSULTOR');
--Oracle
INSERT INTO CARGO (NUMERO, NOME) VALUES (CARGOSEQ.NextVal, 'ANALISTA TRAINEE');
INSERT INTO CARGO (NUMERO, NOME) VALUES (CARGOSEQ.NextVal, 'ANALISTA JUNIOR');
INSERT INTO CARGO (NUMERO, NOME) VALUES (CARGOSEQ.NextVal, 'ANALISTA PLENO');
INSERT INTO CARGO (NUMERO, NOME) VALUES (CARGOSEQ.NextVal, 'ANALISTA SÊNIOR');
INSERT INTO CARGO (NUMERO, NOME) VALUES (CARGOSEQ.NextVal, 'ANALISTA MASTER');
INSERT INTO CARGO (NUMERO, NOME) VALUES (CARGOSEQ.NextVal, 'CONSULTOR');
Inserir Linhas
http://www.alvarofpinheiro.eti.br
●Departamento:
o Número, Nome, Fator;
o 10, Administração (Admin), 1.75;
o 20, Marketing (Mkt), 1.85;
o 50, Compras (Com), 2. 73;
o 60, Tecnologia (Tec), 1.55;
o 80, Vendas (Ven), 1.87;
o 90, Executivo (Exec), 1.92;
o 110, Contabilidade (Contab), 2.35;
o 190, Contratos (Ctt), 2.23.
Inserir Linhas
http://www.alvarofpinheiro.eti.br
INSERT INTO DEPARTAMENTO (NUMERO, NOME, FATOR) VALUES (10, 'ADMINISTRAÇÃO (ADMIN)', 1.75);
INSERT INTO DEPARTAMENTO (NUMERO, NOME, FATOR) VALUES (20, 'MARKETING (MKT)', 1.85);
INSERT INTO DEPARTAMENTO (NUMERO, NOME, FATOR) VALUES (50, 'COMPRAS (COM)', 2.73);
INSERT INTO DEPARTAMENTO (NUMERO, NOME, FATOR) VALUES (60, 'TECNOLOGIA (TEC)', 1.55);
INSERT INTO DEPARTAMENTO (NUMERO, NOME, FATOR) VALUES (80, 'VENDAS (VEN)', 1.87);
INSERT INTO DEPARTAMENTO (NUMERO, NOME, FATOR) VALUES (90, 'EXECUTIVO (EXEC)', 1.92);
INSERT INTO DEPARTAMENTO (NUMERO, NOME, FATOR) VALUES (110, 'CONTABILIDADE (CONTAB)', 2.35);
INSERT INTO DEPARTAMENTO (NUMERO, NOME, FATOR) VALUES (190, 'CONTRATOS (CTT)', 2.23);
Inserir Linhas
http://www.alvarofpinheiro.eti.br
●Empregados:
o Número, Nome, Departamento;
o 100, Antônio Palmeira, 10;
o 101, José Figueira, 20;
o 102, Maria Mangueira, 10;
o 103, João Abacateiro, 50;
o 104, Carlos Castanheiro, 60;
o 107, Mônica Videira, 90;
o 124, Pedro Laranjeira, 80;
o 141, Tiago Pessegueiro, 110;
o 142, Renata Videira, 80;
o 143, Gabriel Macieira, 110;
Inserir Linhas
http://www.alvarofpinheiro.eti.br
INSERT INTO EMPREGADO VALUES (100, 'ANTÔNIO PALMEIRA', 10);
INSERT INTO EMPREGADO VALUES (101, 'JOSÉ FIGUEIRA', 20);
INSERT INTO EMPREGADO VALUES (102, 'MARIA MANGUEIRA', 10);
INSERT INTO EMPREGADO VALUES (103, 'JOÃO ABACATEIRO', 50);
INSERT INTO EMPREGADO VALUES (104, 'CARLOS CASTANHEIRO', 60);
INSERT INTO EMPREGADO VALUES (107, 'MÔNICA VIDEIRA', 90);
INSERT INTO EMPREGADO VALUES (124, 'PEDRO LARANJEIRA', 80);
INSERT INTO EMPREGADO VALUES (141, 'TIAGO PESSEGUEIRO', 110);
INSERT INTO EMPREGADO VALUES (142, 'RENATA VIDEIRA', 80);
INSERT INTO EMPREGADO VALUES (143, 'GABRIEL MACIEIRA', 110);
Inserir Linhas
http://www.alvarofpinheiro.eti.br
ALTER TABLE nome_tbl especificação_alter [, especificação_alter ...]
especificação_alter:
ADD [COLUMN] definição_create [FIRST | AFTER nome_coluna ]
| ADD [COLUMN] (definição_create, definição_create,...)
| ADD INDEX [nome_indice] (index_nome_col,...)
| ADD [CONSTRAINT [symbol]] PRIMARY KEY (index_col_name,...)
| ADD [CONSTRAINT [symbol]] UNIQUE [index_name] (index_col_name,...)
| ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,...)
[definição_referncia]
| ALTER [COLUMN] nome_col {SET DEFAULT literal | DROP DEFAULT}
| CHANGE [COLUMN] nome_col_antigo definição_create
[FIRST | AFTER nome_coluna]
| MODIFY [COLUMN] definição_create [FIRST | AFTER nome_coluna]
| DROP [COLUMN] nome_col
| DROP PRIMARY KEY
| DROP INDEX nome_indice
| RENAME [TO] nome_nova_tbl
| ORDER BY col
Alterar Tabelas
http://www.alvarofpinheiro.eti.br
●Empregados:
Número (PK), número inteiro;
Nome, literal variável (50), não nulo; excluir;
Primeironome, literal variável (25), não nulo;
Sobrenome, literal variável (25) não nulo;
Departamento, (FK) número inteiro;
Cargo, (FK) número inteiro, atualização cascata;
Salário, número real;
Comissão, número inteiro;
Nascimento, data;
Apelido, literal fixo(10), não nulo;
Gerente, número inteiro.
Alterar Tabelas
http://www.alvarofpinheiro.eti.br
--SQLServer
ALTER TABLE EMPREGADO
ADD PRIMEIRONOME VARCHAR(25),
SOBRENOME VARCHAR(25),
CARGO INTEGER,
SALARIO REAL,
COMISSAO INTEGER,
NASCIMENTO DATE,
APELIDO VARCHAR(10),
GERENTE INTEGER;
--Postgre | MySQL | Firebird
ALTER TABLE EMPREGADO
ADD PRIMEIRONOME VARCHAR(25),
ADD SOBRENOME VARCHAR(25),
ADD CARGO INTEGER,
ADD SALARIO REAL,
ADD COMISSAO INTEGER,
ADD NASCIMENTO DATE,
ADD APELIDO VARCHAR(10),
ADD GERENTE INTEGER;
Alterar Tabelas
http://www.alvarofpinheiro.eti.br
--Oracle
ALTER TABLE EMPREGADO
ADD (PRIMEIRONOME VARCHAR(25),
SOBRENOME VARCHAR(25),
CARGO INTEGER,
SALARIO REAL,
COMISSAO INTEGER,
NASCIMENTO DATE,
APELIDO VARCHAR(10),
GERENTE INTEGER);
Alterar Tabelas
http://www.alvarofpinheiro.eti.br
--SQLServer
ALTER TABLE EMPREGADO
ADD FOREIGN KEY (CARGO) REFERENCES CARGO (NUMERO) ON UPDATE CASCADE,
FOREIGN KEY (GERENTE) REFERENCES EMPREGADO (NUMERO);
--Postgre | MySQL | Firebird
ALTER TABLE EMPREGADO
ADD FOREIGN KEY (CARGO) REFERENCES CARGO (NUMERO) ON UPDATE CASCADE,
ADD FOREIGN KEY (GERENTE) REFERENCES EMPREGADO (NUMERO);
--Oracle
ALTER TABLE EMPREGADO
ADD FOREIGN KEY (CARGO) REFERENCES CARGO;
ALTER TABLE EMPREGADO
ADD FOREIGN KEY (GERENTE) REFERENCES EMPREGADO;
Alterar Tabelas
http://www.alvarofpinheiro.eti.br
UPDATE nome_tabela
SET nome_coluna1=expr1 [,
nome_coluna2=expr2 ...]
[WHERE definição]
[ORDER BY ...]
Alterar Linhas
http://www.alvarofpinheiro.eti.br
●Pode-se alterar linha;
●Pode-se alterar listas;
●Pode-se alterar subconsultas;
●Pode-se alterar linhas com base em outra
tabela.
Alterar Linhas
http://www.alvarofpinheiro.eti.br
●SQLServer | Postgre | MySQL | Firebird
● SUBSTRING(string texto, posicao_inicial, tamanho)
- retorna uma string com o comprimento definido em
"tamanho" extraida da string "texto", a partir da
"posicao_inicial“;
● Oracle: SUBSTR
●SQLServer
● CHARINDEX( string pesquisado, campo,
posicao_inicial) – retorna a posição do string
pesquisado dentro do campo informado.
● Postgre: STRPOS
● Oracle | MySQL: INSTR
● Firebird: POSITION
Funções
http://www.alvarofpinheiro.eti.br
●Fazendo uso das funções substring e charindex separar
o conteúdo do campo Nome nos campos Primeironome
e Sobrenome. Depois apagar o campo Nome ficando:
o Número, Primeironome, Sobrenome, Departamento;
o 100, Antônio, Palmeira, 10;
o 101, José, Figueira, 20;
o 102, Maria, Mangueira, 10;
o 103, João, Abacateiro, 50;
o 104, Carlos, Castanheiro, 60;
o 107, Mônica, Videira, 90;
o 124, Pedro, Laranjeira, 80;
o 141, Tiago, Pessegueiro, 80;
o 142, Renata, Videira, 80;
o 143, Gabriel, Macieira, 110;
Alterar Linhas
http://www.alvarofpinheiro.eti.br
--SQLServer
UPDATE EMPREGADO SET
PRIMEIRONOME = SUBSTRING(NOME,1,CHARINDEX(' ',NOME)-1),
SOBRENOME = SUBSTRING(NOME,CHARINDEX(' ',nome)+1,100);
--Postgre
UPDATE EMPREGADO SET
PRIMEIRONOME = SUBSTRING(NOME,1,STRPOS(NOME, ' ')-1),
SOBRENOME = SUBSTRING(NOME,STRPOS(NOME, ' ')+1,100);
--Oracle
UPDATE EMPREGADO SET
PRIMEIRONOME = SUBSTR(NOME,1,INSTR(NOME, ' ')-1),
SOBRENOME = SUBSTR(NOME,INSTR(NOME, ' ')+1,100);
--MySQL
UPDATE EMPREGADO SET
PRIMEIRONOME = SUBSTRING(NOME,1,INSTR(NOME, ' ')-1),
SOBRENOME = SUBSTRING(NOME,INSTR(NOME, ' ')+1,100);
--Firebird
UPDATE EMPREGADO SET
PRIMEIRONOME = SUBSTRING(NOME FROM 1 FOR POSITION(' ', NOME)-1),
SOBRENOME = SUBSTRING(NOME FROM POSITION(' ', NOME)+1 FOR 100);
Alterar Linhas
http://www.alvarofpinheiro.eti.br
--SQLServer | Postgre | Oracle | MySQL
ALTER TABLE EMPREGADO
DROP COLUMN NOME;
--Firebird
ALTER TABLE EMPREGADO
DROP NOME;
Alterar Tabela
http://www.alvarofpinheiro.eti.br
●Atualizar as linhas de Empregado com os valores:
o Número, Primeironome, Sobrenome, Cargo, Departamento,
Gerente, Salário, Comissão, Nascimento, Apelido;
o 100, Antônio, Palmeira, 1, 10, nulo, 1000, nulo, 01/07/80, Tonho;
o 101, José, Figueira, 1, 20, 100, 1500, nulo, 18/05/70, Zé;
o 102, Maria, Mangueira, 2, 10, 100, 2000, 3, 22/07/80, Ma;
o 103, João, Abacateiro, 3, 50, 100, 1500, 2, 03/03/71, Jo;
o 104, Carlos, Castanheiro, nulo, 60, 100, 2500, 3, 01/01/65, Ca;
o 107, Mônica, Videira, 1, 90, nulo, 1000, 2, 15/02/60, Mo;
o 124, Pedro, Laranjeira, 2, 80, 107, 1100, nulo, 30/07/83,
Pedroca;
o 141, Tiago, Pessegueiro, 3, 80, 107, 2000, 2, 21/06/78, Ti;
o 142, Renata, Videira, 4, 80, 107, 1500, nulo, 02/12/72, Rê;
o 143, Gabriel, Macieira, nulo, 110, 107, 2000, 2, 11/11/81, Biel;
Alterar Linhas
http://www.alvarofpinheiro.eti.br
--SQLServer | Postgre | Oracle
UPDATE EMPREGADO SET
CARGO=1, GERENTE=NULL, SALARIO=1000, COMISSAO=NULL,
NASCIMENTO='01/07/80', APELIDO='TONHO' WHERE NUMERO=100;
UPDATE EMPREGADO SET
CARGO=1, GERENTE=100, SALARIO=1500, COMISSAO=NULL,
NASCIMENTO='18/05/70', APELIDO='ZÉ' WHERE NUMERO=101;
UPDATE EMPREGADO SET
CARGO=2, GERENTE=100, SALARIO=2000, COMISSAO=3,
NASCIMENTO='22/07/80', APELIDO='MA' WHERE NUMERO=102;
UPDATE EMPREGADO SET
CARGO=3, GERENTE=100, SALARIO=1500, COMISSAO=2,
NASCIMENTO='03/03/71', APELIDO='JO' WHERE NUMERO=103;
UPDATE EMPREGADO SET
CARGO=NULL, GERENTE=100, SALARIO=2500, COMISSAO=3,
NASCIMENTO='01/01/65', APELIDO='CA' WHERE NUMERO=104;
UPDATE EMPREGADO SET
CARGO=1, GERENTE=NULL, SALARIO=1000, COMISSAO=2,
NASCIMENTO='15/02/60', APELIDO='MO' WHERE NUMERO=107;
UPDATE EMPREGADO SET
CARGO=2, GERENTE=107, SALARIO=1100, COMISSAO=NULL,
NASCIMENTO='30/07/83', APELIDO='PEDROCA' WHERE NUMERO=124;
UPDATE EMPREGADO SET
CARGO=3, GERENTE=107, SALARIO=2000, COMISSAO=2,
NASCIMENTO='21/06/78', APELIDO='TI' WHERE NUMERO=141;
UPDATE EMPREGADO SET
CARGO=4, GERENTE=107, SALARIO=1500, COMISSAO=NULL,
NASCIMENTO='02/12/72', APELIDO='RE' WHERE NUMERO=142;
UPDATE EMPREGADO SET
CARGO=NULL, GERENTE=107, SALARIO=2000, COMISSAO=2,
NASCIMENTO='11/11/81', APELIDO='BIEL' WHERE NUMERO=143;
Alterar Linhas
OBS: Data no formato ANSI AAAA/MM/DD
http://www.alvarofpinheiro.eti.br
--MySQL
UPDATE EMPREGADO SET
CARGO=1, GERENTE=NULL, SALARIO=1000, COMISSAO=NULL,
NASCIMENTO='80/07/01', APELIDO='TONHO' WHERE NUMERO=100;
UPDATE EMPREGADO SET
CARGO=1, GERENTE=100, SALARIO=1500, COMISSAO=NULL,
NASCIMENTO='70/05/18', APELIDO='ZÉ' WHERE NUMERO=101;
UPDATE EMPREGADO SET
CARGO=2, GERENTE=100, SALARIO=2000, COMISSAO=3,
NASCIMENTO='80/07/22', APELIDO='MA' WHERE NUMERO=102;
UPDATE EMPREGADO SET
CARGO=3, GERENTE=100, SALARIO=1500, COMISSAO=2,
NASCIMENTO='71/03/03', APELIDO='JO' WHERE NUMERO=103;
UPDATE EMPREGADO SET
CARGO=NULL, GERENTE=100, SALARIO=2500, COMISSAO=3,
NASCIMENTO='65/01/01', APELIDO='CA' WHERE NUMERO=104;
UPDATE EMPREGADO SET
CARGO=1, GERENTE=NULL, SALARIO=1000, COMISSAO=2,
NASCIMENTO='60/02/15', APELIDO='MO' WHERE NUMERO=107;
UPDATE EMPREGADO SET
CARGO=2, GERENTE=107, SALARIO=1100, COMISSAO=NULL,
NASCIMENTO='83/07/30', APELIDO='PEDROCA' WHERE NUMERO=124;
UPDATE EMPREGADO SET
CARGO=3, GERENTE=107, SALARIO=2000, COMISSAO=2,
NASCIMENTO='78/06/21', APELIDO='TI' WHERE NUMERO=141;
UPDATE EMPREGADO SET
CARGO=4, GERENTE=107, SALARIO=1500, COMISSAO=NULL,
NASCIMENTO='72/12/02', APELIDO='RE' WHERE NUMERO=142;
UPDATE EMPREGADO SET
CARGO=NULL, GERENTE=107, SALARIO=2000, COMISSAO=2,
NASCIMENTO='81/11/11', APELIDO='BIEL' WHERE NUMERO=143;
Alterar Linhas
http://www.alvarofpinheiro.eti.br
--Firebird
UPDATE EMPREGADO SET
CARGO=1, GERENTE=NULL, SALARIO=1000, COMISSAO=NULL,
NASCIMENTO='07/01/80', APELIDO='TONHO' WHERE NUMERO=100;
UPDATE EMPREGADO SET
CARGO=1, GERENTE=100, SALARIO=1500, COMISSAO=NULL,
NASCIMENTO='05/18/70', APELIDO='ZÉ' WHERE NUMERO=101;
UPDATE EMPREGADO SET
CARGO=2, GERENTE=100, SALARIO=2000, COMISSAO=3,
NASCIMENTO='07/22/80', APELIDO='MA' WHERE NUMERO=102;
UPDATE EMPREGADO SET
CARGO=3, GERENTE=100, SALARIO=1500, COMISSAO=2,
NASCIMENTO='03/03/71', APELIDO='JO' WHERE NUMERO=103;
UPDATE EMPREGADO SET
CARGO=NULL, GERENTE=100, SALARIO=2500, COMISSAO=3,
NASCIMENTO='01/01/65', APELIDO='CA' WHERE NUMERO=104;
UPDATE EMPREGADO SET
CARGO=1, GERENTE=NULL, SALARIO=1000, COMISSAO=2,
NASCIMENTO='02/15/60', APELIDO='MO' WHERE NUMERO=107;
UPDATE EMPREGADO SET
CARGO=2, GERENTE=107, SALARIO=1100, COMISSAO=NULL,
NASCIMENTO='07/30/83', APELIDO='PEDROCA' WHERE NUMERO=124;
UPDATE EMPREGADO SET
CARGO=3, GERENTE=107, SALARIO=2000, COMISSAO=2,
NASCIMENTO='06/21/78', APELIDO='TI' WHERE NUMERO=141;
UPDATE EMPREGADO SET
CARGO=4, GERENTE=107, SALARIO=1500, COMISSAO=NULL,
NASCIMENTO='12/02/72', APELIDO='RE' WHERE NUMERO=142;
UPDATE EMPREGADO SET
CARGO=NULL, GERENTE=107, SALARIO=2000, COMISSAO=2,
NASCIMENTO='11/11/81', APELIDO='BIEL' WHERE NUMERO=143;
Alterar Linhas
http://www.alvarofpinheiro.eti.br
CREATE [UNIQUE] INDEX nome_indice
ON nome_tabela (index_col_name,...)
index_col_name:
col_name [(length)] [ASC | DESC]
Criar Índices
http://www.alvarofpinheiro.eti.br
●Criar índices por:
o Primeironome e Sobrenome;
o Salário;
o Comissão;
o Cargo;
o Departamento;
o Apelido (Único).
Criar Índices
http://www.alvarofpinheiro.eti.br
CREATE INDEX EMPREGADOIX1 ON EMPREGADO (PRIMEIRONOME);
CREATE INDEX EMPREGADOIX2 ON EMPREGADO (SOBRENOME);
CREATE INDEX EMPREGADOIX3 ON EMPREGADO (SALARIO);
CREATE INDEX EMPREGADOIX4 ON EMPREGADO (COMISSAO);
CREATE INDEX EMPREGADOIX5 ON EMPREGADO (CARGO);
CREATE INDEX EMPREGADOIX6 ON EMPREGADO (DEPARTAMENTO);
CREATE UNIQUE INDEX EMPREGADOIX7 ON EMPREGADO (APELIDO);
Criar Índices
http://www.alvarofpinheiro.eti.br
●Prática: Visualizar a estrutura das tabelas
Empregados e Departamentos.
Dicionário de Dados
http://www.alvarofpinheiro.eti.br
--SQLServer
SELECT FROM SYSOBJECTS O INNER JOIN SYSCOLUMNS C ON O.ID=C.ID WHERE O.NAME =
'DEPARTAMENTO';
--Postgre
SELECT
a.attnum,
a.attname AS field,
t.typname AS type,
a.attlen AS length,
a.atttypmod AS lengthvar,
a.attnotnull AS notnull,
c.relname AS name
FROM
pg_class c,
pg_attribute a,
pg_type t
WHERE
c.relname = 'departamento' and
a.attnum > 0
and a.attrelid = c.oid
and a.atttypid = t.oid
ORDER BY c.relname
--Oracle | MySQL
DESCRIBE DEPARTAMENTO;
Dicionário de Dados
http://www.alvarofpinheiro.eti.br
SELECT
[ ALL | DISTINCT ]
[ TOP n ]
[ table_name. | table_alias. | view_name. ]
| column_name [ [ AS ] column_alias ]
| expression [ [ AS ] column_alias ]
[ ..., n ]
[ INTO new_table ]
FROM table
[ AS table_alias ]
[ ( column_alias_1, [ column_alias_2, ..., n ] ) ]
|
view_name [ AS table_alias ]
[ INNER JOIN | LEFT [ OUTER ] JOIN | RIGHT [ OUTER ] JOIN table [ ON search_conditions ]
|
[ WHERE search_conditions
|
WHERE column_name = column_name
]
[ GROUP BY { group_by_expression, [ ..., n ] } ]
[ HAVING search_conditions ]
[ UNION query ]
[ ORDER BY { order_by_expression [ ASC | DESC ] , [ ..., n ] } ]
Consulta
http://www.alvarofpinheiro.eti.br
●Prática: Visualizar os campos: Número e
Nome (Primeironome || ‘ ‘ || Sobrenome).
●Dicas:
o Operador de concatenação (||);
o Em alguns BD se usa (+) para concatenação;
o Concatena colunas ou strings de caracteres a
outras colunas.
Projeção
http://www.alvarofpinheiro.eti.br
--SQLServer
SELECT NUMERO, PRIMEIRONOME + ' ' + SOBRENOME AS NOME FROM
EMPREGADO;
--Postgre | Oracle | Firebird
SELECT NUMERO, PRIMEIRONOME || ' ' || SOBRENOME AS NOME FROM
EMPREGADO;
--MySQL
SELECT NUMERO, CONCAT(PRIMEIRONOME, ' ', SOBRENOME) AS NOME FROM
EMPREGADO;
Projeção
http://www.alvarofpinheiro.eti.br
●Prática: Visualizar os registros dos
empregados do departamento 20 ou 80 dos
campos: Número; Primeironome; Sobrenome; e
Departamento.
Seleção
http://www.alvarofpinheiro.eti.br
SELECT NUMERO, PRIMEIRONOME, SOBRENOME, DEPARTAMENTO
FROM EMPREGADO
WHERE DEPARTAMENTO = 20 OR DEPARTAMENTO = 80;
Seleção
http://www.alvarofpinheiro.eti.br
●Prática: Visualizar os registros dos
empregados juntamente com o nome do
departamento: Número (Empregados);
Primeironome (Empregados); Sobrenome
(Empregados); Departamento (Empregados); e
Nome (Departamentos).
Junção
http://www.alvarofpinheiro.eti.br
SELECT E.NUMERO, E.PRIMEIRONOME, E.SOBRENOME, E.DEPARTAMENTO,
D.NOME
FROM EMPREGADO E INNER JOIN DEPARTAMENTO D
ON E.DEPARTAMENTO = D.NUMERO;
Junção
http://www.alvarofpinheiro.eti.br
●Prática: Visualizar todos os registros e todos os
campos da tabela departamentos.
●Dicas:
o As instruções SQL não fazem distinção entre maiúsculas e minúsculas;
o As instruções SQL podem estar em uma ou mais linhas;
o As palavras-chave não podem ser abreviadas ou quebradas;
o Normalmente as cláusulas são colocadas em linhas separadas;
o Os recuos são utilizados para dar mais legibilidade.
Consulta Básica
http://www.alvarofpinheiro.eti.br
SELECT FROM DEPARTAMENTO;
Consulta Básica
http://www.alvarofpinheiro.eti.br
●Prática: Visualizar todos os registros nos
campos Número, Nome (Primeironome + ‘ ‘
+ Sobrenome) e após a consulta ser
realizada observar o nome do campo para a
expressão Nome. Finalize repetindo a
consulta colocando o apelido Nome do
Funcionário.
Apelido
http://www.alvarofpinheiro.eti.br
--SQLServer
SELECT NUMERO, PRIMEIRONOME + ' ' + SOBRENOME FROM EMPREGADO;
SELECT NUMERO, PRIMEIRONOME + ' ' + SOBRENOME AS NOME FROM
EMPREGADO;
--Postgre | Oracle | Firebird
SELECT NUMERO, PRIMEIRONOME || ' ' || SOBRENOME FROM EMPREGADO;
SELECT NUMERO, PRIMEIRONOME || ' ' || SOBRENOME AS NOME FROM
EMPREGADO;
--MySQL
SELECT NUMERO, CONCAT(PRIMEIRONOME, ' ', SOBRENOME) FROM
EMPREGADO;
SELECT NUMERO, CONCAT(PRIMEIRONOME, ' ', SOBRENOME) AS NOME FROM
EMPREGADO;
Apelido
http://www.alvarofpinheiro.eti.br
●Prática: Visualizar o Sobrenome, o salário, e o líquido
dos empregados, considerando que todos possuem um
desconto de 10% de INSS.
●Dicas:
o Operadores aritméticos:
 Adicionar:+
 Subtrair: -
 Multiplicar:
 Dividir: / “retorna o quociente”
o Funções matemáticas:
 Potenciação: POWER(número, potência)
 Radiciação: SQRT(número)
 Divisão: % | MOD “retorna o resto”
Campos Calculados
http://www.alvarofpinheiro.eti.br
●Dicas:
o Precedência de Operadores:
 A multiplicação e a divisão têm prioridade sobre a adição e
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.
Campos Calculados
http://www.alvarofpinheiro.eti.br
SELECT SOBRENOME, SALARIO, SALARIO - (SALARIO0.10) AS LIQUIDO
FROM EMPREGADO;
http://www.alvarofpinheiro.eti.br
Campos Calculados
●Prática: Visualizar o Sobrenome e o Salário
Bruto (Salário + Comissão). Obs: A Comissão
representa um percentual aplicado sobre o
salário.
●Dicas:
o Nulo é uma valor que não está disponível;
o Nulo é um valor desconhecido;
o Nulo não é a mesma coisa que zero;
o Nulo não é a mesma coisa que espaço em
branco.
Valores Nulos
http://www.alvarofpinheiro.eti.br
SELECT SOBRENOME, SALARIO + (SALARIO COMISSAO / 100) AS BRUTO
FROM EMPREGADO;
Valores Nulos
http://www.alvarofpinheiro.eti.br
●Prática: Visualizar o Sobrenome e o Salário
Bruto (Salário + Comissão). Obs: Quando a
Comissão for nula deve-se substituir por zero.
●Dicas:
o Para Oracle usar NVL(campo, valor)
o Para MySQL usar IFNULL(campo, valor)
o Para SQLServer usar ISNULL(campo, valor)
o Para Postgre | Firebird usar COALESCE(campo,0)
Valores Nulos
http://www.alvarofpinheiro.eti.br
--SQLServer
SELECT SOBRENOME, SALARIO + (SALARIO ISNULL(COMISSAO,0) / 100) AS
BRUTO FROM EMPREGADO;
--Postgre | Firebird
SELECT SOBRENOME, SALARIO + (SALARIO COALESCE(COMISSAO,0) / 100)
AS BRUTO FROM EMPREGADO;
--Oracle
SELECT SOBRENOME, SALARIO + (SALARIO NVL(COMISSAO,0) / 100) AS
BRUTO FROM EMPREGADO;
--MySQL
SELECT SOBRENOME, SALARIO + (SALARIO IFNULL(COMISSAO,0) / 100) AS
BRUTO FROM EMPREGADO;
Valores Nulos
http://www.alvarofpinheiro.eti.br
●Prática: Visualizar o Sobrenome dos
Empregados.
●Dica:
o A exibição default das consultas é de todas
as linhas, incluindo linhas duplicadas.
●Prática: Visualizar o Sobrenome dos
Empregados sem duplicidade.
Duplicidade
http://www.alvarofpinheiro.eti.br
SELECT SOBRENOME FROM EMPREGADO;
SELECT DISTINCT SOBRENOME FROM EMPREGADO;
Duplicidade
http://www.alvarofpinheiro.eti.br
●Prática: Visualizar o Número e Sobrenome de todos
os empregados do departamento 90.
●Dicas:
o Seleções são realizadas pela cláusula WHERE;
o Operadores de Comparação:
 Igual a: =
 Maior que: >
 Maior que ou igual a: >=
 Menor que: <
 Menor que ou igual a: <=
 Diferente de: <>
Condicionamento
http://www.alvarofpinheiro.eti.br
SELECT NUMERO, SOBRENOME
FROM EMPREGADO
WHERE DEPARTAMENTO = 90;
Condicionamento
http://www.alvarofpinheiro.eti.br
●Prática: Visualizar o Número, Sobrenome e
Nascimento de todos os empregados que
nasceram em 22/07/80.
●Dicas:
o As strings de caracteres e valores de data
aparecem entre aspas simples;
o Os valores de caractere fazem distinção entre
maiúsculas e minúsculas;
o Os valores de data fazem distinção entre
formatos;
o O formato de data default é DD-MON-YY.
Condicionamento
http://www.alvarofpinheiro.eti.br
--SQLServer | postgre | Oracle
SELECT NUMERO, SOBRENOME, NASCIMENTO FROM EMPREGADO WHERE
NASCIMENTO = '22/07/80';
--MySQL
SELECT NUMERO, SOBRENOME, NASCIMENTO FROM EMPREGADO WHERE
NASCIMENTO = '80/07/22';
--Firebird
SELECT NUMERO, SOBRENOME, NASCIMENTO FROM EMPREGADO WHERE
NASCIMENTO = '07/22/80';
Condicionamento
http://www.alvarofpinheiro.eti.br
●Prática: Visualizar o Número, Sobrenome e
Nascimento de todos os empregados que
nasceram entre (inclusive) 01/01/70 e
31/12/80.
●Dicas:
o Outros Operadores de Comparação:
 Intervalo fechado: BETWEEN
 Está contido: IN
 Contém: LIKE
 Para representar qualquer caractere: %
 Para representar caractere da posição: _
 É nulo: IS NULL
Condicionamento
http://www.alvarofpinheiro.eti.br
--SQLServer | postgre | Oracle
SELECT NUMERO, SOBRENOME, NASCIMENTO FROM EMPREGADO WHERE
NASCIMENTO
BETWEEN '01/01/70' AND '31/12/80';
--MySQL
SELECT NUMERO, SOBRENOME, NASCIMENTO FROM EMPREGADO WHERE
NASCIMENTO
BETWEEN '70/01/01' AND '80/12/31';
--Firebird
SELECT NUMERO, SOBRENOME, NASCIMENTO FROM EMPREGADO WHERE
NASCIMENTO
BETWEEN '01/01/70' AND '12/31/80';
Condicionamento
http://www.alvarofpinheiro.eti.br
●Prática: Visualizar o Número, Sobrenome e
Departamento de todos os empregados que
pertencem aos departamentos: 10, 20, 50, 60, 80 ou
90.
●Dicas:
o Outros Operadores de Comparação:
 Intervalo fechado: BETWEEN
 Pertence: IN
 Contém: LIKE
 Para representar qualquer caractere: %
 Para representar caractere da posição: _
 É nulo: IS NULL
Condicionamento
http://www.alvarofpinheiro.eti.br
SELECT NUMERO, SOBRENOME, DEPARTAMENTO
FROM EMPREGADO
WHERE DEPARTAMENTO IN (10, 20, 50, 60, 80, 90);
Condicionamento
http://www.alvarofpinheiro.eti.br
●Prática: Visualizar o Número e Sobrenome de
todos os empregados que possuem ‘eira’ no
sobrenome.
●Dicas:
o Outros Operadores de Comparação:
 Intervalo fechado: BETWEEN
 Pertence: IN
 Contém: LIKE
 Para representar qualquer caractere: %
 Para representar caractere da posição: _
 É nulo: IS NULL
Condicionamento
http://www.alvarofpinheiro.eti.br
SELECT NUMERO, SOBRENOME
FROM EMPREGADO
WHERE SOBRENOME LIKE ‘%EIRA%’;
Condicionamento
http://www.alvarofpinheiro.eti.br
●Prática: Visualizar o Número e Sobrenome de
todos os empregados que não possuem
comissão.
●Dicas:
o Outros Operadores de Comparação:
 Intervalo fechado: BETWEEN
 Pertence: IN
 Contém: LIKE
 Para representar qualquer caractere: %
 Para representar caractere da posição: _
 É nulo: IS NULL
Condicionamento
http://www.alvarofpinheiro.eti.br
SELECT NUMERO, SOBRENOME
FROM EMPREGADO
WHERE COMISSAO IS NULL;
Condicionamento
http://www.alvarofpinheiro.eti.br
●Prática: Visualizar o Número, Sobrenome e
Salário de todos os empregados que
possuem salário entre (inclusive) 1500 e
2000, dos departamentos 20, 50 e 80.
●Dicas:
o Operadores Lógicos:
 Verdadeiro para ambas expressões verdadeiras: AND
 Verdadeiro bastando uma das expressões verdadeiras: OR
 Inverso da expressão: NOT
Condicionamento
http://www.alvarofpinheiro.eti.br
SELECT NUMERO, SOBRENOME, SALARIO, DEPARTAMENTO
FROM EMPREGADO
WHERE SALARIO BETWEEN 1500 AND 2000
AND DEPARTAMENTO IN (20, 50, 80);
Condicionamento
http://www.alvarofpinheiro.eti.br
●1 – Operadores Aritméticos;
●2 – Operador de Concatenação;
●3 – Condições de Comparação;
●4 – IS [NOT] NULL, [NOT] LIKE, [NOT] IN;
●5 – [NOT] BETWEEN;
●6 – Condição lógica NOT;
●7 – Condição lógica AND;
●8 – Condição lógica OR.
Regras de Precedência
http://www.alvarofpinheiro.eti.br
●Prática: Visualizar o Sobrenome e o Salário
dos Empregados ordenados por Salário em
ordem decrescente.
●Dicas:
o Sintaxe da ordenação: [ORDER BY {coluna, expr} [ASC|DESC]];
o É possível utilizar o alias na cláusula de ordenação;
o É possível utilizar a posição da coluna na ordenação;
o Pode-se classificar por colunas que não estejam no select;
o Pode-se classificar por N colunas
Ordenação
http://www.alvarofpinheiro.eti.br
SELECT SOBRENOME, SALARIO
FROM EMPREGADO
ORDER BY SALARIO DESC;
Ordenação
http://www.alvarofpinheiro.eti.br
●Funções são recursos avançados do SQL e
podem ser utilizadas para efetuar o seguinte:
o Executar cálculos;
o Modificar itens de dados individuais;
o Manipular a saída para grupos de linhas;
o Formatar datas e números para exibição;
o Converter tipos de dados de coluna.
●Dicas:
o Algumas funções utilizam argumentos;
o Sempre retornam um valor.
Funções
http://www.alvarofpinheiro.eti.br
●Funções de uma Única Linha
o Operam somente linhas únicas e retornam
um resultado por linha.
●Funções de Várias Linhas
o Podem manipular grupos de linhas para
fornecer um resultado e são mais conhecidas
como funções de grupo.
Funções (Tipos)
http://www.alvarofpinheiro.eti.br
●Servem para manipular itens de dados;
●Aceitam um ou mais argumentos;
●Retornam um valor para cada linha
retornada;
●São do tipo:
o Caractere, Numéricas, Data, Conversão e
Gerais;
●Podem ser usadas em cláusulas:
o SELECT, WHERE e ORDER BY.
Funções (Única Linha)
http://www.alvarofpinheiro.eti.br
●LOWER – converte para minúsculas;
●UPPER – converte para maiúsculas;
●SUBSTRING – retorna o substring de uma string;
●LENGTH – retorna o número de caracteres;
●CHARINDEX – retorna a posição de um string;
●REPLACE - substitui uma string por outra string;
●RTRIM | LTRIM | TRIM – retira brancos.
Funções (Caractere)
http://www.alvarofpinheiro.eti.br
●Práticas:
o Exibir todos os Primeironomes em minúsculas;
o Exibir todos os Sobrenomes em maiúsculas;
o Exibir os 3 primeiros caracteres do Sobrenome;
o Exibir o tamanho do Sobrenome;
o Exibir a posição no ‘(‘ no nome do departamento;
o Trocar no nome de departamento: Admin para Adm;
Exec para Exe; e Contab para Con.
Funções (Caractere)
http://www.alvarofpinheiro.eti.br
--Exibir todos os Primeironomes em minúsculas
SELECT LOWER(PRIMEIRONOME) AS PRIMEIRONOME FROM EMPREGADO;
--Exibir todos os Sobrenomes em maiúsculas
SELECT UPPER(SOBRENOME) AS PRIMEIRONOME FROM EMPREGADO;
--Exibir os 3 primeiros caracteres do Sobrenome
--SQLServer | Postgre | MySQL
SELECT SUBSTRING(SOBRENOME,1,3) FROM EMPREGADO;
--Oracle
SELECT SUBSTR(SOBRENOME,1,3) FROM EMPREGADO;
--Firebird
SELECT SUBSTRING(SOBRENOME FROM 1 FOR 3) FROM EMPREGADO;
Funções (Caractere)
http://www.alvarofpinheiro.eti.br
--Exibir o tamanho do Sobrenome
--SQLServer
SELECT LEN(SOBRENOME) FROM EMPREGADO;
--Postgre | Oracle | MySQL
SELECT LENGTH(SOBRENOME) FROM EMPREGADO;
--Firebird
SELECT CHAR_LENGTH(SOBRENOME) FROM EMPREGADO;
Funções (Caractere)
http://www.alvarofpinheiro.eti.br
--Exibir a posição no ‘(‘ no nome do departamento
--SQLServer
SELECT CHARINDEX('(', NOME) FROM DEPARTAMENTO;
--Postgre
SELECT STRPOS(NOME, '(') FROM DEPARTAMENTO;
--Oracle | MySQL
SELECT INSTR(NOME, '(') FROM DEPARTAMENTO;
--Firebird
SELECT POSITION('(' IN NOME) FROM DEPARTAMENTO;
Funções (Caractere)
http://www.alvarofpinheiro.eti.br
--Trocar no nome de departamento: Admin para Adm; Exec para Exe;
e Contab para Con.
SELECT
REPLACE(NOME, '(ADMIN)', '(ADM)'),
REPLACE(NOME, '(EXEC)', '(EXE)'),
REPLACE(NOME, '(CONTAB)', '(CON)')
FROM DEPARTAMENTO;
http://www.alvarofpinheiro.eti.br
Funções (Caractere)
●Prática: Exibir o tamanho do Apelido
concatenado com o Sobrenome com os
brancos e depois sem os brancos.
●Dicas:
o Funções de uma única linha podem ser
aninhadas em qualquer nível;
o As funções aninhadas são avaliadas do nível
mais interno para o mais externo.
Funções (Aninhamento)
http://www.alvarofpinheiro.eti.br
--Exibir o tamanho do Apelido concatenado com o Sobrenome com os brancos
--SQLServer
SELECT LEN(APELIDO + ' ' + SOBRENOME) FROM EMPREGADO;
--Postgre | Oracle
SELECT LENGTH(APELIDO || ' ' || SOBRENOME) FROM EMPREGADO;
--MySQL
SELECT LENGTH(CONCAT(APELIDO, ' ', SOBRENOME)) FROM EMPREGADO;
--Firebird
SELECT CHAR_LENGTH(APELIDO || ' ' || SOBRENOME) FROM EMPREGADO;
--Exibir o tamanho do Apelido concatenado com o Sobrenome sem os brancos
--SQLServer
SELECT LEN(RTRIM(APELIDO) + ' ' + SOBRENOME) FROM EMPREGADO;
--Postgre | Oracle
SELECT LENGTH(RTRIM(APELIDO) || ' ' || SOBRENOME) FROM EMPREGADO;
--MySQL
SELECT LENGTH(CONCAT(RTRIM(APELIDO), ' ', SOBRENOME)) FROM EMPREGADO;
--Firebird
SELECT CHAR_LENGTH(TRIM(APELIDO) || ' ' || SOBRENOME) FROM EMPREGADO;
Funções (Aninhamento)
http://www.alvarofpinheiro.eti.br
●ROUND – arredonda a coluna;
●TRUNC – trunca a coluna;
●Práticas:
o Exibir o Fator;
o Exibir o Fator arredondando para 1 decimal;
o Exibir o Fator truncando para 1 decimal.
Funções (Numérica)
http://www.alvarofpinheiro.eti.br
--Exibir o Fator
SELECT FATOR FROM DEPARTAMENTO;
--Exibir o Fator arredondando para 1 decimal
SELECT ROUND(FATOR,1) FROM DEPARTAMENTO;
--Exibir o Fator truncando para 1 decimal.
--SQLServer
--SELECT ROUND(FATOR, 1, 2) FROM DEPARTAMENTO;
--Postgre | Oracle | Firebird
SELECT TRUNC(FATOR, 1) FROM DEPARTAMENTO;
--MySQL
SELECT TRUNCATE(FATOR, 1) FROM DEPARTAMENTO;
Funções (Numérica)
http://www.alvarofpinheiro.eti.br
●MOD | % – retorna o resto da divisão.
●Práticas:
o Visualizar o quociente da divisão de 5 por 2;
o Visualizar o resto da divisão de 5 por 2;
●Dicas:
o Para exibir dados que não estão inseridos em
tabelas do banco de dados pode-se fazer uso
de uma tabela fictícia usada para exibir
resultados chamada de DUAL.
Funções (Numérica)
http://www.alvarofpinheiro.eti.br
--Visualizar o quociente da divisão de 5 por 2
--SQLServer | Firebird
SELECT 5 / 2 FROM TMP;
--Postgre | MySQL
SELECT 5 / 2;
--Oracle
SELECT 5 / 2 FROM DUAL;
Funções (Numérica)
http://www.alvarofpinheiro.eti.br
--Visualizar o resto da divisão de 5 por 2
--SQLServer
SELECT 5 % 2 FROM TMP;
--Postgre | MySQL
SELECT 5 MOD 2;
--Oracle
SELECT MOD (5, 2) FROM DUAL;
--Firebird
SELECT MOD(5, 2) FROM TMP;
Funções (Numérica)
http://www.alvarofpinheiro.eti.br
●Prática: Visualizar a data e hora corrente;
●Dicas:
o Sintaxe: GETDATE | SYSDATE
o Os Bancos de Dados (BD) armazenam as datas
em formato de número inteiro: século, ano, mês,
dia, horas, minutos e segundos;
o O formato de exibição default depende do BD,
mas no geral é utilizado a exibição DD-MMM-AA;
o Pode-se adicionar ou subtrair (aritmética com
datas)
Funções (Data)
http://www.alvarofpinheiro.eti.br
●Dicas:
o Operação; Resultado; Descrição
o Data+Número; Data; Adiciona dias a datas
o Data-Número; Data; Subtrai dias a datas
o Data-Data; Dias; Subtrai uma data de outra
o Data+Número/24; Data; Adiciona hora a datas
Aritmética de Datas
http://www.alvarofpinheiro.eti.br
●Práticas – Exiba e verifique o retorno:
o Exibir a data corrente;
o Exibir Data+Número;
o Exibir Data-Número;
o Exibir Data-Data;
o Exibir Data+Número/24.
Aritmética de Datas
http://www.alvarofpinheiro.eti.br
--SQLServer
SELECT GETDATE() FROM TMP;
SELECT GETDATE() + 1 FROM TMP;
SELECT GETDATE() - 1 FROM TMP;
SELECT GETDATE() - '13/11/67' FROM TMP;
SELECT GETDATE() + 10/24 FROM TMP;
SELECT YEAR(GETDATE()) FROM TMP;
SELECT MONTH(GETDATE()) FROM TMP;
SELECT DAY(GETDATE()) FROM TMP;
Aritmética de Datas
http://www.alvarofpinheiro.eti.br
--Postgre
SELECT CURRENT_TIMESTAMP;
SELECT CURRENT_TIMESTAMP + INTERVAL '1DAY';
SELECT CURRENT_TIMESTAMP - INTERVAL '1DAY';
SELECT CURRENT_TIMESTAMP - '13/11/67';
SELECT CURRENT_TIMESTAMP + INTERVAL '5HOURS';
SELECT EXTRACT(YEAR FROM CURRENT_TIMESTAMP);
SELECT EXTRACT(MONTH FROM CURRENT_TIMESTAMP);
SELECT EXTRACT(DAY FROM CURRENT_TIMESTAMP);
Aritmética de Datas
http://www.alvarofpinheiro.eti.br
--Oracle
SELECT SYSDATE FROM DUAL;
SELECT SYSDATE + 1 FROM DUAL;
SELECT SYSDATE - 1 FROM DUAL;
SELECT SYSDATE - '13/11/67' FROM DUAL;
SELECT SYSDATE + 10/24 FROM DUAL;
SELECT YEAR(SYSDATE) FROM DUAL;
SELECT MONTH(SYSDATE) FROM DUAL;
SELECT DAY(SYSDATE) FROM DUAL;
Aritmética de Datas
http://www.alvarofpinheiro.eti.br
--MySQL
SELECT CURRENT_TIMESTAMP;
SELECT CURRENT_TIMESTAMP + 1;
SELECT CURRENT_TIMESTAMP - 1;
SELECT CURRENT_TIMESTAMP - '13/11/67';
SELECT CURRENT_TIMESTAMP + 10/24;
SELECT EXTRACT(YEAR FROM CURRENT_TIMESTAMP);
SELECT EXTRACT(MONTH FROM CURRENT_TIMESTAMP);
SELECT EXTRACT(DAY FROM CURRENT_TIMESTAMP);
Aritmética de Datas
http://www.alvarofpinheiro.eti.br
--Firebird
SELECT CURRENT_TIMESTAMP FROM TMP;
SELECT CURRENT_TIMESTAMP + 1 FROM TMP;
SELECT CURRENT_TIMESTAMP - 1 FROM TMP;
SELECT CURRENT_TIMESTAMP + 10/24 FROM TMP;
SELECT EXTRACT(YEAR FROM CURRENT_TIMESTAMP) FROM TMP;
SELECT EXTRACT(MONTH FROM CURRENT_TIMESTAMP) FROM TMP;
SELECT EXTRACT(DAY FROM CURRENT_TIMESTAMP) FROM TMP;
Aritmética de Datas
http://www.alvarofpinheiro.eti.br
●Dica:
 CAST
●Práticas:
o Exibir a conversão do salário para string.
Função de Conversão
http://www.alvarofpinheiro.eti.br
SELECT CAST(SALARIO AS CHAR(10)) FROM EMPREGADO;
Função de Conversão
http://www.alvarofpinheiro.eti.br
●CASE – permite uso de expressões condicionais.
●Sintaxe:
o CASE expr WHEN cond THEN retorno
 [WHEN condN THEN retornoN]
 [ELSE retorno]
o END
CASE
http://www.alvarofpinheiro.eti.br
●Práticas:
o Visualizar Número, Sobrenome, Salário e Departamento dos
empregados;
o Visualizar Número, Sobrenome, Salário e Departamento dos
empregados aplicando 10% de aumento nos salários dos depart. 10 e 20,
15% dos depart. 80 e 90, e 5% nos demais.
CASE
http://www.alvarofpinheiro.eti.br
SELECT NUMERO, SOBRENOME,
CASE
WHEN DEPARTAMENTO IN (10,20) THEN SALARIO + (SALARIO0.10)
WHEN DEPARTAMENTO IN (80,90) THEN SALARIO + (SALARIO0.15)
ELSE SALARIO + (SALARIO0.5)
END AS SALARIO,
DEPARTAMENTO
FROM EMPREGADO;
CASE
http://www.alvarofpinheiro.eti.br
●Um produto cartesiano será formado quando uma
condição de junção for omitida e como
consequência todas as linhas da primeira tabela
serão unidas a todas a linhas da segunda tabela.
Produto Cartesiano
http://www.alvarofpinheiro.eti.br
●Práticas:
o Visualizar Número, Sobrenome e Nome de Departamento dos
empregados não colocando a junção das tabelas e observe o resultado.
Produto Cartesiano
http://www.alvarofpinheiro.eti.br
--Todos
SELECT E.NUMERO, E.SOBRENOME, D.NOME FROM EMPREGADO E,
DEPARTAMENTO D;
--SQLServer | Postgre | Oracle | MySQL
SELECT E.NUMERO, E.SOBRENOME, D.NOME FROM EMPREGADO E
CROSS JOIN DEPARTAMENTO D;
Produto Cartesiano
http://www.alvarofpinheiro.eti.br
●Quando forem necessários dados de mais de
uma tabela no banco de dados, será usada uma
condição de junção. As linhas de uma tabela
podem ser unidas a linhas de outra tabela de
acordo com os valores comuns existentes nas
colunas correspondentes, ou seja, em geral
colunas de chave primária e chave estrangeira.
Junção
http://www.alvarofpinheiro.eti.br
●Dicas:
o Quando criar uma instrução SELECT que una tabelas, coloque o
nome da tabela antes do nome da coluna para fins de clareza e
para melhorar o acesso ao banco de dados;
o Caso apareça o mesmo nome de coluna em mais de uma
tabela, o nome da coluna deve vir antecedido do nome da tabela
(AMBÍGUIDADE);
o Para unir N tabelas, é necessário um mínimo de N-1 condições
de junção. Por exemplo, para unir 4 tabelas, é necessário um
mínimo de 3 junções. Essa regra pode não se aplicar se sua
tabela tiver uma chave primária concatenada. Nesse caso, será
necessário mais de uma coluna para identificar exclusivamente
cada linha;
o Para melhorar a sintaxe deve-se apelidar as tabelas.
Junção
http://www.alvarofpinheiro.eti.br
●Eqüijunção
●Não-eqüijunção
●Junção externa
●Autojunção
Junção (Tipos)
http://www.alvarofpinheiro.eti.br
●Dica:
● Também chamadas de junções simples ou internas.
●Prática:
● Exibir o Sobrenome do empregado e o Nome do
departamento de um empregado.
Equijunção
http://www.alvarofpinheiro.eti.br
SELECT E.SOBRENOME, D.NOME
FROM EMPREGADO E
INNER JOIN DEPARTAMENTO D
ON E.DEPARTAMENTO = D.NUMERO;
Equijunção
http://www.alvarofpinheiro.eti.br
●Prática: Determine o nome do cargo e do
departamento de um empregado.
●Dica: Observe que nas junções simples ou
internas se não existe uma relação a tupla não é
gerada.
●Tupla: Cada linha formada por uma lista ordenada de colunas representa um
registro. Os registros não precisam conter informações em todas as colunas,
podendo assumir valores nulos quando assim se fizer necessário.
Equijunção
http://www.alvarofpinheiro.eti.br
SELECT E.SOBRENOME, C.NOME, D.NOME
FROM EMPREGADO E
INNER JOIN CARGO C
ON E.CARGO = C.NUMERO
INNER JOIN DEPARTAMENTO D
ON E.DEPARTAMENTO = D.NUMERO;
Equijunção
http://www.alvarofpinheiro.eti.br
●São junções que não usam condições de
igualdade.
●Prática: Exibir o Número, Sobrenome, nome do
cargos de cada empregados que podem ser
galgados na empresa.
Não-Equijunção
http://www.alvarofpinheiro.eti.br
SELECT E.NUMERO, E.SOBRENOME, C.NOME
FROM EMPREGADO E
INNER JOIN CARGO C
ON C.NUMERO > E.CARGO;
Não-Equijunção
http://www.alvarofpinheiro.eti.br
●Quando se deseja exibir dados que não possuem uma relação comum entre
tabelas.
●Dicas:
o Em banco como Oracle pode-se utilizar a extensão (+) e em
SQL Server ();
o Só pode ser utilizado de um lado da expressão;
o Não se pode utilizar o operador IN e nem o OR.
●Prática: Exibir o Número, Sobrenome, Apelido, nome do cargo de todos os
empregados, mesmo daqueles que ainda não possuem cargos atribuídos.
Junção Externa
http://www.alvarofpinheiro.eti.br
SELECT E.NUMERO, E.SOBRENOME, E.APELIDO, C.NOME
FROM EMPREGADO E
RIGHT JOIN CARGO C
ON C.NUMERO = E.CARGO;
Junção Externa
http://www.alvarofpinheiro.eti.br
●Quando se une uma tabela a ela mesma.
●Prática: Exibir o Número, Primeironome dos
empregados e o Número e o Primeironome dos
seus respectivos gerentes.
Autojunção
http://www.alvarofpinheiro.eti.br
SELECT E.NUMERO, E.PRIMEIRONOME, G.NUMERO, G.PRIMEIRONOME
FROM EMPREGADO E LEFT JOIN EMPREGADO G
ON E.GERENTE = G.NUMERO;
Autojunção
http://www.alvarofpinheiro.eti.br
●Operam um conjunto de linhas, as funções de grupo operam em conjuntos de
linhas para fornecer um resultado por grupo. Esses conjuntos podem ser a
tabela inteira ou dividida em grupos.
●Dicas:
o Funções de grupo são mais conhecidas como funções
agregadas. AVG, COUNT, MAX, MIN e SUM;
o ALL faz com que a função considere todos os valores, inclusive
as duplicidades;
o DISTINCT faz com que a função considere somente valores não
duplicados;
o Todas as funções de grupos ignoram valores nulos, para
garantir a aplicabilidade para todos os registros use ().
Funções de Grupo
http://www.alvarofpinheiro.eti.br
●Práticas:
o Exibir a média de salários pago pelo empregador;
o Exibir o somatório dos salários;
o Exibir a quantidade de empregados;
o Exibir o maior salário;
o Exibir o menor salário.
Funções de Grupo
http://www.alvarofpinheiro.eti.br
SELECT AVG(SALARIO) FROM EMPREGADO;
SELECT SUM(SALARIO) FROM EMPREGADO;
SELECT COUNT(SALARIO) FROM EMPREGADO;
SELECT MAX(SALARIO) FROM EMPREGADO;
SELECT MIN(SALARIO) FROM EMPREGADO;
Funções de Grupo
http://www.alvarofpinheiro.eti.br
●Usa-se o GROUP BY para dividir as linhas de
uma tabela em grupos.
●Práticas:
o Exibir a média de salários pagos por Departamento;
o Exibir o somatório dos salários pagos por Cargo;
o Exibir a quantidade de empregados por gestor;
o Exibir o maior salário por gestor;
o Exibir o menor salário por gestor.
Grupo de Dados
http://www.alvarofpinheiro.eti.br
SELECT D.NOME, AVG(E.SALARIO) AS MEDIAS
FROM DEPARTAMENTO D INNER JOIN EMPREGADO E
ON D.NUMERO = E.DEPARTAMENTO
GROUP BY D.NOME;
SELECT C.NOME, SUM(E.SALARIO) AS SOMATORIO
FROM CARGO C INNER JOIN EMPREGADO E
ON C.NUMERO = E.CARGO
GROUP BY C.NOME;
SELECT G.SOBRENOME, COUNT(E.NUMERO) AS QTDE
FROM EMPREGADO G INNER JOIN EMPREGADO E
ON G.NUMERO = E.GERENTE
GROUP BY G.SOBRENOME;
SELECT G.SOBRENOME, MAX(E.SALARIO) AS MAIORSALARIO
FROM EMPREGADO G INNER JOIN EMPREGADO E
ON G.NUMERO = E.GERENTE
GROUP BY G.SOBRENOME;
SELECT G.SOBRENOME, MIN(E.SALARIO) AS MENORSALARIO
FROM EMPREGADO G INNER JOIN EMPREGADO E
ON G.NUMERO = E.GERENTE
GROUP BY G.SOBRENOME;
Grupo de Dados
http://www.alvarofpinheiro.eti.br
●Usa-se o HAVING para filtrar as linhas de uma
tabela em grupos.
●Práticas:
o Exibir a média de salários pagos por Departamento cujo a média seja
maior ou igual a 2000;
o Exibir o somatório dos salários pagos por Cargo cujo o somatório seja
menor que 1500.
Grupo de Dados (Filtros)
http://www.alvarofpinheiro.eti.br
SELECT D.NOME, AVG(E.SALARIO) AS MEDIAS
FROM DEPARTAMENTO D INNER JOIN EMPREGADO E
ON D.NUMERO = E.DEPARTAMENTO
GROUP BY D.NOME
HAVING AVG(E.SALARIO) >= 2000;
SELECT D.NOME, SUM(E.SALARIO) AS MEDIAS
FROM DEPARTAMENTO D INNER JOIN EMPREGADO E
ON D.NUMERO = E.DEPARTAMENTO
GROUP BY D.NOME
HAVING AVG(E.SALARIO) < 1500;
Grupo de Dados (Filtros)
http://www.alvarofpinheiro.eti.br
●Usa-se o ROLLUP para produzir linhas
superagregadas pela referência cruzada de
colunas. O agrupamento ROLLUP produz um
conjunto de resultados que contém as linhas
agrupadas normais e os valores de subtotais.
●Práticas:
o Exibir o somatório de Salário agrupado por Departamento e Cargo dos
empregados com Número de Departamento menor que 60, exibindo os
subtotais de Departamento e Cargo.
Grupo de Dados (ROLLUP)
http://www.alvarofpinheiro.eti.br
--Todos
SELECT CAST(DEPARTAMENTO AS CHAR), CAST(CARGO AS CHAR), SUM(SALARIO)
FROM EMPREGADO
WHERE DEPARTAMENTO < 60
GROUP BY DEPARTAMENTO, CARGO
UNION
SELECT '', 'TOTAL', COALESCE(SUM(SALARIO), 0)
FROM EMPREGADO;
--SQLServer | Oracle
SELECT DEPARTAMENTO, CARGO, SUM(SALARIO)
FROM EMPREGADO
WHERE DEPARTAMENTO < 60
GROUP BY ROLLUP (DEPARTAMENTO, CARGO);
--MySQL
SELECT DEPARTAMENTO, CARGO, SUM(SALARIO)
FROM EMPREGADO
WHERE DEPARTAMENTO < 60
GROUP BY DEPARTAMENTO, CARGO WITH ROLLUP;
Grupo de Dados (ROLLUP)
http://www.alvarofpinheiro.eti.br
●Usa-se o CUBE para produzir um conjunto de
resultados que contém as linhas de ROLLUP e as
linhas de tabulação cruzada. Pode-se usá-lo para
produzir valores de tabulação cruzada com uma
instrução SELECT simples.
●Práticas:
o Exibir o somatório de Salário agrupado por Departamento e Cargo dos
empregados com Número de Departamento menor que 60, exibindo a
referência cruzada de Departamento e Cargo.
Grupo de Dados (CUBE)
http://www.alvarofpinheiro.eti.br
--SQLServer | Oracle
SELECT DEPARTAMENTO, CARGO, SUM(SALARIO)
FROM EMPREGADO
WHERE DEPARTAMENTO < 60
GROUP BY CUBE (DEPARTAMENTO, CARGO);
Grupo de Dados (CUBE)
http://www.alvarofpinheiro.eti.br
●Usa-se o ORDER BY para classificar as linhas de
uma seleção.
●Práticas:
o Exibir a média de salários pagos por Departamento em ordem
decrescente;
o Exibir o somatório dos salários pagos por Cargo em ordem ascendente.
Ordenação de Dados
http://www.alvarofpinheiro.eti.br
SELECT D.NOME, AVG(E.SALARIO) AS MEDIAS
FROM DEPARTAMENTO D INNER JOIN EMPREGADO E
ON D.NUMERO = E.DEPARTAMENTO
GROUP BY D.NOME
ORDER BY AVG(E.SALARIO) DESC;
SELECT C.NOME, SUM(E.SALARIO) AS MEDIAS
FROM CARGO C INNER JOIN EMPREGADO E
ON C.NUMERO = E.CARGO
GROUP BY C.NOME
ORDER BY 1 ASC;
Ordenação de Dados
http://www.alvarofpinheiro.eti.br
●As funções de grupo podem ser aninhadas até
uma profundidade de dois.
●Prática:
o Exibir o salário médio máximo pago por Departamento.
Grupo de Dados (Aninhamento)
http://www.alvarofpinheiro.eti.br
--Oracle
SELECT MAX(AVG(E.SALARIO)) AS MEDIAS
FROM EMPREGADO E
GROUP BY E.DEPARTAMENTO;
Grupo de Dados (Aninhamento)
http://www.alvarofpinheiro.eti.br
●Consiste em executar uma consulta (externa) a partir de outra consulta
(interna).
●Dicas:
o Existem operadores que retornam apenas uma linha (=, <>, >,
>=, <, <=) e o que retorna várias linhas (IN);
o Coloque subconsultas entre parênteses;
o A quantidade de níveis de subconsultas dependem do banco de
dados.
●Prática:
o Quais os empregados possuem salário maior que o de
Pedroca?
Subconsulta
http://www.alvarofpinheiro.eti.br
SELECT APELIDO, SALARIO
FROM EMPREGADO
WHERE SALARIO >
(SELECT SALARIO FROM EMPREGADO WHERE APELIDO='PEDROCA');
Subconsulta
http://www.alvarofpinheiro.eti.br
●Prática:
o Qual o nome (Primeironome + Sobrenome) dos empregados
possuem o menor salário?
Subconsulta
http://www.alvarofpinheiro.eti.br
--SQLSever
SELECT PRIMEIRONOME + ' ' + SOBRENOME AS NOME, SALARIO FROM EMPREGADO
WHERE SALARIO = (SELECT MIN(SALARIO) FROM EMPREGADO);
--Postgre | Oracle | Firebird
SELECT PRIMEIRONOME || ' ' || SOBRENOME AS NOME, SALARIO FROM EMPREGADO
WHERE SALARIO = (SELECT MIN(SALARIO) FROM EMPREGADO);
--MySQL
SELECT CONCAT(PRIMEIRONOME, ' ', SOBRENOME) AS NOME, SALARIO FROM EMPREGADO
WHERE SALARIO = (SELECT MIN(SALARIO) FROM EMPREGADO);
Subconsulta
http://www.alvarofpinheiro.eti.br
●Prática:
o Exibir o menor Salário por Departamento onde o menor Salário
seja o maior que o menor Salário do Departamento de código 50.
Subconsulta
http://www.alvarofpinheiro.eti.br
SELECT D.NOME, MIN(E.SALARIO)
FROM EMPREGADO E
INNER JOIN DEPARTAMENTO D
ON E.DEPARTAMENTO = D.NUMERO
GROUP BY D.NOME
HAVING MIN(E.SALARIO) >
(SELECT MIN(SALARIO) FROM EMPREGADO WHERE DEPARTAMENTO = 50);
Subconsulta
http://www.alvarofpinheiro.eti.br
●Prática:
o O que há de errado com a instrução abaixo?
o SELECT Numero, Sobrenome
o FROM Empregado
o WHERE Salario = (SELECT MIN(Salario)
o FROM Empregado
o GROUP BY Departamento);
Subconsulta
http://www.alvarofpinheiro.eti.br
A subconsulta retornou mais de 1 valor. Isso não é permitido quando a subconsulta segue um =, !=, <, <= , >,
>= ou quando ela é usada como uma expressão.
Subconsulta
http://www.alvarofpinheiro.eti.br
●Prática:
o Exibir Número, Sobrenome, Salário dos empregados
que possuirem algum salário menor que o menor salário
do departamento de código 50.
Subconsulta (ANY)
http://www.alvarofpinheiro.eti.br
SELECT NUMERO, SOBRENOME, SALARIO
FROM EMPREGADO
WHERE SALARIO < ANY
(SELECT MIN(SALARIO) FROM EMPREGADO WHERE DEPARTAMENTO = 50);
Subconsulta (ANY)
http://www.alvarofpinheiro.eti.br
●Prática:
o Exibir Número, Sobrenome, Salário dos todos os empregados
que possuirem salário menor que o menor salário do
departamento de código 50.
Subconsulta (ALL)
http://www.alvarofpinheiro.eti.br
SELECT NUMERO, SOBRENOME, SALARIO
FROM EMPREGADO
WHERE SALARIO < ALL
(SELECT MIN(SALARIO) FROM EMPREGADO WHERE DEPARTAMENTO = 50);
Subconsulta (ALL)
http://www.alvarofpinheiro.eti.br
●Ocorre quando uma subconsulta faz referência a uma coluna de uma tabela
referenciada na instrução mãe. Uma subconsulta correlacionada é avaliada
uma vez para cada linha processada pela instrução mãe. A instrução mãe
pode ser uma instrução SELECT, UPDATE ou DELETE.
●Prática:
o Exibir todos os empregados (Sobrenome, Salário e Número do
Departamento) que ganham acima do salário médio de seus
respectivos departamentos.
Subconsulta (Correlacionadas)
http://www.alvarofpinheiro.eti.br
SELECT EXT.SOBRENOME, EXT.SALARIO, EXT.DEPARTAMENTO
FROM EMPREGADO EXT
WHERE EXT.SALARIO >
(SELECT AVG(ITN.SALARIO)
FROM EMPREGADO ITN
WHERE ITN.DEPARTAMENTO = EXT.DEPARTAMENTO);
Subconsulta (Correlacionadas)
http://www.alvarofpinheiro.eti.br
●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: A
pesquisa na consulta interna não continuará; e A condição será indicada por
um flag TRUE. Se o valor de linha de uma subconsulta não for encontrado: A
condição será indicada por um flag FALSE; A pesquisa continuará na consulta
interna.
●Prática:
o Exibir os empregados (Sobrenome, Salário e Número do
Departamento) com no mínimo uma pessoa subordinada a eles.
Subconsulta (EXISTS)
http://www.alvarofpinheiro.eti.br
SELECT EXT.SOBRENOME, EXT.SALARIO, EXT.DEPARTAMENTO
FROM EMPREGADO EXT
WHERE EXISTS
(SELECT 'X'
FROM EMPREGADO ITN
WHERE ITN.GERENTE = EXT.NUMERO);
Subconsulta (EXISTS)
http://www.alvarofpinheiro.eti.br
●Retorna todas as linhas selecionadas por uma consuta. Use esse operador
para retornar todas as linhas de várias tabelas e eliminar as linhas duplicadas.
●Dicas:
o Necessáriamente os campos das tabelas unidas devem possuir
os mesmos tipos de dados;
o Os campos devem estar posicionados na mesma ordem;
o A quantidade de campos deve ser a mesma;
o A cláusula ORDER BY deve ser utilizada no final da união.
●Prática:
o Exibir a união das tabelas Cargo e Departamento para os
campos Número e Nome.
União
http://www.alvarofpinheiro.eti.br
SELECT NUMERO, NOME
FROM CARGO
UNION
SELECT NUMERO, NOME
FROM DEPARTAMENTO;
União
http://www.alvarofpinheiro.eti.br
●Serve para retornar todas as linhas comuns a várias consultas.
●Prática:
o Exibir a intersecção das tabelas Cargo e Departamento para os
campos Número e Nome.
Intersecção
http://www.alvarofpinheiro.eti.br
--SQLServer | Postgre | Oracle
SELECT NUMERO, NOME FROM CARGO INTERSECT SELECT NUMERO, NOME FROM
DEPARTAMENTO;
--MySQL
SELECT NUMERO, NOME FROM CARGO INNER JOIN DEPARTAMENTO USING (NUMERO, NOME);
Intersecção
http://www.alvarofpinheiro.eti.br
●Serve para obter linhas retornadas pela primeira consulta e ausentes na
segunda consulta.
●Prática:
o Exibir a subtração das tabelas Cargo e Departamento para os
campos Número e Nome.
Subtração
http://www.alvarofpinheiro.eti.br
--SQLServer | Oracle
SELECT NUMERO, NOME FROM CARGO MINUS SELECT NUMERO, NOME FROM DEPARTAMENTO;
--Postgre
SELECT NUMERO, NOME FROM CARGO EXCEPT SELECT NUMERO, NOME FROM DEPARTAMENTO;
--MySQL
SELECT DISTINCT NUMERO, NOME FROM CARGO WHERE (NUMERO, NOME) NOT IN (SELECT
NUMERO, NOME FROM DEPARTAMENTO);
Subtração
http://www.alvarofpinheiro.eti.br
●Alguns bancos permitem passagem de parâmetros com o uso de variáveis de
substituição.
●Dicas:
o No Oracle a macrosubstituição é com (&);
o No SQLServer a macrosubstituição é com (:);
●Prática:
o Exibir o Sobrenome do empregado que possuir o Número
informado pelo usuário.
Macrosubstituição
http://www.alvarofpinheiro.eti.br
SELECT SOBRENOME
FROM EMPREGADO
WHERE NUMERO = :Informe_Numero;
Macrosubstituição
http://www.alvarofpinheiro.eti.br
●Alguns BD permitem a selecão de dados nas cláusulas SELECT e FROM.
●Exemplo:
o Oracle
● SELECT CARGO FROM
● (SELECT C.NOME AS CARGO, AVG(E.SALARIO) AS MEDIASALARIO
● FROM CARGO C INNER JOIN EMPREGADO E
● ON C.NUMERO = E.CARGO
● GROUP BY C.NOME);
o SQLServer
● SELECT E.NUMERO, E.SOBRENOME, E.SALARIO, E.DEPARTAMENTO
AS DEPCOD, (SELECT D.NOME FROM DEPARTAMENTO D WHERE
D.NUMERO = E.DEPARTAMENTO) AS DEPNOME
● FROM EMPREGADO E;
Seleção de Seleção
http://www.alvarofpinheiro.eti.br
●Alguns BD permitem a selecão das N primeiras linhas que satisfazem a
uma determinada seleção.
●Prática:
o Exibir os 2 primeiros registros de empregados cujos os salários
sejam menores que 2000.
Análise Top-N
http://www.alvarofpinheiro.eti.br
--SQLServer
SELECT TOP 2 NUMERO, APELIDO, SALARIO FROM EMPREGADO
WHERE SALARIO < 2000;
--Postgre | MySQL
SELECT NUMERO, APELIDO, SALARIO FROM EMPREGADO
WHERE SALARIO < 2000 LIMIT 2;
--Oracle
SELECT NUMERO, APELIDO, SALARIO FROM EMPREGADO
WHERE SALARIO < 2000 AND ROWNUM <= 2;
--Firebird
SELECT FIRST 2 NUMERO, APELIDO, SALARIO FROM EMPREGADO
WHERE SALARIO < 2000;
Análise Top-N
http://www.alvarofpinheiro.eti.br
Apagar registros:
DELETE FROM nome
[WHERE definição]
[ORDER BY ...];
Apagar e recriar tabela:
TRUNCATE TABLE nome_tabela;
Apagar tabela:
DROP TABLE nome_tabela;
Apagar
http://www.alvarofpinheiro.eti.br
●Tratamento de dados de forma atômica.
●Dica: Em alguns BD as instruções DDL e DCL são automáticas.
●Práticas:
o Exibir os dados da tabela Empregado;
o Salvar um ponto A;
o Apagar todos os empregados do Departamento 50;
o Exibir os dados da tabela Empregado;
o Salvar um ponto B;
o Apagar todos os empregados com Salário = 1000;
o Exibir os dados da tabela Empregado;
o Restaurar o ponto A;
o Exibir os dados da tabela Empregado;
o Restaurar o ponto B;
o Exibir os dados da tabela Empregado.
Transações
http://www.alvarofpinheiro.eti.br
--SQLServer
SAVE TRANSACTION A;
SELECT FROM DEPARTAMENTO;
DELETE FROM DEPARTAMENTO WHERE NUMERO = 110;
SELECT FROM DEPARTAMENTO;
UPDATE DEPARTAMENTO SET NOME = 'TESTE' WHERE NUMERO = 90;
SELECT FROM DEPARTAMENTO;
ROLLBACK TRANSACTION A;
SAVE TRANSACTION B;
INSERT INTO DEPARTAMENTO (NUMERO, NOME) VALUES (200, 'TESTE2');
SELECT FROM DEPARTAMENTO;
COMMIT TRANSACTION B;
SELECT FROM DEPARTAMENTO;
Transações
http://www.alvarofpinheiro.eti.br
●Serve para apresentar combinações ou subconjuntos lógicos de dados
através de views de tabelas. A view é uma tabela lógica baseada em uma
tabela ou em outra view. Ela não contém dados próprios, mas é uma janela
por meio da qual os dados das tabelas podem ser vistos e algumas vezes
alterados. As tabelas nas quais uma view se baseia são denominadas de
tabelas-base. A view é armazenada como uma instrução SELECT no
dicionário de dados.
●Dicas:
o Serve para restringir o acesso a dados;
o Serve para facilitar as consultas complexas;
o Serve para permitir a independência dos dados;
o Serve para apresentar diferentes visões dos mesmos dados.
Visão
http://www.alvarofpinheiro.eti.br
●View Simples
o Cria dados a partir de uma tabela apenas;
o Não contém funções e nem grupo de dados;
o Permite operações DML.
●View Complexas
o Cria dados a partir de várias tabelas;
o Contém funções ou grupo de dados;
o Nem sempre permite operações DML.
Visão
http://www.alvarofpinheiro.eti.br
●Sintaxe:
●CREATE VIEW [ schema_name . ] view_name
●[ (column [ ,...n ] ) ]
●AS select_statement;
Visão
http://www.alvarofpinheiro.eti.br
●Prática: Criar uma visão denominada VISAO_1, que contenha os campos
Número, Primeironome, Sobrenome dos empregados do departamento 80.
Depois de criada insira um novo registro nessa visão. Finalizando exiba todos
os dados da tabela Empregado.
Visão Simples
http://www.alvarofpinheiro.eti.br
CREATE VIEW VISAO_1 AS
SELECT NUMERO, PRIMEIRONOME, SOBRENOME FROM EMPREGADO
WHERE DEPARTAMENTO=80;
INSERT INTO VISAO_1 VALUES (200, 'ANTONIETA', 'LARANJEIRA');
SELECT FROM EMPREGADO;
Visão Simples
http://www.alvarofpinheiro.eti.br
●Prática: Criar uma visão denominada VISAO_2, que contenha os campos
Nome (Primeironome + ‘ ‘ + Sobrenome) e o campo Salariobase (Salário –
500) dos empregados do departamento 30. Depois de criada tente insir um
novo registro nessa visão. Finalizando exiba todos os dados da tabela
Empregado.
Visão Complexa
http://www.alvarofpinheiro.eti.br
CREATE VIEW VISAO_2 AS
SELECT (PRIMEIRONOME + ' ' + SOBRENOME) AS NOME, (SALARIO - 500) AS SALARIOBASE
FROM EMPREGADO WHERE DEPARTAMENTO=10;
INSERT INTO VISAO_2 VALUES ('JULIETA PEREIRA', 400);
SELECT FROM EMPREGADO;
Visão Complexa
http://www.alvarofpinheiro.eti.br
●Criar novos usuários para o BD.
●Sintaxe:
o SQLServer
●CREATE LOGIN login
●WITH PASSWORD = ‘senha';
●CREATE USER usuario
●FOR LOGIN [operador]
●WITH DEFAULT_SCHEMA = [dbo];
o Oracle
●CREATE USER usuario
●IDENTIFIED BY ‘senha';
●Prática: Criar um novo usuário.
Usuário
http://www.alvarofpinheiro.eti.br
--Para adicionar um usuário ao banco de dados do SQL Server você tem que seguir três passos:
--Primeiro: você deve criar um login, que é um "cara" que tem permisssão de se logar no SQL Sever
CREATE LOGIN USUARIO WITH PASSWORD = 'senha';
--Segundo: você deve criar um usuário para o banco de dados que deseja mapeando esse usuário para o
--login criado, assim seu usuário conseguirá se logar no SQL Server e entrar no banco de dados desejado.
CREATE USER USUARIO FROM LOGIN USUARIO;
--Terceiro: você deve dar ou remover permissões ao usuário porque até o segundo passo o usuário criado só
--tem direito a entrar no banco de dados, dando as permissões o usuário já pode operar no banco de dados.
--Se o usuário for comum você pode adicioná-lo apenas as roles de db_reader e db_writer, que permitirá que
--o usuário faça select, insert, delete e update em todas as tabelas do referido banco de dados.
EXEC SP_ADDROLEMEMBER 'DB_DATAREADER', 'USUARIO'
Usuário
http://www.alvarofpinheiro.eti.br
●Fornecer acesso aos objetos dos BD.
●Sintaxe:
o GRANT privilégio ON objeto TO usuário;
●Exemplos:
o GRANT CREATE TABLE, CREATE VIEW TO operador1;
o GRANT SELECT ON EMPREGADO TO operador1;
Privilégios
http://www.alvarofpinheiro.eti.br
●Retirar acesso aos objetos dos BD.
●Sintaxe:
o REVOKE privilégio ON objeto FROM usuário;
●Exemplos:
o REVOKE CREATE TABLE, CREATE VIEW FROM operador1;
o REVOKE SELECT ON EMPREGADO FROM operador1;
Privilégios
http://www.alvarofpinheiro.eti.br
●Alguns bancos como o Postgre e o Oracle possuem um objeto chamado de
sequencia que equivale no SQLServer a regra de IDENTITY( 1, 1).
●Sintaxe:
● CREATE [TEMPORARY | TEMP] SEQUENCE name
● [INCREMENT [BY] increment ]
● [MINVALUE minvalue | NO MINVALUE]
● [MAXVALUE maxvalue | NO MAXVALUE]
● [START [ WITH ] start]
● [CACHE cache]
● [[ NO ] CYCLE]
Sequência
http://www.alvarofpinheiro.eti.br
Funções SQLServer
ASCII(string)
pega o valor em ASCII da string
CHAR(integer)
troca inteiro do ASCII em um caracter
LEN(string)
Identifica o comprimento de uma expressão em caracteres
LOWER(string)
converte uma string uppercase para lowercase.
LTRIM(string)
remove os espaços em branco
Funções
http://www.alvarofpinheiro.eti.br
Funções SQLServer
PATINDEX(posicao, expressao)
devolve a posicão de uma string dentro de um texto. Se não encontrar, retorna
zero.
REPLICATE(string, integer)
repete N vezes um caractere especificado
REVERSE(string)
retorna o inverso de uma expressao
RTRIM(string)
remove os espaços em branco à direita de uma string
SPACE(integer)
que retorna o número de espaços em branco informados no parâmetro
Funções
http://www.alvarofpinheiro.eti.br
Funções SQLServer
STUFF(string texto, X, Y, string texto_a_inserir)
apaga da string "texto" os y caracteres a partir da posição x e os substitui por
"texto_a_inserir"
SUBSTRING(string texto, posicao_inicial, tamanho)
retorna uma string com o comprimento definido em "tamanho" extraida da
string "texto", a partir da "posicao_inicial"
UPPER(string)
retorna string em maiusculas
DATEADD (parte, numero, data)
adiciona um valor a parte de uma data
Funções
http://www.alvarofpinheiro.eti.br
Funções SQLServer
DATEDIFF (parte, data inicial, data final)
subtrai a data inicial da data final, indicando o resultado na unidade definida em
"parte"
GETDATE()
retorna a data atual do sistema
DATENAME (parte, data)
retorna o nome da parte de uma data
DATEPART(parte, data)
retorna a parte de uma data
CAST(expressao as datatype)
converte uma expressao no datatype informado
Funções
http://www.alvarofpinheiro.eti.br
Funções SQLServer
COL_LENGTH(nome_da_tabela, nome_da_coluna)
retorna o tamanho da coluna
COL_NAME(id_da_tabela, id_da_coluna)
retorna o nome da coluna
DATALENGTH(expressao)
retorna o numero de bytes usados para armazenar a expressao
DB_ID(nome_do_banco)
retorna o ID do banco informado
DB_NAME(id_do_banco)
retorna o nome do banco
Funções
http://www.alvarofpinheiro.eti.br
Funções SQLServer
HOST_ID()
retorna a ID da estação que está acessando o SQL Server
HOST_NAME()
retorna o nome da estação que está acessando o SQL Server
IDENT_INCR(nome_da_tabela_ou_view)
retorna o valor incrementado
IDENT_SEED(tabela_ou_view)
retorna o valor inicial da coluna
INDEX_COL(nome_da_tabela, indice_id, chave_id)
retorna o nome da coluna que participa do índice
Funções
http://www.alvarofpinheiro.eti.br
Funções SQLServer
ISNULL(expressao, valor)
se a expressao for null, troca pelo valor especificado
ISNUMERIC(expressao)
retorna 1 se a expressao for numerica e 0 se não for
NEWID()
retorna um novo valor do tipo uniqueidentifier
NULLIF(expressao_1, expressao_2)
retorna nulo se as duas expressoes forem equivalentes. Se não forem, retorna
a primeira expressao.
OBJECT_ID(nome_do_objeto)
retorna o ID de um objeto, a partir do nome fornecido
Funções
http://www.alvarofpinheiro.eti.br
Funções SQLServer
OBJECT_NAME(ID_do_objeto)
retorna o nome do objeto, a partir do ID fornecido
PARSENAME(objeto, parte)
retorna a parte do nome de um objeto, desde que tenha sido qualificado
STATS_DATE(tabela_id, indice_id)
retorna a data em que as estatísticas do índice foram atualizadas
SUSER_SID(nome_do_usuario)
retorna o ID do usuario informado
SUSER_NAME(usuario_id)
retorna o id do usuário no servidor. O argumento é opcional.
Funções
http://www.alvarofpinheiro.eti.br
Funções SQLServer
ABS(numero)
retorna o valor absoluto do numero
ACOS(float)
retorna o arco-coseno do numero informado
ASIN(float)
retorna o arco-seno do numero informado
ATAN(float)
retorna o arco-tangente do numero informado
ATN2(Float expressao_1, float expressao_2)
arco-tangente do valor definido pela divisão da primeira expressão pela
segunda
Funções
http://www.alvarofpinheiro.eti.br
Funções SQLServer
CEILING(numero)
retorna o menor inteiro que seja maior ou igual ao numero informado
COS(float)
retorna o coseno do numero informado
COT(float)
retorna o cotangente do numero informado
DEGREES(numero)
converte radianos para graus
EXP(float)
retorna o exponencial de um numero especificado
Funções
http://www.alvarofpinheiro.eti.br
Funções SQLServer
FLOOR(numero)
retorna o maior inteiro que seja menor ou igual ao numero informado
LOG(float)
retorna o logaritmo natural do numero informado
LOG10(float)
retorna o logaritmo base 10 do numero informado
PI()
retorna o valor de PI 3.1415926535897931.
POWER(numero, potencia)
retorna o valor elevado à potencia informada
Funções
http://www.alvarofpinheiro.eti.br
Funções SQLServer
RADIANS(numero)
converte graus para radianos
RAND(expressao)
um número aleatório entre 0 e 1. Expressão é opcional e será usada como
semente da cadeia pseudo-aleatória
ROUND(numero, precisao, arredonda_ou_trancar)
arredonda ou tranca o numero fornecido de acordo com a precisao informada.
Se o terceiro parametro não for passado para a funçao, o numero é
arredondado. Se quiser que o numero seja truncado, deve-se fornecer o valor 1
SIGN(numero)
retorna sinal positivo, negativo ou zero do numero
Funções
http://www.alvarofpinheiro.eti.br
Funções SQLServer
SIN(float)
retorna o seno do angulo especificado
SQRT(float)
retorna a raiz quadrada de um numero
TAN(float)
retorna a tangente de um numero informado
SQUARE(float)
retorna o quadrado de um numero
Funções
http://www.alvarofpinheiro.eti.br
●Tables
●Views
●Functions
●Domains
●Rules
●Triggers
●Indices
●Sequences
●Composite Types
●Enum Types
●Base Types
●Aggregates
●Operators
Objetos (Postgre)
http://www.alvarofpinheiro.eti.br
●A grande vantagem dos vínculos de banco de dados é que eles permitem aos
usuários acessarem dados de um banco de dados remoto de modo que eles
fiquem conectados por meio do conjunto de privilégios do proprietário do
objeto. Em outras palavras, um usuário local pode acessar um banco de
dados remoto sem necessariamente ser um usuário do banco de dados
remoto.
●Sintaxe:
o Para criação de vínculo:
 CREATE PUBLIC DATABASE LINK banco
 USING ‘usuário’;
o Para acessar dados:
 SELECT FROM objeto@banco;
Vínculos
http://www.alvarofpinheiro.eti.br
Para haver comunicação entre uma página e um banco
de dados se usa SQL. A SQL Injection ou Injeção de
SQL é uma técnica muito fácil e muito poderosa. Não
são necessários scanners para achar sites vulneráveis e
os comandos são enviados diretamente no navegador.
O único pré-requisito para usar essa técnica é um
conhecimento básico de SQL, que são todos em inglês e
simples, dessa forma favorecendo a um invasor.
SQL Injection
http://www.alvarofpinheiro.eti.br
Baseado no exemplo a seguir:
campo_usuario = Request.Form(“usuário”)
campo_senha = Request.Form(“senha”)
SELECT (usuario,senha) FROM cadastro
WHERE usuario=’ || campo_usuario || ‘
AND senha=’ || campo_senha || ‘
SQL Injection
http://www.alvarofpinheiro.eti.br
Se o usuário e a senha estiverem corretos o login é
efetuado.
Se digitarmos um código malicioso, como ’ OR ‘1’=‘1´,
sempre o login será validado.
SELECT (usuario,senha) FROM cadastro
WHERE usuario=’ ‘ OR ‘1’=’1 ‘ AND senha=’ ‘ OR ‘1’=’1 ‘
SQL Injection
http://www.alvarofpinheiro.eti.br
Pode-se usar o Google para achar páginas vulneráveis e
verificar como o login é feito nas páginas da web. Um dos testes
é usar o comando allinurl. Ele retornar somente páginas que
tenham determinados termos na URL.
Exemplos:
allinurl:”admin/index.asp”
allinurl:”admin/login.asp”
allinurl:”admin/default.asp”
allinurl:”admin/admin.asp”
SQL Injection
http://www.alvarofpinheiro.eti.br
Uma forma de prevenção é nunca passar
valores diretamente em strings SQL e não
deixe claro a finalidade dos campos.
SQL Injection
http://www.alvarofpinheiro.eti.br
Aula
http://www.alvarofpinheiro.eti.br
Aula
http://www.alvarofpinheiro.eti.br
Aula
http://www.alvarofpinheiro.eti.br
Aula
http://www.alvarofpinheiro.eti.br
Aula
http://www.alvarofpinheiro.eti.br
Aula
http://www.alvarofpinheiro.eti.br
Aula
http://www.alvarofpinheiro.eti.br
Aula
http://www.alvarofpinheiro.eti.br
Aula
http://www.alvarofpinheiro.eti.br
Aula
http://www.alvarofpinheiro.eti.br
Aula
http://www.alvarofpinheiro.eti.br
Aula
http://www.alvarofpinheiro.eti.br
Aula
http://www.alvarofpinheiro.eti.br
http://www.alvarofpinheiro.eti.br
Exercício
--Obs: utilizado SQL Server 2008 R2
--Estruturas
--Exemplo de dados: livro, periódico, revista, CD, DVD, ...
CREATE TABLE [dbo].[BIBLIO_TIPOSDEITENS] (
[ID_TDI] int IDENTITY(1, 1) NOT NULL,
[VC_TDI_ITEM] varchar(50) COLLATE SQL_Latin1_General_CP1_CI_AI NULL,
[NU_TDI_QTDEDIASDEVOLUCAO] int NULL,
CONSTRAINT [PK_BIBLIO_TIPOSDEITENS] PRIMARY KEY CLUSTERED ([ID_TDI])
)
ON [PRIMARY]
GO
--Exemplo de dados: português, inglês, espanhol, ...
CREATE TABLE [dbo].[BIBLIO_IDIOMAS] (
[ID_IDI] int IDENTITY(1, 1) NOT NULL,
[VC_IDI_NOME] varchar(50) COLLATE SQL_Latin1_General_CP1_CI_AI NULL,
CONSTRAINT [PK_BIBLIO_IDIOMAS] PRIMARY KEY CLUSTERED ([ID_IDI])
)
ON [PRIMARY]
GO
http://www.alvarofpinheiro.eti.br
Exercício
--Exemplo de dados: ltc, mcgrawhill, ...
CREATE TABLE [dbo].[BIBLIO_EDITORAS] (
[ID_EDI] int IDENTITY(1, 1) NOT NULL,
[VC_EDI_NOME] varchar(100) COLLATE SQL_Latin1_General_CP1_CI_AI NULL,
[VC_EDI_LOCALIZACAO] varchar(1000) COLLATE SQL_Latin1_General_CP1_CI_AI
NULL,
CONSTRAINT [PK_BIBLIO_EDITORAS] PRIMARY KEY CLUSTERED ([ID_EDI])
)
ON [PRIMARY]
GO
--Exemplo de dados: romance, ficcção, ... (são os gêneros)
CREATE TABLE [dbo].[BIBLIO_CLASSIFICACAOLITERARIA] (
[ID_CLA] int IDENTITY(1, 1) NOT NULL,
[VC_CLA_NOME] varchar(100) COLLATE SQL_Latin1_General_CP1_CI_AI NULL,
CONSTRAINT [PK_BIBLIO_CLASSIFICACAOLITERARIA] PRIMARY KEY
CLUSTERED ([ID_CLA])
)
ON [PRIMARY]
GO
http://www.alvarofpinheiro.eti.br
Exercício
--Exemplo de dados: roger presmann, ian summerville, ...
CREATE TABLE [dbo].[BIBLIO_AUTORES] (
[ID_AUT] int IDENTITY(1, 1) NOT NULL,
[VC_AUT_NOME] varchar(100) COLLATE SQL_Latin1_General_CP1_CI_AI NULL,
CONSTRAINT [PK_BIBLIO_AUTORES] PRIMARY KEY CLUSTERED ([ID_AUT])
)
ON [PRIMARY]
GO
http://www.alvarofpinheiro.eti.br
Exercício
--Exemplo de dados: engenharia de software, introdução a banco de dados, ...
CREATE TABLE [dbo].[BIBLIO_ACERVO] (
[ID_ACE] int IDENTITY(1, 1) NOT NULL,
[VC_ACE_TITULODAOBRA] varchar(500) COLLATE
SQL_Latin1_General_CP1_CI_AI NULL,
[VC_ACE_SUBTITULO] varchar(500) COLLATE SQL_Latin1_General_CP1_CI_AI
NULL,
[DT_ACE_AQUISICAO] varchar(10) COLLATE SQL_Latin1_General_CP1_CI_AI
NULL,
[VC_ACE_EXEMPLAR] varchar(10) COLLATE SQL_Latin1_General_CP1_CI_AI
NULL,
[VC_ACE_VOLUME] varchar(10) COLLATE SQL_Latin1_General_CP1_CI_AI NULL,
[NU_ACE_PERIODICO] varchar(10) COLLATE SQL_Latin1_General_CP1_CI_AI
NULL,
[VC_ACE_EDICAO] varchar(10) COLLATE SQL_Latin1_General_CP1_CI_AI NULL,
[ID_EDI] int NULL,
[ID_CLA] int NULL,
[ID_TDI] int NULL,
[ID_IDI] int NULL,
[NU_ACE_ANODAEDICAO] int NULL,
http://www.alvarofpinheiro.eti.br
Exercício
[NU_ACE_NUMPAGINAS] int NULL,
[VC_ACE_CUTTER] varchar(25) COLLATE SQL_Latin1_General_CP1_CI_AI NULL,
[VC_ACE_CDU] varchar(25) COLLATE SQL_Latin1_General_CP1_CI_AI NULL,
[VC_ACE_ISBN] varchar(25) COLLATE SQL_Latin1_General_CP1_CI_AI NULL,
[VC_ACE_ISNN] varchar(25) COLLATE SQL_Latin1_General_CP1_CI_AI NULL,
[BI_ACE_CAPA] image NULL,
[NU_ACE_CAPA] bigint NULL,
[VC_ACE_CAPA] varchar(50) COLLATE SQL_Latin1_General_CP1_CI_AI NULL,
[VC_ACE_DIGITALIZACAO] varchar(100) COLLATE SQL_Latin1_General_CP1_CI_AI
NULL,
CONSTRAINT [PK_BIBLIO_ACERVO] PRIMARY KEY CLUSTERED ([ID_ACE]),
CONSTRAINT [FK_BIBLIO_ACERVO_BIBLIO_CLASSIFICACAOLITERARIA]
FOREIGN KEY ([ID_CLA]) REFERENCES [dbo].[BIBLIO_CLASSIFICACAOLITERARIA]
([ID_CLA]) ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT [FK_BIBLIO_ACERVO_BIBLIO_EDITORAS] FOREIGN KEY ([ID_EDI])
REFERENCES [dbo].[BIBLIO_EDITORAS] ([ID_EDI]) ON UPDATE CASCADE ON
DELETE CASCADE,
CONSTRAINT [FK_BIBLIO_ACERVO_BIBLIO_IDIOMAS] FOREIGN KEY ([ID_IDI])
REFERENCES [dbo].[BIBLIO_IDIOMAS] ([ID_IDI]) ON UPDATE CASCADE ON
DELETE CASCADE,
http://www.alvarofpinheiro.eti.br
Exercício
CONSTRAINT [FK_BIBLIO_ACERVO_BIBLIO_TIPOSDEITENS] FOREIGN KEY
([ID_TDI]) REFERENCES [dbo].[BIBLIO_TIPOSDEITENS] ([ID_TDI]) ON UPDATE
CASCADE ON DELETE CASCADE
)
ON [PRIMARY]
GO
CREATE TABLE [dbo].[BIBLIO_EMPRESTIMOS] (
[ID_EMP] int IDENTITY(1, 1) NOT NULL,
[ID_PES] int NOT NULL,
[ID_ACE] int NOT NULL,
[DT_EMP_EMPRESTIMO] varchar(10) COLLATE SQL_Latin1_General_CP1_CI_AI
NULL,
[DT_EMP_DEVOLUCAO] varchar(10) COLLATE SQL_Latin1_General_CP1_CI_AI
NULL,
CONSTRAINT [PK_BIBLIO_EMPRESTIMOS] PRIMARY KEY CLUSTERED
([ID_EMP])
)
ON [PRIMARY]
GO
http://www.alvarofpinheiro.eti.br
Exercício
--Questões
--1.Mostre os livros que tem ano de edição superior a 2000. (0,5)
SELECT ID_ACE, VC_ACE_TITULODAOBRA, NU_ACE_ANODAEDICAO
FROM BIBLIO_ACERVO
WHERE NU_ACE_ANODAEDICAO > 2000
ORDER BY NU_ACE_ANODAEDICAO;
--2.Mostre os livros cujos os títulos iniciem com A, E ou O. (0,5)
SELECT ID_ACE, VC_ACE_TITULODAOBRA
FROM BIBLIO_ACERVO
WHERE (VC_ACE_TITULODAOBRA LIKE 'A%')
OR (VC_ACE_TITULODAOBRA LIKE 'E%') OR
(VC_ACE_TITULODAOBRA LIKE 'O%');
--3.Mostre os livros que possuem apenas um autor. (0,5)
SELECT ACE.ID_ACE, ACE.VC_ACE_TITULODAOBRA, AUT.VC_AUT_NOME
FROM BIBLIO_ACERVOAUTORES AA
INNER JOIN BIBLIO_ACERVO ACE ON ACE.ID_ACE = AA.ID_ACE
INNER JOIN BIBLIO_AUTORES AUT ON AUT.ID_AUT = AA.ID_AUT
http://www.alvarofpinheiro.eti.br
Exercício
--4.Mostre os livros e o nomes dos autores das editoras de código 1, 2, 3 ou 4.
(0,5)
SELECT ACE.ID_ACE, ACE.VC_ACE_TITULODAOBRA, AUT.VC_AUT_NOME
FROM BIBLIO_ACERVOAUTORES AA
INNER JOIN BIBLIO_ACERVO ACE ON ACE.ID_ACE = AA.ID_ACE
INNER JOIN BIBLIO_AUTORES AUT ON AUT.ID_AUT = AA.ID_AUT
WHERE ACE.ID_EDI IN (1,2,3,4);
--5.Quais livros são encontrados nos gêneros ficção e romance, e quantos livros
desses livros existem por ano de edição. (0,5)
SELECT G.VC_CLA_NOME, A.NU_ACE_ANODAEDICAO, COUNT(A.ID_ACE) AS
QTDE
FROM BIBLIO_ACERVO A
INNER JOIN BIBLIO_CLASSIFICACAOLITERARIA G ON A.ID_CLA = G.ID_CLA
WHERE (G.VC_CLA_NOME LIKE '%FICÇÃO%')
OR (G.VC_CLA_NOME LIKE '%ROMANCE%')
GROUP BY G.VC_CLA_NOME, A.NU_ACE_ANODAEDICAO;
http://www.alvarofpinheiro.eti.br
Exercício
--6.Mostre os 10 livros que mais empréstimo possuem. (0,5)
SELECT TOP 10 A.ID_ACE, A.VC_ACE_TITULODAOBRA, COUNT(E.ID_EMP) AS
QTDE
FROM BIBLIO_EMPRESTIMOS E
INNER JOIN BIBLIO_ACERVO A ON E.ID_ACE = A.ID_ACE
GROUP BY A.ID_ACE, A.VC_ACE_TITULODAOBRA;
--7.Mostre todos os livros por tipo de itens. (0,5)
SELECT T.VC_TDI_ITEM, A.VC_ACE_TITULODAOBRA
FROM BIBLIO_ACERVO A
INNER JOIN BIBLIO_TIPOSDEITENS T ON A.ID_TDI = T.ID_TDI
ORDER BY 1,2;
http://www.alvarofpinheiro.eti.br
Exercício
--8.Mostre a quantidade de livros no acervo, quantos foram emprestados e
devolvidos no ano corrente. (0,5)
SELECT 'QTDE LIVROS NO ACERVO' AS TITULO, COUNT(A.ID_ACE) AS QTDE
FROM BIBLIO_ACERVO A
UNION
SELECT 'QTDE LIVROS EMPRESTADOS' AS TITULO, COUNT(E.ID_EMP) AS QTDE
FROM BIBLIO_EMPRESTIMOS E WHERE
CAST(SUBSTRING(E.DT_EMP_EMPRESTIMO, 7,4) AS INTEGER) =
YEAR(GETDATE())
UNION
SELECT 'QTDE LIVROS DEVOLVIDOS' AS TITULO, COUNT(E.ID_EMP) AS QTDE
FROM BIBLIO_EMPRESTIMOS E WHERE
CAST(SUBSTRING(E.DT_EMP_DEVOLUCAO, 7,4) AS INTEGER) =
YEAR(GETDATE());
--9.Mostre os gêneros que não possuem livros cadastrados. (0,5)
SELECT G.ID_CLA, G.VC_CLA_NOME
FROM BIBLIO_CLASSIFICACAOLITERARIA G
WHERE G.ID_CLA NOT IN
(SELECT DISTINCT A.ID_CLA FROM BIBLIO_ACERVO A)
http://www.alvarofpinheiro.eti.br
Exercício
--10.Mostre a média de empréstimo de livros por mês. (0,5)
SELECT SUBSTRING(E.DT_EMP_EMPRESTIMO,7,4) AS ANO,
SUBSTRING(E.DT_EMP_EMPRESTIMO,4,2) AS MES, AVG(E.ID_EMP) AS MEDIA
FROM BIBLIO_EMPRESTIMOS E
GROUP BY SUBSTRING(E.DT_EMP_EMPRESTIMO,7,4),
SUBSTRING(E.DT_EMP_EMPRESTIMO,4,2);
--11.Mostre os livros com a descrição de finos os que possuem até 100 páginas,
médios os que estejam entre 100 e 300 e grossos com mais de 300 páginas. (0,5)
SELECT A.ID_ACE, A.VC_ACE_TITULODAOBRA, A.NU_ACE_NUMPAGINAS,
CASE
WHEN A.NU_ACE_NUMPAGINAS < 100 THEN 'FINOS'
WHEN A.NU_ACE_NUMPAGINAS BETWEEN 100 AND 300 THEN 'MÉDIOS'
ELSE 'GROSSOS'
END AS ESPESSURA
FROM BIBLIO_ACERVO A;
http://www.alvarofpinheiro.eti.br
Exercício
--12.Mostre os livros por gênero com quantidade de empréstimos maior que 100.
(0,5)
SELECT G.VC_CLA_NOME, COUNT(E.ID_EMP) AS QTDE
FROM BIBLIO_ACERVO A
INNER JOIN BIBLIO_CLASSIFICACAOLITERARIA G ON A.ID_CLA = G.ID_CLA
INNER JOIN BIBLIO_EMPRESTIMOS E ON A.ID_ACE = E.ID_ACE
GROUP BY G.VC_CLA_NOME
HAVING COUNT(E.ID_EMP) > 100;
--13.Mostre os livros agrupados gênero e idioma. (0,5)
SELECT G.VC_CLA_NOME, I.VC_IDI_NOME
FROM BIBLIO_ACERVO A
INNER JOIN BIBLIO_CLASSIFICACAOLITERARIA G ON A.ID_CLA = G.ID_CLA
INNER JOIN BIBLIO_IDIOMAS I ON A.ID_IDI = I.ID_IDI
GROUP BY G.VC_CLA_NOME, I.VC_IDI_NOME;
http://www.alvarofpinheiro.eti.br
Exercício
--14.Mostre os 2 idiomas que possuem livros que mais são emprestados. (0,5)
SELECT TOP 2 I.VC_IDI_NOME, COUNT(E.ID_EMP)
FROM BIBLIO_ACERVO A
INNER JOIN BIBLIO_IDIOMAS I ON A.ID_IDI = I.ID_IDI
INNER JOIN BIBLIO_EMPRESTIMOS E ON A.ID_ACE = E.ID_ACE
GROUP BY I.VC_IDI_NOME
ORDER BY 2 DESC;
--15.Mostre os livros que não possuem classificação literária. (0,5)
SELECT A.VC_ACE_TITULODAOBRA
FROM BIBLIO_ACERVO A
WHERE ID_CLA IS NULL;
--16.Mostre os livros que nunca foram emprestados. (0,5)
SELECT A.VC_ACE_TITULODAOBRA
FROM BIBLIO_ACERVO A
WHERE A.ID_ACE NOT IN
(SELECT E.ID_ACE FROM BIBLIO_EMPRESTIMOS E);
http://www.alvarofpinheiro.eti.br
Exercício
--17.Mostre os livros por quantidade de gêneros e o total de livros no acervo. (0,5)
SELECT G.VC_CLA_NOME, COUNT(A.ID_ACE) AS QTDE
FROM BIBLIO_ACERVO A
INNER JOIN BIBLIO_CLASSIFICACAOLITERARIA G ON A.ID_CLA = G.ID_CLA
GROUP BY G.VC_CLA_NOME
UNION
SELECT 'TOTAL', COUNT(A.ID_ACE) AS QTDE
FROM BIBLIO_ACERVO A;
--18.Mostre os livros que tenham no mínimo um empréstimo. (0,5)
SELECT A.VC_ACE_TITULODAOBRA
FROM BIBLIO_ACERVO A
INNER JOIN BIBLIO_EMPRESTIMOS E ON A.ID_ACE = E.ID_ACE;
--19.Exibir a quantidade de livros agrupado por idioma com a quantidade menor
que 60. (0,5)
SELECT I.VC_IDI_NOME, COUNT(A.ID_ACE) AS QTDE
FROM BIBLIO_ACERVO A
INNER JOIN BIBLIO_IDIOMAS I ON A.ID_IDI = I.ID_IDI
GROUP BY I.VC_IDI_NOME
HAVING COUNT(A.ID_ACE) < 60;
http://www.alvarofpinheiro.eti.br
Exercício
--20.Quais os livros estão em atraso nas devoluções (prazo de 5 dias para
devolução). (0,5)
SELECT A.VC_ACE_TITULODAOBRA
FROM BIBLIO_ACERVO A
INNER JOIN BIBLIO_EMPRESTIMOS E ON A.ID_ACE = E.ID_ACE
WHERE GETDATE() > (CAST(E.DT_EMP_EMPRESTIMO AS DATETIME) + 5)
AND E.DT_EMP_DEVOLUCAO IS NULL;

Mais conteúdo relacionado

Mais procurados

Mais procurados (9)

Conceitos inicias de banco de dados Mysql
Conceitos inicias de banco de dados MysqlConceitos inicias de banco de dados Mysql
Conceitos inicias de banco de dados Mysql
 
2011 01-18 mongo-db
2011 01-18 mongo-db2011 01-18 mongo-db
2011 01-18 mongo-db
 
Sql - introdução
Sql -  introduçãoSql -  introdução
Sql - introdução
 
Tipos de dados em MySQL
Tipos de dados em MySQLTipos de dados em MySQL
Tipos de dados em MySQL
 
Aula2 - SQL
Aula2 - SQLAula2 - SQL
Aula2 - SQL
 
Banco de Dados Relacional Estendido
Banco de Dados Relacional EstendidoBanco de Dados Relacional Estendido
Banco de Dados Relacional Estendido
 
Banco de Dados XML
Banco de Dados XMLBanco de Dados XML
Banco de Dados XML
 
Banco de Dados - MySQL Basico
Banco de Dados - MySQL BasicoBanco de Dados - MySQL Basico
Banco de Dados - MySQL Basico
 
SQL DDL
SQL DDLSQL DDL
SQL DDL
 

Destaque

Cp r75 firewall_admin_guide
Cp r75 firewall_admin_guideCp r75 firewall_admin_guide
Cp r75 firewall_admin_guideAnh Thảo
 
Presentation cisco iron port e-mail security solution
Presentation   cisco iron port e-mail security solutionPresentation   cisco iron port e-mail security solution
Presentation cisco iron port e-mail security solutionxKinAnx
 
Instalación Firewall Checkpoint R70
Instalación Firewall Checkpoint R70Instalación Firewall Checkpoint R70
Instalación Firewall Checkpoint R70symple9
 
BANCO DE DADOS RELACIONAIS
BANCO DE DADOS RELACIONAIS BANCO DE DADOS RELACIONAIS
BANCO DE DADOS RELACIONAIS Antonio Pedro
 
Presentation cisco iron port email & web security
Presentation   cisco iron port email & web securityPresentation   cisco iron port email & web security
Presentation cisco iron port email & web securityxKinAnx
 
Web Security Deployment
Web Security DeploymentWeb Security Deployment
Web Security DeploymentCisco Canada
 
Check point presentation june 2014
Check point presentation june 2014Check point presentation june 2014
Check point presentation june 2014David Berkelmans
 
Banco de Dados Não Relacionais vs Banco de Dados Relacionais
Banco de Dados Não Relacionais vs Banco de Dados RelacionaisBanco de Dados Não Relacionais vs Banco de Dados Relacionais
Banco de Dados Não Relacionais vs Banco de Dados Relacionaisalexculpado
 

Destaque (20)

A Certificação LPI
A Certificação LPIA Certificação LPI
A Certificação LPI
 
Cp r75 firewall_admin_guide
Cp r75 firewall_admin_guideCp r75 firewall_admin_guide
Cp r75 firewall_admin_guide
 
Postgre sql +python
Postgre sql +pythonPostgre sql +python
Postgre sql +python
 
Apostila para Hackers Iniciantes
Apostila para Hackers IniciantesApostila para Hackers Iniciantes
Apostila para Hackers Iniciantes
 
Presentation cisco iron port e-mail security solution
Presentation   cisco iron port e-mail security solutionPresentation   cisco iron port e-mail security solution
Presentation cisco iron port e-mail security solution
 
Instalación Firewall Checkpoint R70
Instalación Firewall Checkpoint R70Instalación Firewall Checkpoint R70
Instalación Firewall Checkpoint R70
 
Treinamento DBA Essential
Treinamento DBA EssentialTreinamento DBA Essential
Treinamento DBA Essential
 
BANCO DE DADOS RELACIONAIS
BANCO DE DADOS RELACIONAIS BANCO DE DADOS RELACIONAIS
BANCO DE DADOS RELACIONAIS
 
Check Point designing a security
Check Point designing a securityCheck Point designing a security
Check Point designing a security
 
Check Point sizing security
Check Point sizing securityCheck Point sizing security
Check Point sizing security
 
Check Point Virtual Systems
Check Point Virtual SystemsCheck Point Virtual Systems
Check Point Virtual Systems
 
Presentation cisco iron port email & web security
Presentation   cisco iron port email & web securityPresentation   cisco iron port email & web security
Presentation cisco iron port email & web security
 
Web Security Deployment
Web Security DeploymentWeb Security Deployment
Web Security Deployment
 
Checkpoint r77
Checkpoint r77Checkpoint r77
Checkpoint r77
 
Check point presentation june 2014
Check point presentation june 2014Check point presentation june 2014
Check point presentation june 2014
 
IronPort
IronPortIronPort
IronPort
 
Banco de Dados Não Relacionais vs Banco de Dados Relacionais
Banco de Dados Não Relacionais vs Banco de Dados RelacionaisBanco de Dados Não Relacionais vs Banco de Dados Relacionais
Banco de Dados Não Relacionais vs Banco de Dados Relacionais
 
Linux para leigos
Linux para leigos Linux para leigos
Linux para leigos
 
Check Point NGFW
Check Point NGFWCheck Point NGFW
Check Point NGFW
 
checkpoint
checkpointcheckpoint
checkpoint
 

Semelhante a Fundamentos de Banco de Dados Relacionais

Semelhante a Fundamentos de Banco de Dados Relacionais (20)

6338 111121071604-phpapp01
6338 111121071604-phpapp016338 111121071604-phpapp01
6338 111121071604-phpapp01
 
modulo-15-sql-criar-e-manipular-tabelas1-2-flipbook-pdf.docx
modulo-15-sql-criar-e-manipular-tabelas1-2-flipbook-pdf.docxmodulo-15-sql-criar-e-manipular-tabelas1-2-flipbook-pdf.docx
modulo-15-sql-criar-e-manipular-tabelas1-2-flipbook-pdf.docx
 
Sql
SqlSql
Sql
 
Banco de dados aula 4
Banco de dados aula 4Banco de dados aula 4
Banco de dados aula 4
 
SQL Server Heterogêneo: SQL Server + BigData
SQL Server Heterogêneo: SQL Server + BigDataSQL Server Heterogêneo: SQL Server + BigData
SQL Server Heterogêneo: SQL Server + BigData
 
Apostila curso php_my_sql(portugues)
Apostila curso php_my_sql(portugues)Apostila curso php_my_sql(portugues)
Apostila curso php_my_sql(portugues)
 
Apostila Curso Php My Sql(Portugues)
Apostila Curso Php My Sql(Portugues)Apostila Curso Php My Sql(Portugues)
Apostila Curso Php My Sql(Portugues)
 
Minicurso PostgreSQl
Minicurso PostgreSQlMinicurso PostgreSQl
Minicurso PostgreSQl
 
Php curso de php com my sql
Php   curso de php com my sqlPhp   curso de php com my sql
Php curso de php com my sql
 
Mongoengine
MongoengineMongoengine
Mongoengine
 
MySQL - Instalação e Alguns comandos de Banco de Dados
MySQL - Instalação e Alguns comandos de Banco de DadosMySQL - Instalação e Alguns comandos de Banco de Dados
MySQL - Instalação e Alguns comandos de Banco de Dados
 
Xml pucminas2013
Xml pucminas2013Xml pucminas2013
Xml pucminas2013
 
Bd ii material
Bd ii   materialBd ii   material
Bd ii material
 
Sql01
Sql01Sql01
Sql01
 
Aula2
Aula2Aula2
Aula2
 
Aula 11 banco de dados
Aula 11   banco de dadosAula 11   banco de dados
Aula 11 banco de dados
 
Boa apostila sql
Boa  apostila sqlBoa  apostila sql
Boa apostila sql
 
Aula 11 banco de dados
Aula 11   banco de dadosAula 11   banco de dados
Aula 11 banco de dados
 
Progweb Aula7
Progweb Aula7Progweb Aula7
Progweb Aula7
 
Aula VHDL
Aula VHDLAula VHDL
Aula VHDL
 

Mais de Álvaro Farias Pinheiro

Introdução à Sistemas de Informação
Introdução à Sistemas de InformaçãoIntrodução à Sistemas de Informação
Introdução à Sistemas de InformaçãoÁlvaro Farias Pinheiro
 
Medida de Esforço de Software com Análise de Ponto de Função
Medida de Esforço de Software com Análise de Ponto de FunçãoMedida de Esforço de Software com Análise de Ponto de Função
Medida de Esforço de Software com Análise de Ponto de FunçãoÁlvaro Farias Pinheiro
 
Fundamentos de Padrões de Projeto de Software
Fundamentos de Padrões de Projeto de SoftwareFundamentos de Padrões de Projeto de Software
Fundamentos de Padrões de Projeto de SoftwareÁlvaro Farias Pinheiro
 
Programação Orientada a Objetos com Java
Programação Orientada a Objetos com JavaProgramação Orientada a Objetos com Java
Programação Orientada a Objetos com JavaÁlvaro Farias Pinheiro
 
Metodologias de Desenvolvimento de Software
Metodologias de Desenvolvimento de SoftwareMetodologias de Desenvolvimento de Software
Metodologias de Desenvolvimento de SoftwareÁlvaro Farias Pinheiro
 

Mais de Álvaro Farias Pinheiro (18)

Data science
Data scienceData science
Data science
 
IA
IAIA
IA
 
Autômatos
AutômatosAutômatos
Autômatos
 
Paradigma Orientado a Objetos
Paradigma Orientado a ObjetosParadigma Orientado a Objetos
Paradigma Orientado a Objetos
 
Padrões de Projeto (GoF)
Padrões de Projeto (GoF)Padrões de Projeto (GoF)
Padrões de Projeto (GoF)
 
Linguagem de Modelagem Unificada (UML)
Linguagem de Modelagem Unificada (UML)Linguagem de Modelagem Unificada (UML)
Linguagem de Modelagem Unificada (UML)
 
Introdução a Tecnologias Web
Introdução a Tecnologias WebIntrodução a Tecnologias Web
Introdução a Tecnologias Web
 
Introdução ao HTML
Introdução ao HTMLIntrodução ao HTML
Introdução ao HTML
 
Introdução à Sistemas de Informação
Introdução à Sistemas de InformaçãoIntrodução à Sistemas de Informação
Introdução à Sistemas de Informação
 
Análise e Modelagem com UML
Análise e Modelagem com UMLAnálise e Modelagem com UML
Análise e Modelagem com UML
 
Eficiência Energética
Eficiência EnergéticaEficiência Energética
Eficiência Energética
 
Fundamentos da Engenharia de Software
Fundamentos da Engenharia de SoftwareFundamentos da Engenharia de Software
Fundamentos da Engenharia de Software
 
Fundamentos de Testes de Software
Fundamentos de Testes de SoftwareFundamentos de Testes de Software
Fundamentos de Testes de Software
 
Medida de Esforço de Software com Análise de Ponto de Função
Medida de Esforço de Software com Análise de Ponto de FunçãoMedida de Esforço de Software com Análise de Ponto de Função
Medida de Esforço de Software com Análise de Ponto de Função
 
Fundamentos de Padrões de Projeto de Software
Fundamentos de Padrões de Projeto de SoftwareFundamentos de Padrões de Projeto de Software
Fundamentos de Padrões de Projeto de Software
 
Programação Orientada a Objetos com Java
Programação Orientada a Objetos com JavaProgramação Orientada a Objetos com Java
Programação Orientada a Objetos com Java
 
Metodologias de Desenvolvimento de Software
Metodologias de Desenvolvimento de SoftwareMetodologias de Desenvolvimento de Software
Metodologias de Desenvolvimento de Software
 
Redes Sociais
Redes SociaisRedes Sociais
Redes Sociais
 

Fundamentos de Banco de Dados Relacionais

  • 2. Objetivos ●Visão abrangente da Linguagem SQL e suas extensões; ●Conhecimento dos conceitos de banco de dados relacionais; ●Conhecimento detalhado dos comandos SQL ANSI; ●Apresentação de ferramentas para manipulação de SQL; ●Conhecimento dos comandos DDL, DML, DCL, DTL e DQL; ●Criação de consultas complexas; ●Otimização de consultas; e ●Utilização de SQL Embutido. http://www.alvarofpinheiro.eti.br
  • 3. Referências ●HEUSER, Carlos. Projeto de Banco de Dados. Porto Alegre: Editora Sagra, 1998. ●DATE, C. Introdução a Sistemas de Banco de Dados. São Paulo: Editora Campos, 2008. ●XAVIER, Fabrício. SQL dos Conceitos às Consultas Complexas. São Paulo: Editora Ciência Moderna, 2009. ●OLIVEIRA, Haley. Postgresql 8 Referencia. The PostgreSQL Global Development Group, 2005. ●OLIVEIRA, Haley. Postgresql 8 Tutorial. The PostgreSQL Global Development Group, 2005. ●MISTRY, Ross. Introducing Microsoft SQL Server 2008 R2. Washington: Microsoft Press, 2010. ●ORACLE. MySQL 5.5 Reference Guide. 2011 http://www.alvarofpinheiro.eti.br
  • 4. SQL Definições ●Linguagem de Consulta Estruturada é uma linguagem de pesquisa declarativa para banco de dados relacional baseadas na álgebra relacional. ●O SQL surgiu na década de 70 na IBM baseado no modelo relacional de Codd. É o padrão para banco de dados relacionais e é mantido pela American National Standards Institute (ANSI) e International Standards Organization (ISO). Existindo várias versões revisadas do SQL ANSI/ISO, as quais são: 1986, 1987, 1992, 1999 e 2003. E além desses padronizações, existem as extensões inseridas pelos desenvolvedores de banco de dados. http://www.alvarofpinheiro.eti.br
  • 5. Características: Pode ser utilizado por uma grande faixa de usuários, mesmo com pouca experiência em programação; É uma linguagem não procedural; Reduz o tempo necessário para a criação e manutenção de sistemas; É uma linguagem similar ao inglês. SQL http://www.alvarofpinheiro.eti.br
  • 6. o Create Table o Create Index o Alter Table o Insert o Update o Delete o Select o Projeção o Seleção o Junção o Consulta Básica o Alias o Campos Calculados o Valores Nulos o Duplicidade Linguagem http://www.alvarofpinheiro.eti.br
  • 7. o Condicionamento o Ordenação o Funções o Funções Unica Linha o Funções de Grupo o Funções Caractere o Funções Numérica o Funções Data o Funções Aninhamento o Funções Conversão o CASE o Produto Cartesiano o Equijunção o Não-equijunção o Junção externa o Autojunção o Aninhamento de Grupo de Dados o Subconsultas Linguagem http://www.alvarofpinheiro.eti.br
  • 8. o Grupo de Dados o Grupo de Dados com ROLLUP o Grupo de Dados com CUBE o Subconsultas com ANY o Subconsultas com ALL o Subconsultas Correlatas o Subconsultas com EXISTS o União o Intersecção o Subtração o Macrosubstituição o Seleção de Seleção o Análise Top-N o Transações o Visões o Visões Simples o Visões Complexas Linguagem http://www.alvarofpinheiro.eti.br
  • 9. o Data Definition Language (DDL)  (Create ..., Drop ..., Alter ...); o Data Manipulation Language (DML)  (Insert ..., Update ..., Delete ...); o Data Query Language (DQL)  (Select ...); o Data Transaction Language (DTL)  (Savepoint ..., Rollback ..., Commit ...); o Data Control Language (DCL)  (Grant ..., Revoke ...); SQL Categorias http://www.alvarofpinheiro.eti.br
  • 10. SQL Data Definition Language (DDL) ●Comandos para definição de estruturas de dados, também conhecidos como metadados: ●CREATE TABLE ●CREATE INDEX ●CREATE VIEW ●DROP TABLE ●DROP INDEX ●DROP VIEW ●ALTER TABLE http://www.alvarofpinheiro.eti.br
  • 11. SQL Data Definition Language (DDL) ●Constraints: ●UNIQUE ●PRIMARY KEY ●FOREIGN KEY ●Rules: ●RESTRICT ●CASCADE http://www.alvarofpinheiro.eti.br
  • 12. SQL Data Manipulation Language (DML) ●Comandos usados para manutenção dos dados: ●INSERT ●UPDATE ●DELETE http://www.alvarofpinheiro.eti.br
  • 13. SQL Data Query Language (DQL) ●Comando para consultas de dados: ●SELECT http://www.alvarofpinheiro.eti.br
  • 14. SQL Data Transaction Language (DTL) ●Comandos para controle de transações: ●BEGIN TRANSACTION | START TRANSACTION ●COMMIT ●ROLLBACK http://www.alvarofpinheiro.eti.br
  • 15. SQL Data Control Language (DCL) ●Comando para autorização de acesso aos dados: ●GRANT ●REVOKE http://www.alvarofpinheiro.eti.br
  • 16. SQL Argumento do SELECT ●SELECT ●FROM ●IN ●JOIN ●WHERE ●GROUP BY ●HAVING ●ORDER BY http://www.alvarofpinheiro.eti.br
  • 18. SQL Operadores de Comparação < <= > >= = != IS NULL LIKE IN BETWEEN EXISTS http://www.alvarofpinheiro.eti.br
  • 22. ●SQLServer o Usuário: sa; Senha: senha definida. ●Postgre  Usuário: root; Senha: sem senha. ●Oracle o Usuário: SYSTEM; Senha: manager. ●MySQL  Usuário: root; Senha: sem senha. ●Firebird  Usuário: sysdba; Senha: masterkey. BD Acesso http://www.alvarofpinheiro.eti.br
  • 23. TINYINT: Armazena valores numéricos inteiros. SMALLINT: Armazena valores numéricos inteiros. INT: Armazena valores numéricos inteiros. BIGINT: Armazena valores numéricos inteiros. NUMERIC(18,0): Armazena valores numéricos com casas decimais, utilizando precisão. DECIMAL(18,0): Tem as mesmas funcionalidades do tipo NUMERIC. FLOAT: Armazena valores numéricos aproximados com precisão de ponto flutuante. REAL: Armazena valores numéricos aproximados com precisão de ponto flutuante. BIT: Armazena bits ou seja somente poderá conter os valores lógicos 0 ou 1. SMALLDATETIME: Armazena data e hora, com precisão de minutos. DATETIME: Armazena data e hora, com precisão de centésimos de segundos. TIME: Armazena somente hora. Pode armazenar segundos até a fração de 9999999 DATE: Armazena somente data. CHAR(N): Armazena N caracteres fixos (até 8.000) no formato não Unicode, com espaços em branco. VARCHAR(N): Armazena N caracteres (até 8.000) no formato não Unicode TEXT: Armazena caracteres no formato não Unicode. NCHAR(N): Armazena N caracteres fixos (até 4.000) no formato Unicode, com espaços em branco. NVARCHAR(N): Armazena N caracteres (até 4.000) no formato Unicode. NTEXT: Armazena caracteres no formato Unicode. IMAGE: Armazena dados no formato binário. BD SQLServer (Principais Tipos de Dados) http://www.alvarofpinheiro.eti.br
  • 24. BD Postgre (Principais Tipos de Dados) bigint: inteiro de oito bytes com sinal. bit: cadeia de bits de comprimento fixo. varbit(n): cadeia de bits de comprimento variável. Bool: booleano lógico (verdade/falso). bytea: dados binários. varchar(n): cadeia de caracteres de comprimento variável. char(n): cadeia de caracteres de comprimento fixo. date: data de calendário (ano, mês,dia). float8: número de ponto flutuante de precisão dupla. Int: inteiro de quatro bytes com sinal. numeric[(p, s)]: numérico exato com precisão selecionável. decimal [(p, s)] : numérico exato com precisão selecionável. real: número de ponto flutuante de precisão simples. smallint: inteiro de dois bytes com sinal. text: cadeia de caracteres de comprimento variável. time: hora do dia. timestamp: data e hora. http://www.alvarofpinheiro.eti.br
  • 25. BD Oracle (Principais Tipos de Dados) VARCHAR2(n): Conjunto de caracteres de tamanho variável. NUMBER(p, e): Representa um número. LONG: Conjunto de caracteres de tamanho variável. DATE: Um valor de data. LONG RAW: Dados binários.. CHAR(n): Conjunto de caracteres de tamanho fixo. BLOB, CLOB, NCLOB e BFILE: Tipos de dados para conteúdos binários.. http://www.alvarofpinheiro.eti.br
  • 26. BD MySQL (Principais Tipos de Dados) BOOL: Booleano. SMALLINT: inteiros pequenos. INT: inteiros regulares. INTEGER: o mesmo que INT. BIGINT: inteiros grandes. FLOAT(precisão): números de ponto flutuante de precisão simples ou dupla. DOUBLE: números de ponto flutuante de precisão dupla. DECIMAL[(M,D)]: número de ponto flutuante armazenado como char. DATE: data. Exibido como YYYY-MM-DD. TIME: hora. Exibido como HH:MM:SS. DATETIME: data e hora. Exibido como YYYY-MM-DD HH:MM:SS. CHAR: o mesmo que CHAR(1). VARCHAR(n): variável string de tamanho variável. TINYBLOB: BLOB pequeno. TINYTEXT: TEXT pequeno. BLOB: BLOB normal. TEXT: TEXT normal. LONGBLOB: BLOB longo. LONGTEXT: TEXT longo. http://www.alvarofpinheiro.eti.br
  • 27. CREATE TABLE nome_tabela [(definição_create,...)] [table_options] [select_statement] definição_create: nome_coluna tipo [NOT NULL | NULL] [DEFAULT valor_padrão] [[PRIMARY] KEY] | [CONSTRAINT [symbol]] PRIMARY KEY (index_col_name,...) | INDEX [nome_indice] (index_nome_coluna,...) | [CONSTRAINT [symbol]] UNIQUE [INDEX] [index_name] (index_col_name,...) | [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,...) definição_referência: REFERENCES nome_tabela [(index_nome_coluna,...)] [ON DELETE opção_referência] [ON UPDATE opção_referência] opção_referência: RESTRICT | CASCADE | SET NULL | SET DEFAULT Criar Tabelas http://www.alvarofpinheiro.eti.br
  • 28. ●Dica: o É possível criar uma tabela a partir de uma subconsulta. ● CREATE TABLE tabela [coluna, ...] AS subconsulta; Criar Tabelas http://www.alvarofpinheiro.eti.br
  • 29. ●Tmp: o Número (PK). ●Cargo: o Número (PK), número inteiro, auto-incremento; o Nome, literal variável(30), não nulo. ●Departamento: o Número (PK), número inteiro; o Nome, literal variável(30), não nulo; o Fator, número real. ●Empregado: o Número (PK), numérico; o Nome, literal variável (50), não nulo; o Departamento, (FK) numérico,  atualização cascata, exclusão restrita. Criar Tabelas http://www.alvarofpinheiro.eti.br
  • 30. --SQLServer CREATE TABLE CARGO ( NUMERO INTEGER IDENTITY( 1, 1), NOME VARCHAR(30) NOT NULL, PRIMARY KEY (NUMERO) ); --Postgre|Oracle CREATE TABLE CARGO ( NUMERO INTEGER, NOME VARCHAR(30) NOT NULL, PRIMARY KEY (NUMERO) ); CREATE SEQUENCE CARGOSEQ INCREMENT BY 1 START WITH 1; Criar Tabelas (Autonumeração) http://www.alvarofpinheiro.eti.br
  • 31. --MySQL CREATE TABLE CARGO ( NUMERO INTEGER AUTO_INCREMENT, NOME VARCHAR(30) NOT NULL, PRIMARY KEY (NUMERO) ); --Firebird CREATE TABLE CARGO ( NUMERO INTEGER, NOME VARCHAR(30) NOT NULL, PRIMARY KEY (NUMERO) ); CREATE GENERATOR CARGOGEN; CREATE TRIGGER CARGOTRI FOR CARGO ACTIVE BEFORE INSERT POSITION 0 AS BEGIN NEW.NUMERO = GEN_ID(CARGOGEN, 1); END; Criar Tabelas (Autonumeração) http://www.alvarofpinheiro.eti.br
  • 32. CREATE TABLE TMP ( NUMERO INTEGER PRIMARY KEY ); CREATE TABLE DEPARTAMENTO ( NUMERO INTEGER, NOME VARCHAR(30) NOT NULL, FATOR DECIMAL(3,2), PRIMARY KEY (NUMERO) ); Criar Tabelas http://www.alvarofpinheiro.eti.br
  • 33. --SQLServer | Postgre | MySQL | Firebird CREATE TABLE EMPREGADO ( NUMERO INTEGER, NOME VARCHAR(50) NOT NULL, DEPARTAMENTO INTEGER, PRIMARY KEY (NUMERO), FOREIGN KEY (DEPARTAMENTO) REFERENCES DEPARTAMENTO (NUMERO) ON UPDATE CASCADE ); --Oracle CREATE TABLE EMPREGADO ( NUMERO INTEGER, NOME VARCHAR(50) NOT NULL, DEPARTAMENTO INTEGER, PRIMARY KEY (NUMERO), FOREIGN KEY (DEPARTAMENTO) REFERENCES DEPARTAMENTO (NUMERO) ); Criar Tabelas http://www.alvarofpinheiro.eti.br
  • 34. INSERT [INTO] nome_tabela [(nome_coluna,...)] VALUES ((expressão | DEFAULT),...),(...),... | [INTO] nome_tabela [(nome_coluna,...)] SELECT ... Inserir Linhas http://www.alvarofpinheiro.eti.br
  • 35. ●Dicas: o Pode-se inserir linha a linha; o Pode-se dependendo do BD inserir uma lista; o Pode-se inserir linhas de uma tabela em outra;  Não se usa a cláusula VALUE e sim SELECT. Inserir Linhas http://www.alvarofpinheiro.eti.br
  • 36. ●Cargo: o Número, Nome; o 1, Analista Trainee; o 2, Analista Junior; o 3, Analista Pleno; o 4, Analista Sênior; o 5, Analista Master. Inserir Registros http://www.alvarofpinheiro.eti.br
  • 37. --SQLServer | MySql | Firebird INSERT INTO CARGO (NOME) VALUES ('ANALISTA TRAINEE'); INSERT INTO CARGO (NOME) VALUES ('ANALISTA JUNIOR'); INSERT INTO CARGO (NOME) VALUES ('ANALISTA PLENO'); INSERT INTO CARGO (NOME) VALUES ('ANALISTA SÊNIOR'); INSERT INTO CARGO (NOME) VALUES ('ANALISTA MASTER'); INSERT INTO CARGO (NOME) VALUES ('CONSULTOR'); --Postgre INSERT INTO CARGO (NUMERO, NOME) VALUES (nextval('CARGOSEQ'), 'ANALISTA TRAINEE'); INSERT INTO CARGO (NUMERO, NOME) VALUES (nextval('CARGOSEQ'), 'ANALISTA JUNIOR'); INSERT INTO CARGO (NUMERO, NOME) VALUES (nextval('CARGOSEQ'), 'ANALISTA PLENO'); INSERT INTO CARGO (NUMERO, NOME) VALUES (nextval('CARGOSEQ'), 'ANALISTA SÊNIOR'); INSERT INTO CARGO (NUMERO, NOME) VALUES (nextval('CARGOSEQ'), 'ANALISTA MASTER'); INSERT INTO CARGO (NUMERO, NOME) VALUES (nextval('CARGOSEQ'), 'CONSULTOR'); --Oracle INSERT INTO CARGO (NUMERO, NOME) VALUES (CARGOSEQ.NextVal, 'ANALISTA TRAINEE'); INSERT INTO CARGO (NUMERO, NOME) VALUES (CARGOSEQ.NextVal, 'ANALISTA JUNIOR'); INSERT INTO CARGO (NUMERO, NOME) VALUES (CARGOSEQ.NextVal, 'ANALISTA PLENO'); INSERT INTO CARGO (NUMERO, NOME) VALUES (CARGOSEQ.NextVal, 'ANALISTA SÊNIOR'); INSERT INTO CARGO (NUMERO, NOME) VALUES (CARGOSEQ.NextVal, 'ANALISTA MASTER'); INSERT INTO CARGO (NUMERO, NOME) VALUES (CARGOSEQ.NextVal, 'CONSULTOR'); Inserir Linhas http://www.alvarofpinheiro.eti.br
  • 38. ●Departamento: o Número, Nome, Fator; o 10, Administração (Admin), 1.75; o 20, Marketing (Mkt), 1.85; o 50, Compras (Com), 2. 73; o 60, Tecnologia (Tec), 1.55; o 80, Vendas (Ven), 1.87; o 90, Executivo (Exec), 1.92; o 110, Contabilidade (Contab), 2.35; o 190, Contratos (Ctt), 2.23. Inserir Linhas http://www.alvarofpinheiro.eti.br
  • 39. INSERT INTO DEPARTAMENTO (NUMERO, NOME, FATOR) VALUES (10, 'ADMINISTRAÇÃO (ADMIN)', 1.75); INSERT INTO DEPARTAMENTO (NUMERO, NOME, FATOR) VALUES (20, 'MARKETING (MKT)', 1.85); INSERT INTO DEPARTAMENTO (NUMERO, NOME, FATOR) VALUES (50, 'COMPRAS (COM)', 2.73); INSERT INTO DEPARTAMENTO (NUMERO, NOME, FATOR) VALUES (60, 'TECNOLOGIA (TEC)', 1.55); INSERT INTO DEPARTAMENTO (NUMERO, NOME, FATOR) VALUES (80, 'VENDAS (VEN)', 1.87); INSERT INTO DEPARTAMENTO (NUMERO, NOME, FATOR) VALUES (90, 'EXECUTIVO (EXEC)', 1.92); INSERT INTO DEPARTAMENTO (NUMERO, NOME, FATOR) VALUES (110, 'CONTABILIDADE (CONTAB)', 2.35); INSERT INTO DEPARTAMENTO (NUMERO, NOME, FATOR) VALUES (190, 'CONTRATOS (CTT)', 2.23); Inserir Linhas http://www.alvarofpinheiro.eti.br
  • 40. ●Empregados: o Número, Nome, Departamento; o 100, Antônio Palmeira, 10; o 101, José Figueira, 20; o 102, Maria Mangueira, 10; o 103, João Abacateiro, 50; o 104, Carlos Castanheiro, 60; o 107, Mônica Videira, 90; o 124, Pedro Laranjeira, 80; o 141, Tiago Pessegueiro, 110; o 142, Renata Videira, 80; o 143, Gabriel Macieira, 110; Inserir Linhas http://www.alvarofpinheiro.eti.br
  • 41. INSERT INTO EMPREGADO VALUES (100, 'ANTÔNIO PALMEIRA', 10); INSERT INTO EMPREGADO VALUES (101, 'JOSÉ FIGUEIRA', 20); INSERT INTO EMPREGADO VALUES (102, 'MARIA MANGUEIRA', 10); INSERT INTO EMPREGADO VALUES (103, 'JOÃO ABACATEIRO', 50); INSERT INTO EMPREGADO VALUES (104, 'CARLOS CASTANHEIRO', 60); INSERT INTO EMPREGADO VALUES (107, 'MÔNICA VIDEIRA', 90); INSERT INTO EMPREGADO VALUES (124, 'PEDRO LARANJEIRA', 80); INSERT INTO EMPREGADO VALUES (141, 'TIAGO PESSEGUEIRO', 110); INSERT INTO EMPREGADO VALUES (142, 'RENATA VIDEIRA', 80); INSERT INTO EMPREGADO VALUES (143, 'GABRIEL MACIEIRA', 110); Inserir Linhas http://www.alvarofpinheiro.eti.br
  • 42. ALTER TABLE nome_tbl especificação_alter [, especificação_alter ...] especificação_alter: ADD [COLUMN] definição_create [FIRST | AFTER nome_coluna ] | ADD [COLUMN] (definição_create, definição_create,...) | ADD INDEX [nome_indice] (index_nome_col,...) | ADD [CONSTRAINT [symbol]] PRIMARY KEY (index_col_name,...) | ADD [CONSTRAINT [symbol]] UNIQUE [index_name] (index_col_name,...) | ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,...) [definição_referncia] | ALTER [COLUMN] nome_col {SET DEFAULT literal | DROP DEFAULT} | CHANGE [COLUMN] nome_col_antigo definição_create [FIRST | AFTER nome_coluna] | MODIFY [COLUMN] definição_create [FIRST | AFTER nome_coluna] | DROP [COLUMN] nome_col | DROP PRIMARY KEY | DROP INDEX nome_indice | RENAME [TO] nome_nova_tbl | ORDER BY col Alterar Tabelas http://www.alvarofpinheiro.eti.br
  • 43. ●Empregados: Número (PK), número inteiro; Nome, literal variável (50), não nulo; excluir; Primeironome, literal variável (25), não nulo; Sobrenome, literal variável (25) não nulo; Departamento, (FK) número inteiro; Cargo, (FK) número inteiro, atualização cascata; Salário, número real; Comissão, número inteiro; Nascimento, data; Apelido, literal fixo(10), não nulo; Gerente, número inteiro. Alterar Tabelas http://www.alvarofpinheiro.eti.br
  • 44. --SQLServer ALTER TABLE EMPREGADO ADD PRIMEIRONOME VARCHAR(25), SOBRENOME VARCHAR(25), CARGO INTEGER, SALARIO REAL, COMISSAO INTEGER, NASCIMENTO DATE, APELIDO VARCHAR(10), GERENTE INTEGER; --Postgre | MySQL | Firebird ALTER TABLE EMPREGADO ADD PRIMEIRONOME VARCHAR(25), ADD SOBRENOME VARCHAR(25), ADD CARGO INTEGER, ADD SALARIO REAL, ADD COMISSAO INTEGER, ADD NASCIMENTO DATE, ADD APELIDO VARCHAR(10), ADD GERENTE INTEGER; Alterar Tabelas http://www.alvarofpinheiro.eti.br
  • 45. --Oracle ALTER TABLE EMPREGADO ADD (PRIMEIRONOME VARCHAR(25), SOBRENOME VARCHAR(25), CARGO INTEGER, SALARIO REAL, COMISSAO INTEGER, NASCIMENTO DATE, APELIDO VARCHAR(10), GERENTE INTEGER); Alterar Tabelas http://www.alvarofpinheiro.eti.br
  • 46. --SQLServer ALTER TABLE EMPREGADO ADD FOREIGN KEY (CARGO) REFERENCES CARGO (NUMERO) ON UPDATE CASCADE, FOREIGN KEY (GERENTE) REFERENCES EMPREGADO (NUMERO); --Postgre | MySQL | Firebird ALTER TABLE EMPREGADO ADD FOREIGN KEY (CARGO) REFERENCES CARGO (NUMERO) ON UPDATE CASCADE, ADD FOREIGN KEY (GERENTE) REFERENCES EMPREGADO (NUMERO); --Oracle ALTER TABLE EMPREGADO ADD FOREIGN KEY (CARGO) REFERENCES CARGO; ALTER TABLE EMPREGADO ADD FOREIGN KEY (GERENTE) REFERENCES EMPREGADO; Alterar Tabelas http://www.alvarofpinheiro.eti.br
  • 47. UPDATE nome_tabela SET nome_coluna1=expr1 [, nome_coluna2=expr2 ...] [WHERE definição] [ORDER BY ...] Alterar Linhas http://www.alvarofpinheiro.eti.br
  • 48. ●Pode-se alterar linha; ●Pode-se alterar listas; ●Pode-se alterar subconsultas; ●Pode-se alterar linhas com base em outra tabela. Alterar Linhas http://www.alvarofpinheiro.eti.br
  • 49. ●SQLServer | Postgre | MySQL | Firebird ● SUBSTRING(string texto, posicao_inicial, tamanho) - retorna uma string com o comprimento definido em "tamanho" extraida da string "texto", a partir da "posicao_inicial“; ● Oracle: SUBSTR ●SQLServer ● CHARINDEX( string pesquisado, campo, posicao_inicial) – retorna a posição do string pesquisado dentro do campo informado. ● Postgre: STRPOS ● Oracle | MySQL: INSTR ● Firebird: POSITION Funções http://www.alvarofpinheiro.eti.br
  • 50. ●Fazendo uso das funções substring e charindex separar o conteúdo do campo Nome nos campos Primeironome e Sobrenome. Depois apagar o campo Nome ficando: o Número, Primeironome, Sobrenome, Departamento; o 100, Antônio, Palmeira, 10; o 101, José, Figueira, 20; o 102, Maria, Mangueira, 10; o 103, João, Abacateiro, 50; o 104, Carlos, Castanheiro, 60; o 107, Mônica, Videira, 90; o 124, Pedro, Laranjeira, 80; o 141, Tiago, Pessegueiro, 80; o 142, Renata, Videira, 80; o 143, Gabriel, Macieira, 110; Alterar Linhas http://www.alvarofpinheiro.eti.br
  • 51. --SQLServer UPDATE EMPREGADO SET PRIMEIRONOME = SUBSTRING(NOME,1,CHARINDEX(' ',NOME)-1), SOBRENOME = SUBSTRING(NOME,CHARINDEX(' ',nome)+1,100); --Postgre UPDATE EMPREGADO SET PRIMEIRONOME = SUBSTRING(NOME,1,STRPOS(NOME, ' ')-1), SOBRENOME = SUBSTRING(NOME,STRPOS(NOME, ' ')+1,100); --Oracle UPDATE EMPREGADO SET PRIMEIRONOME = SUBSTR(NOME,1,INSTR(NOME, ' ')-1), SOBRENOME = SUBSTR(NOME,INSTR(NOME, ' ')+1,100); --MySQL UPDATE EMPREGADO SET PRIMEIRONOME = SUBSTRING(NOME,1,INSTR(NOME, ' ')-1), SOBRENOME = SUBSTRING(NOME,INSTR(NOME, ' ')+1,100); --Firebird UPDATE EMPREGADO SET PRIMEIRONOME = SUBSTRING(NOME FROM 1 FOR POSITION(' ', NOME)-1), SOBRENOME = SUBSTRING(NOME FROM POSITION(' ', NOME)+1 FOR 100); Alterar Linhas http://www.alvarofpinheiro.eti.br
  • 52. --SQLServer | Postgre | Oracle | MySQL ALTER TABLE EMPREGADO DROP COLUMN NOME; --Firebird ALTER TABLE EMPREGADO DROP NOME; Alterar Tabela http://www.alvarofpinheiro.eti.br
  • 53. ●Atualizar as linhas de Empregado com os valores: o Número, Primeironome, Sobrenome, Cargo, Departamento, Gerente, Salário, Comissão, Nascimento, Apelido; o 100, Antônio, Palmeira, 1, 10, nulo, 1000, nulo, 01/07/80, Tonho; o 101, José, Figueira, 1, 20, 100, 1500, nulo, 18/05/70, Zé; o 102, Maria, Mangueira, 2, 10, 100, 2000, 3, 22/07/80, Ma; o 103, João, Abacateiro, 3, 50, 100, 1500, 2, 03/03/71, Jo; o 104, Carlos, Castanheiro, nulo, 60, 100, 2500, 3, 01/01/65, Ca; o 107, Mônica, Videira, 1, 90, nulo, 1000, 2, 15/02/60, Mo; o 124, Pedro, Laranjeira, 2, 80, 107, 1100, nulo, 30/07/83, Pedroca; o 141, Tiago, Pessegueiro, 3, 80, 107, 2000, 2, 21/06/78, Ti; o 142, Renata, Videira, 4, 80, 107, 1500, nulo, 02/12/72, Rê; o 143, Gabriel, Macieira, nulo, 110, 107, 2000, 2, 11/11/81, Biel; Alterar Linhas http://www.alvarofpinheiro.eti.br
  • 54. --SQLServer | Postgre | Oracle UPDATE EMPREGADO SET CARGO=1, GERENTE=NULL, SALARIO=1000, COMISSAO=NULL, NASCIMENTO='01/07/80', APELIDO='TONHO' WHERE NUMERO=100; UPDATE EMPREGADO SET CARGO=1, GERENTE=100, SALARIO=1500, COMISSAO=NULL, NASCIMENTO='18/05/70', APELIDO='ZÉ' WHERE NUMERO=101; UPDATE EMPREGADO SET CARGO=2, GERENTE=100, SALARIO=2000, COMISSAO=3, NASCIMENTO='22/07/80', APELIDO='MA' WHERE NUMERO=102; UPDATE EMPREGADO SET CARGO=3, GERENTE=100, SALARIO=1500, COMISSAO=2, NASCIMENTO='03/03/71', APELIDO='JO' WHERE NUMERO=103; UPDATE EMPREGADO SET CARGO=NULL, GERENTE=100, SALARIO=2500, COMISSAO=3, NASCIMENTO='01/01/65', APELIDO='CA' WHERE NUMERO=104; UPDATE EMPREGADO SET CARGO=1, GERENTE=NULL, SALARIO=1000, COMISSAO=2, NASCIMENTO='15/02/60', APELIDO='MO' WHERE NUMERO=107; UPDATE EMPREGADO SET CARGO=2, GERENTE=107, SALARIO=1100, COMISSAO=NULL, NASCIMENTO='30/07/83', APELIDO='PEDROCA' WHERE NUMERO=124; UPDATE EMPREGADO SET CARGO=3, GERENTE=107, SALARIO=2000, COMISSAO=2, NASCIMENTO='21/06/78', APELIDO='TI' WHERE NUMERO=141; UPDATE EMPREGADO SET CARGO=4, GERENTE=107, SALARIO=1500, COMISSAO=NULL, NASCIMENTO='02/12/72', APELIDO='RE' WHERE NUMERO=142; UPDATE EMPREGADO SET CARGO=NULL, GERENTE=107, SALARIO=2000, COMISSAO=2, NASCIMENTO='11/11/81', APELIDO='BIEL' WHERE NUMERO=143; Alterar Linhas OBS: Data no formato ANSI AAAA/MM/DD http://www.alvarofpinheiro.eti.br
  • 55. --MySQL UPDATE EMPREGADO SET CARGO=1, GERENTE=NULL, SALARIO=1000, COMISSAO=NULL, NASCIMENTO='80/07/01', APELIDO='TONHO' WHERE NUMERO=100; UPDATE EMPREGADO SET CARGO=1, GERENTE=100, SALARIO=1500, COMISSAO=NULL, NASCIMENTO='70/05/18', APELIDO='ZÉ' WHERE NUMERO=101; UPDATE EMPREGADO SET CARGO=2, GERENTE=100, SALARIO=2000, COMISSAO=3, NASCIMENTO='80/07/22', APELIDO='MA' WHERE NUMERO=102; UPDATE EMPREGADO SET CARGO=3, GERENTE=100, SALARIO=1500, COMISSAO=2, NASCIMENTO='71/03/03', APELIDO='JO' WHERE NUMERO=103; UPDATE EMPREGADO SET CARGO=NULL, GERENTE=100, SALARIO=2500, COMISSAO=3, NASCIMENTO='65/01/01', APELIDO='CA' WHERE NUMERO=104; UPDATE EMPREGADO SET CARGO=1, GERENTE=NULL, SALARIO=1000, COMISSAO=2, NASCIMENTO='60/02/15', APELIDO='MO' WHERE NUMERO=107; UPDATE EMPREGADO SET CARGO=2, GERENTE=107, SALARIO=1100, COMISSAO=NULL, NASCIMENTO='83/07/30', APELIDO='PEDROCA' WHERE NUMERO=124; UPDATE EMPREGADO SET CARGO=3, GERENTE=107, SALARIO=2000, COMISSAO=2, NASCIMENTO='78/06/21', APELIDO='TI' WHERE NUMERO=141; UPDATE EMPREGADO SET CARGO=4, GERENTE=107, SALARIO=1500, COMISSAO=NULL, NASCIMENTO='72/12/02', APELIDO='RE' WHERE NUMERO=142; UPDATE EMPREGADO SET CARGO=NULL, GERENTE=107, SALARIO=2000, COMISSAO=2, NASCIMENTO='81/11/11', APELIDO='BIEL' WHERE NUMERO=143; Alterar Linhas http://www.alvarofpinheiro.eti.br
  • 56. --Firebird UPDATE EMPREGADO SET CARGO=1, GERENTE=NULL, SALARIO=1000, COMISSAO=NULL, NASCIMENTO='07/01/80', APELIDO='TONHO' WHERE NUMERO=100; UPDATE EMPREGADO SET CARGO=1, GERENTE=100, SALARIO=1500, COMISSAO=NULL, NASCIMENTO='05/18/70', APELIDO='ZÉ' WHERE NUMERO=101; UPDATE EMPREGADO SET CARGO=2, GERENTE=100, SALARIO=2000, COMISSAO=3, NASCIMENTO='07/22/80', APELIDO='MA' WHERE NUMERO=102; UPDATE EMPREGADO SET CARGO=3, GERENTE=100, SALARIO=1500, COMISSAO=2, NASCIMENTO='03/03/71', APELIDO='JO' WHERE NUMERO=103; UPDATE EMPREGADO SET CARGO=NULL, GERENTE=100, SALARIO=2500, COMISSAO=3, NASCIMENTO='01/01/65', APELIDO='CA' WHERE NUMERO=104; UPDATE EMPREGADO SET CARGO=1, GERENTE=NULL, SALARIO=1000, COMISSAO=2, NASCIMENTO='02/15/60', APELIDO='MO' WHERE NUMERO=107; UPDATE EMPREGADO SET CARGO=2, GERENTE=107, SALARIO=1100, COMISSAO=NULL, NASCIMENTO='07/30/83', APELIDO='PEDROCA' WHERE NUMERO=124; UPDATE EMPREGADO SET CARGO=3, GERENTE=107, SALARIO=2000, COMISSAO=2, NASCIMENTO='06/21/78', APELIDO='TI' WHERE NUMERO=141; UPDATE EMPREGADO SET CARGO=4, GERENTE=107, SALARIO=1500, COMISSAO=NULL, NASCIMENTO='12/02/72', APELIDO='RE' WHERE NUMERO=142; UPDATE EMPREGADO SET CARGO=NULL, GERENTE=107, SALARIO=2000, COMISSAO=2, NASCIMENTO='11/11/81', APELIDO='BIEL' WHERE NUMERO=143; Alterar Linhas http://www.alvarofpinheiro.eti.br
  • 57. CREATE [UNIQUE] INDEX nome_indice ON nome_tabela (index_col_name,...) index_col_name: col_name [(length)] [ASC | DESC] Criar Índices http://www.alvarofpinheiro.eti.br
  • 58. ●Criar índices por: o Primeironome e Sobrenome; o Salário; o Comissão; o Cargo; o Departamento; o Apelido (Único). Criar Índices http://www.alvarofpinheiro.eti.br
  • 59. CREATE INDEX EMPREGADOIX1 ON EMPREGADO (PRIMEIRONOME); CREATE INDEX EMPREGADOIX2 ON EMPREGADO (SOBRENOME); CREATE INDEX EMPREGADOIX3 ON EMPREGADO (SALARIO); CREATE INDEX EMPREGADOIX4 ON EMPREGADO (COMISSAO); CREATE INDEX EMPREGADOIX5 ON EMPREGADO (CARGO); CREATE INDEX EMPREGADOIX6 ON EMPREGADO (DEPARTAMENTO); CREATE UNIQUE INDEX EMPREGADOIX7 ON EMPREGADO (APELIDO); Criar Índices http://www.alvarofpinheiro.eti.br
  • 60. ●Prática: Visualizar a estrutura das tabelas Empregados e Departamentos. Dicionário de Dados http://www.alvarofpinheiro.eti.br
  • 61. --SQLServer SELECT FROM SYSOBJECTS O INNER JOIN SYSCOLUMNS C ON O.ID=C.ID WHERE O.NAME = 'DEPARTAMENTO'; --Postgre SELECT a.attnum, a.attname AS field, t.typname AS type, a.attlen AS length, a.atttypmod AS lengthvar, a.attnotnull AS notnull, c.relname AS name FROM pg_class c, pg_attribute a, pg_type t WHERE c.relname = 'departamento' and a.attnum > 0 and a.attrelid = c.oid and a.atttypid = t.oid ORDER BY c.relname --Oracle | MySQL DESCRIBE DEPARTAMENTO; Dicionário de Dados http://www.alvarofpinheiro.eti.br
  • 62. SELECT [ ALL | DISTINCT ] [ TOP n ] [ table_name. | table_alias. | view_name. ] | column_name [ [ AS ] column_alias ] | expression [ [ AS ] column_alias ] [ ..., n ] [ INTO new_table ] FROM table [ AS table_alias ] [ ( column_alias_1, [ column_alias_2, ..., n ] ) ] | view_name [ AS table_alias ] [ INNER JOIN | LEFT [ OUTER ] JOIN | RIGHT [ OUTER ] JOIN table [ ON search_conditions ] | [ WHERE search_conditions | WHERE column_name = column_name ] [ GROUP BY { group_by_expression, [ ..., n ] } ] [ HAVING search_conditions ] [ UNION query ] [ ORDER BY { order_by_expression [ ASC | DESC ] , [ ..., n ] } ] Consulta http://www.alvarofpinheiro.eti.br
  • 63. ●Prática: Visualizar os campos: Número e Nome (Primeironome || ‘ ‘ || Sobrenome). ●Dicas: o Operador de concatenação (||); o Em alguns BD se usa (+) para concatenação; o Concatena colunas ou strings de caracteres a outras colunas. Projeção http://www.alvarofpinheiro.eti.br
  • 64. --SQLServer SELECT NUMERO, PRIMEIRONOME + ' ' + SOBRENOME AS NOME FROM EMPREGADO; --Postgre | Oracle | Firebird SELECT NUMERO, PRIMEIRONOME || ' ' || SOBRENOME AS NOME FROM EMPREGADO; --MySQL SELECT NUMERO, CONCAT(PRIMEIRONOME, ' ', SOBRENOME) AS NOME FROM EMPREGADO; Projeção http://www.alvarofpinheiro.eti.br
  • 65. ●Prática: Visualizar os registros dos empregados do departamento 20 ou 80 dos campos: Número; Primeironome; Sobrenome; e Departamento. Seleção http://www.alvarofpinheiro.eti.br
  • 66. SELECT NUMERO, PRIMEIRONOME, SOBRENOME, DEPARTAMENTO FROM EMPREGADO WHERE DEPARTAMENTO = 20 OR DEPARTAMENTO = 80; Seleção http://www.alvarofpinheiro.eti.br
  • 67. ●Prática: Visualizar os registros dos empregados juntamente com o nome do departamento: Número (Empregados); Primeironome (Empregados); Sobrenome (Empregados); Departamento (Empregados); e Nome (Departamentos). Junção http://www.alvarofpinheiro.eti.br
  • 68. SELECT E.NUMERO, E.PRIMEIRONOME, E.SOBRENOME, E.DEPARTAMENTO, D.NOME FROM EMPREGADO E INNER JOIN DEPARTAMENTO D ON E.DEPARTAMENTO = D.NUMERO; Junção http://www.alvarofpinheiro.eti.br
  • 69. ●Prática: Visualizar todos os registros e todos os campos da tabela departamentos. ●Dicas: o As instruções SQL não fazem distinção entre maiúsculas e minúsculas; o As instruções SQL podem estar em uma ou mais linhas; o As palavras-chave não podem ser abreviadas ou quebradas; o Normalmente as cláusulas são colocadas em linhas separadas; o Os recuos são utilizados para dar mais legibilidade. Consulta Básica http://www.alvarofpinheiro.eti.br
  • 70. SELECT FROM DEPARTAMENTO; Consulta Básica http://www.alvarofpinheiro.eti.br
  • 71. ●Prática: Visualizar todos os registros nos campos Número, Nome (Primeironome + ‘ ‘ + Sobrenome) e após a consulta ser realizada observar o nome do campo para a expressão Nome. Finalize repetindo a consulta colocando o apelido Nome do Funcionário. Apelido http://www.alvarofpinheiro.eti.br
  • 72. --SQLServer SELECT NUMERO, PRIMEIRONOME + ' ' + SOBRENOME FROM EMPREGADO; SELECT NUMERO, PRIMEIRONOME + ' ' + SOBRENOME AS NOME FROM EMPREGADO; --Postgre | Oracle | Firebird SELECT NUMERO, PRIMEIRONOME || ' ' || SOBRENOME FROM EMPREGADO; SELECT NUMERO, PRIMEIRONOME || ' ' || SOBRENOME AS NOME FROM EMPREGADO; --MySQL SELECT NUMERO, CONCAT(PRIMEIRONOME, ' ', SOBRENOME) FROM EMPREGADO; SELECT NUMERO, CONCAT(PRIMEIRONOME, ' ', SOBRENOME) AS NOME FROM EMPREGADO; Apelido http://www.alvarofpinheiro.eti.br
  • 73. ●Prática: Visualizar o Sobrenome, o salário, e o líquido dos empregados, considerando que todos possuem um desconto de 10% de INSS. ●Dicas: o Operadores aritméticos:  Adicionar:+  Subtrair: -  Multiplicar:  Dividir: / “retorna o quociente” o Funções matemáticas:  Potenciação: POWER(número, potência)  Radiciação: SQRT(número)  Divisão: % | MOD “retorna o resto” Campos Calculados http://www.alvarofpinheiro.eti.br
  • 74. ●Dicas: o Precedência de Operadores:  A multiplicação e a divisão têm prioridade sobre a adição e 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. Campos Calculados http://www.alvarofpinheiro.eti.br
  • 75. SELECT SOBRENOME, SALARIO, SALARIO - (SALARIO0.10) AS LIQUIDO FROM EMPREGADO; http://www.alvarofpinheiro.eti.br Campos Calculados
  • 76. ●Prática: Visualizar o Sobrenome e o Salário Bruto (Salário + Comissão). Obs: A Comissão representa um percentual aplicado sobre o salário. ●Dicas: o Nulo é uma valor que não está disponível; o Nulo é um valor desconhecido; o Nulo não é a mesma coisa que zero; o Nulo não é a mesma coisa que espaço em branco. Valores Nulos http://www.alvarofpinheiro.eti.br
  • 77. SELECT SOBRENOME, SALARIO + (SALARIO COMISSAO / 100) AS BRUTO FROM EMPREGADO; Valores Nulos http://www.alvarofpinheiro.eti.br
  • 78. ●Prática: Visualizar o Sobrenome e o Salário Bruto (Salário + Comissão). Obs: Quando a Comissão for nula deve-se substituir por zero. ●Dicas: o Para Oracle usar NVL(campo, valor) o Para MySQL usar IFNULL(campo, valor) o Para SQLServer usar ISNULL(campo, valor) o Para Postgre | Firebird usar COALESCE(campo,0) Valores Nulos http://www.alvarofpinheiro.eti.br
  • 79. --SQLServer SELECT SOBRENOME, SALARIO + (SALARIO ISNULL(COMISSAO,0) / 100) AS BRUTO FROM EMPREGADO; --Postgre | Firebird SELECT SOBRENOME, SALARIO + (SALARIO COALESCE(COMISSAO,0) / 100) AS BRUTO FROM EMPREGADO; --Oracle SELECT SOBRENOME, SALARIO + (SALARIO NVL(COMISSAO,0) / 100) AS BRUTO FROM EMPREGADO; --MySQL SELECT SOBRENOME, SALARIO + (SALARIO IFNULL(COMISSAO,0) / 100) AS BRUTO FROM EMPREGADO; Valores Nulos http://www.alvarofpinheiro.eti.br
  • 80. ●Prática: Visualizar o Sobrenome dos Empregados. ●Dica: o A exibição default das consultas é de todas as linhas, incluindo linhas duplicadas. ●Prática: Visualizar o Sobrenome dos Empregados sem duplicidade. Duplicidade http://www.alvarofpinheiro.eti.br
  • 81. SELECT SOBRENOME FROM EMPREGADO; SELECT DISTINCT SOBRENOME FROM EMPREGADO; Duplicidade http://www.alvarofpinheiro.eti.br
  • 82. ●Prática: Visualizar o Número e Sobrenome de todos os empregados do departamento 90. ●Dicas: o Seleções são realizadas pela cláusula WHERE; o Operadores de Comparação:  Igual a: =  Maior que: >  Maior que ou igual a: >=  Menor que: <  Menor que ou igual a: <=  Diferente de: <> Condicionamento http://www.alvarofpinheiro.eti.br
  • 83. SELECT NUMERO, SOBRENOME FROM EMPREGADO WHERE DEPARTAMENTO = 90; Condicionamento http://www.alvarofpinheiro.eti.br
  • 84. ●Prática: Visualizar o Número, Sobrenome e Nascimento de todos os empregados que nasceram em 22/07/80. ●Dicas: o As strings de caracteres e valores de data aparecem entre aspas simples; o Os valores de caractere fazem distinção entre maiúsculas e minúsculas; o Os valores de data fazem distinção entre formatos; o O formato de data default é DD-MON-YY. Condicionamento http://www.alvarofpinheiro.eti.br
  • 85. --SQLServer | postgre | Oracle SELECT NUMERO, SOBRENOME, NASCIMENTO FROM EMPREGADO WHERE NASCIMENTO = '22/07/80'; --MySQL SELECT NUMERO, SOBRENOME, NASCIMENTO FROM EMPREGADO WHERE NASCIMENTO = '80/07/22'; --Firebird SELECT NUMERO, SOBRENOME, NASCIMENTO FROM EMPREGADO WHERE NASCIMENTO = '07/22/80'; Condicionamento http://www.alvarofpinheiro.eti.br
  • 86. ●Prática: Visualizar o Número, Sobrenome e Nascimento de todos os empregados que nasceram entre (inclusive) 01/01/70 e 31/12/80. ●Dicas: o Outros Operadores de Comparação:  Intervalo fechado: BETWEEN  Está contido: IN  Contém: LIKE  Para representar qualquer caractere: %  Para representar caractere da posição: _  É nulo: IS NULL Condicionamento http://www.alvarofpinheiro.eti.br
  • 87. --SQLServer | postgre | Oracle SELECT NUMERO, SOBRENOME, NASCIMENTO FROM EMPREGADO WHERE NASCIMENTO BETWEEN '01/01/70' AND '31/12/80'; --MySQL SELECT NUMERO, SOBRENOME, NASCIMENTO FROM EMPREGADO WHERE NASCIMENTO BETWEEN '70/01/01' AND '80/12/31'; --Firebird SELECT NUMERO, SOBRENOME, NASCIMENTO FROM EMPREGADO WHERE NASCIMENTO BETWEEN '01/01/70' AND '12/31/80'; Condicionamento http://www.alvarofpinheiro.eti.br
  • 88. ●Prática: Visualizar o Número, Sobrenome e Departamento de todos os empregados que pertencem aos departamentos: 10, 20, 50, 60, 80 ou 90. ●Dicas: o Outros Operadores de Comparação:  Intervalo fechado: BETWEEN  Pertence: IN  Contém: LIKE  Para representar qualquer caractere: %  Para representar caractere da posição: _  É nulo: IS NULL Condicionamento http://www.alvarofpinheiro.eti.br
  • 89. SELECT NUMERO, SOBRENOME, DEPARTAMENTO FROM EMPREGADO WHERE DEPARTAMENTO IN (10, 20, 50, 60, 80, 90); Condicionamento http://www.alvarofpinheiro.eti.br
  • 90. ●Prática: Visualizar o Número e Sobrenome de todos os empregados que possuem ‘eira’ no sobrenome. ●Dicas: o Outros Operadores de Comparação:  Intervalo fechado: BETWEEN  Pertence: IN  Contém: LIKE  Para representar qualquer caractere: %  Para representar caractere da posição: _  É nulo: IS NULL Condicionamento http://www.alvarofpinheiro.eti.br
  • 91. SELECT NUMERO, SOBRENOME FROM EMPREGADO WHERE SOBRENOME LIKE ‘%EIRA%’; Condicionamento http://www.alvarofpinheiro.eti.br
  • 92. ●Prática: Visualizar o Número e Sobrenome de todos os empregados que não possuem comissão. ●Dicas: o Outros Operadores de Comparação:  Intervalo fechado: BETWEEN  Pertence: IN  Contém: LIKE  Para representar qualquer caractere: %  Para representar caractere da posição: _  É nulo: IS NULL Condicionamento http://www.alvarofpinheiro.eti.br
  • 93. SELECT NUMERO, SOBRENOME FROM EMPREGADO WHERE COMISSAO IS NULL; Condicionamento http://www.alvarofpinheiro.eti.br
  • 94. ●Prática: Visualizar o Número, Sobrenome e Salário de todos os empregados que possuem salário entre (inclusive) 1500 e 2000, dos departamentos 20, 50 e 80. ●Dicas: o Operadores Lógicos:  Verdadeiro para ambas expressões verdadeiras: AND  Verdadeiro bastando uma das expressões verdadeiras: OR  Inverso da expressão: NOT Condicionamento http://www.alvarofpinheiro.eti.br
  • 95. SELECT NUMERO, SOBRENOME, SALARIO, DEPARTAMENTO FROM EMPREGADO WHERE SALARIO BETWEEN 1500 AND 2000 AND DEPARTAMENTO IN (20, 50, 80); Condicionamento http://www.alvarofpinheiro.eti.br
  • 96. ●1 – Operadores Aritméticos; ●2 – Operador de Concatenação; ●3 – Condições de Comparação; ●4 – IS [NOT] NULL, [NOT] LIKE, [NOT] IN; ●5 – [NOT] BETWEEN; ●6 – Condição lógica NOT; ●7 – Condição lógica AND; ●8 – Condição lógica OR. Regras de Precedência http://www.alvarofpinheiro.eti.br
  • 97. ●Prática: Visualizar o Sobrenome e o Salário dos Empregados ordenados por Salário em ordem decrescente. ●Dicas: o Sintaxe da ordenação: [ORDER BY {coluna, expr} [ASC|DESC]]; o É possível utilizar o alias na cláusula de ordenação; o É possível utilizar a posição da coluna na ordenação; o Pode-se classificar por colunas que não estejam no select; o Pode-se classificar por N colunas Ordenação http://www.alvarofpinheiro.eti.br
  • 98. SELECT SOBRENOME, SALARIO FROM EMPREGADO ORDER BY SALARIO DESC; Ordenação http://www.alvarofpinheiro.eti.br
  • 99. ●Funções são recursos avançados do SQL e podem ser utilizadas para efetuar o seguinte: o Executar cálculos; o Modificar itens de dados individuais; o Manipular a saída para grupos de linhas; o Formatar datas e números para exibição; o Converter tipos de dados de coluna. ●Dicas: o Algumas funções utilizam argumentos; o Sempre retornam um valor. Funções http://www.alvarofpinheiro.eti.br
  • 100. ●Funções de uma Única Linha o Operam somente linhas únicas e retornam um resultado por linha. ●Funções de Várias Linhas o Podem manipular grupos de linhas para fornecer um resultado e são mais conhecidas como funções de grupo. Funções (Tipos) http://www.alvarofpinheiro.eti.br
  • 101. ●Servem para manipular itens de dados; ●Aceitam um ou mais argumentos; ●Retornam um valor para cada linha retornada; ●São do tipo: o Caractere, Numéricas, Data, Conversão e Gerais; ●Podem ser usadas em cláusulas: o SELECT, WHERE e ORDER BY. Funções (Única Linha) http://www.alvarofpinheiro.eti.br
  • 102. ●LOWER – converte para minúsculas; ●UPPER – converte para maiúsculas; ●SUBSTRING – retorna o substring de uma string; ●LENGTH – retorna o número de caracteres; ●CHARINDEX – retorna a posição de um string; ●REPLACE - substitui uma string por outra string; ●RTRIM | LTRIM | TRIM – retira brancos. Funções (Caractere) http://www.alvarofpinheiro.eti.br
  • 103. ●Práticas: o Exibir todos os Primeironomes em minúsculas; o Exibir todos os Sobrenomes em maiúsculas; o Exibir os 3 primeiros caracteres do Sobrenome; o Exibir o tamanho do Sobrenome; o Exibir a posição no ‘(‘ no nome do departamento; o Trocar no nome de departamento: Admin para Adm; Exec para Exe; e Contab para Con. Funções (Caractere) http://www.alvarofpinheiro.eti.br
  • 104. --Exibir todos os Primeironomes em minúsculas SELECT LOWER(PRIMEIRONOME) AS PRIMEIRONOME FROM EMPREGADO; --Exibir todos os Sobrenomes em maiúsculas SELECT UPPER(SOBRENOME) AS PRIMEIRONOME FROM EMPREGADO; --Exibir os 3 primeiros caracteres do Sobrenome --SQLServer | Postgre | MySQL SELECT SUBSTRING(SOBRENOME,1,3) FROM EMPREGADO; --Oracle SELECT SUBSTR(SOBRENOME,1,3) FROM EMPREGADO; --Firebird SELECT SUBSTRING(SOBRENOME FROM 1 FOR 3) FROM EMPREGADO; Funções (Caractere) http://www.alvarofpinheiro.eti.br
  • 105. --Exibir o tamanho do Sobrenome --SQLServer SELECT LEN(SOBRENOME) FROM EMPREGADO; --Postgre | Oracle | MySQL SELECT LENGTH(SOBRENOME) FROM EMPREGADO; --Firebird SELECT CHAR_LENGTH(SOBRENOME) FROM EMPREGADO; Funções (Caractere) http://www.alvarofpinheiro.eti.br
  • 106. --Exibir a posição no ‘(‘ no nome do departamento --SQLServer SELECT CHARINDEX('(', NOME) FROM DEPARTAMENTO; --Postgre SELECT STRPOS(NOME, '(') FROM DEPARTAMENTO; --Oracle | MySQL SELECT INSTR(NOME, '(') FROM DEPARTAMENTO; --Firebird SELECT POSITION('(' IN NOME) FROM DEPARTAMENTO; Funções (Caractere) http://www.alvarofpinheiro.eti.br
  • 107. --Trocar no nome de departamento: Admin para Adm; Exec para Exe; e Contab para Con. SELECT REPLACE(NOME, '(ADMIN)', '(ADM)'), REPLACE(NOME, '(EXEC)', '(EXE)'), REPLACE(NOME, '(CONTAB)', '(CON)') FROM DEPARTAMENTO; http://www.alvarofpinheiro.eti.br Funções (Caractere)
  • 108. ●Prática: Exibir o tamanho do Apelido concatenado com o Sobrenome com os brancos e depois sem os brancos. ●Dicas: o Funções de uma única linha podem ser aninhadas em qualquer nível; o As funções aninhadas são avaliadas do nível mais interno para o mais externo. Funções (Aninhamento) http://www.alvarofpinheiro.eti.br
  • 109. --Exibir o tamanho do Apelido concatenado com o Sobrenome com os brancos --SQLServer SELECT LEN(APELIDO + ' ' + SOBRENOME) FROM EMPREGADO; --Postgre | Oracle SELECT LENGTH(APELIDO || ' ' || SOBRENOME) FROM EMPREGADO; --MySQL SELECT LENGTH(CONCAT(APELIDO, ' ', SOBRENOME)) FROM EMPREGADO; --Firebird SELECT CHAR_LENGTH(APELIDO || ' ' || SOBRENOME) FROM EMPREGADO; --Exibir o tamanho do Apelido concatenado com o Sobrenome sem os brancos --SQLServer SELECT LEN(RTRIM(APELIDO) + ' ' + SOBRENOME) FROM EMPREGADO; --Postgre | Oracle SELECT LENGTH(RTRIM(APELIDO) || ' ' || SOBRENOME) FROM EMPREGADO; --MySQL SELECT LENGTH(CONCAT(RTRIM(APELIDO), ' ', SOBRENOME)) FROM EMPREGADO; --Firebird SELECT CHAR_LENGTH(TRIM(APELIDO) || ' ' || SOBRENOME) FROM EMPREGADO; Funções (Aninhamento) http://www.alvarofpinheiro.eti.br
  • 110. ●ROUND – arredonda a coluna; ●TRUNC – trunca a coluna; ●Práticas: o Exibir o Fator; o Exibir o Fator arredondando para 1 decimal; o Exibir o Fator truncando para 1 decimal. Funções (Numérica) http://www.alvarofpinheiro.eti.br
  • 111. --Exibir o Fator SELECT FATOR FROM DEPARTAMENTO; --Exibir o Fator arredondando para 1 decimal SELECT ROUND(FATOR,1) FROM DEPARTAMENTO; --Exibir o Fator truncando para 1 decimal. --SQLServer --SELECT ROUND(FATOR, 1, 2) FROM DEPARTAMENTO; --Postgre | Oracle | Firebird SELECT TRUNC(FATOR, 1) FROM DEPARTAMENTO; --MySQL SELECT TRUNCATE(FATOR, 1) FROM DEPARTAMENTO; Funções (Numérica) http://www.alvarofpinheiro.eti.br
  • 112. ●MOD | % – retorna o resto da divisão. ●Práticas: o Visualizar o quociente da divisão de 5 por 2; o Visualizar o resto da divisão de 5 por 2; ●Dicas: o Para exibir dados que não estão inseridos em tabelas do banco de dados pode-se fazer uso de uma tabela fictícia usada para exibir resultados chamada de DUAL. Funções (Numérica) http://www.alvarofpinheiro.eti.br
  • 113. --Visualizar o quociente da divisão de 5 por 2 --SQLServer | Firebird SELECT 5 / 2 FROM TMP; --Postgre | MySQL SELECT 5 / 2; --Oracle SELECT 5 / 2 FROM DUAL; Funções (Numérica) http://www.alvarofpinheiro.eti.br
  • 114. --Visualizar o resto da divisão de 5 por 2 --SQLServer SELECT 5 % 2 FROM TMP; --Postgre | MySQL SELECT 5 MOD 2; --Oracle SELECT MOD (5, 2) FROM DUAL; --Firebird SELECT MOD(5, 2) FROM TMP; Funções (Numérica) http://www.alvarofpinheiro.eti.br
  • 115. ●Prática: Visualizar a data e hora corrente; ●Dicas: o Sintaxe: GETDATE | SYSDATE o Os Bancos de Dados (BD) armazenam as datas em formato de número inteiro: século, ano, mês, dia, horas, minutos e segundos; o O formato de exibição default depende do BD, mas no geral é utilizado a exibição DD-MMM-AA; o Pode-se adicionar ou subtrair (aritmética com datas) Funções (Data) http://www.alvarofpinheiro.eti.br
  • 116. ●Dicas: o Operação; Resultado; Descrição o Data+Número; Data; Adiciona dias a datas o Data-Número; Data; Subtrai dias a datas o Data-Data; Dias; Subtrai uma data de outra o Data+Número/24; Data; Adiciona hora a datas Aritmética de Datas http://www.alvarofpinheiro.eti.br
  • 117. ●Práticas – Exiba e verifique o retorno: o Exibir a data corrente; o Exibir Data+Número; o Exibir Data-Número; o Exibir Data-Data; o Exibir Data+Número/24. Aritmética de Datas http://www.alvarofpinheiro.eti.br
  • 118. --SQLServer SELECT GETDATE() FROM TMP; SELECT GETDATE() + 1 FROM TMP; SELECT GETDATE() - 1 FROM TMP; SELECT GETDATE() - '13/11/67' FROM TMP; SELECT GETDATE() + 10/24 FROM TMP; SELECT YEAR(GETDATE()) FROM TMP; SELECT MONTH(GETDATE()) FROM TMP; SELECT DAY(GETDATE()) FROM TMP; Aritmética de Datas http://www.alvarofpinheiro.eti.br
  • 119. --Postgre SELECT CURRENT_TIMESTAMP; SELECT CURRENT_TIMESTAMP + INTERVAL '1DAY'; SELECT CURRENT_TIMESTAMP - INTERVAL '1DAY'; SELECT CURRENT_TIMESTAMP - '13/11/67'; SELECT CURRENT_TIMESTAMP + INTERVAL '5HOURS'; SELECT EXTRACT(YEAR FROM CURRENT_TIMESTAMP); SELECT EXTRACT(MONTH FROM CURRENT_TIMESTAMP); SELECT EXTRACT(DAY FROM CURRENT_TIMESTAMP); Aritmética de Datas http://www.alvarofpinheiro.eti.br
  • 120. --Oracle SELECT SYSDATE FROM DUAL; SELECT SYSDATE + 1 FROM DUAL; SELECT SYSDATE - 1 FROM DUAL; SELECT SYSDATE - '13/11/67' FROM DUAL; SELECT SYSDATE + 10/24 FROM DUAL; SELECT YEAR(SYSDATE) FROM DUAL; SELECT MONTH(SYSDATE) FROM DUAL; SELECT DAY(SYSDATE) FROM DUAL; Aritmética de Datas http://www.alvarofpinheiro.eti.br
  • 121. --MySQL SELECT CURRENT_TIMESTAMP; SELECT CURRENT_TIMESTAMP + 1; SELECT CURRENT_TIMESTAMP - 1; SELECT CURRENT_TIMESTAMP - '13/11/67'; SELECT CURRENT_TIMESTAMP + 10/24; SELECT EXTRACT(YEAR FROM CURRENT_TIMESTAMP); SELECT EXTRACT(MONTH FROM CURRENT_TIMESTAMP); SELECT EXTRACT(DAY FROM CURRENT_TIMESTAMP); Aritmética de Datas http://www.alvarofpinheiro.eti.br
  • 122. --Firebird SELECT CURRENT_TIMESTAMP FROM TMP; SELECT CURRENT_TIMESTAMP + 1 FROM TMP; SELECT CURRENT_TIMESTAMP - 1 FROM TMP; SELECT CURRENT_TIMESTAMP + 10/24 FROM TMP; SELECT EXTRACT(YEAR FROM CURRENT_TIMESTAMP) FROM TMP; SELECT EXTRACT(MONTH FROM CURRENT_TIMESTAMP) FROM TMP; SELECT EXTRACT(DAY FROM CURRENT_TIMESTAMP) FROM TMP; Aritmética de Datas http://www.alvarofpinheiro.eti.br
  • 123. ●Dica:  CAST ●Práticas: o Exibir a conversão do salário para string. Função de Conversão http://www.alvarofpinheiro.eti.br
  • 124. SELECT CAST(SALARIO AS CHAR(10)) FROM EMPREGADO; Função de Conversão http://www.alvarofpinheiro.eti.br
  • 125. ●CASE – permite uso de expressões condicionais. ●Sintaxe: o CASE expr WHEN cond THEN retorno  [WHEN condN THEN retornoN]  [ELSE retorno] o END CASE http://www.alvarofpinheiro.eti.br
  • 126. ●Práticas: o Visualizar Número, Sobrenome, Salário e Departamento dos empregados; o Visualizar Número, Sobrenome, Salário e Departamento dos empregados aplicando 10% de aumento nos salários dos depart. 10 e 20, 15% dos depart. 80 e 90, e 5% nos demais. CASE http://www.alvarofpinheiro.eti.br
  • 127. SELECT NUMERO, SOBRENOME, CASE WHEN DEPARTAMENTO IN (10,20) THEN SALARIO + (SALARIO0.10) WHEN DEPARTAMENTO IN (80,90) THEN SALARIO + (SALARIO0.15) ELSE SALARIO + (SALARIO0.5) END AS SALARIO, DEPARTAMENTO FROM EMPREGADO; CASE http://www.alvarofpinheiro.eti.br
  • 128. ●Um produto cartesiano será formado quando uma condição de junção for omitida e como consequência todas as linhas da primeira tabela serão unidas a todas a linhas da segunda tabela. Produto Cartesiano http://www.alvarofpinheiro.eti.br
  • 129. ●Práticas: o Visualizar Número, Sobrenome e Nome de Departamento dos empregados não colocando a junção das tabelas e observe o resultado. Produto Cartesiano http://www.alvarofpinheiro.eti.br
  • 130. --Todos SELECT E.NUMERO, E.SOBRENOME, D.NOME FROM EMPREGADO E, DEPARTAMENTO D; --SQLServer | Postgre | Oracle | MySQL SELECT E.NUMERO, E.SOBRENOME, D.NOME FROM EMPREGADO E CROSS JOIN DEPARTAMENTO D; Produto Cartesiano http://www.alvarofpinheiro.eti.br
  • 131. ●Quando forem necessários dados de mais de uma tabela no banco de dados, será usada uma condição de junção. As linhas de uma tabela podem ser unidas a linhas de outra tabela de acordo com os valores comuns existentes nas colunas correspondentes, ou seja, em geral colunas de chave primária e chave estrangeira. Junção http://www.alvarofpinheiro.eti.br
  • 132. ●Dicas: o Quando criar uma instrução SELECT que una tabelas, coloque o nome da tabela antes do nome da coluna para fins de clareza e para melhorar o acesso ao banco de dados; o Caso apareça o mesmo nome de coluna em mais de uma tabela, o nome da coluna deve vir antecedido do nome da tabela (AMBÍGUIDADE); o Para unir N tabelas, é necessário um mínimo de N-1 condições de junção. Por exemplo, para unir 4 tabelas, é necessário um mínimo de 3 junções. Essa regra pode não se aplicar se sua tabela tiver uma chave primária concatenada. Nesse caso, será necessário mais de uma coluna para identificar exclusivamente cada linha; o Para melhorar a sintaxe deve-se apelidar as tabelas. Junção http://www.alvarofpinheiro.eti.br
  • 134. ●Dica: ● Também chamadas de junções simples ou internas. ●Prática: ● Exibir o Sobrenome do empregado e o Nome do departamento de um empregado. Equijunção http://www.alvarofpinheiro.eti.br
  • 135. SELECT E.SOBRENOME, D.NOME FROM EMPREGADO E INNER JOIN DEPARTAMENTO D ON E.DEPARTAMENTO = D.NUMERO; Equijunção http://www.alvarofpinheiro.eti.br
  • 136. ●Prática: Determine o nome do cargo e do departamento de um empregado. ●Dica: Observe que nas junções simples ou internas se não existe uma relação a tupla não é gerada. ●Tupla: Cada linha formada por uma lista ordenada de colunas representa um registro. Os registros não precisam conter informações em todas as colunas, podendo assumir valores nulos quando assim se fizer necessário. Equijunção http://www.alvarofpinheiro.eti.br
  • 137. SELECT E.SOBRENOME, C.NOME, D.NOME FROM EMPREGADO E INNER JOIN CARGO C ON E.CARGO = C.NUMERO INNER JOIN DEPARTAMENTO D ON E.DEPARTAMENTO = D.NUMERO; Equijunção http://www.alvarofpinheiro.eti.br
  • 138. ●São junções que não usam condições de igualdade. ●Prática: Exibir o Número, Sobrenome, nome do cargos de cada empregados que podem ser galgados na empresa. Não-Equijunção http://www.alvarofpinheiro.eti.br
  • 139. SELECT E.NUMERO, E.SOBRENOME, C.NOME FROM EMPREGADO E INNER JOIN CARGO C ON C.NUMERO > E.CARGO; Não-Equijunção http://www.alvarofpinheiro.eti.br
  • 140. ●Quando se deseja exibir dados que não possuem uma relação comum entre tabelas. ●Dicas: o Em banco como Oracle pode-se utilizar a extensão (+) e em SQL Server (); o Só pode ser utilizado de um lado da expressão; o Não se pode utilizar o operador IN e nem o OR. ●Prática: Exibir o Número, Sobrenome, Apelido, nome do cargo de todos os empregados, mesmo daqueles que ainda não possuem cargos atribuídos. Junção Externa http://www.alvarofpinheiro.eti.br
  • 141. SELECT E.NUMERO, E.SOBRENOME, E.APELIDO, C.NOME FROM EMPREGADO E RIGHT JOIN CARGO C ON C.NUMERO = E.CARGO; Junção Externa http://www.alvarofpinheiro.eti.br
  • 142. ●Quando se une uma tabela a ela mesma. ●Prática: Exibir o Número, Primeironome dos empregados e o Número e o Primeironome dos seus respectivos gerentes. Autojunção http://www.alvarofpinheiro.eti.br
  • 143. SELECT E.NUMERO, E.PRIMEIRONOME, G.NUMERO, G.PRIMEIRONOME FROM EMPREGADO E LEFT JOIN EMPREGADO G ON E.GERENTE = G.NUMERO; Autojunção http://www.alvarofpinheiro.eti.br
  • 144. ●Operam um conjunto de linhas, as funções de grupo operam em conjuntos de linhas para fornecer um resultado por grupo. Esses conjuntos podem ser a tabela inteira ou dividida em grupos. ●Dicas: o Funções de grupo são mais conhecidas como funções agregadas. AVG, COUNT, MAX, MIN e SUM; o ALL faz com que a função considere todos os valores, inclusive as duplicidades; o DISTINCT faz com que a função considere somente valores não duplicados; o Todas as funções de grupos ignoram valores nulos, para garantir a aplicabilidade para todos os registros use (). Funções de Grupo http://www.alvarofpinheiro.eti.br
  • 145. ●Práticas: o Exibir a média de salários pago pelo empregador; o Exibir o somatório dos salários; o Exibir a quantidade de empregados; o Exibir o maior salário; o Exibir o menor salário. Funções de Grupo http://www.alvarofpinheiro.eti.br
  • 146. SELECT AVG(SALARIO) FROM EMPREGADO; SELECT SUM(SALARIO) FROM EMPREGADO; SELECT COUNT(SALARIO) FROM EMPREGADO; SELECT MAX(SALARIO) FROM EMPREGADO; SELECT MIN(SALARIO) FROM EMPREGADO; Funções de Grupo http://www.alvarofpinheiro.eti.br
  • 147. ●Usa-se o GROUP BY para dividir as linhas de uma tabela em grupos. ●Práticas: o Exibir a média de salários pagos por Departamento; o Exibir o somatório dos salários pagos por Cargo; o Exibir a quantidade de empregados por gestor; o Exibir o maior salário por gestor; o Exibir o menor salário por gestor. Grupo de Dados http://www.alvarofpinheiro.eti.br
  • 148. SELECT D.NOME, AVG(E.SALARIO) AS MEDIAS FROM DEPARTAMENTO D INNER JOIN EMPREGADO E ON D.NUMERO = E.DEPARTAMENTO GROUP BY D.NOME; SELECT C.NOME, SUM(E.SALARIO) AS SOMATORIO FROM CARGO C INNER JOIN EMPREGADO E ON C.NUMERO = E.CARGO GROUP BY C.NOME; SELECT G.SOBRENOME, COUNT(E.NUMERO) AS QTDE FROM EMPREGADO G INNER JOIN EMPREGADO E ON G.NUMERO = E.GERENTE GROUP BY G.SOBRENOME; SELECT G.SOBRENOME, MAX(E.SALARIO) AS MAIORSALARIO FROM EMPREGADO G INNER JOIN EMPREGADO E ON G.NUMERO = E.GERENTE GROUP BY G.SOBRENOME; SELECT G.SOBRENOME, MIN(E.SALARIO) AS MENORSALARIO FROM EMPREGADO G INNER JOIN EMPREGADO E ON G.NUMERO = E.GERENTE GROUP BY G.SOBRENOME; Grupo de Dados http://www.alvarofpinheiro.eti.br
  • 149. ●Usa-se o HAVING para filtrar as linhas de uma tabela em grupos. ●Práticas: o Exibir a média de salários pagos por Departamento cujo a média seja maior ou igual a 2000; o Exibir o somatório dos salários pagos por Cargo cujo o somatório seja menor que 1500. Grupo de Dados (Filtros) http://www.alvarofpinheiro.eti.br
  • 150. SELECT D.NOME, AVG(E.SALARIO) AS MEDIAS FROM DEPARTAMENTO D INNER JOIN EMPREGADO E ON D.NUMERO = E.DEPARTAMENTO GROUP BY D.NOME HAVING AVG(E.SALARIO) >= 2000; SELECT D.NOME, SUM(E.SALARIO) AS MEDIAS FROM DEPARTAMENTO D INNER JOIN EMPREGADO E ON D.NUMERO = E.DEPARTAMENTO GROUP BY D.NOME HAVING AVG(E.SALARIO) < 1500; Grupo de Dados (Filtros) http://www.alvarofpinheiro.eti.br
  • 151. ●Usa-se o ROLLUP para produzir linhas superagregadas pela referência cruzada de colunas. O agrupamento ROLLUP produz um conjunto de resultados que contém as linhas agrupadas normais e os valores de subtotais. ●Práticas: o Exibir o somatório de Salário agrupado por Departamento e Cargo dos empregados com Número de Departamento menor que 60, exibindo os subtotais de Departamento e Cargo. Grupo de Dados (ROLLUP) http://www.alvarofpinheiro.eti.br
  • 152. --Todos SELECT CAST(DEPARTAMENTO AS CHAR), CAST(CARGO AS CHAR), SUM(SALARIO) FROM EMPREGADO WHERE DEPARTAMENTO < 60 GROUP BY DEPARTAMENTO, CARGO UNION SELECT '', 'TOTAL', COALESCE(SUM(SALARIO), 0) FROM EMPREGADO; --SQLServer | Oracle SELECT DEPARTAMENTO, CARGO, SUM(SALARIO) FROM EMPREGADO WHERE DEPARTAMENTO < 60 GROUP BY ROLLUP (DEPARTAMENTO, CARGO); --MySQL SELECT DEPARTAMENTO, CARGO, SUM(SALARIO) FROM EMPREGADO WHERE DEPARTAMENTO < 60 GROUP BY DEPARTAMENTO, CARGO WITH ROLLUP; Grupo de Dados (ROLLUP) http://www.alvarofpinheiro.eti.br
  • 153. ●Usa-se o CUBE para produzir um conjunto de resultados que contém as linhas de ROLLUP e as linhas de tabulação cruzada. Pode-se usá-lo para produzir valores de tabulação cruzada com uma instrução SELECT simples. ●Práticas: o Exibir o somatório de Salário agrupado por Departamento e Cargo dos empregados com Número de Departamento menor que 60, exibindo a referência cruzada de Departamento e Cargo. Grupo de Dados (CUBE) http://www.alvarofpinheiro.eti.br
  • 154. --SQLServer | Oracle SELECT DEPARTAMENTO, CARGO, SUM(SALARIO) FROM EMPREGADO WHERE DEPARTAMENTO < 60 GROUP BY CUBE (DEPARTAMENTO, CARGO); Grupo de Dados (CUBE) http://www.alvarofpinheiro.eti.br
  • 155. ●Usa-se o ORDER BY para classificar as linhas de uma seleção. ●Práticas: o Exibir a média de salários pagos por Departamento em ordem decrescente; o Exibir o somatório dos salários pagos por Cargo em ordem ascendente. Ordenação de Dados http://www.alvarofpinheiro.eti.br
  • 156. SELECT D.NOME, AVG(E.SALARIO) AS MEDIAS FROM DEPARTAMENTO D INNER JOIN EMPREGADO E ON D.NUMERO = E.DEPARTAMENTO GROUP BY D.NOME ORDER BY AVG(E.SALARIO) DESC; SELECT C.NOME, SUM(E.SALARIO) AS MEDIAS FROM CARGO C INNER JOIN EMPREGADO E ON C.NUMERO = E.CARGO GROUP BY C.NOME ORDER BY 1 ASC; Ordenação de Dados http://www.alvarofpinheiro.eti.br
  • 157. ●As funções de grupo podem ser aninhadas até uma profundidade de dois. ●Prática: o Exibir o salário médio máximo pago por Departamento. Grupo de Dados (Aninhamento) http://www.alvarofpinheiro.eti.br
  • 158. --Oracle SELECT MAX(AVG(E.SALARIO)) AS MEDIAS FROM EMPREGADO E GROUP BY E.DEPARTAMENTO; Grupo de Dados (Aninhamento) http://www.alvarofpinheiro.eti.br
  • 159. ●Consiste em executar uma consulta (externa) a partir de outra consulta (interna). ●Dicas: o Existem operadores que retornam apenas uma linha (=, <>, >, >=, <, <=) e o que retorna várias linhas (IN); o Coloque subconsultas entre parênteses; o A quantidade de níveis de subconsultas dependem do banco de dados. ●Prática: o Quais os empregados possuem salário maior que o de Pedroca? Subconsulta http://www.alvarofpinheiro.eti.br
  • 160. SELECT APELIDO, SALARIO FROM EMPREGADO WHERE SALARIO > (SELECT SALARIO FROM EMPREGADO WHERE APELIDO='PEDROCA'); Subconsulta http://www.alvarofpinheiro.eti.br
  • 161. ●Prática: o Qual o nome (Primeironome + Sobrenome) dos empregados possuem o menor salário? Subconsulta http://www.alvarofpinheiro.eti.br
  • 162. --SQLSever SELECT PRIMEIRONOME + ' ' + SOBRENOME AS NOME, SALARIO FROM EMPREGADO WHERE SALARIO = (SELECT MIN(SALARIO) FROM EMPREGADO); --Postgre | Oracle | Firebird SELECT PRIMEIRONOME || ' ' || SOBRENOME AS NOME, SALARIO FROM EMPREGADO WHERE SALARIO = (SELECT MIN(SALARIO) FROM EMPREGADO); --MySQL SELECT CONCAT(PRIMEIRONOME, ' ', SOBRENOME) AS NOME, SALARIO FROM EMPREGADO WHERE SALARIO = (SELECT MIN(SALARIO) FROM EMPREGADO); Subconsulta http://www.alvarofpinheiro.eti.br
  • 163. ●Prática: o Exibir o menor Salário por Departamento onde o menor Salário seja o maior que o menor Salário do Departamento de código 50. Subconsulta http://www.alvarofpinheiro.eti.br
  • 164. SELECT D.NOME, MIN(E.SALARIO) FROM EMPREGADO E INNER JOIN DEPARTAMENTO D ON E.DEPARTAMENTO = D.NUMERO GROUP BY D.NOME HAVING MIN(E.SALARIO) > (SELECT MIN(SALARIO) FROM EMPREGADO WHERE DEPARTAMENTO = 50); Subconsulta http://www.alvarofpinheiro.eti.br
  • 165. ●Prática: o O que há de errado com a instrução abaixo? o SELECT Numero, Sobrenome o FROM Empregado o WHERE Salario = (SELECT MIN(Salario) o FROM Empregado o GROUP BY Departamento); Subconsulta http://www.alvarofpinheiro.eti.br
  • 166. A subconsulta retornou mais de 1 valor. Isso não é permitido quando a subconsulta segue um =, !=, <, <= , >, >= ou quando ela é usada como uma expressão. Subconsulta http://www.alvarofpinheiro.eti.br
  • 167. ●Prática: o Exibir Número, Sobrenome, Salário dos empregados que possuirem algum salário menor que o menor salário do departamento de código 50. Subconsulta (ANY) http://www.alvarofpinheiro.eti.br
  • 168. SELECT NUMERO, SOBRENOME, SALARIO FROM EMPREGADO WHERE SALARIO < ANY (SELECT MIN(SALARIO) FROM EMPREGADO WHERE DEPARTAMENTO = 50); Subconsulta (ANY) http://www.alvarofpinheiro.eti.br
  • 169. ●Prática: o Exibir Número, Sobrenome, Salário dos todos os empregados que possuirem salário menor que o menor salário do departamento de código 50. Subconsulta (ALL) http://www.alvarofpinheiro.eti.br
  • 170. SELECT NUMERO, SOBRENOME, SALARIO FROM EMPREGADO WHERE SALARIO < ALL (SELECT MIN(SALARIO) FROM EMPREGADO WHERE DEPARTAMENTO = 50); Subconsulta (ALL) http://www.alvarofpinheiro.eti.br
  • 171. ●Ocorre quando uma subconsulta faz referência a uma coluna de uma tabela referenciada na instrução mãe. Uma subconsulta correlacionada é avaliada uma vez para cada linha processada pela instrução mãe. A instrução mãe pode ser uma instrução SELECT, UPDATE ou DELETE. ●Prática: o Exibir todos os empregados (Sobrenome, Salário e Número do Departamento) que ganham acima do salário médio de seus respectivos departamentos. Subconsulta (Correlacionadas) http://www.alvarofpinheiro.eti.br
  • 172. SELECT EXT.SOBRENOME, EXT.SALARIO, EXT.DEPARTAMENTO FROM EMPREGADO EXT WHERE EXT.SALARIO > (SELECT AVG(ITN.SALARIO) FROM EMPREGADO ITN WHERE ITN.DEPARTAMENTO = EXT.DEPARTAMENTO); Subconsulta (Correlacionadas) http://www.alvarofpinheiro.eti.br
  • 173. ●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: A pesquisa na consulta interna não continuará; e A condição será indicada por um flag TRUE. Se o valor de linha de uma subconsulta não for encontrado: A condição será indicada por um flag FALSE; A pesquisa continuará na consulta interna. ●Prática: o Exibir os empregados (Sobrenome, Salário e Número do Departamento) com no mínimo uma pessoa subordinada a eles. Subconsulta (EXISTS) http://www.alvarofpinheiro.eti.br
  • 174. SELECT EXT.SOBRENOME, EXT.SALARIO, EXT.DEPARTAMENTO FROM EMPREGADO EXT WHERE EXISTS (SELECT 'X' FROM EMPREGADO ITN WHERE ITN.GERENTE = EXT.NUMERO); Subconsulta (EXISTS) http://www.alvarofpinheiro.eti.br
  • 175. ●Retorna todas as linhas selecionadas por uma consuta. Use esse operador para retornar todas as linhas de várias tabelas e eliminar as linhas duplicadas. ●Dicas: o Necessáriamente os campos das tabelas unidas devem possuir os mesmos tipos de dados; o Os campos devem estar posicionados na mesma ordem; o A quantidade de campos deve ser a mesma; o A cláusula ORDER BY deve ser utilizada no final da união. ●Prática: o Exibir a união das tabelas Cargo e Departamento para os campos Número e Nome. União http://www.alvarofpinheiro.eti.br
  • 176. SELECT NUMERO, NOME FROM CARGO UNION SELECT NUMERO, NOME FROM DEPARTAMENTO; União http://www.alvarofpinheiro.eti.br
  • 177. ●Serve para retornar todas as linhas comuns a várias consultas. ●Prática: o Exibir a intersecção das tabelas Cargo e Departamento para os campos Número e Nome. Intersecção http://www.alvarofpinheiro.eti.br
  • 178. --SQLServer | Postgre | Oracle SELECT NUMERO, NOME FROM CARGO INTERSECT SELECT NUMERO, NOME FROM DEPARTAMENTO; --MySQL SELECT NUMERO, NOME FROM CARGO INNER JOIN DEPARTAMENTO USING (NUMERO, NOME); Intersecção http://www.alvarofpinheiro.eti.br
  • 179. ●Serve para obter linhas retornadas pela primeira consulta e ausentes na segunda consulta. ●Prática: o Exibir a subtração das tabelas Cargo e Departamento para os campos Número e Nome. Subtração http://www.alvarofpinheiro.eti.br
  • 180. --SQLServer | Oracle SELECT NUMERO, NOME FROM CARGO MINUS SELECT NUMERO, NOME FROM DEPARTAMENTO; --Postgre SELECT NUMERO, NOME FROM CARGO EXCEPT SELECT NUMERO, NOME FROM DEPARTAMENTO; --MySQL SELECT DISTINCT NUMERO, NOME FROM CARGO WHERE (NUMERO, NOME) NOT IN (SELECT NUMERO, NOME FROM DEPARTAMENTO); Subtração http://www.alvarofpinheiro.eti.br
  • 181. ●Alguns bancos permitem passagem de parâmetros com o uso de variáveis de substituição. ●Dicas: o No Oracle a macrosubstituição é com (&); o No SQLServer a macrosubstituição é com (:); ●Prática: o Exibir o Sobrenome do empregado que possuir o Número informado pelo usuário. Macrosubstituição http://www.alvarofpinheiro.eti.br
  • 182. SELECT SOBRENOME FROM EMPREGADO WHERE NUMERO = :Informe_Numero; Macrosubstituição http://www.alvarofpinheiro.eti.br
  • 183. ●Alguns BD permitem a selecão de dados nas cláusulas SELECT e FROM. ●Exemplo: o Oracle ● SELECT CARGO FROM ● (SELECT C.NOME AS CARGO, AVG(E.SALARIO) AS MEDIASALARIO ● FROM CARGO C INNER JOIN EMPREGADO E ● ON C.NUMERO = E.CARGO ● GROUP BY C.NOME); o SQLServer ● SELECT E.NUMERO, E.SOBRENOME, E.SALARIO, E.DEPARTAMENTO AS DEPCOD, (SELECT D.NOME FROM DEPARTAMENTO D WHERE D.NUMERO = E.DEPARTAMENTO) AS DEPNOME ● FROM EMPREGADO E; Seleção de Seleção http://www.alvarofpinheiro.eti.br
  • 184. ●Alguns BD permitem a selecão das N primeiras linhas que satisfazem a uma determinada seleção. ●Prática: o Exibir os 2 primeiros registros de empregados cujos os salários sejam menores que 2000. Análise Top-N http://www.alvarofpinheiro.eti.br
  • 185. --SQLServer SELECT TOP 2 NUMERO, APELIDO, SALARIO FROM EMPREGADO WHERE SALARIO < 2000; --Postgre | MySQL SELECT NUMERO, APELIDO, SALARIO FROM EMPREGADO WHERE SALARIO < 2000 LIMIT 2; --Oracle SELECT NUMERO, APELIDO, SALARIO FROM EMPREGADO WHERE SALARIO < 2000 AND ROWNUM <= 2; --Firebird SELECT FIRST 2 NUMERO, APELIDO, SALARIO FROM EMPREGADO WHERE SALARIO < 2000; Análise Top-N http://www.alvarofpinheiro.eti.br
  • 186. Apagar registros: DELETE FROM nome [WHERE definição] [ORDER BY ...]; Apagar e recriar tabela: TRUNCATE TABLE nome_tabela; Apagar tabela: DROP TABLE nome_tabela; Apagar http://www.alvarofpinheiro.eti.br
  • 187. ●Tratamento de dados de forma atômica. ●Dica: Em alguns BD as instruções DDL e DCL são automáticas. ●Práticas: o Exibir os dados da tabela Empregado; o Salvar um ponto A; o Apagar todos os empregados do Departamento 50; o Exibir os dados da tabela Empregado; o Salvar um ponto B; o Apagar todos os empregados com Salário = 1000; o Exibir os dados da tabela Empregado; o Restaurar o ponto A; o Exibir os dados da tabela Empregado; o Restaurar o ponto B; o Exibir os dados da tabela Empregado. Transações http://www.alvarofpinheiro.eti.br
  • 188. --SQLServer SAVE TRANSACTION A; SELECT FROM DEPARTAMENTO; DELETE FROM DEPARTAMENTO WHERE NUMERO = 110; SELECT FROM DEPARTAMENTO; UPDATE DEPARTAMENTO SET NOME = 'TESTE' WHERE NUMERO = 90; SELECT FROM DEPARTAMENTO; ROLLBACK TRANSACTION A; SAVE TRANSACTION B; INSERT INTO DEPARTAMENTO (NUMERO, NOME) VALUES (200, 'TESTE2'); SELECT FROM DEPARTAMENTO; COMMIT TRANSACTION B; SELECT FROM DEPARTAMENTO; Transações http://www.alvarofpinheiro.eti.br
  • 189. ●Serve para apresentar combinações ou subconjuntos lógicos de dados através de views de tabelas. A view é uma tabela lógica baseada em uma tabela ou em outra view. Ela não contém dados próprios, mas é uma janela por meio da qual os dados das tabelas podem ser vistos e algumas vezes alterados. As tabelas nas quais uma view se baseia são denominadas de tabelas-base. A view é armazenada como uma instrução SELECT no dicionário de dados. ●Dicas: o Serve para restringir o acesso a dados; o Serve para facilitar as consultas complexas; o Serve para permitir a independência dos dados; o Serve para apresentar diferentes visões dos mesmos dados. Visão http://www.alvarofpinheiro.eti.br
  • 190. ●View Simples o Cria dados a partir de uma tabela apenas; o Não contém funções e nem grupo de dados; o Permite operações DML. ●View Complexas o Cria dados a partir de várias tabelas; o Contém funções ou grupo de dados; o Nem sempre permite operações DML. Visão http://www.alvarofpinheiro.eti.br
  • 191. ●Sintaxe: ●CREATE VIEW [ schema_name . ] view_name ●[ (column [ ,...n ] ) ] ●AS select_statement; Visão http://www.alvarofpinheiro.eti.br
  • 192. ●Prática: Criar uma visão denominada VISAO_1, que contenha os campos Número, Primeironome, Sobrenome dos empregados do departamento 80. Depois de criada insira um novo registro nessa visão. Finalizando exiba todos os dados da tabela Empregado. Visão Simples http://www.alvarofpinheiro.eti.br
  • 193. CREATE VIEW VISAO_1 AS SELECT NUMERO, PRIMEIRONOME, SOBRENOME FROM EMPREGADO WHERE DEPARTAMENTO=80; INSERT INTO VISAO_1 VALUES (200, 'ANTONIETA', 'LARANJEIRA'); SELECT FROM EMPREGADO; Visão Simples http://www.alvarofpinheiro.eti.br
  • 194. ●Prática: Criar uma visão denominada VISAO_2, que contenha os campos Nome (Primeironome + ‘ ‘ + Sobrenome) e o campo Salariobase (Salário – 500) dos empregados do departamento 30. Depois de criada tente insir um novo registro nessa visão. Finalizando exiba todos os dados da tabela Empregado. Visão Complexa http://www.alvarofpinheiro.eti.br
  • 195. CREATE VIEW VISAO_2 AS SELECT (PRIMEIRONOME + ' ' + SOBRENOME) AS NOME, (SALARIO - 500) AS SALARIOBASE FROM EMPREGADO WHERE DEPARTAMENTO=10; INSERT INTO VISAO_2 VALUES ('JULIETA PEREIRA', 400); SELECT FROM EMPREGADO; Visão Complexa http://www.alvarofpinheiro.eti.br
  • 196. ●Criar novos usuários para o BD. ●Sintaxe: o SQLServer ●CREATE LOGIN login ●WITH PASSWORD = ‘senha'; ●CREATE USER usuario ●FOR LOGIN [operador] ●WITH DEFAULT_SCHEMA = [dbo]; o Oracle ●CREATE USER usuario ●IDENTIFIED BY ‘senha'; ●Prática: Criar um novo usuário. Usuário http://www.alvarofpinheiro.eti.br
  • 197. --Para adicionar um usuário ao banco de dados do SQL Server você tem que seguir três passos: --Primeiro: você deve criar um login, que é um "cara" que tem permisssão de se logar no SQL Sever CREATE LOGIN USUARIO WITH PASSWORD = 'senha'; --Segundo: você deve criar um usuário para o banco de dados que deseja mapeando esse usuário para o --login criado, assim seu usuário conseguirá se logar no SQL Server e entrar no banco de dados desejado. CREATE USER USUARIO FROM LOGIN USUARIO; --Terceiro: você deve dar ou remover permissões ao usuário porque até o segundo passo o usuário criado só --tem direito a entrar no banco de dados, dando as permissões o usuário já pode operar no banco de dados. --Se o usuário for comum você pode adicioná-lo apenas as roles de db_reader e db_writer, que permitirá que --o usuário faça select, insert, delete e update em todas as tabelas do referido banco de dados. EXEC SP_ADDROLEMEMBER 'DB_DATAREADER', 'USUARIO' Usuário http://www.alvarofpinheiro.eti.br
  • 198. ●Fornecer acesso aos objetos dos BD. ●Sintaxe: o GRANT privilégio ON objeto TO usuário; ●Exemplos: o GRANT CREATE TABLE, CREATE VIEW TO operador1; o GRANT SELECT ON EMPREGADO TO operador1; Privilégios http://www.alvarofpinheiro.eti.br
  • 199. ●Retirar acesso aos objetos dos BD. ●Sintaxe: o REVOKE privilégio ON objeto FROM usuário; ●Exemplos: o REVOKE CREATE TABLE, CREATE VIEW FROM operador1; o REVOKE SELECT ON EMPREGADO FROM operador1; Privilégios http://www.alvarofpinheiro.eti.br
  • 200. ●Alguns bancos como o Postgre e o Oracle possuem um objeto chamado de sequencia que equivale no SQLServer a regra de IDENTITY( 1, 1). ●Sintaxe: ● CREATE [TEMPORARY | TEMP] SEQUENCE name ● [INCREMENT [BY] increment ] ● [MINVALUE minvalue | NO MINVALUE] ● [MAXVALUE maxvalue | NO MAXVALUE] ● [START [ WITH ] start] ● [CACHE cache] ● [[ NO ] CYCLE] Sequência http://www.alvarofpinheiro.eti.br
  • 201. Funções SQLServer ASCII(string) pega o valor em ASCII da string CHAR(integer) troca inteiro do ASCII em um caracter LEN(string) Identifica o comprimento de uma expressão em caracteres LOWER(string) converte uma string uppercase para lowercase. LTRIM(string) remove os espaços em branco Funções http://www.alvarofpinheiro.eti.br
  • 202. Funções SQLServer PATINDEX(posicao, expressao) devolve a posicão de uma string dentro de um texto. Se não encontrar, retorna zero. REPLICATE(string, integer) repete N vezes um caractere especificado REVERSE(string) retorna o inverso de uma expressao RTRIM(string) remove os espaços em branco à direita de uma string SPACE(integer) que retorna o número de espaços em branco informados no parâmetro Funções http://www.alvarofpinheiro.eti.br
  • 203. Funções SQLServer STUFF(string texto, X, Y, string texto_a_inserir) apaga da string "texto" os y caracteres a partir da posição x e os substitui por "texto_a_inserir" SUBSTRING(string texto, posicao_inicial, tamanho) retorna uma string com o comprimento definido em "tamanho" extraida da string "texto", a partir da "posicao_inicial" UPPER(string) retorna string em maiusculas DATEADD (parte, numero, data) adiciona um valor a parte de uma data Funções http://www.alvarofpinheiro.eti.br
  • 204. Funções SQLServer DATEDIFF (parte, data inicial, data final) subtrai a data inicial da data final, indicando o resultado na unidade definida em "parte" GETDATE() retorna a data atual do sistema DATENAME (parte, data) retorna o nome da parte de uma data DATEPART(parte, data) retorna a parte de uma data CAST(expressao as datatype) converte uma expressao no datatype informado Funções http://www.alvarofpinheiro.eti.br
  • 205. Funções SQLServer COL_LENGTH(nome_da_tabela, nome_da_coluna) retorna o tamanho da coluna COL_NAME(id_da_tabela, id_da_coluna) retorna o nome da coluna DATALENGTH(expressao) retorna o numero de bytes usados para armazenar a expressao DB_ID(nome_do_banco) retorna o ID do banco informado DB_NAME(id_do_banco) retorna o nome do banco Funções http://www.alvarofpinheiro.eti.br
  • 206. Funções SQLServer HOST_ID() retorna a ID da estação que está acessando o SQL Server HOST_NAME() retorna o nome da estação que está acessando o SQL Server IDENT_INCR(nome_da_tabela_ou_view) retorna o valor incrementado IDENT_SEED(tabela_ou_view) retorna o valor inicial da coluna INDEX_COL(nome_da_tabela, indice_id, chave_id) retorna o nome da coluna que participa do índice Funções http://www.alvarofpinheiro.eti.br
  • 207. Funções SQLServer ISNULL(expressao, valor) se a expressao for null, troca pelo valor especificado ISNUMERIC(expressao) retorna 1 se a expressao for numerica e 0 se não for NEWID() retorna um novo valor do tipo uniqueidentifier NULLIF(expressao_1, expressao_2) retorna nulo se as duas expressoes forem equivalentes. Se não forem, retorna a primeira expressao. OBJECT_ID(nome_do_objeto) retorna o ID de um objeto, a partir do nome fornecido Funções http://www.alvarofpinheiro.eti.br
  • 208. Funções SQLServer OBJECT_NAME(ID_do_objeto) retorna o nome do objeto, a partir do ID fornecido PARSENAME(objeto, parte) retorna a parte do nome de um objeto, desde que tenha sido qualificado STATS_DATE(tabela_id, indice_id) retorna a data em que as estatísticas do índice foram atualizadas SUSER_SID(nome_do_usuario) retorna o ID do usuario informado SUSER_NAME(usuario_id) retorna o id do usuário no servidor. O argumento é opcional. Funções http://www.alvarofpinheiro.eti.br
  • 209. Funções SQLServer ABS(numero) retorna o valor absoluto do numero ACOS(float) retorna o arco-coseno do numero informado ASIN(float) retorna o arco-seno do numero informado ATAN(float) retorna o arco-tangente do numero informado ATN2(Float expressao_1, float expressao_2) arco-tangente do valor definido pela divisão da primeira expressão pela segunda Funções http://www.alvarofpinheiro.eti.br
  • 210. Funções SQLServer CEILING(numero) retorna o menor inteiro que seja maior ou igual ao numero informado COS(float) retorna o coseno do numero informado COT(float) retorna o cotangente do numero informado DEGREES(numero) converte radianos para graus EXP(float) retorna o exponencial de um numero especificado Funções http://www.alvarofpinheiro.eti.br
  • 211. Funções SQLServer FLOOR(numero) retorna o maior inteiro que seja menor ou igual ao numero informado LOG(float) retorna o logaritmo natural do numero informado LOG10(float) retorna o logaritmo base 10 do numero informado PI() retorna o valor de PI 3.1415926535897931. POWER(numero, potencia) retorna o valor elevado à potencia informada Funções http://www.alvarofpinheiro.eti.br
  • 212. Funções SQLServer RADIANS(numero) converte graus para radianos RAND(expressao) um número aleatório entre 0 e 1. Expressão é opcional e será usada como semente da cadeia pseudo-aleatória ROUND(numero, precisao, arredonda_ou_trancar) arredonda ou tranca o numero fornecido de acordo com a precisao informada. Se o terceiro parametro não for passado para a funçao, o numero é arredondado. Se quiser que o numero seja truncado, deve-se fornecer o valor 1 SIGN(numero) retorna sinal positivo, negativo ou zero do numero Funções http://www.alvarofpinheiro.eti.br
  • 213. Funções SQLServer SIN(float) retorna o seno do angulo especificado SQRT(float) retorna a raiz quadrada de um numero TAN(float) retorna a tangente de um numero informado SQUARE(float) retorna o quadrado de um numero Funções http://www.alvarofpinheiro.eti.br
  • 214. ●Tables ●Views ●Functions ●Domains ●Rules ●Triggers ●Indices ●Sequences ●Composite Types ●Enum Types ●Base Types ●Aggregates ●Operators Objetos (Postgre) http://www.alvarofpinheiro.eti.br
  • 215. ●A grande vantagem dos vínculos de banco de dados é que eles permitem aos usuários acessarem dados de um banco de dados remoto de modo que eles fiquem conectados por meio do conjunto de privilégios do proprietário do objeto. Em outras palavras, um usuário local pode acessar um banco de dados remoto sem necessariamente ser um usuário do banco de dados remoto. ●Sintaxe: o Para criação de vínculo:  CREATE PUBLIC DATABASE LINK banco  USING ‘usuário’; o Para acessar dados:  SELECT FROM objeto@banco; Vínculos http://www.alvarofpinheiro.eti.br
  • 216. Para haver comunicação entre uma página e um banco de dados se usa SQL. A SQL Injection ou Injeção de SQL é uma técnica muito fácil e muito poderosa. Não são necessários scanners para achar sites vulneráveis e os comandos são enviados diretamente no navegador. O único pré-requisito para usar essa técnica é um conhecimento básico de SQL, que são todos em inglês e simples, dessa forma favorecendo a um invasor. SQL Injection http://www.alvarofpinheiro.eti.br
  • 217. Baseado no exemplo a seguir: campo_usuario = Request.Form(“usuário”) campo_senha = Request.Form(“senha”) SELECT (usuario,senha) FROM cadastro WHERE usuario=’ || campo_usuario || ‘ AND senha=’ || campo_senha || ‘ SQL Injection http://www.alvarofpinheiro.eti.br
  • 218. Se o usuário e a senha estiverem corretos o login é efetuado. Se digitarmos um código malicioso, como ’ OR ‘1’=‘1´, sempre o login será validado. SELECT (usuario,senha) FROM cadastro WHERE usuario=’ ‘ OR ‘1’=’1 ‘ AND senha=’ ‘ OR ‘1’=’1 ‘ SQL Injection http://www.alvarofpinheiro.eti.br
  • 219. Pode-se usar o Google para achar páginas vulneráveis e verificar como o login é feito nas páginas da web. Um dos testes é usar o comando allinurl. Ele retornar somente páginas que tenham determinados termos na URL. Exemplos: allinurl:”admin/index.asp” allinurl:”admin/login.asp” allinurl:”admin/default.asp” allinurl:”admin/admin.asp” SQL Injection http://www.alvarofpinheiro.eti.br
  • 220. Uma forma de prevenção é nunca passar valores diretamente em strings SQL e não deixe claro a finalidade dos campos. SQL Injection http://www.alvarofpinheiro.eti.br
  • 234. http://www.alvarofpinheiro.eti.br Exercício --Obs: utilizado SQL Server 2008 R2 --Estruturas --Exemplo de dados: livro, periódico, revista, CD, DVD, ... CREATE TABLE [dbo].[BIBLIO_TIPOSDEITENS] ( [ID_TDI] int IDENTITY(1, 1) NOT NULL, [VC_TDI_ITEM] varchar(50) COLLATE SQL_Latin1_General_CP1_CI_AI NULL, [NU_TDI_QTDEDIASDEVOLUCAO] int NULL, CONSTRAINT [PK_BIBLIO_TIPOSDEITENS] PRIMARY KEY CLUSTERED ([ID_TDI]) ) ON [PRIMARY] GO --Exemplo de dados: português, inglês, espanhol, ... CREATE TABLE [dbo].[BIBLIO_IDIOMAS] ( [ID_IDI] int IDENTITY(1, 1) NOT NULL, [VC_IDI_NOME] varchar(50) COLLATE SQL_Latin1_General_CP1_CI_AI NULL, CONSTRAINT [PK_BIBLIO_IDIOMAS] PRIMARY KEY CLUSTERED ([ID_IDI]) ) ON [PRIMARY] GO
  • 235. http://www.alvarofpinheiro.eti.br Exercício --Exemplo de dados: ltc, mcgrawhill, ... CREATE TABLE [dbo].[BIBLIO_EDITORAS] ( [ID_EDI] int IDENTITY(1, 1) NOT NULL, [VC_EDI_NOME] varchar(100) COLLATE SQL_Latin1_General_CP1_CI_AI NULL, [VC_EDI_LOCALIZACAO] varchar(1000) COLLATE SQL_Latin1_General_CP1_CI_AI NULL, CONSTRAINT [PK_BIBLIO_EDITORAS] PRIMARY KEY CLUSTERED ([ID_EDI]) ) ON [PRIMARY] GO --Exemplo de dados: romance, ficcção, ... (são os gêneros) CREATE TABLE [dbo].[BIBLIO_CLASSIFICACAOLITERARIA] ( [ID_CLA] int IDENTITY(1, 1) NOT NULL, [VC_CLA_NOME] varchar(100) COLLATE SQL_Latin1_General_CP1_CI_AI NULL, CONSTRAINT [PK_BIBLIO_CLASSIFICACAOLITERARIA] PRIMARY KEY CLUSTERED ([ID_CLA]) ) ON [PRIMARY] GO
  • 236. http://www.alvarofpinheiro.eti.br Exercício --Exemplo de dados: roger presmann, ian summerville, ... CREATE TABLE [dbo].[BIBLIO_AUTORES] ( [ID_AUT] int IDENTITY(1, 1) NOT NULL, [VC_AUT_NOME] varchar(100) COLLATE SQL_Latin1_General_CP1_CI_AI NULL, CONSTRAINT [PK_BIBLIO_AUTORES] PRIMARY KEY CLUSTERED ([ID_AUT]) ) ON [PRIMARY] GO
  • 237. http://www.alvarofpinheiro.eti.br Exercício --Exemplo de dados: engenharia de software, introdução a banco de dados, ... CREATE TABLE [dbo].[BIBLIO_ACERVO] ( [ID_ACE] int IDENTITY(1, 1) NOT NULL, [VC_ACE_TITULODAOBRA] varchar(500) COLLATE SQL_Latin1_General_CP1_CI_AI NULL, [VC_ACE_SUBTITULO] varchar(500) COLLATE SQL_Latin1_General_CP1_CI_AI NULL, [DT_ACE_AQUISICAO] varchar(10) COLLATE SQL_Latin1_General_CP1_CI_AI NULL, [VC_ACE_EXEMPLAR] varchar(10) COLLATE SQL_Latin1_General_CP1_CI_AI NULL, [VC_ACE_VOLUME] varchar(10) COLLATE SQL_Latin1_General_CP1_CI_AI NULL, [NU_ACE_PERIODICO] varchar(10) COLLATE SQL_Latin1_General_CP1_CI_AI NULL, [VC_ACE_EDICAO] varchar(10) COLLATE SQL_Latin1_General_CP1_CI_AI NULL, [ID_EDI] int NULL, [ID_CLA] int NULL, [ID_TDI] int NULL, [ID_IDI] int NULL, [NU_ACE_ANODAEDICAO] int NULL,
  • 238. http://www.alvarofpinheiro.eti.br Exercício [NU_ACE_NUMPAGINAS] int NULL, [VC_ACE_CUTTER] varchar(25) COLLATE SQL_Latin1_General_CP1_CI_AI NULL, [VC_ACE_CDU] varchar(25) COLLATE SQL_Latin1_General_CP1_CI_AI NULL, [VC_ACE_ISBN] varchar(25) COLLATE SQL_Latin1_General_CP1_CI_AI NULL, [VC_ACE_ISNN] varchar(25) COLLATE SQL_Latin1_General_CP1_CI_AI NULL, [BI_ACE_CAPA] image NULL, [NU_ACE_CAPA] bigint NULL, [VC_ACE_CAPA] varchar(50) COLLATE SQL_Latin1_General_CP1_CI_AI NULL, [VC_ACE_DIGITALIZACAO] varchar(100) COLLATE SQL_Latin1_General_CP1_CI_AI NULL, CONSTRAINT [PK_BIBLIO_ACERVO] PRIMARY KEY CLUSTERED ([ID_ACE]), CONSTRAINT [FK_BIBLIO_ACERVO_BIBLIO_CLASSIFICACAOLITERARIA] FOREIGN KEY ([ID_CLA]) REFERENCES [dbo].[BIBLIO_CLASSIFICACAOLITERARIA] ([ID_CLA]) ON UPDATE CASCADE ON DELETE CASCADE, CONSTRAINT [FK_BIBLIO_ACERVO_BIBLIO_EDITORAS] FOREIGN KEY ([ID_EDI]) REFERENCES [dbo].[BIBLIO_EDITORAS] ([ID_EDI]) ON UPDATE CASCADE ON DELETE CASCADE, CONSTRAINT [FK_BIBLIO_ACERVO_BIBLIO_IDIOMAS] FOREIGN KEY ([ID_IDI]) REFERENCES [dbo].[BIBLIO_IDIOMAS] ([ID_IDI]) ON UPDATE CASCADE ON DELETE CASCADE,
  • 239. http://www.alvarofpinheiro.eti.br Exercício CONSTRAINT [FK_BIBLIO_ACERVO_BIBLIO_TIPOSDEITENS] FOREIGN KEY ([ID_TDI]) REFERENCES [dbo].[BIBLIO_TIPOSDEITENS] ([ID_TDI]) ON UPDATE CASCADE ON DELETE CASCADE ) ON [PRIMARY] GO CREATE TABLE [dbo].[BIBLIO_EMPRESTIMOS] ( [ID_EMP] int IDENTITY(1, 1) NOT NULL, [ID_PES] int NOT NULL, [ID_ACE] int NOT NULL, [DT_EMP_EMPRESTIMO] varchar(10) COLLATE SQL_Latin1_General_CP1_CI_AI NULL, [DT_EMP_DEVOLUCAO] varchar(10) COLLATE SQL_Latin1_General_CP1_CI_AI NULL, CONSTRAINT [PK_BIBLIO_EMPRESTIMOS] PRIMARY KEY CLUSTERED ([ID_EMP]) ) ON [PRIMARY] GO
  • 240. http://www.alvarofpinheiro.eti.br Exercício --Questões --1.Mostre os livros que tem ano de edição superior a 2000. (0,5) SELECT ID_ACE, VC_ACE_TITULODAOBRA, NU_ACE_ANODAEDICAO FROM BIBLIO_ACERVO WHERE NU_ACE_ANODAEDICAO > 2000 ORDER BY NU_ACE_ANODAEDICAO; --2.Mostre os livros cujos os títulos iniciem com A, E ou O. (0,5) SELECT ID_ACE, VC_ACE_TITULODAOBRA FROM BIBLIO_ACERVO WHERE (VC_ACE_TITULODAOBRA LIKE 'A%') OR (VC_ACE_TITULODAOBRA LIKE 'E%') OR (VC_ACE_TITULODAOBRA LIKE 'O%'); --3.Mostre os livros que possuem apenas um autor. (0,5) SELECT ACE.ID_ACE, ACE.VC_ACE_TITULODAOBRA, AUT.VC_AUT_NOME FROM BIBLIO_ACERVOAUTORES AA INNER JOIN BIBLIO_ACERVO ACE ON ACE.ID_ACE = AA.ID_ACE INNER JOIN BIBLIO_AUTORES AUT ON AUT.ID_AUT = AA.ID_AUT
  • 241. http://www.alvarofpinheiro.eti.br Exercício --4.Mostre os livros e o nomes dos autores das editoras de código 1, 2, 3 ou 4. (0,5) SELECT ACE.ID_ACE, ACE.VC_ACE_TITULODAOBRA, AUT.VC_AUT_NOME FROM BIBLIO_ACERVOAUTORES AA INNER JOIN BIBLIO_ACERVO ACE ON ACE.ID_ACE = AA.ID_ACE INNER JOIN BIBLIO_AUTORES AUT ON AUT.ID_AUT = AA.ID_AUT WHERE ACE.ID_EDI IN (1,2,3,4); --5.Quais livros são encontrados nos gêneros ficção e romance, e quantos livros desses livros existem por ano de edição. (0,5) SELECT G.VC_CLA_NOME, A.NU_ACE_ANODAEDICAO, COUNT(A.ID_ACE) AS QTDE FROM BIBLIO_ACERVO A INNER JOIN BIBLIO_CLASSIFICACAOLITERARIA G ON A.ID_CLA = G.ID_CLA WHERE (G.VC_CLA_NOME LIKE '%FICÇÃO%') OR (G.VC_CLA_NOME LIKE '%ROMANCE%') GROUP BY G.VC_CLA_NOME, A.NU_ACE_ANODAEDICAO;
  • 242. http://www.alvarofpinheiro.eti.br Exercício --6.Mostre os 10 livros que mais empréstimo possuem. (0,5) SELECT TOP 10 A.ID_ACE, A.VC_ACE_TITULODAOBRA, COUNT(E.ID_EMP) AS QTDE FROM BIBLIO_EMPRESTIMOS E INNER JOIN BIBLIO_ACERVO A ON E.ID_ACE = A.ID_ACE GROUP BY A.ID_ACE, A.VC_ACE_TITULODAOBRA; --7.Mostre todos os livros por tipo de itens. (0,5) SELECT T.VC_TDI_ITEM, A.VC_ACE_TITULODAOBRA FROM BIBLIO_ACERVO A INNER JOIN BIBLIO_TIPOSDEITENS T ON A.ID_TDI = T.ID_TDI ORDER BY 1,2;
  • 243. http://www.alvarofpinheiro.eti.br Exercício --8.Mostre a quantidade de livros no acervo, quantos foram emprestados e devolvidos no ano corrente. (0,5) SELECT 'QTDE LIVROS NO ACERVO' AS TITULO, COUNT(A.ID_ACE) AS QTDE FROM BIBLIO_ACERVO A UNION SELECT 'QTDE LIVROS EMPRESTADOS' AS TITULO, COUNT(E.ID_EMP) AS QTDE FROM BIBLIO_EMPRESTIMOS E WHERE CAST(SUBSTRING(E.DT_EMP_EMPRESTIMO, 7,4) AS INTEGER) = YEAR(GETDATE()) UNION SELECT 'QTDE LIVROS DEVOLVIDOS' AS TITULO, COUNT(E.ID_EMP) AS QTDE FROM BIBLIO_EMPRESTIMOS E WHERE CAST(SUBSTRING(E.DT_EMP_DEVOLUCAO, 7,4) AS INTEGER) = YEAR(GETDATE()); --9.Mostre os gêneros que não possuem livros cadastrados. (0,5) SELECT G.ID_CLA, G.VC_CLA_NOME FROM BIBLIO_CLASSIFICACAOLITERARIA G WHERE G.ID_CLA NOT IN (SELECT DISTINCT A.ID_CLA FROM BIBLIO_ACERVO A)
  • 244. http://www.alvarofpinheiro.eti.br Exercício --10.Mostre a média de empréstimo de livros por mês. (0,5) SELECT SUBSTRING(E.DT_EMP_EMPRESTIMO,7,4) AS ANO, SUBSTRING(E.DT_EMP_EMPRESTIMO,4,2) AS MES, AVG(E.ID_EMP) AS MEDIA FROM BIBLIO_EMPRESTIMOS E GROUP BY SUBSTRING(E.DT_EMP_EMPRESTIMO,7,4), SUBSTRING(E.DT_EMP_EMPRESTIMO,4,2); --11.Mostre os livros com a descrição de finos os que possuem até 100 páginas, médios os que estejam entre 100 e 300 e grossos com mais de 300 páginas. (0,5) SELECT A.ID_ACE, A.VC_ACE_TITULODAOBRA, A.NU_ACE_NUMPAGINAS, CASE WHEN A.NU_ACE_NUMPAGINAS < 100 THEN 'FINOS' WHEN A.NU_ACE_NUMPAGINAS BETWEEN 100 AND 300 THEN 'MÉDIOS' ELSE 'GROSSOS' END AS ESPESSURA FROM BIBLIO_ACERVO A;
  • 245. http://www.alvarofpinheiro.eti.br Exercício --12.Mostre os livros por gênero com quantidade de empréstimos maior que 100. (0,5) SELECT G.VC_CLA_NOME, COUNT(E.ID_EMP) AS QTDE FROM BIBLIO_ACERVO A INNER JOIN BIBLIO_CLASSIFICACAOLITERARIA G ON A.ID_CLA = G.ID_CLA INNER JOIN BIBLIO_EMPRESTIMOS E ON A.ID_ACE = E.ID_ACE GROUP BY G.VC_CLA_NOME HAVING COUNT(E.ID_EMP) > 100; --13.Mostre os livros agrupados gênero e idioma. (0,5) SELECT G.VC_CLA_NOME, I.VC_IDI_NOME FROM BIBLIO_ACERVO A INNER JOIN BIBLIO_CLASSIFICACAOLITERARIA G ON A.ID_CLA = G.ID_CLA INNER JOIN BIBLIO_IDIOMAS I ON A.ID_IDI = I.ID_IDI GROUP BY G.VC_CLA_NOME, I.VC_IDI_NOME;
  • 246. http://www.alvarofpinheiro.eti.br Exercício --14.Mostre os 2 idiomas que possuem livros que mais são emprestados. (0,5) SELECT TOP 2 I.VC_IDI_NOME, COUNT(E.ID_EMP) FROM BIBLIO_ACERVO A INNER JOIN BIBLIO_IDIOMAS I ON A.ID_IDI = I.ID_IDI INNER JOIN BIBLIO_EMPRESTIMOS E ON A.ID_ACE = E.ID_ACE GROUP BY I.VC_IDI_NOME ORDER BY 2 DESC; --15.Mostre os livros que não possuem classificação literária. (0,5) SELECT A.VC_ACE_TITULODAOBRA FROM BIBLIO_ACERVO A WHERE ID_CLA IS NULL; --16.Mostre os livros que nunca foram emprestados. (0,5) SELECT A.VC_ACE_TITULODAOBRA FROM BIBLIO_ACERVO A WHERE A.ID_ACE NOT IN (SELECT E.ID_ACE FROM BIBLIO_EMPRESTIMOS E);
  • 247. http://www.alvarofpinheiro.eti.br Exercício --17.Mostre os livros por quantidade de gêneros e o total de livros no acervo. (0,5) SELECT G.VC_CLA_NOME, COUNT(A.ID_ACE) AS QTDE FROM BIBLIO_ACERVO A INNER JOIN BIBLIO_CLASSIFICACAOLITERARIA G ON A.ID_CLA = G.ID_CLA GROUP BY G.VC_CLA_NOME UNION SELECT 'TOTAL', COUNT(A.ID_ACE) AS QTDE FROM BIBLIO_ACERVO A; --18.Mostre os livros que tenham no mínimo um empréstimo. (0,5) SELECT A.VC_ACE_TITULODAOBRA FROM BIBLIO_ACERVO A INNER JOIN BIBLIO_EMPRESTIMOS E ON A.ID_ACE = E.ID_ACE; --19.Exibir a quantidade de livros agrupado por idioma com a quantidade menor que 60. (0,5) SELECT I.VC_IDI_NOME, COUNT(A.ID_ACE) AS QTDE FROM BIBLIO_ACERVO A INNER JOIN BIBLIO_IDIOMAS I ON A.ID_IDI = I.ID_IDI GROUP BY I.VC_IDI_NOME HAVING COUNT(A.ID_ACE) < 60;
  • 248. http://www.alvarofpinheiro.eti.br Exercício --20.Quais os livros estão em atraso nas devoluções (prazo de 5 dias para devolução). (0,5) SELECT A.VC_ACE_TITULODAOBRA FROM BIBLIO_ACERVO A INNER JOIN BIBLIO_EMPRESTIMOS E ON A.ID_ACE = E.ID_ACE WHERE GETDATE() > (CAST(E.DT_EMP_EMPRESTIMO AS DATETIME) + 5) AND E.DT_EMP_DEVOLUCAO IS NULL;