0 / 12
🎓 MySQL Course

ស្វៀតស្វាញ MySQL
ពីមូលដ្ឋានដល់ Expert

មេរៀននេះជួយអ្នករៀន MySQL ដោយគ្រប់ជំហាន — ចាប់ពីការបង្កើត Database រហូតដល់ Stored Procedure, Transaction, និង Performance Tuning។

12
មេរៀន
3
កម្រឹត
50+
Code Examples
🟢 កម្រឹតចាប់ផ្តើម
  • MySQL គឺជាអ្វី?
  • CREATE DATABASE / TABLE
  • Data Types ទូទៅ
  • INSERT, SELECT
  • WHERE, AND, OR, LIKE
🟡 កម្រឹតមធ្យម
  • INNER / LEFT / RIGHT JOIN
  • GROUP BY, HAVING, COUNT
  • UPDATE, DELETE, TRUNCATE
  • Subquery & Nested Query
🟣 កម្រឹតខ្ពស់
  • INDEX & Query Optimization
  • Stored Procedure & Function
  • Triggers & Views
  • Transaction & ACID
  • User Permission & Security
💡 ត្រូវការអ្វី?
  • MySQL Server (≥ 8.0)
  • MySQL Workbench ឬ phpMyAdmin
  • ចំណេះដឹងពី Computer មូលដ្ឋាន
🟢 Basic — មេរៀនទី ១

មូលដ្ឋាន MySQL

ស្វែងយល់ពី MySQL គឺជាអ្វី, ហេតុអ្វីត្រូវប្រើ, និង Data Types ដែលប្រើញឹកញាប់។

MySQL គឺជាអ្វី?

MySQL គឺជា Relational Database Management System (RDBMS) ដែលប្រើ SQL (Structured Query Language) ដើម្បីគ្រប់គ្រងទិន្នន័យ។ វាត្រូវបានប្រើដោយក្រុមហ៊ុន Facebook, Twitter, YouTube និងច្រើនទៀត។

💡

MySQL ជា Open Source, រហ័ស, ជឿទុកចិត្ត និងងាយរៀន — ល្អបំផុតសម្រាប់ Web Applications។

Data Types ដែលប្រើញឹកញាប់
Typeការប្រើប្រាស់ឧទាហរណ៍
INTលេខចំនួនគត់អាយុ, ID
VARCHAR(n)អក្សរ (អថេរ)ឈ្មោះ, អាសយដ្ឋាន
TEXTអក្សរវែងDescription, Content
DECIMAL(p,s)លេខទសភាគតម្លៃ, ប្រាក់
DATEកាលបរិច្ឆេទថ្ងៃខែឆ្នាំ
DATETIMEកាលបរិច្ឆេទ + ពេលវេលាCreated_at
BOOLEANTrue/FalseStatus, Active
ENUMជម្រើសថេរ'male','female'
ការ Login MySQL
🖥️ TERMINAL
-- Login ចូល MySQL
mysql -u root -p

-- បញ្ជាក់ Host
mysql -h localhost -u root -p

-- មើល version
SELECT VERSION();

-- មើល databases ទាំងអស់
SHOW DATABASES;
🟢 Basic — មេរៀនទី ២

CREATE Database & Table

រៀនបង្កើត Database, Table, និងកំណត់ Primary Key, Constraints។

CREATE DATABASE
🗄️ SQL
-- បង្កើត Database
CREATE DATABASE school_db;

-- ជ្រើស Database
USE school_db;

-- លុប Database
DROP DATABASE IF EXISTS school_db;

-- មើល Database បច្ចុប្បន្ន
SELECT DATABASE();
CREATE TABLE ជាមួយ Constraints
🗄️ SQL
CREATE TABLE students (
  id         INT AUTO_INCREMENT PRIMARY KEY,
  first_name VARCHAR(50) NOT NULL,
  last_name  VARCHAR(50) NOT NULL,
  email      VARCHAR(100) UNIQUE NOT NULL,
  age        INT CHECK (age > 0),
  gender     ENUM('male', 'female'),
  grade      DECIMAL(4,2) DEFAULT 0.00,
  created_at DATETIME DEFAULT NOW()
);

-- FOREIGN KEY ជើងឧទាហរណ៍
CREATE TABLE enrollments (
  id         INT AUTO_INCREMENT PRIMARY KEY,
  student_id INT NOT NULL,
  course     VARCHAR(100),
  FOREIGN KEY (student_id) REFERENCES students(id)
    ON DELETE CASCADE
);
ALTER TABLE — កែប្រែ Table
🗄️ SQL
-- បន្ថែម Column
ALTER TABLE students ADD phone VARCHAR(20);

