Você está na página 1de 33

Introdução à SQL

O SQL (Structured Query Language), é um linguagem padrão usada para acesso a Banco de Dados. O conjunto de seus comandos permite-nos definir a estrutura dos dados no banco de dados relacional, acessar e manipular esses dados. Trata-se de uma linguagem não Procedural. Quando usamos o SQL, especificamos o que queremos fazer, e não como fazê-lo. É uma linguagem de fácil aprendizagem. SQL teve seu início em 1970, com E.F. Codd, que formulou os principios de um sistema relacional para manipulação de banco de dados e descreveu uma álgebra relacional para organizar os dados em tabelas. De lá para cá, a linguagem foi se aperfeiçoando e hoje existe um padrão desenvolvido pela American National Standards Institute (ANSI). Esse padrão tem sido a base para a maioria dos SQL's existentes atualmente no mercado. Cada fabricante inseriu novas funcionalidades em seu SQL, fazendo com que encontremos dezenas de versões de SQL. Apresentamos a seguir um visão geral da Arquitetura de um Sistema Gerenciador de Banco de Dados, para que possamos compreender do que se compõe a Linguagem SQL.

Arquitetura SGBD

Visão Externa 1
Visão
Externa 1
Visão Externa n
Visão
Externa n

Nível Externo

Esquema

Nivel Conceitual

Conceitual

Esquema Interno
Esquema
Interno

Nível Interno

Banco de Dados

Descreve a estrutura física de armazenamento do Banco de Dados. O

Esquema Interno usa um modelo de dados físico e descreve todos os detalhes do

armazenamento de dados e caminhos de acesso ao Banco de Dados.

1) Nível Interno.

2) Nível Conceitual. Descreve a estrutura de todo o Banco de Dados para os usuários. O Esquema Conceitual esconde os detalhes da estrutura física de armazenamento e se concentra em descrever as entidades, tipos de dados, relacionamentos, operações dos usuários e restrições.

3) Nível Externo. Inclue um número de esquemas externos ou visões de usuários. Cada uma delas descreve uma parte do Banco de Dados que um grupo particular de usuários está interessado e esconde o resto do Banco de Dados aos demais usuários.

Linguagens SGBD

- Data Definition Language (DDL) - Para definir o esquema conceitual e o esquema interno.

- View Definition Language (VDL) - Para definir as visões dos usuários e seus mapeamentos ao esquema conceitual.

- Data Manipulation Language (DML) - Para manipular os dados de uma Base de Dados. (Consultar, Inserir, Excluir, Modificar).

SQL = ( DDL

+

VDL + DML )

Definição de Dados em SQL

SQL utiliza os termos tabela (table), linha (row), e coluna (column) para relação ou entidade, tupla e atributo, respectivamente.

A Linguagem de Definição de Dados (DDL), permite executar tarefas como:

- criar um objeto de banco de dados

- excluir um objeto de banco de dados

- alterar um objeto de banco de dados

- conceder privilégios em um objeto de banco de dados

- revogar privilégios de um objeto de banco de dados

Conceitos utilizados em SQL

Apresentamos alguns objetos e conceitos fundamentais no entendimento da linguagem SQL.

- Banco de Dados (Database). É um conjunto de objetos SQL. Quando definimos um banco de dados, damos-lhe um nome para uma eventual coleção de tabelas e índices associados.

- Tabela. Um banco de dados contém uma ou mais tabelas. Cada tabela tem um nome e contém um número específico de colunas e linhas (não ordenadas).

- Índice. É um conjunto ordenado de ponteiros para os dados de uma tabela, armazenado separadamente da tabela. Cada índice é baseado nos valores dos dados de uma ou mais colunas de uma tabela. O índice visa melhorar a performance e também garantir a unicidade do dado (caso deseje).

- Visão (View). É uma forma alternativa de representar os dados que existem em uma ou mais tabelas. Uma view pode Ter todas ou algumas colunas de uma ou mais tabelas. Pode-se também Ter views baseadas em outras views ou da combinação de views e tabelas. Ela se assemelha a uma tabela, com a única diferença, de que a view não existe fisicamente. Os seus dados estão armazenados nas tabelas nas quais elas se baseiam.

- Junção (Join). Quando se deseja obter dados de mais de uma tabela, efetuamos a junção dessas tabelas.

- Chave Primária (Primary Key). É uma columa ou grupo de colunas, cujo valor identifica cada linha da tabela.

- Chave Estrangeira (Foreign Key). Colunas de tabelas que referenciam a chave primária de outra tabela.

- Integridade

Referencial.

Quando

definimos

uma

chave

estrangeira,

estamos

definindo uma integridade referencial entre as tabelas envolvidas.

