Truy vấn SELECT - lấy dữ liệu từ bảng theo điều kiện


tự học mysql 11/09/2015 Cùng chuyên mục

Bài này tìm hiểu truy vấn SELECT ...FROM WHERE dùng để lấy dữ liệu từ bảng theo điều kiện - thuộc về chuỗi 3 loại truy vấn cơ bản nhất của mysql: TẠO - CẬP NHẬT - LẤY DỮ LIỆU.

Ở bài trước - các bạn đã tìm hiểu các thao các thêm - xóa - cập nhật dữ liệu vào 1 bảng. Xem kết quả đạt được thông qua dòng thông báo: Query OK! ... row affected. Ở bài này, tiến thêm một bước nữa - các bạn tìm hiểu câu lệnh SELECT ... FROM, dùng để lấy dữ liệu trong bảng, hoàn thành quá trình tương tác cơ bản tới cơ sở dữ liệu bao gồm 3 quá trình:

  1. Xây dựng cấu trúc bộ khung cho cơ sở dữ liệu, các bảng
  2. Thêm - Xóa - Sửa dữ liệu vào cơ sở dữ liệu (thông qua bảng)
  3. Lấy dữ liệu trả ra theo yêu cầu

TRUY VẤN DỮ LIỆU ( SELECT FROM WHERE)

Cú pháp:

SELECT <danh sách thuộc tính> 
FROM <danh sách bảng> 
[WHERE <điều kiện>]
[GROUP BY <danh sách thuộc tính nhóm>]
[HAVING <đk kết thành 1 nhóm>]
[ORDER BY <danh sách thuộc tính sắp xếp>]
[LIMIT offset, row count]
//[...] là các tùy chọn

Thực thi câu truy vấn này, hệ thống sẽ lấy ra các cột - dòng dữ liệu thỏa mãn điều kiện truy vấn. Trong đó:

  • danh sách thuộc tính - là các cột sẽ được lấy ra, liên quan đến kết quả
  • danh sách bảng - các bảng liên quan đến câu truy vấn
  • điều kiện - để chọn hoặc ghép các dòng dữ liệu ( các bộ dữ liệu)
  • danh sách thuộc tính nhóm:  danh sách các thuộc tính để gom nhóm các bộ dữ liệu lại
  • điều kiện nhóm: (liên hệ tới danh sách thuộc tính nhóm) - điều kiện chọn nhóm
  • danh sách thuộc tính sắp xếp - kết quả lấy ra sẽ được sắp xếp dựa trên việc sắp xếp của các thuộc tính này.
  • Tùy chọn [LIMIT offset, row count] - giới hạn kết quả trả ra, tính từ vị trí offset trong các dòng dữ liệu, lấy ra row count: số lượng các dòng được lấy ra tính từ vị trí offset - thường dùng tùy chọn này cho các ứng dụng phân trang

Kết quả của lệnh truy vấn là một bảng dữ liệu.
(*) - bạn có thể sử dụng ký tự * cho danh sách thuộc tính để chỉ rằng - lấy tất cả các thuộc tính trong bảng
(*) - thuộc tính lấy ra có thể được chỉ định theo bảng ví dụ: student.student_name ( chỉ định lấy ra thuộc tính student_name từ bảng student)

Ví dụ: Lấy tất cả dữ liệu từ bảng student

SELECT * FROM student;

Ví dụ: Lấy ra dòng dữ liệu có student_name = 'Nguyễn Văn Công'

SELECT * FROM student WHERE student_name = 'Nguyễn Văn Công';

Ví dụ: Lấy ra thông tin teacher đang làm chủ nhiệm cho student - ở ví dụ này lấy dữ liệu từ 2 bảng theo điều kiện

SELECT * FROM student, teacher WHERE (student.teacher = teacher_id);

ĐẶT TÊN TRONG MỆNH ĐỀ SELECT

Sử dụng từ khóa as - ví, đặt tên cho phép đếm số lượng student là 'tong_so_sinh_vien' - lúc này 'tong_so_sinh_vien' trở thành một thuộc tính - hữu ích khi sử dụng các ứng dụng khác như PHP để xuất ra dữ liệu.

SELECT count(*) as 'tong_so_sinh_vien' FROM student;

Bạn sẽ thấy kết quả trả ra là một bảng - với tên thuộc tính là tong_so_sinh_vien - giá trị là tổng số các dòng của bảng student.

tong_so_sinh_vien
2

Tên các bảng cũng có thể được đặt tên cho ngắn gọn dễ nhớ - ví dụ:

SELECT SV.student_name, SV.student_birth FROM student as SV;

Các phép toán số học

Các phép toán +, -, *, / có thể được áp dụng cho các giá trị số trong mệnh đề SELECT.
Ví dụ: Lấy ra kết quả tăng chiều cao lên 5cm cho các student (* nếu trước đó các bạn đã xóa thuộc tính student_height bây giờ thêm lại thuộc tính student_height và thêm dữ liệu cho cột này)

