Está en la página 1de 159

SQL

Uma Linguagem para Bancos de Dados Relacionais

Copyright 2000 - Nilton Freire Santos

... ...

UPDATE DELETE INNER JOIN

... ...

.. ....SELECT INSERT ... CREATE TABLE

SQL Uma

A Linguagem SQL
SQL - Structured Query Language. Foi definida por D. D. Chamberlin e outros, nos laboratrios de pesquisa da IBM em San Jose, California, em 1974. Teve seus fundamentos no modelo relacional de E. F. Codd, criado em 1970. 1970 Sua primeira verso recebeu o nome de SEQUEL - Structured English Query Language . rgos como ANSI e ISO adotaram a SQL como o padro oficial de linguagem em ambiente relacional. relacional O ANSI publicou as padronizaes SQL ANSI-89 e ANSI-92. ANSI-92 Existem vrios dialetos SQL que adotam o padro ANSI com extenses proprietrias de cada fabricante. Atravs de uma interface denominada ODBC, Open Database ODBC Connectivity possvel se converter a sintaxe SQL de um produto em outro.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Aspectos Gerais da Linguagem


uma linguagem no-procedural que requer do usurio qual dado necessrio sem especificar como obt-lo. Poupa tempo de programao mas exige tempo para projeto. projeto Linguagem interativa de consulta: consultas ao banco de dados consulta sem necessidade de programas. Linguagem de programao: comandos SQL embutidos em programao programas de aplicao. Linguagem de administrao: tarefas de administrao do banco administrao de dados podem ser feitas usando SQL. Linguagem cliente-servidor: clientes se comunicando com o cliente-servidor servidor de banco de dados atravs de comandos SQL. Linguagem para bancos de dados distribudos: auxilia na distribudos converso entre diversos produtos de bancos de dados colocados em diferentes mquinas e plataformas.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Aspectos Gerais da Linguagem


Definio de Dados: atravs da DDL possibilita a definio da Dados estrutura e organizao dos dados, das relaes que existem entre eles e a definio de ndices, resultando na criao das tabelas do banco de dados. Manipulao de Dados: atravs da DML possibilita a manipulao Dados dos dados armazenados, compreendendo incluso, consulta, alterao e eliminao.. Controle de Acesso: protege os dados de manipulaes no Acesso autorizadas, atravs de comandos de autorizao de acesso. Compartilhamento de Dados: coordena o compartilhamento dos Dados dados entre os usurios. Integridade dos Dados: define as regras de integridade dos dados Dados contra corrupes, inconsistncias e falhas do sistema. Controle de Transaes: inclui comandos que controlam a Transaes especificao do incio e do fim das transaes.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Aspectos Gerais da Linguagem


Independncia de fabricante: est incorporada em quase todos os fabricante SGBDs em seu padro ANSI, com as extenses proprietrias de cada fabricante. Portabilidade entre computadores: pode ser usada desde um PC computadores at um mainframe. Reduo de custos com treinamento: as aplicaes podem migrar treinamento de ambiente com custo reduzido em treinamento. Facilidade no entendimento: oferece um rpido entendimento, com entendimento comandos escritos em um ingls estruturado de alto nvel. Mltiplas vises de dados: possibilita levar diferentes vises dos dados dados a diferentes usurios.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Criando um Banco de Dados


Um banco de dados composto por 3 tipos diferentes de arquivos.

Primary: o arquivo padro do banco de dados.Este arquivo


armazena os dados e contm informaes necessrias para fazer o carregamento e a inicializao do banco de dados. Este arquivo criado com a extenso mdf.

Secondary: um arquivo auxiliar ao banco de dados, que somente


existir se o arquivo primrio no for suficiente para manter todos os arquivos de dados. Dependendo do banco de dados, podem ser necessrios vrios arquivos secundrios. Este arquivo criado com a extenso .ndf.

Log: o arquivo utilizado para guardar as informaes referentes ao


registro de transaes/eventos usadas fazer a recuperao do banco de dados. O tamanho mnimo desse arquivo 512 Kb. Dependendo do banco de dados, pode ser criado mais de um arquivo log. Este arquivo criado com a extenso ldf.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Criando um Banco de Dados


Sintaxe: CREATE DATABASE <database_name> [ ON [ PRIMARY ] [ <filespec> [,...n] ] [ , <filegroup> [,...n] ] ] [ LOG ON <filespec> ] [ FOR LOAD | FOR ATTACH ] <filespec> ::= ( [ NAME = logical_file_name, ] FILENAME = 'os_file_name' [ , SIZE = size] [ , MAXSIZE = { max_size | UNLIMITED } ] [ , FILEGROWTH = growth_increment] ) [,...n] <filegroup> ::= FILEGROUP filegroup_name <filespec> [,...n]

Copyright 2000 - Nilton Freire Santos

SQL Uma

Criando um Banco de Dados


Argumentos: database_name: o nome do banco de dados a ser criado. Deve ser exclusivo em um servidor, pode possuir at 128 caracteres. ON: especifica que os arquivos usados para armazenar os dados sero definidos explicitamente. PRIMARY: especifica o arquivo primrio do banco de dados. Se PRIMARY no for especificado, o primeiro arquivo do CREATE DATABASE torna-se o arquivo primrio. n: indica que podem ser especificados mltiplos arquivos para o novo banco de dados. LOG ON: especifica que os arquivos usados para armazenar o log do banco de dados sero definidos explicitamente. Se LOG ON no for especificado, criado um nico arquivo de log com um tamanho correspondente a 25% da soma dos tamanhos de todos os arquivos de dados do banco de dados.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Criando um Banco de Dados


Argumentos: FOR LOAD: esta clusula existe para manter compatibilidade com verses anteriores do Microsoft SQL Server TM. FOR ATACH: especifica que voc est anexando um banco de dados j existente. NAME: especifica o nome lgico para o arquivo definido pelo <filespec>. NAME no requerido quando FOR ATACH for especificado. logical_file_name: especifica o nome usado para fazer referncia ao arquivo em instrues SQL executada aps o banco de dados ter sido criado. FILENAME: especifica o nome para o arquivo definido por <filespec>. os_file_name: especifica o caminho usado pelo sistema operacional ao criar o arquivo definido por <filespec>. SIZE: especifica o tamanho do arquivo definido em <filespec>.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Criando um Banco de Dados


Argumentos: size: o tamanho inicial do arquivo. O tamanho mnimo 512 Kb e o tamanho padro caso size no seja especificado 1 Mb. O tamanho especificado para o arquivo primrio tem de ser pelo menos equivalente ao do arquivo primrio do banco de dados MODEL. MAXSIZE: especifica o tamanho mximo para o arquivo definido em <filespec>. maxsize: o tamanho mximo do arquivo definido. Se maxsize no for especificado, o tamanho mximo do arquivo ser limitado pela capacidade do disco rgido. UNLIMITED: especifica que o arquivo definido aumentar de tamanho at o disco ficar cheio. FILEGROWTH: especifica o incremento de crescimento do arquivo definido em <filespec>, que no pode exceder o valor definido para MAXSIZE.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Criando um Banco de Dados


Argumentos: growth_increment: a quantidade de espao adicionado ao arquivo sempre que houver necessidade de espao. O valor 0 indica nenhum crescimento e este valor pode ser especificado em Kb, Mb (default) ou %. Se FILEGROWTH no for especificado, o incremento default 10% e o valor mnimo 64Kb. Sempre que o valor de um incremento for especificado, ele ser arredondado para o mltiplo de 64 Kb mais prximo. Cada banco de dados possui um proprietrio (owner) que o usurio que cria o banco de dados e tem permisso para executar atividades especiais no banco de dados. Cada novo banco de dados herda as configuraes do banco de dados MODEL, exceto se a clusula FOR ATACH seja especificada, quando o banco de dados criado herdar as caractersticas do banco de dados original.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Criando um Banco de Dados


Exemplo 1: Criar o banco de dados CLIENTES especificando apenas o arquivo de dados. CREATE DATABASE Clientes ON ( NAME = Clientes_dat, FILENAME = 'c:\mssql7\data\clientes.mdf', SIZE = 40, MAXSIZE = 100, FILEGROWTH = 5 )

script1

O arquivo de log automaticamente criado com o tamanho de 10 Mb (25% da soma de todos os arquivos de dados) e como MAXSIZE deste arquivo no foi especificado, ele crescer at o limite de espao do disco rgido.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Criando um Banco de Dados


Exemplo 2: Criar o banco de dados VENDAS especificando os arquivos de dados e de log. CREATE DATABASE Vendas ON ( NAME = Vendas_dat, FILENAME = 'c:\mssql7\data\vendas.mdf', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5 ) LOG ON ( NAME = 'Vendas_log', FILENAME = 'c:\mssql7\data\vendaslog.ldf', SIZE = 5MB, MAXSIZE = 25MB, FILEGROWTH = 5MB )

script2

Copyright 2000 - Nilton Freire Santos

SQL Uma

Criando um Banco de Dados


Exemplo 3: Criar o banco de dados PRODUTOS especificando os mltiplos arquivos de dados e de log. CREATE DATABASE Produtos ON PRIMARY ( NAME = Produtos1, FILENAME = 'c:\mssql7\data\produtos1.mdf', SIZE = 100, MAXSIZE = 200, FILEGROWTH = 20), ( NAME = Produtos2, FILENAME = 'c:\mssql7\data\produtos2.ndf', SIZE = 100, MAXSIZE = 200, FILEGROWTH = 20),

Copyright 2000 - Nilton Freire Santos

SQL Uma

Criando um Banco de Dados


( NAME = Produtos3, FILENAME = 'c:\mssql7\data\produtos3.ndf', SIZE = 100, MAXSIZE = 200, FILEGROWTH = 20) LOG ON ( NAME = Produtoslog1, FILENAME = 'c:\mssql7\data\produtoslog1.ldf', SIZE = 100, MAXSIZE = 200, FILEGROWTH = 20), ( NAME = Produtoslog2, FILENAME = 'c:\mssql7\data\produtoslog2.ldf', SIZE = 100, MAXSIZE = 200, FILEGROWTH = 20) script3

Copyright 2000 - Nilton Freire Santos

SQL Uma

Criando um Banco de Dados


Exemplo 4: Criar o banco de dados PROD atachando o banco de dados PRODUTOS criado no Exemplo 3. sp_detach_db Produtos CREATE DATABASE Prod ON PRIMARY (FILENAME='c:\mssql7\data\produtos1.mdf') FOR ATTACH

script4

Exemplo 5: Criar o banco de dados COMPRAS especificando o arquivo de dados sem o tamanho. CREATE DATABASE Compras ON ( NAME = Compras_dat, FILENAME = 'c:\mssql7\data\compras.mdf' )

script5

Copyright 2000 - Nilton Freire Santos

SQL Uma

Modificando um Banco de Dados


Sintaxe: ALTER DATABASE database_name ADD FILE <filespec> [,...n] [TO FILEGROUP filegroup_name] | ADD LOG FILE <filespec> [,...n] | REMOVE FILE logical_file_name | ADD FILEGROUP filegroup_name | REMOVE FILEGROUP filegroup_name | MODIFY FILE <filespec> | MODIFY FILEGROUP filegroup_name filegroup_property <filespec> ::= (NAME = logical_file_name [, FILENAME = 'os_file_name' ] [, SIZE = size] [, MAXSIZE = { max_size | UNLIMITED } ] [, FILEGROWTH = growth_increment] )

Copyright 2000 - Nilton Freire Santos

SQL Uma

Modificando um Banco de Dados


Argumentos: database_name: o nome do banco de dados a ser modificado. ADD FILE: especifica um arquivo ou grupo de arquivos que est FILE sendo adicionado ao banco de dados. TO FILEGROUP: especifica o grupo de arquivos para o qual ser FILEGROUP adicionado o arquivo especificado. filegroup_name: o nome do grupo de arquivos ao qual ser filegroup_name adicionado o arquivo especificado. ADD LOG FILE: especifica que um arquivo de log seja adicionado ao FILE banco de dados. REMOVE FILE: remove a descrio do arquivo das tabelas do banco FILE de dados e elimina o arquivo fsico. O arquivo s poder ser removido se estiver vazio. ADD FILEGROUP: especifica que um grupo de arquivos deve ser FILEGROUP adicionado.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Modificando um Banco de Dados


Argumentos: filegroup_name: o nome do grupo de arquivos que ser adicionado filegroup_name ou eliminado. REMOVE FILEGROUP: remove o grupo de arquivos do banco de FILEGROUP dados e elimina todos os arquivos do grupo de arquivos. O grupo de arquivos s poder ser removido se estiver vazio. MODIFY FILE: especifica que um dado arquivo deve ser modificado, FILE incluindo as opes FILENAME, SIZE, FILEGROWTH e MAXSIZE. MODIFY FILEGROUP filegroup_name filegroup_property: especifica a filegroup_property propriedade a ser aplicada ao grupo de arquivos. Os valores para filegroup_property so: READONLY: especifica que o grupo arquivos apenas para leitura. READONLY READWRITE: reverte a propriedade READONLY. READWRITE DEFAULT: especifica o grupo de arquivos padro para o banco de DEFAULT dados.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Modificando um Banco de Dados


Argumentos: NAME: especifica o nome lgico para o arquivo definido. NAME logical_file_name: especifica o nome usado para fazer referncia ao logical_file_name arquivo. FILENAME: especifica o nome para o arquivo definido. FILENAME os_file_name: especifica o caminho usado pelo sistema operacional os_file_name ao criar o arquivo definido. SIZE: especifica o tamanho do arquivo definido. SIZE size: o tamanho do arquivo definido. Dever ser um nmero inteiro. size O tamanho mnimo 512 Kb e o tamanho padro caso size no seja especificado 1 Mb. MAXSIZE: especifica o tamanho mximo para o arquivo definido. MAXSIZE maxsize: o tamanho mximo do arquivo definido. Deve ser um maxsize nmero inteiro. Se maxsize no for especificado, o tamanho mximo do arquivo ser limitado pela capacidade do disco rgido.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Modificando um Banco de Dados


