SQL CƠ BẢN(PART 1)

Hầu hết các web application ngày nay đều tương tác với database, thường là với ngôn ngữ SQL. Bài viết này sẽ bắt đầu bằng một số khái niệm cũng như các ví dụ cơ bản về câu lệnh SQL và sử dụng chúng làm việc với MySQL

Chuẩn bị

SQL (Structure Query Language) là một ngôn ngữ để tương tác với một hệ quản trị cơ sở dữ liệu hay còn gọi là RDBMS(Relational Database Mangement Systems) như MySQL, Oracle, Sqlite... Để thực thi những câu truy vấn trong bài viết, bạn cần cài có một RDBMS và trong bài này mình sẽ sử dụng MySQL cùng mới màn hình console.

CREATE DATABASE: Tạo một Database

Đầu tiên hãy mở MySQL console và login. Sau khi login thành công bạn hãy nhập câu query sau và enter:

CREATE DATABASES my_first_db;

Selection_001.png

Bạn phải để ý dấu ';' được thêm ở cuối câu query. “CREATE DATABASE” là một câu lệnh và nó cũng không phân biệt chữ hoa hay chữ thường trong SQL. Nhưng để dễ đọc cũng như đúng convention thì nên viết hoa những key words.

Bạn cũng có thể thêm charset cho database vừa tạo bằng cách thêm vào cuối câu query như sau:

CREATE DATABASE my_first_db DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

SHOW DATABSES: Liệt kê toàn bộ databases

Câu query này để show toàn bộ databases mà bạn có.

SHOW DATBASES;

Selection_001(001).png

DROP DATABASE: Xóa một database.

bạn có thể dùng câu lệnh này để xóa một database

DROP DATABASE my_first_db;

drop.png

Note: cẩn thận với câu lệnh này nhé. Vì nó sẽ không có bất kỳ cảnh báo nào và sẽ xóa trực tiếp luôn

USE: Làm việc với một database

USE my_first_db

Đây không phải là một câu query. Nó chỉ nhưu một trạng thái 'statement' và không cần có dấu ';' ở cuối. Nó nói với MySQL sử dụng database nào đó để làm việc cho session hiện tại. Sau khi chạy câu lệnh trên chúng ta đã sẵn sàng thao tác với nó

Một bảng trong Database là gì:

Bạn có thể nghĩ một database table cũng như một spreadsheet hay một file csv bình thường. Nó giữ cấu trúc của dữ liệu

Selection_004.png

Như ví dụ trên. Một bảng thì có column names và các rows của dữ liệu. Với SQL queries chúng ta có thể tạo bảng này. Đương nhiên cũng có thể add, read and delete data.

CREATE TABLE: Tạo một bảng trong database

Với câu query này chúng ta có thể tạo bảng trong DB. Không may mắn cho lắm vì Docs của MySQL thì không được dễ đọc đối với người mới bắt đầu. Cấu trúc của một câu query có thể rất phúc tạp. Nhưng để bắt đầu chúng ta sẽ đi từ nhứng điều đơn giản trước.

Câu query sau sẽ tao một bảng với hai columns

CREATE TABLE users (
	username VARCHAR(20),
	create_date DATE
);

Chúng ta có thể viết một câu query trên nhiều dòng, thậm chí có thể sử dụng tab để thụt đầu dòng làm sao cho câu query dễ đọc nhật.

Dòng đầu tiên: tạo một bảng tên là users, tiếp theo trong dấu ngoặc tròn chúng ta có một list các columns(các trường) cách biệt nhau bởi dấu ','. Mỗi column name chúng ta có một kiểu dữ liệu theo sau.

VARCHAR(20) tương đương với kiểu string và tối đa 20 ký tự. DATE là kiểu dữ liệu cho ngày tháng và chỉ rõ format sử dụng để lưu là YYYY-MM-DD.

PRIMARY KEY

Bạn có thể coi PRIMARY KEY như một cách để xác định một row dữ liệu hay một bản ghi(record) trong một bảng. Vì thế chúng ta sẽ thêm PRIMARY KEY vào user_id.

CREATE TABLE users (
	user_id INT AUTO_INCREMENT PRIMARY KEY,
	username VARCHAR(20),
 	create_date DATE
);