//thêm thuộc tính student_height cho bảng student
ALTER TABLE student ADD COLUMN student_height decimal(5,1);
//cập nhật dữ liệu cho bảng student - cho thuộc tính student_height - cho giá trị là 150
UPDATE student SET student_height = 150;
//thêm phép toán + 
SELECT student_height+5 FROM student;

Ví dụ: Tăng thêm 5cm cho student 'Nguyễn Văn A'

/* cập nhật student_height =(chiều cao trước đó)+5
UPDATE student
SET student_height = student_height+5 
WHERE student_name = 'Nguyễn Văn A';
/*xem kết quả
SELECT * FROM student;

Các phép toán so sánh và luận lý

Dùng trong mệnh đề WHERE hoặc HAVING để xây dựng các điều kiện chọn và kết dữ liệu

  • = (so sánh bằng), <, <= (nhò hơn hoặc bằng), >=, <> (khác) , != (khác)
  • BETWEEN <giá trị cận dưới> AND <giá trị cận trên>
  • AND, OR, NOT

Ví dụ: Tìm các student có chiều cao lớn hơn 150 và nhỏ hơn 154 - ( 2 câu truy vấn đều cho cùng kết quả )

SELECT * FROM student WHERE (student_height >= 150) AND (student_height <= 154);
SELECT * FROM student WHERE ( student_height BETWEEN 150 AND 154);

 Khử các dòng giống nhau

Thêm từ khóa distinct cho mệnh đề SELECT - ví dụ

/*chèn dữ liệu vào bảng student
INSERT INTO student (teacher, student_name, student_height) VALUE (1,'Trần Văn Nam', 150);
/*xem kết quả
SELECT * FROM student;
.... student_name student_height
.... Nguyễn Văn A 155.00
.... Nguyễn Văn Công 150.00
... Trần Văn Nam 150.00

Khử các dòng trùng nhau ( lấy ra các dữ liệu riêng biệt cho cột student_height)

SELECT distinct student_height FROM student;

Kết quả:

student_height
155.0
150.0

Phép toán so sánh chuỗi

LIKE <mẫu so sánh> [ESPCAPE <ký tự thoát>]

- Mẫu so sánh:

  • Chuỗi ký tự để só sánh
  • % - thay cho một đoạn ký tự tùy ý
  • _ thay cho một ký tự tùy ý

- Ký tự thoát:

  • Ký tự để loại bỏ chức năng đặc biệt của % và _ ( xem là các ký tự để so sánh - không phải để thay thế cho một đoạn ký tự)
  • Có thể sử dụng ký tự bất kỳ không xuất hiện trong mẫu so sánh

Ví dụ: Tìm student họ Nguyễn

SELECT * FROM student WHERE student_name LIKE 'Nguyễn%';

Ví dụ: Tìm student họ Nguyễn_ -với ký tự thoát

SELECT * FROM student WHERE student_name LIKE "Nguyễn\_% escape '\'";

Gom nhóm các bộ

(*) - WHERE được thực hiện trước GROUP BY
(*) - HAVING chỉ xuất hiện khi có GROUP BY
Ví dụ: Lấy ra các nhóm chiều cao của student ( đếm số lượng tương ứng)

SELECT student_height, count(student_id) as 'so_luong' FROM student GROUP BY student_height;

Các hàm tập hợp

  • SUM<tên thuộc tính>) - tỉnh tổng cá giá trị của thuộc tính
  • MAX(<tên thuộc tính>) - tìm giá trị lớn nhất của thuộc tính
  • MIN(<tên thuộc tính>) - tìm giá trị nhỏ nhất của thuộc tính
  • AVG(<tên thuộc tính>) - tính giá trị trung bình của thuộc tính
  • COUNT(*) - đếm số dòng của bảng
  • COUNT(<tên thuộc tính>) - đến các giá trị khác null của thuộc tính

Ví dụ: tìm giá trị lớn nhất, nhỏ nhất, trung bình cho chiều cao của student

SELECT 
	MAX(student_height) as GTLonNhat,
	MIN(student_height) AS GTNhoNhat,
	AVG(student_height) AS GTTrungBinh
FROM student;

SẮP XẾP KẾT QUẢ

Sử dụng ORDER BY<danh sách thuộc tính sắp xếp> - theo các thứ tự: ASC: tăng dần - DESC: giảm dần - mặc định là ASC

Ví dụ: Sắp xếp student theo chiều cao - tăng dần

SELECT * FROM student ORDER BY student_height ASC;

GIỚI HẠN KẾT QUẢ

Sử dụng LIMIT OFFSET, ROW COUNT ... (*) - dòng thứ 1 trong bảng được tính là offset 0
Ví dụ: Lấy ra bảng student - từ dòng thứ 2 - lấy 2 dòng;

SELECT * FROM student LIMIT 2,2;

TỔNG KẾT

Sau bài này - các bạn đã có thể áp dụng được các bài toán trong thực tế như quản lý thành viên, thư viện, ..., bài viết, chuyên mục. Bài kế tiếp - giới thiệu về phép kết giữa 2 bảng (JOIN). 




Bình luận:


cơ sở dữ liệu mysql