MySQL CRUD Operations > A Complete Beginner's Guide

#database
single

Welcome to your comprehensive guide to MySQL database operations! If you're just starting your journey with databases, you're in the right place. In this article, we'll explore the fundamental operations that form the backbone of any database application: CRUD - Create, Read, Update, and Delete.

By the end of this guide, you'll understand how to build tables with proper constraints, insert data safely, query information efficiently, update records confidently, and delete data without breaking things. Let's dive in!

What is CRUD and Why Should You Care?

CRUD stands for the four basic operations of persistent storage:

  • Create - Adding new data to your database
  • Read - Retrieving and searching through your data
  • Update - Modifying existing data
  • Delete - Removing data

These operations are the foundation of virtually every application you've ever used. Social media posts, online shopping carts, user profiles - they all rely on CRUD operations behind the scenes.


Naming Conventions: Setting Yourself Up for Success

Before we dive into creating databases and tables, let's talk about naming conventions. Good naming conventions make your database easier to understand, maintain, and collaborate on. Here are the best practices:

Database Naming Conventions

  • Use lowercase letters
  • Use underscores to separate words (snake_case)
  • Be descriptive but concise
  • Avoid special characters and spaces

Good examples:

ecommerce_store
user_management
blog_platform
inventory_system

Bad examples:

MyDatabase         (mixed case)
e-commerce         (hyphens can cause issues)
user management    (spaces are problematic)
db1                (not descriptive)

Table Naming Conventions

  • Use lowercase letters
  • Use underscores for multiple words (snake_case)
  • Use plural nouns for table names (e.g., users, products, orders)
  • Be descriptive and specific

Good examples:

users
product_categories
order_items
customer_addresses
blog_posts

Bad examples:

UserTable          (mixed case, unnecessary suffix)
tbl_users          (unnecessary prefix)
user               (singular - prefer plural)
data               (too vague)

Column Naming Conventions

  • Use lowercase letters
  • Use underscores for multiple words (snake_case)
  • Be descriptive and specific
  • Use singular nouns for column names
  • Avoid abbreviations unless they're widely understood
  • Primary keys: typically id or table_name_id (e.g., user_id)
  • Foreign keys: use the referenced table name with _id (e.g., customer_id, product_id)
  • Boolean columns: use prefixes like is_, has_, can_ (e.g., is_active, has_permission)
  • Timestamps: use clear names like created_at, updated_at, deleted_at

Good examples:

id
first_name
last_name
email_address
is_active
created_at
updated_at
user_id           (foreign key)
order_total

Bad examples:

firstName         (camelCase)
FIRSTNAME         (all caps)
fName             (unclear abbreviation)
user_FirstName    (mixed conventions)
date              (too vague)
flag              (unclear meaning)

Quick Reference: Naming Convention Summary

ElementConventionExample
Databaselowercase, snake_caseecommerce_store
Tablelowercase, snake_case, pluralcustomer_orders
Columnlowercase, snake_case, singularemail_address
Primary Keyid or table_name_idid, user_id
Foreign Keyreferenced_table_idcustomer_id, product_id
Booleanis_, has_, can_ prefixis_active, has_permission
Timestamp_at suffixcreated_at, updated_at

Exploring Your Database: Essential Commands

Before we create tables, you need to know how to navigate your database environment. Here are the essential commands for exploring what's in your database.

Listing All Databases

To see all databases on your MySQL server:

SHOW DATABASES;

Example output:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| my_app_db          |
| test_database      |
+--------------------+

Creating and Using a Database

Create a new database:

CREATE DATABASE ecommerce_store;

Switch to use a specific database:

USE ecommerce_store;

See which database you're currently using:

SELECT DATABASE();

Listing All Tables

To see all tables in the current database:

SHOW TABLES;

Example output:

+---------------------------+
| Tables_in_ecommerce_store |
+---------------------------+
| customers                 |
| orders                    |
| products                  |
| order_items               |
+---------------------------+

Viewing Table Structure (Columns)

There are several ways to see the structure of a table:

Method 1: DESCRIBE (most common)

DESCRIBE table_name;

or the shorter version:

DESC table_name;

Example:

DESCRIBE customers;

Output:

+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| first_name  | varchar(100) | NO   |     | NULL    |                |
| last_name   | varchar(100) | NO   |     | NULL    |                |
| email       | varchar(255) | NO   | UNI | NULL    |                |
| is_active   | tinyint(1)   | NO   |     | 1       |                |
| created_at  | timestamp    | NO   |     | CURRENT_TIMESTAMP |      |
+-------------+--------------+------+-----+---------+----------------+

