ស្វៀតស្វាញ MySQL
ពីមូលដ្ឋានដល់ Expert
មេរៀននេះជួយអ្នករៀន MySQL ដោយគ្រប់ជំហាន — ចាប់ពីការបង្កើត Database រហូតដល់ Stored Procedure, Transaction, និង Performance Tuning។
- 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 មូលដ្ឋាន
មូលដ្ឋាន MySQL
ស្វែងយល់ពី MySQL គឺជាអ្វី, ហេតុអ្វីត្រូវប្រើ, និង Data Types ដែលប្រើញឹកញាប់។
MySQL គឺជា Relational Database Management System (RDBMS) ដែលប្រើ SQL (Structured Query Language) ដើម្បីគ្រប់គ្រងទិន្នន័យ។ វាត្រូវបានប្រើដោយក្រុមហ៊ុន Facebook, Twitter, YouTube និងច្រើនទៀត។
MySQL ជា Open Source, រហ័ស, ជឿទុកចិត្ត និងងាយរៀន — ល្អបំផុតសម្រាប់ Web Applications។
| Type | ការប្រើប្រាស់ | ឧទាហរណ៍ |
|---|---|---|
INT | លេខចំនួនគត់ | អាយុ, ID |
VARCHAR(n) | អក្សរ (អថេរ) | ឈ្មោះ, អាសយដ្ឋាន |
TEXT | អក្សរវែង | Description, Content |
DECIMAL(p,s) | លេខទសភាគ | តម្លៃ, ប្រាក់ |
DATE | កាលបរិច្ឆេទ | ថ្ងៃខែឆ្នាំ |
DATETIME | កាលបរិច្ឆេទ + ពេលវេលា | Created_at |
BOOLEAN | True/False | Status, Active |
ENUM | ជម្រើសថេរ | 'male','female' |
-- Login ចូល MySQL mysql -u root -p -- បញ្ជាក់ Host mysql -h localhost -u root -p -- មើល version SELECT VERSION(); -- មើល databases ទាំងអស់ SHOW DATABASES;
CREATE Database & Table
រៀនបង្កើត Database, Table, និងកំណត់ Primary Key, Constraints។
-- បង្កើត Database CREATE DATABASE school_db; -- ជ្រើស Database USE school_db; -- លុប Database DROP DATABASE IF EXISTS school_db; -- មើល Database បច្ចុប្បន្ន SELECT DATABASE();
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 );
-- បន្ថែម 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;
INSERT & SELECT
រៀនបញ្ចូលទិន្នន័យ (INSERT) និងទាញទិន្នន័យ (SELECT) ជាមួយ Sorting និង Limiting។
-- បញ្ចូលជួរតែមួយ 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 * 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;
WHERE & Operators
ការ Filter ទិន្នន័យដោយប្រើ WHERE ជាមួយ AND, OR, IN, BETWEEN, LIKE។
-- 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;
JOIN Tables
ការភ្ជាប់ Tables ច្រើនជាមួយ INNER JOIN, LEFT JOIN, RIGHT JOIN, SELF JOIN។
យក Row ដែលមាននៅក្នុង Tables ទាំងពីរ (Intersection)។
-- 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: យក 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;
GROUP BY & Aggregate Functions
ការប្រើ GROUP BY ជាមួយ COUNT, SUM, AVG, MAX, MIN, HAVING។
-- 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;
UPDATE & DELETE
ការកែប្រែ (UPDATE) និងលុប (DELETE/TRUNCATE) ទិន្នន័យ។
-- 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 ខ្វះ — ទិន្នន័យទាំងអស់ត្រូវបានប៉ះពាល់!
Subquery & Nested Query
Query នៅក្នុង Query — ការប្រើ Subquery ជាមួយ WHERE, FROM, SELECT។
-- ស្វែងរក 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 );
INDEX & Performance
ការបង្កើន Performance ដោយប្រើ INDEX, EXPLAIN, Query Optimization។
INDEX ដំណើរការដូចពាក្យ Index ក្នុងសៀវភៅ — MySQL ស្វែងរក Row ដែលត្រូវការបានលឿនជាងការស្វែងរករាល់ Row។
-- បង្កើត 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!
Stored Procedure & Function
ការបង្កើត Stored Procedure, Function, Parameter, Loop ក្នុង MySQL។
-- ប្ដូរ 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;
Triggers & Views
ការបង្កើត Trigger (auto-execute) និង View (virtual table)។
-- 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;
Transaction & Security
ACID, COMMIT/ROLLBACK, User Management, Permission — ការពន្ទុ Database។
-- 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 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។