Giới thiệu cơ sở dữ liệu MYSQL

Bài học này chúng ta sẽ làm quen cách thao tác trên cơ sở dữ liệu MySQL:

  • Giới thiệu cơ sở dữ liệu MySQL
  • Cài đặt MySQL
  • Cấu hình
  • Kiểu dữ liệu
  • Khai báo các phát biểu

Giới thiệu về cơ sở dữ liệu MySQL

MySQL là cơ sở dữ liệu được sử dụng cho các ứng dụng Web có quy mô vừa và nhỏ. Tuy không phải là một cơ sở dữ liệu lớn nhưng chúng cũng có trình giao diện trên Windows hay Linux, cho phép người dùng có thể thao tác các hành động liên quan đến cơ sở dữ liệu.

Cũng giống như các cơ sở dữ liệu, khi làm việc với cơ sở dữ liệu MySQL, bạn đăng ký kết nối, tạo cơ sở dữ liệu, quản lý người dùng, phần quyền sử dụng, thiết kế đối tượng Table của cơ sở dữ liệu và xử lý dữ liệu.

Tuy nhiên, trong bất kỳ ứng dụng cơ sở dữ liệu nào cũng vậy, nếu bản thân chúng có hỗ trợ một trình giao diện đồ hoạ, bạn có thể sử dụng chúng tiện lợi hơn các sử dụng Command line. Bởi vì, cho dù bạn điều khiển MySQL dưới bất kỳ hình thức nào, mục đích cũng quản lý và thao tác cơ sở dữ liệu.

Cài đặt MySQL

Để cài đặt MySQL trên nền Windows bạn theo các bước sau:

  1. Trước tiên bạn chép tập tin mysql-4.0.0a-alpha-win.zip vào đĩa cứng hoặc chọn chúng từ đĩaq CD và giải nén tập tin
  2. Chạy tập tin Setup.exe, chọn đĩa C hay D
  3. Sau khi cài đặt thành công, bạn kiểm tra trong Windows Services xuất hiện dịch vụ mySQL hay không?. Để sử dụng được MySQL thì trạng thái của dịch vụ này phải ở chế độ Started.
Trong trường hợp MySQL không thể chạy được, do dịch vụ của MySQL chưa Started như , để có thể chạy được MySQL thì bạn cần một số thay đổi trong tập tin my.ini trong thư mục WINNT
--------------------------------------------------------------------- #This File was made using the WinMySQLAdmin 1.3 #Tool #9/11/2003 10:50:13 AM #Uncomment or Add only the keys that you know how works. #Read the MySQL Manual for instructions [mysqld-nt] basedir=C:/mysql #bind-address=127.0.0.1 datadir=C:/mysql/data #language=C:/mysql/share/your language directory #slow query log#= #tmpdir#= #port=3306 #set-variable=key_buffer=16M [WinMySQLadmin] Server=C:/mysql/bin/mysqld-nt.exe user=root password= QueryInterval=10

Tạo cơ sở dữ liệu và người dùng

Trong trường hợp bạn sử dụng giao diện đồ hoạ thì dùng ích quản trị cơ sở dữ liệu MySQL, bạn có thể chạy tập tin mysqlfront.exe trong thư mục MySQL Control, bằng cách chạy tập tin cửa sổ xuất hiện như hình 1. Nếu lần đầu tiên tạo kết nối cơ sở dữ liệu, bạn cần phải tạo một Connection, cung cấp tên Server hay IP của máy chứa MySQL.

Tuy nhiên, trong trường hợp máy chứa cơ sở dữ liệu MySQL là máy đang sử dụng, bạn có thể sử dụng localhost. Ngài ra, cũng giống như các cơ sở dữ liệu khác, Username mặc định của cơ sở dữ liệu MySQlrootPassword là rỗng.

Nếu bạn đã có cơ sở dữ liệu đang tồn tại, bạn có thể gõ tên cơ sở dữ liệu trong phần Databases ( nếu muốn mở nhiều database, bạn có thể dùng dấu ; để phân cách).

Trong trường hợp lần đầu tiên, bạn không cần cung cấp tên cơ sở dữ liệu, bạn có thể tạo chúng sau khi kết nối.

Kết nối cơ sở dữ liệu bằng MySQLFront Tool

Sau kết nối cơ sở dữ liệu thành công, trình điều khiển cơ sở dữ liệu MySQL có giao diện như hình 2, cộng việc đầu tiên bạn phải thực hiện là tạo cơ sở dữ liệu.

Bắt đầu từ menu có tên Tools | Create Database hay chọn tên root@localhost | R-Click | Create Database, cửa sổ xuất hiện như hình 3.

Giao diện điều khiển cơ sở dữ liệu MySQL

Cung cấp tên cơ sở dữ liệu, trong trường hợp này bạn có thể nhập Test, bấm nút OK, cơ sở dữ liệu xuất hiện trong cửa sổ điều khiển.

Tạo cơ sở dữ liệu có tên Test

Trong cả hai trường hợp tạo cơ sở dữ liệu bằng MySQL thành công như trên, bạn có thể tìm thấy tên cơ sở dữ liệu đó trong thư mục mysql/data như hình 4 sau:

Thư mục tin cơ sở dữ liệu Test

Quản lý người dùng

Làm thế nào để đăng nhậo vào cơ sở dữ liệu MySQL, bạn có thể sử dụng hai cách như trình bày ở trên. Tuy nhiên, sau khi tạo ra các username khác, bạn có thể sử dụng chúng để đăng nhập.

Để đăng nhập vào MySQL bằng Command line, bạn chỉ cần gõ >mysql – hostname –u username– p từ dấu nhắc hay đăng nhập bằng cách sử dụng trình giao diện đồ hoạ. Từ khoá -h hỉ ra rằng tên (computer name), IP, hay localhost của máy có sử dụng cơ sở dữ liệu MySQL, -u chỉ ra rằng bạn sử dụng username, username là tên username, -p được chỉ định khi username này có password. Trong trường hợp password là rỗng, bạn có thể không cung cấp tham số –p.

Để tạo User trong cơ sở dữ liệu MySQL, bạn có thể sử dụng hai cách trên. Nếu bạn thực hiện việc tạo một Username bằng Command line, bạn có thể gõ từ dấu nhắc như phát biểu sau:

GRANT Select, Insert, Update, Delete, Index, Alter, Create, Drop, References ON *.* TO 'myis'@'%' IDENTIFIED BY '12345678'

Trong phát biểu trên, vừa tạo ra User có tên myis, với hostname là cơ sở dữ liệu hiện hành, password là 1234 và được các đặt quyền Select, Insert, Update, Delete, Index, Alter, Create, Drop trên cơ sở dữ liệu hiện hành.

Trong trường hợp bạn tạo ra một Username không cung cấp các đặt quyền trên cơ sở dữ liệu, bạn có thể thực hiện như phát biểu tạo username: test, password: 1234 sau:

GRANT usage ON *.* TO 'test'@'%' IDENTIFIED BY '1234'

Nếu bạn sử dụng giao diện đồ hoạ, bạn có thể tạo username và gán quyền như trên bằng cách sử dụng menu có tên Tools | User-Manager, cửa sổ xuất hiện như hình 5.

Tạo Username