- Catálogo do Sistema. Cada banco de dados tem um catálogo do sistema que contém tabelas do sistema. Essas tabelas contém informações sobre as tabelas, visões, colunas, índices, e privilégios de segurança do banco de dados. Em alguns SGBDs, esse catálogo é chamado de dicionário de dados.

Tipos de Dados (Datatypes)

Tipos de Dados especifica que tipo de informação (caracteres, números, datas) a coluna de uma tabela pode armazenar e como esses dados serão armazenados. Abordaremos a seguir alguns tipos de dados encontrado no SQL da Microsoft.

Binary [(n)]

Qtde fixa de números binários

Varbinary [(n)]

Qtde variável de números binários (mais economico)

Char [(n)]

Qtde fixa de caracteres

Varchar [(n)]

Qtde variável de caracteres (mais economico)

Datetime

Data com precisão de HHMMSS e MS (mais completo)

Smalldatetime

Data com precisão de HHMMSS

Decimal [(p[,s])] Numeric [(p[,s])]

Valores numéricos, onde p é a qtde total incluindo a parte inteira e a parte decimal, e o s corresponde a parte decimal

Tinyint

Números inteiros. (-255 a +255)

Smallint

Númerso inteiros. (-32.767 à +32.767)

Int

Números inteiros.

Money

Valores monetários

Smallmoney

Valores monetários

Text

Textos

Image

Fotos e Imagens

Bit, timestamp

Tipos de dados especiais

O usuário pode criar seu tipo de dado e armazená-lo no banco de dados para utilizá-lo na definição das colunas das novas tabelas.

Exemplos:

EXEC sp_addtype cep, 'char(10)' EXEC sp_addtype grandestring 'varchar(75)'

EXEC sp_droptype cep

Criação de Tabelas

Para se criar tabelas dentro de um banco de dados, utilizamos a sentença CREATE TABLE.

CREATE TABLE [nome_banco.[dono_tabela]. ] nome_tabela

(

)

[ nome_col

| [ [ , ] constraint ]] [ [ , ] [ próximo_nome_col | próxima_constraint]

propriedades_col [ constraint [constraint [

]

constraint]]]

Nomes de colunas devem ser únicos dentro de uma mesma tabela

Toda coluna deve Ter um tipo de dado (datatype)

Pode-se definir até 2 bilhões de tabelas por banco de dados

Pode-se definir até 250 colunas por tabela

Um valor NULL indica a ausência de dados. NULL não é branco e nem zero. Por default, o SQL assume NOT NULL, para as colunas que não estão declaradas com NULL. Pode-se alterar esse default na configuração do SQL Server.

Exemplos:

CREATE TABLE

empresa ( cod_empresa nome_empresa cgc dt_fundacao nro_funcionarios

 

int

NOT NULL,

varchar(45)

NOT NULL,

char(14)

NOT NULL,

smalldatetime,

smallint )

CREATE TABLE funcionario

( cod_func

int,

nome_func

varchar(45),

endereco

varchar(50)

NULL,

cidade

varchar(30)

NULL )

Integridade Referencial, Chave Primária e Chave Estrangeira

A Integridade Referencial de um Banco de Dados Relacional é a verificação de que as ligações entre as linhas das tabelas relacionadas são válidas. Essas ligações são implementadas da relação entre a chave primária (PK) de uma tabela com a chave

estrangeira (FK) da mesma tabela (no caso de um auto-relacionamento)

tabela. Chamamos a tabela que contém a chave primária de tabela pai, e a que contém a chave estrangeira de tabela filho. Quando criamos uma relação de Pai e Filho utilizando a Chave Primária e a Chave Estrangeira, o SGBD automaticamente passa a checar a integridade referencial das linhas das tabelas envolvidas, eliminando assim, a necessidade dessas checagem na programação das aplicações. Como exemplo, vamos considerar uma aplicação que trate os pedidos de um cliente. Temos uma tabela Cliente que é tabela pai de uma outra tabela Pedido, onde a Chave Primária da tabela Cliente é o código_do_cliente. Quando criamos a ligação entre as duas tabelas, teremos uma coluna código_do_cliente na tabela Pedido que será a Chave Estrangeira apontado para a Chave Primária da tabela Cliente. Dessa forma quando a aplicação for inserir um pedido de um cliente na tabela Pedido, o SGBD irá checar se esse cliente já existe na tabela Cliente, retornando um erro, caso não atenda essa condição.

ou de outra

Cliente Cód_cliente (PK) Nome_cliente CGC Endereço Pedido Cód_cliente (PK) / (FK) Nro_pedido (PK) Data_pedido
Cliente
Cód_cliente (PK)
Nome_cliente
CGC
Endereço
Pedido
Cód_cliente (PK) / (FK)
Nro_pedido (PK)
Data_pedido