Method 2: SHOW COLUMNS

SHOW COLUMNS FROM table_name;

This produces the same output as DESCRIBE.

Method 3: SHOW CREATE TABLE (detailed)

To see the exact SQL used to create the table:

SHOW CREATE TABLE table_name;

Example:

SHOW CREATE TABLE customers;

This shows the complete CREATE TABLE statement, including all constraints and indexes.

Getting Detailed Table Information

To see table sizes and other metadata:

SHOW TABLE STATUS LIKE 'table_name';

To see all indexes on a table:

SHOW INDEXES FROM table_name;

Building Your First Table: Getting the Structure Right

Before we can perform any CRUD operations, we need a table to work with. But here's the thing - creating a table isn't just about defining columns and data types. We need to think about data integrity, default values, and unique identifiers. Let's build a proper table step by step.

The Basic Structure

Let's start by creating a simple cats table:

CREATE TABLE cats (
    cat_id INT AUTO_INCREMENT,
    name VARCHAR(100),
    breed VARCHAR(100),
    age INT,
    PRIMARY KEY (cat_id)
);

This is a good start, but we can make it much better by adding constraints that protect our data quality.

Understanding NULL: The Empty Value Problem

Here's something that trips up many beginners: NULL doesn't mean zero. NULL means "the value is not known" - it represents the absence of a value entirely.

Without proper constraints, you could end up with incomplete data:

-- This works but leaves age as NULL
INSERT INTO cats(name)
VALUES ('Bean');

-- This even works, leaving everything as NULL!
INSERT INTO cats()
VALUES ();

These empty records are usually not what you want. Let's fix this.

The NOT NULL Constraint: Making Fields Mandatory

When a field is essential to your data, use the NOT NULL constraint:

CREATE TABLE cats (
    cat_id INT AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    breed VARCHAR(100) NOT NULL,
    age INT NOT NULL,
    PRIMARY KEY (cat_id)
);

Now if someone tries to insert a cat without a name, the database will reject it. Much better!

DEFAULT Values: Sensible Fallbacks

Sometimes you want a field to have a default value if none is provided:

CREATE TABLE cats (
    cat_id INT AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL DEFAULT 'unnamed',
    breed VARCHAR(100) NOT NULL DEFAULT 'mixed',
    age INT NOT NULL DEFAULT 0,
    current_status VARCHAR(50) NOT NULL DEFAULT 'available',
    PRIMARY KEY (cat_id)
);

Pro Tip: You might wonder why we need both NOT NULL and DEFAULT. Here's why: without NOT NULL, someone could explicitly set a value to NULL, bypassing your default. Using both ensures data consistency.

Primary Keys: Your Unique Identifier

Imagine you have multiple cats named "Fluffy" in your database. How do you tell them apart? This is where primary keys come in.

A primary key is a unique identifier for each row in your table. Without it, you could have identical rows:

NameBreedAge
FluffyTabby3
FluffyTabby3
FluffyTabby3

With a primary key:

cat_idNameBreedAge
1FluffyTabby3
2FluffyTabby3
3FluffyTabby3

Now each row is uniquely identifiable! Here's how to define a primary key:

CREATE TABLE unique_cats (
    cat_id INT AUTO_INCREMENT,
    name VARCHAR(100),
    age INT,
    PRIMARY KEY (cat_id)
);

Important: Primary keys automatically include the NOT NULL constraint - they can never be NULL!

AUTO_INCREMENT: Let the Database Do the Counting

Manually assigning IDs is tedious and error-prone. Let the database handle it:

CREATE TABLE cats (
    cat_id INT AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    breed VARCHAR(100) NOT NULL,
    age INT NOT NULL,
    PRIMARY KEY (cat_id)
);

With AUTO_INCREMENT, the database automatically assigns 1, 2, 3, 4... to each new row. You never have to think about it!


Create: Adding Data to Your Tables

Now that we have a solid table structure, let's add some data!

Basic INSERT Syntax

The most straightforward way to add data:

INSERT INTO cats (name, breed, age)
VALUES ('Ringo', 'Tabby', 4);

Important Note: Both single quotes ' and double quotes " work in SQL for string values, but single quotes are more standard.

Order Matters!