-- ប្ដូរ Data Type
ALTER TABLE students MODIFY phone VARCHAR(30) NOT NULL;

-- ប្ដូរឈ្មោះ Column
ALTER TABLE students RENAME COLUMN grade TO gpa;

-- លុប Column
ALTER TABLE students DROP COLUMN phone;
🟢 Basic — មេរៀនទី ៣

INSERT & SELECT

រៀនបញ្ចូលទិន្នន័យ (INSERT) និងទាញទិន្នន័យ (SELECT) ជាមួយ Sorting និង Limiting។

INSERT INTO
🗄️ SQL
-- បញ្ចូលជួរតែមួយ
INSERT INTO students (first_name, last_name, email, age, gender)
VALUES ('សុខ', 'ដារា', 'dara@example.com', 20, 'male');

-- បញ្ចូលច្រើនជួរម្ដង
INSERT INTO students (first_name, last_name, email, age, gender)
VALUES
  ('ចាន់', 'ពិសី', 'pisey@example.com', 22, 'female'),
  ('ហេង', 'វណ្ណ', 'vann@example.com', 21, 'male'),
  ('លី', 'ស្រី', 'srey@example.com', 19, 'female');
SELECT — ទាញទិន្នន័យ
🗄️ SQL
-- ទាញទាំងអស់
SELECT * FROM students;

-- ទាញ Columns ជ្រើស
SELECT first_name, last_name, age FROM students;

-- ប្ដូរឈ្មោះ Column (Alias)
SELECT
  first_name AS ឈ្មោះ,
  age        AS អាយុ
FROM students;

-- ORDER BY — តម្រៀប
SELECT * FROM students
ORDER BY age DESC;  -- ASC ឡើង, DESC ចុះ

-- LIMIT — កំណត់ចំនួន Row
SELECT * FROM students
ORDER BY age
LIMIT 5;

-- LIMIT + OFFSET (Pagination)
SELECT * FROM students
LIMIT 10 OFFSET 20; -- Page 3 (10 per page)

-- DISTINCT — លុបជួរដូចៗ
SELECT DISTINCT gender FROM students;
🟢 Basic — មេរៀនទី ៤

WHERE & Operators

ការ Filter ទិន្នន័យដោយប្រើ WHERE ជាមួយ AND, OR, IN, BETWEEN, LIKE។

WHERE Operators
🗄️ SQL
-- Comparison
SELECT * FROM students WHERE age = 20;
SELECT * FROM students WHERE age >= 18;
SELECT * FROM students WHERE age != 25;

-- AND / OR / NOT
SELECT * FROM students
WHERE age > 18 AND gender = 'female';

-- BETWEEN
SELECT * FROM students
WHERE age BETWEEN 18 AND 25;

-- IN — ចំពោះ List
SELECT * FROM students
WHERE id IN (1, 3, 5, 7);

-- LIKE — ស្វែងរក Pattern
SELECT * FROM students
WHERE email LIKE '%@gmail.com';  -- ចប់ @gmail.com

SELECT * FROM students
WHERE first_name LIKE 'ស%';  -- ចាប់ផ្ដើមដោយ ស

-- IS NULL / IS NOT NULL
SELECT * FROM students
WHERE grade IS NULL;
🟡 Intermediate — មេរៀនទី ៥

JOIN Tables

ការភ្ជាប់ Tables ច្រើនជាមួយ INNER JOIN, LEFT JOIN, RIGHT JOIN, SELF JOIN។

INNER JOIN

យក Row ដែលមាននៅក្នុង Tables ទាំងពីរ (Intersection)។

🗄️ SQL
-- INNER JOIN: យក data ដែលស្ថិតនៅក្នុង Table ទាំងពីរ
SELECT
  s.first_name,
  s.last_name,
  e.course
FROM students AS s
INNER JOIN enrollments AS e
  ON s.id = e.student_id;
LEFT JOIN & RIGHT JOIN
🗄️ SQL
-- LEFT JOIN: យក Row ទាំងអស់ពី Left Table
-- (Row ដែលគ្មាននៅ Right Table → NULL)
SELECT
  s.first_name,
  e.course
FROM students s
LEFT JOIN enrollments e ON s.id = e.student_id;

-- ស្វែងរក Students ដែលមិនបានចុះឈ្មោះ
SELECT s.first_name
FROM students s
LEFT JOIN enrollments e ON s.id = e.student_id
WHERE e.student_id IS NULL;