CREATE TABLE cliente

(

cod_cliente

int

Primary Key,

nome_cliente

varchar(30),

CGC

varchar(14),

Endereco

varchar(50))

CREATE TABLE pedido

 

(

cod_cliente

int,

nro_pedido int, data_pedido smalldatetime, CONSTRAINT pk_pedido PRIMARY KEY (cod_cliente, nro_pedido), CONSTRAINT fk_cliente_pedido FOREIGN KEY (cod_cliente)

REFERENCES cliente (cod_cliente))

Alteração de Tabelas

ALTER TABLE nome_tabela

{{CHECK | NOCHECK } CONSTRAINT {nome_constraint | ALL }

|

[ ADD {nome_col propriedades_col [constraints_col ] | [[, ] constraint_tabela ]} [, {proxima_col | proxima_constraint_tabela }]

|

[DROP CONSTRAINT] nome_constraint [, nome_constraint2 ]

]

]

Pode-se habilitar e desabilitar as constraints de Foreign Key e de Check com a opção CHECK (habilita) e NOCHECK (desabilita).

A coluna a ser acrescentada à tabela (ADD), deve ser definida como NULL.

Pode-se adicionar uma nova constraint à tabela ou deletar uma já existente.

Exemplos

ALTER TABLE depto ADD nome_chefia

varchar(20)

NULL

ALTER TABLE empregado NOCHECK CONSTRAINT fk_depto_emp

ALTER TABLE empregado ADD CONSTRAINT fk_depto_emp FOREIGN KEY (cod_depto) REFERENCES depto (cod_depto)

ALTER TABLE empregado DROP CONSTRAINT fk_depto_emp

Exclusão de Tabelas

DROP TABLE nome_tabela

Não se pode excluir uma tabela se esta tiver alguma outra tabela “filha” ligada à ela.

Quando se elimina uma tabela, todos os registros contidos nela são apagados e a tabela em si com toda sua estrutura é eliminada da Base de Dados.

Exemplo:

DROP TABLE empregado

Extraindo Informações das Tabelas

Para que se consiga consultar os dados armazenados em tabelas, utilizamos o comando SELECT.

SELECT [ALL | DISTINCT ] select_list FROM nome_tabela [, nome_tabela2] [ [WHERE cláusula ] [GROUP BY cláusula ] [HAVING cláusula ] [ORDER BY cláusula ] [COMPUTE cláusula ]

,

nome_tabela16]

SELECT - especifica as colunas

- especifica as tabelas

- especifica as linhas

Quando se utiliza * na lista de select, seleciona-se todas as colunas da tabela.

Não se utilizando a cláusula WHERE, todas as linhas serão selecionadas.

FROM

WHERE

Exemplos

SELECT * FROM empregado

SELECT nome, idade, salario FROM empregado

SELECT cod_depto, cod_empregado, salario FROM empregado WHERE salario > 1200

Utilizando Literais

SELECT nome, 'Código do Departamento: ', cod_depto FROM depto

Definindo Cabeçalho de Colunas

Por default, o cabeçalho mostrado no resultado de uma query é o nome da coluna definido na criação da tabela. Porém, é possível mudar este cabeçalho, inserindo-o na lista do Select.

SELECT NOME_EMPREGADO = nome, DATA_DE_ADMISSAO = dt_admissao FROM empregado

Operadores Aritméticos

Os operadores aritméticos podem ser utilizados em qualquer coluna numérica (numeric, decimal, int, smallint, tinynt, float, real, money ou smallmoney).

Símbolo

Operação

 

+ Adição

 

- Subtração

 

/ Divisão

 

* Multiplicação

 

% Módulo

O operador de módulo (%) não pode ser executado nos tipos de dados money, smallmoney, float ou real.

SELECT nome, salario, (salario * 1.15) FROM empregado

Funções de Manipulação de Dados Numéricos:

Função

Parametro

Resultado

ABS

(numeric_expr)

Valor Absoluto

CEILING

(numeric_expr)

Maior inteiro mais próximo ou igual ao valor especificado

EXP

(float_expr)

Valor exponencial do valor especificado

FLOOR

(numeric_expr)

Menor inteiro mais próximo ou igual ao valor especificado

LOG

(float_expr)

Logaritmo do numérico especificado

LOG10

(float_expr)

Logaritmo de base 10

PI

()

Valor constante de 3.141592653589793

ROUND

(numeric_expr, lenght)

Arredondamento no tamanho especificado

SQRT

(float_expr)

Raiz Quadrada

SIGN

(numeric_expr)

Positivo, Negativo ou Zero

Funções de Manipulação de Dados Character:

Função

Parâmetro

Resultado

+

