Sơ lược về truy vấn SQL

Như đã nói ở bài trước: tạo và quản lý cơ sở dữ liệu bằng phpMyadmin thay vì thực hiện chúng trên giao diên thì bây giờ ta sẽ tìm hiểu một cách nữa là làm trên command line vì có một số chuyện không thể giải quyết ở giao diện.

Giới thiệu:

Là ngôn ngữ để “thế giới bên ngoài” (PHP, PHPMyAdmin, MySql Command line, Navicat) tương tác với Mysql server nhằm :

  • Tạo/xoá database, import/export dữ liệu
  • Tạo/xoá/chỉnh table
  • Thêm/chỉnh/xoá/chỉnh dữ liệu trong các table

Các câu lệnh quản lý csdl từ command line tổng quát:

     show databases;            //Hiện list các database trong mysql server
     use TênDatabase;           // chọn database hiện hành
     show tables;               // Hiện list các table trong database hiện hành
     create database bcdonline; //Tạo database tên bcdonline

Ngôn ngữ SQL:
1. Tạo bảng dữ liệu:

<!--
CREATE TABLE <TenTable> (
     <TenField1> <kiểu dữ liệu> (<FieldSize>) | NULL | NOT NULL | AUTO_INCREMENT,
     <TenField2> <kiểu dữ liệu> (<FieldSize>) | NULL | NOT NULL ,
     ...
     PRIMARY KEY (<TenField>) ,
     UNIQUE (<TenField>),
     FOREIGN KEY (<TenField>)  REFERENCE <TenTable>
);
-->

Kiểu dữ liệu:

  • Kiểu số nguyên: INT, INTEGER
  • Số thực: FLOAT, DOUBLE
  • Chuỗi: CHAR, VARCHAR
  • Logic: BOOLEAN
  • Ngày tháng: DATE, TIME, DATETIME

Sau Primary Key, UNIQUE có dấu phẩy.
UNIQUE là field không là khóa chính nhưng có các giá trị không trùng nhau.
Foreign key nhiều record thì có dấu phẩy phía sau.
AUTO_INCREMENT: tự động tăng

Ví dụ: Tạo table trong database QuanLyTinTuc

<!--      CREATE TABLE LOAISP      (           idLoai INT NOT NULL AUTO_INCREMENT,           Ten VARCHAR(255) NOT NULL,           ThuTu INT NULL,           PRIMARY KEY (idLoai)       ); -->

2. Xem cấu trúc 1 table

<!--

     DESCRIBE <TenBang>  hoặc
     DESC <TenBang>

-->

Ví dụ:

     DESC LoaiSP;

3.Thêm dữ liệu vào bảng:

Cách 1:

<!--
     INSERT INTO <TenBang>  VALUES (giaTri1, giatri2,...)
-->

Các giá trị sẽ điền các giá trị vào các field theo đúng thứ tự xuất hiện trong bảng. Fied làm khoá chính để chuỗi trống.

Ví dụ:

     INSERT INTO LoaiSP  VALUES ('', 'NoKia',2);

Cách 2:

<!--
     INSERT INTO <TenBang>  (TenField1, TenField2,…) VALUES (giaTri1, giatri2,…)
-->

Thứ tự các field có thể không nhất thiết giống như thứ tự các field trong bảng.
Có thể không cần ghi mọi field.
Thứ tự dữ liệu phải tương ứng với các field liệt kê phía trước.

Ví dụ:
Thêm 1 Loại SP mới:

     INSERT INTO LoaiSP (thutu, ten) VALUES ( 3, "Sony");

4. Xem hết dữ liệu trong 1 table:

<!--
    SELECT * <TenBang> ;
-->

Ví dụ:

      SELECT * FROM LoaiSP;

5. Chỉnh sửa dữ liệu:

<!--
     UPDATE <tentable> SET
     Tenfield1=giatri1, TenField2=giatri2
     WHERE <ĐiểuKiện>
-->

Phần where có thể bỏ nhưng nguy hiểm vì nó có thể chỉnh tất cả dữ liệu trong bảng của bạn theo 1 dòng duy nhất khi không gàng buộc bởi where.
Ví dụ:

     UPDATE LoaiSP SET ten='Motorola' where idLoai=1

6. Xóa dữ liệu:

<!--
     DELETE FROM <TenBang>  WHERE <ĐiềuKiện>
-->

Phần where có thể bỏ nhưng nguy hiểm nó có thể xóa cả dữ liệu trong bảng của bạn.
Ví dụ:

     DELETE FROM LoaiSP where idLoai=1

Tiếp đến chúng ta sẽ thực hành nha các bạn: Mời bạn downlads webtintuc data này về import vào MySQL để thực hành.

Truy vấn dữ liệu:

Cú pháp chung:

<!--

     SELECT * | < TenField1,TenField2,... >
     From < TenBang1, TenBang2, ... >
     WHERE < Điều kiện kết bảng> | <Điều kiện lọc >
     ORDER BY < TênField1 ASC|DESC, TenField2 ASC/DESC , ... >  // Điều kiện sắp xếp
     GROUP BY < TenField1, TenField2, ... >                     // Điều kiện phân nhóm
     HAVING < Điều kiện lọc theo nhóm >

-->

Phần Select, From là bắt buộc. Phần where order by, group by, having là không bắt buộc
WHERE điều kiện lọc dữ liệu và điều kiện kết bảng
ORDER BY : sắp xếp dữ liệu theo field1, field 2.
Order by phải nằm sau where

Câu lênh select đơn giản:

Chỉ có phần select from. Có thể có thêm where

Ví dụ:

