Như vậy là chúng ta đã biết sơ lược về các schema
và các table
. Trước khi tìm hiểu về các kiểu dữ liệu được quy ước sẵn trong MySQL
, chúng ta sẽ dành một chút thời gian để làm quen với câu lệnh SQL
đầu tiên và thử kết nối một phần mềm client
đơn giản trên nền NodeJS tới MySQL Server
. Như vậy thì khi kiến thức sử dụng MySQL
được cập nhật đến đâu là bạn sẽ có thể sử dụng tới đó – để áp dụng ý tưởng đang có cho blog cá nhân hoặc phần mềm nào đó đang xây dựng.
SQL Script
Trước khi bắt đầu nói về ngôn ngữ, chúng ta sẽ thử nhờ MySQL Workbench
thực hiện một thao tác điều khiển cơ bản và truy xuất các bản ghi đang có sẵn trong bảng city
của schema world
. Thao tác cần thực hiện là click chuột phải vào bảng city
và chọn dòng đầu tiên Select Rows - Limit 1000
.
Lúc này chúng ta thấy là ở khung soạn thảo code ngay bên phải khung Navigator
đã mở thêm một tab tên là city
và có một dòng code:
SELECT*FROM world.city;
Câu lệnh SQL này sẽ được MySQL Workbench
gửi tới MySQL Server
đang chờ ở địa chỉ localhost:3045
hay 127.0.0.1:3045
mà chúng ta đã biết qua HTTP. MySQL Server
sẽ nhận được một object request
kèm theo chuỗi thông tin có chứa câu lệnh SELECT
ở trên và thực hiện truy vấn dữ liệu. Sau đó kết quả truy vấn sẽ được gửi trả lại cho MySQL Workbench
.
Và ở phần dưới của khung soạn thảo code của MySQL Workbench
lúc này đã có một bảng kết quả của yêu cầu truy vấn dữ liệu SELECT
vừa thực hiện. Dữ liệu bao gồm các bản ghi với đầy đủ các trường dữ liệu ID
, Name
, v.v… mà chúng ta đã xem lướt qua trước đó.
Và câu lệnh SQL
đầu tiên của chúng ta có thể được dịch nghĩa cụ thể là:
SELECT
– hãy chọn ra các bản ghi*
– tất cả các trường dữ liệuFROM
– từ bảng dữ liệuworld.city
– tên củachema.table
cụ thể
Ồ, có lẽ là bởi vì chúng ta có thể tạo ra nhiều schema
và nhiều table
khác nhau thế nên các kỹ sư thiết kế RDBMS
như của MySQL
không thể lường trước được các dạng request
mà chúng ta muốn thực hiện. Chính vì vậy nên thay vì thiết kế một DataBase Server
cung cấp API
với đường dẫn có một dạng cú pháp nhất định ví dụ như localhost:3045/select/fields/from/schema/table
thì chúng ta lại đang có hẳn một ngôn ngữ lập trình để mô tả request
cần thực hiện.
Điều này thực sự rất tuyệt bởi vì chúng ta còn đang có thêm khả năng chuyển các logic tính toán trên tập hợp dữ liệu cho MySQL Server
thực hiện và có thể tạo ra nhiều phần mềm Client
trên các thiết bị khác nhau mà không cần viết lặp lại phần code xử lý logic tính toán. Thực tế thì ngay cả khi chúng ta không di chuyển logic tính toán tổ hợp vào MySQL Server
thì các thao tác điều khiển cũng rất cần được biểu thị linh hoạt trong trường hợp xây dựng các phần mềm có tính năng phong phú.
Để tiện cho việc ghi nhớ tạm thời khi mới học các câu lệnh SQL
, bạn có thể nhấn nút Save
hoặc tổ hợp phím Ctrl+S
để lưu tab city
vừa rồi thành một tệp có tên ví dụ như select.sql
. Và khi học thêm các logic mới thì có thể sửa code và Ctrl+Shift+S
để lưu thêm thành các tệp .sql
khác nữa để tham khảo lại khi cần thiết.
SELECT fields
Nhân tiện khi nói tới câu lệnh SQL đầu tiên, chúng ta sẽ cập nhật một chút về thao tác này. Đó là chúng ta không phải lúc nào cũng sẽ cần chọn tất cả các trường dữ liệu để trả về cho phần mềm khách Client
. Cụ thể là ở vị trí dấu hoa thị *
thì chúng ta sẽ có thể ghi cụ thể tên của các trường dữ liệu muốn giữ trong tập kết quả để trả cho Client
.
Hãy sửa lại dòng code mà chúng ta đang có trong khung soạn thảo của MySQL Workbench
một chút. Lần này chúng ta sẽ tạm thời bỏ trường countrycode
vì chưa thực hiện thao tác truy vấn liên hợp sang bảng khác.
SELECT`id`,`name`,`district`,`population`FROM world.city;
Lưu ý đầu tiên về ngôn ngữ SQL
đó là chúng ta không cần phân biệt các ký tự chữ viết hoa hay chữ viết thường. Tuy nhiên các từ khóa của ngôn ngữ thì thường được viết hoa để dễ đọc hơn khi chúng ta viết code SQL trong các kiểu tệp khác. Ví dụ như khi viết một lệnh SQL trong một chuỗi của code JavaScript thì chúng ta sẽ không có tính năng hiển thị các từ khóa của SQL bằng màu đặc trưng như khi viết riêng trong tệp SQL.
Lưu ý thứ hai là tên của các trường dữ liệu thì thường được đặt trong một cặp dấu nháy ngược backstick
. Như vậy thì trình thông dịch của MySQL Server
sẽ không báo lỗi cú pháp trong trường hợp chúng ta đặt tên cột trùng hợp với một từ khóa đã có sẵn của ngôn ngữ.
Sau khi sửa lại code, bạn nhấn vào biểu tượng hình tia sét ở ngay bên dưới tên tab city
của khung soạn thảo code để gửi lại yêu cầu cho MySQL Server
và xem kết quả.
SELECT .. LIMIT
Về giới hạn của tập kết quả thì hiện tại cái khung soạn thảo code của MySQL Workbench
đang đặt giới hạn là Limit to 1000 rows
. Do đó nên ở khung Output
ở phía bên dưới màn hình – thì yêu cầu được gửi có thêm đoạn LIMIT 0, 1000
. Tức là câu lệnh yêu cầu thực tế đã được tự động chỉnh sửa lại một chút trước khi gửi tới MySQL Server
và chỉ chọn ra 1000
bản ghi đầu tiên trong bảng.
Bạn có thể sửa lại lựa chọn Limit to 1000 rows
ở ngay bên dưới tên tab city
của khung soạn thảo code thành Don't limit
để truy vấn tất cả các bản ghi đang có trong bảng. Hoặc sửa lại câu lệnh với phần LIMIT x, y
tự thêm vào, trong đó thì x
là số bản ghi mà bạn muốn bỏ qua, và y
là số bản ghi muốn chọn bắt đầu tính từ bản ghi thứ x+1
.
SELECT`id`,`name`,`district`,`population`FROM world.city
LIMIT10,5;-- SELECT
Một lưu ý nho nhỏ nữa là để viết chú thích comment
trong code SQL
thì chúng ta có thể mở đầu bằng hai dấu gạch ngang --
. Như vậy phần nội dung sau ký hiệu --
tính cho đến hết dòng đó sẽ được trình thông dịch xem là comment
.
SELECT .. ORDER BY
Để chọn ra các bản ghi mới nhất thay vì các bản ghi đầu tiên thì chúng ta có thể sắp xếp các bản ghi trong tập kết quả theo trị số id
với chiều ngược lại trước khi đặt giới hạn LIMIT
như sau:
SELECT`id`,`name`,`district`,`population`FROM world.city
ORDERBY`id`DESCLIMIT10,5;-- SELECT
Về chiều sắp xếp các bản ghi thì chúng ta có từ khóa DESC
(descending) để sắp xếp theo chiều giá trị giảm dần; Còn mặc định là ASC
(ascending) để sắp xếp theo chiều giá trị tăng dần. Về tiêu chí sắp xếp thì chúng ta có thể chọn nhiều hơn một trường dữ liệu và viết liệt kê với các dấu phẩy ,
giống như phần sau từ khóa SELECT
.
NodeJS Client
Ok.. như vậy là chúng ta đã biết thêm một vài yếu tố mở rộng căn bản đầu tiên của thao tác truy vấn dữ liệu SELECT
. Ấn tượng chung chung cho tới thời điểm này đó là một câu lệnh SQL
có tính mô tả thông tin rất linh hoạt so với một câu lệnh C
hay JavaScript
. Đây là đặc điểm chúng của các ngôn ngữ đặt nền móng trên Declarative Programming
.
Cụ thể là với các ngôn ngữ thuộc nhóm này thì chúng ta sẽ tạo ra ít câu lệnh để biểu thị tuần tự các thao tác cần thực hiện để đi tới tập kết quả. Thay vào đó thì code Declarative
mang tính chất mô tả ngắn gọn về thao tác cần thực hiện ở ngay dòng đầu tiên SELECT
; Sau đó thì ngôn ngữ sẽ cung cấp nhiều từ khóa hỗ trợ gắn kèm binding
các yếu tố mô tả thêm chi tiết cho thao tác cần thực hiện FROM
, ORDER BY
, LIMIT
.
Bây giờ chúng ta sẽ thử viết code Client
trên nền NodeJS và gửi yêu cầu tới MySQL Server
đang chạy kia. Yêu cầu là sẽ cần có một project NodeJS
đã npm init
xong xuôi và cài thêm package
hỗ trợ mysql
. Ở đây mình sẽ sử dụng lại project
cũ đã code từ Series Tự Học Lập Trình Web mà mình đã thực hiện trước đó. Bạn có thể npm init
một cái mới cũng được.
npm install mysql --save
const mysql =require("mysql");var instance = mysql.createConnection({
host:"localhost",
port:"3045",
user:"root",
password:"123456789"});
instance.connect(async(error)=>{if(error !=null)throw error;else
console.log("Connected");});var sql ="SELECT `id`, `name`, `district`, `population` "+"FROM world.city "+"ORDER BY `id` DESC "+"LIMIT 10, 5 "+"; -- SELECT";// sql
instance.query(sql,async(error, resultset)=>{if(error !=null)throw error;else
console.table(resultset);});
Trước khi chạy lệnh npm test
thì có một lưu ý nho nhỏ, đó là ở thời điểm hiện tại thì mình mới biết rằng package mysql
không hỗ trợ chế độ bảo mật mới của MySQL
theo cài đặt mặc định.
Chúng ta sẽ cần mở lại tệp cài đặt MySQL Community
và chọn Reconfigure
ở dòng MySQL Server
và chọn Next
qua bảng Type and Networking
để đặt lại chế độ xác thực đăng nhập ở bảng Authentication Method
thành User Legacy Authentication Method
.
Sau đó nhập mật khẩu cho tài khoản root
đã đặt là 1->9
và Next->Next->Excute
để khởi động lại MySQL Server
với thiết lập vừa thay đổi.
npm test
Conntected
...
Trong trường hợp bạn không sử dụng NodeJS mà đang code trên nền tảng khác thì có thể Google tới W3Schools.com hoặc TutorialsPoint.com để biết thêm chi tiết. Bây giờ thì chúng ta sẽ chuyển qua chủ đề về các kiểu dữ liệu trong MySQL
như đã đề cập ở bài trước.
(chưa đăng tải) [Declarative Programming + SQL] Bài 4 – Types & Constrains
Nguồn: viblo.asia