(expressão, expressão)

Concatena 2 ou mais character, strings ou colunas

LOWER

(char_expr)

Converte para minúscula

LTRIM

(char_expr)

Supressão dos espaços em branco a esquerda

PATINDEX

('%string%',expressão)

Retorna a primeira posição da primeira ocorrência da string na expressão definida, ou zero se a string não for encontrada

REPLICATE

(char_expr, integer_expr)

Repete um expressão char quantas vezes especificado

REVERSE

(char_expr)

Retorna o inverso do char_expr.

RIGHT

(char_expr, integer_expr)

Parte da string começando integer_expr characteres da direita

RTRIM

(char_expr)

Supressão de espaços em brancos a direita

SOUNDEX

(char_expr)

Retorna um codigo de semelhanças fonética

SPACE

(integer_expr)

Retorna uma string de repetidos espaços

SUBSTRING

(expression, start, length)

Retorna parte de uma string de caracteres.

UPPER

(char_expr)

Converte para maiúscula

Tiago obser: Podem ser usadas combinações por exemplo: lower(campo1+campo2)

Funções de Manipulação de Datas:

Função

Parâmetros

Resultados

DATEADD

(datepart, number, date)

Soma o numero de dateparts à data

DATEDIFF

(datepart, date1, date2)

mero de dateparts entre 2 datas

DATENAME

(datepart, date)

Especifica datepart para a data, retornando como um valor ASCII (Ex: Setembro)

GETDATE

()

Data e hora corrente no formato interno

DatePart

Abreviação

Valor

Year

yy

1753 - 9999

Quarter

qq

1

- 4

Month

mm

1

- 12

day of year

dy

1

- 366

Day

dd

1

- 31

Week

wk

0

- 51

weekday

dw

1

- 7 (1 é Domingo)

hour

hh

0

- 23

minute

mi

0

- 59

second

ss

0

- 59

millisecond

ms

0

- 999

SELECT nome, dt_admissao, DATEDIFF (month, dt_admissao, GETDATE()) FROM empregado

SELECT nome, dt_admissao FROM empregado WHERE DATENAME (dw, dt_admissao) = "MONDAY"

Funções do Sistema

Função

Parâmetros

Resultados

COL_NAME

('table_name', column_id)

Retorna o nome da coluna

COL_LENGTH

