Những điều cơ bản về SQL và cách làm việc với SQL.(Phần 1)

A. Giới thiệu cơ bản và mục đích:

Bài viết này nhằm mục đích hướng dẫn và tích lúy lại những kiến thức cơ bản về SQL. Tài liệu và demo được dựa trên : MySQL 5.6 Nội dung bao gồm:

  • Ngôn ngữ SQL
  • Ngữ pháp SQL ( Ngữ pháp cơ bản, tiêu chuẩn cho mọi loại DB )
  • Ngữ pháp SQL riêng của MySQL. Sau khi đã đọc hiểu bài viết này thì bạn có thể có 1 chút tự tin khi join vào các dự mà Spec chưa rõ ràng bởi vì các task không theo trình tự ( ví dụ: làm màn List nhưng create chưa làm...), DB cần cải thiện và dữ liệu là không có sẵn , cần phải tạo hoặc check nhiều bảng mới có đáp án cuối cùng, Hoặc dữ liệu từ API gọi về lưu ở đâu?

Note: Data mẫu là LearningSQL ( bản Mysql ). Download tại đây: http://o7planning.org/vi/10235/co-so-du-lieu-mysql-mau-de-hoc-sql

B: Tìm hiểu về SQL

1. Giới thiệu về công cụ:

Công cụ để làm việc : MySQL Workbench Download và cài đặt tại đây: http://o7planning.org/vi/10221/huong-dan-cai-dat-va-cau-hinh-mysql-community

2. Các câu lệnh truy vấn (Query).

2.1: SQL Select

Một trong những câu lệnh cơ bản của SQL là truy vấn dữ liệu trong Table : Select. Example:

TOUR : Bảng dữ liệu các Tour du lịch ( Kiểu dịch vụ du lịch)

  • Truy vấn toàn bộ dữ liệu trên bảng TOUR: Kết quả:

  • Truy vấn 1 vài cột:

  • Đặt ALias cho cột: sử dụng biến "t" là Alias (Tên bí danh) cho bảng Tours.

2.2: SQL Distinict:

Distinict được sử dụng cùng với SELECT, dùng để select các dữ liệu và bỏ qua các dữ liệu trùng nhau. Cú pháp:

Select distinct <column1>, <column2> .... --- Liệt kê các cột ID, Code, Name của Tours. --- Loại bỏ những tour có code trùng nhau, sử dụng Distinct để loại bỏ việc trùng lặp

2.3: SQL AND OR

AND và OR là 2 điều kiện đứng sau WHERE: -- Tìm kiếm những Tour có code là AA004 và tour_area_id = 4

Với câu lệnh OR: -- Tìm kiếm những Tours có code là AA004 hoặc U1800

2.5: SQL IN (Trong phạm vi)

Câu lệnh in trong where sử dụng trong tình huống tìm kiếm giá trị thuộc một tập hợp nhất định. -- Tìm kiếm các Tour có tour code là AA001 và U1800

2.6: SQL BETWEEN

-- Tìm kiếm những Tour có id từ 5 -> 10

Câu lệnh BETWEEN cũng được sử dụng trong việc giới hạn thời gian. Chẳng hạn bạn tìm kiếm các Tour có ngày create từ 2017-06-01 đến 2017 - 09 -01

2.7: SQL WILDCARD

Có 2 ký tự đặc biệt trong SQL: Ký tự % và Ký tự _ Ý nghĩa: % mô tả 0, 1 hoặc nhiều ký tự _ mô tả chính xác một ký tự. Hai ký tự này thường được sử dụng trong điều kiện like. -- Tìm kiếm các Tour có tour code chứa ký tự "U"

2.8: SQL LIKE

Tương tự ví dụ 2.7

2.9: SQL ORDER BY

Việc query dữ liệu cho một tập kết quả, mà có thể nó sắp xếp không như ý muốn, sử dụng Order by để sắp xếp kết quả trả về. -- Cú pháp

SELECT "column_name" FROM "table_name" [WHERE "condition"] ORDER BY "column_name1" [ASC, DESC], "column_name2" [ASC, DESC];

-- Ghi chú: -- ASC: nghĩa là sắp xếp tăng dần (Mặc định) -- DESC: Nghĩa là sắp xếp giảm dần. Example: --- Sắp xếp ID theo thứ tự giảm dần.

ORDER BY bao giờ cũng đứng sau WHERE

-- Tìm các Tour có Code bắt đầu bởi U. -- Sắp xếp giảm dần theo ngày Create_at

2.10: SQL GROUP BY

Trước hết chúng ta cần hiểu các hàm tổng hợp ( Aggregate Functions) là gì: Sum: Hàm tính tổng Avg: Hàm lấy trung bình Count: Hàm tính số lần Min: Hàm tìm giá trị nhỏ nhất Max: Hàm tìm giá trị lớn nhất Đó là một số hàm tổng hợp ( Aggregate) thông dụng. Chúng có thể tham gia vào câu lệnh nhóm ( Group by).

2.11: SQL HAVING

Having là một câu lệnh điều kiện của Group by. Giả sử bạn muốn nhóm các loại tour code (code) trên bảng Tour, và chỉ hiển thị ra các loại tour code nào có lượng > 3.

C : Note:

Phần tiếp theo mình sẽ tiếp tục giới thiệu thêm về các câu lệnh query khác. Một số kinh nghiệm nhỏ khi tham gia dự án mà QA được ' Thêm' ' Sửa' ' Xóa' trên DB . Đối với những trường hợp như có màn hình để confirm hoặc chỉ cần select 1 bảng đã có đáp án thì cá nhân chúng ta có thể dùng 1 lệnh Select đơn giản đúng trường , đúng bảng. Nhưng đối với trường hợp không có màn hình confirm và truy vấn nhiều bảng để có được 1 điều kiện hiển thị. Dự án thật của em đang join có trường hợp truy vấn 12 bảng để hiển thị 1 giá cancel. Vậy cách giải quyết của chúng ta sẽ như thế nào. Về cá nhân em có 3 phương án.

Phương án 1:

dùng các cậu lệnh query cho từng bảng và mapping đúng khóa ngoại. Lần lượt và tuần tự từng bảng, yêu cầu duy nhất ở đây là bạn chỉ cần nắm chắc input và hiểu rõ cấu trúc ánh xạ của các bảng.

Phương án 2:

Giả sử kết quả cuối cùng của bạn đúng , bạn check ngược lại quá trình truy vấn của của các bảng với nhau nếu đúng thì kết quả sẽ trùng với điều kiện input là bảng thứ nhất. Tức là làm ngược lại với phương án 1. ( Về nguyên tắc thì 1 và 2 như nhau nhưng về thực hành thì 2 dễ làm hơn và nhanh hơn vì thay vì phải nhớ có bảo nhiêu bảng con thì chỉ cần biết bảng đích rồi truy theo ánh xạ là khóa ngoại dễ dàng hơn.)

Phương án 3:

Là dùng các câu lệnh sub-query , join và phần này sẽ được mình giới thiệu ở phần tiếp theo. Link tham khảo : http://o7planning.org/vi/10237/huong-dan-hoc-sql-cho-nguoi-moi-bat-dau-voi-mysql