Cấp quyền cho người dùng

Các đặt quyền Select, Insert, Update, Delete, Index, Alter, Create, Drop trên cơ sở dữ liệu, bạn có thể tham khảo chi tiết trong bảng 1.

Các đặt quyền trên cơ sở dữ liệu
Loại Áp dụng Diễn giải
select tables,columns Cho phép user truy vấn mẩu in từ Table.
insert tables,columns Cho phép user thêm mới mẩu tin vào Table
update tables,columns Cho phép user thêm đổi giá trị của mẩu tin tồn tại trong Table
delete tables Cho phép user mẩu tin tồn tại trong Table
index tables Cho phép user thêm mới hay xó chỉ mục của Table
alter tables Cho phép user thay đổi cấu trúc của đối tượng Table hay Database tồn tại, như thêm cột vào trong Table tồn tại, thay đổi kiểu dữ liệu của cột dữ liệu,..
create databases,tables Cho phép user tạo mới đối tượng Table hay Database
drop databases, tables Cho phép user xóa đối tượng Table hay Database

Xuất phát từ các quyền có ảnh hưởng đến cấu trúc cơ sở dữ liệu, các đối tượng của cơ sở dữ liệu và dữ liệu, bạn có thể xem xét kỹ càng trước khi cấp quyền cho user àm việc trên cơ sở dữ liệu.

Ngoài các quyền trên, trong MySQL còn có một số quyền không gán mặc định như trong bảng 2, bạn có thể xem xét các đặt quyền quản trị để cấp cho người dùng.

Các đặt quyền quản trị trên cơ sở dữ liệu
Loại Diễn giải
reload Cho phép người quản trị nạp lại các Table, quyền, host, logs và Table
shutdown Cho phép người quản trị chaamsdwts hoạt động MySQL Server
process Cho phép người quản trị xem quá trình thực hiện của trình chủ và có thể chấm dứt một số quá trình đang thực thi
file Cho phép dữ liệu ghi vào Table từ tập tin

Những username bình thường không nên cấp quyền như trong bảng 2 cho họ, trong trường hợp bạn muốn cầp tất cả các quyền trong bảng 1 và Bảng 2 cho username khi tạo ra họ, bạn Table sử dụng từ khoá All thay vì All Privileges trong phát biểu tạo user như sau:

GRANT ALL ON *.* TO 'ekhang'@'%' IDENTIFIED BY '12345678'

Tương tự như vậy, trong trường hợp bạn không cung cấp bất kỳ đặt quyền nào trên cơ sở dữ liệu hiện hành, bạn có thể khai báo phát biểu cấp uyền như sau:

GRANT usage ON *.* TO 'ekhang'@'%' IDENTIFIED BY '12345678'

Xóa quyền của User

Để xoá các quyền của user từ cơ sở dữ liệu hiện hành, bạn có thể sử dụng phát biểu SQL có tên Revoke, phát biểu Revoke ngược lại với phát biểu Grant.

Nếu bạn xoá một số quyền của user, bạn có thể sử dụng khai báo như phát biểu sau:

Revoke privileges [(columns)] ON item From username

Trong trường hợp xoá tất cả các quyền của user, bạn có thể sử dụng phát biểu như sau:

Revoke All ON item From username

Nếu user đó được cấp quyền với tuỳ chọn Grant Option, để xoá các quyền đó của user, bạn có thể khai báo như sau:

Revoke Grant Option ON item From username

Để tham khảo chi tiết quá trình cấp và xoá quyền của một user, bạn có thể tham khảo một số phát biểu như sau:

Gán quyền Administrator cho user có tên fred trên mọi cơ sở dữ liệu trong MySQL, password của anh ta là mnb123, bạn có thể khai báo như sau:

Grant all On * To fred indetifyed by ‘mnb123’ With Grant Option;

Nếu bạn không muốn user có tên fred trong hệ thống, bạn có thể xoá anh ta bằng cách khai báo phát biểu sau:

Revoke all On * From fred;

Tạo một user có tên ekhang với password12345678, được làm việc trên cơ sở dữ liệu Test, không cấp quyền cho user này, bạn có thể khai báo như sau:

Grant usage On Test.* To ekhang identified by ‘12345678’;

Tương tự như vậy, trong trường hợp bạn muốn cấp một số quyền cho user có tên ekhang trên cơ sở dữ liệu Test, bạn có thể khai báo như sau:

Grant select, insert, delete, update, index, drop On Test.* To ekhang;

Nếu bạn muốn xoá bớt một số quyền của user có tên ekhang trên cơ sở dữ liệu Test, bạn có thể khai báo như sau:

Revoke update, delete, drop On Test.* From ekhang;

Nhưng trong trường hợp xoá tất cả các quyền của user có tên ekhang trên cơ sở dữ liệu Test, bạn có thể khai báo

Revoke All On Test.* From ekhang;

Kiểu dữ liệu của cơ sở dữ liệu MySQL

Trước khi thiết kế cơ sở dữ liệu trên MySQL, bạn cần phải tham khảo một số kiểu dữ liệu thường dùng, chúng bao gồm các nhóm như: numeric, date and time và string.

Đều cần lưu ý trong khi thiết kế cơ sở dữ liệu, bạn cần phải xem xét kiểu dữ liệu cho môt cột trong Table sao cho phù hợp với dữ liệu của thế giới thực.

Điều này có nghĩa là khi chọn dữ liệu cho cột trong Table, bạn phải xem xét đến loại dữ liệu cần lưu trữ thuộc nhóm kiểu dữ liệu nào, chiều dài cũng như các ràng buộc khác, nhằm khai báo cho phù hợp.

Loại dữ liệu numeric

Kiểu dữ liệu numeric bao gồm kiểu số nguyên trình bày trong bảng 3 và kiểu số chấm động, trong trường hợp dữ liệu kiểu dấu chấm động bạn cần phải chỉ rõ bao nhiều số sau đấu phần lẻ như trong bảng 4.

Kiểu dữ liệu số nguyên
Loại Range Bytes Diễn giải
tinyint -127->128 hay 0..255 1 Số nguyên rất nhỏ.
smallint -32768 ->32767 hay 0..65535 2 Số nguyên nhỏ.
mediumint -32768 ->32767 hay 0..65535 3 Số nguyên vừa
int -263 ->263-1 hay 0..264-1 4 Số nguyên lớn.
bigint -263->263-1 hay 0..264-1 8 Số nguyên lớn.
Kiểu dữ liệu số chấm động
Loại Range Bytes Diễn giải
float phụ thuộc số thập phân Số thập phân dạng Single hay Double
Float(M,D) ±1.175494351E-38 ±3.40282346638 4 Số thập phân dạng Single
Double(M,D) ±1.7976931348623157308 ±2.2250738585072014E-308 8 Số thập phân dạng Double.
Float[M,[D]) Số chấm động lưu dưới dạng char.

Loại dữ liệu date và time

Kiểu dữ liệu Date and Time cho phép bạn nhập liệu dưới dạng chuỗi hay dạng số như trong bảng 5.

Kiểu dữ liệu số nguyên
Loại Range Diễn giải
Date 1000-01-01 Date trình bày dưới dạng yyyy-mm-dd.
Time -838:59:59 , 838:59:59 Time trình bày dưới dạng hh:mm:ss.
Datetime 1000-01-01 00:00:00,9999-12-31 23:59:59 Date và Time trình bày dưới dạng yyyy-mm-dd hh:mm:ss.
TimeStamp[(M)] 1970-01-01 00:00:00 TimeStamp trình bày dưới dạng yyyy-mm-dd hh:mm:ss.
Year[(2|4)] 1970-2069 1901-2155 Year trình bày dưới dạng 2 số hay 4 số.

Đối với kiểu dữ liệu TimeStamp, bạn có thể định dạng nhiều cách như trình bày trong bảng 6

Trình bày đại diện của TimeStamp
Loại Hiển thị
TimeStamp YYYYMMDDHHMMSS
TimeStamp(14) YYYYMMDDHHMMSS
TimeStamp(12) YYMMDDHHMMSS
TimeStamp(10) YYMMDDHHMM
TimeStamp(8) YYYYMMDD
TimeStamp(6) YYMMDD
TimeStamp(4) YYMM
TimeStamp(2) YY

Loại dữ liệu String

Kiểu dữ liệu String chia làm ba loại, loại thứ nhất như char (chiều dài cố định) và varchar (chiều dài biến thiên). Char cho phép bạn nhập liệu dưới dạng chuỗi với chiếu dài lớn nhất bằng chiều dài bạn đã định nghĩa, nhưng khi truy cập dữ liệu trên Field có khai báo dạng này, bạn cần phải xử lý khoảng trắng. Điều này có nghĩa là nếu khai báo chiều dài là 10, nhưng bạn chỉ nhập hcuỗi 4 ký tự, MySQL lưu trữ trong bộ nhớ chiều dài 10.

Ngược lại với kiểu dữ liệu CharVarchar, chiều dài lớn nhất người dùng có thể nhập vào bằng chiều dài bạn đã định nghĩa cho Field này, bộ nhớ chỉ lưu trữ chiều dài đúng với chiều dài của chuỗi bạn đã nhập.

Như vậy, có nghĩa là nếu bạn khai báo kiểu varchar 10 ký tự, nhưng bạn hcỉ nhập 5 ký tự, MySQL chỉ lưu trữ chiều dài 5 ký tự, ngoài ra, khi bạn truy cập đến Field có kiểu dữ liệu này, bạn không cần phải giải quyết khoảng trắng.

Loại thứ hai là Text hay Blob, Text cho phép lưu chuỗi rất lớn, Blob cho phép lưu đối tượng nhị phân. Loại thứ 3 là Enum và Set. Bạn có thể tham khảo cả ba loại trên trong bảng 7.

Kiểu dữ liệu String
Loại Range Diễn giải
char 1-255 characters Chiều dài của chuỗi lớn nhất 255 kí tự.
varchar 1-255 characters Chiều dài của chuỗi lớn nhất 255 kí tự(characters).
tinyblob 28-1 Khai báo cho Field chứa kiểu đối tượng nhị phân cỡ 255 kí tự.
tinytext 28-1 Khai báo cho Field chứa kiểu chuỗi cỡ 255 characters.
blob 216-1 Khai báo cho Field chứa kiểu blob cỡ 65,535 characters.
text 216-1 Khai báo cho Field chứa kiểu chuỗi dạng văn bản cỡ 65,535 characters.
mediumblob 224-1 Khai báo cho Field chứa kiểu blob vừa khoảng 16,777,215 characters.
mediumtext 224-1 Khai báo cho Field chứa kiểu chuỗi dạng văn bản vừa khoảng 16,777,215 characters.
longblob 232-1 Khai báo cho Field chứa kiểu blob lớn khoảng 4,294,967,295 characters.
longtext 232-1 Khai báo cho Field chứa kiểu chuỗi dạng văn bản lớn khoảng 4,294,967,295 characters.

Phát biểu SQL

MySQL là một hệ thống quản lý cơ sở dữ liệu quan hệ (RDBMS) hay còn được gọi là Relational Database Management System. RDBMS là một trong những mô hình cơ sở dữ liệu quan hệ thông dụng hiện nay.

Nhóm phát biểu SQL

Như đã trình bày trong bài , hầu hết sản phẩm cơ sở dữ liệu quan hệ hiện nay đều dựa trên chuẩn của SQL và ANSI-SQL, chẳng hạn như SQL Server, Oracle, PostgreSQL và MySQL . Điều này có nghĩa là tất cả những cơ sở dữ liệu quan hệ đều phải có những tiêu chuẩn theo cú pháp SQL và MySQL cũng không phải là ngoại lệ.

Ngôn ngữ SQL chia làm 4 loại sau:

  • DDL (Data Definition Language): Ngôn ngữ định nghĩa dữ liệu, dùng để tạo cơ sở dữ liệu, định nghĩa các đối tượng cơ sở dữ liệu như Table, Query, Views hay các đối tượng khác.
  • DML (Data Manipulation Language): Ngôn ngữ thao tác dữ liệu, dùng để thao tác dữ liệu, chẳng hạn như các phát biểu:Select, Inert, Delete, Update, ...
  • DCL: (Data Control Language): Ngôn ngữ sử dụng truy cập đối tượng cơ sở dữ liệu, dùng để thay đổi cấu trúc, tạo người dùng, gán quyền chẳng hạn như: Alter, Grant, Revoke, ...
  • TCL: (Transaction Control Language): Ngôn sử dụng để khai báo chuyển tác chẳng hạn như: Begin Tran, Rollback, Commit, ...

Phát biểu SQL thao tác dữ liệu

Phát biểu SQL bao gồm các loại như sau:

  • SELECT (Truy vấn mẩu tin).
  • INSERT (Thêm mẩu tin).
  • UPDATE (Cập nhật dữ liệu).
  • DELETE (Xoá mẩu tin).

Khái niệm cơ bản về Select

Phát biểu Select dùng để truy vấn dữ liệu từ một hay nhiều bảng khác nhau, kết quả trả về là một tập mẩu tin thoã các điều kiện cho trước nếu có, cú pháp của phát biểu SQL dạng SELECT:

SELECT <danh sách các cột> [FROM <danh sách bảng>] [WHERE <các điều kiện ràng buộc>] [GROUP BY <tên cột / biểu thức trong SELECT> ] [HAVING <điều kiện bắt buộc của GROUP BY>] [ORDER BY <danh sách cột>] [LIMIT FromNumber | ToNumber]

Danh sách các cột: Khai báo các tên cột, biểu thức kết hợp giữa các cột của Table bạn cần truy lục. Trong trường hợp có hai cột cùng tên của hai Table trong phát biểu, bạn cần phải chỉ định tên Table đi trước. Chẳng hạn, như ví dụ 1.

Phát biểu SELECT
Select ItemID,ItemName From tblItems Where Cost>100; Select tblOrders.OrderID,OrderDate,ItemID,Qtty From tblOrders,tblOrderDetails Where tblOrders.OrderID = _ tblOrderDetail.OrderID;

Phát biểu SELECT với mệnh đề FROM

Phát biểu SQL dạng SELECT là một trong những phát biểu yêu cầu MySQL truy lục dữ liệu trên cơ sở dữ liệu chỉ định. SELECT dùng để đọc thông tin từ cơ sở dữ liệu theo những trường quy định, hay những biểu thức cho trường đó.

Mệnh đề FROM chỉ ra tên một bảng hay những bảng có quan hệ cần truy vấn thông tin. Thường chúng ta sử dụng công cụ MySQL-Front | Query để thực thi phát biểu SQL.

Sau khi thực thi phát biểu SQL, kết quả trả về số mẩu tin và tổng số mẩu tin được lấy ra từ bảng.

Dấu * cho phép lọc mẩu tin với tất cả các trường trong bảng, nếu muốn chỉ rõ những trường nào cần lọc bạn cần nêu tên cụ thể những trường đó.

Để tiện tham khảo trong giáo trình này chúng tôi sử dụng một phần cơ sở dữ liệu có sẵn của MySQL, đồng thời bổ sung thêm cơ sở dữ liệu dành cho ứng dụng bán hàng qua mạng.

Cơ sở dữ liệu bán hàng qua mạng có tên là Test, và bao gồm nhiều bảng. Bằng phát biểu SELECT chúng ta có thể biết số bảng hay đối tượng khác đang có trong cơ sở dữ liệu Test

/* Hiển thị tất cả tên bảng của cơ sở dữ liệu hiện hành */

show tables from Test

Kết quả trả về danh sách bảng như sau:

TABLES_IN_TEST -------------------------------------- tblCountries tblProvinces tblAuthors tblPayment tblItemsion tblCustomers tblSoftware
Bạn có thể sử dụng phát biểu SQL trên để hiển thị những đối tượng trong cơ sở dữ liệu, bằng cách thay thế các tham số và điều kiện.

Cú pháp đơn giản

/* Lọc tất cả số liệu của tất cả các cột (field) của tablename*/

Select * From tablename

/* Lọc tất cả số liệu của 2 field: field1, field2 của tablename*/

Select field1,field2 From tablename

/* Lọc top 10 mẩu tin đầu tiên của tất cả các field của tablename*/

Select * From tablename Limit 0,10

/* Lọc top 10 mẩu tin đầu tiên của 2 fields field1, field2 của tablename */

Select field1, field2 From tablename Limit 0,10
Select * From tblCountries

/* Liệt kê tất cả các quốc gia trong bảng tblCountries hoặc bạn có thể liệt kê tên như phát biểu sau */

Select CountryName From tblCountries

Kết quả trả về như sau:

Kết quả trả về tên các quốc gia trong bảng tblcountries
CountryCode CountryName
VNA VietNam
SNG singapore
USS United Stated
UKD United Kingdom
GER Germany
CAM Cambodia
THA ThaiLand
MAL Malaisia
INC Indonesia
CHN China

Phát biểu SQL dạng SELECT với mệnh đề Where

Khi bạn dùng mệnh đề WHERE để tạo nên tiêu chuẩn cần lọc mẩu tin theo tiêu chuẩn được định nghĩa, thông thường WHERE dùng cột (trường) để so sánh với giá trị, cột khác, hay biểu thức chứa cột (trường) bất kỳ có trong bảng. Phát biểu SQL dạng Select với mệnh đề Where cú pháp có dạng như sau:

Select * from tablename where conditions Select field1, field2, field3 from tablename where conditions

Với conditions trong cả hai phát biểu trên được định nghĩa điều kiện truy vấn như khai báo sau:

Select * From tablename where field1>10 select * from tblCountries where CountryCode in('VNA','CHN')

Các phép toán so sánh trong conditions bao gồm:

  • > : Lớn hơn (where Amount > 100000)
  • < : Nhỏ hơn (where Amount < 100000)
  • >= : Lớn hơn hoặc bằng (where Amount >= 100000)
  • <= : Nhỏ hơn hoặc bằng (where Amount <= 100000)
  • = : Bằng (where CustID='12')
  • !=: Khác (where CustID!='12')
  • <>: Khác (where CustID <> '12')

Các phép toán logic có thể sử dụng trong conditions

  • And: Phép toán "and" SELECT * FROM tblOrders Where Amount!>100000 And CustID='12';
  • Or : Phép toán "or" SELECT * FROM tblOrderDetails Where Amount!>100000 Or CustID=‘12’;
  • Not : Phép toán phủ định (not) SELECT * FROM tblOrders where OrderDate is not null;
  • Not in : Phép toán phủ định (not in) SELECT * FROM tblOrders where OrderID not in (‘12’,’15’);
  • Between: Kết quả thuộc trong miền giá trị SELECT * FROM tblOrders Where Amount between 10 And 500;
  • Like : Phép toán so sánh gần giống, sử dụng dấu % để thể hiện thay thế bằng ký tự đại diện SELECT * FROM tblCustomers where CustName like '%A';
  • Not Like : Phép toán phủ định so sánh gần giống, sử dụng dấu % để thể hiện thay thế bằng ký tự đại diện SELECT * FROM tblCustomers where CustName not like '%A';
  • IN : Phép toán so sánh trong một tập hợp SELECT * FROM tblOrders Where OrderID in ('100','200','300');
Các phép toán logic

/* > : lớn hơn */

Select * From tblOrders Where Amount > 100000;

/* < : nhỏ hơn */

Select * From tblOrders Where Amount < 100000;

/* >= : lớn hơn hoặc bằng */

Select * From tblOrders Where Amount >= 100000;

/* >= : nhỏ hơn hoặc bằng */

Select * From tblOrders Where Amount <= 100000;

/* = : bằng */

Select * From tblOrders Where CustID=‘12’;

/* != :Khác */

Select * From tblOrders Where CustID !=‘12’;

/* <> : Khác */

Select * From tblOrders Where CustID <>‘12’;

/* !> : Không lớn hơn */

Select * From tblOrders Where Amount !> 100000;

/* !< : Không nhỏ hơn */

Select * From tblOrders Where Amount !< 100000;

/* and : Phép toán và */

Select * From tblOrders Where Amount !>100000 And CustID=‘12’;

/* Or : Phép toán hoặc */

Select * From tblOrders Where Amount !>100000 Or CustID=‘12’;

/* Not : Phép toán phủ định */

Select * From tblOrders Where OrderDate is NOT NULL;

/* Between: giá trị nằm trong miền */

Select * From tblOrders Where Amount Between 10 and 500;

/* Like : Phép toán so sánh gần giống, sử dụng dấu % để thể hiện thay thế bất kỳ ký tự */

Select * From tblOrders Where Descriion like '%A' Or CustID ='152';

/* Not Like : Phép toán phủ định so sánh gần giống, sử dụng dấu % để thể hiện thay thế bất kỳ ký tự */

Select * From tblOrders Where Descriion not like '%A' Or CustID ='152';

/* IN : Phép toán so sánh trong một tập hợp */

Select * From tblOrders Where OrderID in ('134','244','433');

/* Not IN : Phép toán phủ định so sánh trong một tập hợp */

Select * From tblOrders Where OrderID not in ('134','244','433');

Mệnh đề Order by

Thông thường, trong khi truy vấn mẩu tin từ bảng dữ liệu, kết quả hiển thị cần sắp xếp theo chiều tăng hay giảm dựa trên ký tự ALPHABET. Nhưng bạn cũng có thể sắp xếp theo một tiêu chuẩn bất kỳ, chẳng hạn như biểu thức.

Khi sắp xếp dữ liệu trình bày trong kết quả, cần phải chọn trường hay biểu thức theo trật tự tăng dần hoặc giảm dần.

Cú pháp cho mệnh đề ORDER BY cùng với trạng thái tăng hay giảm, ứng với ASC sắp xếp tăng dần, DESC giảm dần.

Cú pháp có dạng như sau:

Order by columnname DESC Order by columnname1 + columnname2 DESC Order by columnname ASC Order by columnname1 ASC, columnname2 DESC
SELECT với mệnh đề Order by DESC

/*-- Giảm dần theo thời gian */

Select OrderID , OrderDate, CustID, Amount From tblOrders Where Amount >1000 Order by OrderDate DESC

Kết quả trả về như sau:

Bảng kết quả sau khi thực hiện lệnh select
OrderID OrderDate Custid Amount
17 2001-09-20 12 178.243
18 2001-09-20 12 2.78534
16 2001-09-19 12 398.798
15 2001-09-18 12 5.758.876
14 2001-09-17 12 5.539.647
12 2001-09-16 12 1.330
13 2001-09-16 12 1.585.563
31 2001-09-16 13 459.525
11 2001-09-15 11 1.401.803
28 2001-09-15 13 1.45200
SQL dạng SELECT với mệnh đề Order by và ASC

/*-- Tăng dần theo thời gian */

Select OrderID , OrderDate, CustID, Amount From tblOrders Where Amount >1000 Order by OrderDate ASC

Kết quả trả về như sau:

Kết quả trả về với mệnh đề select..Order by và ASC
OrderID OrderDate CustID Amount
01 2001-09-05 10 2.903.576
02 2001-09-05 10 48.168.56
03 2001-09-05 10 5.107.032
04 2001-09-08 10 2.355.537
05 2001-09-08 16 1.817.487
06 2001-09-10 16 26.000
19 2001-09-10 12 575.667
29 2001-09-10 13 466.500
07 2001-09-11 16 186.782
23 2001-09-11 12 459.162

Nếu muốn sắp xếp theo nhiều cột (trường), chỉ cần sử dụng dấu phẩy (,) để phân cách các cột.

SELECT với mệnh đề Order by với 2 cột dữ liệu
Select OrderID , OrderDate, CustID, Amount From tblOrders Where Amount >1000 Order by OrderID,CustID DESC

Kết quả trả về như sau:

Kết quả trả về của mệnh đề Select...Order by với 2 cột dữ liệu
OrderID OrderDate CustID Amount
31 2001-09-16 13 459.525
30 2001-09-15 13 153.120
29 2001-09-10 13 466.500
28 2001-09-15 13 145.200
27 2001-09-14 13 603.033
26 2001-09-13 13 230.000
25 2001-09-11 13 244.904
24 2001-09-12 13 1.367.228
23 2001-09-11 12 459.162
19 2001-09-10 12 575.667

Nếu muốn sắp xếp theo nhiều trường kết hợp, chỉ cần dùng thứ tự từng cột cách nhau bằng dấu +.

SELECT với mệnh đề Order by hợp 2 cột

/*-- Giảm dần theo số OrderID và CustID */

Select OrderID , OrderDate, CustID, Amount From tblOrders Where Amount >1000 Order by OrderID + CustID DESC

Kết quả trả về như sau:

Kết quả với mệnh đề Select...Order by hợp 2 cột
Orderid OrderDate CustID Amount
31 2001-09-16 13 459.525
30 2001-09-15 13 153.120
29 2001-09-10 13 466.500
28 2001-09-15 13 145.200
27 2001-09-14 13 603.033
26 2001-09-13 13 230.000
25 2001-09-11 13 244.904
24 2001-09-12 13 1.367.228
23 2001-09-11 12 459.162
19 2001-09-10 12 575.667

Nếu trong phát biểu SQL dạng SELECT có nhiều bảng kết hợp lại với nhau, bạn có thể dùng thêm tên bảng ứng với cột của bảng đó. Phần này sẽ được diễn giải cụ thể hơn trong phần kế tiếp ( JOIN -Phép hợp).

SQL dạng SELECT với mệnh đề GROUP BY

Khi truy vấn mẩu tin trên một hay nhiều bảng dữ liệu, thông thường có những nghiệp vụ thuộc trường nào đó có cùng giá trị, ví dụ khi hiển thị hợp đồng phát sinh trong tháng, kết quả sẽ có nhiều hợp đồng của khách hàng lặp đi lặp lại như ví dụ 8

SQL dạng SELECT
Select CustID, Amount from tblOrders

Với phát biểu trên kết quả trả về như sau:

Kết quả với mệnh đề Select
CustID Amount
10 2.903.576
10 48.168.567
10 5.107.032
10 2.3555347
16 181.074.847
16 26.000
16 1.867.682
16 3.600.000
16 195.713.899
16 961.804.228
16 140.180.347
12 138
12 158.555.638
12 5.539.647
12 575.887.767
12 39.879.489
12 17.824.938
12 278.503.048
12 5.756.667
12 459.162
13 136.727.628
13 244.904
13 230.000
13 603.033
13 1.452.000
13 4.665.100
13 1.531.200
13 459.525

Trong báo cáo chúng ta lại cần phải biết mỗi khách hàng có bao nhiêu lần trả tiền, tổng số tiền của mỗi khách hàng đã trả là bao nhiêu?

Để làm điều này, chúng ta sử dụng mệnh đề GROUP BY trong phát biểu SQL dạng SELECT cùng với một số hàm trong MySQL, bạn tham khảo ví dụ 9 được trình bày chi tiết từ ví dụ 8 nhưng nhóm mẩu tin bằng mệnh đề Group By.

SQL dạng SELECT với mệnh đề Group By
Select CustID, count (CustID), Sum(Amount) From tblOrders Group by CustID Order by CustID

Kết quả trả về như sau:

Kết quả với mệnh đề Select...Group by
CustID
16 7 2.956.562.368
12 9 3.843.022.604
13 8 145.913.378
10 4 72.382.804

Các hàm thông dụng trong MySQL

Các hàm trong phát biểu GROUB BY

  • Hàm AVG: Hàm trả về giá trị bình quân của cột hay trường trong câu truy vấn, ví dụ như phát biểu sau: Select AVG(Amount) From tblOrders
  • Hàm MIN: Hàm trả về giá trị nhỏ nhất của cột hay trường trong câu truy vấn, ví dụ như phát biểu sau: Select Min(Amount) From tblOrders
  • Hàm MAX: Hàm trả về giá trị lớn nhất của cột hay trường trong câu truy vấn, ví dụ như các phát biểu sau: Select Max(Amount) From tblOrders
  • Hàm Count: Hàm trả về số lượng mẩu tin trong câu truy vấn trên bảng, ví dụ như các phát biểu sau: Select count(*) From tblOrders Select count(CustID) From tblOrders Select count(*) From tblOrderDetails
  • Hàm Sum: Hàm trả về tổng các giá trị của trường, cột trong câu truy vấn, ví dụ như các phát biểu sau: Select sum(Amount) From tblOrders