('table_name','column_name)

Retorna tamanho da coluna

DATALENGTH

('expressão')

Retorna o tamanho atual de uma expressão de qualquer tipo de dado

DB_ID

('databasename')

Retorna ID do banco

DB_NAME

(database_id)

Retorna nome do banco

HOST_NAME

()

Retorna nome do computador

USER_ID

('username')

Retorna ID do usuário

USER_NAME

(user_id)

Retorna nome do usuário

SELECT tamanho = DATALENGTH (nome), nome FROM empregado

CONVERSÃO DE DADOS

A função CONVERT permite converter expressões de um tipo de dado para outro tipo de dado. Permite também formatar datas em diferentes estilos.

CONVERT (tipo_de_dado [(tamanho)], expressão [, estilo])

Estilo (yy)

Estilo (yyyy)

Padrão

Formato da Data

-

0

ou 100

Default

mês dd yyyy hh:mi AM (ou PM)

1

 

101

USA

mm/dd/yy

2

 

102

ANSI

yy.mm.dd

3

 

103

Ingles/Francês

dd/mm/yy

4

 

104

Alemão

dd.mm.yy

5

 

105

Italiano

dd-mm-yy

6

 

106

-

dd mês yy

7

 

107

-

mês dd. yy

8

 

108

-

hh:mi:ss

-

9

ou 109

Default + milisegs

mês dd.yyyy hh:mi:ss:ms AM (ou PM)

10

 

110

USA

mm-dd-yy

11

 

111

Japonês

yy/mm/dd

12

 

112

ISO

yymmdd

-

13 ou 113

Default Europeu + milisegs

dd mês yyyy hh:mi:ss:ms(24h)

14

 

114

-

hh:mi:ss:ms(24h)

SELECT CONVERT (char(30), GETDATE (), 102)

Resultado:

1999.03.07

Condições de Pesquisa

Operadores de Comparação

(=,>,<,>=,<=,<>,!=,!<,!>)

Intervalos

(BETWEEN

e NOT BETWEEN)

Listas

(IN e NOT IN)

String de comparação

(LIKE e NOT LIKE)

Valores desconhecidos

(IS NULL

e IS NOT NULL)

Combinações

(AND, OR)

Negação

(NOT)

Operadores Negativos

Operador

Significado

<>

diferente

not nome_coluna =

diferente da coluna

not nome_coluna >

não maior que

not between

não entre dois valores informados

not in

não existente numa dada lista de valores

not like

diferente do padrão de caracteres informado

is not null

não é um valor nulo

Obs: Evitar a utilização de condições de Negação, tal como NOT IN e NOT BETWEEN, pois essas condições não são reconhecidas pelo otimizador de query.

SELECT nome, dt_admissao

FROM empregado

WHERE dt_admissao BETWEEN '1/1/95' AND '12/31/95'

SELECT nome, cod_depto FROM empregado WHERE cod_depto IN (1, 3, 4 )

SELECT * FROM empregado WHERE nome LIKE '%Jose%'

SELECT nome FROM empregado WHERE salario IS NULL

SELECT * FROM empregado WHERE (nome LIKE 'S%' OR cod_depto = 1) AND (salario > 500.00)

Eliminando Duplicidades:

SELECT DISTINCT nome FROM empregado

Classificando o Resultado:

Pode-se definir na cláusula ORDER BY o número relativo da coluna ao invés do nome da coluna.

Por default, a forma ascendente (ASC) é assumida.

Pode-se classificar por até 16 colunas.

SELECT nome, cod_depto, salario

FROM empregado

ORDER BY cod_depto, salario DESC

Funções de Agregação:

Retorna valores resumidos

O resultado aparece como novas colunas

Utilizado na Lista de Select ou na Cláusula HAVING

AVG

Retorna a média aritmética de uma coluna

COUNT

Retorna o total de elementos do grupo

SUM

Retorna o somatório de uma coluna

MIN

Retorna o menor valor de uma coluna

MAX

Retorna o maior valor de uma coluna

SELECT COUNT(*) FROM empregado

SELECT SUM (salario) FROM empregado

SELECT AVG (idade) FROM empregado

SELECT MAX (salario) FROM empregado

Cláusula GROUP BY:

Organiza os dados em grupos

Geralmente utilizada com funções de agregação

Resulta um único valor para cada grupo

Cada coluna na lista de Select deve estar na cláusula GROUP BY

Cláusula HAVING:

Cláusula de restrição de grupo

Permite funções de agregação

Similar a cláusula WHERE

As colunas na cláusula HAVING devem Ter somente um único valor

Uma query com HAVING deve Ter um GROUP BY

SELECT cod_depto, media_de_salario = AVG ( salario ) FROM empregado GROUP BY cod_depto

SELECT cod_depto, salario_do_depto = SUM ( salario ) FROM empregado GROUP BY cod_depto HAVING SUM ( salario ) > 5000.00

COMPUTE e COMPUTE BY

Para uso com funções de Agregação

O COMPUTE gera um Total Geral, enquanto que o COMPUTE BY gera Totais dos Grupos

Este resultado gerado, produz uma nova linha no resultado da query.

É possível obter os Totais por Grupo e o Total Geral, numa mesma query

Não é do padrão ANSI

SELECT cod_depto, nome, salario FROM empregado WHERE salario > 500 COMPUTE SUM (salario)

SELECT cod_depto, nome, salario FROM empregado ORDER BY cod_depto

17

COMPUTE SUM (salario) BY cod_depto COMPUTE SUM (salario)

Restrições:

Não é permitido utilizar DISTINCT com Agrupamentos

Deve-se utilizar ORDER BY, se o COMPUTE BY for utilizado

As colunas listadas no COMPUTE BY devem ser idênticos ou um sub-conjunto das colunas listadas no ORDER BY.

JOINS:

Operação que permite o tratamento de duas ou mais tabelas

Implementado pela utilização da sentença SELECT, onde na lista de select colocamos as colunas de uma ou mais tabelas que desejamos listar, na cláusula FROM definimos todas as tabelas envolvidas no Join, e na cláusula WHERE especificamos quais linha serão incluidas no resultado. Na cláusula WHERE, um operador de join é utilizado entre os componentes que estão fazendo a junção.

Pode-se definir até 16 tabelas na cláusula FROM.

Normalmente, uma chave primária é comparada a uma chave estrangeira em qualquer join

O operador utilizado para o join é o sinal de igual (=), que resulta somente nas linhas onde o valor da coluna de uma tabela é igual ao valor da coluna de outra tabela.

Caso não se defina nenhuma condição de Join (com a cláusula WHERE), é gerado um produto Cartesiano entre as tabelas. (Join Irrestrito)

Exemplo de Join Irrestrito (Produto Cartesiano entre as Tabelas):

SELECT nome_empreg, nom_depend FROM empregado, dependente

No exemplo acima, supondo que a Tabela Empregado tenha 10 linhas, e a Tabela Dependente 20 linhas, então o resultado do Join Irrestrito será 10 * 20 = 200 linhas.

EQUI JOIN

Especifica uma condição de igualdade entre as tabelas para satisfazer o Join.

SELECT d.nome, e.nome FROM depto d, empregado e WHERE d.cod_depto = e.cod_depto

SELECT d.nome, e.nome, dp.nome, dp.idade FROM depto d, empregado e, dependente dp WHERE d.cod_depto = e.cod_depto

AND

e.cod_empreg = dp.cod_empreg

SELF JOIN

Realiza o join das linhas de uma tabela com outras linhas da mesma tabela

Por tratar a mesma tabela, deve-se definir aliases distintos para essas tabelas

SELECT au1.au_fname, au1.au_lname, au2.au_fname, au2.au_lname FROM authors au1, authors au2 WHERE au1.city = 'Oakland' AND au1.state = 'CA'

AND

au1.zip = au2.zip

AND

au1.au_id < au2.au_id

OUTER JOIN

Mostra todas as linhas do join, inclusive aquelas que não encontram linhas correspondentes na tabela relacionada.

Só se pode fazer um outer join entre duas tabelas.

Operadores do Outer Join:

*=

Inclui todas as linhas da primeira tabela especificada nas restrições da sentença

=*

Inclui todas as linhas da Segunda tabela especificada nas restrições da sentença

SELECT titles.title_id, title, qty FROM titles, sales

19

WHERE titles.title_id *= sales.title_id

SUBQUERIES:

São sentenças SELECT aninhadas

Muitas sentenças SQL que incluem subqueries podem ser formuladas de modo alternativo através de Joins. Outras queries são resolvidas somente com subqueries.

A sentença SELECT de uma subquery é sempre colocado dentro de parênteses.

Uma subquery pode estar inserida na lista de SELECT, numa cláusula WHERE ou HAVING da query externa.

Em aninhamentos normais de subqueries, as mais internas são executadas primeiro.

SELECT cod_depto, nome FROM depto WHERE cod_depto IN ( SELECT DISTINCT cod_depto FROM empregado)

SELECT Título = title_id, Quantidade = qty, Total = ( SELECT SUM(qty) FROM sales ), Porcentagem_do_Total = ( CONVERT (float, qty) / ( SELECT SUM(qty) FROM sales )) * 100 FROM sales

SUBQUERIES CORRELATAS:

São aquelas subqueries que referenciam na cláusula WHERE, uma tabela da cláusula FROM da query externa. Neste caso, a subquery é executada para cada linha da tabela referenciada na query externa.

SELECT title_id, au_id, royaltyper FROM titleauthor ta WHERE royaltyper = (SELECT MAX(royaltyper) FROM titleauthor tb WHERE tb.title_id = ta.title_id)

SELECT INTO

Cria uma nova tabela baseada no resultado de um SELECT

Se a nova tabela for uma tabela permanente, a opção select into/bulkcopy deve ser assinalada na configuração do banco. Se a nova tabela for uma tabela temporária, o nome desta deve ser precedido de um # ou ##

As colunas na lista de select devem Ter apelidos (alias)

Denota-se a nova tabela como sendo temporária, colocando um sinal de escopo (#) como primeiro caracter do nome da tabela.

SELECT pnome = SUBSTRING (nome, 1, 10) , Sal_anual = salario * 12 INTO #novatabela FROM empregado

Operador UNION

Permite unir os resultados de duas ou mais queries num único resultado.

O UNION resulta num incremento de linhas. (Um JOIN resulta num incremento de colunas).

Na união, as estruturas das colunas tem de ser as mesmas, e os tipos de dados compatíveis.

Por default, as linhas duplicadas são removidas do resultado final. Se desejar que elas permaneçam, utilizar a opção ALL.

As listas de colunas dos Selects devem Ter o mesmo número de colunas, tipos de dados similares, e aparecerem na mesma ordem.

Os nomes das colunas são obtidos da primeira sentença SELECT.

SELECT lista_de_select FROM UNION [ ALL ] SELECT lista_de_select FROM

Inserindo LINHAS:

O comando INSERT é utilizado para adicionar linhas a uma tabela

Utilize uma sentença INSERT para cada linha a ser adicionada

A ordem e o tipo de dado dos item a serem inseridos devem corresponder a ordem e tipo de dado das colunas da tabela

Os itens de dados na cláusula VALUES deve corresponder a Lista dos nomes de coluna

INSERT [ INTO ]

{ nome_tabela | nome_view } [ (lista_de_colunas) ]

{ VALUES ( lista_de_valores ) | sentença_select }

INSERT INTO depto VALUES (1, 'CONTABILIDADE')

INSERT INTO empregado (nro_empregado, nome, cod_depto) VALUES (7000, 'Jose Luiz de Oliveira', 1)

Inserindo linhas com SELECT

Insere linhas resultantes de uma Query em uma tabela que já existe.

INSERT INTO nome_tabela SELECT lista_de_colunas FROM lista_de_tabelas

[ WHERE condições_de_pesquisa ]

INSERT INTO empreg_salarioanual SELECT nome_empreg , (salario * 12 ) FROM empregado WHERE idade > 21

Alterando dados da Linha:

O comando UPDATE altera os dados de linhas de uma tabela

A cláusula SET especifica a coluna e o valor a ser alterado

A cláusula WHERE identifica exatamente as linhas a serem alteradas

Se o UPDATE viola alguma constraint de integridade, a alteração não será executada

UPDATE { nome_tabela | nome_view } SET nome_coluna = expressão [ , nome_coluna = expressão ,

[ cláusula WHERE ]

]

UPDATE empregado SET salario = salario * 1.05

UPDATE empregado SET cod_depto = 5 WHERE cod_depto = 2

Alteração com base em dados de outras tabelas:

UPDATE titles SET ytd_sales = ( SELECT SUM (qty) FROM sales WHERE sales.title_id = titles.title_id AND ord_date BETWEEN '01/01/95' AND '12/31/95' )

Deletando Linhas:

O comando DELETE remove uma ou mais linhas de uma tabela

A cláusula WHERE especifia os critérios pelos quais as linhas serão removidas

Se A cláusula WHERE não é especificada, todas as linhas da tabela serão removidas.

DELETE [ FROM ] nome_tabela [ WHERE condições_de_pesquisa ]

DELETE empregado WHERE DATEDIFF (YEAR, dt_admissao, GETDATE()) >= 5

Os dois exemplos a seguir realizam a mesma coisa. Deletam todas as linhas da tabela titleauthor que tenha no título do livro a string "computers".

/* subquery padrão ANSI */

DELETE FROM titleauthor WHERE au_id IN ( SELECT a.au_id

FROM authors a, titles t, titleauthor ta WHERE a.au_id = ta.au_id AND ta.title_id = t.title_id AND t.title LIKE '%computers%' )

/* extensão Transact-SQL */

DELETE FROM titleauthor FROM authors a, titles t WHERE a.au_id = titleauthor.au_id AND t.title_id = titleauthor.title_id AND t.title LIKE '%computers%'

ÍNDICES:

O principal objetivo da utilização de índices, é para aumentar a performane nas pesquisas

Melhora a performance na resolução de ORDER BY e GROUP BY

O próprio banco cria um índice para cada chave primária definida na tabela

As modificações (UPDATE) tendem a se tornar mais demorados quando da utilização de índices

Evitar definir índices para colunas de tipo text, image ou bit

Evitar definir índices quando a performance do UPDATE é mais importante que a performance do SELECT

A cláusula UNIQUE especifica que a coluna ou conjunto de colunas que compõem o índice não podem Ter valores duplicado na tabela.

CREATE UNIQUE INDEX i1_empregado ON empregado (nome)

Tipos de Índices:

Clusterizado

Não Clusterizado

Indices Clusterizados:

As linhas são classificadas e se mantém ordenadas

Pode haver somente um índice clusterizado por tabela

O índice clusterizado deve sempre ser o primeiro índice a ser criado.

Grande vantagem quando se deseja consultar enormes intervalos.

Não definindo que o índice é clusterizado, será criado um índice não clusterizado.

Índices Não Clusterizados:

Classificação fisica das linhas não é a mesma da classificação nos índices.

Pode-se Ter até 249 indíces não clusterizados por tabela. Cada um pode prover acesso aos dados em diferentes ordens.

CREATE CLUSTERED INDEX idc_empregado ON empregado (nome)

INTEGRIDADE DE DADOS

A Integridade de Dados fala da consistência de dados armazenadas em um banco de dados, facilitando para as aplicações que dela se utilizam.

Propriedade IDENTITY

Os valores para as colunas definidas como IDENTITY são gerados pelo sistema de forma sequencial.

Permitido somente uma única coluna IDENTITY por tabela

Não pode ser alterada por um comando UPDATE

Definidos somente para tipos de dados: tinyint, smallint, int, numeric, decimal

IDENTITY [(valor_inicial, incremento)]

CREATE TABLE aluno

( aluno_id

nome

INT IDENTITY (100, 5),

VARCHAR(20) )

INSERT aluno VALUES ('Mirtes') // Será criado com aluno_id = 100

INSERT aluno VALUES ('Wagner')

// Será criado com aluno_id = 105

DEFAULTS

Criado antes ou após a criação da tabela

Nomes devem ser únicos dentro do Banco

São checados no INSERT

O tipo de dados deve ser o mesmo definido para a coluna da tabela associada

Deve ser compatível com as regras (rules) definidas para a coluna

CREATE DEFAULT def_uf

AS

'SP'

REGRAS (RULES)

Criado antes ou após a criação da tabela

Nomes devem ser únicos dentro do Banco

São checados no INSERT e UPDATE

O nome do parâmetro deve ser prefixado com @

CREATE RULE rl_desconto AS @desc = 10 OR @desc < 5

Tanto os DEFAULTS quanto as RULES devem ser associadas (ligadas) a uma coluna da tabela.

EXEC sp_bindefault def_uf, ‘empregado.uf’

EXEC sp_bindrule rl_desconto, ‘duplicata.desc’

EXEC sp_unbindefault ‘empregado.uf’

EXEC sp_unbindrule ‘duplicata.desc’

27

DROP DEFAULT def_uf

DROP RULE rl_desconto

CONSTRAINTS

Pode ser colocado em uma coluna ou uma tabela

Pode ser adicionada a uma tabela que já contenha dados

Caso não se coloque um nome para a constraint, o sistema cria um com o seu padrão

Tipos de Constraints:

PRIMARY KEY

UNIQUE

DEFAULT

CHECK

FOREIGN KEY

ALTER TABLE empregado ADD CONSTRAINT fk_cod_depto FOREIGN KEY (cod_depto) REFERENCES depto (cod_depto)

ALTER TABLE empregado ADD CONSTRAINT uq_nome UNIQUE NONCLUSTERED (nome)

ALTER TABLE empregado ADD CONSTRAINT df_uf

DEFAULT 'SP' FOR

uf

ALTER TABLE empregado ADD CONSTRAINT ck_cep CHECK (cep LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')

VIEWS (VISÕES)

Forma alternativa de visualizar os dados de uma ou mais tabelas do banco de dados

Uma query armazenada permanentemente no banco de dados

Como uma tabela, porém fisicamente a view não existe

Ideal para se criar visões específicas de determinadas colunas de tabelas para grupos de usuários

Auxilia na construção de queries complexas.

Views não podem ser alteradas. Deve-se deletar e recriá-la novamente.

CREATE VIEW vw_empregado AS SELECT d.nome nome_depto, e.nome nome_empreg, salario FROM depto d, empregado e WHERE d.cod_depto = e.cod_depto AND idade > 18

DROP VIEW vw_empregado

STORED PROCEDURES

Stored procedures são sentenças SQL pré-compiladas que ficam armazenadas no servidor.

As sentenças são checadas quanto a sintaxe e compiladas na primeira vez que é executado

A versão compilada é armazenada numa cache de procedure e recuperada a partir desta nas chamadas subsequentes, tornando a execução mais rápida e mais eficiente.

Grande vantagem quando se tem tarefas repetitivas a serem executadas.

Passos para criação de uma procedure simples:

1)

Escreva a transação SQL

2)

Teste a transação SQL

3)

