-- Barcha ma'lumotlarni olish
SELECT * FROM users;
-- Ma'lum ustunlarni olish
SELECT username, email, created_at FROM users;
-- Shartli qidirish
SELECT * FROM users WHERE is_active = TRUE;
-- Guruhlash va hisoblash
SELECT
COUNT(*) as total_users,
COUNT(CASE WHEN is_active = TRUE THEN 1 END) as active_users
FROM users;
-- Tartiblash
SELECT * FROM users ORDER BY created_at DESC;
-- Cheklash
SELECT * FROM users LIMIT 10 OFFSET 0;
🔗 JOIN So'rovlari
-- INNER JOIN
SELECT u.username, p.title, p.created_at
FROM users u
INNER JOIN posts p ON u.id = p.author_id;
-- LEFT JOIN
SELECT u.username, COUNT(p.id) as post_count
FROM users u
LEFT JOIN posts p ON u.id = p.author_id
GROUP BY u.id, u.username;
-- Murakkab so'rov
SELECT
u.username,
p.title,
c.content as comment,
c.created_at as comment_date
FROM users u
INNER JOIN posts p ON u.id = p.author_id
LEFT JOIN comments c ON p.id = c.post_id
WHERE p.status = 'published'
ORDER BY c.created_at DESC;
✏️ UPDATE - Ma'lumotlarni Yangilash
🔄 UPDATE So'rovlari
-- Bitta qatorni yangilash
UPDATE users
SET first_name = 'Johnny', last_name = 'Smith'
WHERE username = 'john_doe';
-- Ko'p qatorlarni yangilash
UPDATE users
SET is_active = FALSE
WHERE created_at < '2024-01-01';
-- Shartli yangilash
UPDATE posts
SET view_count = view_count + 1
WHERE id = 1;
-- Ma'lum ustunni NULL qilish
UPDATE users
SET bio = NULL
WHERE username = 'old_user';
-- Murakkab yangilash
UPDATE posts
SET status = 'published', updated_at = CURRENT_TIMESTAMP
WHERE author_id = 1 AND status = 'draft';
🔧 Python bilan UPDATE
def update_user_profile(user_id, first_name, last_name, bio):
try:
connection = psycopg2.connect(
host="localhost",
database="my_blog",
user="postgres",
password="your_password"
)
cursor = connection.cursor()
# Ma'lumotlarni yangilash
cursor.execute("""
UPDATE users
SET first_name = %s, last_name = %s, bio = %s, updated_at = CURRENT_TIMESTAMP
WHERE id = %s
""", (first_name, last_name, bio, user_id))
connection.commit()
if cursor.rowcount > 0:
print(f"Foydalanuvchi {user_id} muvaffaqiyatli yangilandi!")
else:
print("Foydalanuvchi topilmadi!")
except Error as e:
print(f"Xatolik: {e}")
finally:
if connection:
cursor.close()
connection.close()
# Funksiyani chaqirish
update_user_profile(1, 'John', 'Doe', 'Software Developer')
🗑️ DELETE - Ma'lumotlarni O'chirish
⚠️ DELETE So'rovlari
-- Bitta qatorni o'chirish
DELETE FROM users WHERE username = 'test_user';
-- Shartli o'chirish
DELETE FROM posts WHERE status = 'draft' AND created_at < '2024-01-01';
-- Barcha ma'lumotlarni o'chirish (EHTIYOT!)
DELETE FROM comments;
-- CASCADE o'chirish (bog'langan ma'lumotlar ham o'chiriladi)
DELETE FROM users WHERE id = 1;
-- Bu foydalanuvchining barcha postlari va kommentariyalari ham o'chiriladi
-- Soft delete (ma'lumotni o'chirmasdan, faqat belgilash)
UPDATE users SET is_active = FALSE WHERE id = 1;
🔧 Python bilan DELETE
def delete_user(user_id):
try:
connection = psycopg2.connect(
host="localhost",
database="my_blog",
user="postgres",
password="your_password"
)
cursor = connection.cursor()
# Avval bog'langan ma'lumotlarni tekshirish
cursor.execute("SELECT COUNT(*) FROM posts WHERE author_id = %s", (user_id,))
post_count = cursor.fetchone()[0]
if post_count > 0:
print(f"Ushbu foydalanuvchining {post_count} ta posti bor!")
choice = input("Davom etishni xohlaysizmi? (y/n): ")
if choice.lower() != 'y':
return
# Foydalanuvchini o'chirish
cursor.execute("DELETE FROM users WHERE id = %s", (user_id,))
connection.commit()
if cursor.rowcount > 0:
print(f"Foydalanuvchi {user_id} muvaffaqiyatli o'chirildi!")
else:
print("Foydalanuvchi topilmadi!")
except Error as e:
print(f"Xatolik: {e}")
finally:
if connection:
cursor.close()
connection.close()
# Funksiyani chaqirish
delete_user(1)
🔧 Kengaytirilgan CRUD Operatsiyalar
📊 Murakkab So'rovlar
-- Subquery bilan
SELECT * FROM users
WHERE id IN (
SELECT author_id FROM posts
WHERE status = 'published'
);
-- EXISTS bilan
SELECT u.username FROM users u
WHERE EXISTS (
SELECT 1 FROM posts p
WHERE p.author_id = u.id AND p.status = 'published'
);
-- Window functions
SELECT
username,
created_at,
ROW_NUMBER() OVER (ORDER BY created_at) as row_num,
LAG(created_at) OVER (ORDER BY created_at) as prev_user_date
FROM users;
-- CTE (Common Table Expression)
WITH user_stats AS (
SELECT
author_id,
COUNT(*) as post_count,
MAX(created_at) as last_post
FROM posts
GROUP BY author_id
)
SELECT u.username, us.post_count, us.last_post
FROM users u
INNER JOIN user_stats us ON u.id = us.author_id;
🔄 Batch Operations
def batch_insert_users(users_data):
try:
connection = psycopg2.connect(
host="localhost",
database="my_blog",
user="postgres",
password="your_password"
)
cursor = connection.cursor()
# Ko'p ma'lumotlarni bir vaqtda qo'shish
cursor.executemany("""
INSERT INTO users (username, email, first_name, last_name)
VALUES (%s, %s, %s, %s)
""", users_data)
connection.commit()
print(f"{len(users_data)} ta foydalanuvchi qo'shildi!")
except Error as e:
print(f"Xatolik: {e}")
finally:
if connection:
cursor.close()
connection.close()
# Ma'lumotlar
users_data = [
('user1', '[email protected]', 'User', 'One'),
('user2', '[email protected]', 'User', 'Two'),
('user3', '[email protected]', 'User', 'Three')
]
batch_insert_users(users_data)
💡 CRUD Best Practices
✅ Yaxshi Amaliyotlar
Prepared Statements - SQL injection'dan himoya
Transactions - Ma'lumotlar izchilligi
Error Handling - Xatoliklarni boshqarish
Connection Pooling - Samaradorlik
Indexing - Tez qidirish
⚠️ Ehtiyot Bo'lish
DELETE - Ma'lumotlarni yo'qotish
UPDATE - Noto'g'ri yangilash
Performance - Sekin so'rovlar
Security - Xavfsizlik
Backup - Nusxa olish
🔒 Xavfsiz CRUD Operatsiyalar
import psycopg2
from psycopg2.extras import RealDictCursor
class DatabaseManager:
def __init__(self):
self.connection = None
def connect(self):
try:
self.connection = psycopg2.connect(
host="localhost",
database="my_blog",
user="postgres",
password="your_password",
cursor_factory=RealDictCursor
)
return True
except Error as e:
print(f"Ulanish xatoligi: {e}")
return False
def execute_query(self, query, params=None):
try:
cursor = self.connection.cursor()
cursor.execute(query, params)
return cursor.fetchall()
except Error as e:
print(f"So'rov xatoligi: {e}")
return None
def execute_update(self, query, params=None):
try:
cursor = self.connection.cursor()
cursor.execute(query, params)
self.connection.commit()
return cursor.rowcount
except Error as e:
print(f"Yangilash xatoligi: {e}")
self.connection.rollback()
return 0
def close(self):
if self.connection:
self.connection.close()
# Ishlatish
db = DatabaseManager()
if db.connect():
# Xavfsiz so'rov
users = db.execute_query(
"SELECT * FROM users WHERE username = %s",
('john_doe',)
)
print(users)
db.close()
📝 Xulosa
🎯 O'rganilgan Mavzular
CREATE - Ma'lumot qo'shish (INSERT)
READ - Ma'lumotlarni o'qish (SELECT)
UPDATE - Ma'lumotlarni yangilash (UPDATE)
DELETE - Ma'lumotlarni o'chirish (DELETE)
Python bilan amalga oshirish
Best practices va xavfsizlik
✅ CRUD Afzalliklari
Ma'lumotlarni to'liq boshqarish
Moslashuvchan so'rovlar
Tez va samarali
Xavfsiz operatsiyalar
💡 Keyingi Qadamlar
ORM (SQLAlchemy) o'rganish
Database optimization
Advanced queries
Performance monitoring
🏆 Amaliy Mashq
To'liq CRUD funksiyalariga ega blog tizimi yarating!