SQL
SQL
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
• Para saber mais... (create database)
https://learn.microsoft.com/pt-
CREATE DATABASE database_name br/sql/relational-databases/databases/create-a-
[ CONTAINMENT = { NONE | PARTIAL } ] database?view=sql-server-ver16
[ ON
[ PRIMARY ] <filespec> [ ,...n ] Para saber mais... (primary e filegroups)
[ , <filegroup> [ ,...n ] ] https://learn.microsoft.com/en-us/sql/relational-
databases/databases/database-files-and-
[ LOG ON <filespec> [ ,...n ] ]
filegroups?view=sql-server-ver16
]
[ COLLATE collation_name ]
[ WITH <option> [,...n ] ]
[;]
CREATE DATABASE db_NorthWind_Trader
ON
PRIMARY (NAME = 'db_NorthWind_Trader_data’,
FILENAME = ...\db_NorthWind_Trader_data.mdf’,
SIZE = 10 MB,
MAXSIZE = 100 MB,
FILEGROWTH = 5 % )
LOG ON (NAME = 'db_NorthWind_Trader_log’,
FILENAME = ...\db_NorthWind_Trader_data.ldf’,
SIZE = 10 MB,
MAXSIZE = 100 MB,
FILEGROWTH = 5 %)
COLLATE Latin1_General_CI_AI;
COLLATE Latin1_General_CI_AI;
Insensível ao acento (não diferencia o
caractere acentuado do não
acentuado – e.g., á e a são
considerados iguais do ponto de vista
de comparação)
CI:
Insensível ao caso (não diferencia
maiúsculas de minúsculas)
Latin1_General:
• Alfabeto Latino
Para saber mais... (collate)
• ISO-8859-1 https://learn.microsoft.com/en-us/sql/t-
• ç, Ç, á, é, í, â, ê,ã ...
sql/statements/collations?view=sql-server-
ver16
CREATE TABLE { database_name.schema_name.table_name
| schema_name.table_name
| table_name }
(
{ <column_definition> }
[ ,... n ]
[CONSTRAINT <constraint_name> PRIMARY KEY [CLUSTERED | NONCLUSTERED]
( <columns_names> ),]
[CONSTRAINT <constraint_name> FOREIGN KEY
(<reference_columnn_names>) REFERENCES <referenced_table>(<referenced_columns>),]
[CONSTRAINT <constraint_name> CHECK (<logic_expression>)]
)[;]
2 CONSTRAINT FK_GeneralAdvices_Customers
FOREIGN KEY (AdviceCreator) REFERENCES dbo.Customers (CustomerID),
2 CONSTRAINT FK_GeneralAdvices_Suppliers
FOREIGN KEY (Advicer) REFERENCES dbo.Suppliers (SupplierID),
3 CONSTRAINT CK_Dates
CHECK (AdviceEndDate IS NULL OR AdviceEndDate > AdviceStartDate))
(2) Define que o criador do aviso (cliente), se existir (3) Define uma restrição de domínio (no dado), a
algum, deve ser um Cliente, observe que o campo data de término da validade do aviso deve estar
AdviceCreator não é obrigatório indefinida ou ser menor que data de início
CREATE TABLE Employees (
EmployeeID int IDENTITY (1, 1) NOT NULL , (1) Define EmployeeID como chave primária
LastName nvarchar (20) NOT NULL , da tabela Employees
FirstName nvarchar (10) NOT NULL ,
Title nvarchar (30) NULL ,
TitleOfCourtesy nvarchar (25) NULL ,
BirthDate datetime NULL , (2) Define que o valor de ReportsTo é uma chave estrangeira a
HireDate datetime NULL , referenciando a própria tabela Employees. Isto indica que ReportsTo
pode ser um Employee (Funcionário) ou nada (por permitir nulo)
Address nvarchar (60) NULL ,
City nvarchar (15) NULL ,
Region nvarchar (15) NULL ,
PostalCode nvarchar (10) NULL ,
(3) Define uma restrição de domínio (no
Country nvarchar (15) NULL ,
dado), a data BirthDate tem que ser menor
HomePhone nvarchar (24) NULL , que a data corrente
Extension nvarchar (4) NULL ,
Photo image NULL ,
Notes ntext NULL ,
ReportsTo int NULL ,
PhotoPath nvarchar (255) NULL ,
1 CONSTRAINT PK_Employees PRIMARY KEY CLUSTERED (EmployeeID),
CONSTRAINT FK_Employees_Employees
FOREIGN KEY (ReportsTo) REFERENCES dbo.Employees (EmployeeID), 2
3 CONSTRAINT CK_Birthdate CHECK (BirthDate < getdate())
)
Vamos criar uma tabela para registrar sugestões dos cliente para fornecedores do
produto. A tabela deverá conter:
• o cliente (chave estrangeira para a tabela Customers)
• o fornecedor para quem a sugestão será enviada
• a data do registro da sugestão
• a descrição da sugestão
• a resposta dada pelo fornecedor
• a data da resposta do forncedor
Reflita:
Por quê as colunas Response e ResponseDate permitem “nulo”?
O registro da resposta (coluna Response) implica no registro da data de reposta, será possível registrar o valor para a data da resposta
de forma automática?
SELECT *
FROM Customers
WHERE CustomerID = 'FLOJA’
•
UPDATE Customers
SET Address = 'Rua Augusta, 2000, Loja 123'
WHERE CustomerID = 'FLOJA'
SELECT *
FROM Customers
WHERE CustomerID = 'FLOJA'
• →
Exemplo:
UPDATE Products
SET UnitPrice = UnitPrice - 6.0
CONSTRAINT CK_Products_UnitPrice
CHECK (UnitPrice >= 0)
Falha para uma linha, devido a restrição, então falha para todas.
•
SELECT *
FROM Products
WHERE CategoryID = 2 AND UnitPrice > 21.0
Seleção =>
Discontinued = 1 AND
UnitsInStock > 0
Restrição
É
Aplicada
Linha
Linha
Aplicada
Projeção
Sobre
Seleção
SELECT 1, 5 - 3, 198 / 4
SELECT 1, 5 - 3, 198.0 / 4
Lembre-se que a projeção, mesmo para constante e expressões, será apresentada para cada linha que
atender a restrição (se existir uma), se não existir restrição o resultado é uma linha com os valores
constantes e resultados de expressões da projeção
-- Estamos entendidos?
1. Operadores Lógicos (binários – AND e OR, e unário -- NOT – existem outros no SQL)
2. Expressões de Comparação (expressões com >, <, <=, >=, <> ou !=)
e.g. : NOT UnitPrice > 10.0 AND UnitsInStock < 29 OR ReorderLevel > 29
-- o NOT tem a maior precedência, seguido do AND e por último o OR
<nome da coluna ref> >= <primeiro valor dentro do intervalo> AND <nome da coluna ref> < <primeiro valor fora do intervalo>
SELECT *
FROM Products
WHERE UnitPrice >= 10.0 AND UnitPrice < 51.0
• Intervalos, datas e NULL
• Datas são representadas como texto (usando aspas simples):
SELECT *
FROM Orders
WHERE OrderDate >= '01/07/1996' AND OrderDate < '01/08/1996’
dd → dia
MM → mês
YYYY → ano
hh → hora
mm → minuto
ss → segundo
fff → milisegundo
SELECT *
FROM Products
WHERE ProductName >= 'GU' AND ProductName < 'GV’
https://learn.microsoft.com/pt-br/sql/t-sql/language-elements/null-and-unknown-transact-sql?view=sql-server-ver16
Expressões com NULL:
UNION
Sub-consultas é um
tópico para depois!!!
SELECT ProductName, OrderDate
FROM Orders O INNER JOIN [Order Details] OD
ON O.OrderID = OD.OrderID AND
OrderDate >= '25/07/1996' AND OrderDate < '26/07/1996’
ORDER BY ProductName
Observar
• Incluir todos os dados base da sua consulta com INNER JOIN e somente
depois aplicar o(s) OUTER(s) JOIN
SELECT ProductName, OrderDate
FROM Orders O INNER JOIN [Order Details] OD
ON O.OrderID = OD.OrderID AND Todas as vendas do dia
OrderDate >= '25/07/1996' AND OrderDate < '26/07/1996’ 25 de Julho de 1996
ORDER BY ProductName
SELECT ProductName, OrderDate
FROM Orders O INNER JOIN [Order Details] OD
Todos as vendas
ON O.OrderID = OD.OrderID
ORDER BY ProductName
*Todos os produtos já foram vendidos em alguma data, mas em 25/07/1996 apenas alguns
foram vendidos mas não todos
Então os “joins” vão retornar (se aplicados sem restrição) todos os produtos com
alguma data de venda, inclusive datas diferentes de 25/07/1996
A restrição com a data vai remover os produtos que não foram vendidos em 25/07/1996