Database và SQL cho Khoa học dữ liệu với Python: Hướng dẫn Toàn diện

Database và SQL

Trong thời đại dữ liệu bùng nổ, khả năng khai thác thông tin giá trị từ lượng dữ liệu khổng lồ đã trở thành một yếu tố then chốt để đưa ra quyết định sáng suốt trong kinh doanh và nghiên cứu. Khoa học dữ liệu (Data Science) chính là lĩnh vực tập trung vào việc trích xuất, xử lý và phân tích dữ liệu để tìm ra các mô hình, xu hướng và hiểu biết sâu sắc.

Trong hành trình khám phá khoa học dữ liệu, việc làm chủ cơ sở dữ liệu và ngôn ngữ truy vấn SQL (Structured Query Language) là một bước quan trọng không thể bỏ qua. SQL là ngôn ngữ chuẩn được sử dụng để tương tác với cơ sở dữ liệu quan hệ, cho phép chúng ta truy xuất, thao tác và quản lý dữ liệu một cách hiệu quả. Bên cạnh đó, Python, với sự linh hoạt và mạnh mẽ của mình, đã trở thành ngôn ngữ lập trình được ưa chuộng trong lĩnh vực khoa học dữ liệu. Sự kết hợp giữa SQL và Python mang đến một bộ công cụ hoàn hảo để giải quyết các bài toán phân tích dữ liệu phức tạp.

Cơ sở Dữ liệu Quan hệ và SQL

Cơ sở Dữ liệu Quan hệ (Relational Database)

Cơ sở dữ liệu quan hệ (RDBMS) là một mô hình lưu trữ dữ liệu phổ biến, trong đó dữ liệu được tổ chức thành các bảng có quan hệ với nhau thông qua các khóa ngoại (foreign keys). Mỗi bảng chứa các bản ghi (record) đại diện cho các đối tượng trong thế giới thực, và các trường (field) mô tả các thuộc tính của đối tượng đó.

Ngôn ngữ Truy vấn Có Cấu trúc (SQL):

SQL là ngôn ngữ được thiết kế để làm việc với cơ sở dữ liệu quan hệ. Nó cung cấp một tập hợp các lệnh để thực hiện các thao tác như:

  • DDL (Data Definition Language): Định nghĩa cấu trúc của cơ sở dữ liệu, bao gồm việc tạo (CREATE), sửa đổi (ALTER) và xóa (DROP) các bảng, chỉ mục (index) và các đối tượng khác.
  • DML (Data Manipulation Language): Thao tác dữ liệu trong các bảng, bao gồm việc chèn (INSERT), cập nhật (UPDATE), xóa (DELETE) và truy vấn (SELECT) dữ liệu.
  • DCL (Data Control Language): Quản lý quyền truy cập vào cơ sở dữ liệu, bao gồm việc cấp (GRANT) và thu hồi (REVOKE) quyền truy cập cho người dùng.

Tạo Cơ sở Dữ liệu Quan hệ và Làm việc với Nhiều Bảng bằng Lệnh DDL

Tạo Cơ sở Dữ liệu:

Để bắt đầu, chúng ta cần tạo một cơ sở dữ liệu mới. Trong SQL, chúng ta sử dụng lệnh CREATE DATABASE:

SQL

CREATE DATABASE ten_co_so_du_lieu;

Tạo Bảng

Sau khi đã có cơ sở dữ liệu, chúng ta sẽ tạo các bảng để lưu trữ dữ liệu. Lệnh CREATE TABLE được sử dụng để định nghĩa cấu trúc của một bảng:

SQL

CREATE TABLE ten_bang (
 ten_cot1 kieu_du_lieu1 rang_buoc1,
 ten_cot2 kieu_du_lieu2 rang_buoc2,
...
);

Ví dụ, để tạo một bảng khach_hang với các cột ma_khach_hang, ten_khach_hangemail:

SQL