-- JOIN Tables ៣ ក្នុងពេលតែមួយ
SELECT s.first_name, e.course, g.score
FROM students s
INNER JOIN enrollments e ON s.id = e.student_id
INNER JOIN grades g ON e.id = g.enrollment_id;
🟡 Intermediate — មេរៀនទី ៦

GROUP BY & Aggregate Functions

ការប្រើ GROUP BY ជាមួយ COUNT, SUM, AVG, MAX, MIN, HAVING។

Aggregate Functions
🗄️ SQL
-- COUNT: រាប់ចំនួន
SELECT COUNT(*) AS total_students FROM students;

-- GROUP BY + COUNT
SELECT gender, COUNT(*) AS total
FROM students
GROUP BY gender;

-- AVG, SUM, MAX, MIN
SELECT
  AVG(age)   AS avg_age,
  SUM(grade) AS total_grade,
  MAX(grade) AS highest,
  MIN(grade) AS lowest
FROM students;

-- HAVING: Filter បន្ទាប់ GROUP BY
SELECT gender, AVG(age) AS avg_age
FROM students
GROUP BY gender
HAVING AVG(age) > 20;
🟡 Intermediate — មេរៀនទី ៧

UPDATE & DELETE

ការកែប្រែ (UPDATE) និងលុប (DELETE/TRUNCATE) ទិន្នន័យ។

UPDATE
🗄️ SQL
-- UPDATE Row តែ
UPDATE students
SET age = 21, grade = 3.5
WHERE id = 1;

-- UPDATE ច្រើន Rows
UPDATE students
SET grade = grade + 0.5
WHERE grade < 2.0;

-- DELETE Row ជ្រើស
DELETE FROM students WHERE id = 5;

-- TRUNCATE: លុប Rows ទាំងអស់ (ល្បឿនលឿន)
TRUNCATE TABLE students;
⚠️

តែងតែប្រើ WHERE ជាមួយ UPDATE/DELETE! ប្រសិនបើ WHERE ខ្វះ — ទិន្នន័យទាំងអស់ត្រូវបានប៉ះពាល់!

🟡 Intermediate — មេរៀនទី ៨

Subquery & Nested Query

Query នៅក្នុង Query — ការប្រើ Subquery ជាមួយ WHERE, FROM, SELECT។

Subquery ឧទាហរណ៍
🗄️ SQL
-- ស្វែងរក Students ដែលមាន grade ខ្ពស់ជា Average
SELECT first_name, grade
FROM students
WHERE grade > (
  SELECT AVG(grade) FROM students
);

-- Subquery ក្នុង FROM (Derived Table)
SELECT gender, avg_grade
FROM (
  SELECT gender, AVG(grade) AS avg_grade
  FROM students
  GROUP BY gender
) AS summary
WHERE avg_grade > 3.0;

-- EXISTS
SELECT first_name
FROM students s
WHERE EXISTS (
  SELECT 1 FROM enrollments e
  WHERE e.student_id = s.id
);
🟣 Advanced — មេរៀនទី ៩

INDEX & Performance

ការបង្កើន Performance ដោយប្រើ INDEX, EXPLAIN, Query Optimization។

INDEX

INDEX ដំណើរការដូចពាក្យ Index ក្នុងសៀវភៅ — MySQL ស្វែងរក Row ដែលត្រូវការបានលឿនជាងការស្វែងរករាល់ Row។

🗄️ SQL
-- បង្កើត INDEX
CREATE INDEX idx_email ON students(email);

-- Composite INDEX (ច្រើន Columns)
CREATE INDEX idx_name ON students(first_name, last_name);

-- UNIQUE INDEX
CREATE UNIQUE INDEX idx_email_unique ON students(email);

-- FULLTEXT INDEX (ស្វែងរកអក្សរ)
CREATE FULLTEXT INDEX idx_ft ON students(first_name, last_name);

-- មើល INDEX ទាំងអស់
SHOW INDEX FROM students;

-- លុប INDEX
DROP INDEX idx_email ON students;

-- EXPLAIN: ពិនិត្យ Query Plan
EXPLAIN SELECT * FROM students
WHERE email = 'dara@example.com';

INDEX ល្អបំផុតនៅ Columns ដែលជារឿយៗប្រើក្នុង WHERE, JOIN, ORDER BY — ប៉ុន្តែ Index ច្រើន slow down INSERT/UPDATE!

🟣 Advanced — មេរៀនទី ១០

Stored Procedure & Function

