Você está na página 1de 9

A linguagem SQL composta por inmeros comandos, os quais so agrupados da

seguinte maneira:

Comandos que definem dados;

Comandos que manipulam dados;

Comandos de controle de dados.

Algumas literaturas adicionam outras subdivises, mas neste post


vamos nos ater somente as citadas acima.

DDL

Quando voc cria um banco de dados, ele inicialmente est vazio; antes de
comear a consultar e alterar dados preciso definir onde e como as informaes
sero gravadas dentro do novo banco; ento voc cria diversas tabelas explicitando
o tipo de dados de cada campo, as chaves estrangeiras, os ndices, as regras e etc.
Estes comandos de criao e alterao de estrutura so os comandos de
DEFINIO dos dados, pois definem como os dados sero armazenados; em ingls
so chamados de: Data Definition Language (DDL). Logo, quando falamos em
comandos do tipo DDL estamos falando de comandos do tipo: CREATE, ALTER ou
DROP; comandos que criam, alteram ou excluem objetos como tabelas, procedures,
ndices, relacionamentos e etc.
Exemplos de comandos DDL:

1
2
3
4
5
6
7
8
9
10
11
12
13
14

-- Cria uma tabela


CREATE TABLE Pessoa(
codigoPessoa char(11),
nomePessoa varchar(50));
-- Altera tabela
ALTER TABLE Pessoa
ADD numeroTelefone varchar(11);
-- Exclui tabela
DROP TABLE Pessoa;

DML

Depois que voc criou suas tabelas, definiu relacionamentos, ndices e etc., hora
de manipular seus dados; os comandos SQL que MANIPULAM dados so os
populares SELECT, INSERT, UPDATE e DELETE. Em ingls esses comandos so
chamados de Data Manipulation Language o que explica a abreviao DML.

Em algumas literaturas o comando SELECT no considerado um


comando de manipulao de dados, sendo enquadrado numa outra
categoria: DQL, Data Query Language, em portugus: Linguagem de
consulta.
Exemplos de comandos DML:

1
2
3
4
5
6
7
8
9
10
11
12
13

-- Seleciona dados
SELECT nome+' '+sobrenome
FROM Pessoa;
-- Altera dados
UPDATE Pessoa
SET codigoPessoa = '35649869711';
-- Exclui dados
DELETE Pessoa;

DCL

Com o banco de dados pronto e rodando importante definir quem poder acesslo, enfim, precisamos definir a segurana do seu banco. Em ingls, os comandos
responsveis pelo controle dos dados so chamados de Data Control
Language (DCL). Os comandos GRANT e REVOKE fazem parte deste grupo.

1
2
3
4
5
6
7
8
9
10
11

-- Permisso de seleo na tabela Pessoa para a usuria Maria


GRANT SELECT ON Pessoa TO Maria;
-- Permisso de seleo e insero na tabela Pessoa para o usurio Alberto
GRANT SELECT, INSERT ON Pessoa TO Alberto;
-- Negando alteraes na tabela Pessoa para usurios do grupo GRP_RH
DENY INSERT, UPDATE, DELETE ON Pessoa TO GRP_RH;

CONCLUSO

A linguagem SQL constituda de diferentes tipos de comandos e estes comandos


so agrupados em trs categorias principais, sendo: comandos DDL as instrues
que definem estruturas de armazenamento dos dados; DML os comandos que
manipulam os dados e DCL os comandos que controlam o acesso aos dados.
Durante as atividades do dia-a-dia voc utilizar com mais freqncia os comandos
do tipo DDL e DML.

CREATE TABLE PACIENTE( --cria a tabela paciente


ID SERIAL NOT NULL, --cria ID como serial no nulo
NOME VARCHAR(100) NOT NULL, --cria o nome com tamanho de at 100
caracteres no nulo
IDADE INTEGER NOT NULL, --cria idade do tipo inteiro no nulo
ID_RESPONSAVEL INTEGER NULL, --cria campo inteiro para id do
responsvel podemdo ser nulo
PRIMARY KEY(ID) --seta o campo ID como chave primria
);
CREATE TABLE MEDICO(
ID SERIAL NOT NULL,
CRM VARCHAR(10) NOT NULL,
ID_FUNCIONARIO INTEGER NOT NULL,
PRIMARY KEY (ID)
);
CREATE TABLE CONSULTA(
ID SERIAL NOT NULL,
ID_PACIENTE INTEGER NOT NULL,
ID_MEDICO INTEGER NOT NULL,
DATA_CONSULTA DATE NOT NULL,
PRIMARY KEY (ID),
FOREIGN KEY (ID_PACIENTE) REFERENCES PACIENTE(ID),--seta as chaves
estrangeiras j na criao da tabela
FOREIGN KEY (ID_MEDICO) REFERENCES MEDICO(ID)
);
CREATE TABLE CLINICA(
ID SERIAL NOT NULL,
NOME VARCHAR(100) NOT NULL,
ENDERECO VARCHAR(200) NOT NULL,
PRIMARY KEY(ID)
);
CREATE TABLE ENFERMEIRO(
ID SERIAL NOT NULL,
ID_FUNCIONARIO INTEGER NOT NULL,
ID_COORDENADOR INTEGER NOT NULL,
PRIMARY KEY(ID)
);
CREATE TABLE FUNCIONARIO(
ID SERIAL NOT NULL,
NOME VARCHAR(100) NOT NULL,
DATA_NASCIMENTO DATE NOT NULL,

DATA_CONTRATACAO DATE NOT NULL,


PRIMARY KEY(ID)
);
CREATE TABLE ESPECIALIDADES(
ID SERIAL NOT NULL,
ID_FUNCIONARIO INTEGER NOT NULL,
ID_ESPECIALIDADE INTEGER NOT NULL,
PRIMARY KEY(ID)
);
CREATE TABLE ESPECIALIDADE(
ID SERIAL NOT NULL,
NOME VARCHAR(100) NOT NULL,
PRIMARY KEY(ID)
);
ALTER TABLE CONSULTA ADD ID_CLINICA INTEGER NOT NULL;--cria uma nova
coluna na tabela CONSULTA com nome de ID_CLINICA do tipo inteiro no
nulo
ALTER TABLE CONSULTA ADD FOREIGN KEY(ID_CLINICA) REFERENCES
CLINICA(ID);--seta chave estrangeira para a coluna ID_CLINICA
referenciando a chave primria da tabela CLINICA
ALTER TABLE CLINICA ADD ID_DIRETOR INTEGER NOT NULL;
ALTER TABLE CLINICA ADD FOREIGN KEY(ID_DIRETOR) REFERENCES MEDICO(ID);
ALTER TABLE MEDICO ADD FOREIGN KEY(ID_FUNCIONARIO) REFERENCES
FUNCIONARIO(ID);
ALTER TABLE ENFERMEIRO ADD FOREIGN KEY(ID_FUNCIONARIO) REFERENCES
FUNCIONARIO(ID);
ALTER TABLE ENFERMEIRO ADD FOREIGN KEY(ID_COORDENADOR) REFERENCES
MEDICO(ID);
ALTER TABLE ESPECIALIDADES ADD FOREIGN KEY(ID_ESPECIALIDADE)
REFERENCES ESPECIALIDADE(ID);
ALTER TABLE ESPECIALIDADES ADD FOREIGN KEY(ID_FUNCIONARIO) REFERENCES
FUNCIONARIO(ID);
SELECT * FROM PACIENTE;--exibe todos os registros da tabela paciente
select r.nome as nome, r.idade as idade, p.nome as nome_resp, p.idade
as idade_resp --exibe nome e idade do cliente e nome e idade do seu
responsvel
from paciente as p
inner join paciente as r on r.ID_RESPONSAVEL = p.id;
update paciente set idade=18 where id = 2; --altera a idade do
paciente com ID igual a 2
delete from paciente where id = 1; --Comando que apaga o registro da
tabela paciente onde o ID e igual a 1
delete from paciente; --Comando que apaga todos os registros da tabela
paciente
--drop table consulta; --exclui tabela consulta

--drop
--drop
--drop
--drop
--drop
--drop
--drop

table
table
table
table
table
table
table

especialidades; --exclui tabela especialidades


especialidade; --exclui tabela especialidade
clinica; --exclui tabela clinica
enfermeiro; --exclui tabela enfermeiro
medico; --exclui tabela medico
funcionario; --exclui tabela funcionario
paciente; --exclui tabela paciente

