Lab8 Bazi

You might also like

Download as pptx, pdf, or txt
Download as pptx, pdf, or txt
You are on page 1of 30

.







, ,






,
, ,
. (views) ,
.
.
SELECT, INSERT

.
,
.
.


CREATE
VIEW, :
CREATE VIEW view_name [(column_list)]
AS
SELECT statement
[WITH CHECK OPTION]
: 1)
CREATE VIEW All_Employees_And_Customers
AS
SELECT FirstName+' '+LastName AS Name, CompanyName
FROM Employees e
LEFT JOIN Sales s ON e.EmployeeID = s.EmployeeID
FULL JOIN Customers c ON s.CustomerID = c.CustomerID

,
.
. , ,
,
. :
SELECT * FROM All_Employees_And_Customers
WHERE Name LIKE 'Ab%'
ORDER BY Name
,
.
.
.
GROUP BY
.
. ,
.

:2)
CREATE VIEW TotalForDay
AS
SELECT CONVERT(datetime,CONVERT(char(10),SaleDate,112))
AS DateOfSale,
COUNT(DISTINCT CustomerID) AS CustomersCount,
COUNT(DISTINCT EmployeeID) AS EmployeesCount,
COUNT(SaleID) AS SalesCount,
AVG(TotalForSale) AS AverageTotal,
SUM(TotalForSale) AS SumTotal
FROM Sales
GROUP BY CAST(CONVERT(char(10),SaleDate,112)AS datetime)

.
:
SELECT * FROM TotalForDay
SELECT * FROM TotalForDay
WHERE SumTotal=(SELECT MAX(SumTotal) FROM TotalForDay)
SELECT * FROM TotalForDay
WHERE SalesCount>=2 AND SumTotal>=1000

-, -.
:3)
CREATE VIEW MaxTotalForCustomer
AS
SELECT c.CustomerID, c.CompanyName, s.TotalForSale,
s.SaleDate
FROM Customers c
INNER JOIN Sales s ON c.CustomerID=s.CustomerID
WHERE TotalForSale =
( SELECT MAX(TotalForSale)
FROM Sales s1
WHERE s.CustomerID = s1.CustomerID )

.
:
SELECT * FROM MaxTotalForCustomer
WHERE CompanyName LIKE 'L%'

, UNION.
: 4)
CREATE VIEW CityPeople
AS
SELECT CustomerID AS ID, CompanyName, City,
'customer' AS Name
FROM Customers
UNION
SELECT SupplierID, CompanyName, City, 'supplier'
FROM Suppliers
,
.
:
SELECT * FROM CityPeople
WHERE City BETWEEN 'A' AND 'L'
ORDER BY City

ORDER BY .


. ORDER BY.
TOP n.
:
CREATE VIEW TopProductPrice
AS
SELECT TOP 3 WITH TIES ProductID, ProductName, Price
FROM Products
ORDER BY Price DESC
GO
SELECT * FROM TopProductPrice


SQL Server :
ALTER VIEW view_name [(column_list)]
AS
SELECT statement
[WITH CHECK OPTION]
,
ALTER VIEW.

DROP VIEW view_name

.


, ,
.
:
, .. INSERT UPDATE
,
. DELETE .
(INSERT)
(UPDATE) , , UNION,
GROUP BY DISTINCT, ,
.

,
. INSERT ,
, ,
,
, .
UPDATE. ,
WITH CHECK OPTION.

:1)
CREATE VIEW Customers_VT
AS
SELECT * FROM Customers
WHERE City = 'Veliko Tarnovo'
WITH CHECK OPTION
WITH CHECK OPTION ,
, .
:2)
CREATE VIEW Product_List
AS
SELECT ProductID, ProductName, Price,
Stock, ReorderLevel, Discontinued
FROM Products
WHERE Discontinued = 0

, :
3) CREATE VIEW ProductsForReorder
AS
SELECT *
FROM Product_List
WITH CHECK OPTION
:
UPDATE ProductsForReorder
SET Discontinued = 1
WHERE ProductID = 3
ProductsForReorder,
Product_List, .
:
DELETE FROM ProductsForReorder
WHERE ProductID = 12


,
SQL Server ,
( ,
).
,
, .. INSERT,
UPDATE DELETE.
.
,
.
,
.

,
INSERT, UPDATE DELETE.
INSERT,
UPDATE DELETE , (0,
1 ). , ,
,
@@ROWCOUNT.
:
CREATE TRIGGER trigger_name
ON table_name
FOR [DELETE][,][INSERT][,][UPDATE]
AS
sql_queries

,
, .
.
,
.

inserted deleted.
,
, .
inserted , , ..
.
deleted ,
.

:
ALTER TABLE table_name
DISABLE TRIGGER {ALL | trigger_name [,]}

ENABLE.
:
DROP TRIGGER trigger_name
:
ALTER TRIGGER trigger_name
ON table_name
FOR [DELETE][,][INSERT][,][UPDATE]
AS
sql_queries



,
sp_configure nested triggers.
1 (EXEC sp_configure 'nested triggers', 1),
,
32.
,
, (INSERT, UPDATE
DELETE) .

