SQL – Structured Query Language
Linguagem de Consulta Estruturada
Profª Cilmara Ribeiro
Introdução
◼ Pode ser considerada uma das maiores razões
para o sucesso dos sistemas de banco de dados
relacionais.
◼ É suportada por todos os SGBDs relacionais
comerciais, sendo que estes devem suportar a
SQL padrão e outros comandos próprios.
◼ Se você usar SQL padrão, você não terá maiores
problemas com migração de SGBD para SGBD.
Introdução
◼ Inicialmente chamada de SEQUEL (Structured
English Query Language), foi projetada e
implementada pela IBM.
◼ Num esforço conjunto da ANSI (American
Nacional Standars Institute) e da ISO
(International Standards Organization) criou-se
a primeira versão padrão da SQL, a SQL-86,
substituída posteriormente pela SQL-92 e
depois pela SQL-99.
Introdução
◼ A SQL possui comandos para definição de dados,
consultas e atualizações, abrangendo uma DDL
(Data Definition Language) e uma DML (Data
Manipulation Language).
◼ Além disso define mecanismo para criação de
visões, especificações de segurança, autorizações,
definições de restrições e controle de transações.
◼ Também possui regras para embutir os comandos
SQL em linguagens de programação genérica como
Java, COBOL, ou C/C++.
Introdução
◼ O padrão SQL-99 foi dividido em uma
especificação de núcleo mais pacotes opcionais.
◼ O núcleo deve ser implementado por todos os
vendedores de SGBDs relacionais compatíveis com
este padrão.
◼ Os pacotes podem ser implementados como
módulos opcionais, que podem ser adquiridos
independentemente para aplicações específicas de
um BD.
Definição de Dados e Tipos de Dados SQL
◼ Termos usados: tabela, linha e coluna.
◼ Principal comando para definição de dados: CREATE
◼ Pode ser usado para criar esquemas, tabelas, visões,
etc.
◼ Esquema: agrupa tabelas e outros construtores que
pertencem à mesma aplicação de um banco de dados.
◼ Um esquema SQL é identificado por um nome de
esquema e inclui uma identificação de autorização, que
indica o usuário ou a conta a qual o esquema pertence.
Definição de Dados e Tipos de Dados
SQL
◼ Os elementos do esquema incluem tabelas,
restrições, visões, domínios.
◼ Exemplo:
Create schema bd_empresa authorization Jsmith
Definição de Dados e Tipos de Dados
SQL
◼ CREATE TABLE:
◼ Usado para especificar uma nova relação
(tabela), dando-lhe um nome e especificando
seus atributos e restrições iniciais.
◼ Forma geral
create table tbl_empregado
Definição de Dados e Tipos de Dados
SQL
◼ De maneira geral, o esquema SQL, no qual as
relações são declaradas, está implicitamente
definido dentro do ambiente no qual os
comandos CREATE TABLE serão executados.
◼ Alternativamente pode-se anexar de maneira
explícita o nome do esquema ao nome da
relação.
◼ Forma geral
create table bd_empresa.tbl_empregado
create table tbl_empregado
(emp_SSN Char(9) not null,
emp_Pnome Varchar(15) not null,
emp_Mnome Char,
emp_Unome Varchar(15) not null,
emp_DataNasc Date,
emp_Endereco Varchar(30),
emp_Sexo Char,
emp_Salario Decimal(10,2),
emp_SuperSSN Char(9),
dep_Numero Int not null,
Primary Key (emp_SSN),
Foreign Key (dep_Numero) references
tbl_departamento(dep_Numero));
create table tbl_departamento
(dep_Numero Int not null,
dep_Nome Varchar(15) not null,
emp_GerSSN Char(9) not null,
dep_GerDataInicio Date,
Primary Key (dep_Numero),
Unique (dep_Nome),
Foreign Key (emp_GerSSN) references
tbl_empregado(emp_SSN));
Restrições básicas
◼ Not null: valores nulos não são permitidos no
atributo
◼ Default <value> : valor padrão para um atributo
◼ Check: restringe os valores permitidos para um
atributo
◼ Suponha que os números dos departamentos estejam
restritos aos números inteiros entre 1 e 20.
... dep_Numero int not null check (dep_Numero > 0 and
dep_Numero < 21);
create domain dep_Numero as integer check
(dep_Numero > 0 and dep_Numero < 21)
Restrições básicas
◼ Primary Key: especifica um ou mais atributos que
definem a chave primária da relação.
◼ Unique: define chaves alternativas
◼ Foreign Key: define os atributos de chaves
estrangeiras e de onde (qual tabela e atributo) elas
vieram.
◼ Cascade e Set Default para on delete ou on
update: ações que devem ser tomadas quando da
exclusão ou alteração do atributo de chave
estrangeira em sua tabela original)
create table tbl_empregado
( ...,
dep_Numero Int not null Default 1,
primary key (emp_SSN),
foreing key (dep_Numero) references
tbl_departamento(dep_Numero) on delete
set default on update cascade);
Restrições básicas
◼ Restrições de tuplas
◼ Exemplo: poderíamos adicionar a cláusula
check, no final da declaração create table,
da tabela Departamento para ter certeza de
que a data da nomeação do seu gerente é
posterior à data de criação do departamento.
check (dep_cria_data < dep_ger_data_inicio)
Comandos para as alterações de
esquemas SQL
◼ Drop: elimina elementos de esquema
nomeados, como tabelas, domínios ou
restrições, ou até mesmo o esquema
propriamente dito.
drop schema bd_empresa cascade
drop schema bd_empresa restrict
drop table tbl_dependente cascade
Comandos para as alterações de
esquemas SQL
Alter: as definições de uma tabela básica (em meio estável) ou de outros
elementos do esquema que possuírem denominação poderão ser alteradas
pelo comando ALTER.
◼ alter table bd_empresa.tbl_empregado add emp_funcao varchar(12);
◼ alter table bd_empresa.tbl_empregado drop emp_endereco cascade;
◼ alter table bd_empresa.tbl_empregado alter emp_gersn drop default;
◼ alter table bd_empresa.tbl_empregado alter emp_gersn set default
“334455”;
Consultas básicas
Forma básica:
◼ SELETC <lista de atributos>
FROM <lista de tabelas>
WHERE <condição>;
Esquema:
tbl_empregado (emp_ssn, emp_pnome, emp_mnome,
emp_unome, emp_datanasc, emp_endereco, emp_sexo,
emp_salario, emp_superssn, dep_numero)
tbl_departamento (dep_numero, dep_nome, emp_gerssn,
dep_gerdatainicio)
tbl_depto_localizacoes (dep_numero, del_localizacao)
tbl_projeto (prj_numero, prj_nome, prj_localizaçao,
dep_numero)
tbl_trabalha_em (emp_ssn, prj_numero, tem_horas)
tbl_dependente (emp_ssn, dpe_nome_depen, dpe_sexo,
dpe_datanasc, dpe_parentesco)
◼ Encontre o aniversário e o endereço dos
empregados cujo nome seja ‘John B.
Smith’.
select emp_datanasc, emp_endereco
from tbl_empregado
where emp_pnome = ‘John’
and emp_mnome = ‘B’
and emp_unome = ‘Smith’;
Obs: o comando select não elimina tuplas
repetidas
◼ Encontre o nome e o endereço de todos os
empregados que trabalham no departamento
‘Pesquisa’.
select emp_pnome, emp_unome, emp_endereco
from tbl_empregado emp, tbl_departamento dep
where dep.dep_nome = ‘Pesquisa’
and dep.dep_numero = emp.dep_numero;
Obs: na cláusula FROM estão as tabelas que serão
juntadas com um produto cartesiano.
◼ Para cada projeto localizado em ‘Stanford’,
relacione o número do projeto, o número do
departamento responsável e o último nome do
gerente do departamento, seu endereço e sua
data de aniversário.
select prj.prj_numero, prj.dep_numero,
emp.emp_unome, emp.emp_endereco,
emp.emp_datanasc
from tbl_projeto prj, tbl_departamento dep,
tbl_empregado emp
where dep.dep_numero = prj.dep_numero
and dep.emp_gerssn = emp.emp_ssn
and prj.prj_localizacao = ‘Stanford’;
◼ Recupere todos os valores dos atributos de
empregado que trabalham no departamento de
número 5
select *
from tbl_empregado
where dep_numero = 5;
◼ Recupere o salário de todos os empregados
select all emp_salario
from tbl_empregado;
select distinct emp_salario
from tbl_empregado;
◼ Recupere todos os empregados cujos
endereços sejam em Houston, Texas.
select emp_pnome, emp_mnome,
emp_unome, emp_endereco
from tbl_empregado
where emp_endereco like ‘%Houston%’;
where emp_endereco like ‘%T%’;
where emp_endereco like ‘%S’;
where emp_endereco like ‘T%’;
◼ Recupere todos os empregados do
departamento 5 que ganham entre 30 mil
e 40 mil reais.
select *
from tbl_empregado
where (emp_salario between 30000 and 40000)
and dep_numero = 5;
◼ Recupere os nomes de todos os
empregados que não têm supervisor
select emp_pnome, emp_unome
from tbl_empregado
where emp_superssn is null;
where emp_superssn is not null;
where emp_superssn = ‘null’;
◼ Recupere o nome dos empregados que
não possuam nenhum dependente.
select emp.emp_pnome, emp.emp_unome
from tbl_empregado emp
where NOT EXISTS (select *
from tbl_dependente dpe
where emp.emp_ssn =
dpe.emp_ssn);
Testar somente com EXISTS, tirando o
NOT
◼ Recupere os números dos seguros sociais
de todos os empregados que trabalham
nos projetos 1, 2 ou 3.
select distinct emp_essn
from tbl_trabalha_em
where prj_numero in (1, 2, 3);
Outra opção:
where prj_numero = 1
or prj_numero = 2
or prj_numero = 3;
◼ Recupere o número total de
empregados da empresa
select count(*)
from tbl_empregado
◼ Operações de cálculo em SQL
select SUM(emp_salario) SOMA
from tbl_empregado;
select MAX(emp_salario) MAIOR
from tbl_empregado;
select MIN(emp_salario) MENOR
from tbl_empregado;
select AVG(emp_salario) MEDIA
from tbl_empregado;
select COUNT(emp_salario) CONTAR
from tbl_empregado;
Lista Exercícios 1
1) Recupere o nome e o endereço dos
empregados do departamento 15 que
ganham entre 60 mil e 100 mil reais.
2) Recupere o número total de empregados
da empresa que trabalham no
departamento “compras”
3) Recupere os números dos seguros sociais
de todos os empregados que trabalham
nos projetos 1, 3 ou 4.
4) Para cada projeto, recupere seu número,
seu nome e o número de empregados que
nele trabalham.
5) Selecione o número do seguro social de
todos os empregados que trabalham com
a mesma combinação (projeto, horas) em
algum dos projetos em que o empregado
‘John Smith’ (ssn = ‘1’) trabalhe.