01/10/2018, 15:31

Bài 6: Các Lệnh Cơ Bản Truy Vấn Dữ Liệu

1) Chèn dữ liệu vào bảng Cú pháp: INSERT INTO table_name(field1, field2, … fieldN) VALUES (value1, value2, … valueN); INSERT INTO Tên_bảng(tên_cột) VALUES(Giá_trị_tương_ứng); Ví dụ: INSERT INTO SINHVIEN( MaSV, TenSV) VALUES(‘SV001’,’NGUY ...

1)Chèn dữ liệu vào bảng

Cú pháp:

INSERT INTO table_name(field1, field2, … fieldN)

VALUES

(value1, value2, … valueN);

INSERT INTO Tên_bảng(tên_cột)    VALUES(Giá_trị_tương_ứng);

Ví dụ: INSERT INTO SINHVIEN( MaSV, TenSV) VALUES(‘SV001’,’NGUYEN VAN A’);

Chúng ta vừa thực hiện một ví dụ đưa dữ liệu một dòng vào bảng Sinh Viên gồm mã và tên của sinh viên.

Vấn đề đặt ra là nếu ta muốn thêm nhiều dòng dữ liệu vào cùng một bảng thì làm như thế nào?

Chúng ta không cần phải lặp lại phát biểu insert into nhiều dòng mà bằng cách đưa nhiều cụm giá trị trong values và nằm trong dấu ngoặc đơn () và mổi cụm giá trị cách nhau dấu phẩy

Ví dụ : INTSERT INTO SINHVIEN(MaSV, TenSV)

VALUES

(‘SV001’,”NGUYEN VAN A’),

(‘SV002’,’TRAN VAN B’),

…….

‘SV00N’,’NGUYEN VAN TEO’) ; //kết thúc ta cho dấu ;

Một điều hết sức lưu ý là : khi ta tạo bảng với khóa chính là có giá trị một chuỗi đặc biệt hoặc là dãy số mà ta muốn chỉ định thì khi thực hiện chèn dữ liệu vào thì ta sẽ đưa kèm field khóa chính vào. Như trong ví dụ trên là MaSV.

Nếu chúng ta chỉ định khóa chính là một kiểu số nguyên và auto increment (tự động tăng) thì khi insert dữ liệu ta không cần đưa field khóa chính vào, hệ thống sẽ tự điếm giá trị khóa chính cao nhất và tăng thêm một đơn vị cho dòng dữ liệu mới thêm vào.

Vậy chứ nếu tôi vẩn cố tình muốn đưa khóa chính vào, mặc dù sét nó là auto increment thì sao ? Câu trả lời là …các bạn nghĩ thử xem ? Xong rồi cho AD câu trả lời ngay comment bài này.

2)Truy xuất dữ liệu

Cú pháp :

SELECT tên_cột FROM tên_bảng

Ex: SELECT TenSV FROM SINHVIEN; //liệt kê kết quả tên sinh viên trong bảng SINHVIEN

Nếu có nhiều hơn 1 cột muốn hiễn thị thì ta đưa vào tên cột và cách nhau dấu phẩy

Cú pháp: SELECT field1, field2 … from table_name

Còn nếu muốn hiễn thị hết các cột bao gồm luôn khóa của bảng thì ta chỉ việc select * là xong.

3)Truy vấn dữ liệu có điều kiện

Cú pháp:

SELECT tên_cột FROM tên_bảng WHERE điều kiện;

SELECT field1, field2… FROM table_name WHERE condition;

Phát biểu này cho bạn lấy dữ liệu theo điều kiện đưa vào được thỏa.

Ví dụ tôi chỉ muốn lấy thông tin sinh viên NGUYEN VAN A thôi

SELECT * FROM SINHVIEN WHERE MaSV =’SV001’;

Nếu có nhiều hơn một điều kiện thì ta dùng thêm từ khóa liên kết AND, OR.

KEYWORD AND là ta muốn tất cả các điều kiện phải thỏa mãn

SELECT * FROM SINHVIEN WHERE MaSV =’SV001’ AND TenSV=’NGUYEN VAN A’; //2 điều kiện MaSV và TenSV phải thỏa thì mới cho ra kết quả.