.
recursive triggers TRUE (EXEC
sp_dboption 'database_name', 'recursive triggers', TRUE).
FALSE.


SQL92
:
NO ACTION ,
FOREIGN KEY. ,
SQL Server 7.0 FOREIGN KEY.
SET NULL ,
NULL (
NULL).
SET DEFAULT ,
DEFAULT (
).
CASCADE ,
,
,
, .

NO ACTION
FOREIGN KEY, .
( 7.0 SQL Server).
.
,
, .. . -
FOREIGN KEY CREATE TABLE,
:
ALTER TABLE table_name
NOCHECK CONSTRAINT {ALL | constraint_name [,]}
, sp_help
table_name, .


1) ,
:
CREATE TRIGGER SaleHasCustomer
ON Sales
FOR INSERT, UPDATE
AS
IF @@ROWCOUNT = 0 RETURN
IF EXISTS
( SELECT *
FROM Inserted i
LEFT JOIN Customers c ON i.CustomerID = c.CustomerID
WHERE c.CustomerID IS NULL )
BEGIN
RAISERROR(' CustomerID.', 16, 1)
ROLLBACK TRANSACTION
END
GO

,
FOREIGN KEY
Sales :
ALTER TABLE Sales
NOCHECK CONSTRAINT FK_Sale_Customer
--------------------------------------------------------------INSERT INTO Sales (CustomerID, EmployeeID,
SaleDate,TotalForSale)
VALUES (45, 88, 2009-05-04, 3)

IF UPDATE(column_name)
, :
ALTER TRIGGER SaleHasCustomer
ON Sales
FOR INSERT, UPDATE
AS
IF @@ROWCOUNT = 0 RETURN
IF UPDATE (CustomerID)
IF EXISTS
( SELECT * FROM Inserted i
LEFT JOIN Customers c ON i.CustomerID = c.CustomerID
WHERE c.CustomerID IS NULL )
BEGIN
RAISERROR(' CustomerID.', 16, 1)
ROLLBACK TRANSACTION
END
GO


2) ,
:
CREATE TRIGGER CustomerHasSales
ON Customers
FOR DELETE
AS
IF @@ROWCOUNT = 0 RETURN
IF EXISTS
( SELECT *
FROM Deleted d
INNER JOIN Sales s ON d.CustomerID = s.CustomerID )
BEGIN
RAISERROR( .
!', 16, 1)
ROLLBACK TRANSACTION
END
-----------------------------------------------------------------------------DELETE FROM Customers
WHERE CustomerID = 3

3)
:
CREATE TRIGGER DelCascadeCustomer
ON Customers
FOR DELETE
AS
IF @@ROWCOUNT = 0 RETURN
DECLARE @count int
DELETE FROM Sales
FROM Sales s
INNER JOIN deleted d ON s.CustomerID = d.CustomerID
SET @count = @@ROWCOUNT
IF @count > 0
RAISERROR('%d Sales
Customers.', 11, 1, @count)

DELETE FROM Customers


WHERE CustomerID = 3

CustomerHasSales

4) SET DEFAULT ,
:
CREATE TRIGGER UpdateDefault_Cust
ON Customers
FOR UPDATE
AS
IF @@ROWCOUNT = 0 RETURN
DECLARE @count int
IF UPDATE ( CustomerID )
BEGIN
UPDATE Sales
SET CustomerID = DEFAULT
FROM Sales s
INNER JOIN deleted d ON s.CustomerID = d.CustomerID
SET @count = @@ROWCOUNT
IF @count > 0
RAISERROR(' %d Sales CustomerID

Customers.', 11, 1, @count)
END
, NULL DEFAULT
SET NULL

5) , ..
:
CREATE TRIGGER UpdateCascadeCustomers
ON Customers
FOR UPDATE
AS
DECLARE @num_affected int, @customerID int,
@old_customerID int
SET @num_affected = @@ROWCOUNT
IF @num_affected = 0 RETURN
IF UPDATE ( CustomerID )
BEGIN
IF @num_affected = 1
BEGIN
SELECT @customerID = CustomerID
FROM inserted
SELECT @old_customerID = CustomerID
FROM deleted
UPDATE Sales
SET CustomerID = @CustomerID
WHERE CustomerID = @old_customerID
SET @num_affected = @@ROWCOUNT

RAISERROR(' Customers %d %d %d
Sales.', 11, 1,@old_customerID, @customerID, @num_affected)
END
ELSE
BEGIN
RAISERROR('
,
.', 16, 1)
ROLLBACK TRANSACTION
END
END

, -
.
,
.
@@ROWCOUNT.
.

1. , ,
Products .
:

CREATE TRIGGER SaleDetailNotDiscontinued


ON SaleDetails
FOR INSERT, UPDATE
AS
IF @@ROWCOUNT = 0 RETURN
IF UPDATE ( ProductID )
BEGIN
IF EXISTS
( SELECT *
FROM Inserted i
INNER JOIN Products p ON i.ProductID = p.ProductID
WHERE p.Discontinued = 1 )
BEGIN
RAISERROR(' .', 16, 1)
ROLLBACK TRANSACTION
END
END

You might also like