Tópicos Introdução à SQL Definição Tipos de Operações Instrução SELECT Sintaxe básica Operações relacionais de restrição, projeção e junção Instruções DML Delete, Update e Insert Instruções DDL Create Table Prof. Constantino Jacob Page 1
Introdução à SQL Visão Geral - Padrões Edgar Frank Codd publica um artigo sobre o Modelo de Dados Relacional em 1970. O SQL foi concebido pela IBM em 1978. SQL ANSI 1986 / (ISO 1987) SQL ANSI 1992 (SQL2 ou SQL-92) SQL ANSI 1999 (SQL3 ou SQL-99) Novos tipos de dados Suporte a sintaxe OR (Object-Relational) SQL ANSI 2003 (SQL:2003) Melhoria do suporte a sintaxe OR Uso de dados semi estruturados: SQL/XML Os principais membros são da Oracle e da IBM Infelizmente, ainda não há nenhum banco de dados comercial que adote 100% ao padrão. Os bancos Open-Source são mais fiéis, com destaque no PostGreSql. Page 2
Introdução à SQL Tipos de Operações Structured Query Language, ou Linguagem de Consulta Estruturada Operações de Definição de Dados (DDL) CREATE TABLE DROP TABLE CREATE VIEW. Operações de Manipulação de Dados (DML) SELECT INSERT DELETE UPDATE DML (Data Manipulation Language - Linguagem de Manipulação de Dados) DDL (Data Definition Language - Linguagem de Definição de Dados) Alguns autores defendem algumas variações: DCL (Data Control Language - Linguagem de Controle de Dados) Comandos GRANT e REVOKE DTL - Linguagem de Transação de Dados BEGIN WORK / START TRANSACTION (1) COMMIT ROLLBACK DQL - Linguagem de Consulta de Dados SELECT ( também é considerado um comando DML ) (1) No Oracle, a execução da primeira instrução DML ( INSERT,UPDATE e DELETE ) inicia uma transação, que deve ser finalizada com COMMIT ( em caso de sucesso ) ou ROLLBACK no caso de uma FALHA. Não se esqueçam que as transações deve ser atômicas ( propriedade da atomicidade (2) ). (2) A propriedade de atomicidade garante que todas as operações de um banco de dados, em uma transação, sejam executadas ou nehuma delas o seja. ( Elsmasri; Sistema de Banco de Dados; p. 9) Page 3
Sintaxe básica SELECT * coluna1, coluna2, coluna n FROM <referência de tabelas> [WHERE <expressão condicional>] [ORDER BY <coluna1, coluna 2, coluna n>] [GROUP BY <coluna1, coluna 2, coluna n>] [HAVING <expressão condicional>] Todas as colunas são recuperadas no SELECT quando se usa * Os valores entre [] indica que estas instruções são opcionais Page 4
Sintaxe SQL 1999 SELECT table1.column, table2.column FROM table1 [CROSS JOIN table2] [NATURAL JOIN table2] [JOIN table2 USING (column_name)] [JOIN table2 ON(table1.column_name = table2.column_name)] [LEFT RIGHT FULL OUTER JOIN table2 ON (table1.column_name = table2.column_name)]; Page 5
Sintaxe SQL 1999 Query Simples SELECT nome, salario * 1.5 as salario_novo, Oi Mundo hello FROM empregados WHERE salario > 1000 And cargo = Gerente And ( comissao = S Or dept_id is null); Page 6
Sintaxe SQL 1999 INNER JOIN SELECT d.dept_id, d.dept_nome, d.loca_id, l.cidade FROM departamentos d [INNER] JOIN localidades l ON (d.loca_id = l.loca_id); Este é o padrão ANSI mais recente. Mas, há uma outra forma de se fazer JOINs, ainda muito em uso. Re-escrevendo o exemplo acima: SELECT d.dept_id, d.dept_nome, d.loca_id, l.cidade FROM departamentos d,localidades l WHERE (d.loca_id = l.loca_id); O ANSI achou que esta forma de escrita não deixa claro que uma operação de JOIN está sendo feita. Page 7
Sintaxe SQL 1999 Junção Natural SELECT dept_id, dept_nome, loca_id, cidade FROM departamentos NATURAL JOIN localidades; Foi omitda a instrução: departamentos.loca_id = localidades.loca_id O interpretador estabelece as condições de igualdade com base nos nomes dos atributos. Page 8
Sintaxe SQL 1999 Using SELECT dept_id, dept_nome, loca_id, cidade FROM departamentos JOIN localidades USING (loca_id); Neste caso, o usuário está informando qual é a coluna que possui um nome em comum entre as duas tabelas que deve ser utilizada para a condição de JOIN. Outros atributos que tenham nomes iguais serão ignorados. Page 9
Sintaxe SQL 1999 Produto Cartesiano SELECT nome, departamento FROM empregados CROSS JOIN departamentos; Page 10
Sintaxe SQL 1999 Junção de N tabelas SELECT empregado_id, cidade, dept_nome FROM empregados e JOIN departamentos d ON d.dept_id = e.dept_id JOIN localidades l ON d.loca_id = l.loc_id AND d.dept_id = 20 Page 11
Sintaxe SQL 1999 Outer JOINS SELECT empregado_id, cidade, dept_nome FROM empregados e LEFT OUTER JOIN departamentos d ON (d.dept_id = e.dept_id) O OUTER JOIN é útil quando o usuário deseja recuperar dados de uma tabela, mesmo que ela não satisfaça as condições impostas pelo JOIN. No exemplo acima todos os empregados são recuperados, inclusive os que não possuem departamento associado. Page 12
Sintaxe SQL 1999 Outer JOINS SELECT empregado_id, cidade, dept_nome FROM empregados e RIGHT OUTER JOIN departamentos d ON (d.dept_id = e.dept_id) No exemplo acima todos os departamentos são recuperados, inclusive os que não possuem empregados. Page 13
Sintaxe SQL 1999 Outer JOINS SELECT empregado_id, cidade, dept_nome FROM empregados e FULL OUTER JOIN departamentos d ON (d.dept_id = e.dept_id) É a união dos resultados do LEFT e do RIGTH JOIN em uma única consulta. Seu equivalente seria: SELECT empregado_id, cidade, dept_nome FROM empregados e LEFT OUTER JOIN departamentos d ON (d.dept_id = e.dept_id) UNION SELECT empregado_id, cidade, dept_nome FROM empregados e RIGHT OUTER JOIN departamentos d ON (d.dept_id = e.dept_id) Page 14
Instrução DELETE Sintaxe: DELETE FROM <TABELA> [WHERE <expressão condicional>] Exemplo: DELETE FROM EMPREGADOS WHERE SALARIO > 1000 DELETE irá excluir as linhas de uma tabela. Se a cláusula WHERE não for informada todas as linhas serão excluídas. Em alguns bancos, como o Oracle, o uso da palavra FROM é opcional. Lembrando: o comando DELETE (no Oracle) inicia uma transação. Para concluí-lo, execute um: COMMIT Confirma as alterações na base de dados. ROLLBACK Desfaz as alterações feitas. Page 15
Instrução UPDATE Sintaxe: UPDATE <TABELA> SET COLUNA1=VALOR1, [COLUNA2=VALOR2,] [COLUNAN=VALORN,] [WHERE <expressão condicional>] Exemplo: UPDATE EMPREGADOS SET SALARIO = SALARIO*1,15 WHERE SALARIO > 1000 UPDATE irá atualizar os atributos especificados em cada SET. Se a cláusula WHERE não for informada todas as linhas terão os atributos indicados atualizados. Lembrando: o comando UPDATE (no Oracle) inicia uma transação. Para concluí-lo, execute um: COMMIT Confirma as alterações na base de dados. ROLLBACK Desfaz as alterações feitas. Page 16
Instrução INSERT Sintaxe: INSERT INTO <TABELA> [(COLUNAS)] VALUES ( VALORES ) Exemplo: INSERT INTO DEPT VALUES ( 10, VENDAS ); INSERT irá incluir uma linha em uma tabela (existem variações como INSERT / SELECT que serão vistas mais tarde). Não é necessário informar as COLUNAS, desde que se conheça a estrutura da tabela, mas esta não é uma BOA PRÁTICA para ser adotada dentro de aplicativos. O recomendado sempre é informar as colunas. O exemplo acima ficaria assim: INSERT INTO DEPT ( DEPTNO, DNAME ) VALUES ( 10, VENDAS ); A estrutura da tabela DEPT é essa: DESC DEPT Name Null Type ------------------------------ -------- ------------------------------------------ DEPTNO NOT NULL NUMBER(2) DNAME VARCHAR2(14) LOC VARCHAR2(13) Reparem que a coluna LOC aceita valores NULOS. A mesma foi omitida no INSERT acima, e o banco automaticamente atribuiu NULO para a coluna LOC. Apesar de ser prático, a informação explícita desta coluna deixaria a instrução mais clara, como no exemplo abaixo: INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) VALUES ( 10, VENDAS, NULL); Lembrando: o comando INSERT (no Oracle) inicia uma transação. Para concluí-lo, execute um: COMMIT Confirma as alterações na base de dados. ROLLBACK Desfaz as alterações feitas. Page 17
Instrução CREATE TABLE Sintaxe: CREATE TABLE NOME_DA_TABELA ( NOME_COLUNA1 TIPO, NOME_COLUNA2 TIPO, NOME_COULNAN TIPO. ) O comando CREATE TABLE é um comando DDL. Sua sintaxe ANSI mais básica é válida em qualquer banco relacional. Page 18
Tipos de Dados - Oracle Tipo de Dado VARCHAR2(size) CHAR(size) NUMBER(p,s) DATE TIMESTAMP CLOB RAW and LONG RAW BLOB BFILE ROWID Descrição Dado alfa-numérico de tamanho variável Dado alfa-numérico de tamanho fixo Dados numéricos Data e hora Data, hora e frações de segundo Dado alfa-numérico de tamanho variável (até 4 GB) * Dados binários Dados binários (até 4 GB) * Ponteiro para um arquivo externo Um número base-64 que representa uma linha no banco dados No Oracle VARCHAR2 Limite máximo 4000 caracteres CHAR - Limite máximo 2000 caracteres NUMBER - 1.0 x 10-130 a 1.0 x 10 126 ( e dependendo do valor requer de 1 a 22 bytes para armazenamento ) ROWID é um tipo específico do Oracle, que representa o endereço físico da linha no SGBD. É de uso interno, e geralmente não é especificado na criação de uma tabela. Veremos ROWID com mais detalhes quando estudarmos índices. Page 19
CREATE TABLE / Tipos de Dados CREATE TABLE EMPREGADOS ( MATRICULA NUMBER(10), NOME VARCHAR2(50), DATA_CONTRATACAO DATE, SALARIO_BASE NUMBER(10,2), SEXO VARCHAR(1), OBSERVACOES CHARACTER VARYING(100), DEPT_ID NUMBER(10) ) / Como mostra o exemplo acima, o Oracle aceita os tipos ANSI mais genéricos ( o que é bom para gerar scripts portáveis ). Para conhecimento ( não cai na avaliação ) ANSI > Oracle CHARACTER(n) > CHAR(n) CHAR(n) > CHAR(n) CHARACTER VARYING(n) > VARCHAR(n) CHAR VARYING(n) > VARCHAR(n) NUMERIC(p,s) > NUMBER(p,s) DECIMAL(p,s) > NUMBER(p,s) INTEGER > NUMBER(38) INT > NUMBER(38) SMALLINT > NUMBER(38) FLOAT > NUMBER DOUBLE PRECISION > NUMBER REAL > NUMBER Page 20