Chẳng hạn, bạn có thể tham khảo diễn giải toàn bộ các hàm dùng trong mệnh đề GROUP BY.

SQL dạng SELECT với Group By và các hàm
Select CustID, Count (CustID),Sum(Amount), Max(Amount), Min(Amount), Avg(Amount) From tblOrders Group by CustID Order by CustID

Kết quả trả về như sau:

Kết quả với mệnh đề Select...Group By và các hàm
CustID
16 7 2956562368 1.95713899 26000 422366052
12 9 3843022604 39879489 459162 427002511
13 8 145913378 1.36727628 230000 18239172.25
10 4 72382804 48168567 2903576 18095701

Các hàm xử lý chuỗi

  • Hàm ASCII: Hàm trả về giá trị mã ASCII của ký tự bên trái của chuỗi, ví dụ như khai báo: Select ASCII('TOI')

    Kết quả trả về như sau:

    84
  • Hàm Char: Hàm này chuyển đổi kiểu mã ASCII từ số nguyên sang dạng chuỗi: Select char(35)

    Kết quả trả về như sau:

    #
  • Hàm UPPER: Hàm này chuyển đổi chuỗi sang kiểu chữ hoạ: Select UPPER('Khang')

    Kết quả trả về như sau:

    KHANG
  • Hàm LOWER: Hàm này chuyển đổi chuỗi sang kiểu chữ thường: Select LOWER('Khang')

    Kết quả trả về như sau:

    khang
  • Hàm Len: Hàm này trả về chiều dài của chuỗi: Select len('I Love You')

    Kết quả trả về như sau:

    10
  • Thủ tục LTRIM: Thủ tục loại bỏ khoảng trắng bên trái của chuỗi: Select ltrim(' Khang')

    Kết quả trả về như sau:

    'khang'
  • Thủ tục RTRIM: Thủ tục loại bỏ khoảng trắng bên phải của chuỗi: Select ltrim('Khang ')

    Kết quả trả về như sau:

    'khang'
  • Hàm Left: Hàm trả về chuỗi bên trái tính từ đầu cho đến vị trí thứ n: Select left('Khang',3)

    Kết quả trả về như sau:

    'Kha'
  • Hàm Right: Hàm trả về chuỗi bên phải tính từ cuối cho đến vị trí thứ n: Select Right('KHang',4)

    Kết quả trả về như sau:

    'Hang'
  • Hàm Instr: Hàm trả về vị trí chuỗi bắt đầu của chuỗi con trong chuỗi xét: Select INSTR ('Khang','Pham Huu Khang')

    Kết quả trả về như sau:

    11

    11 là tương đương vị trí thứ 11 của chữ Khang trong chuỗi "Pham Huu Khang"

Các hàm về xử lý thời gian

  • Hàm CurDate(): Hàm trả về ngày, tháng và năm hiện hành của hệ thống: Select curdate() as 'Today is’

    Kết quả trả về như sau

    Today is -------------------------- 2001-11-21
  • Hàm CurTime(): Hàm trả về giờ, phút và giây hiện hành của hệ thống: Select curtime() as 'Time is’

    Kết quả trả về như sau

    Time is --------------------------- 09:12:05
  • Hàm Period_Diff: Hàm trả về số ngày trong khoảng thời gian giữa 2 ngày: Select Period_diff (OrderDate, getdate()) as 'So ngay giua ngay thu tien đen hom nay:' from tblOrders

    Kết quả trả về như sau

    So ngay giua ngay thu tien đen hom nay: --------------------------------- 74 72
  • Hàm dayofmonth: Hàm dayofmonth trả về ngày thứ mấy trong tháng: Select dayofmonth(curdate()) as 'hom nay ngay

    Kết quả trả về như sau:

    21

Ngoài các hàm trình bày như trên, bạn có thể tìm thấy nhiều hàm xử lý về thời gian trong phần Funtions xuất hiện bên phải màn hình của trình điều khiển như hình 6.

Sử dụng chức năng Funcitons

Các hàm về toán học

  • Hàm sqrt: Hàm trả về là căn bật hai của một biểu thức: Select sqrt (4)

    Kết quả trả về là

    2
  • Hàm Round: Hàm trả về là số làm tròn của một biểu thức: Select round (748.58,-1)

    Kết quả trả về là

    7500

Để tham khảo thêm một số hàm khác bạn có thể tham khảo trong phần Functions như hình 6

Phát biểu SQL dạng Select với AS

Khi cần thiết phải thay đổi tên trường nào đó trong câu truy vấn, bạn chỉ cần dùng phát biểu AS. AS cho phép ánh xạ tên cũ, hay giá trị chưa có tên thành tên mới (header).

Ví dụ, khi sử dụng GROUP BY ở trong phần trên, những cột tạo ra từ các phép toán count, sum, max, min, ... cho ra kết quả không có header, nghĩa là không có tên cột để tham chiếu trong khi gọi đến chúng. Chúng ta phải cần phát biểu AS cho những trường hợp này.

SQL dạng SELECT với AS và các hàm
Select CustID, Count (CustID) as No, Sum(Amount) as TIENHD, Max(Amount) as HDLONNHAT, Min(Amount) as HDNHONHAT, Avg(Amount) as TRUNGBINH From tblOrders Group by CustID Order by CustID

Kết quả hiển thị như sau:

CustID No TIENHD HDLONNHAT HDNHONHAT TRUNGBINH
16 7 2956562368 1.95713899 26000 422366052
12 9 3843022604 39879489 459162 427002511
13 8 145913378 1.36727628 230000 18239172.25
10 4 72382804 48168567 2903576 18095701

Phát biểu SQL dạng Select với Limit N , M

Phát biểu SQL dạng SELECT cho phép truy lục chỉ một số mẩu tin tính từ vị trí thứ n đến vị trí thứ m trong Table (theo một tiêu chuẩn hay sắp xếp nào đó). Để làm điều này, trong phát biểu SQL dạng SELECT bạn dùng chỉ định từ khoá LIMIT với số lượng mẩu tin cần lấy từ vị trí thứ n đến m.

Chẳng hạn, trong trường hợp bạn khai báo Select * from tblOrders limit 0,10. Kết quả sẽ trả về 10 mẩu tin đầu tiên trong bảng tblOrders.

Bạn cũng có thể sử dụng kết hợp LIMIT với các mệnh đề như WHERE, ORDER BY nhằm tạo ra kết quả như ý muốn.

Do yêu cầu khác nhau thông qua phát biểu SQL dạng SELECT có sử dụng LIMIT, nghĩa là kết quả trả về số lượng 10 mẩu tin đầu tiên với tất cả các cột trong bảng tblOrders.

Phát biểu SQL dạng SELECT với Limit N,M
Select * From tblOrders Limit 0,10

Kết quả trả về như sau:

OrderID OrderDate CustID Amount
01 2001-09-05 10 2903576
02 2001-09-05 10 48168567
03 2001-09-05 10 5107032
04 2001-09-08 10 2.3555347
05 2001-09-08 16 1.81074847
06 2001-09-10 16 26000
07 2001-09-11 16 1867682
08 2001-09-12 16 3600000
09 2001-09-13 16 1.95713899
10 2001-09-14 16 9.61804228