Argumentos: UNLIMITED: especifica que o arquivo definido aumentar de tamanho UNLIMITED at o disco ficar cheio. FILEGROWTH: especifica o incremento de crescimento do arquivo FILEGROWTH definido, que no pode exceder o valor definido para MAXSIZE. growth_increment: a quantidade de espao adicionado ao arquivo growth increment sempre que houver necessidade de espao. O valor 0 indica nenhum crescimento e este valor pode ser especificado em Kb, Mb (default) ou %. Deve ser um nmero inteiro. Se FILEGROWTH no for especificado, o incremento default 10% e o valor mnimo 64Kb. Sempre que o valor de um incremento for especificado, ele ser arredondado para o mltiplo de 64 Kb mais prximo.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Modificando um Banco de Dados


Exemplo 1: Criar o banco de dados TESTE com 5 Mb de tamanho e em seguida adicionar mais 5 Mb para dados. USE SCP GO CREATE DATABASE Teste ON ( NAME = Teste_dat1, FILENAME = 'c:\mssql7\data\tdat1.mdf', SIZE = 5, MAXSIZE = 100, FILEGROWTH = 5 ) GO (continua no prximo slide)

Copyright 2000 - Nilton Freire Santos

SQL Uma

Modificando um Banco de Dados


Exemplo 1: Criar o banco de dados TESTE com 5 Mb de tamanho e em seguida adicionar mais 5 Mb para dados (continuao). ALTER DATABASE Teste ADD FILE ( NAME = Teste_dat2, FILENAME = 'c:\mssql7\data\tdat2.ndf', SIZE = 5, MAXSIZE = 100, FILEGROWTH = 5 ) GO

Copyright 2000 - Nilton Freire Santos

SQL Uma

Modificando um Banco de Dados


Exemplo 2: Criar um grupo de arquivos no banco de dados Teste e adicionar dois arquivos de dados de 5 Mb ao grupo de arquivos. ALTER DATABASE Teste ADD FILE ( NAME = Teste_dat3, FILENAME = 'c:\mssql7\data\tdat3.ndf', SIZE = 5, MAXSIZE = 100, FILEGROWTH = 5 ), ( NAME = Teste_dat4, FILENAME = 'c:\mssql7\data\tdat4.ndf', SIZE = 5, MAXSIZE = 100, FILEGROWTH = 5 )

Copyright 2000 - Nilton Freire Santos

SQL Uma

Modificando um Banco de Dados


Exemplo 3: Adicionar um arquivo de log com 5 Mb ao banco de dados TESTE. USE SCP GO ALTER DATABASE Teste ADD LOG FILE ( NAME = teste_log2, FILENAME = 'c:\mssql7\data\teste2log.ldf', SIZE = 5MB, MAXSIZE = 100MB, FILEGROWTH = 5MB)

Copyright 2000 - Nilton Freire Santos

SQL Uma

Modificando um Banco de Dados


Exemplo 4: Remover do banco de dados TESTE o arquivo de dados Teste_dat4. ALTER DATABASE Teste REMOVE FILE Teste_dat4 GO Exemplo 5: Aumentar o tamanho do arquivo Teste_dat3 no banco de dados TESTE para 20 Mb. ALTER DATABASE Teste MODIFY FILE ( NAME = Teste_dat3, SIZE = 20MB ) GO

Copyright 2000 - Nilton Freire Santos

SQL Uma

Eliminando um Banco de Dados


Sintaxe: DROP DATABASE <database_name> [,... n]

Exemplo 1: Eliminar o banco de dados TESTE. DROP DATABASE Teste GO sp_helpdb GO Exemplo 2: Eliminar os bancos de dados CLIENTES e VENDAS. DROP DATABASE Clientes, Vendas GO sp_helpdb GO

Copyright 2000 - Nilton Freire Santos

SQL Uma

Criando Tabelas
O nome de uma tabela em um banco de dados dever ser nico para cada proprietrio; Cada coluna dever ser criada atravs da especificao do seu nome, tipo e tamanho do dado que ir armazenar e, opcionalmente, valores padro e restries (constraints) impostas ao contedo; O nome de uma coluna dever ser nico dentro de cada tabela podendo, entretanto, existir colunas com o mesmo nome em tabelas diferentes. Uma tabela representa uma entidade do banco de dados onde cada linha equivale a uma ocorrncia e cada coluna equivale a um atributo dessa entidade. Um banco de dados no SQL Server pode ter: At 2 bilhes de tabelas, cada uma armazenando ate 1024 colunas; O comprimento mximo de cada coluna de 8000 bytes; O comprimento mximo de cada linha de 8092 bytes; Os tipos de dados texto e imagem permitem at 2 GB de tamanho.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Criando Tabelas
Identificadores do SQL Server: Podem ter de 1 a 128 caracteres; O primeiro caractere deve ser uma letra ou @, #, _ (sublinhado): @ - utilizado para variveis locais; # - utilizado para objetos temporrios locais; ## - utilizado para objetos temporrios globais. Depois do primeiro caractere podem ser usados caracteres alfanumricos ou os smbolos #, $ e _ (sublinhado); Podem ser usados espaos em identificadores, mas para fazer referncia a esses objetos deve-se usar aspas duplas ou colchetes. Exemplo: Uma tabela identificada como Clientes Nacionais deve ser referenciada como Clientes Nacionais ou [Clientes Nacionais]. aconselhvel se usar colchetes para no confundir com strings.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Criando Tabelas
Identificadores do SQL Server: 123Clientes @Clientes TblClientes Tbl@Clientes #TblClientes ##TblClientes Clientes Invlido. O identificador deve comear por letra. Vlido apenas para criar uma varivel. Vlido. Invlido. @ s pode ser usado como primeiro caractere de um identificador. Vlido para criar um objeto temporrio que estar disponvel apenas para o usurio que o criou. Vlido para criar um objeto temporrio que estar disponvel para todos os usurios.dos os usurios. Vlido.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Criando Tabelas
Tipos de Dados: Categoria String varchar(n) binary(n) Binrio Tipo char(n) Comentrio Armazena strings de tamanho fixo de at 8000 caracteres. Armazena strings de tamanho varivel de at 8000 caracteres. Armazena valores binrios de tam. fixo.

varbinary(n Armazena valores binrios de tam. varivel ) int Armazena valores inteiros em 4 bytes no intervalo de 2.147.483.647. Armazena valores inteiros em 2 bytes no intervalo de 32.767. Armazena valores inteiros em 1 byte no intervalo de 0 a 255.

Inteiro

smallint tinyint

Copyright 2000 - Nilton Freire Santos

SQL Uma

Criando Tabelas
Tipos de Dados: Categoria Tipo Comentrio

decimal(n,d) Armazena nmeros decimais com n dgitos e d decimais. numeric(n,d) Armazena nmeros decimais com n dgitos e d decimais. real Armazena dado numrico de ponto flutuante e preciso simples (7 dgitos) intervalo: -3.40E + 38 a 3.40E + 38. Armazena dado numrico de ponto flutuante e preciso simples ou dupla. n entre 1 e 24 - 7 dgitos - 4 bytes n entre 25 e 53 - 15 dgitos 8 bytes intervalo: - 1.79E + 308 a 1.79E + 308.

Numrico

float(n)

Copyright 2000 - Nilton Freire Santos

SQL Uma

Criando Tabelas
Tipos de Dados: Categoria Tipo money Moeda smallmoney Comentrio Armazena valores monetrios com intervalo de 922.337.203.685.447,5808. Utiliza 8 bytes e 4 casas decimais. Armazena valores monetrios com intervalo de 214.748,3647. Utiliza 4 bytes e 4 casas decimais. Armazena em 8 bytes a data no intervalo de 1/1/1753 a 31/12/9999 e a hora com preciso de milissegundo.

Data e Hora

datetime

Armazena em 4 bytes a data no intervalo smalldatetime de 1/1/1900 a 6/6/2079 e a hora com preciso de minuto.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Criando Tabelas
Tipos de Dados: Categoria Tipo timestamp Especial bit text image Comentrio Armazena em 8 bytes valores que so automaticamente incrementados. Armazena valores 0, 1 ou null. Strings de at 2.147.483.647 caracteres. Armazena dados de imagem com at 2.147.483.647 bytes.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Criando Tabelas
Sintaxe:
CREATE TABLE [banco_de_dados.] proprietrio.] nome_da_tabela ( nome_da_coluna tipo_de_dados [(preciso[,escala)]] [NULL | NOT NULL] [IDENTITY [(origem, incremento )]] [<restries de coluna>] [,...n] ) | nome_da_coluna AS expresso_de_coluna_computada ) | <restries de tabela> )

Copyright 2000 - Nilton Freire Santos

SQL Uma

Criando Tabelas
restries de coluna [CONSTRAINT nome_da_constraint] PRIMARY KEY | UNIQUE | [FOREIGN KEY] REFERENCES tabela_ref [(coluna_ref)] | DEFAULT expresso_constante | CHECK (expresso_lgica) restries de tabela [CONSTRAINT nome_da_constraint] PRIMARY KEY | UNIQUE [(coluna[,...n])] | FOREIGN KEY [(coluna[,...n])] REFERENCES tabela_ref [(coluna_ref[,...n])] | CHECK (expresso_lgica) Copyright 2000 - Nilton Freire Santos SQL Uma

