gianghl1983
5/30/2018 - 4:22 PM

Basic MySQL Syntax

A. BẢNG MÃ
1/ Khi tạo CSDL, tạo bảng, column => Bảng mã (Collation: utf8_general_ci) => chuẩn nhất cho tiếng việt

B. KIỂU DỮ LIỆU
2/ Độ dài cho kiểu dữ liệu string (chuỗi) - varchar: Tối thiểu nên để là 128 cho những trương thông tin ngắn. Thông thường: 255. Đối với những dữ liệu fixed: Cố định luôn độ dài

3/ Đối với các trường thông tin lưu json. Thường nên để kiểu text.

Ví du: Sử dụng cho permission:

Route: (URL) -> controller-method
$perms = [
['bills-index', 'bills-update', 'bill-delete', 'bills-create']
;]


4/ Dữ liệu về tiền tệ -> KDL là float, double, decimal

FLOAT(5,2)

C. RÀNG BUỘC

1/ Khóa chính: PRIMARY KEY - thường là cột id trong table: (chọn PRIMARY, AI (auto increment))


2/ NULL - Đối với những trường thông tin có tính chât không bắt buộc (Có thể cập nhật hoặc không) => thiết lập cho phép NULL. Mục đích là khi thao tác với câu lệnh INSERT INTO cho dù không thiết lập giá chị cho trường thông tin này
câu lệnh cũng không báo lỗi.
3/ Tất cả trường dữ datetime thường mặc định là NULL.

1970-01-01

4/ Default: Khi muốn thiết lập giá trị mặc định cho trường thông tin này, khi mà insert dữ liệu, hay cập nhât mà không thao tác đến cột này thì nó vẫn nhận giá trị mặc định.

/5 Khóa ngoại
- Cascade: Cha cập nhật -> Con cũng cập nhật theo, Cha bị xóa, thì con chua id của cha cũng bị xóa luôn. (on update, on delete)
- restrict: Cha cập nhât, xóa thì cũng ko ảnh hưởng gì đến con.
- Để tạo liên kiết khóa ngoại, thì trường cần tạo liên bắt buộc phải được index

D. Index
Khóa chính, khóa ngoại, unique => Mặc định được đánh chỉ mục + Những cột nào cần truy vấn (theo điều kiện, lọc)  phải đánh chỉ mục.
Ví dụ:
Users: thường tìm kiếm theo: code, fullname, address, gender, status, email, phone
--
varchar = để độ dài 128 hoặc 255


E. Truy vấn - Tìm kiếm thông tin (Bản ghi) trong 1 hoặc nhiều tables
SELECT [column1, column2, column 3,...column_n] FROM TENBANG
WHERE DIEU_KIEN
GROUP BY
DIEU_KIEN_GROUP
HAVING
........




1/ Lấy tất cả bản ghi
- Lấy tất tất cả các cột

SELECT * FROM TEN_BANG
Ví dụ: Lấy ra tất cả người dùng trong bảng users
SELECT * FROM Users

- Lấy danh sách cột cụ thể 

SELECT [column1, column2, column 3,...column_n] FROM TENBANG

Ví du: Lấy Mã người dùng, Tên người dùng, Email, Phong

SELECT id, code,fullname,email, phone FROM users

2/ Lấy theo điều kiện

- Ví dụ 1: Lấy ra những người dùng, có giới tình là nam
SELECT * FROM users WHERE gender = 'male'
- Ví dụ 2: Lấy ra DS người dùng có giới tính là nam và ở Thanh Hóa
SELECT * FROM `users` WHERE gender = 'male' AND province_id = 3 
Toán tử AND: Khi các điều kiện xảy ra đồng thời.
- Ví dụ 3: Lấy ra DS người dùng là nữ ở Thanh Hóa và HÀ Nội
// Nhóm điều kiện
SELECT * FROM `users` WHERE gender = 'female' AND (province_id = 3 OR province_id = 1)