<!--             SELECT idLT, Ten, AnHien FROM Loaitin ; // Lấy idLT, Ten, AnHien trong bảng loại tin      SELECT idLT, Ten  FROM LoaiTin WHERE AnHien=1; // Lấy idLT, Ten trong bảng loại tin có AnHien = 1      SELECT idTin, Ngay, TieuDe  FROM Tin WHERE month(Ngay)=3; //Lấy idTin, Ngay, TieuDe trong bảng tin có tháng upload = 3      SELECT idTin, Ngay, TieuDe  FROM Tin WHERE Ngay=date('2008-4-3'); // Lấy idTin, Ngay, TieuDe trong bảng tin có ngày update là 2008-4-3      SELECT idTin, Ngay, TieuDe  FROM Tin WHERE Ngay=curdate(); // Lấy idTin, Ngay, TieuDe trong bảng tin có ngày update là hôm nay -->

Lấy các tin trong ngày hôm nay (Bạn phải chỉnh đồng hồ của máy lại thành 1 ngày có tin trong database thì mới thấy tin)

     SELECT idTin, Ngay, TieuDe  FROM Tin WHERE month(Ngay)=month(curdate());

Lấy các tin trong tháng hiện tại (Bạn phải chỉnh đồng hồ của máy lại thành tháng có tin trong database thì mới thấy tin)

Câu lệnh sắp xếp dữ liệu:

Có phần select, from, order.

Ví dụ:

<!--      SELECT idLT, Ten, ThuTu FROM Loaitin ORDER BY Ten ASC; // Sắp xếp theo tên      SELECT * FROM TheLoai WHERE AnHien=1 ORDER BY ThuTu  ASC; // Lấy tất cả từ bảng TheLoai, hiện và sắp xếp theo cột thứ tự tăng dần      SELECT idTin, Ngay,TieuDe FROM Tin  ORDER BY Ngay DESC; // Lấy mọi tin , tin mới hiện trước SELECT idTin, Ngay, TieuDe, idLT FROM Tin  WHERE idLT=1 ORDER BY Ngay DESC; // Lấy mọi tin trong loại thể thao , tin mới hiện trước SELECT idTin, Ngay,TieuDe FROM Tin  ORDER BY Ngay DESC limit 0,10; // Lấy 10 tin mới nhất SELECT idTin, SoLanXem,TieuDe FROM Tin  ORDER BY SoLanXem DESC limit 0,10; // Lấy 10 tin xem nhiều nhất SELECT idTin, SoLanXem,TieuDe FROM Tin  WHERE idLT=9  ORDER BY SoLanXem DESC limit 0,10; // Lấy 10 tin xem nhiều nhất trong loại tin xă hội -->

Ghi chú:

     Update tin set SoLanXem=SoLanXem+1 where idTin=2; // Cập nhật số lần xem tin số 2

Câu lệnh phân nhóm:

Có dùng thêm phần group by, thường kết hợp với các hàm tính toán cho từng nhóm: SUM, MAX, MIN, AVG, COUNT
Ví dụ:

<!-- SELECT  idUser, count(idTin) as SoTin FROM tin GROUP BY idUser; SELECT  idSK, count(idTin) as SoTin FROM tin GROUP BY idSK; -->

Nếu có lọc dữ liệu dựa theo các hàm tính toán thì điều kiện lọc sẽ đặt trong HAVING
Ví dụ:

<!--    SELECT  idUser, count(idTin) as SoTin FROM tin GROUP BY idUser HAVING count(idTin) >=10
-->

Câu lệnh select tìm kiếm:

% : đại diện cho nhiều ký tự
_ : đại diện cho đúng 1 ký tự

Ví dụ:

<!--

SELECT idTin, Ngay, TieuDe  FROM Tin where TieuDe like 'C%'  
// Tìm bắt đầu bằng chữ C      

SELECT Username, HoTen, Email FROM Users where Username like 't_'  
// Tìm bắt đầu bằng t và một ký tự nào đó bất kỳ 

-->

Câu lệnh select có kết bảng

Ví dụ :

<!--

SELECT  idTin, Tin.idSK, Mota , TieuDe
FROM Tin, SuKien
WHERE Tin.idSK= SuKien.idSK
ORDER BY idSK ASC
//Lấy những tin có trong bảng tin và nhưng tin đó có trong bảng sự kiện đồng thời sắp xếp tăng dần theo idSK

SELECT  idTin,  Users.Username, Loaitin.Ten, TieuDe
FROM Tin, Users, LoaiTin
WHERE Tin.idUser= Users.idUser AND  Tin.idLT=LoaiTin.idLT
Order By Ngay Desc Limit 0,10
// Lấy 10 tin trong bảng tin theo loại tin và sắp xếp theo ngày giảm dần (tin mới)

-->

Câu lệnh select lồng nhau:

Ví dụ:

<!--      SELECT idtin, Ngay, TieuDe FROM tin WHERE  Ngay >= All (SELECT Ngay FROM Tin)
// Lấy tin mới nhất

     SELECT idLT, Ten FROM loaitin WHERE  idLT in (SELECT idLT FROM Tin group by idLT)
// Lấy danh sách các loại tin có tin

-->

Select ngẫu nhiên:

<!-- SELECT idTin, TieuDe from tin order by rand() limit 0,3; // Lấy 3 tin ngẫu nhiên SELECT idBC, Mota from BinhChon order by rand() limit 0,1; // Lấy 1 câu hỏi ngẫu nhiên -->

Kết luận: Trong bài này bạn sẽ hệ thống lại các kiến thức về truy vấn bằng câu lệnh, rõ ràng áp dụng rất nhiều trong lúc chúng ta lập trình web. Chúc các bạn thành công!

VN:F [1.9.22_1171]
Rating: 9.3/10 (8 votes cast)
Sơ lược về truy vấn SQL, 9.3 out of 10 based on 8 ratings
Share This