Você está na página 1de 222

CENTRO DE FORMAO SO DOMINGOS

SQL
(SGBD - MySql)
Frei Joaquim Jos Hangalo

ROTEIRO

I PARTE - INTRODUO AO SQL II PARTE ADMINSTRAO DE BASE DE DADOS

UTILIZANDO MYSQL PRINCIPAIS INSTRUES SQL III PARTE - PRTICA ESTUDO DE CASO UTILIZANDO MYSQL

INTRODUO AO SQL

A Linguagem SQL
Embora se fale que a linguagem SQL uma linguagem de consulta, essa linguagem possui outras capacidades alm de realizar consultas numa base de dados. A linguagem SQL possui recursos para definio da estrutura de dados, para modificar dados na base de dados e recursos para especificar restries de segurana e integridade.

A Linguagem SQL
SQL (Strutured Query Language). Numerosos Sistemas de Gesto de Base de Dados suportam a linguagem SQL. A SQL estabeleceu-se como a linguagem padro das bases de dados relacionais.

Embora existam diversas verses, com algumas diferenas entre elas, a estrutura da SQL mantm-se inalterada desde a sua criao.

definida pelo Padro ANSI/ISO SQL.

As partes da linguagem SQL ou Sublinguagens


Data Definition Language (DDL) (Linguagem de Definio de Dados). A SQL DDL fornece comandos para definio e modificao dos esquemas das relaes(tabelas), remoo de relaes(tabelas) e criao de ndices. Os principais comandos que fazem parte da DDL so: CREATE, ALTER, DROP.

Data Manipulation Language (DML) (Linguagem de Manipulao de Dados). A SQL DML inclui uma sub-linguagem de consulta baseada na lgebra relacional e no clculo relacional. Compreende tambm comandos para inserir, remover e modificar informaes de uma base de dados. Os comandos bsicos da DML so: SELECT, INSERT, UPDATE, DELETE

As partes da linguagem SQL


Data Control Language (Linguagem de Controlo de Dados). o conjunto de comandos que permitem fazer o cadastramento de utilizadores e determina o seu nvel de privilgio para os objetos da base de dados. Os principais comandos so: GRANT, REVOKE. Transactions control (Controlo de Transaes). A SQL inclui comandos para especificao do incio e fim das transaes. Diversas implementaes permitem o trancamento explcito de dados para o controlo de concorrncia. (COMMIT, ROLLBACK, SAVEPOINT)

SQL (Structured Query Language)

SQL
SELECT UPDATE DELETE INSERT

CREATE ALTER DROP DDL Com COMMIT embutido

DML

GRANT REVOKE COMMIT ROLLBACK SAVEPOINT SET TRANSACTION

Segurana Controle transaes

CONTROL

MYSQL

10

SGBD - MYSQL
O Mysql um sistema de gesto de base de dados relacional que utiliza a linguagem de consulta estruturada SQL como interface de acesso e extraco de informaes da base de dados em uso.

11

SGBD MYSQL O MYSQL um dos sistema de gesto de base de dados


actualmente dos mais populares e mais utilizados no mundo. rpido, multitarefa e multiutilizador.

12

SGBD - MYSQL
O Mysql tem verses Enterprise e Community. Esta ultima de licena free. Actualmente propriedade da Oracle(www.oracle.com) e pode ser baixado do site da referida empresa.

13

SGBD - MYSQL
Instncias

Na sua arquitectura podemos distinguir Um Servidor que trabalha em segundo plano

E as aplicaes cliente.
Existe um cliente em linha de comando (Mysql Command Line Client) e clientes grficos (Mysql Query Browser) Actualmente todas as aplicaes do SGBD Mysql esto integrados no pacote Mysql WorkBench

14

SGBD - MYSQL
Acesso e Finalizao

Iniciar - > Todos os Programas -> Mysql -> Mysql Command Line Client

Informar a senha: root

15

SGBD - MYSQL
Alguns comandos operacionais e administrativos Escrever ao lado do prompt mysql>

SELECT VERSION();

Todos os comandos devem terminar com ponto e virgula Enter para executar

16

SGBD - MYSQL
Alguns comandos operacionais e administrativos Escrever ao lado do prompt mysql>

SELECT USER(); SELECT CURRENT_USER; Todos os comandos devem terminar com ponto e virgula Enter para executar

17

SGBD - MYSQL
Alguns comandos operacionais e administrativos

SELECT CURRENT_DATE; Ou SELECT CURDATE();

18

SGBD - MYSQL
Alguns comandos operacionais e administrativos

SELECT CURRENT_TIME; Ou SELECT CURTIME();

19

SGBD - MYSQL Alguns comandos operacionais e administrativos


Para responder questo Qual a hora e a data actual

SELECT CURRENT_DATE, CURRENT_TIME; OU SELECT CURDATE(), CURTIME(); OU NOW()

20

SGBD - MYSQL Alguns comandos operacionais e administrativos


Consultar comandos operacionais

help ou \h ou ?;

help contents; help Data Definition; help create table;

21

SGBD - MYSQL Alguns comandos operacionais e administrativos


Calcular com MYSQL

Operadores adio(+), subtraco (-), multiplicao(*), diviso(/) e resto da diviso %

SELECT 4*5+4%3;

22

SGBD - MYSQL Alguns comandos operacionais e administrativos


Precedncia dos operadores () % *e/ +e

Select 1+2*3; Select (1+2)*3;

23

A LINGUAGEM SQL PARA DEFINIO DE DADOS

24

Esquema da Base de Dados

A LINGUAGEM DE DEFINIO DE DADOS (SQL-DDL)


Comando USE E SHOW O comando SHOW mostra as bases de dados todas

25

SHOW DATABASES;

O comando USE permite mudar (selecctionar) uma base de dados especfica para uso USE curso;

O comando SHOW mostra as tabelas da base de dados SHOW TABLES

A LINGUAGEM DE DEFINIO DE DADOS (SQL-DDL) Comando CREATE


Sintaxe para a criao de uma base de dados: CREATE DATABASE [IF NOT EXISTS]< nome_db >;

26

Este comando permite a criao de bases de dados ou de tabelas numa base de dados.

onde:
nome_db: indica o nome da Base de Dados a ser criada. Exemplo:

CREATE DATABASE vendas; CREATE DATABASE IF NOT EXISTS vendas;

27

A LINGUAGEM DE DEFINIO Removendo uma Tabela e/ou base de dados DE DADOS (SQL-DDL)
(CONTINUAO)

Comando DROP

Este comando elimina a definio da tabela, os seus dados e referncias ou uma base de dados existente:

Sintaxe: DROP TABLE < nome_tabela > ; DROP DATABASE <nome_da_base_de_dados>; Exemplo: DROP TABLE alunos; DROP DATABASE curso; DROP TABLE estudantes;

A LINGUAGEM DE DEFINIO DE DADOS (SQL-DDL)


Criando tabelas
Uma tabela (ou relao) SQL definida usando o comando create table:

28

Sintaxe: CREATE TABLE [IF NOT EXISTS]< nome_tabela > ( nome_atributo1 < tipo de dado > [ NULL/NOT NULL ] [DEFAULT <valor>] [AUTOINCREMENT] [PRIMARY KEY], );

A LINGUAGEM DE DEFINIO DE DADOS (SQL-DDL)


onde:

29

nome_tabela: indica o nome da tabela a ser criada.


nome_atributo: indica o nome do campo a ser criado na tabela. tipo de dado: indica a definio do tipo de dados do atributo ( integer(n), char(n), ... ).

PRIMARY KEY: esse o campo utilizado para que no exista na tabela dois registos iguais. Ele mantm a integridade da base de dados.
Caso se tente inserir numa base de dados um registo com uma PRIMARY KEY j existente ela emitir uma mensagem de erro e impedir que o registo seja inserido.

AUTO_INCREMENT- usado para gerar um valor nico sequencial para um novo registo

A LINGUAGEM DE DEFINIO DE DADOS (SQL-DDL)


onde:

30

NULL ou NOT NULL- a definio do campo em aceitar ou no valores nulos

DEFAULT valor permite determinar um valor padro para o campo definido

TIPOS DE CAMPOS NO MYSQL


