-- 1. Customers Tablosu
CREATE TABLE Customers (
CustomerID SERIAL PRIMARY KEY,
Name VARCHAR(100),
Email VARCHAR(100) UNIQUE,
RegistrationDate DATE
);
-- 2. Categories Tablosu
CREATE TABLE Categories (
CategoryID SERIAL PRIMARY KEY,
CategoryName VARCHAR(100)
);
-- 3. Products Tablosu
CREATE TABLE Products (
ProductID SERIAL PRIMARY KEY,
ProductName VARCHAR(100),
Price NUMERIC(10,2),
Stock INTEGER,
CategoryID INTEGER REFERENCES Categories(CategoryID)
);
-- 4. Orders Tablosu
CREATE TABLE Orders (
OrderID SERIAL PRIMARY KEY,
CustomerID INTEGER REFERENCES Customers(CustomerID),
OrderDate DATE,
TotalAmount NUMERIC(10,2)
);
-- 5. OrderItems Tablosu (N-N ilişkisini temsil eder)
CREATE TABLE OrderItems (
OrderItemID SERIAL PRIMARY KEY,
OrderID INTEGER REFERENCES Orders(OrderID),
ProductID INTEGER REFERENCES Products(ProductID),
Quantity INTEGER,
UnitPrice NUMERIC(10,2)
);
-- Müşteri Ekle
INSERT INTO Customers (Name, Email, RegistrationDate) VALUES ('Ahmet Yılmaz', 'ahmet@gmail.com', '2024-01-10');
-- Kategori Ekle
INSERT INTO Categories (CategoryName) VALUES ('Elektronik'), ('Kitap'), ('Giyim');
-- Ürün Ekle
INSERT INTO Products (ProductName, Price, Stock, CategoryID) VALUES
('Kulaklık', 150.00, 20, 1),
('Roman Kitabı', 45.00, 50, 2),
('Tişört', 80.00, 100, 3);
-- Sipariş Ekle
INSERT INTO Orders (CustomerID, OrderDate, TotalAmount) VALUES (1, '2024-03-01', 230.00);
-- Sipariş Kalemi Ekle
INSERT INTO OrderItems (OrderID, ProductID, Quantity, UnitPrice) VALUES (1, 1, 1, 150.00), (1, 2, 2, 45.00);
-- Müşteri E-posta güncelle
UPDATE Customers SET Email = 'ahmety@gmail.com' WHERE CustomerID = 1;
-- Ürün stok güncelle
UPDATE Products SET Stock = Stock - 3 WHERE ProductID IN (1, 2);
-- Kategori adı güncelle
UPDATE Categories SET CategoryName = 'Moda' WHERE CategoryID = 3;
-- Belirli bir siparişi sil
DELETE FROM Orders WHERE OrderID = 1;
-- Bir ürünü sil
DELETE FROM Products WHERE ProductID = 3;
-- Tüm müşterileri getir
SELECT * FROM Customers;
-- En son kayıt olan müşteriler
SELECT * FROM Customers ORDER BY RegistrationDate DESC LIMIT 5;
-- Stokta olan ürünleri listele
SELECT * FROM Products WHERE Stock > 0;
-- Ürün adında 'kitap' geçen ürünleri bul
SELECT * FROM Products WHERE ProductName ILIKE '%kitap%';
-- Ürünleri kategori adına göre listele
SELECT p.ProductName, c.CategoryName
FROM Products p
JOIN Categories c ON p.CategoryID = c.CategoryID;
-- Siparişlerle birlikte müşteri adı
SELECT o.OrderID, c.Name, o.TotalAmount
FROM Orders o
JOIN Customers c ON o.CustomerID = c.CustomerID;
-- Her müşterinin toplam sipariş sayısı
SELECT c.Name, COUNT(o.OrderID) AS SiparisSayisi
FROM Customers c
LEFT JOIN Orders o ON c.CustomerID = o.CustomerID
GROUP BY c.Name;
-- Her kategoride kaç ürün var
SELECT c.CategoryName, COUNT(p.ProductID) AS UrunSayisi
FROM Categories c
LEFT JOIN Products p ON p.CategoryID = c.CategoryID
GROUP BY c.CategoryName;
-- Toplam harcaması 100 TL’den fazla olan müşteriler
SELECT c.Name, SUM(o.TotalAmount) AS ToplamHarcama
FROM Customers c
JOIN Orders o ON c.CustomerID = o.CustomerID
GROUP BY c.Name
HAVING SUM(o.TotalAmount) > 100;
-- Sipariş başına ürün sayısı
SELECT o.OrderID, COUNT(oi.ProductID) AS UrunSayisi
FROM Orders o
JOIN OrderItems oi ON o.OrderID = oi.OrderID
GROUP BY o.OrderID;
-- Kategoriye göre ürün sayısı döndüren fonksiyon
CREATE FUNCTION GetProductCountByCategory(cat_id INT)
RETURNS INT AS $$
DECLARE
total INT;
BEGIN
SELECT COUNT(*) INTO total FROM Products WHERE CategoryID = cat_id;
RETURN total;
END;
$$ LANGUAGE plpgsql;
-- Yeni müşteri ekleyen prosedür
CREATE PROCEDURE AddNewCustomer(cust_name VARCHAR, cust_email VARCHAR)
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO Customers (Name, Email, RegistrationDate)
VALUES (cust_name, cust_email, CURRENT_DATE);
END;
$$;
-- Ürün stok 0’a düşerse uyarı tetikleyici
CREATE FUNCTION check_stock()
RETURNS TRIGGER AS $$
BEGIN
IF NEW.Stock < 1 THEN
RAISE NOTICE 'Stok tükendi!';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trg_check_stock
BEFORE UPDATE ON Products
FOR EACH ROW
EXECUTE FUNCTION check_stock();
-- Sipariş detaylarını gösteren görünüm
CREATE VIEW OrderDetails AS
SELECT o.OrderID, c.Name AS Customer, p.ProductName, oi.Quantity, oi.UnitPrice
FROM Orders o
JOIN Customers c ON o.CustomerID = c.CustomerID
JOIN OrderItems oi ON o.OrderID = oi.OrderID
JOIN Products p ON p.ProductID = oi.ProductID;
-- Sipariş ve sipariş kalemini birlikte ekleyen işlem
BEGIN;
INSERT INTO Orders (CustomerID, OrderDate, TotalAmount)
VALUES (1, CURRENT_DATE, 200.00);
INSERT INTO OrderItems (OrderID, ProductID, Quantity, UnitPrice)
VALUES (1, 1, 2, 100.00);
COMMIT;
-- Kullanıcı oluşturma (eğer destekleniyorsa)
CREATE USER read_only_user WITH PASSWORD '123456';
-- Sadece SELECT yetkisi verme
GRANT SELECT ON Customers TO read_only_user;