CREATE TABLE khach_hang (
 ma_khach_hang INT PRIMARY KEY,
 ten_khach_hang VARCHAR(255) NOT NULL,
 email VARCHAR(255) UNIQUE
);

Quan hệ giữa các Bảng

Trong cơ sở dữ liệu quan hệ, các bảng thường có quan hệ với nhau thông qua các khóa ngoại (foreign keys). Khóa ngoại là một cột trong một bảng tham chiếu đến khóa chính (primary key) của một bảng khác.

Ví dụ, để tạo một bảng don_hang có quan hệ với bảng khach_hang:

SQL

 CREATE TABLE don_hang (
 ma_don_hang INT PRIMARY KEY,
 ma_khach_hang INT,
 ngay_dat DATE,
 FOREIGN KEY (ma_khach_hang) REFERENCES khach_hang(ma_khach_hang)
);

Xây dựng Truy vấn SQL Cơ bản đến Trung cấp bằng Lệnh DML

Truy vấn Dữ liệu (SELECT)

Lệnh SELECT là lệnh quan trọng nhất trong SQL, được sử dụng để truy vấn dữ liệu từ một hoặc nhiều bảng. Cú pháp cơ bản của lệnh SELECT:

SQL

SELECT ten_cot1, ten_cot2, ...
FROM ten_bang
WHERE dieu_kien;

Ví dụ, để lấy tất cả các khách hàng từ bảng khach_hang:

SQL

SELECT * FROM khach_hang;

Lọc Dữ liệu (WHERE)

Mệnh đề WHERE được sử dụng để lọc dữ liệu dựa trên các điều kiện nhất định. Ví dụ, để lấy tất cả các khách hàng có tên là “Nguyễn Văn A”:

SQL

SELECT * FROM khach_hang WHERE ten_khach_hang = 'Nguyễn Văn A';

Sắp xếp Dữ liệu (ORDER BY)

Mệnh đề ORDER BY được sử dụng để sắp xếp dữ liệu theo một hoặc nhiều cột. Ví dụ, để sắp xếp khách hàng theo tên tăng dần:

SQL

SELECT * FROM khach_hang ORDER BY ten_khach_hang ASC;

Các Hàm Tập hợp (Aggregate Functions)

SQL cung cấp các hàm tập hợp như COUNT, SUM, AVG, MIN, MAX để tính toán trên một tập hợp các giá trị. Ví dụ, để đếm số lượng khách hàng:

SQL

SELECT COUNT(*) FROM khach_hang;

Ghép Bảng (JOIN)

Phép ghép bảng (JOIN) là một kỹ thuật quan trọng trong SQL, cho phép chúng ta kết hợp dữ liệu từ nhiều bảng dựa trên các quan hệ giữa chúng. Có nhiều loại phép ghép khác nhau như INNER JOIN, LEFT JOIN, RIGHT JOINFULL JOIN.

Ví dụ, để lấy tất cả các đơn hàng và thông tin khách hàng tương ứng:

SQL

SELECT *
FROM don_hang
INNER JOIN khach_hang ON don_hang.ma_khach_hang = khach_hang.ma_khach_hang;

Truy vấn SQL Nâng cao

Truy vấn con (Subquery)

Truy vấn con là một truy vấn SQL được lồng bên trong một truy vấn khác. Chúng cho phép thực hiện các thao tác phức tạp hơn bằng cách chia nhỏ vấn đề thành các bước nhỏ hơn. Ví dụ:

SQL

SELECT *
FROM khach_hang
WHERE ma_khach_hang IN (
SELECT ma_khach_hang
FROM don_hang
WHERE ngay_dat >= '2024-01-01'
);

Truy vấn trên sẽ chọn tất cả khách hàng đã đặt hàng từ ngày 1 tháng 1 năm 2024.

Biểu thức bảng (Table Expression)

Biểu thức bảng là một cấu trúc tạm thời đại diện cho một tập hợp các hàng và cột, có thể được sử dụng trong các truy vấn khác. Có hai loại biểu thức bảng chính:

  • CTE (Common Table Expression): Được định nghĩa bằng từ khóa WITH.
  • Derived Table: Được định nghĩa trong mệnh đề FROM.