O MySQL oferece os mais comuns campos. Alguns deles esto aqui listados:

31

CHAR(M) Os campos CHAR so usados para caracteres alfanumricos, como endereos e nomes. O seu tamanho fixo e instaurado ao ser criado. Um campo do tipo CHAR pode ter de 1 a 255 caracteres. Exemplo: endereco_comercial CHAR(10); Define um campo chamado 'endereco_comercial', que pode conter at dez letras. Observe que no h acentos no nome do campo, pois muitos servidores no acentuam, e a tabela teria difcil acesso.

32

CONTINUAO...
VARCHAR(M) A sua estrutura e funcionamento idntico ao campo anterior, salvo que no tipo CHAR, o tamanho definido fixo, e mesmo que no usado, aquele espao em disco alocado. J o campo VARCHAR, aloca apenas o espao necessrio para gravao. Contudo, vale lembrar que trocamos espao por velocidade, pois este campo 50% mais lento que o anterior. Exemplo: endereco_comercial VARCHAR(10); Define um campo chamado endereco_comercial que pode conter at dez letras. Se voc preencher apenas duas, o campo no ocupara todos dez bytes, mas apenas 2.

33

CONTINUAO...
INT(M) [Unsigned] O campo INT, que como o prprio nmero diz, suporta o conjunto dos nmeros inteiros numa variao de -2147483648 a 2147483647. O parmetro Unsigned pode ser passado, excluindo os nmeros negativos, proporcionando um intervalo de 0 at 4294967295. Exemplos: carros_estocados INT; Inteiro vlido: -245 Inteiro vlido: 245 Inteiro invlido: 3000000000 carros_estocados INT unsigned; Inteiro vlido: 245 Inteiro invlido: -245 Inteiro invlido: 3000000000

34

FLOAT[(M,D)] Os pontos flutuantes (FLOAT) representam pequenos nmeros decimais, e so usados para representar nmeros com maior preciso. Exemplo: voltagem_cadeira_eletrica FLOAT(4,2); Float vlido: 324.50

DATE Campo usado para armazenar informaes referentes a data. A forma padro 'AAAA-MM-DD', onde AAAA corresponde ao ano, MM ao ms, e DD ao dia. Ele pode variar de 0000-00-00 a 9999-12-31. O MySQL possui um conjunto poderoso de comandos de formatao e manipulao de datas. Consulte documentao adicional, se houver interesse. Exemplo: data_de_nascimento DATE; Data vlida: 1999-12-06 Data invlida: 1999-06-12

35

CONTINUAO...
TEXT/BLOB Os campos texto e blob so usados para guardar grandes quantidades de caracteres. Podendo conter de 0 a 65535 bytes, os blobs e texts so teis para armazenar documentos completos, como este que voc est a ler. A nica diferena entre os campos BLOB e TEXT est no facto de um campo TEXT no ser sensvel a letras maisculas e minscula quando uma comparao realizada, e os BLOBs sim. Exemplo: relatorio BLOB;

BLOB vlido: 'Minha terra tem palmeiras onde canta o...'


relatorio TEXT; TEXT vlido: 'A que saudades que eu sinto...'

36

CONTINUAO...
SET Um campo interessante, que permite que o usurio faa uma escolha dado determinado nmero de opes. Cada campo pode conter at 64 opes.

Exemplo:
vicio SET("cafe", "cigarro") NOT NULL; Neste exemplo este campo pode conter apenas os seguintes itens: "" "cafe" "cigarro" "cafe,cigarro"

37

CONTINUAO...
ENUM Um campo com funcionamento semelhante ao SET, com a diferena que apenas um valor pode ser escolhido. Exemplo: virtude ENUM("programar", "amar") NOT NULL; Neste exemplo este campo pode conter os seguintes valores: "" "programar" "amar"

A LINGUAGEM DE DEFINIO DE DADOS Exemplo: (SQL-DDL)


(CONTINUAO)

38

CREATE table alunos( codigo int NOT NULL AUTO_INCREMENT, nome VARCHAR(20) NOT NULL , telefone CHAR(8) NOT NULL, PRIMARY KEY(codigo));

A LINGUAGEM DE DEFINIO DE DADOS (SQL-DDL)


Comando DESC e show fields from

39

40

Visualizar as tabelas da base de dados SHOW TABLES;

Ver a descrio da estrutura da tabela DESCRIBE <tabela> [coluna] DESCRIBE curso; DESCRIBE curso codigo_curso;

A LINGUAGEM DE DEFINIO DE DADOS (SQL-DDL)


(CONTINUAO)

41

Uma relao criada inicialmente vazia. O comando insert pode ser utilizado para carregar os dados para a relao(tabela). Muitos produtos de bases de dados relacionais possuem um grande volume de utilitrios para carregar um conjunto inicial de tuplas numa relao(tabela).

42

A LINGUAGEM DE DEFINIO DE DADOS (SQL-DDL)


(CONTINUAO)

Removendo uma Tabela

Para remover uma relao de uma base de dados SQL, usa-se o comando drop table. O comando drop table remove todas as informaes sobre a relao. O comando drop table r onde r o nome de uma relao (tabela) existente.

43

A LINGUAGEM DE DEFINIO DE DADOS (SQL-DDL)


(CONTINUAO)

Alterando uma Tabela

Comando ALTER Este comando permite inserir/eliminar atributos nas tabelas j existentes. Sintaxe:

ALTER TABLE < nome_tabela > ADD / DROP ( nome_atributo1 < tipo > [ NOT NULL ], nome_atributoN < tipo > [ NOT NULL ]) ;

44

A LINGUAGEM DE DEFINIO DE DADOS (SQL-DDL)


(CONTINUAO)

Alterando uma Tabela

O comando alter table usado para adicionar, excluir ou alterar atributos numa relao(tabela) existente.
Para inserir um novo atributo numa tabela utilizada a clusula add. Todas as tuplas na relao so assinaladas como null para o valor do novo atributo. alter table r add ( A1 D1, A2 D2, ... )

onde r o nome de uma relao existente e A1 D1, A2 D2, ... uma lista contendo nome do atributo (A) a ser adicionado e o tipo do atributo (D), respectivamente.

45

Exemplo
Adicionar chave estrangeira s tabelas

alter table artigo add constraint fk_produto_categoria foreign key(codigo_categoria) references categoria (codigo_categoria) ON UPDATE RESTRICT ON DELETE RESTRICT;

46

Para excluir colunas de uma tabela utiliza-se a clusula drop. alter table r drop A1, A2, ... onde r o nome de uma relao existente e A1, A2, ... uma lista dos atributos a serem removidos. Para alterar o nome de um atributo de uma tabela utiliza-se a clusula rename. alter table r rename A NA

A LINGUAGEM DE DEFINIO DE DADOS (SQL-DDL)


(CONTINUAO)

onde r o nome de uma relao existente, A o nome do atributo a ter o seu nome alterado para NA. Para alterar o tipo de um atributo utiliza-se a clusula modify.

47

A LINGUAGEM DE DEFINIO DE DADOS (SQL-DDL)


(CONTINUAO)

alter table r

modify A1 D1, A2 D2, ...


onde r o nome de uma relao existente, A1 D1, A2 D2,... uma lista contendo o nome do atributo (An) a ter o seu tipo alterado para (Dn).

48

A LINGUAGEM DE DEFINIO DE DADOS (SQL-DDL)


(CONTINUAO)

Restries de Integridade

As restries de integridade servem para garantir as regras inerentes ao sistema que est sendo implementado, prevenindo a entrada de informaes invlidas pelos usurios desse sistema. Para isso, o SGBD deve prover ferramentas para a definio de regras de integridade, a fim de evitar a inconsistncia dos dados que nele sero armazenados.
Evitando valores nulos muito comum definirmos atributos que no podem conter valores nulos. Isto , o seu preenchimento obrigatrio para que se mantenha a integridade dos dados no sistema. Para evitar que em algum momento uma coluna de uma tabela possa conter valor nulo (ou no conter valor algum) deve-se utilizar a clusula NOT NULL aps a definio da coluna.

49

A LINGUAGEM DE DEFINIO DE DADOS (SQL-DDL)


(CONTINUAO)

Exemplo:

create table cliente


