MySQL Basics: A Comprehensive Guide
Database Operations
Create Database
CREATE DATABASE bookstore;
USE bookstore;
Show Databases
SHOW DATABASES;
Drop Database
DROP DATABASE IF EXISTS bookstore;
Table Operations
Create Table
CREATE TABLE books (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(100) NOT NULL,
author VARCHAR(100),
price DECIMAL(10,2),
publication_date DATE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Show Tables
SHOW TABLES;
DESCRIBE books; -- Show table structure
Modify Table
-- Add column
ALTER TABLE books ADD COLUMN category VARCHAR(50);
-- Modify column
ALTER TABLE books MODIFY COLUMN title VARCHAR(150);
-- Drop column
ALTER TABLE books DROP COLUMN category;
-- Rename table
RENAME TABLE books TO library_books;
Data Types
Numeric Types
-- Integers
TINYINT -- -128 to 127
SMALLINT -- -32768 to 32767
INT -- -2^31 to 2^31-1
BIGINT -- -2^63 to 2^63-1
-- Decimals
DECIMAL(10,2) -- Total 10 digits, 2 after decimal
FLOAT -- Approximate numeric
DOUBLE -- Double precision floating point
String Types
CHAR(10) -- Fixed length
VARCHAR(100) -- Variable length
TEXT -- Long text
ENUM('S','M','L') -- Enumerated list
Date/Time Types
DATE -- YYYY-MM-DD
TIME -- HH:MM:SS
DATETIME -- YYYY-MM-DD HH:MM:SS
TIMESTAMP -- Stored as UTC, converted to current timezone
CRUD Operations
Insert Data
-- Single row
INSERT INTO books (title, author, price)
VALUES ('The Great Gatsby', 'F. Scott Fitzgerald', 29.99);
-- Multiple rows
INSERT INTO books (title, author, price) VALUES
('1984', 'George Orwell', 24.99),
('Pride and Prejudice', 'Jane Austen', 19.99);
Select Data
-- Basic select
SELECT * FROM books;
-- Specific columns
SELECT title, author, price FROM books;
-- With conditions
SELECT * FROM books
WHERE price > 20.00
AND publication_date >= '2020-01-01';
-- Sorting
SELECT * FROM books
ORDER BY price DESC;
-- Limit results
SELECT * FROM books
LIMIT 10;
-- Grouping
SELECT author, COUNT(*) as book_count
FROM books
GROUP BY author;
Update Data
-- Update single column
UPDATE books
SET price = 25.99
WHERE id = 1;
-- Update multiple columns
UPDATE books
SET price = price * 1.1,
updated_at = CURRENT_TIMESTAMP
WHERE publication_date < '2020-01-01';
Delete Data
-- Delete specific records
DELETE FROM books
WHERE id = 1;
-- Delete all records
TRUNCATE TABLE books;
Constraints
Primary Key
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(100) UNIQUE,
name VARCHAR(100) NOT NULL
);
Foreign Key
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
total DECIMAL(10,2),
FOREIGN KEY (user_id) REFERENCES users(id)
);
Check Constraint
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
price DECIMAL(10,2) CHECK (price > 0)
);
Joins
Inner Join
SELECT o.id, u.name, o.total
FROM orders o
INNER JOIN users u ON o.user_id = u.id;
Left Join
SELECT u.name, COUNT(o.id) as order_count
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id;
Right Join
SELECT u.name, o.*
FROM orders o
RIGHT JOIN users u ON o.user_id = u.id;
Functions
String Functions
SELECT
CONCAT(first_name, ' ', last_name),
UPPER(email),
LENGTH(name),
SUBSTRING(description, 1, 100)
FROM users;
Numeric Functions
SELECT
ROUND(price, 2),
CEIL(price),
FLOOR(price),
ABS(balance)
FROM products;
Date Functions
SELECT
DATE_FORMAT(created_at, '%Y-%m-%d'),
DATEDIFF(NOW(), created_at),
DATE_ADD(NOW(), INTERVAL 1 MONTH),
YEAR(created_at)
FROM orders;
Aggregate Functions
SELECT
COUNT(*) as total_records,
AVG(price) as avg_price,
SUM(quantity) as total_quantity,
MAX(price) as highest_price,
MIN(price) as lowest_price
FROM products;
Indexing
Create Index
-- Single column index
CREATE INDEX idx_email ON users(email);
-- Composite index
CREATE INDEX idx_name_email ON users(name, email);
-- Unique index
CREATE UNIQUE INDEX idx_unique_email ON users(email);
Show Indexes
SHOW INDEX FROM users;
Drop Index
DROP INDEX idx_email ON users;
Best Practices
-
Always Use Proper Data Types
- Choose appropriate column types
- Use INT for IDs instead of VARCHAR
-
Indexing Guidelines
- Index frequently searched columns
- Don't over-index (slows down writes)
- Consider composite indexes for multiple column searches
-
Query Optimization
- Use EXPLAIN to analyze queries
- Avoid SELECT *
- Use appropriate JOINs
- Add WHERE clauses before GROUP BY
-
Security
- Use prepared statements
- Regular backups
- Proper user permissions
- Encrypt sensitive data