KEYWORD OR là ta muốn lấy dữ liệu thỏa mãn một trong số các điều kiện đưa vào

SELECT * FROM SINHVIEN WHERE MaSV =’SV001’ OR MaSV=’SV002’;

Vậy là câu lệnh sẽ tìm dòng nào có MaSV là SV001 hoặc SV002 đều được trả về kết quả.

Các toán tử hổ trợ cho mệnh đề where:

Như ví dụ ở trên là ta dùng toán tử bằng = trong mệnh đề where, ngoài ra còn một số toán tử khác như : > (lớn hơn,nếu ta so sánh số), <, >=, <= và đặc biệt là toán tử không bằng != , <>. Các toán tử này đã rất phổ biến và các bạn đã hiểu, ad k cần giải thích thêm.

4)Truy xuất dữ liệu có điều kiện và sắp xếp

Đôi khi chúng ta muốn dữ liệu hiễn thị theo một trình tự nào đó, ví dụ tôi muốn hiễn thị tên sinh viên theo A, B, C, D…. từ thấp tới cao hoặc ngược lại .

MySQL cung cấp cho tao thêm phát biểu order by như sau:

Cú pháp:

SELECT * FROM table_name

WHERE condition

ORDER BY field ASC/DESC (tăng dần/giảm dần)

5)Truy xuất dữ liệu có giới hạn

Đối với những bảng dữ liệu lớn chúng ta chỉ muốn giới hạn kết quả sau mổi lần truy xuất, có thể là kết hợp với ngôn ngữ lập trình để phân trang thì ta sẽ dùng keyword limit để làm điều này

Cú pháp:

SELECT tên_cột FROM Tên_bảng

WHERE điều kiện

LIMIT vị trí bắt đầu, số record muốn lấy ra;

SELECT * FROM SINHVIEN where MaSV !=NULL limit 0,2;

Lấy ra sinh viên mà có mã sinh viên không bằng null(ko có nghĩa) và chỉ lấy bắt đầu từ sinh viên đầu tiên cho và lấy 2 người.

6)Cập nhật dữ liệu trong bảng

Vì lý do nào đó ta muốn sữa đổi dữ liệu đã lưu vào thì ta dùng câu lệnh để cập nhật nó

Cú pháp:

UPDATE tên_bảng SET tên_cột=Giá trị mới

WHERE (điều kiện);

Ex: update SINHVIEN set TenSV = ‘Ly Tieu Long ‘

Where MaSV=’SV001’ ;

Như vậy ta đã đổi tên sinh viên có mã số SV001 từ ‘NGUYEN VAN A’ thành ‘Ly Tieu Long’

Nếu ta không đưa điều kiện vào thì nó sẽ đổi hết trong bảng SINHVIEN, cột TenSV thành ‘Ly Tieu Long’ hết.

7)Xóa dữ liệu trong bảng

Cúp pháp;

DELETE FROM tên_bảng WHERE (điều kiện);

DELETE FROM SINHVIEN WHERE MaSV=“SV01”; //tiển em sinh viên này về nơi xa. Chắc nó không chịu hok nữa, hoạc khó đào tạo =))

8)Truy xuất dữ liệu trong nhiều bảng

  • Lấy dữ liệu các bảng mà có sự hiện diện dữ liệu tuong ứng ở các bảng

              Cú pháp:

SELECT tên_cột FROM Tên_các_bảng

WHERE kết nối các bảng;

Hoặc

SELECT tên_cột FROM tên_bảng_a

Join tên_bảng_b

On tên_bảng_b.khóa_ngoại= tên_bảng_a.khóa_chính
         Ví dụ:

SELECT TenSV,TenMon FROM SINHVIEN, MONHOC

WHERE SINHVIEN.MaSV=MONHOC.MaSV;

Hoặc

SELECT TenSV, TenMon FROM SINHVIEN

JOIN MONHOC

ON MONHOC.MaSV = SINHVIEN.MaSV

Nếu vì tên bảng quá dài, mà ta muốn sử dụng bí danh của bảng thì ta dùng từ khóa as ngay sau tên bảng, hoặc cách khoảng trắng cũng được, tuy nhiên tôi khuyên các bạn nên dùng as cho tường minh, dể đọc và có vẽ hay ho hơn