(nome sexo varchar(30) NOT NULL, char(1),

CP
endereco cidade

number(11),
varchar(40), varchar(20) )

No exemplo acima, a atribuio de um valor coluna nome obrigatrio. Caso o usurio se esquea de preenche-lo, o SGBD apresentar uma mensagem de erro.

50

A LINGUAGEM DE DEFINIO DE DADOS (SQL-DDL)


(CONTINUAO)

Evitando valores duplicados

Podem existir situaes onde o valor armazenado num atributo de um registo deve ser nico em relao a todos os registros da tabela. Isto , no pode haver dois registros com o mesmo valor para um determinado atributo.

Para implementar esta restrio de integridade deve-se utilizar a clusula UNIQUE aps a especificao de uma coluna.

51

A LINGUAGEM DE DEFINIO DE DADOS (SQL-DDL)


(CONTINUAO)

Exemplo:

create table cliente


(nome sexo varchar(30) NOT NULL, char(1),

CP
endereco

number(11) UNIQUE,
varchar(40),

cidade varchar(20) )

No exemplo acima, caso o usurio atribua ao campo CP um valor j existente num outro registo desta tabela o SGBD apresentar uma mensagem de erro.

52

A LINGUAGEM DE DEFINIO DE DADOS (SQL-DDL)


(CONTINUAO)

Exemplo:

create table cliente


(nome sexo varchar(30) NOT NULL, char(1),

CP
endereco

number(11) UNIQUE,
varchar(40),

cidade varchar(20) )

No exemplo acima, caso o usurio atribua ao campo CP um valor j existente num outro registo desta tabela o SGBD apresentar uma mensagem de erro.

53

A LINGUAGEM DE DEFINIO DE DADOS (SQL-DDL)


(CONTINUAO)

Definindo valores default

Pode-se definir um valor padro para uma coluna acrescentando sua definio a clusula DEFAULT. Esta clusula permite substituir automaticamente os valores nulos por um valor inicial desejado.
create table cliente (nome sexo CP endereco varchar(30) NOT NULL, char(1), number(11) UNIQUE, varchar(40),

cidade varchar(20) DEFAULT Lubango )

54

A LINGUAGEM DE DEFINIO DE DADOS (SQL-DDL)


(CONTINUAO)

Evitando valores invlidos

