[Declarative Programming + SQL] Bài 3 – Scripts & Clients

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ệu
  • FROM – từ bảng dữ liệu
  • world.city – tên của chema.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->9Next->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

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *