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.