Ví dụ sử dụng CTE:

SQL

WITH khach_hang_vip AS (
SELECT *
FROM khach_hang
WHERE tong_tien_mua >= 1000000
)
SELECT *
FROM khach_hang_vip;

Cửa sổ (Window Function)

Hàm cửa sổ hoạt động trên một tập hợp các hàng liên quan đến hàng hiện tại. Chúng cho phép thực hiện các tính toán như xếp hạng, tổng chạy, trung bình động, v.v. Ví dụ:

SQL

SELECT *,
RANK() OVER (ORDER BY tong_tien_mua DESC) AS xep_hang
FROM khach_hang;

Tập hợp (Set Operation)

SQL cung cấp các phép toán trên tập hợp như UNION, INTERSECTEXCEPT để kết hợp kết quả của nhiều truy vấn.

Các tính năng nâng cao khác

SQL còn có nhiều tính năng nâng cao khác như:

  • Stored Procedure: Một nhóm các lệnh SQL được lưu trữ trong cơ sở dữ liệu và có thể được gọi lại để thực thi.
  • Trigger: Một đoạn mã được thực thi tự động khi một sự kiện cụ thể xảy ra trong cơ sở dữ liệu.
  • View: Một bảng ảo được tạo ra từ một truy vấn SQL.

Python và SQL

Kết nối Python với Cơ sở Dữ liệu

Python cung cấp nhiều thư viện để kết nối và tương tác với cơ sở dữ liệu, phổ biến nhất là sqlite3 (cho SQLite), psycopg2 (cho PostgreSQL), mysql.connector (cho MySQL).

Python

import sqlite3

conn = sqlite3.connect('du_lieu.db')
cursor = conn.cursor()

Thực thi Truy vấn SQL

Python

cursor.execute('SELECT * FROM khach_hang')
rows = cursor.fetchall()
for row in rows:
 print(row)

Thư viện Pandas

Pandas là một thư viện Python mạnh mẽ để phân tích và thao tác dữ liệu. Nó cung cấp các cấu trúc dữ liệu như DataFrame và Series, giúp dễ dàng làm việc với dữ liệu dạng bảng. Pandas cũng có thể đọc và ghi dữ liệu từ nhiều nguồn khác nhau, bao gồm cả cơ sở dữ liệu SQL.

Python

import pandas as pd

df = pd.read_sql_query('SELECT * FROM khach_hang', conn)
print(df)

Ứng dụng SQL và Python trong Khoa học Dữ liệu

  • Phân tích dữ liệu thăm dò (EDA): Sử dụng SQL để tổng hợp, lọc và biến đổi dữ liệu, sau đó sử dụng Python và các thư viện như Matplotlib, Seaborn để trực quan hóa dữ liệu.
  • Xây dựng mô hình dự đoán: Sử dụng SQL để chuẩn bị dữ liệu, sau đó sử dụng Python và các thư viện như Scikit-learn để xây dựng và đánh giá các mô hình học máy.
  • Tạo báo cáo và dashboard: Sử dụng SQL để truy vấn dữ liệu, sau đó sử dụng Python và các thư viện như Dash để tạo các báo cáo và dashboard tương tác.

Kết luận

SQL và Python là hai công cụ mạnh mẽ không thể thiếu trong bộ công cụ của một nhà khoa học dữ liệu. Bằng cách kết hợp chúng, bạn có thể xây dựng các ứng dụng phân tích dữ liệu hiệu quả và toàn diện.

Tác giả

  • is-avatar

    Ilya S. (Hebrew: איליה סוצקבר; born 8 December 1986) is an Israeli-Canadian computer scientist who specializes in machine learning. He has made several major contributions to the field of deep learning. With Alex Krizhevsky and Geoffrey Hinton, he co-invented AlexNet, a convolutional neural network.