-- SELECT
SELECT * FROM users;
SELECT name, age FROM users WHERE age > 18 ORDER BY age DESC;
-- INSERT
INSERT INTO users (name, age) VALUES ('Alice', 25);
-- UPDATE
UPDATE users SET age = 26 WHERE name = 'Alice';
-- DELETE
DELETE FROM users WHERE age < 18;
-- JOINs
SELECT u.name, o.amount FROM users u
JOIN orders o ON u.id = o.user_id;
-- GROUP BY
SELECT department, COUNT(*) FROM employees GROUP BY department;
-- Subquery
SELECT name FROM users WHERE id IN (SELECT user_id FROM orders WHERE amount > 100);
Indexes & Keys
Indexes
Type
Description
Primary Key
Unique, not null, identifies row
Foreign Key
Links to another table's PK
Unique Key
Unique, can be null
Composite Key
Multiple columns as PK
Index
Speeds up search, not unique
-- Create Index
CREATE INDEX idx_name ON users(name);
-- Unique Key
ALTER TABLE users ADD CONSTRAINT unique_email UNIQUE(email);
-- Foreign Key
ALTER TABLE orders ADD CONSTRAINT fk_user FOREIGN KEY(user_id) REFERENCES users(id);
Normalization
Normalization
Form
Rule
1NF
Atomic values, unique rows
2NF
1NF + no partial dependency
3NF
2NF + no transitive dependency
BCNF
Stricter than 3NF
Denormalization: combining tables for performance, at the cost of redundancy.
Transactions & ACID
Transactions
Atomicity: All or nothing
Consistency: Valid state only
Isolation: No interference
Durability: Survives crash
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;
NoSQL Concepts
NoSQL
Type
Description
Example
Document
JSON/BSON docs
MongoDB
Key-Value
Simple pairs
Redis
Column
Column families
Cassandra
Graph
Nodes & edges
Neo4j
// MongoDB Insert
{
name: "Alice",
age: 25,
skills: ["SQL", "NoSQL"]
}
// Redis Set
SET user:1:name "Alice"
// Cassandra Table
CREATE TABLE users (id UUID PRIMARY KEY, name TEXT);
Popular Databases
Popular
DB
Type
Use Case
MySQL
Relational
Web, OLTP
PostgreSQL
Relational
Advanced SQL, GIS
SQLite
Relational
Embedded, Mobile
MongoDB
Document
Flexible, JSON
Redis
Key-Value
Cache, Realtime
Cassandra
Column
Big Data, Scalable
Neo4j
Graph
Relationships
Performance & Optimization
Performance
Use indexes for frequent queries
Analyze query plans (EXPLAIN)
Cache results (Redis, Memcached)
Partition/shard large tables
Replicate for high availability
Optimize schema for access patterns
EXPLAIN SELECT * FROM users WHERE email = 'a@b.com';
-- Create user with limited privileges
CREATE USER 'readonly'@'%' IDENTIFIED BY 'password';
GRANT SELECT ON dbname.* TO 'readonly'@'%';
-- Prevent SQL injection
SELECT * FROM users WHERE email = ?;