AUTO_INCREMENT sẽ tự động tạo một id cho mỗi lần add thêm một record. Cả PRIMARY KEY và AUTO_INCREMENT đề không bắt buộc. Nhưng nó được khuyến khích sử dụng thuận tiện hơn trong việc thiết kế.

Giờ hãy chạy câu lệnh trên xem thế nào:

primary.png

OKE! được rồi đấy.

SHOW TABLES: liệt kê toàn bộ bảng

SHOW TABLES; Tương tự như SHOW DATABASES;thì câu query này cho phép chúng ta xem danh sách các bảng mà trong cơ sở dữ liệu đang làm việc ở đây là my_first_db

EXPLAIN: Xem cấu trúc của bảng

Để biết bảng đó có những column nào, kiểu dữ liệu ra sao hay đâu là khóa chính thì câu lệnh này sẽ giúp bạn.

EXPLAIN users;

explain.png .png

DROP TABLE: xóa một bảng

Nó cũng như DROP DATABASES. Câu query này sẽ xóa bảng và toàn bộ nội dung của nó. Cũng không có cảnh báo gì luôn. Cần phải cẩn thận nhé. Thử với bảng users xem:

DROP TABLE users;

Selection_001(007).png

ALTER TABLE: Thay đổi cấu trúc trong một bảng

Câu lệnh này có thể thay đổi một hoạc nhiều cấu trúc của một bảng như thêm hoặc xóa column, đổi kiểu dữ liệu … chúng ta sẽ đi qua một vài ví dụ đơn giản:

Thêm Một column mới vào bảng

Thêm một column email sau username với kiểu varchar tối đa 50 ký tự.

ALTER TABLE users ADD email VARCHAR(50) AFTER username;

Selection_001(008).png

Xóa một column trong bảng

ALTER TABLE users DROP email;

Bạn có thể tự hiểu chứ. dễ hiểu phải không 😄

Thay đổi một column trong bảng

Đôi khi bạn có thể muốn thay đổi một số thuộc tính của một column như đổi tên, đổi datatype. thử dổi tên column username → user_name nhé:

ALTER TABLE users CHANGE username user_name VARCHAR(50)

Selection_001(009).png

INSERT: thêm dữ liệu vào bảng

Hãy thử thêm một vài dữ liệu vào bảng user bằng INSERT!

INSERT INTO users VALUES(
    NULL,
    'khanhnd',
    '[email protected]',
    '2016/7/4'
);

Như bạn có thể thấy VALUES() chứa danh sách các field cách nhau bởi duấ phảy và phải đúng thứ tự như chúng ta đã định trước đó khi create table. Một điều nữa Id ở câu query trên đang để null vì chúng ta đã sử dụng auto increment, vì vậy nó sẽ tự đông tạo ra id.

Cách viết 2

Có cách viết khác để thêm insert nữa

INSERT INTO users SET
	user_name = 'hungnv',
    email = '[email protected]',
    create_date = '1016-5-5' ;

lần này chúng ta sử dụng từ khóa SET thay vì VALUES và nó không cần phải dùng dấu ngoặc tròn nữa.

  • chúng ta không phải gán cho toàn bộ các column trong table. Những column bỏ qua thì chúng sẽ được gán giá trị NULl.

  • Không còn phải nhớ thứ tự như cách viết 1 nữa. thích gán cho column nào thì gán thôi .

Cách viết 3 Đây là cách viết thứ 3

INSERT INTO users(email, user_name, create_date)
	VALUES('[email protected]', 'ngocnt', '2015-9-8');

Cách viết này sẽ theo thứ tự mà ta liệt kê sau tên bảng, ở đây là users. Giá trị sẽ được đặt trong dấu nháy đơn và cách biệt nhau bởi đấu ','. Bạn thích cách viết nào thì dùng cách đấy thôi. Mình thì thường dùng cách số 3

NOW();

Bạn hoàn toàn có thể sử dụng các function trong MySQL. hàm NOW() sẽ trả về ngày hiện thời. Vì thế bạn có thể sử dụng nó để tự động thiết lập DATE column trong khi insert một bản gi mới.

INSERT INTO users(user_name, email, create_date)
    VALUES('doannv', '[email protected]', NOW());

Selection_001(011).png

Nhưng column create_date chỉ chứa ngày thôi, và không có time vì vậy dùng CURDATE() thay vì sử dụng NOW()

SELECT: đọc dữ liệu từ một bảng