Nếu muốn lọc ra 10 hợp đồng có số tiền nhiều nhất, bạn chỉ cần sử dụng sắp xếp theo cột TotalAmount hay Amount trong bảng tblOrders.

Phát biểu SQL dạng SELECT với Limit N,M
Select OrderID,OrderDate,CustID,Amount From tblOrders Order by Amount Desc Limit 0,10

Kết quả trả về như sau:

OrderID OrderDate CustID Amount
06 2001-09-10 16 26000
26 2001-09-13 13 230000
25 2001-09-11 13 244904
23 2001-09-11 12 459162
31 2001-09-16 13 459525
27 2001-09-14 13 603033
28 2001-09-15 13 1452000
30 2001-09-15 13 1531200
07 2001-09-11 16 1867682
01 2001-09-05 10 2903576

Nếu muốn lọc ra 10 sản phẩm có số lượng bán nhiều nhất, bạn chỉ cần sử dụng sắp xếp theo cột số lượng Qtty.

Phát biểu SQL dạng Select với Limit N,M
Select ItemID,Qtty,Price,Amount from tblOrderDetails Where Amount>10 order by Qtty Limit 0,10

Kết quả trả về như sau:

Danh sách 10 sản phẩm có số lượng bán nhiều nhất
ItemID Qtty Price Amount
1 900 12000 12960000
2 1000 12000 14400000
3 5000 12000 72000000
3 6000 12000 86400000
4 8000 12000 15200000
4 8000 12000 15200000
4 8000 10000 15200000
5 9000 12000 29600000
5 9000 12000 129600000
5 9000 12000 129600000

Phát biểu SQL dạng SELECT với DISTINCT

Nếu có một hay nhiều bảng kết nối với nhau, sẽ xảy ra trùng lặp nhiều mẩu tin. Nhưng trong trường hợp này bạn chỉ cần lấy ra một mẩu tin trong tập mẩu tin trùng lặp, bạn sử dụng phát biểu SQL dạng SELECT với chỉ định DISTINCT.

Phát biểu SQL dạng SELECT
Select ItemID,Qtty,Price,Amount from tblOrderDetails order by Qtty

Kết quả trả về như sau:

Kết quả cho thấy có sự trùng lặp
ItemID Qtty Price Amount
1 900 12000 12960000
2 1000 12000 14400000
3 5000 12000 72000000
3 6000 12000 86400000
4 8000 12000 115200000
4 8000 12000 115200000
4 8000 10000 115200000
5 9000 12000 129600000
5 9000 12000 129600000
5 9000 12000 129600000
...
...
Phát biểu SQL dạng SELECT với DISTINCT
Select Distinct ItemID,Qtty,Price,Amount From tblOrderDetails Order by Qtty

Kết quả loại bỏ những mẩu tin trùng lắp như sau:

Kết quả của mệnh đề Select Distinct..
ItemID Qtty Price Amount
1 900 12000 12960000
2 1000 12000 14400000
3 6000 12000 86400000
4 8000 12000 115200000
5 9000 12000 129600000
...
...
...

Nhập dữ liệu bằng phát biểu SQL dạng Insert

Khi cần thêm mẩu tin vào bảng trong cơ sở dữ liệu MySQL, bạn có nhiều cách để thực hiện công việc này. Trong Visual Basic 6.0, VB.NET, C Sharp hay Java có những phương thức để thêm mẩu tin vào bảng trong cơ sở dữ liệu. Tuy nhiên, để sử dụng các phát biểu SQL mang tính chuyên nghiệp trong MySQL, bạn cần sử dụng phát biểu INSERT.

Bạn có thể sử dụng phát biểu Insert ngay trên ứng dụng kết nối với MySQL. Trong trường hợp bạn sử dụng cơ sở dữ liệu SQL Server hay Oracle, bạn có thể tạo ra một Stored Procedure với mục đích INSERT dữ liệu vào bảng chỉ định trước.

Khi thêm dữ liệu, cần chú ý kiểu dữ liệu giống hoặc tương ứng kiểu dữ liệu đã khai báo của cột đó, nếu không phù hợp thì lỗi sẽ phát sinh.

Ngoài ra bạn cần quan tâm đến quyền của User đang truy cập cơ sở dữ liệu. User phải được cấp quyền Insert dữ liệu vào từng bảng cụ thể (quyền này do nhà quản trị cơ sở dữ liệu phân quyền cho User đó).

Trong phát biểu INSERT INTO chúng tôi thực hiện trên bảng tblOrderDetails và bảng tblOrderDetailsHist, hai bảng này có cấu trúc như sau:

/* Bảng tblOrderDetails*/

CREATE TABLE tblorderdetails ( ItemID int(3) unsigned DEFAULT '0' , OrderID int(3) unsigned DEFAULT '0' , No tinyint(3) unsigned DEFAULT '0' , Qtty int(3) unsigned DEFAULT '0' , Price int(3) unsigned DEFAULT '0' , Discount int(3) unsigned DEFAULT '0' , Amount bigint(3) unsigned DEFAULT '0' );

/* Bảng tblOrderDetailsHist, dùng để chứa các thông tin hợp đồng chi tiết khi hợp đồng của khách hàng này kết thúc, chương trình tự động xoá trong tblOrderDetails và lư trữ lại trong bảng tblOrderDetailsHist.*/

CREATE TABLE tblorderdetailshist ( ItemID int(3) unsigned DEFAULT '0' , OrderID int(3) unsigned DEFAULT '0' , No tinyint(3) unsigned DEFAULT '0' , Qtty int(3) unsigned DEFAULT '0' , Price int(3) unsigned DEFAULT '0' , Discount int(3) unsigned DEFAULT '0' , Amount bigint(3) unsigned DEFAULT '0' );

Khi Insert dữ liệu vào bảng, có 3 trường hợp xảy ra: insert dữ liệu vào bảng từ các giá trị cụ thể, insert vào bảng lấy giá trị từ một hay nhiều bảng khác, và cuối cùng là kết hợp cả hai trường hợp trên.

Insert vào bảng lấy giá trị cụ thể:

INSERT INTO <Tablename>[<columnname list>] Values (data_value)
INSERT dữ liệu vào bảng từ giá trị cụ thể

/* Thêm mẩu tin với một số cột */

INSERT INTO TBLCUSTOMERS (CustName,Username,Password, Address,Tel,FaxNo,Email,Contact, CountryCode,ProvinceCode) Values ('Khach San CENTURY', ‘century’, ’1111’,’5 Le Loi’,’8676767’,’8767676’, ‘century@yahoo.com’,’Hoang Anh’, ‘VNA’,’HCM’)

/* Thêm mẩu tin với một số cột */