When inserting data, the values must match the column order you specify:

INSERT INTO cats (age, name, breed)
VALUES (12, 'Victoria', 'Persian');

Here, 12 goes to age, 'Victoria' goes to name, and 'Persian' goes to breed. The order in your VALUES must match the order in your column list!

Formatting Options

SQL is flexible with formatting. All of these are valid:

-- One line
INSERT INTO cats(name, breed, age) VALUES ('Jetson', 'Siamese', 7);

-- Multi-line (easier to read)
INSERT INTO cats
    (name, breed, age)
VALUES
    ('Jetson', 'Siamese', 7);

Use whatever format makes your code more readable.

Inserting Multiple Rows at Once

Instead of writing multiple INSERT statements, combine them:

INSERT INTO cats(name, breed, age)
VALUES
    ('Ringo', 'Tabby', 4),
    ('Cindy', 'Maine Coon', 10),
    ('Dumbledore', 'Maine Coon', 11),
    ('Egg', 'Persian', 4),
    ('Misty', 'Tabby', 13),
    ('George Michael', 'Ragdoll', 9),
    ('Jackson', 'Sphynx', 7);

This is more efficient and cleaner than seven separate INSERT statements.

Checking for Errors

If something goes wrong, MySQL will tell you:

SHOW WARNINGS;

This command displays any errors or warnings from your last operation. It's incredibly useful when debugging!

Practical Exercise: Employees Table

Let's put it all together. Create an employees table with these requirements:

  • id - automatically increments, primary key
  • last_name - text, mandatory
  • first_name - text, mandatory
  • middle_name - text, optional
  • age - number, mandatory
  • current_status - text, mandatory, defaults to 'employed'

Here's the solution:

CREATE TABLE employees (
    id INT AUTO_INCREMENT PRIMARY KEY,
    last_name VARCHAR(100) NOT NULL,
    first_name VARCHAR(100) NOT NULL,
    middle_name VARCHAR(100),
    age INT NOT NULL,
    current_status VARCHAR(100) NOT NULL DEFAULT 'employed'
);

Notice how middle_name doesn't have NOT NULL - it's optional! Everything else is mandatory with sensible defaults where appropriate.


Read: Retrieving Your Data

Creating and inserting data is only half the battle. Now we need to retrieve it!

The SELECT Statement

The most basic query:

SELECT * FROM cats;

The * (asterisk) means "give me all columns." This returns everything in the table.

Selecting Specific Columns

You don't always need all columns. Be specific:

SELECT name FROM cats;
SELECT name, age FROM cats;
SELECT name, breed, age FROM cats;

Selecting only the columns you need makes your queries faster and your results cleaner.

The WHERE Clause: Getting Specific

The WHERE clause is your filter. It lets you specify exactly which rows you want:

SELECT * FROM cats WHERE age = 4;

This returns only cats that are 4 years old.

SELECT * FROM cats WHERE name = 'Egg';

This returns only cats named 'Egg'.

SELECT name, age FROM cats WHERE breed = 'Tabby';

This returns the name and age of all Tabby cats.

You can even compare columns to each other:

SELECT cat_id, age FROM cats WHERE cat_id = age;

This finds cats whose ID happens to match their age!

Using Aliases for Cleaner Output

Aliases make your results more readable:

SELECT cat_id AS id, name FROM cats;

Output:

+----+----------------+
| id | name           |
+----+----------------+
| 1  | Ringo          |
| 2  | Cindy          |
| 3  | Dumbledore     |
| 4  | Egg            |
+----+----------------+

The column is still cat_id in the database, but it displays as id in your results.

Practice Exercises

Try these queries on your own:

  1. Select name and breed for all cats:
SELECT name, breed FROM cats;
  1. Select just the Tabby cats (name and age):
SELECT name, age FROM cats WHERE breed = 'Tabby';
  1. Select cats where cat_id equals age:
SELECT cat_id, age FROM cats WHERE cat_id = age;

Update: Modifying Existing Data

Things change. Cats get older, people move, statuses update. Here's how to modify existing data.

UPDATE Syntax

The basic structure:

UPDATE cats SET age = 14
WHERE name = 'Misty';

This changes Misty's age to 14.

You can update multiple rows at once:

UPDATE cats SET breed = 'Shorthair'
WHERE breed = 'Tabby';

This changes ALL Tabby cats to Shorthair.

🛡️ The Golden Rule of Updates