Criando Tabelas
Argumentos: table_name: especifica o nome da tabela a ser criada. Deve ser exclusivo em um banco de dados e pode possuir at 128 caracteres, exceto para as tabelas temporrias (iniciadas com #) que no podem exceder 116 caracteres. column_name: especifica o nome de uma coluna da tabela. Deve ser exclusivo em uma tabela. data_type: especifica o tipo de dado da coluna. NULL | NOT NULL: especifica se a coluna pode receber valores nulos. IDENTITY: indica que o contedo da coluna possui auto-incremento. A propriedade pode ser atribuda a colunas do tipo tinyint, smallint, int, decimal(n,0), numeric(n,0). A tabela s pode possuir uma coluna IDENTITY. origem: o valor inicial da coluna IDENTITY. origem incremento: o valor incremental a ser usado na coluna IDENTITY. incremento

Copyright 2000 - Nilton Freire Santos

SQL Uma

Criando Tabelas
Argumentos: CONSTRAINT: uma palavra chave opcional indicando o incio da definio de uma restrio PRIMARY KEY, UNIQUE, FOREIGN KEY, CHECK ou DEFAULT. constraint_name: o nome de uma restrio. Devem ser exclusivos dentro de um banco dados. PRIMARY KEY: indica que a coluna uma chave primria. UNIQUE: indica que a coluna uma chave candidata. FOREIGN KEY ... REFERENCES: indica que a coluna uma chave estrangeira de um relacionamento. ref_table: o nome da tabela qual a restrio FOREIGN KEY faz ref_table referncia no relacionamento. ref_column: uma coluna ou lista de colunas qual a restrio ref_column FOREIGN KEY faz referncia. A coluna referenciada dever possuir restrio de PRIMARY KEY ou UNIQUE.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Criando Tabelas
Argumentos: DEFAULT: uma restrio que especifica que um valor padro ser DEFAULT atribudo para a coluna quando um valor no for fornecido explicitamente. constant_expresion: o valor padro atribudo para a coluna quando um valor no for fornecido explicitamente. Pode ser uma expresso, uma funo ou o valor nulo (NULL). CHECK: uma restrio que fora a integridade de domnio, limitando os possveis valores que podem ser introduzidos na coluna. logical expression: uma expresso lgica que retorna verdadeiro ou falso. Se a expresso retornar verdadeiro, o valor ser aceito, caso contrrio, ser rejeitado.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Criando Tabelas
Constraints

So restries impostas aos campos da tabela para garantir a integridade do banco de dados atravs da filtragem dos valores a serem inseridos nas colunas. Primary Key Unique Foreign Key Check Default

Copyright 2000 - Nilton Freire Santos

SQL Uma

Criando Tabelas
Restrio PRIMARY KEY:

utilizada para definir a chave primria da tabela. Uma tabela pode conter apenas uma restrio PRIMARY KEY. Todas as colunas definidas em uma restrio PRIMARY KEY devem ser definidas como NOT NULL. Uma chave primria de uma tabela pode ser referenciada por uma chave estrangeira. Sintaxe: CONSTRAINT <nome da constraint> PRIMARY KEY Exemplo: Criar uma chave primria chamada PK_funcionrio.

CONSTRAINT PK_funcionrio PRIMARY KEY

Copyright 2000 - Nilton Freire Santos

SQL Uma

Criando Tabelas
Restrio UNIQUE: utilizada para definir uma chave candidata para a tabela. Uma tabela pode conter at 249 restries UNIQUE. As colunas definidas como UNIQUE devem ser NOT NULL. Uma chave candidata de uma tabela pode ser referenciada por uma chave estrangeira. Sintaxe: CONSTRAINT <nome da constraint> UNIQUE Exemplo: Criar uma chave candidata chamada UN_funcionrio para o campo CPF da tabela FUNCIONRIO.

CONSTRAINT UN_cpf_funcionrio UNIQUE Copyright 2000 - Nilton Freire Santos SQL Uma

Criando Tabelas
Restrio FOREGN KEY: utilizada para definir uma chave estrangeira para a tabela. Todo valor no nulo introduzidos na coluna de uma restrio FOREGN KEY devem existir na tabela referenciada. O nmero de colunas e tipos de dados das colunas especificadas em uma restrio FOREIGN KEY devem coincidir com as colunas da tabela referenciada. Uma tabela pode conter at 253 restries FOREIG KEY. Uma chave estrangeira de uma tabela deve referenciar apenas chaves primrias ou candidatas. Sintaxe: CONSTRAINT <nome da constraint> FOREIGN KEY REFERENCES <tabela referenciada [ <coluna> ]

Copyright 2000 - Nilton Freire Santos

SQL Uma

Criando Tabelas
Exemplo: Criar uma chave estrangeira chamada FK_cliente_pedido para o campo CPF da tabela PEDIDO para estabelecer um relacionamento entre as tabelas CLIENTE e PEDIDO.

CONSTRAINT FK_cliente_pedido FOREIGN KEY REFERENCES cliente (cdigo)

Copyright 2000 - Nilton Freire Santos

SQL Uma

Criando Tabelas
Restrio DEFAULT:

utilizada para definir um valor padro para uma coluna de uma tabela. Possui prioridade sobre NULL. Uma coluna pode ter apenas uma restrio DEFAULT. Uma restrio DEFAULT no pode fazer referncia a uma outra coluna. O valor atribudo em uma restrio DEFAULT deve estar de acordo com o tipo de dado da coluna. Sintaxe: CONSTRAINT <nome da constraint> DEFAULT <valor> Exemplo: Criar um valor default igual a PB para o campo UF da tabela CLIENTE.

CONSTRAINT DF_uf_cliente DEFAULT PB Copyright 2000 - Nilton Freire Santos SQL Uma

Criando Tabelas
Restrio CHECK:

utilizada para definir restries de domnio para as colunas de uma tabela. Uma coluna pode possuir uma nica restrio CHECK. Uma tabela pode possuir mltiplas restries CHECK caso existam vrias condies para restrio. As condio pode conter vrias expresses lgicas combinadas com AND e OR. Sintaxe: CONSTRAINT <nome da constraint> CHECK <expresso> Exemplo: Definir que o campo CDIGO da tabela CLIENTE possua 5 dgitos.

CONSTRAINT CK_cdigo_cliente CHECK (LEN(cdigo) = 5) Copyright 2000 - Nilton Freire Santos SQL Uma

Modificando Tabelas
Sintaxe: ALTER TABLE <table_name> ALTER COLUMN (column_name data_type [(largura [,preciso)] [NULL | NOT NULL] [IDENTITY [(origem,incremento)]] | ADD (column_name data_type [(largura [,preciso)]] | DROP [CONSTRAINT] constraint_name | COLUMN column_name [<column_constraint>] ) column_constraint ::= CONSTRAINT constraint_name [ PRIMARY KEY ] | [ UNIQUE ] | [ FOREIGN KEY REFERENCES ref_table [(ref_column)] ] [ DEFAULT constant_expression FOR column_name ] [ CHECK logical_expression ]

Copyright 2000 - Nilton Freire Santos

SQL Uma

Manipulao de Dados
CONSULTA INCLUSO ALTERAO EXCLUSO SELECT INSERT UPDATE DELETE
SQL Uma

Copyright 2000 - Nilton Freire Santos

SELECT Consultando Dados


SELECT FROM INTO WHERE ORDER BY GROUP BY HAVING Especifica as colunas e expresses exibidas no resultado da consulta. Especifica as tabelas que contm os dados exibidos nos resultado da consulta. Especifica uma nova tabela que conter o resultado da consulta. Especifica as condies usadas para filtrar registros no resultado da consulta. Classifica os resultados da consulta com base nos dados de uma ou mais colunas. Agrupa as linhas da consulta com base nos valores de uma das colunas. Especifica as condies usadas para filtrar agrupamentos de dados no resultado da consulta. S deve ser usado com GROUP BY.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Consulta Simples
Sintaxe: SELECT * FROM <tabela> Exemplo 1: Exibir todos os dados de todos os clientes. SELECT * FROM cliente Exemplo 2: Exibir todos os dados de todos os funcionrios. SELECT * FROM funcionrio Exemplo 3: Exibir todos os dados de todos os produtos. SELECT * FROM produto

Copyright 2000 - Nilton Freire Santos

SQL Uma

Selecionando Colunas
Sintaxe: SELECT <lista de colunas> FROM <tabela> Exemplo 1: Exibir cdigo, nome e telefone de todos os clientes. SELECT cdigo, nome, fone FROM cliente Exemplo 2: Exibir cdigo, nome, estado civil e data de nascimento de todos os funcionrios. SELECT cdigo, nome, estcivil, datanasc FROM funcionrio Exemplo 3: Exibir cdigo, nome, preo de custo e preo de venda de todos os produtos. SELECT cdigo, nome, custo, venda FROM produto

Copyright 2000 - Nilton Freire Santos

SQL Uma

Determinando a Quantidade de Linhas


Sintaxe: SELECT TOP n [PERCENT] <lista de colunas> FROM <tabela> Exemplo 1: Exibir cdigo, nome e telefone dos 20 primeiros clientes cadastrados na empresa. SELECT TOP 20 cdigo, nome, fone FROM cliente Exemplo 2: Exibir cdigo, nome, preo de custo e preo de venda dos 10% primeiros produtos cadastrados na empresa. SELECT TOP 10 PERCENT cdigo, nome, custo, venda FROM produto

Copyright 2000 - Nilton Freire Santos

SQL Uma

Exibindo Strings com o Resultado


Sintaxe: SELECT <lista de colunas,string> FROM <tabela> Exemplo 1: Exibir cdigo, nome, telefone e uma coluna contendo no classificado para todos os clientes. SELECT cdigo,nome,fone,no classificado FROM cliente Exemplo 2: Exibir cdigo, nome, preo de custo, preo de venda e uma coluna contendo Num. referncia para todos os produtos. SELECT cdigo,nome,custo,venda,Num.referncia FROM produto

Copyright 2000 - Nilton Freire Santos

SQL Uma

Alterando o Ttulo das Colunas


Sintaxe: SELECT <coluna1> [AS] <nome1>, <coluna2> [AS] <nome2>,... FROM <tabela> Exemplo 1: Exibir cdigo, nome, telefone e uma coluna contendo no classificado com o cabealho Classificao para todos os clientes. SELECT cdigo, nome, fone, no classificado AS Classificao FROM cliente Exemplo 2: Exibir cdigo, nome com o cabealho Produto, preo de custo, preo de venda e uma coluna contendo Num. Ref. com o ttulo Nmero de Referncia para todos os produtos. SELECT cdigo, nome Produto, custo, venda, Num Ref Nmero de Referncia FROM produto

Copyright 2000 - Nilton Freire Santos

SQL Uma

Eliminando Duplicao de Linhas


Sintaxe: SELECT DISTINCT <lista de colunas> FROM <tabela> Exemplo 1: Exibir o cdigo de todos os clientes que j fizeram pedido na empresa. SELECT DISTINCT cliente FROM pedido Exemplo 2: Exibir todos os bairros com os respectivos cdigos da cidade dos funcionrios da empresa. SELECT DISTINCT bairro, cidade FROM funcionrio Exemplo 3: Exibir o cdigo de todos os tipos de produtos existentes na empresa. SELECT DISTINCT tipo FROM produto

Copyright 2000 - Nilton Freire Santos

SQL Uma

Exibindo Colunas Calculadas


Sintaxe: SELECT <lista de colunas,expresso> FROM <tabela> Exemplo 1: Exibir cdigo, quantidade em estoque, preo de venda e valor total (quantidade X preo de venda) para cada produto. SELECT cdigo, quantest Quantidade, venda, quantest*venda Valor Total FROM produto Exemplo 2: Exibir cdigo, nome, salrio e o salrio com 32% de aumento para todos os funcionrios. SELECT cdigo, nome, salrio, Novo salrio=salrio*1.32 FROM funcionrio

Copyright 2000 - Nilton Freire Santos

SQL Uma

Ordenando os Resultados
Sintaxe: SELECT <lista de colunas> FROM <tabela> ORDER BY <coluna> [ASC] [DESC] Exemplo 1: Exibir cdigo, nome e telefone de todos os clientes, ordenados pelo nome do cliente em ordem ascendente. SELECT cdigo, nome, fone FROM cliente ORDER BY nome Exemplo 2: Exibir cdigo, nome, estado civil e data de nascimento de todos os funcionrios, ordenados pela data de nascimento em ordem descendente. SELECT cdigo, nome, estcivil, datanasc FROM funcionrio ORDER BY datanasc DESC

Copyright 2000 - Nilton Freire Santos

SQL Uma

Ordenando os Resultados
Exemplo 3: Exibir cdigo, nome, preo de custo, preo de venda e a diferena entre esses dois preos para todos os produtos, ordenados pela diferena de preo em ordem descendente. SELECT cdigo, nome, custo, venda, venda-custo Diferena FROM produto ORDER BY Diferena DESC Exemplo 4: Exibir cdigo, nome e tipo de todos os produtos existentes na empresa, ordenados pelo tipo em ordem ascendente e pelo nome do produto em ordem descendente. SELECT cdigo, nome, tipo FROM produto ORDER BY tipo, nome DESC

Copyright 2000 - Nilton Freire Santos

SQL Uma

Ordenando os Resultados
Exemplo 5: Exibir cdigo, nome, cidade, sexo e salrio de todos os funcionrios da empresa, ordenados por cidade e sexo em ordem ascendente e por salrio em ordem descendente. SELECT cdigo, nome, cidade, sexo, salrio FROM funcionrio ORDER BY cidade,sexo,salrio DESC Exemplo 6: Exibir cdigo, nome, descrio, tipo, preo de venda e quantidade em estoque de todos os produtos existentes na empresa, ordenados pelo tipo em ordem descendente e pelo preo de venda em ordem ascendente. SELECT cdigo, nome, descrio, tipo, venda, quantest FROM produto ORDER BY 4 DESC, 5

Copyright 2000 - Nilton Freire Santos

SQL Uma

Filtrando os Dados
Sintaxe: SELECT <lista de colunas> FROM <tabela> WHERE <coluna OPERADOR expresso) Exemplo 1: Exibir todos os dados dos funcionrios que nasceram a partir de 1960, ordenados pela data de nascimento em ordem ascendente. SELECT *, CONVERT(varchar,datanasc,103) Nascim FROM funcionrio WHERE datanasc > 31/12/1959 ORDER BY datanasc Exemplo 2: Exibir nome, descrio, preo de custo, preo de venda e quantidade em estoque dos produtos com preo de venda menor ou igual a R$ 30,00, ordenados pelo preo de venda em ordem descendente. SELECT nome, descrio, custo, venda, quantest FROM produto WHERE venda <= $30.00 ORDER BY venda DESC

Copyright 2000 - Nilton Freire Santos

SQL Uma

Operadores do WHERE
Operador = <>, != ,# LIKE Significado Igual. Campo e expresso devem possuir o mesmo valor. Diferente. Campo e expresso devem possuir valores diferentes. Campo com caracteres que correspondam aos da expresso. S atua em campos do tipo caracter e faz distino entre maisculos e minsculos. permitido o uso de mscaras: % (percentual) - substitui uma seqncia de caracteres. _ (sublinhado) - substitui um nico caracter. Maior que. Valor do campo maior que o valor da expresso. Maior ou igual a. Valor do campo maior ou igual ao da expresso Menor que. Valor do campo menor ou igual ao da expresso. Menor ou igual a.Valor do campo menor ou igual ao da expresso. O valor do campo deve ser igual a um dos valores da lista. Seleciona as linhas com o valor nulo para o campo especificado.

> >= < <= IN IS NULL

BETWEEN O valor do campo deve estar compreendido no intervalo definido.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Filtrando Dados Usando Intervalos


Sintaxe: SELECT <lista de colunas> FROM <tabela> WHERE <coluna BETWEEN intervalo> Exemplo 1: Exibir todos os dados dos produtos com estoque entre 10 e 30 unidades, ordenados pelo nome do produto em ordem ascendente. SELECT * FROM produto WHERE quantest BETWEEN 10 and 30 ORDER BY nome Exemplo 2: Exibir todos os dados dos funcionrios que nasceram na dcada de 60, ordenados pela data de nascimento em ordem descendente e pelo nome do funcionrio em ordem ascendente. SELECT * FROM funcionrio WHERE datanasc BETWEEN 01/01/1960 and 31/12/1969 ORDER BY datanasc DESC, nome

Copyright 2000 - Nilton Freire Santos

SQL Uma

Filtrando Dados Usando Listas


Sintaxe: SELECT <lista de colunas> FROM <tabela> WHERE <coluna IN lista> Exemplo 1: Exibir todos os dados dos funcionrios da empresa que residam em Manara ou Bessa, ordenados pelo nome em ordem ascendente. SELECT * FROM funcionrio WHERE bairro IN (Manara, Bessa) ORDER BY nome Exemplo 2: Exibir todos os produtos que no sejam do tipo 2 ou 4, ordenados pelo tipo em ordem descendente e pelo nome em ordem ascendente. SELECT * FROM produto WHERE tipo NOT IN (2,4) ORDER BY tipo DESC, nome

Copyright 2000 - Nilton Freire Santos

SQL Uma

Filtrando Dados com Valores Nulos


Sintaxe: SELECT <lista de colunas> FROM <tabela> WHERE <coluna> IS NULL Exemplo 1: Exibir os dados de todos os funcionrios que no tenham e_mail, ordenados pelo nome em ordem ascendente. SELECT * FROM funcionrio WHERE e_mail IS NULL ORDER BY nome Exemplo 2: Exibir os dados de todos os funcionrios cujo nmero do telefone seja conhecido, ordenados nome do funcionrio em ordem ascendente. SELECT * FROM funcionrio WHERE fone IS NOT NULL ORDER BY nome

Copyright 2000 - Nilton Freire Santos

SQL Uma

Filtrando Dados Usando Strings


Sintaxe: SELECT <lista de colunas> FROM <tabela> WHERE <coluna> LIKE <string> Exemplo 1: Exibir cdigo e nome de todos os funcionrios que tenham o nome comeando por M, ordenados pelo nome em ordem ascendente. SELECT cdigo, nome FROM funcionrio WHERE nome LIKE M% ORDER BY nome Exemplo 2: Exibir cdigo e nome de todos os funcionrios que tenham o nome terminando por Silva, ordenados pelo nome em ordem ascendente. SELECT cdigo, nome FROM funcionrio WHERE nome LIKE %Silva ORDER BY nome

Copyright 2000 - Nilton Freire Santos

SQL Uma

Filtrando Dados Usando Strings


Exemplo 3: Exibir cdigo e nome de todos os funcionrios que tenham Costa em qualquer parte do nome. SELECT cdigo, nome FROM funcionrio WHERE nome LIKE %Costa% Exemplo 4: Exibir cdigo e nome de todos os funcionrios que tenham o nome comeando por Mar seguido de um caractere qualquer e terminando por a, ordenados pelo nome. SELECT cdigo, nome FROM funcionrio WHERE nome LIKE 'Mar_a%' ORDER BY nome Exemplo 5: Exibir cdigo e nome de todos os funcionrios que tenham o nome comeando por Mar seguido de um caractere qualquer entre i e t e terminando por a. SELECT cdigo, nome FROM funcionrio WHERE nome LIKE 'Mar[i-t]a%'

Copyright 2000 - Nilton Freire Santos

SQL Uma

Filtrando Dados Usando Strings


Exemplo 6: Exibir cdigo e nome de todos os clientes cujo cdigo no comece por A nem por C, ordenados pelo cdigo. SELECT cdigo, nome FROM cliente WHERE cdigo NOT LIKE [AC]% Exemplo 7: Exibir cdigo e nome de todos os clientes, exceto dos que tenham a letra A como segundo caractere do cdigo. SELECT cdigo, nome FROM cliente WHERE cdigo NOT LIKE _A% Exemplo 8: Exibir cdigo e nome de todos os produtos, que possuam a string 20% de desconto na coluna OBS. SELECT cdigo, nome FROM produto WHERE obs LIKE '%20!% de desconto%' ESCAPE '!'

Copyright 2000 - Nilton Freire Santos

SQL Uma

Filtrando Dados com Condies Compostas


Sintaxe: SELECT <lista de colunas> FROM <tabela> WHERE <condio 1> <AND|OR> <condio 2> ... <AND|OR> <condio n> Exemplo 1: Exibir cdigo, nome, tipo, telefone e fax dos clientes que sejam pessoa jurdica e que possuam fax, ordenados pelo nome em ordem ascendente. SELECT cdigo, nome, tipo, fone, fax FROM cliente WHERE tipo=J and fax IS NOT NULL ORDER BY nome Exemplo 2: Exibir todos os produtos com quantidade em estoque maior que 100 ou preo de custo menor ou igual a R$ 10,00. SELECT * FROM produto WHERE quantest > 100 OR custo <= $10.00

Copyright 2000 - Nilton Freire Santos

SQL Uma

Filtrando Dados com Condies Compostas


Exemplo 3: Exibir cdigo, nome, salrio e idade de todos os funcionrios homens com salrio superior a R$ 1.500,00 e com idade entre 25 e 40 anos. SELECT cdigo, nome, salrio, YEAR(GETDATE())YEAR(datanasc) Idade FROM funcionrio WHERE sexo=M AND salrio > $1500.00 AND YEAR(GETDATE())-YEAR(datanasc)BETWEEN 25 AND 40 Exemplo 4: Exibir todos os produtos com tipo igual a 1, 2 ou 5 e quantidade em estoque maior ou igual a 10, ou que tenham preo de venda superior a R$ 50,00 e tipo diferente de 1, 4 e 6. SELECT * FROM produto WHERE (tipo IN (1,2,5) AND quantest >= 10) OR (venda > $50.00 AND tipo NOT IN (1,4,6))

Copyright 2000 - Nilton Freire Santos

SQL Uma

Usando Funes de Agregao


As funes de agregao: Operam na coleta de valores de uma coluna da tabela; Produzem um resultado nico; Geram valores sumarizados; No atuam sobre valores nulos; So usadas na lista de colunas do SELECT. COUNT( ) : conta o nmero de valores de uma coluna. : soma os valores de uma coluna de dados numricos. : calcula a mdia de uma coluna de dados numricos. : determina o maior valor de uma coluna. : determina o menor valor de uma coluna.

SUM( ) AVG( ) MAX( ) MIN( )

A clusula DISTINCT pode ser usada como parte do argumento para eliminar linhas repetidas antes de aplicar a funo.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Contando os Registros
Exemplo 1: Exibir quantos clientes tm cadastro na empresa. SELECT COUNT(*) FROM cliente Exemplo 2: Exibir quantos pedidos foram enviados por via area. SELECT COUNT(*) FROM pedido WHERE via = A Exemplo 3: Exibir quantos funcionrio tm e_mail. SELECT COUNT(e_mail) FROM funcionrio ou SELECT COUNT(*) FROM funcionrio WHERE e_mail IS NOT NULL Exemplo 4: Exibir a quantas cidades a empresa atende. SELECT COUNT(DISTINCT cidade) FROM cliente Exemplo 5: Exibir quantos vendedores j atenderam pedido. SELECT COUNT(DISTINCT vendedor) FROM pedido

Copyright 2000 - Nilton Freire Santos

SQL Uma

Totalizando Colunas
Exemplo 1: Exibir a soma de todos os salrios da empresa. SELECT SUM(salrio) FROM funcionrio Exemplo 2: Exibir a soma de todos os salrios dos funcionrios dos setores Compras e Vendas (COV) e Marketing (MKT) com um aumento de 32%. SELECT salrio=SUM(salrio*1.32) FROM funcionrio WHERE setor IN(COV,RHM) Exemplo 3: Exibir o total pago pelo frete dos pedidos atendidos pelos funcionrios de cdigo 2, 6, 8 e 10 durante o ano de 1997. SELECT SUM(frete) FROM pedido WHERE vendedor IN (2,6,8,10) and YEAR(datapedid) = 1997

Copyright 2000 - Nilton Freire Santos

SQL Uma

Calculando Mdias
Exemplo 1: Exibir a mdia dos salrios da empresa. SELECT AVG(salrio) FROM funcionrio Exemplo 2: Exibir o preo mdio de venda dos produtos do tipo 1 SELECT AVG(venda) FROM produto WHERE tipo=1 Exemplo 3: Exibir a idade mdia das funcionrias dos setor COV. SELECT AVG(YEAR(GETDATE())-YEAR(datanasc)) Idade FROM funcionrio WHERE sexo=F and setor=COV Exemplo 4: Exibir a mdia de salrio dos funcionrios com salrio entre R$ 400,00 e R$ 800,00 que no sejam casados nem vivos. SELECT AVG(salrio) FROM funcionrio WHERE salrio BETWEEN $400.00 and $800.00 and estcivil NOT IN(C,V)

Copyright 2000 - Nilton Freire Santos

SQL Uma

Usando Valores Mximos e Mnimos


Exemplo 1: Exibir o preo do produto mais caro vendido na empresa. SELECT MAX(venda) Preo FROM produto Exemplo 2: Exibir a data de nascimento do homem mais velho da empresa. SELECT MIN(datanasc) FROM funcionrio WHERE sexo=M Exemplo 3: Exibir o maior salrio pago a uma funcionria. SELECT MAX(salrio) FROM funcionrio WHERE sexo=F Exemplo 4: Exibir o menor preo de custo dos produtos do tipo 1. SELECT MIN(custo) FROM produto WHERE tipo = 1

Copyright 2000 - Nilton Freire Santos

SQL Uma

Sumarizando Informaes
Sintaxe: SELECT <lista de colunas> FROM <tabela> ORDER BY <lista de colunas> COMPUTE <lista de funes de agregao> BY <lista de colunas> Exemplo 1: Exibir o nome do funcionrio, a funo exercida, o sexo e o salrio de cada funcionrio, ordenados pela funo e sexo. Exibir tambm o total e a mdia de salrios desses funcionrios. SELECT funo,nome,sexo,salrio FROM funcionrio ORDER BY funo,sexo COMPUTE SUM(salrio), AVG(salrio)

Copyright 2000 - Nilton Freire Santos

SQL Uma

Sumarizando Informaes
Exemplo 2: Exibir o cdigo, o nome, do funcionrio, a funo exercida, o sexo e o salrio de cada funcionrio, ordenados pela funo e sexo. Exibir tambm o total e a mdia de salrios desses funcionrios por funo e por sexo. SELECT funo,nome,sexo,salrio FROM funcionrio ORDER BY funo,sexo COMPUTE SUM(salrio), AVG(salrio) BY funo,sexo Exemplo 3: Exibir o cdigo, o nome, o preo de custo, o de venda e o tipo de todos os produtos, ordenados pelo tipo. Exibir tambm o total e mdia dos preos de custo e venda desses produtos. SELECT cdigo, nome, custo, venda FROM produto ORDER BY tipo COMPUTE SUM(custo), AVG(custo),SUM(venda),AVG(venda)

Copyright 2000 - Nilton Freire Santos

SQL Uma

Sumarizando Informaes
Exemplo 4: Exibir o cdigo, o nome, o preo de custo, o de venda e o tipo de todos os produtos, ordenados pelo tipo. Exibir tambm o total e mdia dos preos de custo e venda desses produtos por tipo de produto. SELECT cdigo, nome, custo, venda, tipo FROM produto ORDER BY tipo COMPUTE SUM(custo), AVG(custo),SUM(venda),AVG(venda) BY tipo Exemplo 5: Exibir o cdigo, o nome, o cargo, o sexo e a cidade de todos os clientes que no possuam cargo de gerente. Exibir tambm a quantidade de clientes por sexo, de cada cidade. SELECT cdigo,nome,cargo,tipo,cidade FROM cliente WHERE cargo not LIKE Gerente% ORDER BY tipo,cidade COMPUTE count(cdigo) BY tipo, cidade

Copyright 2000 - Nilton Freire Santos

SQL Uma

Agrupando Informaes
Sintaxe: SELECT <lista de colunas> FROM <tabela> GROUP BY <coluna> HAVING <condio> Exemplo 1: Exibir a quantidade de homens e mulheres da empresa. SELECT sexo, COUNT(*) Quantidade FROM funcionrio GROUP BY sexo Exemplo 2: Exibir a quantidade de funcionrios e o total e salrios de cada setor da empresa. SELECT setor, COUNT(*) Funcionrios, SUM(salrio)Total FROM funcionrio GROUP BY setor Exemplo 3: Exibir a quantidade de pedidos de cada data. SELECT datapedid, COUNT(*) Pedidos FROM pedido GROUP BY datapedid

Copyright 2000 - Nilton Freire Santos

SQL Uma

Agrupando Informaes
Exemplo 4: Exibir a quantidade, o valor total e a mdia dos preos de custo e de venda dos produtos de cada tipo. SELECT tipo,COUNT(*) Quantidade, SUM(custo) Custo Tot, AVG(custo)Custo Med, SUM(venda)Venda Tot, AVG(venda) Venda Med FROM produto GROUP BY tipo Exemplo 5: Exibir os pedidos que tm mais do que 4 produtos. SELECT pedido,COUNT(produto) Quantidade FROM itens GROUP BY pedido HAVING COUNT(produto) > 4 Exemplo 6: Exibir a quantidade de pedidos realizados em cada ano, para os anos que tm mais de 200 pedidos. SELECT YEAR(datapedid), COUNT(*) FROM pedido GROUP BY YEAR(datapedid) HAVING COUNT(*) > 200

Copyright 2000 - Nilton Freire Santos

SQL Uma

Agrupando Informaes
Exemplo 7: Exibir o valor total de cada pedido (Valor total = quantidade * preo desconto), onde a soma seja maior do que R$ 1.000,00. SELECT pedido, SUM((preo*quant)-(preo*quant* desconto/100)) Valor Total FROM itens GROUP BY pedido HAVING SUM((preo*quant)(preo*quant*desconto/100)) > $1000.00 ORDER BY pedido Exemplo 8: Exibir para cada funo, a quantidade de homens e mulheres e o total de salrios por sexo, para as funes onde o total de salrios seja maior do que R$ 1.000,00. SELECT funo, sexo, COUNT(sexo) Funcionrio, SUM(salrio) Salrio total FROM funcionrio GROUP BY funo, sexo HAVING SUM(salrio) > $1000 ORDER BY funo, sexo

Copyright 2000 - Nilton Freire Santos

SQL Uma

Agrupando Informaes
Exemplo 9: Exibir a quantidade de itens e o valor total de venda dos produtos de cada tipo, para os tipos onde o valor total de venda seja superior a R$ 1.000,00, ordenados pelo tipo. SELECT tipo, COUNT(*) Quantidade, SUM(venda*quantest) Valor Total FROM produto GROUP BY tipo HAVING SUM(venda*quantest) > $1000.00 ORDER BY tipo Exemplo 10: Exibir a mdia de idade dos funcionrios de cada sexo em cada setor da empresa. Exibir apenas os setores onde essa mdia de idade seja superior a 40 anos SELECT setor, sexo, AVG(YEAR(GETDATE())-YEAR(datanasc)) Idade FROM funcionrio GROUP BY setor,sexo HAVING AVG(YEAR(GETDATE())-YEAR(datanasc)) > 40

Copyright 2000 - Nilton Freire Santos

SQL Uma

Agrupando Informaes com Resumo


Sintaxe: SELECT <lista de colunas> FROM <tabela> GROUP BY <coluna> [HAVING <condio>] [WITH ROLLUP | CUBE] Exemplo 1: Exibir a quantidade total de funcionrios da empresa e a quantidade de funcionrios por sexo. SELECT sexo, COUNT(*) Quantidade FROM funcionrio GROUP BY sexo WITH ROLLUP Exemplo 2: Exibir a quantidade de funcionrios e o total e salrios de cada setor da empresa, exibindo tambm a quantidade total de funcionrios e o valor total de salrios. SELECT setor,funo, COUNT(*) Funcionrios, SUM(salrio)Total FROM funcionrio GROUP BY setor,funo WITH ROLLUP

Copyright 2000 - Nilton Freire Santos

SQL Uma

Agrupando Informaes com Resumo


Exemplo 3: Exibir a quantidade total de funcionrios da empresa e a quantidade de funcionrios por sexo e por funo. Exibir tambm a quantidade total de funcionrios de cada funo. SELECT sexo,funo, COUNT(*) Quantidade FROM funcionrio GROUP BY sexo,funo WITH CUBE Exemplo 4: Exibir para cada funo de cada setor da empresa a quantidade de funcionrios e o total e salrios, exibindo tambm a quantidade total de funcionrios e o valor total de salrios da empresa. Exibir ainda a quantidade de funcionrios e o total de salrios por funo. SELECT setor,funo, COUNT(*) Funcionrios, SUM(salrio)Total FROM funcionrio GROUP BY setor,funo WITH CUBE

Copyright 2000 - Nilton Freire Santos

SQL Uma

Consulta Usando Duas Tabelas


Sintaxe: SELECT <campos> FROM <tabela1> [alias1] INNER] JOIN <tabela2> [alias2] ON <condio de associao> SELECT <campos> FROM <tabela1> [alias1], <tabela2> [alias2] WHERE <condio de associao> Comentrio: A juno entre duas tabelas realizada usando uma coluna de conexo existente em cada tabela e o resultado da consulta contm somente linhas de uma tabela que corresponda a uma ou mais linhas da outra tabela. A <condio de associao> especifica os critrios para a juno das tabelas.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Consulta Usando Duas Tabelas


Exemplo 1: Exibir o cdigo de cada pedido e o nome do cliente que realizou cada um deles, ordenados pelo cdigo do pedido.

CLIENTE
cdigo nome

PEDIDO
cdigo cliente

cliente.cdigo

pedido.cliente

SELECT pedido.cdigo, cliente.nome FROM pedido INNER JOIN cliente ON cliente.cdigo = pedido.cliente ORDER BY pedido.cdigo SELECT pedido.cdigo, cliente.nome FROM pedido, cliente WHERE cliente.cdigo = pedido.cliente

Copyright 2000 - Nilton Freire Santos

SQL Uma

Consulta Usando Duas Tabelas


Exemplo 2: Exibir, para cada funcionrio, cdigo e nome do funcionrio, sigla e nome do setor onde trabalha, ordenados pela sigla do setor e nome do funcionrio.

SETOR
sigla nome

FUNCIONRIO
cdigo nome setor

setor.sigla

funcionrio.setor

SELECT f.cdigo,f.nome,s.cdigo,s.sigla,s.nome FROM funcionrio f JOIN setor s ON f.setor = s.sigla ORDER BY s.sigla,f.nome SELECT f.cdigo,f.nome,s.cdigo,s.sigla,s.nome FROM funcionrio f,setor s WHERE f.setor = s.cdigo ORDER BY s.sigla,f.nome

Copyright 2000 - Nilton Freire Santos

SQL Uma

Consulta Usando Duas Tabelas


Exemplo 3: Exibir a quantidade, a mdia dos preos de venda e de custo dos produtos de cada tipo, mostrando o cdigo e o nome do tipo do produto. SELECT t.cdigo,t.nome Tipo,COUNT(p.cdigo)Quant, AVG(p.venda) Mdia_venda,AVG(p.custo) Mdia_custo FROM produto p JOIN tipo t ON p.tipo = t.cdigo GROUP BY t.cdigo, t.nome Exemplo 4: Exibir o valor total dos produtos de cada tipo (venda X quantidade), mostrando tambm o nome do tipo e ordenando pelo valor total em ordem descendente. SELECT t.nome Tipo, SUM(p.quantest*p.venda) Total FROM tipo t JOIN produto p ON t.cdigo = p.tipo GROUP BY t.nome ORDER BY Total DESC

Copyright 2000 - Nilton Freire Santos

SQL Uma

Consulta Usando Mais de Duas Tabelas


Exemplo 1: Exibir a lista dos pedidos com o nome do cliente e do vendedor e a forma de envio de cada pedido.
cliente vendedor

CLIENTE
cdigo nome

PEDIDO
cdigo via

FUNCIONRIO
cdigo nome

cliente.cdigo = pedido.cliente funcionrio.cdigo = pedido.vendedor SELECT p.cdigo Pedido,c.nome Cliente,f.nome Vendedor,p.via FROM pedido p JOIN cliente c ON p.cliente = c.cdigo JOIN funcionrio f ON p.vendedor = f.cdigo ORDER BY p.cdigo

Copyright 2000 - Nilton Freire Santos

SQL Uma

Consulta Usando Mais de Duas Tabelas


Exemplo 2: Exibir o nome do setor, nome do funcionrio, salrio total (salrio do funcionrio + gratificao da funo) e funo exercida por cada funcionrio, ordenados pelo nome do setor em ordem ascendente. SELECT f.nome Funcionrio, s.nome Setor, fu.nome Funo, f.salrio+fu.gratific Salrio FROM setor s JOIN funcionrio f ON s.sigla = f.setor JOIN funo fu ON f.funo = fu.cdigo ORDER BY f.nome SELECT f.nome Funcionrio,s.nome Setor, fu.nome Funo, f.salrio+fu.gratific Salrio FROM setor s, funcionrio f, funo fu WHERE s.sigla = f.setor and f.funo = fu.cdigo ORDER BY f.nome

Copyright 2000 - Nilton Freire Santos

SQL Uma

Consulta Usando Mais de Duas Tabelas


Exemplo 3: Exibir o nome de cada funcionrio, o nome da cidade onde cada um nasceu e o nome da cidade onde cada um reside, ordenados pelo nome do funcionrio em ordem ascendente. SELECT f.nome Funcionrio,c1.nome Natural, c2.nome Reside FROM funcionrio f JOIN cidade c1 ON f.natural = c1.cdigo JOIN cidade c2 ON f.cidade = c2.cdigo ORDER BY f.nome SELECT f.nome Funcionrio,c1.nome Natural, c2.nome Reside FROM Funcionrio f,cidade c1, cidade c2 WHERE f.natural = c1.cdigo and f.cidade = c2.cdigo ORDER BY f.nome

Copyright 2000 - Nilton Freire Santos

SQL Uma

Consulta Usando Auto-Relacionamento


Sintaxe: SELECT <campos> FROM <tabela> [alias1] [INNER] JOIN <tabela> [alias2] ON <condio de associao> SELECT <campos> FROM <tabela1> [alias1], <tabela2> [alias2] WHERE <cond. de associao> Comentrio: A seleo usando auto-relacionamento relaciona linhas de uma tabela com outras linhas da mesma tabela, usando uma coluna de conexo. Para que a tabela possa se relacionar com ela mesma, devem ser informados dois aliases diferentes para a mesma tabela.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Consulta Usando Auto-Relacionamento


Exemplo 1: Exibir a lista dos setores da empresa com o nome do setor hierarquicamente superior e o nome do funcionrio chefe de cada setor.
sigla nome

FUNCIONRIO
cdigo nome setor

s1.superior = s2.sigla

SELECT s1.nome, s2.nome superior, f1.nome Chefe, f2.nome Chefe do Setor Sup. FROM setor s1 JOIN setor s2 ON s1.superior=s2.sigla JOIN funcionrio f1 ON f1.cdigo = s1.chefe JOIN funcionrio f2 ON f2.cdigo = s2.chefe

Copyright 2000 - Nilton Freire Santos

superior

SETOR
chefe

f.cdigo = s1.chefe

SQL Uma

Consulta Esquerda com Duas Tabelas


Sintaxe: SELECT <campos> FROM <tabela1> [alias1] LEFT [OUTER] JOIN <tabela2> [alias2] ON <condio de associao> Exemplo 1: Exibir a lista das funes com os respectivos nomes dos funcionrios que exercem cada uma delas, mesmo que exista funo que no tenha nenhum funcionrio, ordenados pelo nome da funo e pelo nome do funcionrio em ordem ascendente. SELECT fu.nome Funo, f.nome Funcionrio FROM funo fu LEFT JOIN funcionrio f ON fu.cdigo = f.funo ORDER BY fu.nome, f.nome Sero exibidos os nomes de todas as funes com os respectivos nomes dos funcionrios que exercem cada uma. Para os casos onde a funo no tenha funcionrio, ser exibido NULL para o nome do funcionrio (coluna f.nome).

Copyright 2000 - Nilton Freire Santos

SQL Uma

Consulta Direita com Duas Tabelas


Sintaxe: SELECT <campos> FROM <tabela1>[alias1] RIGHT [OUTER] JOIN <tabela2> [alias2] ON <condio de associao> Exemplo 1: Exibir a lista dos tipos de produtos com os respectivos nomes dos produtos existentes para cada tipo, mesmo que exista tipo que no tenha produto, ordenados pelo nome do tipo e pelo nome do produto em ordem ascendente. SELECT t.nome Tipo, p.nome Produto FROM produto p RIGHT JOIN tipo t ON t.cdigo = p.tipo ORDER BY t.nome, p.nome Sero exibidos os nomes de todos os tipos com os respectivos nomes dos produtos de cada tipo. Para os casos onde o tipo no tenha nenhum produto, ser exibido NULL para o nome do produto (coluna p.nome).

Copyright 2000 - Nilton Freire Santos

SQL Uma

Consulta Usando Subquery


Uma subquery uma consulta cujo resultado utilizado por uma outra consulta mais externa, de forma encadeada e contida no mesmo comando SELECT. Uma subquery deve estar entre parnteses e avaliada apenas uma vez (exceto em subqueries correlacionadas). A query mais externa depende da avaliao da subquery. subquery Em um comando SELECT, a subquery avaliada primeiro e a consulta mais externa depende da avaliao da subconsulta.
Uma subquery de valor nico retorna apenas um valor e pode ser

usada no lugar de qualquer expresso. 1 coluna 1 valor


Uma subquery de coluna nica retorna mltiplas linhas e pode ser

usada apenas em um WHERE. 1 coluna muitos valores

Copyright 2000 - Nilton Freire Santos

SQL Uma

Consulta Usando Subquery


Uma subquery de valor nico retorna apenas um valor e utiliza operadores relacionais (=, <>, >=, <=, !>, !<). WHERE A = (SELECT B...) - verdadeiro se A = B. operador de um nico valor Exemplo 1: Exibir o nome e o valor da gratificao das funes que tm a menor gratificao da empresa. SELECT nome, gratific FROM funo WHERE gratific = (SELECT MIN(gratific) FROM funo WHERE gratific <> 0) Exemplo 2: Exibir o cdigo, o nome e a quantidade em estoque do produto que tem a maior quantidade em estoque da empresa. SELECT cdigo, nome, quantest FROM produto WHERE quantest = (SELECT MAX(quantest) FROM produto)

Copyright 2000 - Nilton Freire Santos

SQL Uma

Consulta Completa com Duas Tabelas


Sintaxe: SELECT <campos> FROM <tabela1> [alias1] FULL [OUTER] JOIN <tabela2> [alias2] ON <condio de associao> Exemplo 1: Exibir a lista das funes com os respectivos nomes dos funcionrios que exercem cada uma delas, mesmo que exista funo sem funcionrio e funcionrio sem funo. SELECT fu.nome Funo, f.nome Funcionrio FROM funo fu FULL JOIN funcionrio f ON fu.cdigo = f.funo ORDER BY fu.nome, f.nome Sero exibidos os nomes de todas as funes com os respectivos nomes dos funcionrios que exercem cada uma. Para os casos onde a funo no tenha funcionrio, ser exibido NULL para o nome do funcionrio (coluna f.nome) e para os casos onde o funcionrio no tenha funo, ser exibido NULL para o nome da funo (fu.nome).

Copyright 2000 - Nilton Freire Santos

SQL Uma

Consulta Usando Subquery


Uma subquery de uma coluna retorna vrios valores. Utiliza IN ou operadores relacionais junto com ANY ou ALL. WHERE A IN (SELECT B...) verdadeiro se existe algum B = A. Exemplo 1: Exibir o cdigo, o nome e o telefone dos clientes estrangeiros. Usando subquery SELECT cdigo,nome,fone FROM cliente WHERE cidade IN (SELECT cdigo FROM cidade WHERE pas <> BRA) Usando JOIN SELECT c.cdigo,c.nome,c.fone FROM cliente c JOIN cidade ci ON ci.cdigo = c.cidade WHERE ci.pas <> BRA

Copyright 2000 - Nilton Freire Santos

SQL Uma

Consulta Usando Subquery


Exemplo 2: Exibir o cdigo, o nome e o preo de venda de todos os produtos que no sejam do tipo Bebidas ou Condimentos. Usando subquery SELECT cdigo, nome, venda FROM produto WHERE cdigo not IN (SELECT cdigo FROM tipo WHERE nome IN (Bebidas,Condimentos)) Usando JOIN SELECT p.cdigo,p.nome,p.venda FROM produto p JOIN tipo t ON p.tipo=t.cdigo WHERE t.nome not IN (Bebidas,Condimentos)

Copyright 2000 - Nilton Freire Santos

SQL Uma

Consulta Usando Subquery


WHERE A > ANY (SELECT B..)verdadeiro se existe A > algum B Exemplo 1: Exibir o nome, o tipo e o preo de venda dos produtos que no sejam dos tipos 3, 4 ou 5 e que tenham preo de venda maior que pelo menos o preo de um desses produtos. SELECT nome, tipo, venda FROM produto WHERE tipo not IN (3,4,5) and venda > ANY (SELECT venda FROM produto WHERE tipo IN (3,4,5)) Exemplo 2: Exibir o cdigo, a data, o frete e a via de transporte dos pedidos que no tenham sido despachados por via area ou terrestre mas que tenham o valor de frete maior do que o valor de pelo menos um dos pedidos despachados por via area. SELECT cdigo, datapedid, frete, via FROM pedido WHERE via NOT IN (A,T) and frete > ANY (SELECT frete FROM pedido WHERE via = A)

Copyright 2000 - Nilton Freire Santos

SQL Uma

Consulta Usando Subquery


WHERE A > ALL (SELECT B..) verdadeiro se existe A > todos B Exemplo 1: Exibir o nome, o tipo e o preo de venda dos produtos que no sejam dos tipos 3, 4 ou 5 e que tenham preo de venda maior que o preo de todos os produtos dos tipos 3, 4 ou 5. SELECT nome, tipo, venda FROM produto WHERE tipo not IN (3,4,5) and venda > ALL (SELECT venda FROM produto WHERE tipo IN (3,4,5)) Exemplo 2: Exibir o cdigo, a data, o frete e a via de transporte dos pedidos que no tenham sido despachados por via area ou terrestre mas que tenham o valor de frete maior do que o valor de todos os pedidos despachados por via area. SELECT cdigo, datapedid, frete, via FROM pedido WHERE via NOT IN (A,T) and frete > ALL (SELECT frete FROM pedido WHERE via = A)

Copyright 2000 - Nilton Freire Santos

SQL Uma

Consulta Usando Subquery


WHERE EXISTS (SELECT B...) - verdadeiro se existe pelo menos um valor para B (nmero de linhas diferente de 0). Exemplo 1: Exibir o nome e o salrio dos funcionrios que tm o salrio superior a R$ 2.000,00. SELECT f1.nome, f1.salrio FROM funcionrio f1 WHERE EXISTS (SELECT * FROM funcionrio f2 WHERE f2.salrio > $2000 and f1.cdigo=f2.cdigo) Exemplo 2: Exibir o cdigo dos clientes que fizeram pedido em agosto de 1996 e em junho de 1998. SELECT DISTINCT a.cliente FROM pedido a WHERE MONTH(a.datapedid)=08 and YEAR(a.datapedid)=1996 and EXISTS(SELECT * FROM pedido b WHERE MONTH(b.datapedid)=06 and YEAR(b.datapedid)=1998 and a.cliente = b.cliente)

Copyright 2000 - Nilton Freire Santos

SQL Uma

Consulta Usando Subquery


Exemplo 1: Exibir cdigo, nome e preo de venda do produto mais caro vendido na empresa. SELECT cdigo, nome, venda FROM produto WHERE venda =(SELECT MAX(venda) FROM produto) Exemplo 2: Exibir o cdigo, e a data do pedido; o nome, e o telefone clientes dos estados de Rio de Janeiro e So Paulo. SELECT p.cdigo, p.datapedid,c.nome,c.fone FROM pedido p JOIN cliente c ON p.cliente= c.cdigo WHERE cidade IN (SELECT cdigo FROM cidade WHERE uf IN (RJ,SP)) SELECT p.cdigo, p.datapedid,c.nome,c.fone FROM pedido p JOIN cliente c ON p.cliente= c.cdigo JOIN cidade ci ON ci.cdigo=c.cidade WHERE ci.uf IN (RJ,SP)

Copyright 2000 - Nilton Freire Santos

SQL Uma

Consulta Usando Subquery


Exemplo 3: Exibir o cdigo do pedido, o nome do cliente e o nome da cidade e a sigla do pas dos clientes que tenham feito pedido e no sejam da Alemanha nem da Inglaterra. SELECT p.cdigo,c.nome cliente,ci.nome cidade, ci.pas FROM pedido p JOIN cliente c ON p.cliente=c.cdigo JOIN cidade ci ON c.cidade=ci.cdigo WHERE ci.pas IN (SELECT sigla FROM pas WHERE nome not IN ('Alemanha','Inglaterra')) SELECT p.cdigo,c.nome cliente,ci.nome cidade, ci.pas FROM pedido p JOIN cliente c ON p.cliente=c.cdigo JOIN cidade ci ON c.cidade=ci.cdigo JOIN pas pa ON pa.sigla=ci.pas WHERE pa.nome not IN ('Alemanha','Inglaterra'))