để có thể đọc được dữ liệu từ table thì SELECT query sẽ cho phép bạn làm điều đó.

SELECT * FROM users;

Selection_001(012).png

Trong trường hợp sử dụng kí tự * điều này có nghĩa là sẽ lấy toàn bộ colomns của bảng. Nếu bán muốn chỉ rõ nhưng column nào bạn muốn thì có thể liệt kê ra như sau.

SELECT user_name, email FROM users;

Selection_001(013).png

Mệnh đề WHERE

Đôi khi chúng ta chỉ mốn lấy một số bản gì mà chúng ta cần thôi chứ không phải toàn bộ. Mẹnh đề where này sẽ giúp filter những dữ liệu mà chúng ta cần . VD: lấy bản gi mà có user_name là doannv.

SELECT user_name, email FROM WHERE user_name = 'doannv';

Selection_001(014).png

Bạn có thể nghĩ nó như một IF trong lập trình vậy. WHERE cho phép bạn đặt diều kiện trong câu query và kết quả trả về phù hợp.

Bạn cũng có thể sử dụng các phép so sánh khác trong điều kiện với WHERE VD : !=, <, >, <=, >=, và bạn cũng có thể kết hợp nhiều điều kiện với nhau với AND, OR. NOTE: nếu giá trị kiểu số thì không phải để trong dấu nháy đơn.

IN()

Đây là một hàm rất hữu dụng để lấy ra các bản ghi mà match với nhiều giá trị do mình định nghĩa trong hàm IN().

SELECT * FROM users WHERE user_name IN('doannv', 'hungnv');

Selection_001(015).png

LIKE

Cho phép bạn thực hiện tác vụ tìm kiếm. Từ khóa mà bạn muốn tìm được đặt trong dấu %. ở ví dụ sẽ lấy toàn bộ các bản gì mà user_name của nó có chứa chữ 'a'.

SELECT * FROM users WHERE user_name LIKE '%a%'

Selection_003.png

ORDER BY

Cho phép bạn sắp xếp một column của kiết quả trả về theo thứ nào đó.

SELECT * FROM user ORDER BY user_name DESC;

Selection_001(017).png

Nếu bạn chỉ sử dụng ORDER BY mà không có option đằng sau thì tự động sẽ sắp xếp theo thứ tự alpha- beta. còn ngược lại thì thêm DESC Như VD trên mình đã sắp xếp trường user_name

LIMIT...OFSET

Bạn cũng có thể giới hạn số lượng bản ghi trả về

SELECT * FROM users LIMIT 2;
SELECT * FROM users LIMIT 1 OFFSET 2;
SELECT * FROM users LIMIT 2,1;

Selection_001(018).png

Ở VD trên LIMIT 2 chỉ trả về 2 bản ghi đầu. LIMIT 1 OFFSET 2 trả về một kết quả sau 2 kết quả đầu tiên. LIMIT 2,1 thì tương tự nhưng số thứ nhất là của offset só thứ 2 sẽ là limit

UPDATE: update dữ liệu trong một bảng

Câu truy vấn này sử dụng để cập nhật dữ liệu cho một bảng. Trong hầu hết các trường hợp nó được sử dụng với mệnh đề where, nếu bạn muốn chỉ rõ số row muốn update. Nếu mệnh đề Where không có thì toàn bộ các dòng sẽ được thay đổi giống nhau

Selection_001(019).png

Bạn cũng có thể sủ dụng LIMIT để giới hạn số bản ghi được update

DELETE: xóa dữ liệu trong một bảng

Nó cũng như update vậy. Câu query này thì có thể sử dụng với mệnh đề WHERE

DELETE FROM users WHERE user_name = 'khanhnd';

TRUNCATE TABLE

Xóa toàn bộ bản ghi trong một bảng bạn có thể dùng

DELETE FROM users;

Nhưng để có hiệu năng tốt hơn nữa thì bạn nên dùng TRUNCATE thay vì DELETE/ TRUNCATE TABLE users; câu query này cũng reset AUTO_INCREMENT bà bản ghi đầu tiên sẽ bắt đầu từ 1. Nhưng nếu bạn dùng DELETE thì nó không được reset đâu mà nó đếm tiếp đấy.

CONCLUTION

Qua một số các ví dụ cơ bảnm, Hi vọng sẽ giúp bạn nắm được một số syntax cơ bản trong MySQL