ALWAYS SELECT BEFORE YOU UPDATE!

Before running an UPDATE, run a SELECT with the same WHERE clause:

-- First, check what you're about to change
SELECT * FROM cats WHERE breed = 'Tabby';

-- If it looks good, then update
UPDATE cats SET breed = 'Shorthair'
WHERE breed = 'Tabby';

This simple habit will save you from countless mistakes!

Update Exercises

Let's practice:

  1. Change Jackson's name to "Jack":
-- First verify
SELECT * FROM cats WHERE name = 'Jackson';

-- Then update
UPDATE cats SET name = 'Jack'
WHERE name = 'Jackson';
  1. Change Ringo's breed to "British Shorthair":
SELECT * FROM cats WHERE name = 'Ringo';

UPDATE cats SET breed = 'British Shorthair'
WHERE name = 'Ringo';
  1. Update both Maine Coons' ages to 12:
SELECT * FROM cats WHERE breed = 'Maine Coon';

UPDATE cats SET age = 12
WHERE breed = 'Maine Coon';

Delete: Removing Data

Sometimes you need to remove data from your database. But be careful - there's no undo button!

DELETE Syntax

The basic structure:

DELETE FROM cats WHERE name = 'Egg';

This removes the cat named Egg from your database.

⚠️ The Most Dangerous Command

DELETE FROM cats;

This deletes EVERYTHING! Without a WHERE clause, DELETE removes all rows from the table. The table structure remains, but all your data is gone.

🛡️ The Golden Rule of Deletes

Just like with UPDATE, ALWAYS SELECT BEFORE YOU DELETE!

-- First, see what you're about to delete
SELECT * FROM cats WHERE age = 4;

-- If you're sure, then delete
DELETE FROM cats WHERE age = 4;

Delete Exercises

Practice safe deletion:

  1. DELETE all 4 year old cats:
SELECT * FROM cats WHERE age = 4;
DELETE FROM cats WHERE age = 4;
  1. DELETE cats whose age equals their cat_id:
SELECT * FROM cats WHERE cat_id = age;
DELETE FROM cats WHERE cat_id = age;
  1. DELETE all cats (be careful!):
SELECT * FROM cats;  -- Review everything first
DELETE FROM cats;

Best Practices: Lessons from the Trenches

After working with CRUD operations, here are the key practices to always follow:

1. Design Tables with Constraints

Don't create tables with just column names and types. Use:

  • NOT NULL for mandatory fields
  • DEFAULT values for sensible fallbacks
  • PRIMARY KEY for unique identifiers
  • AUTO_INCREMENT for automatic ID generation

2. Always Test Before Modifying

Before any UPDATE or DELETE:

  1. Write a SELECT query with the same WHERE clause
  2. Review the results
  3. If everything looks correct, run the modification
  4. Verify the changes with another SELECT

3. Follow Naming Conventions

Use consistent, clear naming conventions:

  • lowercase with underscores (snake_case) for databases, tables, and columns
  • Plural names for tables (e.g., users, orders)
  • Descriptive column names (e.g., first_name, not fn or c1)
  • Boolean columns with is_, has_, can_ prefixes
  • Timestamp columns with _at suffix (e.g., created_at)

Your future self and teammates will thank you!

4. Be Specific with SELECT

Don't use SELECT * in production code. Specify the columns you need. It's faster and clearer.

5. Use Transactions for Critical Operations

