📊 Schema Bazei de Date
Schema reprezintă structura unui magazin online cu 4 tabele principale interconectate:
🔨 Creare Tabele
Pentru a crea structura bazei de date, executăm următoarele comenzi SQL în ordine:
1. Tabelul CUSTOMERS
CREATE TABLE customers ( id INT PRIMARY KEY AUTO_INCREMENT, email VARCHAR(100) UNIQUE NOT NULL, password VARCHAR(100) NOT NULL, full_name VARCHAR(100) NOT NULL, billing_address VARCHAR(100), default_shipping_address VARCHAR(100), country VARCHAR(40), phone VARCHAR(40) );
2. Tabelul PRODUCTS
CREATE TABLE products ( id INT PRIMARY KEY AUTO_INCREMENT, sku INT UNIQUE NOT NULL, name VARCHAR(40) NOT NULL, price INT NOT NULL, weight INT, descriptions VARCHAR(200), thumbnail VARCHAR(100), image VARCHAR(100), category VARCHAR(40), create_date DATE DEFAULT CURRENT_DATE, stock INT DEFAULT 0 );
3. Tabelul ORDERS
CREATE TABLE orders ( id INT PRIMARY KEY AUTO_INCREMENT, customer_id INT NOT NULL, ammount INT NOT NULL, shipping_address VARCHAR(100), order_address VARCHAR(100), order_email VARCHAR(100), order_date DATE DEFAULT CURRENT_DATE, order_status VARCHAR(40) DEFAULT 'pending', FOREIGN KEY (customer_id) REFERENCES customers(id) );
4. Tabelul ORDER_DETAILS
CREATE TABLE order_details ( id INT PRIMARY KEY AUTO_INCREMENT, order_id INT NOT NULL, product_id INT NOT NULL, price INT NOT NULL, sku INT, quantity INT DEFAULT 1, FOREIGN KEY (order_id) REFERENCES orders(id), FOREIGN KEY (product_id) REFERENCES products(id) );
📝 Populare cu Date
După crearea tabelelor, le populăm cu date de test pentru a putea exersa query-uri:
Inserare Clienți (Exemple)
INSERT INTO customers (email, password, full_name, billing_address, country, phone) VALUES ('ion.popescu@gmail.com', MD5('parola123'), 'Ion Popescu', 'Str. Victoriei 10, București', 'România', '0721234567'), ('maria.ionescu@yahoo.com', MD5('maria456'), 'Maria Ionescu', 'Bd. Eroilor 12, Cluj', 'România', '0734567890'), ('andrei.stan@outlook.com', MD5('andrei789'), 'Andrei Stan', 'Str. Libertății 45, Timișoara', 'România', '0745678901');
Inserare Produse (Exemple)
INSERT INTO products (sku, name, price, weight, descriptions, category, stock) VALUES (1001, 'Laptop ASUS ROG', 4500, 2300, 'Gaming laptop RTX 3060', 'Laptopuri', 15), (2001, 'iPhone 15 Pro', 7300, 221, 'Flagship Apple 256GB', 'Telefoane', 20), (3001, 'iPad Pro 12.9', 6000, 682, 'Tableta M2 256GB', 'Tablete', 8);
🔍 30 SELECT-uri Utile
SELECT * FROM customers;
SELECT name, price, stock FROM products WHERE stock > 0;
SELECT * FROM orders ORDER BY order_date DESC LIMIT 10;
SELECT * FROM customers WHERE email = 'ion.popescu@gmail.com';
SELECT * FROM products WHERE category = 'Laptopuri';
SELECT o.id, c.full_name, o.ammount, o.order_date, o.order_status FROM orders o INNER JOIN customers c ON o.customer_id = c.id;
SELECT o.id, c.full_name, p.name, od.quantity, od.price FROM orders o JOIN customers c ON o.customer_id = c.id JOIN order_details od ON od.order_id = o.id JOIN products p ON p.id = od.product_id WHERE o.id = 1;
SELECT o.*, p.name AS product_name FROM orders o JOIN order_details od ON o.id = od.order_id JOIN products p ON p.id = od.product_id WHERE o.customer_id = 1;
SELECT DISTINCT p.name, p.price FROM products p INNER JOIN order_details od ON p.id = od.product_id;
SELECT c.* FROM customers c LEFT JOIN orders o ON c.id = o.customer_id WHERE o.id IS NULL;
SELECT SUM(ammount) AS total_sales FROM orders WHERE order_status = 'completed';
SELECT order_status, COUNT(*) AS count FROM orders GROUP BY order_status;
SELECT c.full_name, SUM(o.ammount) AS total_spent FROM customers c JOIN orders o ON c.id = o.customer_id GROUP BY c.id ORDER BY total_spent DESC LIMIT 5;
SELECT * FROM products WHERE price = (SELECT MAX(price) FROM products);
SELECT category, AVG(price) AS avg_price FROM products GROUP BY category;
SELECT * FROM products WHERE price BETWEEN 1000 AND 5000 ORDER BY price;
SELECT * FROM products WHERE name LIKE '%Laptop%';
SELECT * FROM orders WHERE order_date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY);
SELECT name, stock FROM products WHERE stock < 5 AND stock > 0;
SELECT full_name, email, phone FROM customers WHERE country = 'România';
SELECT MONTH(order_date) AS month, YEAR(order_date) AS year, COUNT(*) AS total_orders, SUM(ammount) AS total_revenue FROM orders WHERE order_status = 'completed' GROUP BY YEAR(order_date), MONTH(order_date);
SELECT p.* FROM products p WHERE NOT EXISTS ( SELECT 1 FROM order_details od WHERE od.product_id = p.id );
SELECT p.name, COUNT(od.id) AS times_sold, SUM(od.quantity) AS total_quantity FROM products p JOIN order_details od ON p.id = od.product_id GROUP BY p.id ORDER BY times_sold DESC;
SELECT c.full_name, COUNT(o.id) AS total_orders, AVG(o.ammount) AS avg_order_value FROM customers c JOIN orders o ON c.id = o.customer_id GROUP BY c.id HAVING COUNT(o.id) > 0;
SELECT email, COUNT(*) AS count FROM customers GROUP BY email HAVING COUNT(*) > 1;
UPDATE products SET stock = stock - 1 WHERE id = 1 AND stock > 0;
DELETE FROM orders WHERE order_status = 'cancelled' AND order_date < DATE_SUB(CURDATE(), INTERVAL 1 YEAR);
CREATE TABLE customers_backup AS SELECT DISTINCT c.* FROM customers c INNER JOIN orders o ON c.id = o.customer_id;
CREATE INDEX idx_orders_customer ON orders(customer_id); CREATE INDEX idx_orders_status ON orders(order_status); CREATE INDEX idx_products_category ON products(category);
DESCRIBE products; -- sau SHOW COLUMNS FROM products;
📚 Exerciții Practice
Testează-ți cunoștințele cu aceste exerciții progresive:
🟢 Nivel Începător
1. Afișează toate produsele care costă mai mult de 3000 lei
2. Găsește clientul cu ID-ul 5
3. Listează toate comenzile cu status "pending"
4. Afișează primele 3 produse din categoria "Telefoane"
5. Calculează numărul total de clienți
🟡 Nivel Intermediar
1. Găsește toate comenzile plasate de "Ion Popescu"
2. Calculează valoarea totală a stocului pentru fiecare categorie
3. Afișează produsele comandate de mai mult de 3 ori
4. Găsește clientul care a cheltuit cel mai mult
5. Listează produsele care nu sunt în stoc dar au fost comandate
🔴 Nivel Avansat
1. Creează un raport cu top 3 produse din fiecare categorie după vânzări
2. Găsește clienții care au comandat din toate categoriile
3. Calculează rata de conversie (clienți cu comenzi / total clienți)
4. Identifică produsele cu preț peste media categoriei lor
5. Creează un view cu comenzile și profitul estimat (20% din valoare)
🏆 Provocări Expert
1. Implementează un trigger pentru actualizare automată stoc
2. Creează o procedură stocată pentru raport lunar complet
3. Dezvoltă un sistem de recomandări bazat pe istoric comenzi
4. Optimizează toate query-urile pentru o bază cu 1M înregistrări
5. Creează un dashboard SQL cu KPI-uri principale
Soluții Exemple (Nivel Începător)
SELECT name, price, category FROM products WHERE price > 3000 ORDER BY price DESC;
SELECT * FROM customers WHERE id = 5;
Resurse Adiționale
- Practică zilnic cu date reale
- Studiază planurile de execuție (EXPLAIN)
- Învață despre normalizarea bazelor de date
- Explorează funcții avansate: Window Functions, CTEs
- Optimizează performanța cu indexuri corecți