ការបង្កើត Stored Procedure, Function, Parameter, Loop ក្នុង MySQL។

Stored Procedure
🗄️ SQL
-- ប្ដូរ DELIMITER ពី ; ទៅ //
DELIMITER //

CREATE PROCEDURE GetStudentsByGender(
  IN p_gender VARCHAR(10)
)
BEGIN
  SELECT first_name, last_name, age
  FROM students
  WHERE gender = p_gender
  ORDER BY last_name;
END//

DELIMITER ;

-- ហៅ Procedure
CALL GetStudentsByGender('female');

-- Procedure ជាមួយ OUT Parameter
DELIMITER //
CREATE PROCEDURE CountStudents(
  OUT p_count INT
)
BEGIN
  SELECT COUNT(*) INTO p_count
  FROM students;
END//
DELIMITER ;

CALL CountStudents(@total);
SELECT @total;

-- FUNCTION
DELIMITER //
CREATE FUNCTION GetGradeLevel(gpa DECIMAL(4,2))
RETURNS VARCHAR(10)
DETERMINISTIC
BEGIN
  IF gpa >= 3.5 THEN RETURN 'A';
  ELSEIF gpa >= 3.0 THEN RETURN 'B';
  ELSEIF gpa >= 2.0 THEN RETURN 'C';
  ELSE RETURN 'F';
  END IF;
END//
DELIMITER ;

SELECT first_name, GetGradeLevel(grade) AS level
FROM students;
🟣 Advanced — មេរៀនទី ១១

Triggers & Views

ការបង្កើត Trigger (auto-execute) និង View (virtual table)។

TRIGGER
🗄️ SQL
-- Log ពេល Student ត្រូវបានលុប
DELIMITER //
CREATE TRIGGER before_student_delete
BEFORE DELETE ON students
FOR EACH ROW
BEGIN
  INSERT INTO deleted_log (student_id, deleted_at)
  VALUES (OLD.id, NOW());
END//
DELIMITER ;

-- BEFORE INSERT: ត្រឹមត្រូវ Data
DELIMITER //
CREATE TRIGGER validate_age
BEFORE INSERT ON students
FOR EACH ROW
BEGIN
  IF NEW.age < 10 THEN
    SIGNAL SQLSTATE '45000'
    SET MESSAGE_TEXT = 'Age must be at least 10';
  END IF;
END//
DELIMITER ;

-- VIEW: Virtual Table
CREATE VIEW view_top_students AS
SELECT
  first_name, last_name, grade,
  GetGradeLevel(grade) AS level
FROM students
WHERE grade >= 3.0
ORDER BY grade DESC;

-- ប្រើ View ដូច Table ធម្មតា
SELECT * FROM view_top_students;
🟣 Advanced — មេរៀនទី ១២

Transaction & Security

ACID, COMMIT/ROLLBACK, User Management, Permission — ការពន្ទុ Database។

TRANSACTION & ACID
🗄️ SQL
-- Transaction ជ្រើសហ្មត់ (Bank Transfer)
START TRANSACTION;

UPDATE accounts
SET balance = balance - 500
WHERE id = 1;

UPDATE accounts
SET balance = balance + 500
WHERE id = 2;

-- ប្រសិនបើ OK
COMMIT;

-- ប្រសិនបើ Error → ត្រឡប់
ROLLBACK;

-- SAVEPOINT
SAVEPOINT step1;
ROLLBACK TO SAVEPOINT step1;
User Management & Security
🗄️ SQL
-- បង្កើត User
CREATE USER 'app_user'@'localhost'
IDENTIFIED BY 'SecurePass!123';

-- ផ្តល់ Permission
GRANT SELECT, INSERT, UPDATE
ON school_db.*
TO 'app_user'@'localhost';

-- Full Permission (Admin)
GRANT ALL PRIVILEGES ON *.*
TO 'admin_user'@'localhost'
WITH GRANT OPTION;

-- ដក Permission
REVOKE INSERT ON school_db.*
FROM 'app_user'@'localhost';

-- មើល Permission
SHOW GRANTS FOR 'app_user'@'localhost';

-- លុប User
DROP USER 'app_user'@'localhost';

-- Apply ការផ្លាស់ប្ដូរ
FLUSH PRIVILEGES;
🎓

🎉 សូមអបអរ! អ្នកបានបញ្ចប់មេរៀន MySQL ទាំងអស់ — ពីមូលដ្ឋានរហូតដល់កម្រឹតខ្ពស់! ចំណុចបន្ទាប់: MySQL Replication, Partitioning, NoSQL comparison។