Copyright 2000 - Nilton Freire Santos

SQL Uma

Consulta Usando Subquery


Exemplo 4: Exibir a mdia de salrio do setor que possui mais mulheres, exibindo tambm a quantidade de funcionrias e o nome do setor. SELECT AVG(salrio) Mdia,COUNT(*) Quant, setor FROM funcionrio WHERE sexo='F GROUP BY setor HAVING COUNT(*) >= ALL (SELECT COUNT(*) FROM funcionrio WHERE sexo='F' GROUP BY setor) Exemplo 5: Exibir o cdigo, o nome, o telefone, a data de nascimento e a idade do funcionrio homem mais velho da empresa. SELECT cdigo, nome, fone, datanasc, YEAR(GETDATE())-YEAR(datanasc) Idade funcionrio WHERE sexo = 'M' datanasc = (SELECT MIN(datanasc) funcionrio WHERE sexo = 'M') FROM and FROM

Copyright 2000 - Nilton Freire Santos

SQL Uma

Consulta Usando Subquery


Exemplo 6: Exibir o nome e a sigla do setor e o total de salrios dos funcionrios de cada setor da empresa onde estejam lotados Vendedores e Supervisores, ordenados pelo nome do setor em ordem ascendente. SELECT s.nome, s.sigla, SUM(f.salrio) Salrios FROM setor s JOIN funcionrio f ON s.sigla = f.setor WHERE funo IN (SELECT cdigo FROM funo WHERE nome LIKE '%Vendedor%' or nome LIKE '%Supervisor%') GROUP BY s.nome,s.sigla SELECT s.nome, s.sigla, SUM(f.salrio) Salrios FROM setor s JOIN funcionrio f ON s.sigla = f.setor JOIN funo fu ON fu.cdigo=f.funo WHERE fu.nome LIKE '%Vendedor%' or fu.nome LIKE '%Supervisor% GROUP BY s.nome,s.sigla

