04/10/2018, 17:01

[BÀI 21] CÁC LỆNH INSERT VÀ SELECT TRONG MYSQL

Ở bài trước tôi đã hướng dẫn xong các thao tác với bảng và database, ở bài hôm nay tôi sẽ hướng dẫn các lệnh cơ bản với database bao gồm chèn dữ liệu, lấy dữ liệu, cập nhật dữ liệu, xóa dữ liệu. Câu lệnh insert (chèn dữ liệu vào bảng): Cú pháp: INSERT INTO TEN_BANG (trường_a, trường_b, ...

Ở bài trước tôi đã hướng dẫn xong các thao tác với bảng và database, ở bài hôm nay tôi sẽ hướng dẫn các lệnh cơ bản với database bao gồm chèn dữ liệu, lấy dữ liệu, cập nhật dữ liệu, xóa dữ liệu.

Câu lệnh insert (chèn dữ liệu vào bảng):

Cú pháp: INSERT INTO TEN_BANG (trường_a, trường_b, …,trường_z) VALUES(giá_trị_trường_a,giá_trị_trường_b,…,giá_trị_trường_z)

Trong đó:

  • Phần in hoa là cú pháp bắt buộc.
  • Trường_a, trường_b, … : là tên các trường (cột) trong bảng cần insert vào. Một số trường chúng ta không cần insert  như id (khi đặt id là tự động tăng), mỗi lần insert vào 1 bảng, trường id sẽ được mysql tự động điền, bạn không cần phải điền vào trường này.
  • Giá_trị_trường_a, giá_trị_trường_b,… : là giá trị của các trường mà chúng ta cần insert vào. Đối với dữ liệu kiểu chuỗi cần đặt trong dấu nháy đơn, với dữ kiệu kiểu số không được đặt trong dấu nháy đơn.
  • Các trường, giá trị các trường cần insert được ngăn cách nhau bởi dấu phẩy. Trường, giá trị của trường cuối cùng không có dấu phẩy.

Ví dụ: Tôi có một bảng ‘demo’ như hình:

insert_sql

Hiện tại bảng ‘demo’ của tôi chưa có dữ liệu, để thực hiện insert dữ liệu vào bảng này tôi thực hiện lệnh sql như sau:

INSERT INTO demo(ho_ten,email,dia_chi) VALUES (‘Hồ Ngọc Trung’,’trung0194@gmail.com’,’DevPro Việt Nam, 147 Mai Dịch, Cầu Giấy, Hà Nội’)

Lệnh trên sẽ insert vào bảng ‘demo’ vào 3 trường ho_ten , email, dia_chi các giá trị tương ứng lần lượt là ‘Hồ Ngọc Trung’, ‘trung0194@gmail.com’, ‘DevPro Việt Nam, 147 Mai Dịch, Cầu Giấy, Hà Nội’.

Sau khi insert thành công, bảng ‘demo’ sẽ như sau:

insert_sql_saukhi_insert

Lưu ý 1: ở trên tôi insert các dữ liệu vào database đều là dữ liệu kiểu chuỗi, nên tôi phải đặt giá trị của các trường vào nháy đơn. Nếu với bảng trên tôi có thêm 1 trường ‘tuoi’ (kiểu dữ liệu kiểu int,để lưu tuổi), thì lệnh insert của tôi là:

INSERT INTO demo(ho_ten,email,dia_chi,tuoi) VALUES (‘Hồ Ngọc Trung’,’trung0194@gmail.com’,’DevPro Việt Nam, 147 Mai Dịch, Cầu Giấy, Hà Nội’,22)

Để ý rằng số 22 tôi không cho vào nháy kép. Khi viết các lệnh trong sql chúng ta phải tuân thủ quy tắc này, nếu không sẽ xảy ra lỗi.

Lưu ý 2:

  • Tôi không nhập dữ liệu cho trường ‘id_sv’ nhưng trường này vẫn có giá trị là 1, bởi vì tôi đã đặt trường này là tự động tăng, mysql sẽ tự động điền cho tôi.
  • Thứ tự tên các trường có thể viết theo thứ tự bất kỳ, nhưng giá trị tương ứng của các trường phải ghi theo thứ tự của các trường ở trước. Ví dụ với lệnh insert ở trên, tôi cũng có thể viết lại như sau:
  • INSERT INTO demo(email,ho_ten,dia_chi) VALUES (‘trung0194@gmail.com’,’Hồ Ngọc Trung’,’DevPro Việt Nam, 147 Mai Dịch, Cầu Giấy, Hà Nội’)

Câu lệnh select (lấy dữ liệu):

Select đơn giản: 

Cú pháp:

  • Chỉ đích danh muốn lấy những trường nào từ database: SELECT tên_trường_a,tên_trường_b,…,tên_trường_n FROM tên_bảng
  • Lấy tất cả các dữ liệu trong bảng: SELECT * FROM tên_bảng

Trong đó:

  • Tên_trường_a,tên_trường_b,…,tên_trường_n: là các trường mà bạn cần lấy dữ liệu ra
  • Tên_bảng: là tên bảng mà bạn cần lấy dữ liệu
  • Dấu sao ‘*’ đại diện cho tất cả các trường có trong bảng.

Giả sử tôi có bảng ‘demo’ và có các dữ liệu như sau:

select_mysql_dongian

Bây giờ tôi muốn lấy ra tất cả dữ liệu trong bảng ‘demo’ , tôi có thể viết theo 2 cách  như sau:

  • SELECT * FROM demo
  • Hoặc SELECT id_sv,ho_ten, email, dia_chi FROM demo

Trường hợp tôi chỉ muốn lấy ra trường họ tên và email  mà thôi, lúc này tôi viết như sau:

  • SELECT ho_ten,email FROM demo

Select với điều kiện nào đó (SELECT … WHERE …):

Trong trường hợp bạn muốn lấy dữ liệu ra, và những dữ liệu này phải thỏa mãn những điều kiện nào đó mà bạn định sẵn. Như: lấy ra danh sách sinh viên có ngày sinh vào tháng 1, lấy ra danh sách sinh viên có địa chỉ ở Hà Nội. Hay cả 2 là lấy ra danh sách sinh viên sinh vào tháng 1 và quê ở Hà Nội, … Với select dạng này bạn cần thêm các điều kiện vào câu select của mình.

Cú pháp:

  • SELECT các_trường_cần_lấy FROM tên_bảng WHERE điều_kiện

Các câu lệnh điều kiện chúng ta sẽ ghi sau từ khóa ‘WHERE’, vậy có những loại điều kiện nào. Đơn cử như điều kiện dạng so sánh, điều kiện dạng tìm kiếm, điều kiện kết hợp,…

  • Kiểu điều kiện dạng so sánh: như so sánh chuỗi, so sánh số. Trong đó dấu bằng ‘=’ biểu thị cho sự giống nhau, 2 dấu bé hơn + hớn hơn ‘<>’ biểu thị cho sự khác nhau. Dấu bé hơn ‘<‘ biểu thị cho sự bé hơn, tương tự với dấu lớn hơn. ‘>=’ lớn hơn hoặc bằng, ‘<=’ bé hơn hoặc bằng. Vd lấy ra họ tên  sinh viên có năm sinh khác năm 1994 từ bảng ‘sinhvien’ : SELECT ho_ten FROM sinhvien WHERE nam_sinh <> 1994
  • Kiểu điều kiện dạng tìm kiếm: Vd chúng ta muốn lấy ra những sinh viên mà trong họ tên có chữ ‘Trung’, mysql sẽ lọc họ tên các sinh viên và tìm xem trong họ tên người đó có chữ ‘Trung’ hay không và trả về kết quả cho bạn. Để tạo được điều kiện này các bạn dùng từ khóa ‘LIKE’. Chi tiết tôi sẽ trình bày ở bên dưới.
  • Kiểu điều kiện kết hợp: Vd bạn muốn lấy ra sinh viên vừa  có tuổi là 22 và vừa có địa chỉ ở Hà Nội (2 điều kiện phải xảy ra đồng thời) với điều kiện dạng này, bạn dùng từ khóa ‘AND’ để nối các điều kiện. Vd: SELECT ho_ten FROM sinhvien WHERE tuoi = 22 AND dia_chi = ‘Hà Nội’. Tương tự với từ khóa ‘OR’ (hoặc) ứng với trường hợp chỉ cần xảy ra ít nhất 1 điều kiện.
  • ….

Select có điều kiện với từ khóa LIKE:

Để hiểu đơn giản về Like chúng ta tham khảo bảng sau:

Bảng ví dụ về từ khóa like
WHERE number LIKE ‘22%’ Tìm kiếm các giá trị trong trường ‘number’ bắt đầu bằng số 22
WHERE number LIKE ‘%22% Tìm kiếm các giá trị trong trường ‘number’ mà có số 22 ở giữa
WHERE number LIKE ‘%22’ Tìm kiếm các giá trị trong trường ‘number’ mà có số 22 ở cuối
WHERE number LIKE ‘_00%’ Tìm kiếm bất kỳ giá trị nào trong trường number  có 00 trong vị trí thứ hai và ba
WHERE number LIKE ’22_%_%’ Tìm kiếm bất kỳ giá trị nào trong trường number  mà bắt đầu với số 22 và có độ dài tối thiểu là 3 ký tự
WHERE number LIKE ‘_22%0194’ Tìm kiếm bất kỳ giá trị nào trong trường number mà có 2 ở vị trí thứ hai và kết thúc là 0194
WHERE number LIKE ‘2201___94’ Tìm kiếm bất kỳ giá trị nào trong trường number mà bắt đầu bằng 2201 3 ký

tự sau bất kỳ và kết thúc bằng 94.

Từ bảng ví dụ trên tôi có thể tổng hợp lại như sau:

  • Dấu gạch dưới ‘_’ biểu thị cho 1 ký tự
  • Ký tự phần trăm ‘%’: biểu thị cho các ký tự bất kỳ (bao gồm cả ký tự trống).

Để tìm kiếm dữ liệu với dữ liệu không được xuất hiện các ký tự (chuỗi) định sẵn, chúng ta sử dụng từ khóa ‘NOT’ trước từ khóa ‘LIKE’ , ví dụ: NOT LIKE ‘22%’ (không được bắt đầu bằng số 22).

Select có điều kiện với WHERE IN:

Cú pháp: SELECT tên_trường FROM tên_bảng WHERE trường_cần_kiểm_tra IN (giá_trị_1,giá_trị_2,…,giá_trị_n)

Khi sử dụng từ khóa where in, dữ liệu lấy ra sẽ được so sánh với các giá trị lập trình viên cho trước, và phải trùng với 1 trong các giá trị này. Ví dụ lấy ra lớp (lop) của 1 sinh viên  ở trong bảng sinh viên (sinh_vien) với tên sinh viên (ten_sv) là “Hồ Ngọc Trung” hoặc “Nguyễn Duy Nam” hoặc “Phạm Nguyên” thì câu truy vấn sẽ là:

SELECT lop FROM sinh_vien WHERE ten_sv IN (‘Hồ Ngọc Trung’,’Nguyễn Duy Nam’,’Phạm Nguyên’)

Select có điều kiện với WHERE BETWEEN:

Lệnh này được sử dụng khi bạn muốn lấy dữ liệu nằm trong một khoảng nào đó. Hai điều kiện sẽ được nối với nhau bằng từ khóa ‘AND’:

Ví dụ lấy ra danh sách sinh viên có ngày sinh từ 22/1/1994 đến 22/1/1995

SELECT tensinhvien FROM sinhvien WHERE ngaysinh BETTWEN ‘1994:01:22’ AND ‘1995:01:22’

Select với sắp xếp (SELECT … ORDER BY …):

Chẳng hạn bạn đang muốn lấy ra danh sách các bài viết mới nhất hiển thị ra ngoài trang chủ, lúc này bài đăng nào có thời gian thêm gần đây nhất sẽ hiển thị đầu tiên, và thứ tự các bài viết khác sẽ xếp sau.

Cú pháp:

SELECT các_trường_cần_lấy_dữ_liệu FROM tên_bảng_cần_lấy_dữ_liệu ORDER BY tên_trường_cần_sắp_xếp kiểu_sắp_xếp

Trong đó:

  • các_trường_cần_lấy_dữ_liệu : các trường mà bạn cần lấy dữ liệu ra
  • tên_bảng_cần_lấy_dữ_liệu: bảng mà bạn cần lấy dữ liệu ra
  • tên_trường_cần_sắp_xếp: trường điều kiện sắp xếp
  • kiểu_sắp_xếp: kiểu sắp xếp có 2 loại (tăng dần/giảm dần), tăng dần: ASC , giảm dần: DESC

Ví dụ lấy ra tên sinh viên (ten_sv) và sắp xếp theo cột điểm (diem) giảm dần (người có điểm cao hơn sẽ hiển thị trước) ở trong bảng sinh viên (sinh_vien):

SELECT ten_sv FROM sinh_vien ORDER BY diem DESC

Select với số bản ghi định sẵn (SELECT … LIMIT …):

Câu lệnh này được dùng khi bạn muốn lấy ra k bản ghi ở trong n bản ghi.

Cú pháp:

SELECT các_trường_cần_lấy_dữ_liệu FROM tên_bảng_cần_lấy_dữ_liệu LIMIT vị_trí_bắt_đầu_lấy,số_bản_ghi_cần_lấy

Trong đó:

  • LIMIT: là từ khóa
  • vị_trí_bắt_đầu_lấy: vị trí bắt đầu lấy (vị trí trong bảng bắt đầu từ 0)
  • số_bản_ghi_cần_lấy: số bản ghi cần lấy.

Lưu ý: câu lệnh LIMIT phải đặt ở cuối câu truy vấn.

Ví dụ: lấy ra danh sách 3 sinh viên có tên (ten_sv) có điểm (diem) cao nhất trong bảng sinh viên (sinh_vien) và sắp xếp người có điểm cao hơn sẽ hiển thị trước:

SELECT ten_sv FROM sinh_vien ORDER BY diem DESC LIMIT 0,3

Ở trên tôi có ghi LIMIT 0,3 nghĩa là bắt đầu lấy từ vị trí số 0 và lấy 3 bản ghi, tương ứng sẽ lấy các bản ghi ở vị trí 0,1,2

Tạo định danh mới cho tên trường khi select:

Chúng ta có thể đặt một định danh cho tên trường vừa select:

Cú pháp:

SELECT tên_trường AS định_danh FROM …

Trong đó:

  • AS: là từ khóa khi muốn định danh
  • định_danh: là định danh cho trường vừa select

Ví dụ: SELECT ma_sinh_vien AS code_id FROM sinhvien

Một số hàm trong lệnh select count,sum,…:

Tên hàm Ý nghĩa
AVG  Tính giá trị trung bình
COUNT  Đếm số lượng
SUM  Tính tổng
MIN  Bản ghi có giá trị nhỏ nhất
MAX  Bản ghi có giá trị lớn nhất
distinct  Loại bỏ giá trị trùng lặp

Ví dụ muốn tính tổng tiền của các sản phẩm có trong danh sách, chúng ta có hàm sum() để tính tổng.

Khi viết SELECT ten_sanpham,sum(gia) FROM danhsach_sp , kết quả sẽ trả về danh sách tên các sản phẩm và tổng giá của tất cả các sản phẩm đấy. Tuy nhiên trường sum(gia) không nằm trong bảng  danhsach_sp của chúng ta mà do lệnh sum tạo thành, kết quả của lệnh sum sẽ tạo nên 1 bảng ảo. Khi dùng các hàm này bắt buộc phải dùng GROUP BY để gom nhóm, nếu không có GROUP BY câu lệnh trên sẽ bị lỗi.

Lệnh gom nhóm (GROUP BY) khi select:

Cú pháp:

SELECT tên_các_trường_cần_lấy_dữ_liệu,các_hàm FROM tên_bảng WHERE … GROUP BY tên_các_trường_cần_lấy_dữ_liệu

Chú ý: GROUP BY đứng sau WHERE

Lệnh điều kiện HAVING khi gom nhóm:

Với các hàm count,sum,… thì WHERE không thể kiểm tra được điều kiện của các hàm này, ví dụ bạn đang có danh sách các đơn hàng, mỗi đơn hàng người dùng lại mua nhiều sản phẩm, và việc tính tổng tiền các sản phẩm phải dùng hàm sum() để tính. Lúc này bạn không thể dùng WHERE để kiểm tra hàm sum() được. Do vậy để kiểm tra điều kiện của hàm sum() hay các hàm khác chúng ta cần dùng đến HAVING

Cú pháp:

SELECT tên_các_trường_cần_lấy_dữ_liệu,các_hàm FROM tên_bảng WHERE … GROUP BY tên_các_trường_cần_lấy_dữ_liệu HAVING tên_hàm_cần_kiểm_tra điều_kiện_kiểm_tra dữ_liệu_so_sánh

Ví dụ: Lấy ra danh sách tên khách hàng, số điện thoại khách hàng, số tiền thanh toán đơn hàng, với điều kiện là thời gian đặt hàng sau ngày 17 tháng 10 năm 2016 và giá trị đơn hàng phải lớn hơn 100.000đ

SELECT tenkhachhang,sodienthoai, sum(donhang) FROM giohang WHERE thoigiandathang >= ‘2016:10:17’ GROUP BY tenkhachhang,sodienthoai HAVING sum(donhang) > 100000

Xem video hướng dẫn về các lệnh insert và select trong mysql:

0