Existem situaes onde o valor de um atributo deve pertencer a um determinado domnio. Para que o valor de um atributo fique restrito a um conjunto de valores, utiliza-se a clusula CHECK.
A finalidade da clusula CHECK especificar uma condio, isto , uma limitao de integridade. create table cliente ( nome varchar(30) NOT NULL,

sexo
CP endereco

char(1) CHECK(sexo IN (M, F)),


number(11) UNIQUE, varchar(40),

55

A LINGUAGEM DE DEFINIO DE DADOS (SQL-DDL)


(CONTINUAO)

Chave Primria

A funo da chave primria identificar univocamente uma linha da tabela. Cada tabela deve possuir uma chave primria. Quando se define um atributo como chave primaria, ficam implcitas as clusulas UNIQUE e NOT NULL para este atributo, no sendo necessria a especificao destas. create table cliente
(codigo number(5) primary key, nome varchar(30) not null,

sexo
CP endereco

char(1) CHECK(sexo IN (M, F)),


number(11) UNIQUE, varchar(40),

56

A LINGUAGEM DE DEFINIO DE DADOS (SQL-DDL)


(CONTINUAO)

Exemplo:

create table cliente


(codigo number(5), nome varchar(30) not null,

sexo
CP endereco

char(1) CHECK(sexo IN (M, F)),


number(11) UNIQUE, varchar(40),

cidade varchar(20) DEFAULT Lubango, primary key (codigo) )

57

A LINGUAGEM DE DEFINIO DE DADOS (SQL-DDL)


(CONTINUAO)

ATENO: Quando uma tabela possui uma chave primria composta por mais de um atributo, esta forma OBRIGATRIA.

create table movimento (agencia conta valor number(5), number(7), number(16,2),

primary key (agencia, conta) )

58

Integridade referencial

A LINGUAGEM DE DEFINIO DE DADOS (SQL-DDL)


(CONTINUAO)

Freqentemente desejamos assegurar que o valor de um determinado campo de uma tabela esteja presente na chave primria de outra tabela. Este campo chamado chave estrangeira (FOREIGN KEY). A SQL original padro no inclua instrues para especificar chaves estrangeiras. Um aperfeioamento posterior foi aprovado como uma adio ao padro. Este recurso permite a especificao de chaves primrias e estrangeiras como parte da instruo create table. create table movimento
(agencia number(5) references agencias(codigo), conta number(7) references contas(numero), valor number(16,2), primary key (agencia, conta) )

Assim como na definio da chave primria, pode-se definir a chave estrangeira aps a especificao de todos os campos (domnio) da tabela.

59

A LINGUAGEM DE DEFINIO DE DADOS (SQL-DDL)


(CONTINUAO)

Exemplo: create table movimento (agencia conta number(5) number(7)

valor

number(16,2),

primary key (agencia, conta) foreign key (agencia) references agencias,

foreign key (conta)

references contas)

60

Criar uma base de dados (escola_notas) e as respectivas tabelas

EXERCCIO

DML

61

62

A sublinguagem DML utilizada para manipular dados (inserir dados nas tabelas, actualizar dados existentes e eliminar dados das tabelas) e para interrogar (baseado na lgebra relacional) a base de dados.

63

DML - Clausulas
INSERT SELECT UPDATE DELETE

INSERO DE REGISTOS NUMA TABELA

clusula insert
64

65

INSERO DE REGISTOS NUMA TABELA

Clausula insert
Sintaxe

Insert into tabela [(atributos)] values(valor1, valor2, valor3 valorn);

66

INSERO DE REGISTOS NUMA TABELA

Insero de registos

Para inserir um dado numa tabela, ou especificamos uma tupla para ser inserida ou escrevemos uma consulta cujo resultado seja um conjunto de tuplas a serem inseridas. Obviamente, os valores dos atributos para tuplas inseridas devem ser membros do domnio do atributo. Da mesma forma, as tuplas inseridas devem ser do mesmo tipo.
A instruo insert mais simples uma requisio para inserir uma tupla.

67

INSERO DE REGISTOS NUMA TABELA

Os nomes das colunas podem ser omitidos, se a ordem dos valores a serem inseridos corresponder com a ordem de criao dos mesmos.

68

INSERO DE REGISTOS NUMA TABELA

Suponha que se deseja inserir o facto de que o senhor Mapelo tem 1.200 AKZ na conta 9732 da agncia Chibia.

69

INSERO DE REGISTOS NUMA TABELA


insert into contas values (9732, Chibia ,1200, Mapelo)

No exemplo acima, os valores so especificados na ordem na qual os atributos correspondentes esto listados no esquema da relao. Para facilitar os utilizadores que podem no se lembrar da ordem dos atributos, a SQL permite que os atributos sejam especificados como parte da instruo insert.

insert into contas(numero_conta, nome_agencia, saldo, nome_cliente) values (9732,Chibia,1200,Mapelo)

70

INSERO DE REGISTOS NUMA TABELA

Pode-se inserir vrios registos numa nica instruo

Sintaxe

Insert into tabela [(atributos)] values(valor1, valor2, valor3 valorn),


(valor1, valor2, valor3 valorn), (valor1, valor2, valor3 valorn);

RESTRIES NA INSERO DE DADOS

chave primria e estrangeira

71

72

INSERO DE REGISTOS NUMA TABELA


Para se incluir o sector de Compras numa base de dados, por exemplo, pode-se utilizar a seguinte instruo:

insert into sector(codigo_sector, nome_sector ) values (500, Compras)

73

INSERO DE REGISTOS NUMA TABELA


Deve-se notar que ao fazer uma insero, todas as restries (constraints) de integridade referencial declaradas sero processadas, de modo a preservar a consistncia dos dados. Na tabela sector h apenas a restrio de chave-primria (codigo_sector), que no permitir a insero de um sector com o mesmo cdigo. Entretanto, noutras tabelas, como a FUNCIONARIO, podem existir restries de chave estrangeira. Esta restrio no permitir que um funcionrio seja inserido num sector inexistente, ou seja, que o valor do codigo_sector na tabela funcionario no exista na tabela sector.

INSERT SELECT
insero em lote
74

75

INSERT...SELECT uma forma de INSERT permite que vrias linhas sejam copiadas de uma ou mais tabelas para outra. insert into tabela [(lista das colunas)] Select ...

76

INSERT...SELECT

A insero feita como resultado de uma consulta. Consegue-se assim fazer uma insero em lote

77

INSERO DE REGISTOS NUMA TABELA

. Imagine-se o seguinte caso, onde a requisio de cdigo 1015 realizada pelo funcionrio 10, deva ser extornada, ou seja, todos os itens que constam como requisitados devo ser lanados na devoluo de cdigo 5005 com a mesma data da requisio.

78

Insero de registos numa tabela


A soluo passa pelas seguintes instrues
insert into devoluo select 5005, codigo_funcionario, data_requisicao from requisicao where codigo_requisicao = 1015

insert into itens_devoluo select 5005, codigo_produto, quantidade from itens_requisicao where codigo_requisicao = 1015

ALTERAO DE REGISTOS NUMA TABELA

clusula update

79

80

Alterao de registos numa tabela

Clausula UPDATE
Sintaxe

UPDATE nome_tabela SET nome_coluna = <valor> [, nome_coluna = <valor>]

81

Alterao de registos numa tabela


Alterao de registos
Em certas situaes, podemos desejar mudar um valor de uma tupla sem mudar todos os valores da tupla. Para isto, a instruo update pode ser utilizada.

Podemos escolher as tuplas que sero actualizadas usando uma consulta.


Supondo que se esteja a fazer um pagamento de juros, e que em todos os saldos sejam acrescidos 5%. update contas set saldo = saldo * 1.05 A instruo acima aplicada uma vez para cada tupla em contas.

82

Alterao de registos numa tabela


Suponhamos agora que contas com saldos superiores a 10.000 recebam 6% de juros e todas as outras recebam 5%.
update contas set saldo = saldo * 1.06 where saldo > 10000

update contas set saldo = saldo * 1.05 where saldo <= 10000

A ordem na qual as duas instrues update so escritas importante. Se mudarmos a ordem das duas instrues, uma conta cujo saldo esteja abaixo de 10.000 poder receber juros de 11.3%.

83

Alterao de registos numa tabela


De lembrar

Todas as linhas de uma tabela so actualizadas se for omitida a clusula WHERE.

Alterao de registos numa tabela

Update select
84

85

Alterao de registos numa tabela


Actualizar linhas a partir dos valores de uma outra tabela

UPDATE produto SET preco_unitario = preco_unitario * 1.1 WHERE codigo_produto IN (SELECT codigo_produto FROM remarcar_produto);

REMOO DE REGISTOS
Clusula DELETE
86

87

Remoo de registos de uma tabela

Clausula DELETE
Sintaxe

DELETE FROM nome_tabela [WHERE <condio>];

88

Remoo de registos de uma tabela


Remoo de registros
Uma remoo expressa da mesma forma que uma consulta. Pode-se remover apenas tuplas inteiras, no podemos remover atributos particulares.

O comando delete opera em apenas uma relao. Se desejarmos remover tuplas de diversas relaes, devemos usar um comando delete para cada relao. O predicado na clusula where pode ser to complexo quanto uma clusula where do comando select. Num outro extremo, podemos ter uma clusula where vazia.

A instruo delete from emprestimos;

89

Remoo de registos de uma tabela


DELETE FROM produto WHERE codigo_produto = 45;

Remove apenas o registo do producto cujo cdigo 45;

90

Remoo de registos de uma tabela


De lembrar

Remove todas as linhas da tabela se for omitida a clusula WHERE.

91

Remoo de registos de uma tabela


delete deposito

where agencia_nome in
(select agencia_nome from agencia where agencia_cidade = Chibia)

Remove todas as contas em agncias localizadas na Chibia

Consultar registos de uma tabela

clusula SELECT FROM

92

Consultar registos de uma tabela

93

A clusula select retorna uma ou um conjunto de linhas de uma tabela ou mais tabelas da base de dados.

A sintaxe completa da clusula select complexa, mas as principais clusulas podem ser sumarizadas no esquema apresentado a seguir

Consultar registos de uma tabela

94

SELECT [ ALL | DISTINCT ] lista de atributos


[ INTO nota tabela] FROM tabela(s) de origem [ WHERE condio de busca] -aplicada a registos individuais. [ GROUP BY expresso group_by ] [ HAVING condio de busca ] - aplicada a grupos de registos. [ ORDER BY expresso de ordenao[ ASC | DESC ] ]

Consultar registos de uma tabela

95

As instrues fundamentais para a realizao de consultas so:

SELECT <atributo1, atributo2,...>


FROM <tabela1, tabela2,...> [WHERE <condio>]

Consultar registos de uma tabela

96

A comando SELECT selecciona conjunto de atributos de uma(s) tabela(s) dada(s) pelo comando FROM.

Exemplo:
SELECT codigo_aluno, nome_aluno, morada_aluno FROM Aluno

Consultar registos de uma tabela

97

O comando SELECT permite incluir expresses aritmticas e modificar o nome dos atributos. Uma expresso pode ser uma combinao de valores, operadores e funes que produzem um valor.

Consultar registos de uma tabela

98

Os operadores aritmticos que podem ser includos so: Operadores


+ * /

Descrio
Soma Subtraco Multiplicao Diviso

Exemplo: SELECT codigo_funcionario, salario*2 FROM funcionario;

Consultar registos de uma tabela

99

Utilizando o comando SELECT possvel alterar o nome na coluna (na visualizao). Para tal utiliza-se a palavra as(alis)

SELECT codigo_funcionario, salario*12 as Salario Anual FROM funcionario;

Consultar registos de uma tabela

10 0

utilizando o comando SELECT, possvel eliminar valores duplicados atravs da palavra DISTINCT. Nota: Existem vrias funes que poderem ser utilizadas com o comando SELECT

Exemplo
SELECT DISTINCT codigo_departamento, cargo_funcionario
FROM funcionario ORDER BY codigo_departamento;

Consultar registos de uma tabela

10 1

O comando ORDER BY utilizado para ordenar tuplos. Neste exemplo, os tuplos so ordenados por cdigo do departamento que, por defeito, realizado de forma ascendente, apresentando os valores numricos mais baixos primeiro. Para inverter esta sequncia, utiliza-se a palavra DESC.

Exemplo

SELECT DISTINCT codigo_departamento, cargo_funcionario FROM funcionario ORDER BY codigo_departamento DESC;

10 2

Ordenao dosresultado de uma consulta

A linguagem SQL oferece uma maneira de controlar a ordem em que as tuplas de uma relao sero dispostas. A clusula ORDER BY ocasiona o aparecimento de tuplas no resultado de uma consulta numa ordem determinada.
SELECT A1, A2, ..., An FROM ...r1, r2, ..., rn WHERE ...p ORDER BY A1 [ASC/DESC] A2 [ASC/DESC] ... An [ASC/DESC]

10 3

A clusula ORDER BY permite ordenar as linhas do resultado da consulta segundo algum(s) atributo(s) indicado, em ordem crescentes ou decrescente. Quando for necessrio utilizar esta clusula ela sempre deve aparecer na ltima linha da consulta.

10 4

No h limite quanto ao nmero de atributos utilizados para ordenao.


As palavras ASC e DESC determinam se a ordenao ser ascendente ou descendente. Caso nada seja especificado, assumido a ordenao ascendente (ASC).
select distinct status from fornecedor order by status select status, nome from fornecedor order by status DESC, nome ASC

Uma vez que a classificao de um grande nmero de tuplas pode ser custoso, aconselhvel classificar apenas quando necessrio.

Consultar registos de uma tabela

Clusula WHERE

105

Consultar registos de uma tabela


Where <condio>

10 6

O comando WHERE utilizado a seguir ao comando FROM e contm uma(s) condio(s) que os tuplos tm que satisfazer para que sejam visualizados. A palavra WHERE dever possuir trs elementos: 1. O nome do atributo. 2. O operador de comparao. 3. O nome de um atributo, uma constante ou uma lista de valores. Os operadores de comparao podem ser divididos em trs categorias: relacionais, lgicos e SQL. Os operadores relacionais e lgicos testam condies:

Consultar registos de uma tabela


Operadores
Operadores relacionais
> >= < <= <> ou != =

Servem para construir expresses booleanas


Uma expresso booleana uma expresso lgica que retorna Falso ou Verdadeiro

Exemplo: 2 <>2 Falso 4 = 2+3-1 Verdadeiro

Consultar registos de uma tabela


Operadores
Por exemplo, para listar os nomes, os cargos e departamentos de todos os empregados cujo cargo de secretrio deve-se utilizar o seguinte conjunto de comandos:

10 8

SELECT nome_funcionario, cargo_funcionario, codigo_departamento FROM funcionario WHERE cargo_funcionario='Secretario';

Consultar registos de uma tabela Operadores


Operadores lgicos
So utilizados para combinar duas ou mais expresses construdas com operadores relacionais

AND

OR NOT

Ou Negao

Os operadores lgicos operam em conformidade com as prprias tabelas de verdade. Cada operador tem a sua prpria tabela.

Consultar registos de uma tabela


OPERADORES LGIOS TABELAS DE VERDADE

11 0

p
0

q
0

PEq
0

P OU q
0

NO q
1

NO p
1

0
1 1

1
0 1

0
0 1

1
1 1

0
1 0

1
0 0

O operador No (NOT) inverte o valor lgico de uma expresso

Consultar registos de uma tabela Precedncia dos operadores


Mais alta !

11 1

> >= < <=


= <> E Mais Baixa OU

Qual o resultado das expresses abaixo

a)=NO(E(2>1;3<7;OU(2<5)))
b) =(E(2>1;3<7;OU(2<5); E(3<>2;2=2)))