Copyright 2000 - Nilton Freire Santos

SQL Uma

Consulta Usando Subquery


Exemplo 5: Exibir o cdigo, a data do pedido, a data da fatura de todos os pedidos e o nome do funcionrio que atendeu os pedidos feitos pelos clientes do tipo pessoa jurdica que no sejam das cidades de Recife e Natal. Exibir tambm a quantidade de pedidos desses clientes por via de transporte. SELECT p.cdigo,p.datapedid,p.datafatura, f.nome vendedor, c.nome Cliente, via FROM pedido p JOIN funcionrio f ON f.cdigo = p.vendedor JOIN cliente c ON c.cdigo = p.cliente WHERE c.tipo = 'J' and c.cidade not IN (SELECT cdigo FROM cidade WHERE nome IN ('Recife','Natal')) order by via,cliente compute COUNT(p.cdigo) BY via, cliente

Copyright 2000 - Nilton Freire Santos

SQL Uma

Consulta com Criao de Tabela


Sintaxe: SELECT <campos> INTO <nova_tabela> FROM <tabela> Exemplo: Criar uma nova tabela que contenha o cdigo do pedido, o nome e o telefone do cliente que fez cada um deles. SELECT p.cdigo Pedido, c.nome Cliente, c.fone INTO Pedidos FROM pedido p JOIN cliente c ON c.cdigo = p.cliente A nova tabela chamada PEDIDOS ser criada no banco de dados contendo o cdigo do pedido, o nome e o telefone do cliente que fez cada um deles. Para criar uma tabela temporria necessrio colocar o caractere # iniciando o nome da tabela (#Pedidos para criar uma tabela local ou ##Pedidos para criar uma tabela global).