INSERT INTO TBLORDERS(OrderID,OrderDate, CustID,Description,Amount) Values ('11',curdate(),’1', 'Dat hang qua mang', 20000)

Insert vào bảng lấy giá trị từ bảng khác

INSERT INTO <Tablename1>[<columnname list>] Select [columnname list] From <Tablename2> Where <Conditions>
INSERT vào bảng từ giá trị của bảng khác

/* Thêm mẩu tin với các cột cụ thể */

/* Chuyển tất cả những hợp đồng chi tiết từ bảng tblOrderDetails vào bảng tblOrderDetailsHist */

INSERT INTO TBLORDERDETAILSHIST( ItemID,OrderID, No,Qtty, Price,Discount, Amount) SELECT ItemID, OrderID, No,Qtty, Price, Discount,Amount From tblOrderDetails ORDER BY OrderID ASC

/* Có thể viết lại thêm mẩu tin với tất cả các cột như sau. Chuyển tất cả những hợp đồng chi tiết từ bảng tblOrderDetails vào bảng tblOrderDetailsHist với điều kiện số cột tương ứng trong bảng tblOrderDetails bằng với số cột trong bảng tblOrderDetailsHist, bạn có thể viết lại như sau */

INSERT INTO TBLORDERDETAILSHIST SELECT * from tblOrderDetails ORDER BY OrderID ASC

Insert vào bảng lấy giá trị cụ thể, bảng khác

INSERT INTO <Tablename1>[<columnname list>] Select [columnname list], valueslist From <Tablename2> Where <conditions> ORDER BY <column name> ASC/DESC
INSERT vào bảng từ giá trị cụ thể, bảng khác

/* Thêm mẩu tin với các cột cụ thể */

/* Chuyển tất cả những hợp đồng chi tiết từ bảng tblOrderDetails vào bảng tblOrderDetailsHist. Giả sử rằng, ngoài những cột giống như tblOrderDetails, bảng tblOrderDetailsHist còn có thêm cột Tranferdate. */

INSERT INTO TBLORDERSHIST( OrderID, OrderDate, ReceiveFolio, CustID, Descriion, Amount, Historydate) SELECT OrderID, OrderDate, ReceiveFolio, CustID, Descriion, Amount,getdate() as Historydate From tblOrders where Month(OrderDate)=12 Order by OrderDate,CustID

/* Có thể viết lại thêm mẩu tin với tất cả các cột như sau */

/* Chuyển tất cả những phiếu thu trong tháng 12 từ bảng tblOrders vào bảng tblOrdersHist với điều kiện số cột tương ứng trong bảng tblOrders bằng với số cột trong bảng tblOrdersHist, bạn có thể viết lại như sau */

INSERT INTO TBLORDERDETAILSHIST( ItemID,OrderID,No, Qtty, Price,Discount, Amount,TranferDate) SELECT ItemID,OrderID,No, Qtty, Price,Discount, Amount,CurDate() From tblOrderDetails ORDER BY OrderID ASC

Phát biểu SQL dạng UPDATE

Phát biểu SQL dạng UPDATE dùng cập nhật lại dữ liệu đã tồn tại trong bảng. Khi UPDATE dùng cập nhật dữ liệu cho một mẩu tin chỉ định nào đó thường UPDATE sử dụng chung với mệnh đề WHERE.

Nếu cần cập nhật tất cả các mẩu tin trong bảng bạn có thể bỏ mệnh đề WHERE . Phát biểu này có cấu trúc như sau:

/* nếu cập nhất giá trị cụ thể */

Update <table name> Set <column>=<value>,[<column>=<value>] [where <restrictive conditions>]

/* nếu cập nhất giá trị là kết quả trả về từ phát biểu select trên một hay nhiều bảng khác */

Update <table name> Set <column>=<select .. from tablename where ...> [where <restrictive conditions>]

UPDATE có thể ảnh hưởng đến nhiều bảng, nhưng cập nhất giá trị chỉ có hiệu lực trên bảng đó, bạn có thể tham khảo phần này trong chương kế tiếp JOIN TABLE.

Cập nhật giá trị cụ thể vào một hay nhiều cột minh hoạ trong ví dụ 20 sau:

UPDATE trên các cột dữ liệu từ giá trị cụ thể

/* cập nhật cột với giá trị cụ thể */

Update tblCustomers Set CustName='Cong ty TNHH Coca cola Vietnam' Where CustID=‘12’

/* cập nhật một cột với giá trị cột khác trong bảng tblOrderDetails*/

Update tblOrders Set Amount= Amount*.01, TotalAmount=Amount*0.1 Where Month(OrderDate)=12

/* cập nhật một cột với giá trị từ bảng khác*/

/* cập nhật cột Price với giá trị từ cột Cost của bảng tblItems, khai báo sau chỉ đúng trong MySQL 4.1 trở về sau*/

Update tblOrderDetails Set Price= (select distinct Cost] from tblItems where ItemID=tblOrderDetails.ItemID) Where Price<1000

/* cập nhật một cột với giá trị cụ thể với điều kiện từ bảng khác, khai báo sau chỉ đúng trong MySQL 4.1 trở về sau */

Update tblOrderDetails Set Price= Price*10, Amount= Qtty*(Price+1) Where ItemID in (select distinct ItemID from tblOrderDetails where Price>1000)

Phát biểu SQL dạng DELETE

Với phát biểu SQL dạng DELETE thì đơn giản hơn. Khi thực hiện lệnh xoá mẩu tin trong bảng chúng ta chỉ cần quan tâm đến tên bảng, và mệnh đề WHERE để xoá với những mẩu tin đã chọn lọc nếu có. Cú pháp của Delete:

Delete from <table name> Where <condition>

Với mệnh đề WHERE giống như bất kỳ mệnh đề WHERE nào trong phát biểu SELECT hay UPDATE INSERT của bất kỳ ứng dụng cơ sở dữ liệu nào có sử dụng SQL Conditions có thể là phép toán giữa các cột và giá trị, nhưng cũng có thể giá trị là kết quả trả về từ một phát biểu SELECT khác.

Không có khái niệm xóa giá trị trong một cột, vì xóa giá trị một cột đồng nghĩa với cập nhật cột đó bằng giá trị rỗng.
Xóa mẩu tin với phát biểu SQL dạng DELETE

/* Xoá mẩu tin từ bảng với điều kiện */

Delete from tblCustomers Where CustName is null

Trong trường hợp có ràng buộc về quan hệ của dữ liệu, thì xóa mẩu tin phải tuân thủ theo quy tắc: Xoá mẩu tin con trước rồi mới xoá mẩu tin cha.

Chẳng hạn, trong trường hợp ta có 2 bảng: hợp đồng bán hàng (tblOrders) và hợp đồng bán hàng chi tiết (tblOrderDetails).

Để xoá một hợp đồng bạn cần xóa mẩu tin trong bảng tblOrders trước rồi mới đến các mẩu tin trong bảng tblOrderDetails.

Xoá mẩu tin với Delete

/* Xoá mẩu tin từ bảng con */

Delete from tblOrderDetails where OrderID=123

/* Xoá mẩu tin từ bảng cha */

Delete from tblOrders where OrderID=123

Bạn có thể thực hiện một phát biểu SQL dạng DELETE với điều kiện trong mệnh đề WHERE lấy giá trị trả về từ phát biểu SELECT từ bảng khác, khai báo như vậy chỉ có hiệu lực trong cơ sở dữ liệu MySQL phiên bản 8.1 trở về sau hay trong cơ sở dữ liệu SQL Server và Oracle.

Xoá mẩu tin theo quy tắc có ràng buộc quan hệ

/* Xoá mẩu tin từ bảng với điều kiện lấy giá trị từ bảng khác */

Delete from tblOrderDetails where ItemID in (select ItemID from tblItems where ItemName like 'IT%')