Consultar registos de uma tabela


Operadores
operadores SQL Existem quatro, que operam sobre todos os tipos de dados:

11 2

Operador BETWEEN ..AND.. IN(lista) LIKE IS NULL

Significado Entre dois valores Corresponde a qualquer valor da lista Cadeia de caracteres que satisfaz uma condio um valor nulo

Consultar registos de uma tabela


Operadores
Para lista os titulos e precos dos livros cujos codigos so 1005,1010 e 1007.

11 3

select titulo_livro, preco_livro from livro where codigo_livro in(1005, 1010, 1007);

Consultar registos de uma tabela


Operadores
Para listar os ttulos de livros e respectivos autores, mas autores cujos nomes comecem por um A. Neste exerccio necessrio utilizar um smbolo para construir a cadeia de caracteres de pesquisa. Este smbolo %, que representa qualquer sequncia com vrios caracteres ou nenhum. select titulo_livro, autor_livro from livro where autor_livro like 'A%';

11 4

11 5

COMPARAO DE STRINGS
Comparao com uma string usando LIKE: '%' vale por qualquer sequncia de 0 ou mais caracteres: Nome_Produtor LIKE 'Qt.%' (MySQL) Nome_Produtor LIKE 'Qt.*' (Access)

11 6

11 7

Utilizao de Wildcards com o filtro LIKE O caracter '_' vale por qualquer letra (uma e uma s); ('?' no Access) Nome_Produtor LIKE 'D_o%'

Nome_Produtor LIKE 'D%o%'


Usando = faz-se a igualdade literal: Nome_Produtor = 'A_r% s verdade se nome for 'A_r%'

11 8

WILDCARD - '_
SELECT nome_produtor FROM produtor WHERE nome_produtor LIKE 'D%o%'; SELECT nome_produtor FROM produtor WHERE nome_produtor LIKE 'D_o%'; SELECT nome_produtor FROM produtor WHERE nome_produtor LIKE '_o%';

11 9

OPERADOR IS NULL

SELECT * FROM Produtor WHERE Morada_Produtor IS NULL;

Consultar registos de uma tabela


Operadores
Para listar os ttulos de livros e respectivos autores, mas apenas livros sem preo select titulo_livro, preco_livro, autor_livro from livro where preco_livro is null;

12 0

Consultar registos de uma tabela


Operadores
Para listar os ttulos de livros e respectivos autores, mas apenas livros cujo preo esteja entre 100 e 200 select titulo_livro, preco_livro, autor_livro from livro

12 1

where preco_livro between 100 and 200;

Consultar registos de uma tabela


Operadores
Uso do operador NOT com operadores SQL
IS NOT NULL NOT IN (conjunto) NOT BETWEEN NOT LIKE No um valor nulo Corresponde a nenhum Fora do intervalo de valores Corresponde a no contm

AVG| MIN | MAX | SUM | COUNT FUNES

AGREGADAS
123

12 4

MODIFICANDO A BASE DE DADOS


(CONTINUAO)

Funes Agregadas
A linguagem SQL oferece a habilidade para computar funes em grupos de tuplas usando a clusula group by. O atributo ou atributos utilizados na clusula group by so utilizados para formar grupos. Tuplas com o mesmo valor em todos os atributos na clusula group by so colocados num grupo.

12 5

Funes Agregadas
A linguagem SQL possui algumas funo especficas para clculos em grupos de tuplas:
mdia: avg mnimo: min mximo: max total: sum contar: count desvio: STDEV(), Varincia: VARIANCE()

As operaes como a avg, sum, so chamadas funes agregadas porque operam em agregaes de tuplas. O resultado de uma funo agregada um valor nico.

FUNES DE AGREGAO E SEUS RESULTADOS

12 6

12 7

Deve-se notar que as funes SUM e AVG somente aceitam expresses numricas como argumentos, uma vez que elas calculam a soma e a mdia de valores, respectivamente. As demais (COUNT, MAX e MIN) aceitam qualquer tipo de dado na expresso como parmetro.

12 8

FUNES AGREGADAS
A principal particularidade a ser ressaltada com relao funo COUNT. COUNT(expresso) e COUNT(*) so subtilmente diferentes, uma vez que COUNT(expresso) no conta as linhas nulas e COUNT(*) realiza a contagem de todas as linhas, sejam elas nulas ou no.

12 9

FUNES AGREGADAS

select count (* ) from funcionario

select count (codigo_funcionario ) from funcionario

13 0

FUNES AGREGADAS
Clasula Group By

[ GROUP

BY group_by_expression ]

O resultado da clusula GROUP BY uma tabela em que as linhas com valores iguais para a expresso group_by_expression so agrupadas. Todas as colunas da clusula SELECT tm de estar includas na group_by_expression.

Funes agregadas SELECT GROUP BY


SELECT select_list [ INTO new_table ] FROM table_source

13 1

[ WHERE search_condition ]
[ GROUP BY group_by_expression ] [ HAVING search_condition ] [ ORDER BY order_expression [ ASC | DESC ] ] ;

13 2

FUNES AGREGADAS
importante notar que se forem includas funes de grupo no comando SELECT, no se poder seleccionar resultados individuais a no ser que o atributo aparea no comando GROUP BY.

Se se pretender introduzir restries ao grupo de tuplos no se poder fazer com o comando WHERE, mas sim com HAVING. Esta palavra normalmente colocada depois do comando GROUP BY, pois os grupos so formados antes de impor as restries.

13 3

FUNES AGREGADAS
Outra questo a ser ressaltada com relao utilizao da clusula group by que a lista de valores da clusula select somente aceita funes de agregao, constantes e expresses combinando-as, alm dos campos listados na clusula group by. Tal restrio evidente, uma vez que a incluso de outros campos na lista do select seria totalmente sem sentido e impossvel de ser retornada.

13 4

FUNES AGREGADAS
Porm, podemos tambm usar as funes de agregao sem a clusula group by. Neste caso a tabela inteira tratada como um nico grupo. Uma consulta, para contar o nmero de funcionrios da sua empresa, pode ser expressa da seguinte maneira:

13 5

FUNES AGREGADAS
"Encontre a mdia dos saldos em todas as contas"

select avg(saldo) from contas


A funo agregada count usada freqentemente para contar o nmero de tuplas numa relao. A notao para isto count(*). Assim para achar o nmero de tuplas da relao cliente, escrevemos: select count(*) from clientes

13 6

FUNES AGREGADAS
Selecione o salrio mdio em cada sector da empresa