- Ví dụ 4: Lấy ra những người tên có chữ Giang
Tìm kiếm tương đối với LIKE.
+ Không quan tâm đầu, chỉ quan tâm cuối TEN_COT LIKE '%Chuoi_Can_Tim'
//SELECT * FROM `users` WHERE fullname LIKE '%Giang' 
+ Không quan tâm cuối, chỉ quan tâm đầu TEN_COT LIKE 'Chuoi_Can_Tim%'
+ Không quan tâm, không quan tâm cuối TEN_COT LIKE '%Chuoi_Can_Tim%'
//SELECT * FROM `users` WHERE fullname LIKE 'L%' AND '%N%' AND '%G'

Custome LIKE
//SELECT * FROM `users` WHERE fullname LIKE 'L%%n%%g'

- Ví dụ 4: Lấy ra danh sách người ở Hà Nội, Hải Phòng, Nghệ An, Hà Tĩnh, TPHCM, Thanh Hóa

--- Dieu kien xảy ra không đồng thời
Lấy theo OR
SELECT * FROM users WHERE province_id = 1 OR province_id = 3 OR province_id = 5;
Hoặc IN
Lấy theo điều kiện TRONG (IN)
SELECT * FROM users WHERE province_id IN (1,3,6,7,2,10)

3/ Lấy  có giới hạn - LIMIT OFFSET

- Ví dụ 1: Lấy ra 2 người dùng.
SELECT * FROM users LIMIT 2;
SELECT * FROM users WHERE province_id = 3 LIMIT 2;

Lấy theo giới hạn và thiết lập vị trí bắt đầu
SELECT * FROM users LIMIT 2 OFFSET 1;

BÀI TOÁN PHÂN TRANG

Mỗi trang sẽ hiển thị 10 bản ghi. Tổng số bản ghi là 48
SELECT * FROM users LIMIT 10 OFFSET 0;
SELECT * FROM users LIMIT 10 OFFSET 10;
SELECT * FROM users LIMIT 10 OFFSET 20;
SELECT * FROM users LIMIT 10 OFFSET 30;
SELECT * FROM users LIMIT 10 OFFSET 40;

1 | 2 | 3 | 4 | 5

$limit = 1;
$page = 3;
$offset = ($page-1)*$limit;
SELECT * FROM users WHERE gender = 'male' LIMIT 1 OFFSET 1;

4/ Sắp xếp (ORDER BY TE_COT [DESC, ASC])
SELECT * FROM users ORDER BY id  DESC LIMIT 2;

5/ Lấy 1 bản ghi
SELECT * FROM users WHERE id = 5 LIMIT 1;
SELECT * FROM user WHERE code ='KH03' LIMIT 1;
6/ Đếm số bản ghi 
SELECT COUNT(*) FROM users
SELECT COUNT(*) FROM users WHERE province_id = 1;
7/ Định danh
SELECT U.id,U.fullname, U.phone FROM users U;
SELECT U.id as user_id, U.fullname as name, U.phone FROM users U;

Mã người dùng | Tên người dùng | Địa chỉ | Mã Quận/Huyện | Tên Quận/Huyện| Mã Tỉnh | Tên Tỉnh
user_id | user_name | address | district_id | district_name | province_id | province_name

8/ Truy vấn nâng cao 

Kết nối nhiều bảng.

SELECT users.id as user_id, users.fullname as user_name, users.address, districts.id as district_id, districts.name as district_name, provinces.id as province_id, provinces.name as province_name
FROM users 
INNER JOIN districts ON districts.id=users.district_id
INNER JOIN provinces ON provinces.id=users.province_id


SELECT U.id as user_id, U.fullname as user_name, U.address, D.id as district_id, D.name as district_name, P.id as province_id, P.name as province_name
FROM users U 
INNER JOIN districts D ON D.id=U.district_id
INNER JOIN provinces P ON P.id=U.province_id