Ví dụ trên được viết lại như sau:

SELECT TenSV , TenMH FROM SINHVIEN AS SV

JOIN MONHOC AS MH

ON SV.MaSV=MH.MaSV;

Và khi đã đổi tên rồi thì các bạn nhớ đưa nó vào chỉ thị lấy tên cột tương ứng của từng bảng, nếu không lổi sẽ tìm đến bạn.

SELECT TenSV , TenMH è SELECT SV.TenSV, MH.TenMH

SINHVIEN

MaSV TenSV
SV001 LƯƠNG VĂN LẬU
SV002 TRẦN VĂN TÈO
SV003 HỒ BÁ KIỆN

JOIN

MaMH TenMH MaSV
MH001 Vật Lý SV001
MH002 Toán SV002
MH003 Hóa SV001

Vậy nếu ta thực hiện kết đầy đủ như câu truy vấn trên thì kết quả sẽ là sự có mặt dữ liệu tồn tại cả 2 bảng:

TenSV TenMH
LƯƠNG VĂN LẬU Vật Lý
TRẦN VĂN TÈO Toán
LƯƠNG VĂN LẬU Hóa
  • Lấy dữ liệu đầy đủ từ một bảng bên trái bất kể có tồn tại bên bảng bên phải hay không

Đó chính là LEFT JOIN. Khi chúng ta muốn hiễn thị đầy đủ dữ liệu bảng bên trái, và nếu không tôn tại bên bảng kết bên phải thì nó sẽ in ra dòng dữ liệu NULL hoặc rỗng

Cũng cách lấy dữ liệu như trên nhưng chúng ta đưa vào là left join thay vì join

SELECT SV.TenSV , MH.TenMH FROM SINHVIEN AS SV

LEFT JOIN MONHOC AS MH

ON SV.MaSV=MH.MaSV;

KẾT QUẢ:

TenSV TenMH
LƯƠNG VĂN LẬU Vật Lý
TRẦN VĂN TÈO Toán
LƯƠNG VĂN LẬU Hóa

 

HỒ BÁ KIỆN NULL
  • Lấy dữ liệu đầy đủ từ bảng bên phải

Ta dùng RIGHT JOIN

SELECT SV.TenSV , MH.TenMH FROM SINHVIEN AS SV

RIGHT JOIN MONHOC AS MH

ON SV.MaSV=MH.MaSV;

KẾT QUẢ:

TenSV TenMH
LƯƠNG VĂN LẬU Vật Lý
TRẦN VĂN TÈO Toán
LƯƠNG VĂN LẬU Hóa

9)Tóm tắt bài học

Trong bài học chúng ta đi từng cái riêng lẻ cho mệnh đề truy vấn dữ liệu, vậy nếu khi các keyword xuất hiện cùng một lúc thì thứ tự của chúng sẽ như thế nào

Như tôi muốn lấy giới hạn 5 dòng và sắp xếp giảm dần theo một điều kiện nào đó

Sau đây là cú pháp tổng quát:

SELECT field

FROM table_name

WHERE condition

GROUP BY (nhóm các dòng giá trị có fiel giống nhau lại thành 1, dùng trong đếm , tính toán tổng giá trị)

HAVING (bổ sung thêm điều, sẽ được học sau)

ORDER BY

LIMIT

Nế các keyword cùng xuất hiện trong truy cấn thì các bạn nhớ đưa theo thứ tự như cú pháp trên, nếu đảo lộn thì sẽ bị lổi.

Trong bài các bạn thấy tôi ghi câu truy vấn là chữ hoa, nhưng nếu các bạn ghi chữ thường thì mysql vẩn chấp nhận, nó không phân biệt hoa thường SELECT = select…

Và cuối cùng là 3 cái cách để lấy dữ liệu từ nhiều bảng:

  • lấy đầy đủ Join, dân giang hồ cổ xưa còn gọi nó là cross join, full join
  • lấy theo bên trái, left join
  • lấy theo bên phải right join.

Sau đây là một số bài tập giúp các bạn giải trí:

link down: BtapQLSV

Nhớ làm bài tập đầy đủ nhé các bạn. Có vấn đề gì thì vào comment để mọi người cùng giải quyết.

0