Select codigo_sector, avg (salario) from funcionario group by codigo_sector

CLUSULA HAVING
SELECT - GROUP BY - HAVING
137

13 8

FUNES AGREGADAS
[ HAVING search_condition ] Elimina do resultado os grupos que no satisfazem a condio search_condition

13 9

FUNES AGREGADAS
A Clusula HAVING

Em certas situaes, necessrio definir uma condio que se aplique a grupos, ao invs de linhas. Imagine se estivssemos interessados em saber o salrio mdio apenas daqueles sectores, cujo salrio mdio seja maior que AKZ 1100,00. Esta condio no se aplica a linhas simples, mas sim a cada grupo construdo com a clusula group by. Deste modo, no podemos utilizar funes de agregao na clusula where e para expressar tal condio utilizamos a clusula having

14 0

FUNES AGREGADAS
Os predicados na clusula having so aplicados depois da formao dos grupos, para que funes de agregao possam ser usadas. Expressamos esta consulta SQL assim: select codigo_sector, avg (salario) from funcionario group by codigo_sector having avg (salario) > 1100

14 1

Apresenta os cargos cujo salario mximo maior ou igual a 300.000.

SELECT cargo, MAX(salario) As Maiores Salarios FROM funcionario GROUP BY cargo HAVING MAX(salario) >= 300000;

14 2

Se uma clusula where e uma clusula having aparecerem numa mesma consulta, o predicado na clusula where aplicado primeiro. As linhas que satisfazem a condio da clusula where so ento agrupadas pela clusula group by. Em seguida, o predicado da clusula having aplicado a cada grupo.

14 3

Ilustrando a utilizao de where e having na mesma instruo, faremos a seguinte consulta: cdigo do produto e quantidade total requisitada, para os produtos que possuem quantidade total requisitada maior que 10. select COD_PRODUTO, sum (QTDE ) from REQUISICAO R, ITENS_REQUISICAO I where R.COD_REQUISICAO = I.COD_REQUISICAO group by COD_PRODUTO having sum (QTDE) > 100

14 4

FUNES AGREGADAS
SELECT nome_produtor, COUNT(vinho.produtor_id) AS num_vinhos, SUM(preco), AVG(preco) AS preco_Medio FROM Vinho, Produtor

WHERE Vinho.Produtor_ID = Produtor.Produtor_ID


GROUP BY Vinho.Produtor_ID, Nome_Produtor HAVING Preco_Medio > 19 ORDER BY Nome_Produtor;

14 5

Juno

JUNO
Seleo de dados em mais de uma tabela SELECT coluna1, coluna2, ..., colunaN FROM nome_da_tabela WHERE condio_join;

JUNO
Seleo de dados em mais de uma tabela SELECT coluna1, coluna2, ..., colunaN FROM nome_da_tabela WHERE condio_join;

JUNO
/* NATURAL JOIN as colunas devem ter o mesmo nome e o mesmo tipo */
/* Seleo de todos os funcionrios, inclusive com o nome do departamento em que trabalham */

SELECT funID, funNome, funSobrenome, depID, depNome FROM Funcionarios NATURAL JOIN Departamentos

JUNO
/* USING Especificando colunas para o join */
/* Seleo de todos os funcionrios, inclusive com o nome do departamento em que trabalham */

SELECT funID, funNome, funSobrenome, depID, depNome FROM Funcionarios JOIN Departamentos USING (depID)

JUNO
/* Clusula ON */
/* Seleo de todos os funcionrios, inclusive com o nome do departamento em que trabalham */

SELECT funID, funNome, funSobrenome,

f.depID, depNome
FROM Funcionarios f JOIN Departamentos d ON (f.depID = d.depID)

/* JOINS com a clusula WHERE */ /* Seleo de todos os funcionrios, inclusive com o nome do departamento em que trabalham */

JUNO

SELECT funID, funNome, funSobrenome,

f.depID, depNome
FROM Funcionarios f, Departamentos d WHERE f.depID = d.depID

JUNO
/* Auto-join */ /* Seleo de todos os alunos, inclusive com as informaes do curso em que esto matriculados */

SELECT f.funID, f.funNome, f.funSobrenome, f.funGerenteID, ger.funNome, ger.funSobrenome FROM Funcionarios f, Funcionarios ger WHERE f.funGerenteID = ger.funID

JUNO
/* LEFT OUTER JOIN */ /* Seleo de todos os departamentos e o nome dos funcionrios que trabalham em cada um deles; todos os departamentos devem ser listados, ainda que no haja funcionrios trabalhando nele */

SELECT d.depID, d.depNome, f.funID, f.funNome FROM Departamentos d LEFT OUTER JOIN Funcionarios f ON d.depID = f.depID

JUNO
/* RIGHT OUTER JOIN */ /* Seleo de todos os departamentos e o nome dos funcionrios que trabalham em cada um deles; todos os funcionrios devem ser listados, ainda que no estejam alocados a um departamento */

SELECT d.depID, d.depNome, f.funID, f.funNome FROM Departamentos d RIGHT OUTER JOIN Funcionarios f ON d.depID = f.depID

JUNO
/* FULL OUTER JOIN */ /* Seleo de todos os departamentos e o nome dos funcionrios que trabalham em cada um deles; todos os funcionrios e todos os departamentos devem ser cadastrados, sem exceo */

SELECT d.depID, d.depNome, f.funID, f.funNome FROM Departamentos d FULL OUTER JOIN Funcionarios f ON d.depID = f.depID

Operaes de Conjuntos

156

15 7

A lgebra relacional, na qual a SQL se baseia, inclui as operaes union, intersect e minus, para junes de conjuntos. Entretanto, apenas a instruo union foi includa no padro ANSI da linguagem SQL. Isto no chega a ser um problema, pois a instruo intersect pode ser realizada com a construo in, e a minus com a not in.

15 8

Para demonstrarmos a utilidade da instruo union, vamos considerar que a seguinte consulta seja requisitada: fornea todos os cdigos dos funcionrios que provocaram qualquer movimentao no estoque, ou seja, uma requisio ou uma devoluo.

15 9

Para recuperarmos os funcionrios que requisitaram produtos, utilizaramos a seguinte instruo:

select from

COD_FUNCIONARIO REQUISICAO

Para aqueles que devolveram algum produto: select from COD_FUNCIONARIO DEVOLUCAO

16 0

Agora para fazermos a unio destes dois conjuntos de valores, utilizamos o operador union. Assim a instruo resultante : select COD_FUNCIONARIO from REQUISICAO union

select COD_FUNCIONARIO from DEVOLUCAO

16 1

Se a consulta fosse os cdigos dos funcionrios que participaram de uma requisio e de uma devoluo, teramos: select COD_FUNCIONARIO from REQUISICAO intersect

select COD_FUNCIONARIO from DEVOLUCAO

16 2

O mesmo resultado obteramos com a seguinte sentena: select COD_FUNCIONARIO from REQUISICAO where COD_FUNCIONARIO in (select COD_FUNCIONARIO from DEVOLUCAO)

16 3

Se a consulta fosse para obter os cdigos dos funcionrios que participaram de alguma requisio, mas no participaram de nenhuma devoluo, teramos:

select COD_FUNCIONARIO from REQUISICAO


minus select COD_FUNCIONARIO from DEVOLUCAO

16 4

O mesmo resultado obteramos com a seguinte sentena:

select COD_FUNCIONARIO from REQUISICAO where COD_FUNCIONARIO not in (select COD_FUNCIONARIO from DEVOLUCAO)

16 5

Portanto pudemos comprovar que tanto a operao intersect como a operao minus podem ser realizadas em construes anlogas utilizando in e not in, respectivamente. importante ressaltar que o operador union trata as tabelas como conjuntos, e pela regra de unio de conjuntos, valores duplicados so descartados. Assim, se um funcionrio requisitou e devolveu algum produto, ele aparecer apenas uma vez na lista resultante. Caso seja necessrio manter as duplicaes, deve-se utilizar o operador union all ao invs de union.

Sub-Consultas
Consultas Complexas

Sub-Consultas
Comando SELECT que est encadeado noutro comando SELECT, produzindo resultados intermdios.
Uma subconsulta utilizada quando necessrio seleccionar tuplos de uma tabela com uma condio que dependa de dados da mesma tabela.