Se o resultado é o esperado, crie a procedure

4)

Execute a procedure

CREATE PROC cont_empregados AS

SELECT count(*)

EXEC cont_empregados

FROM empregado

CURSORES

Sentença

Descrição

DECLARE

Cria e define um cursor

OPEN

Abre um cursor declarado

FETCH

Retira uma linha do cursor

CLOSE

Fecha o cursor

DEALLOCATE

Remove o cursor

DECLARE cur_empregado CURSOR FOR SELECT nro_empregado, salario FROM empregado

DECLARE @nro

DECLARE @salario numeric(10,2)

int

OPEN cur_empregado FETCH cur_empregado INTO @nro, @salario WHILE (@@fetch_status = 0) BEGIN IF (@salario > 1000) INSERT INTO novatab VALUES (@nro, @salario)

FETCH cur_empregado INTO @nro, @salario

END

CLOSE cur_empregado DEALLOCATE cur_empregado

TRIGGERS

Tipo especial de Stored Procedure que é executado quando se modifica, inclui ou exclui dados de uma determinada tabela

Seu lançamento é automático

Triggers podem disparar mudanças em cascata nas tabelas relacionadas no Banco.

O exemplo seguinte mostra uma trigger de insert, que altera a coluna ytd_sales na tabela titles toda vez que uma nova linha na tabela sales é inserida.

CREATE TRIGGER intrig ON sales FOR INSERT AS /* checa o valor de @@rowcount */ IF @@rowcount = 1 UPDATE titles SET ytd_sales = ytd_sales + qty FROM inserted WHERE titles.title_id = inserted.title_id

ELSE /* quando rowcount é maior que 1, **use a clausula GROUP BY */ UPDATE titles SET ytd_sales = ytd_sales + (SELECT SUM(qty) FROM inserted GROUP BY inserted.title_id HAVING titles.title_id = inserted.title_id)

32