Copyright 2000 - Nilton Freire Santos

SQL Uma

Incluindo Dados
O comando INSERT inclui um registro ao final de uma tabela, contendo os valores de campo especificados.
Sintaxe:

INSERT [INTO] <tabela> [(lista de campos)] VALUES (<lista de valores>)


Argumentos:

<tabela>

Especifica a tabela na qual o registro ser includo. Especifica os campos da tabela onde os valores sero inseridos. A lista de campos opcional dever ser usada para inserir valores em apenas alguns campos.

<lista de campos>

VALUES (<lista de valores>) Copyright 2000 - Nilton Freire Santos

Especifica os valores dos campos a serem inseridos na tabela.

SQL Uma

Incluso Simples
Exemplo 1: Inserir o seguinte registro na tabela de cidades: cdigo: 91 - nome: Muria - uf: MG - pas: BRA INSERT cidade (cdigo, nome, uf, pas) VALUES (91,'Muria','MG','BRA') Exemplo 2: Inserir na tabela de setores o setor de Contabilidade, cuja sigla CON, o ramal 108, o setor superior Finanas (FIN) e o cdigo do chefe do setor 9. INSERT setor (sigla, nome, ramal, superior,chefe) VALUES ('COM','Contabilidade','108','FIN',9) Exemplo 3: Inserir o cliente Antonio Barbosa Leite, da Av. Rui Carneiro, 723 Joo Pessoa (cdigo 7). INSERT cliente (cdigo,nome,tipo,endereo,cidade) VALUES ('ANTBA','Antonio Barbosa Leite','F', 'Av. Rui Carneiro, 723',7)

Copyright 2000 - Nilton Freire Santos

SQL Uma

Incluindo Dados com Valor Default


IF EXISTS(SELECT table_name FROM information_schema.tables WHERE table_name = 'Tabela1') DROP TABLE tabela1 GO CREATE TABLE tabela1 ( coluna1 int IDENTITY, coluna2 varchar(40) NOT NULL CONSTRAINT DF_col2_tab1 DEFAULT ('valor default'), coluna3 int NULL, coluna4 varchar(30) NOT NULL) INSERT INTO tabela1 (coluna4) VALUES ('valor 1-4') INSERT INTO tabela1 (coluna2,coluna4) VALUES ('valor 2-2','valor 2-4') INSERT INTO tabela1 (coluna2,coluna3,coluna4) VALUES ('valor 3-2',33,'valor 3-4') INSERT INTO tabela1 DEFAULT VALUES

Copyright 2000 - Nilton Freire Santos

SQL Uma

Incluindo Dados com SELECT


IF EXISTS(SELECT table_name FROM information_schema.tables WHERE table_name = 'Tabela1') DROP TABLE tabela1 GO CREATE TABLE tabela1 ( coluna1 int IDENTITY, coluna2 varchar(40) NULL, coluna3 int NULL, coluna4 varchar(30) NULL) INSERT INTO tabela1 SELECT nome, sexo, endereo FROM funcionrio WHERE estcivil <> 'C'

Copyright 2000 - Nilton Freire Santos

SQL Uma

Incluindo Dados com SELECT


IF EXISTS(SELECT table_name FROM information_schema.tables WHERE table_name = 'Tabela1') DROP TABLE tabela1 GO CREATE TABLE tabela1 ( pedido smallint CONSTRAINT PK_tabela PRIMARY KEY, cliente varchar(40) NULL, vendedor varchar(40) NULL ) INSERT INTO tabela1 SELECT p.cdigo, c.nome, f.nome FROM pedido p JOIN cliente c ON c.cdigo = p.cliente JOIN funcionrio f ON f.cdigo = p.vendedor

Copyright 2000 - Nilton Freire Santos

SQL Uma

Alterando Dados
O comando UPDATE altera os valores armazenados nos registros de uma tabela.
Sintaxe:

UPDATE <tabela> SET <coluna1 = valor1 [,coluna2 = valor2,..., coluna n = valor n]> [WHERE <condio>]
Argumentos:

Especifica a tabela na qual os registros sero alterados. Especifica as colunas alteradas e seus novos valores .

<tabela>

SET <coluna1=valor1[,coluna2=valor2,...]> WHERE <condio>

Especifica as condies que precisam ser satisfeitas pelos registros que sero atualizados com os novos valores.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Alterao Simples
Exemplo 1: Criar uma coluna 'unidade' na tabela de produtos e colocar 'und' como contedo desta coluna para todos os registros. ALTER TABLE produto ADD unidade char(3) GO UPDATE produto SET unidade = 'und' Exemplo 2: Criar uma coluna 'novo salrio' na tabela de funcionrios e dar um aumento de 25% no salrio dos funcionrios casados e manter o salrio antigo para os demais funcionrios. ALTER TABLE funcionrio ADD novosalrio smallmoney GO UPDATE funcionrio SET novosalrio=salrio*1.25 WHERE estcivil = 'C' UPDATE funcionrio SET novosalrio=salrio WHERE estcivil != 'C'

Copyright 2000 - Nilton Freire Santos

SQL Uma

Alterao Simples
Exemplo 3: Aumentar o preo de venda em 32% e colocar o estoque mnimo em 10 para os produtos com quantidade em estoque menor que 10 unidades. UPDATE produto SET venda = venda*1.32, estmin=10 WHERE quantest < 10 Exemplo 4: Dar um aumento de 15% no salrio dos funcionrios homens, casados ou divorciados e que tenham nascido entre 01/01/50 e 31/12/70. Armazene os novos valores da coluna 'novosalrio'. UPDATE funcionrio SET novosalrio=salrio*1.15 WHERE sexo = 'M' and estcivil IN ('C','D') and datanasc BETWEEN '01/01/50' and '31/12/70'

Copyright 2000 - Nilton Freire Santos

SQL Uma

Alterao Usando Subquery


Exemplo 1: Dar um aumento de 18% no salrio dos funcionrios que tenham o salrio menor que a mdia de salrios da empresa. UPDATE funcionrio SET novosalrio=salrio*1.18 WHERE salrio < (SELECT AVG(salrio) FROM funcionrio) Exemplo 2: Baixar o preo em 12% dos produtos com preo de venda igual ao do produto mais caro vendido na empresa. UPDATE produto SET venda=venda*0.88 WHERE venda = (SELECT MAX(venda) FROM produto) Exemplo 3: Alterar de todos os funcionrios a funo 'Vendedor Primrio' para 'Vendedor Executivo'. UPDATE funcionrio SET funo = (SELECT cdigo FROM funo WHERE nome = 'Vendedor Executivo') WHERE funo = (SELECT cdigo FROM funo WHERE nome = 'Vendedor Primrio')

