Escolar Documentos
Profissional Documentos
Cultura Documentos
SQL
(SGBD - MySql)
Frei Joaquim Jos Hangalo
ROTEIRO
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.
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
SQL
SELECT UPDATE DELETE INSERT
DML
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
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
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
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
18
SGBD - MYSQL
Alguns comandos operacionais e administrativos
19
20
help ou \h ou ?;
21
SELECT 4*5+4%3;
22
23
24
25
SHOW DATABASES;
O comando USE permite mudar (selecctionar) uma base de dados especfica para uso USE curso;
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:
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;
28
Sintaxe: CREATE TABLE [IF NOT EXISTS]< nome_tabela > ( nome_atributo1 < tipo de dado > [ NULL/NOT NULL ] [DEFAULT <valor>] [AUTOINCREMENT] [PRIMARY KEY], );
29
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
30
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;
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"
38
CREATE table alunos( codigo int NOT NULL AUTO_INCREMENT, nome VARCHAR(20) NOT NULL , telefone CHAR(8) NOT NULL, PRIMARY KEY(codigo));
39
40
Ver a descrio da estrutura da tabela DESCRIBE <tabela> [coluna] DESCRIBE curso; DESCRIBE curso codigo_curso;
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
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
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
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
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
alter table r
48
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
Exemplo:
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
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
Exemplo:
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
Exemplo:
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
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),
54
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
55
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
56
Exemplo:
sexo
CP endereco
57
ATENO: Quando uma tabela possui uma chave primria composta por mais de um atributo, esta forma OBRIGATRIA.
58
Integridade referencial
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
valor
number(16,2),
references contas)
60
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
clusula insert
64
65
Clausula insert
Sintaxe
66
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
Os nomes das colunas podem ser omitidos, se a ordem dos valores a serem inseridos corresponder com a ordem de criao dos mesmos.
68
Suponha que se deseja inserir o facto de que o senhor Mapelo tem 1.200 AKZ na conta 9732 da agncia Chibia.
69
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.
70
Sintaxe
71
72
73
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
. 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
insert into itens_devoluo select 5005, codigo_produto, quantidade from itens_requisicao where codigo_requisicao = 1015
clusula update
79
80
Clausula UPDATE
Sintaxe
81
82
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
Update select
84
85
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
Clausula DELETE
Sintaxe
88
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.
89
90
91
where agencia_nome in
(select agencia_nome from agencia where agencia_cidade = Chibia)
92
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
94
95
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
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.
98
Descrio
Soma Subtraco Multiplicao Diviso
99
Utilizando o comando SELECT possvel alterar o nome na coluna (na visualizao). Para tal utiliza-se a palavra as(alis)
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;
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
10 2
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
Uma vez que a classificao de um grande nmero de tuplas pode ser custoso, aconselhvel classificar apenas quando necessrio.
Clusula WHERE
105
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:
10 8
AND
OR NOT
Ou Negao
Os operadores lgicos operam em conformidade com as prprias tabelas de verdade. Cada operador tem a sua prpria tabela.
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
11 1
a)=NO(E(2>1;3<7;OU(2<5)))
b) =(E(2>1;3<7;OU(2<5); E(3<>2;2=2)))
11 2
Significado Entre dois valores Corresponde a qualquer valor da lista Cadeia de caracteres que satisfaz uma condio um valor nulo
11 3
select titulo_livro, preco_livro from livro where codigo_livro in(1005, 1010, 1007);
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%'
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
12 0
12 1
AGREGADAS
123
12 4
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.
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
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.
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"
13 6
FUNES AGREGADAS
Selecione o salrio mdio em cada sector da empresa
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
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
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 */
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
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
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
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
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:
16 4
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.
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
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)
1. 2.
Tab. Est
Num_Est 3 6 9 12 15 18 Nome_Est Tarso Antonio Nair Graa Quenia Ane Null
12 18
Graa Ane
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.
FROM func a
WHERE NOT EXISTS( select b.num_est FROM est WHERE a.num_func = b. num_est)
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
18 8
Sub-Consultas (cont.)
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);
linha */
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 )
/* 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 )
Subconsultas
SELECT funID, funNome, funSalario FROM Funcionarios WHERE funID NOT IN /* equivale a <> ALL ( SELECT DISTINCT funGerenteID FROM Funcionarios WHERE funGerenteID IS NOT NULL )
*/
linhas */
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
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 =
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
20 6
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:
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.|
Ex.|
Para subtrairmos dias a uma data, utilizamos a funo SUBDATE (date,INTERVAL exprtype)
21 5
Ex.|
Ex.|
SELECT DAYOFWEEK('1998-02-03');
Ex.|
SELECT DAYOFYEAR(CURDATE());
Ex.|
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
21 8
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