Subconsulta
Estrutura geral
SELECT .... FROM .... WHERE [at] OPERADOR ( SELECT ... FROM ... [WHERE ... ]) Declarao SELECT localizada dentro de outra declarao SELECT

Sintaxes
SELECT * FROM TABELA1[, TABELA2] WHERE [ [NOT] EXISTS ( subconsulta) ] [ [NOT] UNIQUE ( subconsulta)] [ atributo > | < | >= |<= ALL ( subconsulta)] [ atributo > | < | >= |<= ANY ( subconsulta)] [ atributo [,atributo2] [NOT] IN ( subconsulta ) ]

Subconsulta

1. 2.

Recurso anteriormente utilizado(PLEW)


Inexistncia anterior de juno externa Desempenho ruim das ligaes internas

Subconsulta

1. 2. 3.

Preterida devido:
Adio de juno externa no SQL-99 Melhora do processamento de juno interna Pouca legibilidade no cdigo com subconsulta ( leitura/ manuteno)

17 2

SQL permite que alguns consultas mais elaboradas possam ser feitas, utilizando apenas variveis tuplas sem as funes de agregao. Por exemplo, uma sentena em SQL para devolver todos os setores que tm mais que 15 funcionrios alocados, seria:

17 3

select distinct S.NOME from SECTOR S

Where = ( select count(*) from FUNCIONARIO T where T.COD_SECTOR = S.COD_SECTOR) > 15

Subconsulta
SELECT descricao , preco FROM comida
WHERE preco < ( SELECT AVG(preco) FROM comida)

Processamento de Subconsulta
SELECT descricao , preco FROM comida WHERE preco < ( SELECT AVG(preco) FROM comida)

( SELECT AVG(preco) FROM comida) (200)

2. SELECT descricao , preco FROM comida WHERE preco < (200)

Subconsultas que retornam lista de valores

1. 2.

Dois casos possveis:


Um valor nico Lista de valores

O resultado da subconsulta deve estar dentro da declarao da consulta externa.

Subconsultas: retorno de lista


WHERE + emprego de IN / NOT IN
Tab. Func
Num_func 2 4 6 8 10 12 14 16 18 20 Nome_func Maria Joao Antonio Alex Roberto Graa Leila Clea Ane Cintia Null

Tab. Est
Num_Est 3 6 9 12 15 18 Nome_Est Tarso Antonio Nair Graa Quenia Ane Null

Subconsulta: retorno de lista


Ocorrncias de Func onde num_func

liga-se com valor da coluna num_est ( Est)


SELECT num_func, nome_func FROM func WHERE num_func IN ( select num_est FROM est) SELECT num_func, nome_func FROM func WHERE num_func IN ( 3, 6, 9 , 12, 15, 18, null)
6 Antonio

12 18

Graa Ane

Equivale a uma juno interna !

Subconsulta: retorno de lista


Ocorrncias de Func onde num_func NO se ligam com nenhum valor da coluna num_est ( Est) SELECT num_func, nome_func FROM func WHERE num_func NOT IN ( select num_est FROM est ) SELECT num_func, nome_func FROM func WHERE num_func IN ( 3, 6, 9 , 12, 15, 18)

SUBCONSULTAS COM RETORNO DE VALOR NICO


Uma forma de assegurar o retorno de valor nico o emprego de funes de agregao. Operadores possveis:
= < <= > >= IN | NOT IN BETWEEN

Subconsulta correlativas
Qualquer consulta que contm uma referncia para tabela da consulta externa.
No pode ser avaliada antes da consulta externa. PLEW cita como modalidade mais antiga.

Subconsulta com Exists


WHERE + exists ( correlativa) Reserva um espao separado para cada linha da tabela na consulta externa.
select num_matricula, nome from aluno where exists
Sem atributo

( select distinct num_matricula from nota_aluno_disciplina)

SUBCONSULTA PARA LIGAO EXTERNA


Empregar NOT EXISTS
SELECT a.num_func, a.nome_func, b. num_est, b. nome_est FROM func a, est b WHERE a.num_func = b. num_est UNION ALL SELECT a.num_func, a.nome_func, null, null

FROM func a
WHERE NOT EXISTS( select b.num_est FROM est WHERE a.num_func = b. num_est)

Operadores para subconsultas


> >= < <= < >
EXISTS IN/ NOT IN > >= < <= <>ALL > >= < <= <> ANY <>ALL equivale a NOT INT

IN equivale a =ANY

EXERCCIO
Compare a) e b) e justifique a diferena.
a) select num_matricula, nome from aluno where exists ( select distinct num_matricula from nota_aluno_disciplina)

b) select num_matricula, nome from aluno where num_matricula in ( select distinct num_matricula from nota_aluno_disciplina)

Operadores de Conjuntos
Equivalncia com conjuntos matemticos

UNION/ UNION ALL


INTERSECT CORRESPONDING BY EXCEPT

Subconsultas com operadores de conjuntos


Tratamento de consultas como conjuntos consulta 1 UNION [ALL] | INTERSECT | EXCEPT | MINUS consulta 2
* As consultas devem ter a mesma quantidade e mesmo tipo de campos como retorno para efetuar esses comandos.

18 8

Sub - consultas Exemplos vrios

Sub-Consultas (cont.)
SELECT MIN(salario) FROM Funcionario;

Depois devemos encontrar o empregado que ganha esse ordenado:


SELECT Nome, Cargo, Salario FROM Funcionario WHERE Salario = (salario mnimo);

Assim, podemos combinar os dois cdigos:


SELECT Nome, Cargo, Salario FROM Funcionario WHERE Salario = (SELECT MIN(Salario) FROM Funcionario);

Sub-Consultas (cont.)
SELECT Nome, Cargo FROM Funcionario WHERE Cargo = (SELECT Cargo
FROM Funcionario WHERE Nome='Blake');

SELECT Nome, Cod_Depar, Salario FROM Funcionario WHERE (Salario, Cod_Depar)IN(SELECT MIN(Salario), Cod_Depar
FROM Funcionario GROUP BY Cod_Depar);

Sub-Consultas (cont.)
SELECT Cod_Depar, AVG(Salario) FROM Funcionario

GROUP BY Cod_Depar
HAVING AVG(Salario) > (SELECT AVG(Salario)
FROM Funcionario WHERE Cod_depar = 30);

Subconsultas /* Subconsulta de uma nica

linha */

/* Quem ganha um salrio maior que o salrio de Paulo? */

SELECT funID, funNome, funSalario FROM Funcionarios WHERE funSalario > ( SELECT funSalario FROM Funcionarios WHERE funNome = Paulo )

Subconsultas
/* Subconsulta de vrias linha operador ANY */ /* Quem ganha um salrio menor que o salrio de qualquer funcionrio do departamento 15? */

SELECT funID, funNome, funSalario FROM Funcionarios WHERE funSalario < ANY ( SELECT funSalario FROM Funcionarios WHERE depID = 15 )

Subconsultas /* Subconsulta de vrias

linha operador ALL */

/* Quem ganha um salrio menor que o salrio de todos os funcionrio do departamento 15? */

SELECT funID, funNome, funSalario FROM Funcionarios WHERE funSalario < ALL ( SELECT funSalario FROM Funcionarios WHERE depID = 15 )

/* Subconsulta de vrias linhas */ /* Liste todos os funcionrios que no so gerentes */

Subconsultas

SELECT funID, funNome, funSalario FROM Funcionarios WHERE funID NOT IN /* equivale a <> ALL ( SELECT DISTINCT funGerenteID FROM Funcionarios WHERE funGerenteID IS NOT NULL )

*/

Subconsultas /* Subconsulta de vrias

linhas */

/* Liste todos os funcionrios que so gerentes */

SELECT funID, funNome, funSalario FROM Funcionarios WHERE funID IN /* equivale a = ANY */ ( SELECT DISTINCT funGerenteID FROM Funcionarios )

19 7

19 8

Qual o produtor que vende o vinho mais caro? SELECT Nome_Produtor , MAX(Preco)

FROM Produtor,Vinho
WHERE Produtor.Produtor_ID = Vinho.Produtor_ID GROUP BY Produtor.Produtor_ID, Produtor.Nome_Produtor; SELECT MAX(Preco) FROM Vinho;

