SQL (Structured Query Language) é o padrão adotado para linguagens de consultas em Sistemas Gerenciadores de Banco de Dados Relacionais (SGBDR).

A linguagem oficial do modelo Relacional. Permite a definição de esquemas, restrições e definições além da manipulação de instâncias.

Considere as relações:

  • Cliente($\underline{RG}$, nome_cli, ano_nasc, cidade_cli, sexo)
  • Agencia($\underline{cod_ag}$, nome_ag, cidade_ag, ativo)
  • Deposito($\underline{num_dep}$, RG, saldo, cod_ag)
  • Empréstimo($\underline{num_empr}$, RG, valor, cod_ag)

DML

parte de modelagem

select lista_de_atributos (ou *)
from lista_de_relações
where predicado

exemplos:

select * 
from cliente
where cidade_cli = "Bauru" and sexo = "M"
select nome_cli, cidade_cli, num_dep
from cliente, deposito
where Cliente.rg = Deposito.rg and saldo > 200

podemos definir em Álgebra Relacional a operação acima:

  1. Produto Cartesiano
  2. Seleção
  3. Projeção

as Permitem associar um identificador a uma tabela. (e.g x = cliente)

todos os clientes que residem na mesma cidade do cliente de RG “123”

select y.nome_cli
from cliente as x, cliente as y
where y.cidade_cli = x.cidade_cli and x.rg = "123"

in/not in pertence/não pertence

todos os clientes que residem na mesma cidade do cliente de RG “123”

select nome_cli
from cliente
where cidade_cli in (
	select cidade_cli 
	from cliente
	where rg = "123"
)

todos os clientes que não residem na mesma cidade do cliente de RG “123”

select nome_cli
from cliente
where cidade_cli not in (
	select cidade_cli 
	from cliente
	where rg = "123"
)

union somente trabalha em conjuntos

(select nome_cli, saldo
from cliente
where saldo > 200.00)
union 
(select num_empr, valor
from emprestimo
where valor > 200.00)

intersect somente trabalha em conjuntos

(select nome_cli, saldo
from cliente
where saldo > 200.00)
intersect 
(select num_empr, valor
from emprestimo
where valor > 200.00)

minus

(select nome_cli, saldo
from cliente
where saldo > 200.00)
minus 
(select num_empr, valor
from emprestimo
where valor > 200.00)

some -> retorna todos os referentes dentro de um conjunto

select num_dept, RG 
from Deposito
where saldo > some
							(select saldo 
							 from Deposito
							 whehe rg = '12345')

all -> entre todos

contains / not contains B está contido em A i.e -> todas os cliente que possuam depositos em todas as cidades onde o cliente de rg = 1234 possuem deposito

select rg, nome_cli
from cliente as z
where
(
	(select cidade_ag
	 from agencia, deposito
	 where agencia.cod_ag = deposito.cod_ag
				 z.rg = deposito.rg)
	contains 
	(select cidade_ag
	from agencia, deposito 
	where deposito.rg = 1234 and deposito.cod_ag = agencia.cod_ag)
)

Agregação de túplas

  • avg() - média aritmética
  • sum() - soma
  • min() - mínimo dentre os resultados obtidos
  • max() - máximo dentre os resultados obtidos
  • count() - conta o número de resultados

group by = parametro de agrupamento having -> so usado com group by, permite comparações no group by

select cod_ag, avg(saldo)
from Deposito
group by (cod_ag)
having avg(saldo) > 1200

count

select rg, nome_cli
from cliente as x,
where 2 < (select count(*)
					 from Deposito as y
					 where y.rg = x.rg)

DDL

Os relacionamentos são definidos através da própria definição da DDL.

create

create table Cliente (
	RG varchar(40),   -- armazena apenas o tamanho usado
	NomeCli char(40), -- tem tamanho fixo
	cidade_cli char(40),
	ano_nasc integer,
	sexo enum {'M', 'F', 'O', 'PN'},
	primary key (RG)
)
create table Deposito (
	num_dept int(8),
	RG varchar(40),
	cod_ag varchar(40),
	saldo numeric(12, 2),
	ano_nasc integer,
	sexo enum {'M', 'F', 'O', 'PN'},
	primary key (num_dept),
	foreign key (RG) references cliente,
	foreign key (cod_ag) references agencia
)