SQL CƠ BẢN(PART 1)
Bài đăng này đã không được cập nhật trong 3 năm
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;
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;
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;
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
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:
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;
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;
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;
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)
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',
'khanhnd@framgia.com',
'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 = 'hungnv@framgia.com',
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('ngocnt@framgia.com', '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', 'doannv@framgia.com', NOW());
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;
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;
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';
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');
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%'
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;
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;
Ở 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
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
All rights reserved