19 9

20 0

Qual o produtor que vende o vinho mais caro? SELECT Nome_Produtor , Preco FROM Produtor,Vinho

WHERE Produtor.Produtor_ID = Vinho.Produtor_ID


AND Preco = ( SELECT MAX(Preco) FROM Vinho );

20 1

Qual o produtor que vende o segundo vinho mais caro? SELECT Nome_Produtor , Preco FROM Produtor,Vinho WHERE Produtor.Produtor_ID = Vinho.Produtor_ID AND Preco =

( SELECT MAX(Preco) FROM Vinho WHERE Preco <


( SELECT MAX(Preco) FROM Vinho WHERE Preco ) );

20 2

20 3

QUAIS OS VINHOS CUJO PREO MENOR QUE TODOS OS PREOS DOS VINHOS COM 13 GRAUS?

SELECT Nome_Produtor , Nome_Vinho, Cor, grau, Preco FROM Produtor,Vinho WHERE Produtor.Produtor_ID = Vinho.Produtor_ID
AND Preco < ALL ( SELECT Preco FROM Vinho WHERE Grau = 13 );

20 4

QUAIS OS VINHO CUJO PREO MENOR QUE O PREO DE UM VINHO COM 13 GRAUS?
SELECT Nome_Produtor , Nome_Vinho, Cor, grau, Preco FROM Produtor,Vinho WHERE Produtor.Produtor_ID = Vinho.Produtor_ID AND Preco < ANY ( SELECT Preco FROM Vinho WHERE Grau = 13 );

Quais os vinho que usam castas que os vinhos mais caros usam?
FROM Produtor, Vinho, Casta_Vinho
WHERE Produtor.Produtor_ID = Vinho.Produtor_ID AND Vinho.Vinho_ID = Casta_Vinho.Vinho_ID AND Casta_ID IN
( SELECT Casta_ID FROM Vinho, Casta_Vinho WHERE Vinho.Vinho_ID = Casta_Vinho.Vinho_ID

20 5

SELECT DISTINCT Nome_Produtor , Nome_Vinho, Cor, grau, Preco

AND Preco = (SELECT MAX(Preco) FROM Vinho) ) ;

20 6

Trabalho com Datas (Mysql)

207

20 8

Para manipularmos dados do tipo DATA, podemos definir a coluna como DATE, DATETIME ou TIMESTAMP, sendo que suas principais caractersticas so:

# DATE esta no formato AAAA-MM-DD # DATETIME esta no formato AAAA-MM-DD HH:MM:SS # TIMESTAMP esta no formato AAAAMMDDHHMMSS

20 9

Apesar das datas do tipo DATETIME e TIMESTAMP utilizarem hora, minuto e segundo, podemos utilizar o seu contedo somente com a data. Para isso, utilizase a funo DATE_FORMAT(date,format), que transforma a data apresentada para o formato desejado. Tambm podemos utilizar essa funo para colocar qualquer tipo de data no formato mais adequado para nossa aplicao, como por exemplo no formato "DD/MM/AAAA"

21 0

As datas so armazenadas no formato norte-americano e, para obtermos o resultado no formato desejado, devemos utilizar a funo acima: Ex: se for necessrio apresentar a data de uma determinada transaco no formato "DD/MM/AAAA" deve-se fazer o comando de seleco com a seguinte sintaxe:

SELECT DATE_FORMAT(nome_da_coluna_com_a_data, '%d/%m/%Y')FROM nome_da_tabela;

21 1

Ateno especial deve ser dada s colunas definidas como "TIMESTAMP", pois nelas ficam depositados data e horrio de actualizao da linha na tabela, isto : quando feita uma mudana em qualquer dado de uma linha da tabela o dado da coluna definida como TIMESTAMP actualizada com o momento actual.

21 2

Para melhor entender o uso dos tipos de data no MySQL, apresentamos a seguir comandos que demonstram o resultado de datas formatadas:
SELECT * FROM FORMATODATA; SELECT DATE_FORMAT(DT_DateTime, '%d/%m/%Y') as 'DATETIME', DATE_FORMAT(DT_Date, '%d/%m/%Y') as 'DATE', DATE_FORMAT(DT_Timestamp, '%d/%m/%Y') as 'TIMESTAMP FROM FORMATODATA;

21 3

Para fazermos uso da data actual, devemos utilizar a funo CURDATE(), que retornar a data corrente no formato AAAA-MM-DD e se necessitarmos a data no formato AAAAMMDD utilizamos a funo CURDATE() + 0.

Ex.| SELECT CURDATE(), CURDATE() + 0; Para obtermos a diferena de dias entre duas datas, utilizamos a funo DATADIFF(data1, data2).

21 4

Ex.|

SELECT DATEDIFF('2007-10-30 23:59:59','2007-12-31'

Para somarmos dias a uma data, utilizamos a funo DATE_ADD(date,INTERVAL exprtype)

Ex.|

SELECT DATE_ADD('2005-12-31 23:59:59', INTERVAL 1 DAY);

Para subtrairmos dias a uma data, utilizamos a funo SUBDATE (date,INTERVAL exprtype)

21 5

Ex.|

SELECT SUBDATE('2005-12-31 23:59:59', INTERVAL 5 DAY);

Para obtermos o dia da semana, utilizamos a funo DAYOFWEEK(date)

Ex.|

SELECT DAYOFWEEK('1998-02-03');

Para obtermos o dia do ano utilizamos a funo DAYOFYEAR(date)

Ex.|

SELECT DAYOFYEAR(CURDATE());

Para obtermos o momento atual, utilizamos a funo NOW() ou SYSDATE()

Ex.|

SELECT NOW(), SYSDATE();

21 6

II E III PARTES
II PARTE ADMINSTRAO DE BASE DE DADOS

UTILIZANDO MYSQL
PRINCIPAIS INSTRUES III PARTE - PRTICA ESTUDO DE CASO UTILIZANDO MYSQL

21 7

II PARTE ADMINSTRAO DE BASE DE DADOS


MYSQL PRINCIPAIS INSTRUES Viso Geral Para aceder ao servidor MySQL, preciso utilizar o comando que segue. importante lembrar, que o MySQL tem o seu prprio registo de nomes e senhas, sendo que voc pode possuir uma conta no servidor SQL, mas no telnet, e o oposto tambm vlido..

21 8

Conexo com MySql


mysql -u root -p supersenha Sintaxe: mysql -u (usurio) -p (senha) ou mysql -h servidor -u (usurio) --password=(senha) Aps validada a senha, e pr-supondo que o MySQL tenha sido corretamente instalado, voc ver algo como: Cliente MySQL - NBS Bem vindo ao monitor do MySQL. Use ; aps os comandos ou \g.

Sua id 49, e voc est conectado a um servidor verso 3.21.23-betalog


Digite 'help' para ajuda. mysql>

CRIAO E UTILIZAO DE UMA BASE DE DADOS


Utilize a instruo SHOW para saber quais bases de dados existem actualmente no servidor: mysql> SHOW DATABASES; A lista das bases de dados provavelmente ser diferente na sua mquina, mas as bases de dados mysql e test provavelmente estaro entre eles. A base de dados mysql necessria porque ela descreve privilgios de acessos de usurios. A base de dados test geralamente fornecida como um espao para que os usurios possam fazer testes. Criar uma base de dados e seleciona-a para o uso; voc deve fazer isso de forma explcita. Para fazer da base de dados actual, use o comando: USE mysql> USE tableDatabase changed

21 9

22 0

CONTINUAO....
DESCRIBE (Descrever)DESC Descreve o layout da tabela Exemplo:DESCRIBE tabela DESC tabela

22 1

CONTINUAO...
CREATE (criar)CREATE DATABASE nome; Cria uma BD totalmente nova. CREATE TABLE nome; define a estrutura de uma tabela dentro da BD, e a forma como todas as tabelas so criadas no MySql. DROP (excluir)DROP DATABASE nome; remove toda a BD com o seus ficheiros. DROP TABLES nome; apaga uma tabela e os seus dados.

22 2

III PARTE - PRTICA


ESTUDO DE CASO UTILIZANDO MYSQL

Você também pode gostar