For important changes, wrap them in transactions so you can roll back if something goes wrong (we'll cover this in advanced topics).

6. Check Warnings

After any operation, especially INSERT, run SHOW WARNINGS; to catch issues early.


Quick Reference Cheat Sheet

Here's everything we covered in quick reference format:

Table Creation

CREATE TABLE table_name (
    id INT AUTO_INCREMENT PRIMARY KEY,
    required_field VARCHAR(100) NOT NULL,
    optional_field VARCHAR(100),
    field_with_default VARCHAR(50) NOT NULL DEFAULT 'value'
);

CREATE (Insert)

-- Single row
INSERT INTO table_name (col1, col2) VALUES ('val1', 'val2');

-- Multiple rows
INSERT INTO table_name (col1, col2)
VALUES ('val1', 'val2'),
       ('val3', 'val4'),
       ('val5', 'val6');

READ (Select)

-- All columns, all rows
SELECT * FROM table_name;

-- Specific columns
SELECT col1, col2 FROM table_name;

-- With conditions
SELECT * FROM table_name WHERE condition;

-- With aliases
SELECT col1 AS alias_name FROM table_name;

UPDATE

-- Always select first!
SELECT * FROM table_name WHERE condition;

-- Then update
UPDATE table_name SET col1 = 'new_value'
WHERE condition;

DELETE

-- Always select first!
SELECT * FROM table_name WHERE condition;

-- Then delete
DELETE FROM table_name WHERE condition;

Utility Commands

-- Database Operations
SHOW DATABASES;                          -- List all databases
CREATE DATABASE database_name;           -- Create a new database
USE database_name;                       -- Switch to a database
SELECT DATABASE();                       -- Show current database
DROP DATABASE database_name;             -- Delete a database (careful!)

-- Table Operations
SHOW TABLES;                             -- List all tables in current database
DESCRIBE table_name;                     -- Show table structure
DESC table_name;                         -- Short version of DESCRIBE
SHOW COLUMNS FROM table_name;            -- Alternative to DESCRIBE
SHOW CREATE TABLE table_name;            -- Show the CREATE TABLE statement
SHOW TABLE STATUS LIKE 'table_name';     -- Show table metadata
SHOW INDEXES FROM table_name;            -- Show table indexes
DROP TABLE table_name;                   -- Delete a table (careful!)

-- Other Useful Commands
SHOW WARNINGS;                           -- Show warnings from last operation
SHOW ERRORS;                             -- Show errors from last operation

Conclusion: Your Next Steps

Congratulations! You now understand the fundamental operations that power every database application. You've learned how to:

✅ Follow proper naming conventions for databases, tables, and columns
✅ Navigate and explore databases using SHOW commands
✅ Create tables with proper constraints and data integrity
✅ Insert data safely and efficiently
✅ Query data with precision using WHERE clauses
✅ Update existing records confidently
✅ Delete data without disasters

These CRUD operations are just the beginning. As you continue your SQL journey, you'll learn about:

  • Complex queries with JOINs
  • Aggregate functions (COUNT, SUM, AVG)
  • Grouping and sorting data
  • Subqueries and nested queries
  • Database normalization
  • Indexes and performance optimization
  • Transactions and data integrity

But everything builds on these CRUD fundamentals. Practice them until they become second nature. Create sample tables, insert test data, and experiment with different queries. The more you practice, the more comfortable you'll become.

Remember: every expert was once a beginner who kept practicing. Happy coding! 🚀


Want to Practice?

Try creating a complete database system with proper naming conventions and CRUD operations:

Practice Project: Complete Blog System

Step 1: Create the database

CREATE DATABASE blog_platform;
USE blog_platform;

Step 2: Create tables with proper naming conventions

1. Blog Posts Table (blog_posts)

  • id - INT, auto increment, primary key
  • title - VARCHAR(200), not null
  • content - TEXT, not null
  • author_name - VARCHAR(100), not null
  • published_at - TIMESTAMP, nullable
  • is_published - BOOLEAN, default false
  • created_at - TIMESTAMP, default CURRENT_TIMESTAMP
  • updated_at - TIMESTAMP, default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

2. Products Table (products)

  • id - INT, auto increment, primary key
  • product_name - VARCHAR(150), not null
  • description - TEXT
  • price - DECIMAL(10,2), not null
  • stock_quantity - INT, not null, default 0
  • category - VARCHAR(50), not null
  • is_active - BOOLEAN, default true
  • created_at - TIMESTAMP, default CURRENT_TIMESTAMP

3. Students Table (students)

  • id - INT, auto increment, primary key
  • first_name - VARCHAR(50), not null
  • last_name - VARCHAR(50), not null
  • email - VARCHAR(255), not null, unique
  • enrollment_date - DATE, not null
  • major - VARCHAR(100)
  • is_active - BOOLEAN, default true
  • created_at - TIMESTAMP, default CURRENT_TIMESTAMP

Step 3: Practice exercises

  1. Create all three tables with proper constraints
  2. Use SHOW TABLES; and DESCRIBE table_name; to verify your structure
  3. Insert sample data (at least 5 rows per table)
  4. Practice SELECT queries with different WHERE conditions
  5. Update records and verify with SELECT
  6. Delete some test entries
  7. Use SHOW DATABASES; and explore your database structure

The more you practice with proper naming conventions and structure, the better you'll get!

thongvmdev_M9VMOt
WRITTEN BY

thongvmdev

Share and grow together