Copyright 2000 - Nilton Freire Santos

SQL Uma

Eliminando Dados
O comando DELETE elimina registros de uma tabela de acordo com as condies especificadas.
Sintaxe:

DELETE FROM <tabela> [WHERE <condio>]


Argumentos:

<tabela>

Especifica a tabela na qual os registros sero excludos.

WHERE <condio>

Especifica as condies que precisam ser satisfeitas pelos registros que sero eliminados. Se esta clusula for omitida, todos os registros da tabela sero eliminados.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Eliminao Simples
Exemplo 1: Excluir todos os clientes do tipo pessoa fsica que no possuam telefone DELETE FROM cliente WHERE tipo='F' and fone IS NULL Exemplo 2: Excluir todas as funcionrias casadas do setor 'MKT'. DELETE FROM funcionrio WHERE sexo = 'F' and estcivil = 'C' and setor = 'MKT' Exemplo 3: Excluir todos os produtos com quantidade em estoque maior que 100 ou preo de custo menor ou igual a R$ 10,00. DELETE FROM produto WHERE quantest > 100 or custo <= $10.00 Exemplo 4: Excluir todos os registros da tabela de tipos. DELETE FROM tipo

Copyright 2000 - Nilton Freire Santos

SQL Uma

Eliminao Usando Subquery


Exemplo 1: Excluir todos os produtos cujo tipo seja 'Condimentos' DELETE FROM produto WHERE tipo = (SELECT cdigo FROM tipo WHERE nome = 'Condimentos') Exemplo 2: Excluir todos os produtos com preo de venda superior mdia dos preos de venda dos produtos vendidos na empresa. DELETE FROM produto WHERE venda > (SELECT AVG(venda) FROM produto) Exemplo 3: Excluir todos os pedidos dos clientes dos estados de Paraba e Pernambuco. DELETE FROM pedido WHERE cliente IN (SELECT cdigo FROM cliente WHERE cidade IN (SELECT cdigo FROM cidade WHERE uf IN ('PB','PE')))

Copyright 2000 - Nilton Freire Santos

SQL Uma

Stored Procedures
Uma stored procedure (procedimento armazenado) consiste em um programa SQL que armazenado no banco de dados. Uma stored procedure composta por comandos SQL, SQL variveis e comandos de fluxo lgico. lgico Uma stored procedure pode ser executada manualmente ou ser chamada por outros programas. programas Uma stored procedure executada no servidor e o seu plano de execuo fica em memria, agilizando os acessos seguintes. memria Uma stored procedure aceita parmetros de entrada e pode retornar diversos valores como parmetros de sada. sada Uma stored procedure pode chamar outra stored procedure. So diferentes de funes pois no retornam um valor no lugar de seu nome nem podem ser usadas em expresses.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Stored Procedures
As stored procedures podem ser classificadas em: Stored Procedures definidas pelo usurio. System Stored Procedures: fazem parte do servidor e tm a Procedures finalidade de executar tarefas administrativas do SQL Server. Podem ser executadas de qualquer banco de dados e so armazenadas no banco de dados MASTER. Tm o nome comeando por sp_ e so agrupadas em diversas categorias. Uma stored procedure composta pelo seu nome,os parmetros e o corpo que contm os comandos Transact SQL. Os parmetros so responsveis por estabelecer a comunicao entre a procedure e o usurio do sistema. Um programa pode passar parmetros para uma stored procedure (entrada) e tambm receber parmetros como resultado (sada). Uma stored procedure pode ser utilizada por vrios programas.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Stored Procedures
Quando uma stored procedure criada, os seguintes passos so executados: iniciada a compilao da stored procedure e as suas partes componentes so analisadas sintaticamente. os componentes que fazem referncia a outros objetos do banco de dados so verificados quanto sua existncia. o nome da stored procedure armazenado na tabela sysobjects e o seu cdigo salvo em syscoments. um desenho tcnico da stored procedure (plano de consulta) criado e salvo na tabela sysprocedures. quando uma stored procedure executada pela primeira vez, otimizada na forma de um plano de execuo, armazenado no cache de procedimento. Nas prximas execues ela ser lida diretamente do cache e executada.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Criando Stored Procedures


Sintaxe:

CREATE PROCEDURE <nome> [parmetros][OUTPUT] AS <instruo SQL>


Exemplo:

CREATE PROCEDURE spTeste @cliente char(5), @quant smallint OUTPUT AS SELECT @quant=count(*) FROM pedido WHERE cliente=@cliente RETURN
criada uma stored procedure chamada sp_teste com um parmetro de entrada (@cliente) e um parmetro de sada (@quant). O comando SELECT atribui ao parmetro de sada a quantidade de pedidos realizados pelo cliente cujo cdigo seja igual ao parmetro de entrada.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Criando Stored Procedures


Regras para criar uma stored procedure: o nome deve seguir as regras utilizadas para identificadores. um parmetro deve possuir nome nico,comeando por @ (arroba), e possuir a definio de seu tipo de dado. uma stored procedure pode ter at 1024 parmetros. todos os parmetros criados so considerados como sendo de entrada. Os parmetros de sada contm a palavra OUTPUT aps a definio do parmetro, na sua criao. objetos referenciados devem existir quando a stored procedure for executada, podendo no existir no momento da criao. as stored procedures podem ser aninhadas at 32 nveis de profundidade. uma stored procedure no pode conter os seguintes comandos: CREATE DEFAULT, CREATE PROCEDURE, CREATE RULE, CREATE TRIGGER e CREATE VIEW.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Executando Stored Procedures


Sintaxe:

[EXEC[UTE]] <nome da sp> [valor parmetros] [,parmetro de sada] [OUTPUT]


Exemplo: Executar a stored procedure spTeste, criada no banco de dados SCP.

USE scp DECLARE @quant smallint EXECUTE spTeste ALFKI, @quant OUTPUT SELECT @quant [Quantidade]
O banco de dados SCP aberto e em seguida o parmetro de sada declarado. Em seguida o valor do parmetro de entrada passado para a stored procedure e o parmetro de sada definido. Por fim, o comando SELECT exibe o resultado da stored procedure.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Stored Procedures sem Parmetros


Exemplo 1: Criar uma stored procedure que exiba o nome do produto e o nome do tipo de cada produto vendido na empresa. CREATE PROCEDURE spProdutos AS SELECT p.nome [Produto], t.nome [Tipo] FROM produto p JOIN tipo T ON t.cdigo = p.tipo EXEC spProdutos Exemplo 2: Criar uma stored procedure que exiba o cdigo do pedido e o nome do cliente que fez cada um deles. CREATE PROCEDURE spPedidos AS SELECT p.cdigo [Pedido], c.nome [Cliente] FROM pedido p JOIN cliete c ON c.cdigo=p.cliente ORDER BY p.cdigo EXEC spPedidos

Copyright 2000 - Nilton Freire Santos

SQL Uma

Stored Procedures com Parmetros


Exemplo 3: Criar uma stored procedure que exiba o valor total de salrios pagos a um determinado setor da empresa. CREATE PROCEDURE spSalrios @setor char(3)AS SELECT SUM(salrio) Total FROM funcionrio WHERE setor = @setor EXECUTE spSalrios 'FIN' Exemplo 4: Criar uma stored procedure que execute a soma de dois nmeros inteiros e retorne o resultado em um parmetro. CREATE PROCEDURE spSoma1 @n1 smallint,@n2 smallint,@soma smallint OUTPUT AS SELECT @soma = @n1 + @n2 DECLARE @soma smallint EXEC spSoma 10,20,@soma OUTPUT SELECT Resultado =, @soma

Copyright 2000 - Nilton Freire Santos

SQL Uma

Stored Procedures com Parmetros


Exemplo 5: Criar a stored procedure da questo anterior, passando os parmetros por referncia e retornar o resultado em um parmetro de sada. CREATE PROCEDURE spSoma2 @n1 smallint,@n2 smallint,@soma smallint OUTPUT AS SELECT @soma = @n1 + @n2 DECLARE @resultado smallint EXEC spSoma2 @n1=10, @n2=20, @soma=@resultado OUTPUT SELECT Resultado =, @resultado Os parmetros de entrada so passados para a stored procedure por referncia e no mais por posio, como anteriormente. Isso feito especificando-se o nome do parmetro = valor no comando EXECUTE. Neste caso os parmetros podem ser passados em qualquer ordem.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Stored Procedures com Parmetros


Exemplo 6: Criar a stored procedure da questo 2, retornando o resultado em um parmetro de sada, sem declarar este parmetro. CREATE PROCEDURE spSoma3 @n1 smallint,@n2 smallint,@soma smallint SELECT @soma = @n1 + @n2 RETURN @soma DECLARE @resultado smallint EXEC @resultado = spSoma3 10,20,0 SELECT Resultado =, @resultado A palavra-chave RETURN passa uma varivel diretamente para o programa de chamada sem utilizar a instruo OUTPUT necessria para declarar o parmetro de sada. Isso feito especificando-se a varivel = nome da stored procedure no comando EXECUTE. Neste caso os parmetros de entrada devem ser definidos e a varivel de sada ser igual a zero. AS

Copyright 2000 - Nilton Freire Santos

SQL Uma

A Opo WITH RECOMPILE


A opo WITH RECOMPILE utilizada no CREATE PROCEDURE: o plano de execuo no ser salvo no cache de procedimento. a stored procedure ser recompilada toda vez que for executada e funciona de forma semelhante a uma consulta padro. pode ser til em stored procedures com parmetros que fazem o plano de execuo funcionar precariamente. sendo recompilada toda vez que executada, a stored procedure pode ser otimizada para os novos parmetros. Exemplo:

CREATE PROCEDURE spTeste @cliente char(5), @quant smallint OUTPUT WITH RECOMPILE AS SELECT @quant=count(*) FROM pedido WHERE cliente=@cliente Copyright 2000 - Nilton Freire Santos SQL Uma

A Opo WITH RECOMPILE


A opo WITH RECOMPILE utilizada no EXEC PROCEDURE: a stored procedure ser compilada para essa nica execuo. o novo plano de execuo armazenado no cache de procedimento. os comandos EXECUTE subseqentes utilizaro o plano de execuo armazenado no cache de procedimento. Exemplo:

DECLARE @quant smallint EXECUTE spTeste ALFKI, @quant OUTPUT WITH RECOMPILE SELECT @quant [Quantidade]
As stored procedures que fazem referncia a uma tabela podem ser foradas a serem recompiladas em tempo de execuo, atravs do comando EXEC sp_recompile <tabela>

Copyright 2000 - Nilton Freire Santos

SQL Uma

Stored Procedures
O texto utilizado no comando CREATE PROCEDURE pode ser obtido atravs da execuo da stored procedure sp_helptext, passando o nome da stored procedure como parmetro. Exemplo:

EXECUTE sp_helptext spTeste


Os objetos de que uma stored procedure depende podem ser vistos atravs da execuo da stored procedure sp_depends, passando o nome da stored procedure como parmetro. Exemplo:

EXECUTE sp_depends spPedidos


Uma stored procedure pode ser eliminada do banco de dados atravs do comando DROP PROCEDURE. Exemplo:

DROP PROCEDURE spPedidos Copyright 2000 - Nilton Freire Santos SQL Uma

Programao SQL
Um lote um conjunto de instrues SQL que so interpretadas juntas pelo SQL Server. A palavra-chave GO marca o fim de um lote. Se houver um erro de sintaxe em qualquer lugar do lote, o lote inteiro cancelado. cancelado As seguintes instrues CREATE podem ser associadas dentro de um mesmo lote: CREATE DATABASE, CREATE TABLE, CREATE INDEX As instrues CREATE abaixo no podem ser associadas com outras, dentro de um mesmo lote: CREATE RULE, CREATE TRIGGER, CREATE PROCEDURE, CREATE DEFAULT, CREATE VIEW. Um script um conjunto de um ou mais lotes.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Variveis
So objetos que podem armazenar valores do tipo especificado na declarao da varivel. So declaradas com DECLARE, a atribuio do nome, do tipo e do tamanho da varivel. Quando uma varivel criada, o seu valor inicial NULL. O nome deve ser iniciado por @.

DECLARE @nome varchar(30)


Recebem valores com SET ou SELECT.

DECLARE @quant tinyint,@cidade1 varchar(20), @cidade2 varchar(20) SET @quant = 10 SELECT @cidade1 = Joo Pessoa SELECT @cidade2 = (SELECT nome FROM cidade WHERE cdigo=4) SELECT @quant, @cidade1, @cidade2 Copyright 2000 - Nilton Freire Santos SQL Uma

IF ... ELSE
Estrutura condicional que impe condies para a execuo de alguns comandos SQL especificados. Sintaxe:

IF <condio> {comandos SQL} [ELSE {comandos SQL}]


A condio deve ser expressa por uma expresso lgica que retorna Verdadeiro ou Falso e pode conter um SELECT, que deve estar entre parnteses. Se a condio for verdadeira, os comandos SQL existentes antes do ELSE sero executados. Caso contrrio, os comandos SQL existentes depois do ELSE que sero executados.

Copyright 2000 - Nilton Freire Santos

SQL Uma

IF ... ELSE
Exemplo 1: Criar uma stored procedure para eliminar o produto cujo cdigo passado como parmetro se o seu tipo for igual a 4.

