# Phần 1: Lập trình Python
**Buổi Học 1: Biến - Kiểu dữ liệu - Toán tử - Điều kiện trong Python**
1. Pesuo Code và lược đồ thuật toán (Flowchart) trong lập trình
- Trình tự chạy của chương trình trong Python
- Cách viết pesuo code (code giả) và lược đồ thuật toán.
1. Biến và Kiểu Dữ Liệu
- Khái niệm về `biến`, `giá trị` và `kiểu dữ liệu` trong Python
- Cơ chế máy tính lưu trữ và giải phóng giá trị cho biến.
- Các kiểu dữ liệu cơ bản: int, float, string, boolean.
- Khai báo và sử dụng biến.
2. Toán Tử và Các Khái Niệm Liên Quan
- Các toán tử cơ bản: +, -, *, /, %
- Toán tử so sánh và logic: ==, !=, <, >, and, or, not
3. Điều kiện rẽ nhánh trong Python
- Khái niệm về câu lệnh rẽ nhánh if - else. Liên hệ giữa từ khoá lập trình và ngôn ngữ tự nhiên (tiếng Anh)
- Khối code (Code block) trong lập trình Python
- Nested if trong Python và vấn đề khi sử dụng nested If
- Lệnh rẽ nhiều nhánh if - else if - else trong Python
4. Coding convention trong Python
- Một số chuẩn đặt tên biến trong Python: capitalize, cameoCase.
- Coding convention với if-else trong python.
**Buổi Học 2: Vòng lặp và kiểu dữ liệu liên quan đến mảng trong Python**
1. Khái niệm về kiểu dữ liệu mảng (Mảng/List/Array) trong lập trình
- Nhắc về khái niệm chuỗi là mảng của các ký tự để gợi mở về mảng
- Các thành phần trong mảng: Element (Phần tử), Index (Chỉ số), len (độ dài)
- Lưu ý về các phần tử trong mảng về kiểu dữ liệu.
- Cách khai báo một List trong Python.
2. Khái niệm về vòng lặp for và cách hoạt động của vòng lặp for trong lập trình
- Nhắc về khái niệm vòng lặp trong lập trình:
- 3 thành phần quan trọng trong vòng lặp: Điểm bắt đầu, điều kiện kết thúc, bước nhảy
- Liên hệ với khái niệm `for in arrays` và Enumerate trong vòng lặp for của Python
3. Liên hệ giữa vòng lặp `for` và giải thuật duyệt từ đầu đến cuối của mảng trong Python
- Sự tăng của chỉ số index với mỗi lần thực hiện vòng lặp
- Chỉ số `index` hiện tại được sử dụng cho `index ` của phàn tử trong vòng lặp
- Điều kiện kết thúc tương ứng với chỉ số `len()` của mảng
- Mô tả quá trình chạy của giải thuật duyệt qua các phần tử trong mảng
4. Các kiểu dữ liệu mảng phổ biến: List, Dict, Tuple.
5. Các thao tác làm việc với mảng trong Python: Thao tác CRUD
- Thao tác thêm 1 phần tử vào mảng
- Thao tác lấy ra một hoặc nhiều phần tử trong mảng
- Thao tác sửa một hoặc nhiều phần tử trong mảng
- Thao tác xoá một hoặc nhiều phần tử tỏng mảng
6. Giải Thuật cộng dồn trong mảng
- Thuật toán cộng dồn và ứng dụng
- Xác định biến trống khi cộng dồn
**Buổi Học 3: Hàm và các thao tác với hàm trong Python**
1. Khái niệm về hàm và ứng dụng của hàm trong lập trình Python
- Input/Outup trong hàm
- Khái niệm `Chia để trị` trong lập trình
- Ưu điểm về tính tái sử dụng của hàm
2. Cấu trúc câu lệnh về hàm trong Python
- Từ khoá `def` trong khai báo hàm
- Coding Convention trong việc đặt tên hàm
3. Parameter (input) của hàm.
3. Hàm trả về và hàm không trả về
- Từ khoá return trong Python
- Phân biệt hàm trả về và hàm không trả về
4. Thực thi hàm trong python
- Lưu ý về `giá trị trả về` của hàm trong Python
5. Phương pháp tách hàm trong Python
- Cách tách hàm để đảm bảo `Chia để trị` trong đoạn code dài
- Cách xác định input/output khi tách hàm
6. Các hàm dựng sẵn phổ biến trong Python:
- Các hàm dựng sẵn liên quan đến chuỗi, kiểm tra chuỗi
- Các hàm dựng sẵn liên quan đến mảng: len, min, max, map, filter,...
- Các hàm dựng sẵn khác
7. Hàm đệ quy trong lập trình Python
- Khái niệm về hàm đệ quy
- Lưu ý về điều kiện để hàm đệ quy dừng lại (điều kiện suy biến)
**Buổi Học 4: Lập Trình Hướng Đối Tượng Trong Python**
1. Khái Niệm Về Lập Trình Hướng Đối Tượng
- So sánh việc lập trình và đời sống thực tế
- Mô tả khái niệm về `đối tượng` và `trường thông tin` trong lập trình
- Ưu điểm của lập trình hướng đối tượng so với lập trình hướng thủ tục
2. Các khái niệm liên quan đến `Class`
- Khái niệm về `Class`
- Thành phần `field` trong `Class`
- Thành phần `method` trong `Class`
- Từ khoá `self` trong `Class`
- Khái niệm về `contructor`/`destructor` trong `Class`
3. Các khái niệm liên quan đến `Object`
- Khái niệm về `Object` trong lập trình hướng đối tượng
- Cách khởi tạo `Object` thông qua `contrucotor` của `Class`
- Truy cập giá trị của `field` và thực thi `method` trong `Object`
4. `Module` trong lập trình Python
- Khái niệm về module, library trong python
- Cài đặt library thông qua pip
- import module vào Python
**Buổi Học 5: Các tính chất trong Lập Trình Hướng Đối Tượng Với Python (1)**
1. Tính Kế Thừa trong Python
- Khái niệm về Tính Kế Thừa
- Sử dụng từ khoá `super` để truy cập các phương thức của lớp cha
2. Access Modifier trong Python
- Khái niệm về `public`, `private`, `protected` trong lập trình hướng đối tượng.
- Quy tắc đặt tên cho các thành phần `public`, `private`, `protected` trong Python
3. Tính Đa Hình trong Python
- Khái niệm về Tính Đa Hình trong Python
- Thể hiện tính đa hình trong việc `override method` trong Python
- Sử dụng đa hình với lớp và phương thức
4. Ứng dụng của tính chất kế thừa và tính chất đa hình trong lập trình hướng đối tượng
**Buổi Học 6: Các tính chất trong Lập Trình Hướng Đối Tượng Với Python (2)**
1. Tính Trừu Tượng trong Python
- Khái niệm về Tính Trừu Tượng
- Mô tả về `Abstract Class`, `Abstract Method` và `Interface` trong Python
- Từ khoá `pass` khi khai báo `abstract method`
- Sử dụng lớp trừu tượng và phương thức trừu tượng
2. Tính Kế Thừa Đa Cấp
- Khái niệm về Kế Thừa Đa Cấp trong Python
- Ví dụ và trường hợp sử dụng Tính Kế Thừa Đa Cấp
3. Tính Đa Hình Động và Tĩnh
- So sánh Tính Đa Hình Động và Tĩnh
- Ví dụ về cả hai loại Tính Đa Hình trong Python
4. Ưu điểm và ứng dụng của Tính Kế Thừa, Tính Trừu Tượng, và Tính Đa Hình
- Giải thích các ưu điểm và lợi ích của Tính Kế Thừa, Tính Trừu Tượng và Tính Đa Hình
- Mô tả các trường hợp sử dụng phổ biến trong thực tế
**Buổi học 7: Các kỹ thuật lập trình nâng cao trong Python**
1. Khái niệm về lập trình bất đồng bộ trong Python
- Lập trình bất đồng bộ là gì
- Luồng trong lập trình Python
- Sử dụng `concurrent.futures` để thực thi nhiều luồng chạy đồng thời
2. Khái niệm về Error Handling trong lập trình
- Xử lý `Error Handling` với Python
- Khối `try - catch - finnaly` trong Python
- Sử dụng `try-catch-finnaly` để kiểm soát chương trình và lỗi trong Python
3. Debugging và UnitTesting trong lập trình Python
- `Bug` và `Debug` trong lập trình
- Các khái niệm liên quan đến `Debugging`: Break point, step, step over
- Hướng dẫn phân tích terminal để đọc lỗi và sửa lỗi.
- Một số lỗi lập trình thường mắc phải khi viết code.
4. Giới thiệu về `Log` và `Unit Testing` trong Python
# Phần 2: Cấu trúc dữ liệu và giải thuật
**Buổi Học 8: Cáu trúc dữ liệu mảng nâng cao: Stack, Queue, Linked List, và Mảng Băm**
1. Stack và Queue
- Định nghĩa và sử dụng Stack và Queue
- Các thao tác cơ bản với chúng
2. Mảng Băm (Hashing)
- Khái niệm về mảng băm
- Ứng dụng và cách thức hoạt động
3. Linked List
- Khái niệm về linked list
- So sánh Linked List và List; ứng dụng của chúng trong thực tế
4. Cấu trúc dữ liệu mảng với các phần tử là `object`
**Buổi Học 9: Các giải thuật Nâng Cao Với Mảng và Thuật Toán Tìm Kiếm, Sắp Xếp**
1. Thuật Toán Sắp Xếp trong mảng
- Bubble sort: Thuật toán sắp xếp nổi bọt
- Quick sort và merge sort: Thuật toán sắp xếp nhanh
2. Khái niệm về `Big O Notation` trong lập trình
- Khái niệm về độ phức tạp của thuật toán (`Big O Notation`)
- Cách tính `Big O Notation` thông qua các giải thuật
- Giá trị `Big O Notation` trong các giải thuật sắp xếp phổ biến
3. Thuật Toán Tìm Kiếm Cơ Bản
- Thuật toán tìm kiếm tuần tự và nhị phân
- So sánh hiệu suất của các thuật toán tìm kiếm
- Giá trị `Big O Notation` trong các giải thuật tìm kiếm
# Phần 3: Cơ sở dữ liệu
**Buổi Học 10: Cơ Sở Dữ Liệu Cơ Bản và Thiết Kế Cơ Sở Dữ Liệu Quan Hệ**
1. Thiết Kế Cơ Sở Dữ Liệu Quan Hệ
- Khái niệm về cơ sở dữ liệu quan hệ (RDBMS)
- Thiết kế cơ sở dữ liệu với các bảng và khóa chính
2. Chuẩn Hoá Cơ Sở Dữ Liệu
- Cách chuẩn hoá cơ sở dữ liệu để tránh lặp lại và thiếu nhất quán
3. Một số nghiệp vụ và thiết kế CSDL phổ biến
- Nghiệp vụ quản lý đơn hàng
- Nghiệp vụ quản lý kho - tồn kho - thu chi
- Nghiêp vụ quản lý user - phân quyền - subcription
4. Công cụ thiết kế CSDL
- Thiết kế mô hình R-D bằng draw.io
**Buổi học 11: Hệ quản trị cơ sở dữ liệu (DBMS), bảng, khoá và rằng buộc trong bảng**
1. Khái Niệm Về Hệ Quản Trị Cơ Sở Dữ Liệu (DBMS)
- Giới thiệu về DBMS và tầm quan trọng trong lưu trữ và quản lý dữ liệu.
- So sánh việc quản lý dữ liệu trong DBMS và việc lưu trữ thông tin truyền thống.
- Một số hệ quản trị cơ sở dữ liệu phổ biến.
- Một số phần mềm quản lý cơ sở dữ liệu phổ biến : SSMS, DbBeaver...
2. Bảng trong Cơ Sở Dữ Liệu
- Khái niệm về bảng (table) trong DBMS.
- Các thành phần chính của bảng: cột (column) và dòng (row).
- Quy tắc đặt tên cho các bảng trong cơ sở dữ liệu.
- Nhốm các lệnh DDL (Data Definition Language)
- Các kiểu dữ liệu của cột trong SQL
3. Khoá (Key) trong Cơ Sở Dữ Liệu
- Khái niệm về khoá (key) và tầm quan trọng của nó trong quản lý dữ liệu.
- Loại khoá chính (primary key) và cách xác định khoá chính cho một bảng.
- Khoá ngoại (foreign key) và cách sử dụng nó để liên kết giữa các bảng.
4. Ràng Buộc (Constraints) trong Bảng
- Khái niệm về ràng buộc (constraints) và vai trò của chúng trong bảng.
- Các loại ràng buộc: ràng buộc khoá (key constraints), ràng buộc kiểu dữ liệu (data type constraints), và ràng buộc logic (logical constraints).
- Cách thiết lập và quản lý các ràng buộc trong cơ sở dữ liệu.
5. Thao tác thêm, sửa, xoá dữ liệu với bảng
- các lệnh `insert`,`update`,`delete` trong sql
- Lưu ý các thao tác `insert`,`update`,`delete` với khoá ngoại
**Buổi Học 12: Truy vấn cơ bản và nhóm các lệnh DDL trong SQL**
1. Khái niệm về truy vấn dữ liệu trong SQL
2. Truy Vấn Cơ Sở Dữ Liệu sử dụng các lệnh DDL
- Mệnh đề SQL SELECT, FROM, WHERE, ORDER BY
- Select * và select với trường dữ liệu cụ thể trong bảng
3. Join trong SQL: Kết nối các bảng trong SQL
- Các loại JOIN: `innder join`, `left join`, `right join`, `outer join`
4. Group by trong SQL: Khái niệm nhóm dữ liệu
- Nhóm dữ liệu sử dụng Group By
- Nhóm các hàm tổng hợp (aggregate functions) trong SQL: count, min, max, sum, avg
- Lưu ý khi sử dụng `Group by` với `Select` trong SQL
5. Mệnh đề HAVING trong SQL
**Buổi Học 13: Truy Vấn Cơ Sở Dữ Liệu Nâng Cao: Subquery, View, và Stored Procedure**
1. Truy Vấn Cơ Sở Dữ Liệu Nâng Cao: Subquery
- Sử dụng Subquery để thực hiện truy vấn phức tạp
- Kết hợp Subquery trong các mệnh đề FROM, WHERE, JOIN
- Một số trường hợp cần sử dụng Subquery trong SQL và nhận biết khi cần sử dụng subquery.
2. Truy Vấn Cơ Sở Dữ Liệu Nâng Cao: View
- Sử dụng View để tạo và quản lý các truy vấn tùy chỉnh
3. Giới Thiệu Về Metabase
- Giới thiệu Metabase làm công cụ để phân tích cơ sở dữ liệu
4. Truy Vấn Cơ Sở Dữ Liệu Nâng Cao: Stored Procedure
- Giới thiệu về Stored Procedure và cách sử dụng
5. Dạng truy vấn SQL nâng cao: Pivot Table, Union, Cross Join
- Sử dụng Pivot Table để biến đổi dữ liệu với mệnh để `CASE`
- Sử dụng cụm lệnh `Over Clause` dùng để truy vấn dữ liệu trên mỗi dòng
- Sử dụng Union và Cross Join để kết hợp dữ liệu từ nhiều bảng theo chiều dọc
- Một số truy vấn nâng cao khác
6. Công cụ `Metabase` để phân tích cơ sở dữ liệu trực quan
- Hướng dẫn cài đặt và kết nối đến CSDL
- Hướng dẫn sơ bộ về biểu đồ
- Tạo biểu đồ đơn giản với `metabase`
**Buổi Học 14: Transaction-SQL, Tối Ưu Cơ Sở Dữ Liệu và Kết nối CSDL đến Python**
1. Khái niệm về Transaction trong SQL
- Khái niệm về phiên trong thực tế
- Lệnh commit và lệnh rollback trong SQL
2. Tối Ưu Cơ Sở Dữ Liệu Cơ Bản
- Hiểu về tối ưu hóa cơ sở dữ liệu bằng cách sử dụng các thành phần: index, partition, và materialized view
- Tối ưu truy vấn thông qua việc select và sử dụng subquery
3. Kết Nối Python Với SQL
- Sử dụng Python để tạo kết nối với cơ sở dữ liệu SQL
# Phần 4: Xây dựng các ứng dụng thực tế với công cụ phân tích dữ liệu Metabase và Python Flask
**Buổi Học 15: Giới Thiệu Về Metabase Để Phân Tích Cơ Sở Dữ Liệu**
1. Giới Thiệu Về Metabase
- Giới thiệu Metabase làm công cụ để phân tích cơ sở dữ liệu
- Cách cài đặt và cấu hình Metabase
- Tạo báo cáo và trực quan hóa dữ liệu qua dashboard
- Khái niệm về biểu đồ và các trục của biểu đồ
- Tạo các dạng biểu đồ thông qua `Query`
- Sử dụng biểu đồ phù hợp và tư duy của ngành `Data science` với bài toán thực tế
**Buổi Học 16: Flask và Các Khái Niệm Về API**
1. Flask: Cơ Bản
- Giới thiệu về Flask và micro-framework
- Tạo và chạy ứng dụng Flask đơn giản
2. Khái Niệm Về Request và Response
- Request methods: GET, POST, PUT, DELETE
- Xử lý request và tạo response
3. JSON và API
- Định dạng dữ liệu JSON
- Tạo API đơn giản với Flask
- Xây dựng ứng dụng thực tế với Python và CSDL
**Buổi Học 17: Nhắc Lại Kiến Thức HTML/CSS và Tổng Kết**
1. Nhắc Lại Kiến Thức HTML/CSS
- Đánh giá lại kiến thức về HTML và CSS để tạo giao diện cho ứng dụng
- Sử dụng Javascript để điều khiển website
- Lấy dữ liệu từ API để làm việc và xuất ra dạng HTML, tạo thành sản phẩm hoàn chỉnh.
2. Tổng Kết Khoá Học
- Nhận xét và tổng hợp kiến thức đã học trong khóa học
- Phân chia hướng đi tiếp theo và tài liệu tham khảo