INSERT INTO PACIENTE (NOME,


Silva', 50, null);
INSERT INTO PACIENTE (NOME,
Silva Jnior', 17, 1);
INSERT INTO PACIENTE (NOME,
Silva', 15, 1);
INSERT INTO PACIENTE (NOME,
Silca', 14, null);
INSERT INTO PACIENTE (NOME,
Silva', 25, null);
INSERT INTO PACIENTE (NOME,
Silva', 55, null);
INSERT INTO PACIENTE (NOME,
Silva', 34, null);
INSERT INTO PACIENTE (NOME,
Silva', 19, null);
INSERT INTO PACIENTE (NOME,
Silva', 31, null);
INSERT INTO PACIENTE (NOME,
Silva', 10, null);
INSERT INTO PACIENTE (NOME,
da Silva', 42, null);
INSERT INTO PACIENTE (NOME,
Silva', 35, null);
INSERT INTO PACIENTE (NOME,
Silva', 24, 8);

IDADE, ID_RESPONSAVEL) VALUES ('Joo da


IDADE, ID_RESPONSAVEL) VALUES ('Joo da
IDADE, ID_RESPONSAVEL) VALUES ('Jos da
IDADE, ID_RESPONSAVEL) VALUES ('Marcos da
IDADE, ID_RESPONSAVEL) VALUES ('Carlos da
IDADE, ID_RESPONSAVEL) VALUES ('Maria da
IDADE, ID_RESPONSAVEL) VALUES ('Paulo da
IDADE, ID_RESPONSAVEL) VALUES ('Pedro da
IDADE, ID_RESPONSAVEL) VALUES ('Thiago da
IDADE, ID_RESPONSAVEL) VALUES ('Rafael da
IDADE, ID_RESPONSAVEL) VALUES ('Patricia
IDADE, ID_RESPONSAVEL) VALUES ('Paula da
IDADE, ID_RESPONSAVEL) VALUES ('Matheus da

--condio where =, iniciado com, terminado com, contendo.


--operadores: = , <>, <, <=, >=, and (&& E), not (! no), or (|| ou)
--between and
--nome e data devem estar entre aspas simples ''
select * from paciente where id_responsavel is not NULL;-- seleciona
onde o id_responsavl no nulo
select * from paciente where idade between 20 and 40;--seleciona onde
idade est entre 20 e 40
select * from paciente where nome like 'J%';--iniciado com J
select * from paciente where nome like '%a';--terminado com a
select * from paciente where nome like '%ia%';--contendo ia
insert into funcionario (nome, data_nascimento, data_contratacao)
values ('Gleybson', '1989-01-05', '2015-01-01'),
('Jaime', '1990-01-05', '2015-05-11'), ('Jair', '1995-01-05', '201501-01'),
('Leandro', '1978-01-05', '2010-01-01'),('Lucas', '1980-01-05', '201101-01'),
('Matheus', '1992-01-01', '2012-01-01'),('Maxsuel', '1987-01-05',
'2013-01-01'),
('Vinicius', '1986-01-05', '2014-01-01');
insert into especialidade (nome) values ('Clinico Geral'),
('Cardiologista'),('Neurologista'),('Pediatra'),('Ginecologiosta');

insert into medico(crm, id_funcionario) values ('123',1),('456',2),


('789',3),
('101',4),('102',5);
insert into enfermeiro (id_funcionario, id_coordenador)
values (10,1),(6,1),(7,2),(8,2),(9,3);
insert into especialidades (id_funcionario, id_especialidade) values
(1,1),(1,2),(1,3),(2,4),(3,5),(4,5),(5,4),(5,3),(3,2),(1,4);
insert into clinica (nome, endereco, id_diretor) values
('Clinica Central', 'Rua x, quadra Y, Lote 10', 1);
insert into consulta (id_paciente, id_medico, id_clinica,
data_consulta)
values (1,1,1,'2015-01-01'),(1,2,1,'2015-02-01'),(2,2,1,'2015-03-01'),
(3,4,1,'2015-04-01'),(1,3,1,'2015-05-01'),(5,5,1,'2015-06-01'),
(4,4,1,'2015-07-01'),
(3,1,1,'2015-08-01'),(7,3,1,'2015-09-01'),(1,1,1,'2015-01-15'),
(7,4,1,'2015-02-28');
select f.nome, e.nome from funcionario as f
inner join especialidades as es
on f.id = es.id_funcionario
inner join especialidade as e
on e.id = es.id_especialidade
inner join medico as m
on m.id_funcionario = f.id
where m.id = 1
order by e.nome desc;
select p.nome, c.data_consulta, f.nome from paciente as p
inner join consulta as c
on p.id = c.id_paciente
inner join medico as m
on c.id_medico = m.id
inner join funcionario as f
on m.id_funcionario = f.id;
select
select
select
select
select
select
select
select

*
*
*
*
*
*
*
*

from
from
from
from
from
from
from
from

consulta;
especialidades;
especialidade;
clinica;
enfermeiro;
medico;
funcionario;
paciente;

INNER JOIN A clusula INNER JOIN permite usar um operador de


comparao para comparar os valores de colunas provenientes de tabelas
associadas. Por meio desta clusula, os registros de duas tabelas so usados
para que sejam gerados os dados relacionados de ambas. Usamos as
clusulas WHERE e FROM para especificar esse tipo de associao.

No exemplo abaixo, iremos criar as tabelas Cargo e Funcionario (no irei


exibir o script para criar as tabelas e inserir dados para no deixar o artigo
extenso). Vejam as tabelas e suas colunas:

Repare que temos a coluna IdCargo nas duas tabelas, porm, ela possui
finalidades distintas: enquanto na tabela Cargo, ela chave primria, na
tabela Funcionario ela chave estrangeira.
Assim, a associao entre as tabelas feita pela coluna IdCargo e podemos
identificar os cargos existentes e o nome dos funcionrios que desempenham
cada um deles.
Usamos ento a clusula INNER JOIN para obtermos os dados relacionados
das duas tabelas, para que sejam retornados todos os cargos ocupados pelos
funcionrios, bem como todos os funcionrios que desempenham algum
cargo. Veja como isso feito no script abaixo:
SELECT C.NOMECARGO [CARGO], F.NOMEFUNCIONARIO AS [FUNCIONRIO],
F.SALARIOFUNCIONARIO AS [SALRIO]

FROM CARGO AS C

INNER JOIN FUNCIONARIO AS F


ON C.IDCARGO = F.IDCARGO

Nossa consulta ter o seguinte retorno:

Podemos usar tambm a clusula WHERE e termos o mesmo resultado. O


script ficar assim:

SELECT C.NOMECARGO [CARGO], F.NOMEFUNCIONARIO AS [FUNCIONRIO],


F.SALARIOFUNCIONARIO AS [SALRIO]

FROM CARGO AS C, FUNCIONARIO AS F

WHERE C.IDCARGO = F.IDCARGO

Independente da clusula usada, o relacionamento entre as tabelas ser feito,


como dito anteriormente, por meio da chave primria da tabela Cargo e da
chave estrangeira da tabela Funcionario.
Note que, no retorno de nossas consultas, o nico cargo que no exibido pra
ns o Programador Sr. j que no h nenhum funcionrio relacionado a
este cargo. Para que exibamos tambm este cargo usamos a clusula que ser
explicada a seguir.
LEFT JOIN A clusula LEFT JOIN ou LEFT OUTER JOIN permite
obter no apenas os dados relacionados de duas tabelas, mais tambm os
dados no relacionados encontrados na tabela esquerda da clusula JOIN.
Caso no existam dados relacionados entre as tabelas esquerda e a direita
do JOIN, os valores resultantes de todas as colunas da lista de seleo da
tabela direita sero nulos.
Para exemplificar melhor, vejamos os exemplos das
tabelas Cargo e Funcionrio. Como dito anteriormente, o nico cargo que
no contm funcionrio vinculado a ele o Programador Sr. Para obtermos
mesmo assim esse cargo, usamos a clusula LEFT JOIN esquerda do sinal
de igual (=), como no script abaixo:
SELECT C.NOMECARGO [CARGO], F.NOMEFUNCIONARIO AS [FUNCIONRIO],
F.SALARIOFUNCIONARIO AS [SALRIO]

FROM CARGO AS C

LEFT JOIN FUNCIONARIO AS F


ON C.IDCARGO = F.IDCARGO

Seu resultado ser o seguinte:

Simples n?!
RIGHT JOIN Ao contrrio do LEFT JOIN, a clusula RIGHT
JOIN ou RIGHT OUTER JOIN retorna todos os dados encontrados na

tabela direita de JOIN. Caso no existam dados associados entre as tabelas


esquerda e direita de JOIN, sero retornados valores nulos.
Suponhamos que a posio das tabelas usadas nos exemplos anteriores foi
trocada. Se mesmo assim desejamos obter o mesmo resultado obtido
anteriormente, podemos usar a clusula RIGHT JOIN, assim iremos
conseguir tanto os dados relacionados como os no relacionados disponveis
na tabela direita da clusula JOIN.
Assim, devemos usar o script abaixo:
SELECT C.NOMECARGO [CARGO], F.NOMEFUNCIONARIO AS [FUNCIONRIO],
F.SALARIOFUNCIONARIO AS [SALRIO]

FROM FUNCIONARIO AS F

RIGHT JOIN CARGO AS C


ON F.IDCARGO = C.IDCARGO

Que ter o seguinte retorno:


+----------------+--------------+--------+
| cargo

| func

| salario|

+----------------+--------------+--------+
| Web Designer PI| tiririca

| 2500

| Programador Jr | ze da pizza

| 2250

| programador PI | Tiozao do gas| 2750

| DBA Jr

| 2300

| 2500

| Adalberto

| Programador Jr | Marisa

+----------------+--------------+--------+

Perceba que somente inverti a ordem das tabelas nas


clusulas FROM e RIGHT JOIN em relao ao exemplo com LEFT JOIN.

Leia mais em: Clusulas INNER JOIN, LEFT JOIN e RIGHT JOIN Associao de Tabelas: SQL Server 2008 - Parte
2 http://www.devmedia.com.br/clausulas-inner-join-left-join-e-right-joinassociacao-de-tabelas-sql-server-2008-parte-2/18930#ixzz3n3acOgJF

Você também pode gostar