CREATE PROCEDURE spElimina @produto smallint AS IF 4 = (SELECT tipo FROM produto WHERE @produto = cdigo) DELETE FROM produto WHERE @produto=cdigo ELSE PRINT Produto no do tipo 4 EXECUTE spElimina 5 EXECUTE spElimina 6
O comando SELECT retorna o tipo do produto cujo cdigo seja igual ao valor fornecido pelo parmetro de entrada.

Copyright 2000 - Nilton Freire Santos

SQL Uma

IF ... ELSE
Exemplo 2: Criar uma stored procedure para eliminar o produto passado como parmetro se o seu tipo for igual a Laticnios.

CREATE PROCEDURE spElimina @produto smallint AS IF Laticnios = (SELECT t.nome FROM tipo t JOIN produto p ON t.cdigo =p.tipo WHERE p.cdigo = @produto ) BEGIN DELETE FROM produto WHERE @produto=cdigo PRINT Produto deletado! END ELSE PRINT Produto no do tipo Laticnios EXECUTE spElimina 1 EXECUTE spElimina 31 Copyright 2000 - Nilton Freire Santos SQL Uma

IF ... ELSE
Exemplo 3: Criar uma stored procedure que informe se o preo de venda de um determinado produto maior, menor ou igual mdia do preo de venda de todos os produtos da empresa.

CREATE PROCEDURE spPreo @produto smallint AS IF (SELECT venda FROM produto WHERE cdigo=@produto) < (SELECT AVG(venda) FROM produto) PRINT 'Preo menor que a mdia ELSE IF (SELECT venda FROM produto WHERE cdigo=@produto) > (SELECT AVG(venda) FROM produto) PRINT 'Preo maior que a mdia ELSE PRINT 'Preo igual a mdia' Copyright 2000 - Nilton Freire Santos SQL Uma

BEGIN ... END


Agrupa um conjunto de comandos SQL que so tratados como uma nica unidade. Sintaxe:

BEGIN {comandos SQL} END


Exemplo: Criar uma stored procedure que faa um reajuste no preo de venda do produto especificado, dando aumento se o preo for menor do que a mdia dos preos de venda de todos os produtos e dando desconto em caso contrrio. O cdigo do produto e os percentuais de aumento e desconto devem ser fornecidos como parmetros.

Copyright 2000 - Nilton Freire Santos

SQL Uma

BEGIN ... END


CREATE PROCEDURE spReajuste @produto smallint, @aum decimal(5,2), @des decimal(5,2) AS IF (SELECT venda FROM produto WHERE cdigo=@produto) < (SELECT AVG(venda) FROM produto) BEGIN UPDATE produto SET venda=venda*(1+@aum/100) WHERE cdigo=@produto PRINT Aumento efetuado END ELSE BEGIN UPDATE produto SET venda=venda*(1-@des/100) WHERE cdigo=@produto PRINT Desconto efetuado END Copyright 2000 - Nilton Freire Santos SQL Uma

WHILE
Estrutura de repetio que permite que um bloco de comandos SQL seja executado enquanto uma determinada condio for satisfeita. Sintaxe:

WHILE <condio> {comandos SQL} [BREAK {comandos SQL}] [CONTINUE {comandos SQL}]
A condio deve ser expressa por uma expresso lgica que retorna Verdadeiro ou Falso e pode conter um SELECT, que deve estar entre parnteses. BREAK causa a sada do loop. CONTINUE reinicia o loop.

Copyright 2000 - Nilton Freire Santos

SQL Uma

WHILE
Exemplo: Criar uma stored procedure para dar um aumento de salrio para os funcionrios da empresa, obedecendo as seguintes condies: a) os salrios s devero ser aumentados se a mdia salarial for inferior a um valor que ser fornecido como parmetro. b) esses salrios devero ser aumentados repetidas vezes at que o maior salrio pago na empresa no ultrapasse um valor que ser fornecido como parmetro. c) o percentual de aumento dos salrios tambm ser fornecido como parmetro.

Copyright 2000 - Nilton Freire Santos

SQL Uma

WHILE
CREATE PROCEDURE spAumento @media smallmoney, @maior smallmoney, @perc numeric(5,2) AS WHILE (SELECT AVG(salrio) FROM funcionrio) < @media BEGIN UPDATE funcionrio SET salrio=salrio*(1+@perc/100) IF (SELECT MAX(salrio) FROM funcionrio) >= @maior BREAK ELSE CONTINUE END SELECT AVG(salrio) [Mdia], MAX(salrio) [Maior salrio] FROM funcionrio Copyright 2000 - Nilton Freire Santos SQL Uma

Triggers
Um trigger um conjunto de comandos SQL que automaticaautomatica mente disparado quando um comando INSERT, UPDATE ou INSERT DELETE executado em uma tabela. Sua principal aplicao a criao de restries e consistncias de acesso ao banco de dados, como rotinas de segurana. Um trigger composto de trs partes: O nome, nico para cada banco de dados; nome A ao, como um comando INSERT, UPDATE ou DELETE; ao A execuo, execuo como um bloco de comandos SQL. Os triggers podem ser aninhados em at 16 nveis. nveis Os triggers no podem ser utilizados para tabelas temporrias ou vises. vises Quando uma tabela removida, os triggers associados a ela removida tambm sero. sero

Copyright 2000 - Nilton Freire Santos

SQL Uma

Triggers
Os triggers no tm parmetros e no podem ser explicitamente invocados. Eles so disparados quando os dados da tabela que est protegida pelo trigger so modificados. Os triggers sempre so considerados como parte de uma transao. Se falhar, os comandos sero revertidos (roll back). transao Quando um trigger executado, os resultados so retornados para a aplicao que o chamou. Um trigger pode executar comandos contidos em seu corpo ou acionar stored procedures e outros triggers. triggers No possvel criar um trigger para uma viso ou uma tabela temporria, mas um trigger pode fazer referncia a esses temporria objetos. Quando um trigger criado deve ser indicado se o valor da coluna referenciada antes ou depois da declarao do trigger.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Triggers
Quando um trigger executado, o SQL Server cria duas tabelas temporrias que ficam residentes na memria e existem apenas enquanto o trigger estiver ativo. As duas tabelas contm a mesma estrutura da tabela de base onde o trigger foi criado. Essas duas tabelas recebem o nome de INSERTED e DELETED. DELETED Quando um comando INSERT executado, o registro criado ser copiado para a tabela de base e para a tabela INSERTED. INSERTED Quando um comando UPDATE executado, o registro original (registro antigo) armazenado na tabela DELETED e o registro modificado (registro atual) armazenado na tabela de base e na tabela INSERTED. INSERTED Quando um comando DELETE executado, o registro excludo armazenado na tabela DELETED. DELETED

Copyright 2000 - Nilton Freire Santos

SQL Uma

Triggers
GIS RE TR NS OI

INSERT

TABELA DE BASE TABELA INSERTED TABELA DE BASE TABELA INSERTED TABELA DELETED SQL Uma
O

ID ER O AD ER REGISTRO ELIMINADO LT

GIS RE TR

OA

UPDATE

REGISTRO ORIGINAL

DELETE

Copyright 2000 - Nilton Freire Santos

Triggers
Sintaxe:

CREATE TRIGGER <nome> ON <tabela> FOR [INSERT][,][UPDATE][,][DELETE] AS <comandos SQL>


Exemplo: Criar um trigger que mostre a quantidade de linhas afetadas nas operaes de incluso, alterao e excluso realizadas na tabela PAS.

CREATE TRIGGER TrQuantLinhas ON pas FOR INSERT, UPDATE, DELETE AS SELECT 'Quantidade de linhas afetadas =',@@rowcount
@@ rowcount uma varivel global do SQL Server que retorna o nmero de linhas afetadas por um comando SQL.

Copyright 2000 - Nilton Freire Santos

SQL Uma

Exemplos de Triggers
Para executar os exemplos a seguir, criar uma nova tabela NOTAFISCAL e outra ITENSNOTA para armazenar as notas fiscais dos produtos vendidos, de acordo com o diagrama abaixo:

PRODUTO

ITENS NOTA

NOTA

Tabela NOTAFISCAL: cdigo smallint, ch.prim. valornota smallmoney, nulo Tabela ITENSNOTA: produto smallint, no nulo, ch. estr. notafiscal smallint, no nulo, ch. estr. quantidade smallint, no nulo valoritem smallmoney, nulo chave primria = produto + notafiscal

Copyright 2000 - Nilton Freire Santos

SQL Uma

Exemplos de Triggers
USE scp GO CREATE TABLE notafiscal ( cdigo smallint PRIMARY KEY, valornota smallmoney DEFAULT 0 ) GO CREATE TABLE itensnota ( notafiscal smallint NOT NULL FOREIGN KEY REFERENCES notafiscal(cdigo), produto smallint NOT NULL FOREIGN KEY REFERENCES produto(cdigo), quantidade smallint NOT NULL CHECK(quantidade > 0), valoritem smallmoney NULL, PRIMARY KEY (notafiscal,produto)) GO Copyright 2000 - Nilton Freire Santos SQL Uma

Trigger para Insero


Exemplo: Criar um trigger para insero na tabela ITENSNOTA que atualize o valor total de cada item (tabela ITENSNOTA) e o valor total da nota fiscal (tabela NOTAFISCAL), a partir da incluso dos itens de cada nota.
Tabela ITENSNOTA notafiscal produto quantidade valoritem

Tabela INSERTED notafiscal produto quantidade valoritem

Tabela NOTAFISCAL cdigo Tabela PRODUTO cdigo venda ... ... valornota

Copyright 2000 - Nilton Freire Santos

SQL Uma

Trigger para Insero


CREATE TRIGGER TrInclusoItemNota ON itensnota FOR INSERT AS UPDATE itensnota SET valoritem=(SELECT pr.venda * it.quantidade FROM produto pr JOIN inserted it ON pr.cdigo=it.produto) WHERE notafiscal = (SELECT notafiscal FROM inserted) and produto = (SELECT produto FROM inserted) UPDATE notafiscal SET valornota=valornota + (SELECT pr.venda*it.quantidade FROM produto pr JOIN inserted it ON pr.cdigo = it.produto) WHERE cdigo = (SELECT notafiscal FROM inserted) Copyright 2000 - Nilton Freire Santos SQL Uma

Trigger para Excluso


Exemplo: Criar um trigger para excluso na tabela NOTAFISCAL que elimine todos os itens relacionados (tabela ITENSNOTA) sempre que uma nota fiscal (tabela NOTAFISCAL) for eliminada.
Tabela NOTAFISCAL cdigo cdigo notafiscal valornota valornota produto quantidade valoritem Tabela DELETED Tabela ITENSNOTA

CREATE TRIGGER TrExcluiNotaFiscal ON NotaFiscal FOR DELETE AS DELETE ItensNota WHERE NotaFiscal=(SELECT cdigo FROM deleted) Copyright 2000 - Nilton Freire Santos SQL Uma

Trigger para Alterao


Exemplo: Criar um trigger para alterao na tabela ITENSNOTA que atualize o valor total de cada item (tabela ITENSNOTA) e o valor total da nota fiscal (tabela NOTAFISCAL), sempre que o produto ou a quantidade de cada item for alterada.
Tabela ITENSNOTA notafiscal produto quantidade valoritem

Tabela INSERTED notafiscal produto quantidade valoritem

Tabela NOTAFISCAL cdigo Tabela PRODUTO cdigo venda ... ... valornota

Copyright 2000 - Nilton Freire Santos

SQL Uma

Trigger para Alterao


CREATE TRIGGER TrAlteraItensNota ON itensnota FOR UPDATE AS IF UPDATE(produto) OR UPDATE(quantidade) BEGIN UPDATE itensnota SET valoritem = (SELECT pr.venda*it.quantidade FROM produto pr JOIN inserted it ON pr.cdigo=it.produto) WHERE notafiscal=(SELECT notafiscal FROM inserted) and produto = (SELECT produto FROM inserted) UPDATE notafiscal SET valornota = (SELECT SUM(valoritem) from itensnota WHERE notafiscal = (SELECT cdigo FROM inserted))WHERE cdigo = (SELECT cdigo FROM inserted) END Copyright 2000 - Nilton Freire Santos SQL Uma

Trigger Implementando Regras


Exemplo: Criar um trigger para insero na tabela ITENSNOTA que s permita a insero do item se a quantidade em estoque do produto (tabela PRODUTO) for maior do que a quantidade solicitada (tabela ITENSNOTA).
Tabela ITENSNOTA notafiscal produto quantidade valoritem

Tabela INSERTED notafiscal produto quantidade valoritem

Tabela PRODUTO cdigo venda ... ...

Copyright 2000 - Nilton Freire Santos

SQL Uma

Trigger Implementando Regras


CREATE TRIGGER TrChecaProduto ON itensnota FOR INSERT AS IF (SELECT pr.quantest FROM produto pr JOIN inserted it ON pr.cdigo=it.produto) < (SELECT it.quantidade FROM produto pr JOIN inserted it ON pr.cdigo=it.produto) BEGIN PRINT 'A quantidade em estoque insuficiente PRINT 'A incluso no foi realizada ROLLBACK TRANSACTION END

Copyright 2000 - Nilton Freire Santos

SQL Uma

Uma subquery de valor nico retorna apenas um valor e utiliza operadores relacionais (=, <>, >=, <=, !>, !<). WHERE A = (SELECT B...) - verdadeiro se A = B. operador de um nico valor Exemplo 1: Exibir o nome e o valor da gratificao das funes que tm a menor gratificao da empresa. SELECT nome, gratific FROM funo WHERE gratific = (SELECT MIN(gratific) FROM funo WHERE gratific <> 0) Exemplo 2: Exibir cdigo, nome, preo de venda e o preo mais caro pelo qual foi vendido cada produto da empresa. SELECT cdigo, nome,venda, (SELECT MAX(preo) FROM itens WHERE produto=p.cdigo) Vendido FROM produto p

Copyright 2000 - Nilton Freire Santos

SQL Uma

También podría gustarte