🌿 What is CRUD Operations?
CRUD operations are the four basic functions that are considered essential for interacting with any database or persistent storage system. The acronym CRUD stands for:
Operation | SQL Command | Description |
|---|---|---|
Create |
| Add new records to the database |
Read |
| Retrieve data from the databaseUpdate |
Update |
| Modify existing data in the database |
Delete |
| Remove data from the database |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Students — CRUD Operations</title>
<style>
.infographic-crudrunner {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--good: #16a34a;
--good-soft: #dcfce7;
--bad: #dc2626;
--bad-soft: #fee2e2;
--on-accent: #ffffff;
--display-font: Georgia, 'Iowan Old Style', serif;
--body-font: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
--mono-font: 'SF Mono', Consolas, monospace;
background: var(--paper);
color: var(--ink);
font-family: var(--body-font);
max-width: 780px;
margin: 0 auto;
box-sizing: border-box;
overflow-x: hidden;
}
.infographic-crudrunner[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
--good: #4ade80;
--good-soft: #123420;
--bad: #f87171;
--bad-soft: #3a1414;
--on-accent: #101418;
}
.infographic-crudrunner * { box-sizing: border-box; }
.cr-topbar { display: flex; justify-content: flex-end; margin-bottom: 0.75rem; }
.cr-showfull-btn {
font: inherit;
font-size: 0.78rem;
background: none;
border: 1px solid var(--line);
border-radius: 999px;
padding: 0.35rem 0.8rem;
cursor: pointer;
color: var(--ink-soft);
}
.cr-showfull-btn:hover { border-color: var(--accent); color: var(--accent); }
.cr-showfull-btn.is-on { border-color: var(--accent); background: var(--accent-soft); color: var(--accent); }
.cr-fullcode-panel { display: none; margin-bottom: 1.25rem; }
.cr-fullcode-panel.is-visible { display: block; }
.cr-fullcode-scroll { overflow-x: auto; }
.cr-fullcode {
background: var(--ink);
color: #d4e2ff;
border-radius: 8px;
padding: 1rem 1.2rem;
font-family: var(--mono-font);
font-size: 0.76rem;
line-height: 1.7;
white-space: pre;
opacity: 0.85;
display: inline-block;
min-width: 100%;
}
.infographic-crudrunner[data-theme="dark"] .cr-fullcode { background: #05070a; }
.cr-frame {
background: var(--paper-alt);
border: 1px solid var(--line);
border-radius: 10px;
padding: 1.25rem;
}
.cr-kw { color: #9cc5ff; }
.cr-str { color: #f8d980; }
.cr-num { color: #4ade80; }
.cr-cm { color: #7c8aa8; }
.cr-step { display: none; margin-bottom: 1rem; }
.cr-step.is-revealed { display: block; animation: cr-step-in 0.4s ease; }
@keyframes cr-step-in { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: translateY(0); } }
.cr-step.is-done .cr-step-code-full { display: none; }
.cr-step.is-done .cr-step-done-pill { display: flex; }
.cr-step-done-pill {
display: none;
align-items: center;
gap: 0.5rem;
background: var(--good-soft);
color: var(--good);
border-radius: 7px;
padding: 0.55rem 0.85rem;
font-family: var(--mono-font);
font-size: 0.8rem;
cursor: pointer;
}
.cr-step-done-pill.is-danger-done { background: var(--bad-soft); color: var(--bad); }
.cr-step-done-pill .chevron { margin-left: auto; font-size: 0.7rem; opacity: 0.7; }
.cr-step.is-expanded-done .cr-step-code-full { display: block; }
.cr-step.is-expanded-done .cr-step-done-pill { background: var(--accent-soft); color: var(--accent); }
.cr-code-scroll { overflow-x: auto; }
.cr-code {
background: var(--ink);
color: #d4e2ff;
border-radius: 8px;
padding: 0.9rem 1.1rem;
font-family: var(--mono-font);
font-size: 0.8rem;
line-height: 1.7;
white-space: pre;
display: inline-block;
min-width: 100%;
}
.infographic-crudrunner[data-theme="dark"] .cr-code { background: #05070a; }
.cr-run-row { display: flex; justify-content: center; gap: 0.6rem; flex-wrap: wrap; margin-top: 0.85rem; }
.cr-run-btn {
font: inherit;
font-size: 0.85rem;
background: var(--accent);
color: var(--on-accent);
border: none;
border-radius: 7px;
padding: 0.6rem 1.1rem;
cursor: pointer;
}
.cr-run-btn:hover { opacity: 0.9; }
.cr-run-btn:disabled { opacity: 0.55; cursor: wait; }
.cr-run-btn.is-danger { background: var(--bad); }
.cr-run-btn.is-secondary { background: var(--paper); color: var(--ink); border: 1px solid var(--line); }
.cr-output-label { font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.05em; color: var(--ink-soft); margin: 1.1rem 0 0.6rem; display: none; }
.cr-output-label.is-visible { display: block; }
.cr-table-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; min-width: 0; display: none; }
.cr-table-scroll.is-visible { display: block; }
table.cr-table {
width: 100%;
min-width: 380px;
border-collapse: collapse;
background: var(--paper);
border-radius: 8px;
font-size: 0.88rem;
}
table.cr-table th, table.cr-table td {
border: 1px solid var(--line);
padding: 0.5rem 0.7rem;
text-align: left;
white-space: nowrap;
transition: background 0.3s, color 0.3s;
}
table.cr-table th { background: var(--accent); color: var(--on-accent); font-weight: 700; font-size: 0.75rem; }
table.cr-table tr.is-new td { animation: cr-row-in 0.4s ease; }
@keyframes cr-row-in { from { background: var(--good-soft); } to { background: transparent; } }
table.cr-table tr.is-updated td { background: var(--good-soft); }
table.cr-table tr.is-removing td { opacity: 0.35; text-decoration: line-through; background: var(--bad-soft); }
table.cr-table td.is-changed { color: var(--good); font-weight: 700; }
.cr-status {
text-align: center;
font-size: 0.83rem;
margin-top: 0.85rem;
padding: 0.55rem 0.8rem;
border-radius: 7px;
display: none;
}
.cr-status.is-visible { display: block; animation: cr-step-in 0.3s ease; }
.cr-status.st-good { color: var(--good); background: var(--good-soft); }
.cr-status.st-bad { color: var(--bad); background: var(--bad-soft); }
.cr-reset-row { display: flex; justify-content: center; margin-top: 1.25rem; }
@media (prefers-reduced-motion: reduce) {
.infographic-crudrunner *, .infographic-crudrunner *::before, .infographic-crudrunner *::after {
transition-duration: 0.001ms !important;
animation-duration: 0.001ms !important;
}
}
</style>
</head>
<body>
<div class="infographic-crudrunner" id="crudrunner">
<div class="cr-topbar">
<button class="cr-showfull-btn" id="crShowFullBtn" type="button">👁️ Show full SQL script</button>
</div>
<div class="cr-fullcode-panel" id="crFullCodePanel">
<div class="cr-fullcode-scroll">
<div class="cr-fullcode"><span class="cr-cm">-- Create: add the table, then add records</span>
<span class="cr-kw">CREATE TABLE</span> students (
id <span class="cr-kw">INT AUTO_INCREMENT PRIMARY KEY</span>,
name <span class="cr-kw">VARCHAR</span>(100) <span class="cr-kw">NOT NULL</span>,
age <span class="cr-kw">INT</span>,
grade <span class="cr-kw">VARCHAR</span>(5)
);
<span class="cr-kw">INSERT INTO</span> students (name, age, grade) <span class="cr-kw">VALUES</span>
(<span class="cr-str">'Alice'</span>, <span class="cr-num">18</span>, <span class="cr-str">'A'</span>),
(<span class="cr-str">'Bob'</span>, <span class="cr-num">17</span>, <span class="cr-str">'B'</span>),
(<span class="cr-str">'Charlie'</span>, <span class="cr-num">19</span>, <span class="cr-str">'A+'</span>);
<span class="cr-cm">-- Read: view the data</span>
<span class="cr-kw">SELECT</span> * <span class="cr-kw">FROM</span> students;
<span class="cr-cm">-- Update: change existing data</span>
<span class="cr-kw">UPDATE</span> students
<span class="cr-kw">SET</span> grade = <span class="cr-str">'A+'</span>
<span class="cr-kw">WHERE</span> name = <span class="cr-str">'Bob'</span>;
<span class="cr-cm">-- Delete: remove a record</span>
<span class="cr-kw">DELETE FROM</span> students
<span class="cr-kw">WHERE</span> name = <span class="cr-str">'Bob'</span>;</div>
</div>
</div>
<div class="cr-frame">
<!-- Step: CREATE -->
<div class="cr-step is-revealed" id="stepCreate">
<div class="cr-step-done-pill" data-step="Create"><span>✓ Create ran</span><span class="chevron">▾ view code</span></div>
<div class="cr-step-code-full">
<div class="cr-code-scroll">
<div class="cr-code"><span class="cr-cm">-- Create: add the table, then add records</span>
<span class="cr-kw">CREATE TABLE</span> students (
id <span class="cr-kw">INT AUTO_INCREMENT PRIMARY KEY</span>,
name <span class="cr-kw">VARCHAR</span>(100) <span class="cr-kw">NOT NULL</span>,
age <span class="cr-kw">INT</span>,
grade <span class="cr-kw">VARCHAR</span>(5)
);
<span class="cr-kw">INSERT INTO</span> students (name, age, grade) <span class="cr-kw">VALUES</span>
(<span class="cr-str">'Alice'</span>, <span class="cr-num">18</span>, <span class="cr-str">'A'</span>),
(<span class="cr-str">'Bob'</span>, <span class="cr-num">17</span>, <span class="cr-str">'B'</span>),
(<span class="cr-str">'Charlie'</span>, <span class="cr-num">19</span>, <span class="cr-str">'A+'</span>);</div>
</div>
<div class="cr-run-row">
<button class="cr-run-btn" id="crCreateBtn" type="button">▶ Run Create</button>
</div>
</div>
</div>
<!-- Step: READ -->
<div class="cr-step" id="stepRead">
<div class="cr-step-done-pill" data-step="Read"><span>✓ Read ran</span><span class="chevron">▾ view code</span></div>
<div class="cr-step-code-full">
<div class="cr-code-scroll">
<div class="cr-code"><span class="cr-cm">-- Read: view the data</span>
<span class="cr-kw">SELECT</span> * <span class="cr-kw">FROM</span> students;</div>
</div>
<div class="cr-run-row">
<button class="cr-run-btn" id="crReadBtn" type="button">▶ Run Read</button>
</div>
</div>
</div>
<!-- Step: UPDATE -->
<div class="cr-step" id="stepUpdate">
<div class="cr-step-done-pill" data-step="Update"><span>✓ Update ran</span><span class="chevron">▾ view code</span></div>
<div class="cr-step-code-full">
<div class="cr-code-scroll">
<div class="cr-code"><span class="cr-cm">-- Update: change existing data</span>
<span class="cr-kw">UPDATE</span> students
<span class="cr-kw">SET</span> grade = <span class="cr-str">'A+'</span>
<span class="cr-kw">WHERE</span> name = <span class="cr-str">'Bob'</span>;</div>
</div>
<div class="cr-run-row">
<button class="cr-run-btn" id="crUpdateBtn" type="button">▶ Run Update</button>
</div>
</div>
</div>
<!-- Step: DELETE -->
<div class="cr-step" id="stepDelete">
<div class="cr-step-done-pill is-danger-done" data-step="Delete"><span>✓ Delete ran</span><span class="chevron">▾ view code</span></div>
<div class="cr-step-code-full">
<div class="cr-code-scroll">
<div class="cr-code"><span class="cr-cm">-- Delete: remove a record</span>
<span class="cr-kw">DELETE FROM</span> students
<span class="cr-kw">WHERE</span> name = <span class="cr-str">'Bob'</span>;</div>
</div>
<div class="cr-run-row">
<button class="cr-run-btn is-danger" id="crDeleteBtn" type="button">▶ Run Delete</button>
</div>
</div>
</div>
<p class="cr-status" id="crStatus"></p>
<p class="cr-output-label" id="crOutputLabel">Table: students</p>
<div class="cr-table-scroll" id="crTableScroll">
<table class="cr-table" id="crTable">
<thead><tr><th>id</th><th>name</th><th>age</th><th>grade</th></tr></thead>
<tbody id="crTableBody"></tbody>
</table>
</div>
<div class="cr-reset-row">
<button class="cr-run-btn is-secondary" id="crReset" type="button">↺ Reset</button>
</div>
</div>
</div>
<script>
(function () {
const wrapper = document.getElementById('crudrunner');
const bodyAttr = document.body.getAttribute('data-darkmode');
let dark;
if (bodyAttr === 'true') {
dark = true;
} else if (bodyAttr === 'false') {
dark = false;
} else {
const match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
})();
/* show full code toggle */
(function () {
const btn = document.getElementById('crShowFullBtn');
const panel = document.getElementById('crFullCodePanel');
btn.addEventListener('click', () => {
const on = panel.classList.toggle('is-visible');
btn.classList.toggle('is-on', on);
btn.textContent = on ? '👁️ Hide full SQL script' : '👁️ Show full SQL script';
});
})();
/* done-pill expand/collapse for finished steps */
(function () {
document.querySelectorAll('.cr-step-done-pill').forEach(pill => {
pill.addEventListener('click', () => {
const step = pill.closest('.cr-step');
step.classList.toggle('is-expanded-done');
pill.querySelector('.chevron').textContent = step.classList.contains('is-expanded-done') ? '▴ hide code' : '▾ view code';
});
});
})();
(function () {
const rows = [
{ id: 1, name: 'Alice', age: 18, grade: 'A' },
{ id: 2, name: 'Bob', age: 17, grade: 'B' },
{ id: 3, name: 'Charlie', age: 19, grade: 'A+' }
];
const stepCreate = document.getElementById('stepCreate');
const stepRead = document.getElementById('stepRead');
const stepUpdate = document.getElementById('stepUpdate');
const stepDelete = document.getElementById('stepDelete');
const createBtn = document.getElementById('crCreateBtn');
const readBtn = document.getElementById('crReadBtn');
const updateBtn = document.getElementById('crUpdateBtn');
const deleteBtn = document.getElementById('crDeleteBtn');
const resetBtn = document.getElementById('crReset');
const tbody = document.getElementById('crTableBody');
const tableScroll = document.getElementById('crTableScroll');
const outputLabel = document.getElementById('crOutputLabel');
const status = document.getElementById('crStatus');
function showStatus(text, kind) {
status.textContent = text;
status.className = 'cr-status is-visible st-' + kind;
}
function markDone(stepEl) { stepEl.classList.add('is-done'); }
function revealNext(stepEl) {
stepEl.classList.add('is-revealed');
stepEl.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
}
function rowHtml(r) {
return '<td>' + r.id + '</td><td>' + r.name + '</td><td>' + r.age + '</td><td class="grade-cell">' + r.grade + '</td>';
}
createBtn.addEventListener('click', () => {
createBtn.disabled = true;
createBtn.textContent = 'Running...';
tbody.innerHTML = '';
outputLabel.classList.add('is-visible');
tableScroll.classList.add('is-visible');
setTimeout(() => {
rows.forEach((r, i) => {
setTimeout(() => {
const tr = document.createElement('tr');
tr.className = 'is-new';
tr.dataset.name = r.name;
tr.innerHTML = rowHtml(r);
tbody.appendChild(tr);
if (i === rows.length - 1) {
showStatus('✔️ Table created, 3 rows inserted.', 'good');
markDone(stepCreate);
revealNext(stepRead);
}
}, i * 200);
});
}, 350);
});
readBtn.addEventListener('click', () => {
readBtn.disabled = true;
readBtn.textContent = 'Running...';
setTimeout(() => {
tbody.querySelectorAll('tr').forEach((tr, i) => {
setTimeout(() => {
tr.classList.remove('is-new');
void tr.offsetWidth;
tr.classList.add('is-new');
}, i * 100);
});
showStatus('✔️ 3 rows returned.', 'good');
markDone(stepRead);
revealNext(stepUpdate);
}, 300);
});
updateBtn.addEventListener('click', () => {
updateBtn.disabled = true;
updateBtn.textContent = 'Running...';
const bobRow = tbody.querySelector('tr[data-name="Bob"]');
bobRow.classList.add('is-updated');
setTimeout(() => {
const gradeCell = bobRow.querySelector('.grade-cell');
gradeCell.textContent = 'A+';
gradeCell.classList.add('is-changed');
showStatus('✔️ 1 row updated — Bob\u2019s grade is now A+.', 'good');
markDone(stepUpdate);
revealNext(stepDelete);
}, 500);
});
deleteBtn.addEventListener('click', () => {
deleteBtn.disabled = true;
deleteBtn.textContent = 'Running...';
const bobRow = tbody.querySelector('tr[data-name="Bob"]');
bobRow.classList.remove('is-updated');
bobRow.classList.add('is-removing');
setTimeout(() => {
bobRow.remove();
showStatus('❌ 1 row deleted — Bob is gone from the table.', 'bad');
markDone(stepDelete);
}, 600);
});
resetBtn.addEventListener('click', () => {
tbody.innerHTML = '';
tableScroll.classList.remove('is-visible');
outputLabel.classList.remove('is-visible');
status.classList.remove('is-visible');
[stepCreate, stepRead, stepUpdate, stepDelete].forEach(s => {
s.classList.remove('is-done', 'is-expanded-done');
});
stepCreate.classList.add('is-revealed');
[stepRead, stepUpdate, stepDelete].forEach(s => s.classList.remove('is-revealed'));
createBtn.disabled = false;
createBtn.textContent = '▶ Run Create';
readBtn.disabled = false;
readBtn.textContent = '▶ Run Read';
updateBtn.disabled = false;
updateBtn.textContent = '▶ Run Update';
deleteBtn.disabled = false;
deleteBtn.textContent = '▶ Run Delete';
});
})();
</script>
</body>
</html>.demo {
font-family: system-ui, sans-serif;
padding: 16px;
}
.demo h1 {
color: #2563eb;
margin: 0 0 8px;
}
.demo p {
color: #4b5563;
margin: 0;
}document.querySelector('.demo h1')?.addEventListener('click', () => {
alert('Hello from live preview!');
});🍀 Why CRUD is Important:
CRUD operations form the foundation of all web and software applications that rely on databases—such as:
Online banking
Social media platforms
E-commerce websites
Library management systems