Hướng dẫn học

Nhằm giúp người học lập trình MySQL dễ dàng. Hiệp Sĩ IT đã thiết kế bài học MySQL từ cơ bản đến năng cao.

MySQL là một hệ thống quản lý cơ sở dữ liệu quan hệ, nguồn mở và miễn phí.

Hướng dẫn MySQL của chúng tôi bao gồm tất cả các chủ đề của cơ sở dữ liệu MySQL như c insert record, update record, delete record, select record, create table, drop table, v.v.


MySQL là gì?

MySQL là một hệ thống quản lý cơ sở dữ liệu quan hệ mã nguồn mở (RDBMS) dựa trên ngôn ngữ truy vấn có cấu trúc ( SQL) được phát triển, phân phối và hỗ trợ bởi tập đoàn Oracle. MySQL chạy trên hầu hết tất cả các nền tảng, bao gồm cả Linux , UNIX và Windows. MySQL thường được kết hợp với các ứng dụng web.

Trang web MySQL http://www.mysql.com cung cấp thông tin mới nhất về hệ quản lý cơ sở dữ liệu MySQL.

MySQL là gì?

SQL là ngôn ngữ phổ biến nhất để thêm, truy cập và quản lý nội dung trong cơ sở dữ liệu. Nó được chú ý nhất vì khả năng xử lý nhanh, độ tin cậy đã được chứng minh, dễ sử dụng và linh hoạt. MySQL là một phần thiết yếu của hầu hết mọi ứng dụng PHP mã nguồn mở. Các ví dụ điển hình cho các tập lệnh dựa trên PHP và MySQL là WordPress, Joomla, Magento và Drupal. MySQL đang trở nên phổ biến vì nhiều lý do tốt:

  • MySQL được phát hành theo giấy phép nguồn mở. Vì vậy, bạn không phải trả tiền để sử dụng nó.
  • MySQL là một chương trình rất mạnh theo đúng nghĩa của nó. Nó xử lý một tập hợp lớn các chức năng của các gói cơ sở dữ liệu mạnh mẽ và đắt tiền nhất.
  • MySQL sử dụng một dạng chuẩn của ngôn ngữ dữ liệu SQL nổi tiếng.
  • MySQL hoạt động trên nhiều hệ điều hành và với nhiều ngôn ngữ bao gồm PHP, PERL, C, C ++, JAVA, v.v.
  • MySQL hoạt động rất nhanh và hoạt động tốt ngay cả với các tập dữ liệu lớn.
  • MySQL rất thân thiện với PHP, ngôn ngữ được đánh giá cao nhất để phát triển web.
  • MySQL hỗ trợ cơ sở dữ liệu lớn, lên tới 50 triệu hàng hoặc nhiều hơn trong một bảng. Giới hạn kích thước tệp mặc định cho một bảng là 4GB, nhưng bạn có thể tăng mức này (nếu hệ điều hành của bạn có thể xử lý nó) đến giới hạn lý thuyết là 8 triệu terabyte (TB).
  • MySQL là tùy biến. Giấy phép GPL mã nguồn mở cho phép các lập trình viên sửa đổi phần mềm MySQL để phù hợp với môi trường cụ thể của riêng họ.

Cách thức hoạt động của MySQL

MySQL dựa trên mô hình client-server. Cốt lõi của MySQL là máy chủ MySQL, xử lý tất cả các hướng dẫn cơ sở dữ liệu (hoặc các lệnh). Máy chủ MySQL có sẵn như là một chương trình riêng biệt để sử dụng trong môi trường mạng client-server và như một thư viện có thể được nhúng (hoặc liên kết) vào các ứng dụng riêng biệt.

MySQL hoạt động cùng với một số chương trình tiện ích hỗ trợ quản trị cơ sở dữ liệu MySQL. Các lệnh được gửi đến MySQLServer thông qua máy khách MySQL, được cài đặt trên máy tính.

MySQL ban đầu được phát triển để xử lý cơ sở dữ liệu lớn một cách nhanh chóng. Mặc dù MySQL thường chỉ được cài đặt trên một máy, nhưng nó có thể gửi cơ sở dữ liệu đến nhiều vị trí, vì người dùng có thể truy cập thông qua các giao diện máy khách MySQL khác nhau. Các giao diện này gửi các câu lệnh SQL đến máy chủ và sau đó hiển thị kết quả.


Các tính năng cốt lõi của MySQL

MySQL cho phép dữ liệu được lưu trữ và truy cập trên nhiều công cụ lưu trữ, bao gồm InnoDB, CSV và NDB. MySQL cũng có khả năng sao chép dữ liệu và phân vùng bảng để có hiệu suất và độ bền tốt hơn. Người dùng MySQL không bắt buộc phải học các lệnh mới; họ có thể truy cập dữ liệu của mình bằng các lệnh SQL tiêu chuẩn.

MySQL được viết bằng C và C++ và có thể truy cập và có sẵn trên hơn 20 nền tảng, bao gồm Mac, Windows, Linux và Unix. RDBMS hỗ trợ cơ sở dữ liệu lớn với hàng triệu bản ghi và hỗ trợ nhiều loại dữ liệu bao gồm các số nguyên có chữ ký hoặc không dấu có độ dài 1, 2, 3, 4 và 8 byte(s); FLOAT; DOUBLE; CHAR; VARCHAR; BINARY; VARBINARY; TEXT; BLOB; DATE; TIME; DATETIME; TIMESTAMP; YEAR; SET; ENUM; và các kiểu OpenGIS. Các loại chuỗi có độ dài cố định và biến đổi cũng được hỗ trợ.

Để bảo mật, MySQL sử dụng một đặc quyền truy cập và hệ thống mật khẩu được mã hóa cho phép xác minh dựa trên máy chủ. Các máy khách MySQL có thể kết nối với Máy chủ MySQL bằng một số giao thức, bao gồm cả giao thức TCP/IP trên bất kỳ nền tảng nào. MySQL cũng hỗ trợ một số chương trình máy khách và tiện ích, chương trình dòng lệnh và công cụ quản trị như MySQL Workbench.


Các nhánh của MySQL

Các nhánh của MySQL bao gồm:

  • Drijection: một hệ thống quản lý cơ sở dữ liệu nguồn mở nhẹ được phát triển dựa trên MySQL 6.0.
  • MariaDB: một sự thay thế phổ biến do cộng đồng phát triển cho MySQL sử dụng các lệnh và API của MySQL.
  • Percona Server với XtraDB: một phiên bản nâng cao của MySQL được biết đến với khả năng mở rộng theo chiều ngang.

Sự khác biệt giữa SQL và MySQL

Tiêu chí SQL MYSQL
Định nghĩa SQL là một ngôn ngữ truy vấn có cấu trúc (Structured Query Language). Nó rất hữu ích để quản lý cơ sở dữ liệu quan hệ. MySQL là một RDBMS để lưu trữ, truy xuất, sửa đổi và quản trị cơ sở dữ liệu bằng cách sử dụng MySQL.
Kiểu SQL là một ngôn ngữ truy vấn. MySQL là phần mềm cơ sở dữ liệu. Nó đã sử dụng ngôn ngữ “SQL” để truy vấn cơ sở dữ liệu.
Hỗ trợ kết nối SQL không cung cấp trình kết nối. MySQL cung cấp một công cụ tích hợp được gọi là ‘MySQL workbench’ để thiết kế và phát triển cơ sở dữ liệu.
Mục đích Để truy vấn và vận hành hệ thống cơ sở dữ liệu. Cho phép xử lý dữ liệu, lưu trữ, sửa đổi, xóa theo định dạng bảng.
Sử dụng Mã và lệnh SQL được sử dụng trong các hệ thống DBMS và RDMS khác nhau bao gồm MYSQL. MYSQL được sử dụng làm cơ sở dữ liệu RDBMS.
Cập nhật Ngôn ngữ là cố định, và lệnh vẫn giữ nguyên. Nhận cập nhật thường xuyên.

Lịch sử phát triển MySQL

MySQL là một sản phẩm cơ sở dữ liệu nguồn mở được tạo bởi MySQL AB, một công ty được thành lập năm 1995 tại Thụy Điển. Năm 2008, Sun microsystems đã mua lại MySQL AB  với giá xấp xỉ 1 tỷ đô la.

Những nỗ lực ban đầu


Dự án của MySQL được bắt đầu vào năm 1979, khi nhà phát minh của MySQL, Michael Widenius phát triển một công cụ cơ sở dữ liệu nội bộ có tên UNIREG để quản lý cơ sở dữ liệu. Sau đó, UNIREG đã được viết lại bằng nhiều ngôn ngữ khác nhau và được mở rộng để xử lý các cơ sở dữ liệu lớn. Sau một thời gian Michael Widenius đã liên lạc với David Hughes, tác giả của mQuery, để xem liệu Hughes có quan tâm đến việc kết nối mQuery với trình xử lý B + ISAM của UNIREG để cung cấp lập chỉ mục cho mQuery hay không. Đó là cách MySQL ra đời.

MySQL được đặt theo tên con gái của Michael Widenius có tên là "My".

Quá trình phát triển:

Year Quá trình phát triển
1995 MySQL AB được thành lập bởi Michael Widenius (Monty), David Axmark và Allan Larsson tại Thụy Điển.
2000 MySQL đi theo hướng mã nguồn mở và phát hành phần mềm theo các điều khoản của GPL. Kết quả là doanh thu giảm 80% và phải mất một năm để bù vào.
2001 Marten Mickos làm CEO ở tuổi 38. Marten là CEO của một số công ty nordic trước khi gia nhập MySQL, và đi kèm với một nền tảng bán hàng và tiếp thị. 2 triệu bảng cài đặt hoạt động. Với số tiền không được tiết lộ từ các nhà đầu tư mạo hiểm Scandinavia. Ước tính khoảng 1 đến 2 triệu đô la.
2002 MySQL ra mắt tại trụ sở Thụy Điển. 3 triệu người dùng. Kết thúc năm với doanh thu 6,5 triệu đô la với 1.000 khách hàng trả tiền.
2003 Tăng 19,5 triệu đô la từ vốn đầu tư và chỉ số mạo hiểm. 4 triệu lượt cài đặt hoạt động và hơn 30.000 lượt tải mỗi ngày. Kết thúc năm với doanh thu 12 triệu đô la.
2004 Với doanh thu chính đến từ mô hình cấp phép kép OEM, MySQL quyết định chuyển sang thị trường doanh nghiệp nhiều hơn và tập trung nhiều hơn vào doanh thu định kỳ từ người dùng cuối thay vì phí cấp phép một lần từ các đối tác OEM của họ. Kết thúc năm với doanh thu 20 triệu đô la.
2005 MySQL ra mắt MySQL được mô phỏng theo mạng Redhat. MySQL là dịch vụ đăng ký nhắm vào người dùng cuối cung cấp các cập nhật, cảnh báo, thông báo và hỗ trợ cấp sản phẩm được thiết kế để giúp các công ty dễ dàng quản lý hàng trăm máy chủ MySQL. MySQL 5 cung cấp và bao gồm nhiều tính năng mới để theo đuổi người dùng doanh nghiệp (ví dụ: thủ tục lưu trữ, trình kích hoạt, chế độ xem, con trỏ, giao dịch phân tán, công cụ lưu trữ được liên kết, v.v.) Oracle mua innobase, 4 người và một công ty của Phần Lan đứng sau kho lưu trữ innodb của MySQL phụ trợ, kết thúc năm với 34 triệu đô la doanh thu dựa trên 3400 khách hàng.
2006 Marten Mickos xác nhận rằng ORACLE đã cố gắng mua MySQL. Giám đốc điều hành của Oracle, Larry Ellison, nhận xét: "Chúng tôi đã nói chuyện với họ, thực tế là chúng tôi đã nói chuyện với hầu hết mọi người. Chúng tôi có quan tâm không? Đó là một công ty nhỏ. Tôi nghĩ doanh thu từ MySQL là từ 30 triệu đến 40 triệu đô la. Doanh thu của Oracle năm tới là 15 tỷ đô la. " Oracle mua Sleepycat, công ty cung cấp cho MySQL công cụ lưu trữ giao dịch db . Marten Mickos tuyên bố rằng họ đang làm cho MySQL sẵn sàng cho IPO vào năm 2008 với doanh thu dự kiến 100 triệu đô la. 8 triệu cài đặt hoạt động. MySQL có 320 nhân viên tại 25 quốc gia, 70% trong số họ làm việc tại nhà, đã huy động được chuỗi 18 triệu đô la c dựa trên định giá được đồn đại ở phía bắc là 300 triệu đô la. MySQL được ước tính có 33% thị phần được đo trong cơ sở cài đặt và 0,2% thị phần được đo bằng doanh thu (thị trường cơ sở dữ liệu là một thị trường trị giá 15 tỷ đô la trong năm 2006). Kết thúc năm với doanh thu 50 triệu đô la.
2007 Kết thúc năm với doanh thu 75 triệu đô la.
2008 Sun microsystems mua lại MySQL AB với giá xấp xỉ 1 tỷ USD. Michael Widenius (Monty) và David Axmark, hai trong số những người đồng sáng lập của MySQL AB, bắt đầu chỉ trích Sun công khai và rời khỏi Sun ngay sau đó.
2009 Marten Mickos rời Sun và trở thành doanh nhân sống tại Benchmark Capital. Sun đã mất đi các nhà lãnh đạo kinh doanh và tinh thần đã biến MySQL thành một thành công.
Sun microsystems và Oracle tuyên bố rằng họ đã tham gia vào một thỏa thuận dứt khoát, theo đó Oracle sẽ mua cổ phiếu phổ thông của Sun với giá 9,50 đô la cho mỗi cổ phiếu bằng tiền mặt. Giao dịch được định giá khoảng 7,4 tỷ USD.

Các chức năng MySQL

  • Hệ thống quản lý cơ sở dữ liệu quan hệ (RDBMS): MySQL là một hệ thống quản lý cơ sở dữ liệu quan hệ.
  • Dễ sử dụng: MySQL rất dễ sử dụng. Bạn chỉ phải có kiến ​​thức cơ bản về SQL. Bạn có thể xây dựng và tương tác với MySQL chỉ bằng một vài câu lệnh SQL đơn giản.
  • MYSQL an toàn: MySQL bao gồm một lớp bảo mật dữ liệu vững chắc để bảo vệ dữ liệu nhạy cảm khỏi những kẻ xâm nhập. Mật khẩu được mã hóa trong MySQL.
  • Kiến trúc máy khách / máy chủ: MySQL tuân theo kiến ​​trúc máy khách / máy chủ. Có một máy chủ cơ sở dữ liệu (MySQL) và nhiều máy khách (chương trình ứng dụng), giao tiếp với máy chủ; nghĩa là, họ truy vấn dữ liệu, lưu các thay đổi, v.v.
  • Tải xuống miễn phí: MySQL miễn phí sử dụng và bạn có thể tải xuống từ trang web chính thức của MySQL.
  • Có khả năng mở rộng: MySQL có thể xử lý hầu hết mọi lượng dữ liệu, lên tới 50 triệu hàng trở lên. Giới hạn kích thước tệp mặc định là khoảng 4 GB. Tuy nhiên, bạn có thể tăng con số này lên giới hạn lý thuyết là 8 TB dữ liệu.
  • Tương thích trên nhiều hệ điều hành: MySQL tương thích để chạy trên nhiều hệ điều hành, như Novell NetWare, Windows * Linux *, nhiều loại UNIX * (như Sun * Solaris *, AIX và DEC * UNIX), OS / 2, FreeBSD *, và những người khác. MySQL cũng cung cấp một phương tiện mà các máy khách có thể chạy trên cùng một máy tính với máy chủ hoặc trên một máy tính khác (giao tiếp qua mạng cục bộ hoặc Internet).
  • Cho phép khôi phục: MySQL cho phép các giao dịch được khôi phục, cam kết và phục hồi sự cố.
  • Hiệu suất cao: MySQL nhanh hơn, đáng tin cậy hơn và rẻ hơn vì kiến ​​trúc công cụ lưu trữ độc đáo.
  • Tính linh hoạt cao: MySQL hỗ trợ một số lượng lớn các ứng dụng nhúng giúp MySQL rất linh hoạt.
  • Năng suất cao: MySQL sử dụng Triggers, các thủ tục và chế độ xem được lưu trữ cho phép nhà phát triển cung cấp năng suất cao hơn.

Nhược điểm / nhược điểm của MySQL:

Sau đây là một vài nhược điểm của MySQL: 

  • Phiên bản MySQL nhỏ hơn 5.0 không hỗ trợ ROLE, COMMIT và thủ tục lưu trữ.
  • MySQL không hỗ trợ kích thước cơ sở dữ liệu rất lớn một cách hiệu quả.
  • MySQL không xử lý các giao dịch rất hiệu quả và nó dễ bị hỏng dữ liệu.
  • MySQL bị cáo buộc rằng nó không có một công cụ phát triển và gỡ lỗi tốt so với các cơ sở dữ liệu phải trả tiền.
  • MySQL không hỗ trợ các ràng buộc kiểm tra SQL.

Kiểu dữ liệu trong MySQL

Việc xác định đúng kiểu dữ liệu của các trường trong một bảng rất quan trọng đối với việc tối ưu hóa cơ sở dữ liệu của bạn. Bạn chỉ nên sử dụng kiểu dữ liệu và kích cỡ của trường thực sự cần sử dụng. Ví dụ: không định nghĩa trường rộng 10 ký tự, nếu bạn biết rằng chỉ sử dụng 2 ký tự.

Kiểu dữ liệu trong MySQL có thể được chia thành 3 kiểu như sau:

  • Numeric
  • Date and Time
  • Các kiểu chuỗi

Kiểu dữ liệu Numeric

MySQL sử dụng tất cả các loại dữ liệu số ANSI SQL tiêu chuẩn, vì vậy nếu bạn đã từng tiếp cận với một hệ thống cơ sở dữ liệu khác, kiểu dữ liệu numeric tương tự như vậy.

Danh sách sau đây cho thấy các loại dữ liệu số phổ biến và mô tả của chúng:

Kiểu dữ liệu Mô tả
INT Một số nguyên với kích cỡ thông thường, có thể là signed hoặc unsigned. Nếu có dấu, thì dãy giá trị có thể là từ -2147483648 tới 2147483647, nếu không dấu thì dãy giá trị là từ 0 tới 4294967295. Bạn có thể xác định một độ rộng lên tới 11 chữ số.
TINYINT Một số nguyên với kích cỡ rất nhỏ, có thể là signed hoặc unsigned. Nếu có dấu, thì dãy giá trị có thể là từ -128 tới 127, nếu không dấu thì dãy giá trị là từ 0 tới 255. Bạn có thể xác định một độ rộng lên tới 4 chữ số.
MEDIUMINT Một số nguyên với kích cỡ trung bình, có thể là signed hoặc unsigned. Nếu có dấu, thì dãy giá trị có thể là từ -8388608 tới 8388607, nếu không dấu thì dãy giá trị là từ 0 tới 16777215. Bạn có thể xác định một độ rộng lên tới 9 chữ số.
BIGINT Một số nguyên với kích cỡ lớn, có thể là signed hoặc unsigned. Nếu có dấu, thì dãy giá trị có thể là từ -9223372036854775808 tới 9223372036854775807, nếu không dấu thì dãy giá trị là từ 0 tới 18446744073709551615. Bạn có thể xác định một độ rộng lên tới 20 chữ số.
FLOAT(M, D) Một số thực dấu chấm động không dấu. Bạn có thể định nghĩa độ dài hiển thị (M) và số vị trí sau dấy phảy (D). Điều này là không bắt buộc và sẽ có mặc định là 10,2: với 2 là số vị trí sau dấu phảy và 10 là số chữ số (bao gồm các phần thập phân). Phần thập phân có thể lên tới 24 vị trí sau dấu phảy đối với một số FLOAT.
DOUBLE(M, D) Một số thực dấu chấm động không dấu. Bạn có thể định nghĩa độ dài hiển thị (M) và số vị trí sau dấy phảy (D). Điều này là không bắt buộc và sẽ có mặc định là 16,4: với 4 là số vị trí sau dấu phảy và 16 là số chữ số (bao gồm các phần thập phân). Phần thập phân có thể lên tới 53 vị trí sau dấu phảy đối với một số DOUBLE. REAL là đồng nghĩa với DOUBLE.
DECIMAL(M, D) Một kiểu khác của dấu chấm động không dấu. Mỗi chữ số thập phân chiếm 1 byte. Việc định nghĩa độ dài hiển thị (M) và số vị trí sau dấy phảy (D) là bắt buộc. NUMERIC là một từ đồng nghĩa cho DECIMAL.

Kiểu dữ liệu Date và Time trong MySQL

Kiểu dữ liệu Date và Time được phân loại thành:

Kiểu dữ liệu Mô tả
DATE Một date trong định dạng YYYY-MM-DD, giữa 1000-01-01 và 9999-12-31. Ví dụ, ngày 25 tháng 12 năm 2015 sẽ được lưu ở dạng 2015-12-25.
DATETIME Một tổ hợp Date và Time trong định dạng YYYY-MM-DD HH:MM:SS, giữa 1000-01-01 00:00:00 và 9999-12-31 23:59:59. Ví dụ, 3:30 chiều ngày 25 tháng 12, năm 2015 sẽ được lưu ở dạng 2015-12-25 15:30:00.
TIMESTAMP Một Timestamp từ giữa nửa đêm ngày 1/1/1970 và 2037. Trông khá giống với định dạng DATETIME trước, khác biệt ở chỗ không có dấu gạch nối giữa các số. Ví dụ, 3:30 chiều ngày 25 tháng 12, năm 2015 sẽ được lưu dưới dạng 20151225153000 ( YYYYMMDDHHMMSS ).
TIME Lưu time trong định dạng HH:MM:SS.
YEAR(M) Lưu 1 năm trong định dạng 2 chữ số hoặc 4 chữ số. Nếu độ dài được xác định là 2 (ví dụ: YEAR(2)), YEAR có thể từ 1970 tới 2069 (70 tới 69). Nếu độ dài được xác định là 4, YEAR có thể từ 1901 tới 2155. Độ dài mặc định là 4.

Kiểu dữ liệu chuỗi trong MySQL

Ngoài các kiểu dữ liệu số hoặc kiểu dữ liệu date và time, thì còn một kiểu dữ liệu mà bạn thường sử dụng nhất trong MySQL là kiểu dữ liệu chuỗi. Dưới đây liệt kê các kiểu dữ liệu chuỗi và phần miêu tả của chúng trong MySQL:

Kiểu dữ liệu Mô tả
CHAR(M) Một chuỗi có độ dài cố định có độ dài từ 1 tới 255 ký tự (ví dụ CHAR(5)). Nếu giá trị thật của một trường kiểu Char không bằng với độ dài khai báo thì phần thiếu bên phải của nó sẽ được thêm bằng các kí tự trắng một cách tự động. Định nghĩa độ dài là không bắt buộc, giá trị mặc định là 1.
VARCHAR(M) Dữ liệu kiểu chuỗi có độ dài thay đổi, có độ dài từ 1 đến 255 kí tự (ví dụ Varchar(24)). Bạn phải định nghĩa độ dài khi tạo một trường VARCHAR.
DATE  
BLOB hoặc TEXT Trường kiểu này có độ dài tối đa 65535 kí tự. BLOBs là viết tắt của “Binary Large Objects”, và được sử dụng để lưu trữ một lượng lớn dữ liệu nhị phân như các bức ảnh hoặc các loại tập tin khác. Với TEXT, trường cũng lưu trữ được một lượng lớn dữ liệu. Điểm khác nhau giữa chúng là: khi sắp xếp và so sánh dữ liệu đã lưu trữ thì với BLOBs là phân biệt kiểu chữ, còn với TEXT là không phân biệt kiểu chữ. Bạn không phải xác định độ dài với BLOBs hoặc TEXT.
TINYBLOB hoặc TINYTEXT Một cột BLOB hoặc TEXT với độ dài tối đa là 255 ký tự. Bạn không cần xác định độ dài với TINYBLOB hoặc TINYTEXT.
MEDIUMBLOB hoặc MEDIUMTEXT Một cột BLOB hoặc TEXT với độ dài tối đa là 16777215 ký tự. Bạn không cần xác định độ dài với MEDIUMBLOB hoặc MEDIUMTEXT.
LONGBLOB hoặc LONGTEXT Một cột BLOB hoặc TEXT với độ dài tối đa là 4294967295 ký tự. Bạn không cần xác định độ dài với LONGBLOB hoặc LONGTEXT.
ENUM Khi định nghĩa một trường kiểu này, tức là, ta đã chỉ ra một danh sách các đối tượng mà trường phải nhận (có thể là Null). Ví dụ, nếu ta muốn một trường nào đó chỉ nhận một trong các giá trị “A” hoặc “B” hoặc “C” thì ta phải định nghĩa kiểu ENUM cho nó như sau: ENUM (‘A’, ‘B’, ‘C’). Và chỉ có các giá trị này (hoặc NULL) có thể xuất hiện trong trường đó.

Cài đặt MySQL

Để cài đặt MySQL trên hệ điều hành Windows bạn có thể cài đặt MySQL Server hoặc cài XAMPP.


Cài đặt MySQl Server

Để cài MySQL Server và các phần mềm liên quan bạn có thể vào trang https://dev.mysql.com/downloads/

Tải và cài đặt MySQL Server tại https://dev.mysql.com/downloads/mysql/

Tải và cài đặt MySQL Workbench tại https://dev.mysql.com/downloads/workbench/

MySQL Workbench cung cấp cho các nhà phát triển môi trường các công cụ tích hợp để:

  • Database Design & Modeling
  • SQL Development
  • Database Administration
  • Database Migration

Cài đặt XAMPP

AMP (Apache, MySQL, PHP). Nó có sẵn cho tất cả các hệ điều hành. Có nhiều tùy chọn AMP có sẵn trên thị trường được cung cấp dưới đây:

  • WAMP cho Windows
  • LAMP cho Linux
  • MAMP cho Mac
  • SAMP cho Solaris
  • FAMP cho FreeBSD
  • XAMPP (Apache, MySQL, PHP, Perl): nó bao gồm nhiều chương trình khác như FileZilla, OpenSSL, Webalizer, Mercury Mail, v.v.

Tải và cài đặt máy chủ XAMPP tại https://www.apachefriends.org/download.html

Với XAMPP bạn có thể sử dụng trình phpMyAdmin để quản trị cơ sở dữ liệu MySQL.

Khởi động MySQL Server:

Mở XAMPP:

Cài đặt MySQL

Click start để mở Apache server và MySQL server trong XAMPP:

Cài đặt MySQL

Đến đây là bạn đã cài đặt thành công MySQL Server: với username = “root” và password = “”.

Sử dụng trình phpMyAdmin

Mở trình phpMyAdmin để thao tác với MySQL.

1. Mở trang http://localhost/

2. Click link phpMyAdmin:

Cài đặt MySQL

3. Giao diện phpMyAdmin:

Cài đặt MySQL

Tại đây bạn có thể thao tác với database và các table, thực thi câu lệnh SQL,…

Sử dụng Navicat thao tác với MySQL Server

Nếu bạn không thích sử dụng phpMyAdmin thì bạn có thể sử dụng phần mềm Navicat, với Navicat hỗ trợ nhiều hệ quản trị cơ sở dữ liệu như MySQL, SQL Server, PostgreSQL,…

Tham khảo thêm cách sử dụng tại /phan-mem-tien-ich/navicat

Đổi mật khẩu MySQL Root trên XAMPP

au khi cài đặt MySQL bằng cách cài đặt XAMPP như trong bài hướng dẫn cài đặt MySQL

Bài này hướng dẫn bạn cách đổi mật khẩu MySQL Root trên XAMPP, các bước thực hiện như sau:

1. Vào thư mục C:\xampp\phpMyAdmin -> Tìm và mở file config.inc.

Đổi mật khẩu MySQL Root trên XAMPP

Sửa dòng số – 19 
$cfg [‘Servers’] [$a] [‘auth_type’] = ‘config’;

Sửa thành: 
$cfg[‘Servers’][$i][‘auth_type’] = ‘cookie‘;

2. Start Apache và MySQL:

Đổi mật khẩu MySQL Root trên XAMPP

3. Mở page http://localhost/ -> Mở page “phpMyAdmin“. Bạn sẽ nhìn thấy chức năng “Change password“:

Đổi mật khẩu MySQL Root trên XAMPP

3. Click liên kết “Change password“, hộp thoại change password được hiển thị, nhập mật khẩu mới của bạn, click button “Go“:

Đổi mật khẩu MySQL Root trên XAMPP

4. Thông báo đổi mật khẩu MySQL Root trên XAMPP thành công:

Đổi mật khẩu MySQL Root trên XAMPP


Sử dụng Navicat kết nối bằng tài khoản root

Tham khảo thêm cách sử dụng tại /phan-mem-tien-ich/navicat

Các bước thực hiện:

1. Tạo New Connection:

Đổi mật khẩu MySQL Root trên XAMPP

2. Nhập password vừa thay đổi ở trên cho tài khoản root:

Đổi mật khẩu MySQL Root trên XAMPP

3. Click “Test Connection” để kiểm tra kết nối, click “OK” để tắt thông báo:

Đổi mật khẩu MySQL Root trên XAMPP

4. Click “OK” để tạo kết nối với cơ sở dữ liệu MySQL:

Đổi mật khẩu MySQL Root trên XAMPP

5. Ví dụ tạo query và thực thi câu lệnh Select:

Đổi mật khẩu MySQL Root trên XAMPP


 

Tạo Cơ sở dữ liệu trong MySQL

Bài này hướng dẫn bạn 3 cách để tạo cơ sở dữ liệu trong MySQL:

  1. Sử dụng lệnh CREATE DATABASE
  2. Sử dụng trình phpMyAdmin của XAMPP
  3. Sử dụng phần mềm Navicat

I. Sử dụng lệnh CREATE DATABASE

Để tạo cơ sở dữ liệu, bạn có thể sử dụng lệnh CREATE trong MySQL.

1. Cú pháp cơ bản của lệnh CREATE DATABASE:

CREATE DATABASE [database_name];

Ví dụ: tạo cơ sở dữ liệu sinhvien:

CREATE DATABASE sinhvien;

Lệnh này sẽ tạo một cơ sở dữ liệu có tên là sinhvien trong MySQL Database.

2. Tạo database trong MySQL với character set và collation:

Với việc chỉ định character set và collection cho phép bạn nhập kiểu ký tự vào bảng trong cơ sở dữ liệu, ví dụ bạn muốn nhập tiếng Việt có dấu thì character set bạn phải chỉ định là UTF-8…

CREATE DATABASE [database_name] character set [CHAR_SET] collate [COLLATION];

Ví dụ: tạo cơ sở dữ liệu sinhvien có thể lữu trữ dữ liệu tiếng Việt có dấu:

 
CREATE DATABASE sinhvien character set UTF8 collate utf8_vietnamese_ci;

MySQL hỗ trợ hai loại bộ ký tự UTF8: utf8 và utf8mb4.

Bảng ký tự utf8 của MySQL chứa các ký tự từ mặt phẳng đa lớp, còn được gọi là BMP – nó là tập hợp con của các ký tự UTF8 có từ 1 đến 3 byte. Các ký tự 4 byte không được bao gồm trong bảng ký tự này và khi cố lưu trữ các ký tự này trong bảng MySQL, sẽ xảy ra lỗi giá trị chuỗi không chính xác.

Ký tự utf8mb4 của MySQL là siêu ký tự của BMP và cũng chứa các ký tự 4 byte. Ký tự này được hỗ trợ kể từ MySQL 5.5.3. Trong trường hợp này, máy chủ MySQL phải được cấu hình với tùy chọn character_set_server = utf8mb4 và không sử dụng thuộc tính kết nối thecharacterEncoding. Xem http://dev.mysql.com/doc/refman/5.5/en/connector-j-reference-charsets.html để biết thêm chi tiết.

Vì vậy để sử dụng bộ ký tự utf8mb4 nên sử dụng phiên bản MySQL 5.5.3 trở lên và trình kết nối / J (trình điều khiển jdbc) của MySQL phiên bản 5.1.18 trở lên.

3. Sử dụng từ khóa IF NOT EXISTS

Khi các bạn dùng lệnh trên thì nếu bảng đã tồn tại thì hệ thống sẽ báo lỗi. Nếu không muốn nhìn thấy lỗi này, bạn nên sử dụng thêm từ khóa IF NOT EXISTS của MySQL.

Cú pháp:

CREATE DATABASE IF NOT EXISTS [database_name]

Ví dụ: tạo cơ sở dữ liệu có tên nhanvien như sau, hệ thống sẽ không hiển thị lỗi:

CREATE DATABASE nhanvien;
CREATE DATABASE IF NOT EXISTS nhanvien;

II. Sử dụng trình phpMyAdmin của XAMPP

Trong bài cài đặt MySQL đã hướng dẫn bạn cài đặt MySQL bằng cách cài đặt XAMPP trên windows.

Start Apache và MySQL:

Tạo Database trong MySQL

Mở page http://localhost/ -> Mở page “phpMyAdmin” (hệ quản trị cơ sở dữ liệu)

Để tạo một database các bạn click chuột vào Databases trên thanh menu hoặc kích vào New ở phía bên tay trái như trong hình sau:

Tạo Database trong MySQL

Nhập tên database là sinhvien và kiểu ký tự tiếng Việt có dấu là utf8_vietnamese_ci:

Tạo Database trong MySQL

Sau đó click Create để tạo database, kết quả như sau:

Tạo Database trong MySQL


III. Sử dụng phần mềm Navicat

Tạo một connection đến máy chủ MySQL có tên MySQL-Connection.

Click chuột phải vào MySQL-Connection -> click “New Database…

Tạo Database trong MySQL

Hộp thoại tạo database hiển thị, nhập thông tin như hình sau và click “OK”

Tạo Database trong MySQL

Database sinhvien được tạo ra:

Tạo Database trong MySQL

Chọn cơ sở dữ liệu trong MySQL

Khi bạn kết nối với MySQL Server, để làm việc với một cơ sở dữ liệu nào đó, bạn cần lựa chọn một cơ sở dữ liệu. Điều này là bởi vì có nhiều cơ sở dữ liệu có sẵn MySQL Server.

Chọn cơ sở dữ liệu trong MySQL

Chọn một cơ sở dữ liệu cụ thể trong MySQL là rất đơn giản. Bạn có thể sử dụng lệnh usetrong SQL để lựa chọn một cơ sở dữ liệu. Cú pháp của lệnh use là:

USE ten_co_so_du_lieu;

Ví dụ sau lựa chọn một cơ sở dữ liệu có tên sinhvien:

USE sinhvien;

Bây giờ, bạn đã lựa chọn cơ sở dữ liệu sinhvien và tất cả hoạt động sau đó sẽ được thực hiện trên cơ sở dữ liệu này.

GHI CHÚ: Tất cả tên cơ sở dữ liệu, tên bảng, tên các trường của bảng là phân biệt kiểu chữ. Vì thế, bạn phải sử dụng tên chính xác trong khi cung cấp cho bất kỳ lệnh SQL nào.

 

Xóa Database trong MySQL

Cú pháp xóa database trong MySQL

Cú pháp để xóa database trong MySQL như sau:

DROP DATABASE [database_name];

Ví dụ xóa database trong MySQL

DROP DATABASE sinhvien;

Thự thi lệnh trên bằng cách tạo một Query bằng phần mềm Navicat như sau:

Xóa Database trong MySQL

Kết quả database ‘sinhvien’ bị xóa:

Xóa Database trong MySQL

Tạo bảng trong MySQL

Bảng (TABLE) là gì?

TABLE là một cái bảng dùng để lưu trữ dữ liệu cho một LOẠI ĐỐI TƯỢNG cụ thể.
TABLE gồm nhiều cột, và nhiều hàng. Trong đó:

  • Mỗi hàng lưu trữ thông tin của một đối tượng.
  • Mỗi cột là một thuộc tính của loại đối tượng đó.

Dưới đây là một bảng sinh_vien:

Full_name Gender Age City
Nguyen Thanh Nhan Nam 19 Can Tho
Pham Thu Huong Nu 20 Vinh Long
Nguyen Nhu Ngoc Nu 20 Soc Trang
Bui Thanh Bao Nam 19 Soc Trang
Le My Nhan Nu 22 Can Tho
Tan Thuc Bao Nam 35 An Giang

Bảng trên có 4 cột tương ứng với 4 thuộc tính: Full_name, Gender, Age, City.

Mỗi hàng lưu trữ thông tin của một đối tượng. (Ví dụ: hàng thứ 4 lưu trữ thông tin của đối tượng Nguyen Nhu Ngoc)

Cú pháp tạo bảng

Để tạo một bảng trong MySQL, chúng ta sử dụng cú pháp dưới đây

CREATE TABLE table_name
(
    column_name1 data_type(size),
    column_name2 data_type(size),
    column_name3 data_type(size),
    ....
);

Trong đó:

  • table_name là tên của bảng mà bạn muốn tạo.
  • column_name1 là tên cột thứ nhất của bảng. (Tương tự: column_name2 và column_name3 lần lượt là tên cột thứ hai và cột thứ ba).
  • data_type là kiểu dữ liệu của cột.
  • size là kích thước tối đa của kiểu dữ liệu của cột.

Ví dụ tạo một bảng sinh_vien

Để tạo một bảng sinh_vien gồm 4 cột: Full_name, Gender, Age, City giống ví dụ phía trên, chúng ta dùng câu lệnh sau:

CREATE TABLE sinh_vien
(
    Full_name VARCHAR(150),
    Gender VARCHAR(3),
    Age INT,
    City VARCHAR(50)
);
Không đặt dấu phẩy (,) ở câu lệnh tạo cột cuối cùng (Ví dụ: cuối câu lệnh City VARCHAR(50) không có dấu phẩy như 3 câu trên). Nếu không khi chạy lệnh sẽ bị lỗi.

Giải thích cách tạo bảng trên

name_column data_type size
Full_name Full_name (Ví dụ: Nguyen Thanh Nhan). Kiểu dữ liệu của nó là chuỗi, nên ta chọn VARCHAR 150 tức là bạn muốn họ tên của một sinh viên được nhập vào có chiều dài tối đa là 150 ký tự.
Gender Gender (Ví dụ: Nam, Nu). Kiểu dữ liệu của nó là chuỗi, nên ta chọn VARCHAR Gender là “Nam” hoặc “Nu”, ở đây “Nam” là dài nhất gồm 3 ký tự, nên ta chọn size là 3
Age Age (Ví dụ: 18, 25). Kiểu dữ liệu của nó là số nguyên, nên ta chọn INT INT có độ dài mặc định là 11, nên không cần điền Size
City City (Ví dụ: Can Tho, Vinh Long). Kiểu dữ liệu của nó là chuỗi, nên ta chọn VARCHAR 50 tức là bạn muốn thành phố được nhập vào có chiều dài tối đa là 50 ký tự.

Lưu ý

Khi một bảng mới được tạo, nó là bảng rỗng (vì chưa được thêm dữ liệu vào).

Sửa đổi cấu trúc bảng trong MySQL

Câu lệnh ALTER được dùng để sửa đổi cấu trúc của một bảng.

Sửa đổi cấu trúc của một bảng bao gồm các công việc như:

  • Thêm một cột mới vào bảng .
  • Xóa bỏ một cột trong bảng
  • Sửa một cột trong bảng
  • Đổi tên bảng

Cú pháp

Cú pháp thêm vào bảng một cột mới

ALTER TABLE table_name
ADD column_name datatype;

Cú pháp xóa bỏ một cột trong bảng

ALTER TABLE table_name
DROP COLUMN column_name;

Cú pháp sửa một cột trong bảng

ALTER TABLE table_name
MODIFY COLUMN column_name datatype;

Cú pháp đổi tên bảng

ALTER TABLE table_name 
RENAME TO new_table_name;

Một số ví dụ

Chúng ta có một bảng sinh_vien như sau:

Full_name Gender Age City

Ví dụ 1

Thêm vào bảng một cột mới có tên là SO_DIEN_THOAI, kiểu dữ liệu là INT

ALTER TABLE sinh_vien
ADD SO_DIEN_THOAI INT;

Sau khi thực thi, bảng sinh_vien sẽ có cấu trúc như sau:

Full_name Gender Age City SO_DIEN_THOAI

Ví dụ 2

Xóa bỏ cột City trong bảng sinh_vien

ALTER TABLE sinh_vien
DROP COLUMN City;

Sau khi thực thi, bảng sinh_vien sẽ có cấu trúc như sau:

Full_name Gender Age SO_DIEN_THOAI

Ví dụ 3

Sửa kiểu dữ liệu của cột Age thành SMALLINT

ALTER TABLE sinh_vien
MODIFY COLUMN AGE SMALLINT;

Sau khi thực thi, bảng sinh_vien sẽ có cấu trúc như sau (Lưu ý: kiểu dữ liệu của cột Age đã được thay đổi thành SMALLINT):

Full_name Gender Age SO_DIEN_THOAI

Ví dụ 4

Đổi tên bảng sinh_vien thành sinh_vien_dai_hoc_can_tho

ALTER TABLE sinh_vien 
RENAME TO sinh_vien_dai_hoc_can_tho;

Sau khi thực thi, bảng sinh_vien đã được đổi tên thành sinh_vien_dai_hoc_can_tho

Lệnh TRUNCATE TABLE trong MySQL

Lệnh TRUNCATE TABLE trong MySQL được sử dụng để xóa hoàn toàn dữ liệu từ một bảng hiện có.

Bạn cũng có thể sử dụng lệnh DROP TABLE để xóa toàn bộ bảng nhưng nó sẽ xóa bỏ cấu trúc bảng khỏi cơ sở dữ liệu và bạn sẽ cần phải tạo lại bảng này một lần nữa nếu bạn muốn lưu trữ một số dữ liệu.

Cú pháp

Cú pháp cơ bản của lệnh TRUNCATE TABLE như sau.

TRUNCATE TABLE  table_name;

Ví dụ

Giả sử bảng CUSTOMERS có các bản ghi sau đây:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ha Anh   |  32 | Da Nang   |  2000.00 |
|  2 | Van Ha   |  25 | Ha Noi    |  1500.00 |
|  3 | Vu Bang  |  23 | Vinh      |  2000.00 |
|  4 | Thu Minh |  25 | Ha Noi    |  6500.00 |
|  5 | Hai An   |  27 | Ha Noi    |  8500.00 |
|  6 | Hoang    |  22 | Ha Noi    |  4500.00 |
|  7 | Binh     |  24 | Ha Noi    | 10000.00 |
+----+----------+-----+-----------+----------+

Sau đây là ví dụ về lệnh Truncate.

TRUNCATE TABLE CUSTOMERS;

Bây giờ, bảng CUSTOMERS được cắt ngắn và kết quả từ câu lệnh SELECT sẽ được hiển thị trong khối mã bên dưới:

SELECT * FROM CUSTOMERS;
Empty set (0.00 sec)

Quá trình rollback là không thể sau khi dùng lệnh TRUNCATE TABLE

Xóa bảng trong MySQL 

Xóa bảng trong MySQL đang tồn tại là khá đơn giản, nhưng bạn cần cẩn trọng trong khi xóa bất kỳ bảng nào, bởi vì bạn sẽ mất toàn bộ dữ liệu đã được lưu giữ trong bảng đó và không thể khôi phục lại được.

Cú pháp

Cú pháp SQL chung để xóa một bảng MySQL là:

DROP TABLE ten_bang;

Ví dụ

Để xóa bảng có tên nhanvien bạn có thể sử dụng câu lệnh sau:

DROP TABLE nhanvien;

 

Bảng ảo View trong MySQL

MySQL cung cấp tính năng bảng ảo kể từ phiên bản 5.x trở đi.

  • View là bảng ảo giúp giới hạn truy cập một số cột dòng trên các bảng dữ liệu.

  • Views đảm bảo tính bảo mật bằng các giới hạn truy cập sau:

    • Các hàng trên một bảng
    • Các cột trên một bảng
    • Các hàng và cột trên một bảng
    • Các hàng giữa các bảng sử dụng phép joins
  • Thuận lợi khi sử dụng view

    • Cung cấp dữ liệu cần thiết cho người dùng
    • Che dấu đi sự phức tạp của dữ liệu
    • Tổ chức dữ liệu từ nhiều tài nguyên không đồng nhất
    • Giảm kích cỡ của đối tượng
  • Cú pháp tạo view

CREATE VIEW ViewName
AS
//Query

Query là một truy vấn mysql, lưu ý khi sử dụng câu lệnh select:

o Không sử dụng biến local, user hay session

o Những lệnh dịch sẵn cũng không thể sử dụng

o Bảng tạm hay các bảng ảo khác cũng không được sử dụng làm nguồn dữ liệu cho câu truy vấn này.

o Không thể tạo trigger cho bảng ảo.

  • Ví dụ tạo view
CREATE VIEW SalePerOrder
   AS
   SELECT orderNumber,
   SUM  (quantityOrdered * priceEach) total
   FROM orderDetails
   GROUP by orderNumber
   ORDER BY total DESC

Sử dụng view:

SELECT total
   FROM salePerOrder
   WHERE orderNumber = 1000
  • Ưu nhược điểm của view
  1. Ưu điểm
    • An ninh – Cho phép người quản trị CSDL (DBA) cung cấp cho người sử dụng chỉ những dữ liệu cần thiết
    • Đơn giản hóa – Các view cũng có thể sử dụng để ẩn và sử dụng lại các truy vấn phức tạp
  2. Nhược điểm
    • Không thể chứa mệnh ñề COMPUTE hoặc COMPUTE BY
    • Vì tạo ra bảng tạm nên view sẽ làm tốn tài nguyên, chậm hệ thống.
    • Không thể chứa mệnh ñề ORDER BY trừ khi có TOP n
    • Không thể chứa mệnh ñề INTO
    • Không thể chứa các table tạm
    • Có tối đa 1024 cột
  • Xóa view

Có thể xóa view từ database sử dụng cú pháp:

 DROP VIEW view_name

Trigger là gì?

SQL Trigger là một hoặc một tập các câu lệnh SQL được lưu trữ trong CSDL và sẽ được kích hoạt bởi sự kiện mà nó theo dõi trên bảng dữ liệu. Sự kiện đó gắn liền với thao tác INSERT, UPDATE hay DELETE.

Đôi khi người ta xem trigger là một dạng đặc biệt của thủ tục thường trú nếu xét về mặt mã lệnh viết trong thân trigger.

Ưu điểm của trigger·     

  • Sử dụng trigger để kiểm tra tính toàn vẹn của csdl.
  • Trigger có thể bắt lỗi logic nghiệp vụ (business logic) ở mức csdl.
  • Có thể dùng trigger là một cách khác để thay thế việc thực hiện những công việc hẹn giờ theo lịch.
  • Trigger rất hiệu quả khi được sử dụng để kiểm soát những thay đổi của dữ liệu trong bảng.

Nhược điểm của trigger

  • Trigger chỉ là một phần mở rộng của việc kiểm tra tính hợp lệ của dữ liệu chứ không thay thế được hoàn toàn công việc này.
  • Trigger hoạt động ngầm ở trong csdl, không hiển thị ở tầng giao diện. Do đó, khó chỉ ra được điều gì xảy ra ở tầng csdl.
  • Trigger thực hiện các update lên bảng dữ liệu vì thế nó làm gia tăng lượng công việc lên csdl và làm cho hệ thống chạy chậm lại

Hoạt động của Trigger

/data_folder/database_name/table_name.trg
Đây là một file text thuần túy nên chúng ta có thể sử dụng bất cứ trình soạn thảo văn bản nào để chỉnh sửa.

  • Một số giới hạn cần chú ý khi sử dụng trigger:
  • Không thể gọi thủ tục thường trú từ trigger
  • Không thể tạo ra trigger theo dõi bảng ảo  hay bảng tạm
  • Không thể sử dụng giao tác (transaction) trong trigger.
  • Trigger không cho phép sử dụng lệnh RETURN.
  • Sử dụng trigger sẽ làm ảnh hưởng đến bộ nhớ tạm danh cho lệnh truy vấn.
  • Tất cả các trigger của csdl không được trùng tên.

 

Cách sử dụng Trigger trong MySQL

1.Tạo trigger

CREATE TRIGGER trigger_name BEFORE | AFTER INSERT |UPDATE | DELETE ON tablename
FOR EACH ROW sql-code

2.Xóa trigger

DROP TRIGGER tablename.trigger_name

3.Sửa, xem thông tin trigger:

ALTER TRIGGER, SHOW CREATE TRIGGER, hoặc SHOW TRIGGER STATUS

4.Để hiển thị các trigger:

  • Hiển thị tất cả các trigger
SELECT * FROM Information_Schema.Trigger
WHERE Trigger_schema = 'database_name' AND Event_object_table = 'table_name';
  • Xem nội dung trigger
SELECT * FROM Information_Schema.Trigger
WHERE Trigger_schema = 'database_name' AND
Trigger_name = 'trigger_name';
  • Xem tất cả trigger của một bảng dữ liệu
SELECT * FROM Information_Schema.Trigger
WHERE Trigger_schema = 'database_name' AND
Event_object_table = 'table_name';

Địnhnghĩa thủ tục thường trú (stored procedure)

Một thủ tục thường trú là một đoạn mã SQL được lưu trong CSDL mà các chương trình khác có thể gọi thực thi (trigger cũng là một dạng thủ tục thường trú)

Thủ tục thường trú tự gọi đến chính nó gọi là thủ tục thường trú đệ quy. Hầu hết các hệ quản trị csdl quan hệ đều hỗ trợ loại thủ tục thường trú này nhưng MySQL (đến nay) thì vẫn chưa.

Thủ tục thường trú trong MySQL

MySQL là hệ quản trị CSDL quan hệ được sử dụng rộng rãi trong lĩnh vực CNTT. Tuy nhiên vào những phiên bản đầu của nó, thì MySQL chưa hỗ trợ thủ tục thường trú, trigger hay event, .v.v. Phải đến phiên bản MySQL 5.0 thì những chức năng trên mới được đưa vào.

Ưu điểm của thủ tục thường trú

  • Làm tăng hiệu năng của ứng dụng. Thủ tục thường trú có tốc độ thực thi nhanh hơn các mã lệnh SQL chưa được biên dịch.
  • Làm giảm lưu lượng truyền tải giữa ứng dụng và máy chủ csdl.
  • Có khả năng tái sử dụng và minh bạch đối với bất kì ứng dụng nào muốn sử dụng nó.
  • Có tính an toàn.

Nhược điểm của thủ tục thường trú

  • Làm tăng tải lượng tính toán cảu máy chủ csdl cả về bộ nhớ lẫn bộ vi xử lý.
  • Nó đơn thuần là các lệnh SQL nên khó để viết nên những thủ tục có độ phức tạp về mặt logic cao.
  • Không thể debug (chỉnh lỗi)
  • Viết và duy trì các thủ tục thường trú đòi hỏi kiến thức, kĩ năng và kinh nghiệm phong phú.

Tạo thủ tục thường trú đầu tiên

Chúng ta tạo một thủ tục thường trú để lấy ra tất cả các sản phẩm từ bảng products.

DELIMITER //
BEGIN
CREATE PROCEDURE  stored_procedure_name
/*** SQL for stored procedure ***/
END //
DELIMITER ;

Giải thích:

  • Câu lệnh DELIMITER //:  để đổi dâu ngăn cách các dòng lệnh từ ; sang //. Câu lệnh này không liên quan gì đến nội dung thủ tục thường trú của chúng ta. Mục đích của việc làm này là để chúng ta có thể có nhiều câu lệnh SQL trong thủ tục thướng trú và những câu lệnh này ngăn cách nhau bằng dấu ;. Sau từ khóa END là // để báo hiệu kết thúc thủ tục thường trú. Cuối cùng, chuyển lại dấu ngăn cách lệnh về ; như mặc định của MySQL.
  • Câu lệnh CREATE PROCEDURE tạo mới một thủ tục thường trú với tên là GetAllProducts như ví dụ trên.
  •  Phần thân của thủ tục thường trú nằm trong khối BEGIN … END. Ta viết các câu lệnh SQL trong không gian này.

Để gọi thủ tục thường trú, chúng ta sử dụng cú pháp sau:

CALL STORED_PROCEDURE_NAME()

Ví dụ:

CALL GetAllProducts();

 

Khai báo biến trong thủ tục nội tại

Biến trong thủ tục thường trú dùng để lưu giữ giá trị trong quá trình tính toán. Khai báo biến theo cú pháp sau:

DECLARE variable_name datatype(size) DEFAULT default_value;

Lưu ý:
  • Tên biến không được trung với tên bảng hay tên cột của csdl.
  • Kiểu dữ liệu của biến có thể là bất cứ kiểu nào do MySQL hỗ trợ (như INT, VARCHAR, DATETIME, …)
  • Khi khai báo biến, giá trị ban đầu của nó là NULL.
  • Để đặt giá trị mặc định ta khai báo DEFAULT

Ví dụ: Khai báo biến

DECLARE total_sale INT DEFAULT 0
DECLARE x, y INT DEFAULT 0

Gán giá trị cho biến

Sau khi khai báo biến, chúng ta gán giá trị cho biến để phục vụ tính toán. Để gán giá trị cho biến ta dùng câu lệnh SET.

Ví dụ:

DECLARE total_count INT DEFAULT 0
SET total_count = 10; 


Ngoài câu lệnh SET, chúng ta còn có thể sử dụng lệnh SELECT … INTO để gán giá trị cho biến như ví dụ sau đây:

DECLARE total_products INT DEFAULT 0
SELECT COUNT(*) INTO total_products
FROM products 

 

Phạm vi của biến

Mỗi biến có phạm vi riêng của nó. Nếu bạn khai báo biến bên trong thân thủ tục thường trú thì nó sẽ kết thúc khi chương trình thực hiện đến lệnh END của thủ tục thường trú. Nếu bạn khai báo một biến bên trong một khối lệnh BEGIN…END thì nó chỉ có phạm vi hoạt động bên trong khối lệnh đó mà thôi.

Biến bắt đầu bằng kí tự @ là biến session (phiên). Nó sẽ kết thúc khi session (phiên) kết thúc.
 

Tham số trong Store Procedure

Hầu hết các thủ tục thường trú đều yêu cầu tham số. Tương tự như khi chúng ta xây dựng các thủ tục, hàm hay phương thức trong các ngôn ngữ lập trình khác như C, Pascal, C++, java, .v.v.

Mỗi tham số thuộc một trong 3 kiểu IN, OUT hoặc INOUT.

  • Kiểu IN: là kiểu mặc định. Kiểu IN quy định giá trị của tham số truyền vào theo kiểu này sẽ không hề thay đổi khi kết thúc quá trình tính toán của thủ tục thường trú. Dù cho trong thân thủ tục thường trú có tồn tại bất kì phép toán nào làm thay đổi giá trị của tham số hay không.
  • Kiểu OUT: chỉ ra thủ tục thường trú có thể thay đổi giá trị của tham số loại này.
  • Kiểu INOUT: là kết hợp của kiểu IN và OUT, chúng ta có thể truyền tham số vào thủ tục thường trú và nhận lại nó với giá trị mới sau khi đã được thủ tục thường trú tính toán làm thay đổi giá trị.

Cú pháp khai báo tham số như sau:

MODE param_name param_type(param_size)

Trong đó, MODE có thể là IN, OUT hoặc INOUT.

Ví dụ: xây dựng thủ tục thường trú lấy ra danh sách tất cả các văn phòng của công ty tại một quốc gia X.

DELIMITER //

  CREATE PROCEDURE GetOfficeByCountry(IN countryName VARCHAR(255))

     BEGIN

               SELECT city, phone

               FROM offices

               WHERE country = countryName;

     END //

  DELIMITER ;

Gọi thủ tục thường trú trên như sau:

CALL GetOfficeByCountry('USA') 

Hay

CALL GetOfficeByCountry(‘France’) 

Ví dụ 2: Đếm số lượng hóa đơn theo tình trạng của hóa đơn đó. Ví dụ như cần biết bao nhiêu hóa đơn đã chuyển, đã hủy bỏ hay đang xử lý

DELIMITER $$

 CREATE PROCEDURE CountOrderByStatus(

               IN orderStatus VARCHAR(25),

               OUT total INT)

     BEGIN

               SELECT count(orderNumber)

               INTO total

               FROM orders

               WHERE status = orderStatus;

     END$$

  DELIMITER ;

Gọi thủ tục thường trú trên như sau

CALL  CountOrderByStatus('Shipped',@total);

 SELECT @total AS  total_shipped; 

Hay

CALL CountOrderByStatus('in  process',@total);

 SELECT @total AS  total_in_process; 

(Video minh họa)

Ví dụ 3: một ví dụ về chế độ INOUT của tham số

DELIMITER $$

 CREATE PROCEDURE `Capitalize`(INOUT str VARCHAR(1024))

 BEGIN

        DECLARE i INT DEFAULT 1;

        DECLARE myc, pc CHAR(1);

        DECLARE outstr VARCHAR(1000) DEFAULT str;

        WHILE i <= CHAR_LENGTH(str) DO

               SET myc = SUBSTRING(str, i, 1);

               SET pc = CASE WHEN i = 1 THEN ' '

                             ELSE SUBSTRING(str, i - 1, 1)

                        END;

               IF pc IN (' ', '&', '''', '_', '?', ';', ':', '!', ',', '-', '/', '(', '.') THEN

                   SET outstr = INSERT(outstr, i, 1, UPPER(myc));

               END IF;

               SET i = i + 1;

        END WHILE;

        SET str = outstr;

 END$$

 DELIMITER ; 

Gọi thủ tục

SET @str = 'mysql stored procedure tutorial';

 CALL Capitalize(@str);

 SELECT @str;

 

Các lệnh điều kiện trong SProcedure

Lệnh IF

Cú pháp:

IF expression THEN commands

   [ELSEIF expression THEN commands]

   [ELSE commands]

END IF;

Mô tả cụ thể hơn (trong trường hợp đơn giản):

Trường hợp 1:

IF expression THEN commands
END IF;

Trường hợp 2:

IF expression THEN commands
ELSE commands

 

Lệnh lặp trong SProcedure

Vòng lặp WHILE

Cú pháp:

WHILE expression DO
   Statements
END WHILE

Ví dụ:

DELIMITER $$
 DROP PROCEDURE IF EXISTS WhileLoopProc$$
 CREATE PROCEDURE WhileLoopProc()
       BEGIN
               DECLARE x  INT;
               DECLARE str  VARCHAR(255);
               SET x = 1;
               SET str =  '';
               WHILE x  <= 5 DO
                           SET  str = CONCAT(str,x,',');
                           SET  x = x + 1; 
               END WHILE;
               SELECT str;
       END$$
   DELIMITER ;


Vòng lặp REPEAT

Cú pháp:

REPEAT
Statements;
UNTIL expression
END REPEAT

Ví dụ:

DELIMITER $$
 DROP PROCEDURE IF EXISTS RepeatLoopProc$$
 CREATE PROCEDURE RepeatLoopProc()
       BEGIN
               DECLARE x  INT;
               DECLARE str  VARCHAR(255);
               SET x = 1;
               SET str =  '';
               REPEAT
                           SET  str = CONCAT(str,x,',');
                           SET  x = x + 1; 
               UNTIL x  > 5
               END REPEAT;
               SELECT str;
       END$$
 DELIMITER ;


Vòng lặp LOOP – chỉ lệnh LEAVE và ITERATE

Lệnh LEAVE cho phép thoát ra khỏi vòng lặp hiện tại (tương tự như break của Java hay C#)

Lệnh ITERATE cho phép tiếp tục vòng lặp (tương tự lệnh continue của Java hay C#)

Ví dụ: một ví dụ tham khảo

DELIMITER $$
 DROP PROCEDURE IF EXISTS LOOPLoopProc$$
 CREATE PROCEDURE LOOPLoopProc()
       BEGIN
               DECLARE x  INT;
               DECLARE str  VARCHAR(255);
               SET x = 1;
               SET str =  '';
               loop_label:  LOOP
                           IF  x > 10 THEN
                                       LEAVE  loop_label;
                           END  IF;
                           SET  x = x + 1;
                           IF  (x mod 2) THEN
                                       ITERATE  loop_label;
                           ELSE
                                       SET  str = CONCAT(str,x,',');
                           END  IF;
                           
               END LOOP;    
               SELECT str;
       END$$

 

Con trỏ trong SProcedure

Trong bài học này, chúng ta sẽ tìm hiểu cách sử dụng con trỏ csdl để duyệt trên tập kết quả truy vấn.

MySQL hỗ trợ con trỏ cho thủ tục thường trú, hàm và trigger. Con trỏ được sử dụng để lặp trên một tập các dòng thuộc kết quả truy vấn. Sử dụng con trỏ để xử lý tính toán trên từng dòng. Đối với phiên bản 5.x trở đi, con trỏ trong MySQL có những thuộc tính sau:

  • Read only (chỉ đọc): có nghĩa là chúng ta không thể thay đổi giá trị.
  • Non-scrollable (không thể quay lại): con trỏ chỉ đi theo một hướng, không thể bỏ qua hay quay lại những dòng đã duyệt qua trong tập kết quả.
  • Asensitive: tránh cập nhật bảng dữ liệu khi đang mở con trỏ trên chính bảng dữ liệu đó. Nếu không rất có thể xảy ra những hậu quả ngoài mong đợi.

Quy trình khai báo và sử dụng con trỏ

Bước 1: Khai báo con trỏ với cú pháp sau:

DECLARE cursor_name CURSOR FOR SELECT_statement;

Bước 2: mở con trỏ để sử dụng

OPEN cursor_name;

Bước 3: Lấy ra một dòng để xử lý và chuyển con trỏ sang dòng tiếp theo

FETCH cursor_name INTO variable list;

Bước 4: đóng con trỏ, giải phóng bộ nhớ mà con trỏ chiếm giữ.

CLOSE cursor_name;

Lưu ý: Điểm quan trọng cần lưu ý khi thao tác với con trỏ là nên sử dụng kiểm lỗi NOT FOUND để tránh trường hợp không còn dòng dữ liệu nào cần xử lý.

Dưới đây là một ví dụ về sử dụng con trỏ trong thủ tục thường trú

Ví dụ:
 

DELIMITER $$

 DROP PROCEDURE IF EXISTS CursorProc$$

 CREATE PROCEDURE CursorProc()

 BEGIN

        DECLARE  no_more_products, quantity_in_stock INT DEFAULT 0;

        DECLARE  prd_code VARCHAR(255);

        DECLARE  cur_product CURSOR FOR

               SELECT  productCode FROM products;

        DECLARE  CONTINUE HANDLER FOR NOT FOUND

        SET  no_more_products = 1;



        /* for  loggging information */

         CREATE  TABLE infologs (

                Id int(11) NOT NULL AUTO_INCREMENT,

               Msg varchar(255) NOT NULL,

               PRIMARY KEY (Id)

        );

        OPEN  cur_product;



        FETCH  cur_product INTO prd_code;

        REPEAT

               SELECT  quantityInStock INTO quantity_in_stock

               FROM  products

               WHERE  productCode = prd_code;



               IF  quantity_in_stock < 100 THEN

                       INSERT  INTO infologs(msg)

                       VALUES  (prd_code);

               END  IF;

               FETCH  cur_product INTO prd_code;

        UNTIL  no_more_products = 1

        END REPEAT;

        CLOSE  cur_product;

        SELECT *  FROM infologs;

        DROP TABLE  infologs;

 END$$

 DELIMITER;

Giải thích: ở trên là một ví dụ đơn giản và có thể làm được bằng cách xây dựng các truy vấn SQL. Tuy nhiên đó lại là ví dụ dễ hiểu để chúng ta tìm hiểu cách thức hoạt động của con trỏ.

Chúng ta sử dụng con trỏ trên bảng products và duyệt qua tập kết quả truy vấn trên bảng này. Nếu tổng lượng tồn kho của sản phẩm  < 100 thì chúng ta đưa nó vào bảng tạm. Kết thúc quá trình lặp chúng ta sẽ đưa ra được danh sách các sản phẩm có lượng tồn kho dưới 100.

Chú ý: phải khai báo con trỏ trước khai báo kiểm lỗi NOT FOUND.

Câu lệnh Select trong MySQL

Câu lệnh SELECT trong MySQL được sử dụng để lấy dữ liệu từ một bảng cơ sở dữ liệu trả về dữ liệu này dưới dạng một bảng kết quả. Các bảng kết quả này được gọi là tập kết quả (result-sets).

Cú pháp

Cú pháp cơ bản của câu lệnh SELECT trong MySQL như sau:

SELECT column1, column2, columnN FROM table_name;

Ở đây, column1, column2… là các trường của một bảng có các giá trị bạn muốn lấy ra. Nếu bạn muốn lấy tất cả các trường có sẵn trong bảng thì bạn có thể sử dụng cú pháp sau đây.

SELECT * FROM table_name;

Ví dụ

Giả sử bảng CUSTOMERS có các bản ghi sau:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ha Anh   |  32 | Da Nang   |  2000.00 |
|  2 | Van Ha   |  25 | Ha Noi    |  1500.00 |
|  3 | Vu Bang  |  23 | Vinh      |  2000.00 |
|  4 | Thu Minh |  25 | Ha Noi    |  6500.00 |
|  5 | Hai An   |  27 | Ha Noi    |  8500.00 |
|  6 | Hoang    |  22 | Ha Noi    |  4500.00 |
|  7 | Binh     |  24 | Ha Noi    | 10000.00 |
+----+----------+-----+-----------+----------+

Đoạn code sau đây là một ví dụ, lấy các ID, NAME và SALARY của khách hàng có sẵn trong bảng CUSTOMERS.

SELECT ID, NAME, SALARY FROM CUSTOMERS;

Câu lệnh trên sẽ tạo ra kết quả sau:

Câu lệnh SELECT trong MySQL
Nếu bạn muốn lấy ra tất cả các trường của bảng CUSTOMERS, thì bạn nên sử dụng truy vấn sau.

SELECT * FROM CUSTOMERS;

Câu lệnh trên sẽ tạo ra kết quả như dưới đây.

Câu lệnh SELECT trong MySQL

Câu lệnh INSERT trong MySQL

âu lệnh INSERT trong MySQL được sử dụng để chèn dữ liệu vào bảng.

Nội dung chính:

Cú pháp

Cú pháp SQL cơ bản của lệnh INSERT INTO để chèn dữ liệu vào trong bảng MySQL là:

INSERT INTO ten_bang(ten_truong_1, ten_truong_2, ... ten_truong_n)
       VALUES (gia_tri_1, gia_tri_2, ... gia_tri_n);

Bạn có thể không cần phải chỉ rõ tên cột trong truy vấn SQL nếu bạn đang thêm các giá trị cho tất cả các cột của bảng. Nhưng hãy chắc chắn thứ tự của các giá trị theo thứ tự như các cột trong bảng.

Cú pháp như sau:

INSERT INTO ten_bang VALUES (gia_tri_1, gia_tri_2, ... gia_tri_n);

Ví dụ chèn dữ liệu vào bảng trong MySQL

Ví dụ 1 insert dữ liệu vào bảng

Đoạn mã sau đây là một ví dụ, tạo ra một bảng CUSTOMERS với một ID như một khóa chính và NOT NULL là những ràng buộc cho thấy các trường này không thể là NULL trong khi tạo các bản ghi trong bảng này:

CREATE TABLE CUSTOMERS (
   ID   INT              NOT NULL,
   NAME VARCHAR (20)     NOT NULL,
   AGE  INT              NOT NULL,
   ADDRESS  CHAR (25),
   SALARY   DECIMAL (18, 2),
   PRIMARY KEY (ID)
);

Các câu lệnh sau sẽ tạo ra sáu bản ghi trong bảng CUSTOMERS:

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
    VALUES (1, 'Ha Anh', 32, 'Da Nang', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
    VALUES (2, 'Van Ha', 25, 'Ha Noi', 1500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
    VALUES (3, 'Vu Bang', 23, 'Vinh', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
    VALUES (4, 'Thu Minh', 25, 'Ha Noi', 6500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
    VALUES (5, 'Hai An', 27, 'Ha Noi', 8500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
    VALUES (6, 'Hoang', 22, 'Ha Noi', 4500.00 );

Bạn có thể tạo một bản ghi trong bảng CUSTOMERS bằng cách sử dụng cú pháp thứ hai như hình dưới đây.

INSERT INTO CUSTOMERS
    VALUES (7, 'Binh', 24, 'Ha Noi', 10000.00 );

Tất cả các câu lệnh trên sẽ tạo ra các bản ghi sau trong bảng CUSTOMERS như hình dưới đây.

SELECT * FROM nhanvien;

Kết quả:

Câu lệnh SELECT trong MySQL

Ví dụ 2 insert dữ liệu vào bảng với trường primary key tự động tăng

Sử dụng câu lệnh tạo bảng trong MySQL:

CREATE TABLE nhanvien (
    manv INT NOT NULL AUTO_INCREMENT,
    hoten VARCHAR(50) NOT NULL,
    ngaysinh DATETIME NULL,
    dienthoai VARCHAR(11) NULL,
    hsluong DECIMAL(3, 2),
    PRIMARY KEY (manv)
);

Dưới đây là ví dụ minh họa việc sử dụng lệnh INSERT INTO để chèn dữ liệu vào trong bảng nhanvien.

INSERT INTO nhanvien (hoten, ngaysinh, dienthoai, hsluong)
       VALUES ('Trịnh Bá Đạo', '1997-10-15 00:00:00', '0989898966', 1.2);
INSERT INTO nhanvien (hoten, ngaysinh, dienthoai, hsluong)
       VALUES ('Phan Văn Vinh', '1990-03-04 00:00:00', '0989898967', 1.8);
INSERT INTO nhanvien (hoten, ngaysinh, dienthoai, hsluong)
       VALUES ('Đào Van Hoa', '1990-03-05 00:00:00', '0989898968', 1.9);

Trong ví dụ trên, mình đã không cung cấp mssv bởi vì tại thời điểm tạo bảng này, mình đã cung cấp tùy chọn AUTO_INCREMENT cho trường này. Vì thế, MySQL sẽ xử lý việc chèn các mssv của nó một cách tự động.

Sử dụng câu lệnh SELECT để xem dữ liệu của bảng nhanvien:

SELECT * FROM nhanvien;

Kết quả:

Câu lệnh INSERT trong MySQL

Câu lệnh UPDATE trong SQL

Câu lệnh UPDATE trong SQL được sử dụng để sửa đổi các bản ghi hiện có trong một bảng. Bạn có thể sử dụng mệnh đề WHERE với truy vấn UPDATE để cập nhật các bản ghi đã chọn, nếu không tất cả các bản ghi sẽ bị ảnh hưởng.

Cú pháp

Cú pháp cơ bản của truy vấn UPDATE với mệnh đề WHERE như sau:

UPDATE table_name
SET column1 = value1, column2 = value2...., columnN = valueN
WHERE [condition];

Bạn có thể kết hợp N số điều kiện bằng toán tử AND hoặc OR.


Ví dụ

Giả sử bảng CUSTOMERS có các bản ghi sau đây:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ha Anh   |  32 | Da Nang   |  2000.00 |
|  2 | Van Ha   |  25 | Ha Noi    |  1500.00 |
|  3 | Vu Bang  |  23 | Vinh      |  2000.00 |
|  4 | Thu Minh |  25 | Ha Noi    |  6500.00 |
|  5 | Hai An   |  27 | Ha Noi    |  8500.00 |
|  6 | Hoang    |  22 | Ha Noi    |  4500.00 |
|  7 | Binh     |  24 | Ha Noi    | 10000.00 |
+----+----------+-----+-----------+----------+

Truy vấn sau sẽ cập nhật ADDRESS cho một khách hàng có số ID là 6 trong bảng.

UPDATE CUSTOMERS
SET ADDRESS = 'Vinh Phuc'
WHERE ID = 6;

Bây giờ, bảng CUSTOMERS sẽ có các bản ghi sau đây:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ha Anh   |  32 | Da Nang   |  2000.00 |
|  2 | Van Ha   |  25 | Ha Noi    |  1500.00 |
|  3 | Vu Bang  |  23 | Vinh      |  2000.00 |
|  4 | Thu Minh |  25 | Ha Noi    |  6500.00 |
|  5 | Hai An   |  27 | Ha Noi    |  8500.00 |
|  6 | Hoang    |  22 | Vinh Phuc |  4500.00 |
|  7 | Binh     |  24 | Ha Noi    | 10000.00 |
+----+----------+-----+-----------+----------+

 

Truy vấn sau sẽ cập nhật ADDRESS cho một khách hàng có số ID là 6 trong bảng.

UPDATE CUSTOMERS
SET ADDRESS = 'Vinh Phuc'
WHERE ID = 6;

Bây giờ, bảng CUSTOMERS sẽ có các bản ghi sau đây:

Câu lệnh UPDATE trong MySQL

Nếu muốn sửa đổi tất cả các giá trị ADDRESS và SALARY trong bảng CUSTOMERS, bạn không cần phải sử dụng mệnh đề WHERE vì chỉ cần câu lệnh UPDATE là đủ như thể hiện trong câu lệnh sau đây.

UPDATE CUSTOMERS
SET ADDRESS = 'Ha Noi', SALARY = 1000.00;

Bây giờ, bảng CUSTOMERS sẽ có các bản ghi sau đây:

Câu lệnh UPDATE trong MySQL

Câu lệnh DELETE trong SQL

Câu lệnh DELETE trong SQL được sử dụng để xóa các bản ghi hiện có từ một bảng.

Bạn có thể sử dụng mệnh đề WHERE với truy vấn DELETE để xóa các hàng đã chọn, nếu không tất cả các bản ghi sẽ bị xóa.

Cú pháp

Cú pháp cơ bản của truy vấn DELETE với mệnh đề WHERE như sau:

DELETE FROM table_name
WHERE [condition];

Bạn có thể kết hợp N điều kiện bằng cách sử dụng các toán tử AND và OR.
 


Ví dụ

Hãy xem xét bảng CUSTOMERS có các bản ghi sau đây:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ha Anh   |  32 | Da Nang   |  2000.00 |
|  2 | Van Ha   |  25 | Ha Noi    |  1500.00 |
|  3 | Vu Bang  |  23 | Vinh      |  2000.00 |
|  4 | Thu Minh |  25 | Ha Noi    |  6500.00 |
|  5 | Hai An   |  27 | Ha Noi    |  8500.00 |
|  6 | Hoang    |  22 | Ha Noi    |  4500.00 |
|  7 | Binh     |  24 | Ha Noi    | 10000.00 |
+----+----------+-----+-----------+----------+

Câu lệnh trong ví dụ sau sẽ xóa một khách hàng có ID là 6.

DELETE FROM CUSTOMERS
WHERE ID = 6;

Bây giờ, bảng CUSTOMERS sẽ có các bản ghi sau đây.

Câu lệnh DELETE trong MySQL

Nếu bạn muốn DELETE tất cả các bản ghi từ bảng CUSTOMERS, bạn không cần phải sử dụng mệnh đề WHERE và truy vấn DELETE sẽ như sau:

DELETE FROM CUSTOMERS;

Bây giờ, bảng CUSTOMERS sẽ không có bất kỳ bản ghi nào.

Câu lệnh DELETE trong MySQL

Truy xuất dữ liệu dựa theo điều kiện trong MySQL

Chúng ta có thể sử dụng một mệnh đề điều kiện gọi là mệnh đề WHERE để lọc các kết quả thu được. Sử dụng mệnh đề WHERE, chúng ta có thể xác định một tiêu chuẩn lựa chọn để chọn các bản ghi cần thiết từ một bảng.

Cú pháp

Cú pháp SQL chung của lệnh SELECT với mệnh đề WHERE để lấy dữ liệu từ bảng MySQL là:

SELECT *
FROM name_table
WHERE name_column operator value_column;
Giải thích: Cú pháp trên truy xuất tất cả dữ liệu của các cột trong bảng có tên là name_table với điều kiện là giá trị của cột name_column phải đúng với value_column dựa theo điều kiện so sánh operator.

Các điều kiện so sánh operator

Dưới đây là danh sách các điều kiện so sánh operator

= So sánh hai giá trị bằng nhau
<> So sánh hai giá trị khác nhau
!= So sánh hai giá trị khác nhau
> Giá trị bên trái lớn hơn giá trị bên phải
< Giá trị bên trái nhỏ hơn giá trị bên phải
>= Giá trị bên trái lớn hơn hoặc bằng giá trị bên phải
<= Giá trị bên trái nhỏ hơn hoặc bằng giá trị bên phải
BETWEEN Giá trị nằm trong một khoảng nào đó (Sẽ nói rõ trong những bài hướng dẫn tiếp theo) 
LIKE Dùng trong tìm kiếm chuỗi ký tự (Sẽ nói rõ trong những bài hướng dẫn tiếp theo) 
IN Giá trị là một trong số các giá trị được nêu (Sẽ nói rõ trong những bài hướng dẫn tiếp theo)

Một số ví dụ

Chúng ta có một bảng sinh_vien như sau:

Full_name Gender Age City
Nguyen Thanh Nhan Nam 19 Can Tho
Pham Thu Huong Nu 20 Vinh Long
Nguyen Nhu Ngoc Nu 20 Soc Trang
Bui Thanh Bao Nam 19 Soc Trang
Le My Nhan Nu 22 Can Tho
Tan Thuc Bao Nam 35 An Giang
Trinh Giao Kim Nam 44 Bac Lieu

Ví dụ 1 Truy xuất những sinh viên có giới tính là Nam

SELECT *
FROM sinh_vien
WHERE Gender = "Nam";

Sau khi thực thi, MySQl trả về một bảng kết quả như dưới đây

Full_name Gender Age City
Nguyen Thanh Nhan Nam 19 Can Tho
Bui Thanh Bao Nam 19 Soc Trang
Tan Thuc Bao Nam 35 An Giang
Trinh Giao Kim Nam 44 Bac Lieu

Ví dụ 2

Truy xuất những sinh viên có tuổi lớn hơn hoặc bằng 22

SELECT *
FROM sinh_vien
WHERE Age >= 22;

Sau khi thực thi, MySQl trả về một bảng kết quả như dưới đây

Full_name Gender Age City
Le My Nhan Nu 22 Can Tho
Tan Thuc Bao Nam 35 An Giang
Trinh Giao Kim Nam 44 Bac Lieu

Ví dụ 3

Truy xuất họ tên và tỉnh thành của những sinh viên có tuổi nhỏ hơn 22

SELECT Full_name, City
FROM sinh_vien
WHERE Age < 22;

Sau khi thực thi, MySQl trả về một bảng kết quả như dưới đây

Full_name City
Nguyen Thanh Nhan Can Tho
Pham Thu Huong Vinh Long
Nguyen Nhu Ngoc Soc Trang
Bui Thanh Bao Soc Trang

Ví dụ 4

Truy xuất giới tính của sinh viên có họ tên là "Le My Nhan"

SELECT Gender
FROM sinh_vien
WHERE Full_name = "Le My Nhan";

Sau khi thực thi, MySQl trả về một bảng kết quả như dưới đây

Gender
Nu

Câu lệnh SELECT DISTINCT trong SQL

Trong MySQL câu lệnh SELECT DISTINCT trong SQL được sử dụng kết hợp với câu lệnh SELECT để loại bỏ tất cả các bản ghi trùng lặp và chỉ lấy các bản ghi duy nhất.

Có thể có tình huống khi bạn có nhiều bản ghi trùng lặp trong một bảng. Trong khi lấy ra bản ghi như vậy, chỉ cần lấy ra những bản ghi duy nhất đó thay vì lấy các bản ghi trùng lặp.

Cú pháp

Cú pháp cơ bản của từ khoá DISTINCT để loại bỏ các bản ghi trùng lặp như sau:

SELECT DISTINCT column1, column2,.....columnN 
FROM table_name
WHERE [condition]

Ví dụ

Giả sử bảng CUSTOMERS có các bản ghi sau đây:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ha Anh   |  32 | Da Nang   |  2000.00 |
|  2 | Van Ha   |  25 | Ha Noi    |  1500.00 |
|  3 | Vu Bang  |  23 | Vinh      |  2000.00 |
|  4 | Thu Minh |  25 | Ha Noi    |  6500.00 |
|  5 | Hai An   |  27 | Ha Noi    |  8500.00 |
|  6 | Hoang    |  22 | Ha Noi    |  4500.00 |
|  7 | Binh     |  24 | Ha Noi    | 10000.00 |
+----+----------+-----+-----------+----------+

Trước tiên, chúng ta hãy xem câu truy vấn SELECT sau đây trả về bản ghi mức lương trùng lặp như thế nào.

SELECT SALARY FROM CUSTOMERS
   ORDER BY SALARY;

Điều này sẽ tạo ra kết quả sau, trong đó mức lương (2000) sắp tới hai lần là bản ghi trùng lặp từ bảng ban đầu.

+----------+
| SALARY   |
+----------+
|  1500.00 |
|  2000.00 |
|  2000.00 |
|  4500.00 |
|  6500.00 |
|  8500.00 |
| 10000.00 |
+----------+

Bây giờ, hãy sử dụng từ khóa DISTINCT với truy vấn SELECT ở trên và sau đó xem kết quả

SELECT DISTINCT SALARY FROM CUSTOMERS
ORDER BY SALARY;

Điều này sẽ tạo ra kết quả sau khi chúng tôi không có mục nhập trùng lặp.

+----------+
| SALARY   |
+----------+
|  1500.00 |
|  2000.00 |
|  4500.00 |
|  6500.00 |
|  8500.00 |
| 10000.00 |
+----------+

 

Mệnh đề ORDER BY

Trong MySQL mệnh đề ORDER BY trong SQL được sử dụng để sắp xếp dữ liệu theo thứ tự tăng dần hoặc giảm dần, dựa trên một hoặc nhiều cột. Một số cơ sở dữ liệu sắp xếp các kết quả truy vấn theo thứ tự tăng dần theo mặc định. Lệnh ASC được sử dụng để sắp xếp tăng dần và DESC được sử dụng để sắp xếp giảm dần.

Cú pháp

Cú pháp cơ bản của mệnh đề ORDER BY như sau:

SELECT column-list 
FROM table_name 
[WHERE condition] 
[ORDER BY column1, column2, .. columnN] [ASC | DESC];

Bạn có thể sử dụng nhiều hơn một cột trong mệnh đề ORDER BY. Đảm bảo rằng bất kỳ cột bạn đang sử dụng để sắp xếp cột đó phải nằm trong danh sách cột.

Trong đó:

  • Thứ tự kết quả được sắp xếp dựa theo cột tên column.
  • ASC là sắp xếp danh sách kết quả theo thứ tự tăng dần. 
  • DESC là sắp xếp danh sách kết quả theo thứ tự giảm dần.
  • Nếu ASC|DESC bị bỏ trống, thì mặc định nó có nghĩa là ASC.

Ví dụ

Giả sử bảng CUSTOMERS có các bản ghi sau đây:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ha Anh   |  32 | Da Nang   |  2000.00 |
|  2 | Van Ha   |  25 | Ha Noi    |  1500.00 |
|  3 | Vu Bang  |  23 | Vinh      |  2000.00 |
|  4 | Thu Minh |  25 | Ha Noi    |  6500.00 |
|  5 | Hai An   |  27 | Ha Noi    |  8500.00 |
|  6 | Hoang    |  22 | Ha Noi    |  4500.00 |
|  7 | Binh     |  24 | Ha Noi    | 10000.00 |
+----+----------+-----+-----------+----------+

Khối lệnh sau đây sẽ sắp xếp kết quả theo thứ tự tăng dần bởi các trường NAME và SALARY:

SELECT * FROM CUSTOMERS
   ORDER BY NAME, SALARY;

Kết quả:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  7 | Binh     |  24 | Ha Noi    | 10000.00 |
|  1 | Ha Anh   |  32 | Da Nang   |  2000.00 |
|  5 | Hai An   |  27 | Ha Noi    |  8500.00 |
|  6 | Hoang    |  22 | Ha Noi    |  4500.00 |
|  4 | Thu Minh |  25 | Ha Noi    |  6500.00 |
|  2 | Van Ha   |  25 | Ha Noi    |  1500.00 |
|  3 | Vu Bang  |  23 | Vinh      |  2000.00 |
+----+----------+-----+-----------+----------+

Khối lệnh sau sẽ sắp xếp kết quả theo thứ tự giảm dần bởi trường NAME.

SELECT * FROM CUSTOMERS
   ORDER BY NAME DESC;

Kết quả:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  3 | Vu Bang  |  23 | Vinh      |  2000.00 |
|  2 | Van Ha   |  25 | Ha Noi    |  1500.00 |
|  4 | Thu Minh |  25 | Ha Noi    |  6500.00 |
|  6 | Hoang    |  22 | Ha Noi    |  4500.00 |
|  5 | Hai An   |  27 | Ha Noi    |  8500.00 |
|  1 | Ha Anh   |  32 | Da Nang   |  2000.00 |
|  7 | Binh     |  24 | Ha Noi    | 10000.00 |
+----+----------+-----+-----------+----------+

Để sắp xếp các hàng với thứ tự ưu tiên của riêng mình, khối lệnh sau sắp xếp kết quả theo thứ tự tăng dần của trường ADDRESS và theo thứ tự giảm dần của trường SALARY.

SELECT * FROM CUSTOMERS
   ORDER BY (CASE ADDRESS
   WHEN 'Ha Noi'   THEN 1
   WHEN 'Da Nang'   THEN 2
   ELSE 10 END) ASC, ADDRESS DESC;

Kết quả:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  2 | Van Ha   |  25 | Ha Noi    |  1500.00 |
|  4 | Thu Minh |  25 | Ha Noi    |  6500.00 |
|  5 | Hai An   |  27 | Ha Noi    |  8500.00 |
|  6 | Hoang    |  22 | Ha Noi    |  4500.00 |
|  7 | Binh     |  24 | Ha Noi    | 10000.00 |
|  1 | Ha Anh   |  32 | Da Nang   |  2000.00 |
|  3 | Vu Bang  |  23 | Vinh      |  2000.00 |
+----+----------+-----+-----------+----------+

Kết quả cho thấy các bản ghi được sắp xếp theo thứ tự tăng dần của trường ADDRESS sau đó mới đến thứ giảm dần của trường SALARY.

Mệnh đề GROUP BY trong SQL

Mệnh đề GROUP BY trong SQL được sử dụng hợp tác với câu lệnh SELECT để sắp xếp dữ liệu giống nhau thành các nhóm. Mệnh đề GROUP BY này tuân theo mệnh đề WHERE trong câu lệnh SELECT và đứng trước mệnh đề ORDER BY.

Cú pháp

Cú pháp cơ bản của mệnh đề GROUP BY được hiển thị trong khối mã sau. Mệnh đề GROUP BY trong SQL phải tuân theo các điều kiện trong mệnh đề WHERE và phải đứng trước mệnh đề ORDER BY nếu mệnh đề được sử dụng.

SELECT column1, column2
FROM table_name
WHERE [ conditions ]
GROUP BY column1, column2
ORDER BY column1, column2

Ví dụ

Giả sử bảng CUSTOMERS có các bản ghi sau đây:

Output:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ha Anh   |  32 | Da Nang   |  2000.00 |
|  2 | Van Ha   |  25 | Ha Noi    |  1500.00 |
|  3 | Vu Bang  |  23 | Vinh      |  2000.00 |
|  4 | Thu Minh |  25 | Ha Noi    |  6500.00 |
|  5 | Hai An   |  27 | Ha Noi    |  8500.00 |
|  6 | Hoang    |  22 | Ha Noi    |  4500.00 |
|  7 | Binh     |  24 | Ha Noi    | 10000.00 |
+----+----------+-----+-----------+----------+

Nếu bạn muốn biết tổng số tiền lương của mỗi khách hàng, thì truy vấn GROUP BY sẽ như sau.

SELECT NAME, SUM(SALARY) FROM CUSTOMERS
   GROUP BY NAME;

Điều này sẽ tạo ra kết quả sau:

+----------+-------------+
| NAME     | SUM(SALARY) |
+----------+-------------+
| Binh     |    10000.00 |
| Ha Anh   |     2000.00 |
| Hai An   |     8500.00 |
| Hoang    |     4500.00 |
| Thu Minh |     6500.00 |
| Van Ha   |     1500.00 |
| Vu Bang  |     2000.00 |
+----------+-------------+

Bây giờ, chúng ta hãy nhìn vào một bảng nơi bảng CUSTOMERS có các bản ghi sau với tên trùng lặp:
 

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ha Anh   |  32 | Ha Noi    |  2000.00 |
|  2 | Ha Anh   |  25 | Ha Noi    |  1500.00 |
|  3 | Vu Bang  |  23 | Vinh      |  2000.00 |
|  4 | Thu Minh |  25 | Ha Noi    |  6500.00 |
|  5 | Hai An   |  27 | Ha Noi    |  8500.00 |
|  6 | Hai An   |  22 | Ha Noi    |  4500.00 |
|  7 | Hai An   |  24 | Ha Noi    | 10000.00 |
+----+----------+-----+-----------+----------+

Bây giờ một lần nữa, nếu bạn muốn biết tổng số tiền lương trên mỗi khách hàng, sau đó truy vấn GROUP BY sẽ như sau:

SELECT NAME, SUM(SALARY) FROM CUSTOMERS
   GROUP BY NAME;

Điều này sẽ tạo ra kết quả sau:

+----------+-------------+
| NAME     | SUM(SALARY) |
+----------+-------------+
| Ha Anh   |     3500.00 |
| Hai An   |    23000.00 |
| Thu Minh |     4500.00 |
| Vu Bang  |     2000.00 |
+----------+-------------+

 

Mệnh đề HAVING trong SQL

Trong MySQL mệnh đề HAVING trong SQL cho phép bạn chỉ định điều kiện lọc mà kết quả nhóm xuất hiện trong kết quả.

Mệnh đề WHERE đặt các điều kiện vào các cột đã chọn, trong khi mệnh đề HAVING đặt các điều kiện vào các nhóm được tạo bởi mệnh đề GROUP BY.

Cú pháp

Các Mã lệnh sau đây cho thấy vị trí của khoản HAVING trong một truy vấn.

FROM
WHERE
GROUP BY
HAVING
ORDER BY

Mệnh đề HAVING phải tuân theo mệnh đề GROUP BY trong truy vấn và cũng phải trước mệnh đề ORDER BY nếu sử dụng. Mã lệnh sau đây có cú pháp của câu lệnh SELECT bao gồm mệnh đề HAVING:

SELECT column1, column2
FROM table1, table2
WHERE [ conditions ]
GROUP BY column1, column2
HAVING [ conditions ]
ORDER BY column1, column2

Ví dụ

Giả sử bảng CUSTOMERS có các bản ghi sau.

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ha Anh   |  32 | Da Nang   |  2000.00 |
|  2 | Van Ha   |  25 | Ha Noi    |  1500.00 |
|  3 | Vu Bang  |  23 | Vinh      |  2000.00 |
|  4 | Thu Minh |  25 | Ha Noi    |  6500.00 |
|  5 | Hai An   |  27 | Ha Noi    |  8500.00 |
|  6 | Hoang    |  22 | Ha Noi    |  4500.00 |
|  7 | Binh     |  24 | Ha Noi    | 10000.00 |
+----+----------+-----+-----------+----------+

Sau đây là một ví dụ, sẽ hiển thị một bản ghi cho một độ tuổi tương tự sẽ lớn hơn hoặc bằng 2.

SELECT ID, NAME, AGE, ADDRESS, SALARY
FROM CUSTOMERS
GROUP BY age
HAVING COUNT(age) >= 2;

Điều này sẽ tạo ra kết quả sau:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  2 | Van Ha   |  25 | Ha Noi    |  1500.00 |
+----+----------+-----+-----------+----------+

 

Giới hạn số lượng kết quả trả về trong MySQL

Thông thường khi truy xuất dữ liệu, MySQL sẽ trả về một bảng tất cả các kết quả thỏa điều kiện.

Tuy nhiên, sẽ có lúc bạn không muốn lấy hết tất cả, bạn chỉ muốn lấy một số lượng nào đó (Ví dụ như muốn lấy 5 kết quả). Khi đó, từ khóa LIMIT sẽ giúp bạn giải quyết vấn đề này.

Cú pháp giới hạn số lượng kết quả trả về 

SELECT *
FROM name_table
LIMIT num_ber;

Trong đó:

  • name_table là tên bảng mà bạn muốn lấy dữ liệu.
  • num_ber là số lượng kết quả mà bạn muốn lấy.

Một số ví dụ

Chúng ta có một bảng sinh_vien như sau:

Full_name Gender Age City
Nguyen Thanh Nhan Nam 19 Can Tho
Pham Thu Huong Nu 20 Vinh Long
Nguyen Nhu Ngoc Nu 20 Soc Trang
Bui Thanh Bao Nam 19 Soc Trang
Le My Nhan Nu 22 Can Tho
Tan Thuc Bao Nam 35 An Giang
Trinh Giao Kim Nam 44 Bac Lieu

Ví dụ 1

Từ danh sách sinh viên, lấy ra 3 sinh viên

SELECT *
FROM sinh_vien
LIMIT 3;

Sau khi thực thi, MySQl trả về một bảng kết quả như dưới đây:

Full_name Gender Age City
Nguyen Thanh Nhan Nam 19 Can Tho
Pham Thu Huong Nu 20 Vinh Long
Nguyen Nhu Ngoc Nu 20 Soc Trang

Ví dụ 2 (nâng cao)

Từ danh sách sinh viên, lấy ra 3 sinh viên có giới tính Nam và tuổi lớn nhất

SELECT *
FROM sinh_vien
WHERE Gender = 'Nam'
ORDER BY Age DESC
LIMIT 3;

Sau khi thực thi, MySQl trả về một bảng kết quả như dưới đây:

Full_name Gender Age City
Trinh Giao Kim Nam 44 Bac Lieu
Tan Thuc Bao Nam 35 An Giang
Nguyen Thanh Nhan Nam 19 Can Tho

Ví dụ 3 (nâng cao)

Từ danh sách sinh viên, lấy ra HỌ TÊN & THÀNH PHỐ của 2 sinh viên Nam có tuổi nhỏ nhất.

SELECT Full_name, City
FROM sinh_vien
WHERE Gender = 'Nam'
ORDER BY Age ASC
LIMIT 2;

Sau khi thực thi, MySQl trả về một bảng kết quả như dưới đây:

Full_name City
Nguyen Thanh Nhan Can Tho
Bui Thanh Bao Soc Trang

Toán tử AND trong SQL

Toán tử AND  trong MySQL được sử dụng để kết hợp nhiều điều kiện để thu hẹp dữ liệu trong một câu lệnh SQL. Toán tử này được gọi là toán tử liên hợp.

Toán tử này cung cấp phương tiện để so sánh với các toán tử khác nhau trong cùng một câu lệnh SQL.

Cú pháp

Cú pháp cơ bản của toán tử AND với một mệnh đề WHERE như sau:

SELECT column1, column2, columnN 
FROM table_name
WHERE [condition1] AND [condition2]...AND [conditionN];

Bạn có thể kết hợp N điều kiện bằng toán tử AND. Đối với một hành động được thực hiện bởi các câu lệnh SQL, cho dù đó là một transaction hoặc một truy vấn, tất cả các điều kiện AND và phải là TRUE.

Ví dụ

Giả sử bảng CUSTOMERS có các bản ghi sau đây:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ha Anh   |  32 | Da Nang   |  2000.00 |
|  2 | Van Ha   |  25 | Ha Noi    |  1500.00 |
|  3 | Vu Bang  |  23 | Vinh      |  2000.00 |
|  4 | Thu Minh |  25 | Ha Noi    |  6500.00 |
|  5 | Hai An   |  27 | Ha Noi    |  8500.00 |
|  6 | Hoang    |  22 | Ha Noi    |  4500.00 |
|  7 | Binh     |  24 | Ha Noi    | 10000.00 |
+----+----------+-----+-----------+----------+

Sau đây là một ví dụ, lấy ID, NAME và SALARY từ bảng CUSTOMERS, với điều kiện SALARY lớn hơn 2000 và AGE dưới 25 tuổi:

SQL> SELECT ID, NAME, SALARY 
FROM CUSTOMERS
WHERE SALARY > 2000 AND AGE < 25;

Điều này sẽ tạo ra kết quả sau: 


+----+-------+----------+
| ID | NAME  | SALARY   |
+----+-------+----------+
|  6 | Hoang |  4500.00 |
|  7 | Binh  | 10000.00 |
+----+-------+----------+

 

Toán tử OR trong SQL

Toán tử OR được sử dụng để kết hợp nhiều điều kiện trong mệnh đề WHERE của câu lệnh SQL.

Cú pháp

Cú pháp cơ bản của toán tử OR với một mệnh đề WHERE như sau:

SELECT column1, column2, columnN 
FROM table_name
WHERE [condition1] OR [condition2]...OR [conditionN]

Bạn có thể kết hợp N số điều kiện sử dụng toán tử OR. Đối với một hành động được thực hiện bởi các câu lệnh SQL, cho dù đó là một transaction hoặc truy vấn, chỉ có một trong những điều kiện OR phải là TRUE.

Ví dụ

Giả sử bảng CUSTOMERS có các bản ghi sau đây:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ha Anh   |  32 | Da Nang   |  2000.00 |
|  2 | Van Ha   |  25 | Ha Noi    |  1500.00 |
|  3 | Vu Bang  |  23 | Vinh      |  2000.00 |
|  4 | Thu Minh |  25 | Ha Noi    |  6500.00 |
|  5 | Hai An   |  27 | Ha Noi    |  8500.00 |
|  6 | Hoang    |  22 | Ha Noi    |  4500.00 |
|  7 | Binh     |  24 | Ha Noi    | 10000.00 |
+----+----------+-----+-----------+----------+

Đoạn mã hasa truy vấn sau, sẽ lấy các ID, NAME và Lương từ bảng SALARY, với điều kiện SALARY lớn hơn 2000 và AGE dưới 25.

SQL> SELECT ID, NAME, SALARY 
FROM CUSTOMERS
WHERE SALARY > 2000 OR age < 25;

Điều này sẽ tạo ra kết quả sau:

+----+----------+----------+
| ID | NAME     | SALARY   |
+----+----------+----------+
|  3 | Vu Bang  |  2000.00 |
|  4 | Thu Minh |  6500.00 |
|  5 | Hai An   |  8500.00 |
|  6 | Hoang    |  4500.00 |
|  7 | Binh     | 10000.00 |
+----+----------+----------+

 

Kết hợp hai toán tử AND và OR

Trong MySQL, bạn có thể sử dụng cả hai điều kiện AND & OR cùng với câu lệnh SELECT, INSERT, UPDATE và DELETE. Trong khi kết hợp các điều kiện này, bạn phải biết nơi sử dụng dấu ngoặc tròn để cơ sở dữ liệu biết thứ tự để đánh giá từng điều kiện.

Cú pháp

WHERE condition1  
AND condition2  
...  
OR condition_n;  

Tham số
condition1, condition2, ... condition_n: là các điều kiện

Ví dụ

Truy xuất họ tên của những sinh viên nam sống ở Can Tho hoặc sinh viên nữ sống ở Soc Trang

Ở bài học trước chúng ta có một bảng sinh_vien như sau:

Full_name Gender Age City
Nguyen Thanh Nhan Nam 19 Can Tho
Pham Thu Huong Nu 20 Vinh Long
Nguyen Nhu Ngoc Nu 20 Soc Trang
Bui Thanh Bao Nam 19 Soc Trang
Le My Nhan Nu 22 Can Tho
Tan Thuc Bao Nam 35 An Giang
Trinh Giao Kim Nam 44 Bac Lieu

 

SELECT Full_name
FROM sinh_vien
WHERE (Gender="Nam" AND City="Can Tho") OR (Gender="Nu" AND City="Soc Trang");

 

Sau khi thực thi, MySQl trả về một bảng kết quả như dưới đây:

Full_name
Nguyen Thanh Nhan
Nguyen Nhu Ngoc

Truy xuất dữ liệu dựa theo chuỗi trong MySQL

Toán tử LIKE trong MySQL được sử dụng để so sánh một giá trị với các giá trị tương tự sử dụng toán tử ký tự đại diện (wildcard). Có hai ký tự đại diện được sử dụng kết hợp với toán tử LIKE.

  • Phần trăm (%)
  • Dấu gạch dưới (_)

Dấu phần trăm thể hiện không, một hoặc nhiều ký tự. Dấu gạch dưới đại diện cho một số hoặc một ký tự. Những ký hiệu này có thể được sử dụng trong sự kết hợp.

Cú pháp

Cú pháp cơ bản của ‘%’ và ‘_’ là như sau:

Cú pháp

SELECT *
FROM name_table
WHERE name_column LIKE chuỗi_muốn_tìm;

Ví dụ

Chúng ta có một bảng sinh_vien như sau:

Full_name Gender Age City
Nguyen Thanh Nhan Nam 19 Can Tho
Pham Thu Huong Nu 20 Vinh Long
Nguyen Nhu Ngoc Nu 20 Soc Trang
Bui Thanh Bao Nam 19 Soc Trang
Le My Nhan Nu 22 Can Tho
Tan Thuc Bao Nam 35 An Giang
Trinh Giao Kim Nam 44 Bac Lieu

Ví dụ

Truy xuất những sinh viên có họ tên là "Tan Thuc Bao"

SELECT *
FROM sinh_vien
WHERE Full_name LIKE "Tan Thuc Bao";

Sau khi thực thi, MySQl trả về một bảng kết quả như dưới đây:

Full_name Gender Age City
Tan Thuc Bao Nam 35 An Giang

Các ký tự đại diện trong quy tắc tìm kiếm chuỗi

Ký tự đại diện được dùng để đại diện cho một hoặc nhiều ký tự trong một chuỗi.

Dưới đây là danh sách các ký tự đại diện:

Ký tự đại diện Mô tả
% Đại diện cho không hoặc nhiều ký tự
_ Đại kiện cho một ký tự

Một số ví dụ

Chúng ta tiếp tục sử dụng bảng sinh_vien ở phía trên để làm ví dụ.

Ví dụ 1

Truy xuất những sinh viên mà họ tên bắt đầu bằng chữ "Nguyen"

SELECT *
FROM sinh_vien
WHERE Full_name LIKE "Nguyen%";

Sau khi thực thi, MySQl trả về một bảng kết quả như dưới đây:

Full_name Gender Age City
Nguyen Thanh Nhan Nam 19 Can Tho
Nguyen Nhu Ngoc Nu 20 Soc Trang

Ví dụ 2

Truy xuất những sinh viên mà họ tên kết thúc bằng chữ "Bao" hoặc "Huong"

SELECT *
FROM sinh_vien
WHERE (Full_name LIKE "%Bao") OR (Full_name LIKE "%Huong");

Sau khi thực thi, MySQl trả về một bảng kết quả như dưới đây:

Full_name Gender Age City
Pham Thu Huong Nu 20 Vinh Long
Bui Thanh Bao Nam 19 Soc Trang
Tan Thuc Bao Nam 35 An Giang

Ví dụ 3

Truy xuất những sinh viên mà họ tên có chứa chữ "Thanh"

SELECT *
FROM sinh_vien
WHERE Full_name LIKE "%Thanh%";

Sau khi thực thi, MySQl trả về một bảng kết quả như dưới đây:

Full_name Gender Age City
Nguyen Thanh Nhan Nam 19 Can Tho
Bui Thanh Bao Nam 19 Soc Trang

Ví dụ 4

Truy xuất những sinh viên mà trong họ tên có chứa ít nhất 2 chữ T

SELECT *
FROM sinh_vien
WHERE Full_name LIKE "%T%T%";

Sau khi thực thi, MySQl trả về một bảng kết quả như dưới đây:

Full_name Gender Age City
Tan Thuc Bao Nam 35 An Giang

Ví dụ 5

Truy xuất những sinh viên mà ký tự thứ 2 trong họ tên là "e"

SELECT *
FROM sinh_vien
WHERE Full_name LIKE "_e%";

Sau khi thực thi, MySQl trả về một bảng kết quả như dưới đây:

Full_name Gender Age City
Le My Nhan Nu 22 Can Tho

Ví dụ 6

Truy xuất những sinh viên mà 3 ký tự ở vị trí 345 trong họ tên là "inh" hoặc 2 ký tự gần ký tự cuối là "go"

SELECT *
FROM sinh_vien
WHERE (Full_name LIKE "__inh%") OR (Full_name LIKE "%go_");

Sau khi thực thi, MySQl trả về một bảng kết quả như dưới đây:

Full_name Gender Age City
Nguyen Nhu Ngoc Nu 20 Soc Trang
Trinh Giao Kim Nam 44 Bac Lieu

Từ khóa NOT LIKE

Cách sử dụng từ khóa NOT LIKE với các ký tự đại diện cũng giống như cách sử dụng từ khóa LIKE.

Tuy nhiên về mặt ý nghĩa thì từ khóa NOT LIKE trái ngược với từ khóa LIKE.

Từ khóa NOT LIKE có nghĩa là KHÔNG GIỐNG VỚI CHUỖI MUỐN TÌM.

Ví dụ

Truy xuất những sinh viên mà họ tên không có chứa chữ "Thanh"

SELECT *
FROM sinh_vien
WHERE Full_name NOT LIKE "%Thanh%";

Sau khi thực thi, MySQl trả về một bảng kết quả như dưới đây:

Full_name Gender Age City
Pham Thu Huong Nu 20 Vinh Long
Nguyen Nhu Ngoc Nu 20 Soc Trang
Le My Nhan Nu 22 Can Tho
Tan Thuc Bao Nam 35 An Giang
Trinh Giao Kim Nam 44 Bac Lieu

Truy xuất dữ liệu khi thỏa một trong số các giá trị

Từ khóa IN dùng để truy xuất dữ liệu khi giá trị của dữ liệu là một trong số các giá trị được nêu.

Cú pháp

Từ khóa IN cho phép bạn xác định nhiều giá trị trong một mệnh đề WHERE.

SELECT *
FROM name_table
WHERE name_column IN (value1, value2, value3);

Một số ví dụ

Chúng ta có một bảng sinh_vien như sau:

Full_name Gender Age City
Nguyen Thanh Nhan Nam 19 Can Tho
Pham Thu Huong Nu 20 Vinh Long
Nguyen Nhu Ngoc Nu 20 Soc Trang
Bui Thanh Bao Nam 19 Soc Trang
Le My Nhan Nu 22 Can Tho
Tan Thuc Bao Nam 35 An Giang
Trinh Giao Kim Nam 44 Bac Lieu

Ví dụ 1

Truy xuất những sinh viên có tuổi là 19, 22, 35

SELECT *
FROM sinh_vien
WHERE Age IN (19, 22, 35);

Sau khi thực thi, MySQl trả về một bảng kết quả như dưới đây:

Full_name Gender Age City
Nguyen Thanh Nhan Nam 19 Can Tho
Bui Thanh Bao Nam 19 Soc Trang
Le My Nhan Nu 22 Can Tho
Tan Thuc Bao Nam 35 An Giang

Ví dụ 2

Lấy họ tên và tỉnh thành của những sinh viên có tuổi KHÔNG là 19, 22

SELECT Full_name, City
FROM sinh_vien
WHERE Age NOT IN (19, 22);

Lưu ý: NOT IN có nghĩa là KHÔNG nằm trong số các giá trị được chỉ định.

Sau khi thực thi, MySQl trả về một bảng kết quả như dưới đây:

Full_name City
Pham Thu Huong Vinh Long
Nguyen Nhu Ngoc Soc Trang
Tan Thuc Bao An Giang
Trinh Giao Kim Bac Lieu

Ví dụ 3 (nâng cao)

Truy xuất họ tên, tuổi, tỉnh thành của những sinh viên có tuổi là 19, 20 và sống ở CanTho, Soc Trang

SELECT Full_name, Age, City
FROM sinh_vien
WHERE (Age IN (19, 20)) AND (City IN ("Can Tho","Soc Trang"));

Sau khi thực thi, MySQl trả về một bảng kết quả như dưới đây:

Full_name Age City
Nguyen Thanh Nhan 19 Can Tho
Nguyen Nhu Ngoc 20 Soc Trang
Bui Thanh Bao 19 Soc Trang

Không cho phép nhận giá trị NULL trong MySQL

NOT NULL được dùng để thiết lập cột không được nhận giá trị NULL.

Đối với cột đã thiết lập NOT NULL, khi INSERT dữ liệu vào bảng thì cột được thiết lập NOT NULL không được nhận giá trị NULL, nếu không khi chạy lệnh sẽ bị lỗi.

Giá trị NULL là gì?

Ví dụ, chúng ta có một bảng sinh_vien, bảng có 4 cột tên là column1, column2, column3, column4.

Thêm một mẫu tin vào bảng bằng câu lệnh sau:

INSERT INTO sinh_vien (column1, column3) VALUES ("abc","def");

Nhận thấy ở câu lệnh trên thiếu tham số column2 và column4, vậy tức là khi mẫu tin được thêm vào bảng thì cột column2 và column4 nhận giá trị NULL

Ví dụ  KHÔNG sử dụng NOT NULL

Dùng câu lệnh bên dưới để tạo bảng sinh_vien

CREATE TABLE sinh_vien(
    Full_name VARCHAR(150),
    Gender VARCHAR(3),
    Age INT(11),
    City VARCHAR(50)
);

Thêm vào bảng bốn mẫu tin

INSERT INTO sinh_vien VALUES ('Nguyen Thanh Nhan', 'Nam', 19, 'Can Tho');
INSERT INTO sinh_vien (Full_name, Gender, Age, City) VALUES ('Pham Thu Huong', 'Nu', 20, 'Vinh Long');
INSERT INTO sinh_vien (Full_name, City) VALUES ('Nguyen Nhu Ngoc', 'Soc Trang');
INSERT INTO sinh_vien (Gender) VALUES ('Nam');

Sau khi thực thi hai câu lệnh trên, chúng ta có một bản sinh_vien như sau:

Full_name Gender Age City
Nguyen Thanh Nhan Nam 19 Can Tho
Pham Thu Huong Nu 20 Vinh Long
Nguyen Nhu Ngoc NULL NULL Soc Trang
NULL Nam NULL NULL

Nhận thấy: Ở câu lệnh INSERT thứ 3 (thiếu 2 tham số Gender, Age), ở câu lệnh INSERT thứ 4 (thiếu 3 tham số Full_name, Age, City). Do đó chúng nhận giá trị NULL.

Đối với cột không thiết lập NOT NULL, khi INSERT dữ liệu vào bảng nếu tham số của cột đó bị bỏ trống thì những cột đó sẽ nhận giá trị NULL

Ví dụ CÓ sử dụng NOT NULL

Dùng câu lệnh bên dưới để tạo bảng sinh_vien

CREATE TABLE sinh_vien(
    Full_name VARCHAR(150) NOT NULL,
    Gender VARCHAR(3) NOT NULL,
    Age INT(11) NOT NULL,
    City VARCHAR(50) NOT NULL
);

Thêm vào bảng bốn mẫu tin

INSERT INTO sinh_vien VALUES ('Nguyen Thanh Nhan', 'Nam', 19, 'Can Tho');
INSERT INTO sinh_vien (Full_name, Gender, Age, City) VALUES ('Pham Thu Huong', 'Nu', 20, 'Vinh Long');
INSERT INTO sinh_vien (Full_name, City) VALUES ('Nguyen Nhu Ngoc', 'Soc Trang');
INSERT INTO sinh_vien (Gender) VALUES ('Nam');

Sau khi thực thi hai câu lệnh trên, chúng ta có một bản sinh_vien như sau:

Full_name Gender Age City
Nguyen Thanh Nhan Nam 19 Can Tho
Pham Thu Huong Nu 20 Vinh Long

Nhận thấy: Câu lệnh 1, 2 được thực thi trước và tham số đầy đủ nên thêm thành công. Còn câu lệnh 3,4 thiếu tham số nên thêm thất bại.

Lưu ý: Ở một số phiên bản MySQL mới. Đối với những cột áp dụng NOT NULL mà khi INSERT bị bỏ trống, thì nó sẽ gán giá trị mặc định cho những cột đó.

Ví dụ (chúng ta sử dụng lại bảng ở Ví dụ về CÓ sử dụng NOT NULL)

Thêm vào bảng hai mẫu tin

INSERT INTO sinh_vien (Full_name, City) VALUES ('Nguyen Nhu Ngoc', 'Soc Trang');
INSERT INTO sinh_vien (Gender) VALUES ('Nam');

Hai mẫu tin mới thêm sẽ trông như thế này

Full_name Gender Age City
Nguyen Nhu Ngoc   0 Soc Trang
  Nam 0  

Truy xuất dữ liệu trong một khoảng giá trị trong MySQL

Từ khóa BETWEEN dùng để truy xuất dữ liệu khi giá trị của dữ liệu nằm trong một khoảng nào đó.

Cú pháp

SELECT *
FROM name_table
WHERE name_column BETWEEN value1 AND value2;

Lưu ý:

  • value 1 phải nhỏ hơn value2.
  • value có thể là ký tự, ngày tháng năm, hoặc số,....

Một số ví dụ

Chúng ta có một bảng sinh_vien như sau:

Full_name Gender Age City
Nguyen Thanh Nhan Nam 19 Can Tho
Pham Thu Huong Nu 20 Vinh Long
Nguyen Nhu Ngoc Nu 20 Soc Trang
Bui Thanh Bao Nam 19 Soc Trang
Le My Nhan Nu 22 Can Tho
Tan Thuc Bao Nam 35 An Giang
Trinh Giao Kim Nam 44 Bac Lieu

Ví dụ 1

Truy xuất những sinh viên có tuổi là từ 19 đến 22

SELECT *
FROM sinh_vien
WHERE Age BETWEEN 19 AND 22;

Sau khi thực thi, MySQl trả về một bảng kết quả như dưới đây:

Full_name Gender Age City
Nguyen Thanh Nhan Nam 19 Can Tho
Pham Thu Huong Nu 20 Vinh Long
Nguyen Nhu Ngoc Nu 20 Soc Trang
Bui Thanh Bao Nam 19 Soc Trang
Le My Nhan Nu 22 Can Tho

Ví dụ 2

Lấy họ tên và tuổi của những sinh viên có độ tuổi KHÔNG THUỘC KHOẢNG  21 đến 36.

SELECT Full_name, Age
FROM sinh_vien
WHERE Age NOT BETWEEN 21 AND 36;

Lưu ý: NOT BETWEEN có nghĩa là không nằm trong khoảng giá trị chỉ định.

Sau khi thực thi, MySQl trả về một bảng kết quả như dưới đây:

Full_name Age
Nguyen Thanh Nhan 19
Pham Thu Huong 20
Nguyen Nhu Ngoc 20
Bui Thanh Bao 19
Trinh Giao Kim 44

Ví dụ 3 (nâng cao)

Lấy họ tên của những sinh viên có tuổi từ 18 đến 21 sống ở Can Tho, Vinh Long

SELECT Full_name
FROM sinh_vien
WHERE (Age BETWEEN 18 AND 21) AND (City IN ("Can Tho","Vinh Long"));

Sau khi thực thi, MySQl trả về một bảng kết quả như dưới đây:

Full_name
Nguyen Thanh Nhan
Pham Thu Huong

Ghép bảng bằng mệnh đề INNER JOIN

Lệnh Inner Join trong MySQL tạo một bảng kết quả mới bằng cách kết hợp các giá trị cột của hai bảng (table1 và table2) dựa trên điều kiện nối. Truy vấn so sánh từng hàng của table1 với từng hàng của table2 để tìm tất cả các cặp hàng thỏa mãn điều kiện nối. Khi điều kiện nối được thỏa mãn, các giá trị cột cho mỗi cặp hàng A và B phù hợp sẽ được kết hợp thành một hàng kết quả.

Cú pháp

SELECT *
FROM table1
INNER JOIN table2
ON table1.column_name=table2.column_name;

Mệnh đề INNER JOIN trong MySQL

Một số ví dụ

Chúng ta có một bảng khachhang (khách hàng) :

ID_khachhang NAME_khachhang
Kh001 Khach Hang 001
Kh002 Khach Hang 002
Kh003 Khach Hang 003
Kh004 Khach Hang 004
Kh005 Khach Hang 005
Kh006 Khach Hang 006
Kh007 Khach Hang 007
Kh008 Khach Hang 008
Kh009 Khach Hang 009

Và một bảng hoadon (hóa đơn) như sau:

ID_hoadon ID_khachhang DATE_hoadon
101 Kh005 2015-03-03
102 Kh008 2015-07-09
103 Kh003 2015-10-12
105 Kh004 2016-05-06
106 Kh008 2016-08-08

Ví dụ

Truy xuất danh sách ID_hoadon và NAME_khachhang (với điều kiện là ID_khachhang phải tồn tại ở 2 bảng)

SELECT hoadon.ID_hoadon, khachhang.NAME_khachhang
FROM hoadon 
INNER JOIN khachhang 
ON hoadon.ID_khachhang=khachhang.ID_khachhang;

Sau khi thực thi, MySQL trả về một bảng kết quả như sau:

ID_hoadon NAME_khachhang
103 Khach hang 003
105 Khach hang 004
101 Khach hang 005
102 Khach hang 008
106 Khach hang 008

Giải thích: Ở hai bảng hoadon & khachhang chỉ có các ID_khachhang (Kh003, Kh004, Kh005, Kh008) là tồn tại ở cả 2 bảng.

Ghép bảng bằng mệnh đề LEFT JOIN

Lệnh Left Join trong SQL trả về tất cả các hàng từ bảng bên trái, ngay cả khi không có kết quả khớp nào trong bảng bên phải. Điều này có nghĩa là nếu mệnh đề ON không khớp với các bản ghi của bảng bên phải. Lệnh Left Join vẫn sẽ trả về một hàng trong kết quả, nhưng với NULL cho mỗi cột của bảng bên phải.


Cú pháp cơ bản của lệnh Left Join trong SQL như sau:

SELECT *
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;

lEFT JOIN trong SQL

Một số ví dụ

Chúng ta có một bảng khachhang (khách hàng) :

ID_khachhang NAME_khachhang
Kh001 Khach Hang 001
Kh002 Khach Hang 002
Kh003 Khach Hang 003
Kh004 Khach Hang 004
Kh005 Khach Hang 005
Kh006 Khach Hang 006
Kh007 Khach Hang 007
Kh008 Khach Hang 008
Kh009 Khach Hang 009

Và một bảng hoadon (hóa đơn) như sau:

ID_hoadon ID_khachhang DATE_hoadon
101 Kh005 2015-03-03
102 Kh008 2015-07-09
103 Kh003 2015-10-12
105 Kh004 2016-05-06
106 Kh008 2016-08-08

Ví dụ

Câu lệnh MySQL dưới đây sẽ trả về danh sách tất cả các khách hàng và những hóa đơn mà họ đã mua.

SELECT khachhang.ID_khachhang, khachhang.NAME_khachhang, hoadon.ID_hoadon, hoadon.DATE_hoadon
FROM khachhang
LEFT JOIN hoadon 
ON hoadon.ID_khachhang=khachhang.ID_khachhang
ORDER BY khachhang.ID_khachhang;

Sau khi thực thi, MySQL trả về một bảng kết quả như sau:

ID_khachhang NAME_khachhang ID_hoadon DATE_hoadon
Kh001 Khach Hang 001 NULL NULL
Kh002 Khach Hang 002 NULL NULL
Kh003 Khach Hang 003 103 2015-10-12
Kh004 Khach Hang 004 105 2016-05-06
Kh005 Khach Hang 005 101 2015-03-03
Kh006 Khach Hang 006 NULL NULL
Kh007 Khach Hang 007 NULL NULL
Kh008 Khach Hang 008 102 2015-07-09
Kh008 Khach Hang 008 106 2016-08-08
Kh009 Khach Hang 009 NULL NULL

Ghép bảng bằng mệnh đề RIGHT JOIN 

Lệnh Right Join trong SQL trả về tất cả các hàng từ bảng bên phải, ngay cả khi không có kết quả khớp nào trong bảng bên trái. Điều này có nghĩa là nếu mệnh đề ON không khớp với các bản ghi của bảng bên trái. Lệnh Left Join vẫn sẽ trả về một hàng trong kết quả, nhưng với NULL cho mỗi cột của bảng bên trái.


Cú pháp cơ bản của lệnh Right Join trong SQL như sau:

SELECT table1.column1, table2.column2...
FROM table1
RIGHT JOIN table2
ON table1.common_field = table2.common_field;

RIGHT JOIN trong SQL


Một số ví dụ

Chúng ta có một bảng khachhang (khách hàng) :

ID_khachhang NAME_khachhang
Kh001 Khach Hang 001
Kh002 Khach Hang 002
Kh003 Khach Hang 003
Kh004 Khach Hang 004
Kh005 Khach Hang 005
Kh006 Khach Hang 006
Kh007 Khach Hang 007
Kh008 Khach Hang 008
Kh009 Khach Hang 009

Và một bảng hoadon (hóa đơn) như sau:

ID_hoadon ID_khachhang DATE_hoadon
101 Kh005 2015-03-03
102 Kh008 2015-07-09
103 Kh003 2015-10-12
105 Kh004 2016-05-06
106 Kh008 2016-08-08

Ví dụ

Câu lệnh MySQL dưới đây sẽ trả về danh sách tất cả các hóa đơn và những khách hàng đã mua chúng.

SELECT hoadon.ID_hoadon, khachhang.ID_khachhang, khachhang.NAME_khachhang, hoadon.DATE_hoadon
FROM khachhang
RIGHT JOIN hoadon 
ON hoadon.ID_khachhang=khachhang.ID_khachhang
ORDER BY hoadon.ID_hoadon;

Sau khi thực thi, MySQL trả về một bảng kết quả như sau:

ID_hoadon ID_khachhang NAME_khachhang DATE_hoadon
101 Kh005 Khach Hang 005 2015-03-03
102 Kh008 Khach Hang 008 2015-07-09
103 Kh003 Khach Hang 003 2015-10-12
105 Kh004 Khach Hang 004 2016-05-06
106 Kh008 Khach Hang 008 2016-08-08

 

Full Join trong MySQL

Lệnh Full Join trong SQL là sự kết hợp các kết quả của cả hai phép nối Left Join và Right Join.

Kết quả join sẽ chứa tất cả các bản ghi từ cả hai bảng và điền vào NULL cho các kết quả bị thiếu ở hai bên.

Cú pháp

SELECT *
FROM table1
FULL JOIN table2;

FULL JOIN trong SQL


Một số ví dụ

Chúng ta có một bảng khachhang (khách hàng) :

ID_khachhang NAME_khachhang
Kh001 Khach Hang 001
Kh002 Khach Hang 002
Kh003 Khach Hang 003
Kh004 Khach Hang 004
Kh005 Khach Hang 005

Và một bảng hoadon (hóa đơn) như sau:

ID_hoadon ID_khachhang DATE_hoadon
101 Kh005 2015-03-03
102 Kh002 2015-07-09
103 Kh003 2015-10-12

Ví dụ

Câu lệnh MySQL dưới đây sẽ trả về một bảng tất cả các hàng được kết hợp từ bảng hoadon & khachhang.

SELECT *
FROM hoadon
FULL JOIN khachhang
ORDER BY ID_hoadon, khachhang.ID_khachhang;

Sau khi thực thi, MySQL trả về một bảng kết quả như sau:

ID_hoadon ID_khachhang DATE_hoadon ID_khachhang NAME_khachhang
101 Khach Hang 005 2015-03-03 Kh001 Khach Hang 001
101 Khach Hang 005 2015-03-03 Kh002 Khach Hang 002
101 Khach Hang 005 2015-03-03 Kh003 Khach Hang 003
101 Khach Hang 005 2015-03-03 Kh004 Khach Hang 004
101 Khach Hang 005 2015-03-03 Kh005 Khach Hang 005
102 Khach Hang 002 2015-07-09 Kh001 Khach Hang 001
102 Khach Hang 002 2015-07-09 Kh002 Khach Hang 002
102 Khach Hang 002 2015-07-09 Kh003 Khach Hang 003
102 Khach Hang 002 2015-07-09 Kh004 Khach Hang 004
102 Khach Hang 002 2015-07-09 Kh005 Khach Hang 005
103 Khach Hang 003 2015-10-12 Kh001 Khach Hang 001
103 Khach Hang 003 2015-10-12 Kh002 Khach Hang 002
103 Khach Hang 003 2015-10-12 Kh003 Khach Hang 003
103 Khach Hang 003 2015-10-12 Kh004 Khach Hang 004
103 Khach Hang 003 2015-10-12 Kh005 Khach Hang 005

AVG() Lấy giá trị trung bình của cột trong MySQL

Hàm AVG() được dùng để lấy giá trị trung bình cộng của một cột.

Cú pháp

SELECT AVG(column_name)
FROM table_name;

Một số ví dụ

Chúng ta có một bảng sinh_vien như sau:

Full_name Gender Age City
Nguyen Thanh Nhan Nam 19 Can Tho
Pham Thu Huong Nu 20 Vinh Long
Nguyen Nhu Ngoc Nu 20 Soc Trang
Bui Thanh Bao Nam 19 Soc Trang
Le My Nhan Nu 22 Can Tho
Tan Thuc Bao Nam 35 An Giang
Trinh Giao Kim Nam 44 Bac Lieu

Ví dụ 1

Lấy tuổi trung bình của các sinh viên trong danh sách

SELECT AVG(Age)
FROM sinh_vien;

Sau khi thực thi, MySQL trả về một bảng kết quả như sau:

AVG(Age)
25.5714

Ví dụ 2

Lấy tuổi trung bình của những sinh viên nữ và đổi tên cột thành Age_tb

SELECT AVG(Age) AS Age_tb
FROM sinh_vien
WHERE Gender = 'Nu';

Sau khi thực thi, MySQL trả về một bảng kết quả như sau:

Age_tb
20.6667

Ví dụ 3

Lấy họ tên & tuổi của những sinh viên có tuổi lớn hơn độ tuổi trung bình của tất cả sinh viên.

SELECT Full_name, Age
FROM sinh_vien
WHERE Age > (SELECT AVG(Age) FROM sinh_vien);

Sau khi thực thi, MySQL trả về một bảng kết quả như sau:

Full_name Age
Tan Thuc Bao 35
Trinh Giao Kim 44

COUNT() Đếm số lượng mẫu tin (dữ liệu, hàng) của bảng trong MySQL

Hàm COUNT() được dùng để đếm số lượng mẫu tin (dữ liệu, hàng) trong bảng.

Cú pháp

SELECT COUNT(*)
FROM table_name;

Một số ví dụ

Chúng ta có một bảng sinh_vien như sau:

Full_name Gender Age City
Nguyen Thanh Nhan Nam 19 Can Tho
Pham Thu Huong Nu 20 Vinh Long
Nguyen Nhu Ngoc Nu 20 Soc Trang
Bui Thanh Bao Nam 19 Soc Trang
Le My Nhan Nu 22 Can Tho
Tan Thuc Bao Nam 35 An Giang
Trinh Giao Kim Nam 44 Bac Lieu

Ví dụ 1

Đếm tổng số lượng sinh viên

SELECT COUNT(*)
FROM sinh_vien;

Sau khi thực thi, MySQL trả về một bảng kết quả như sau:

COUNT(*)
7

Ví dụ 2

Đếm số lượng sinh viên có giới tính là nam. Đặt tên cột của bảng kết quả là so_luong_sinh_vien_nam.

SELECT COUNT(*) AS so_luong_sinh_vien_nam
FROM sinh_vien
WHERE Gender = 'Nam';

Sau khi thực thi, MySQL trả về một bảng kết quả như sau:

so_luong_sinh_vien_nam
4

Ví dụ 3

Đếm số lượng sinh viên có giới tính là nam và tuổi khác nhau.

SELECT COUNT(DISTINCT Age)
FROM sinh_vien
WHERE Gender= 'Nam';

Sau khi thực thi, MySQL trả về một bảng kết quả như sau:

COUNT(DISTINCT Age)
3

Ví dụ 4

Đếm số lượng sinh viên có tuổi là 19, 20, 35. Đặt tên cột cho bảng kết quả là so_luong

SELECT COUNT(*) AS so_luong
FROM sinh_vien
WHERE Age IN (19,20,35);

Sau khi thực thi, MySQL trả về một bảng kết quả như sau:

so_luong
5

Hàm MAX() Lấy giá trị lớn nhất của cột trong MySQL

Hàm MAX() dùng để lấy giá trị lớn nhất trong một cột.

Lưu ý: Giá trị có thể là kiểu số hoặc kiểu chuỗi, ký tự,.... 

Cú pháp

SELECT MAX(name_column)
FROM name_table;

Một số ví dụ

Chúng ta có một bảng sinh_vien như sau:

Full_name Gender Age City
Nguyen Thanh Nhan Nam 19 Can Tho
Pham Thu Huong Nu 20 Vinh Long
Nguyen Nhu Ngoc Nu 20 Soc Trang
Bui Thanh Bao Nam 19 Soc Trang
Le My Nhan Nu 22 Can Tho
Tan Thuc Bao Nam 35 An Giang
Trinh Giao Kim Nam 44 Bac Lieu

Ví dụ 1

Lấy tuổi lớn nhất

SELECT MAX(Age)
FROM sinh_vien;

Sau khi thực thi, MySQL trả về một bảng kết quả như sau:

MAX(Age)
44

Ví dụ 2

Lấy tuổi của sinh viên nữ lớn tuổi nhất. Đặt tên cột trong bảng kết quả là tuoi_lon_nhat

SELECT MAX(Age) AS tuoi_lon_nhat
FROM sinh_vien
WHERE Gender = 'Nu';

Sau khi thực thi, MySQL trả về một bảng kết quả như sau:

tuoi_lon_nhat
22

Ví dụ 3

Truy xuất thông tin của sinh viên có tuổi lớn nhất

SELECT *
FROM sinh_vien
WHERE Age = (SELECT MAX(Age) FROM sinh_vien);

Sau khi thực thi, MySQL trả về một bảng kết quả như sau:

Full_name Gender Age City
Trinh Giao Kim Nam 44 Bac Lieu

Hàm MIN() Lấy giá trị nhỏ nhất của cột trong MySQL

Lưu ý: Giá trị có thể là kiểu số hoặc kiểu chuỗi, ký tự,....

Hàm MIN() dùng để lấy giá trị nhỏ nhất trong một cột.

 

Cú pháp

SELECT MIN(name_column)
FROM name_table;

Một số ví dụ

Chúng ta có một bảng sinh_vien như sau:

Full_name Gender Age City
Nguyen Thanh Nhan Nam 19 Can Tho
Pham Thu Huong Nu 20 Vinh Long
Nguyen Nhu Ngoc Nu 20 Soc Trang
Bui Thanh Bao Nam 19 Soc Trang
Le My Nhan Nu 22 Can Tho
Tan Thuc Bao Nam 35 An Giang
Trinh Giao Kim Nam 44 Bac Lieu

Ví dụ 1

Lấy tuổi nhỏ nhất

SELECT MIN(Age)
FROM sinh_vien;

Sau khi thực thi, MySQL trả về một bảng kết quả như sau:

MIN(Age)
19

Ví dụ 2

Lấy tuổi của sinh viên nữ nhỏ tuổi nhất. Đặt tên cột trong bảng kết quả là tuoi_nu_nho_nhat

SELECT MIN(Age) AS tuoi_nu_nho_nhat
FROM sinh_vien
WHERE Gender = 'Nu';

Sau khi thực thi, MySQL trả về một bảng kết quả như sau:

tuoi_nu_nho_nhat
20

Ví dụ 3

Truy xuất thông tin của những sinh viên có tuổi lớn hơn tuổi nhỏ nhất.

SELECT *
FROM sinh_vien
WHERE Age > (SELECT MIN(Age) FROM sinh_vien);

Sau khi thực thi, MySQL trả về một bảng kết quả như sau:

Full_name Gender Age City
Pham Thu Huong Nu 20 Vinh Long
Nguyen Nhu Ngoc Nu 20 Soc Trang
Le My Nhan Nu 22 Can Tho
Tan Thuc Bao Nam 35 An Giang
Trinh Giao Kim Nam 44 Bac Lieu

Hàm SUM() Lấy giá trị tổng của một cột trong MySQL

Hàm SUM() dùng để lấy giá trị tổng của một cột.

Cú pháp

SELECT SUM(column_name)
FORM table_name;

Một số ví dụ

Chúng ta có một bảng sinh_vien như sau:

Full_name Gender Age City
Nguyen Thanh Nhan Nam 19 Can Tho
Pham Thu Huong Nu 20 Vinh Long
Nguyen Nhu Ngoc Nu 20 Soc Trang
Bui Thanh Bao Nam 19 Soc Trang
Le My Nhan Nu 22 Can Tho
Tan Thuc Bao Nam 35 An Giang
Trinh Giao Kim Nam 44 Bac Lieu

Ví dụ 1

Lấy giá trị tổng của cột tuổi sinh viên.

SELECT SUM(Age)
FROM sinh_vien;

Sau khi thực thi, MySQL trả về một bảng kết quả như sau:

SUM(Age)
179

Ví dụ 2

Lấy giá trị tổng của cột tuổi của những sinh viên có giới tính nam. Đặt tên cột của bảng kết quả là Age_Nam

SELECT SUM(Age) AS Age_Nam
FROM sinh_vien
WHERE Gender = 'Nam';

Sau khi thực thi, MySQL trả về một bảng kết quả như sau:

Age_Nam
117

Hàm ROUND() Làm tròn số trong MySQL

Hàm ROUND() được dùng để làm tròn số thập phân.

Cú pháp

SELECT ROUND(column_name, vị_trí_làm_tròn)
FROM table_name;

Khi bạn làm tròn số, hệ thống sẽ kiểm tra số ở vị trí (vị_trí_làm_tròn + 1):

  • Nếu số đó lớn hơn 4 thì số ở vị_trí_làm_tròn sẽ cộng thêm 1. Các số ở phía sau thành 0
  • Nếu số đó nhỏ hơn 5 thì số ở vị_trí_làm_tròn sẽ giữ nguyên. Các số ở phía sau thành 0

Ví dụ chúng ta có một số thập phân là 645.5463

SỐ 6 4 5 . 5 4 6 3
vị_trí_làm_tròn -2 -1   0 1 2 3 4
  • SELECT ROUND(645.5463, -2) có kết quả là 600.
  • SELECT ROUND(645.5463, -1) có kết quả là 650.
  • SELECT ROUND(645.5463, 0)  có kết quả là 646.
  • SELECT ROUND(645.5463, 1)  có kết quả là 645.5.
  • SELECT ROUND(645.5463, 2)  có kết quả là 645.55.
  • SELECT ROUND(645.5463, 3)  có kết quả là 645.546.
  • SELECT ROUND(645.5463, 4)  có kết quả là 645.5463.

Một số ví dụ

Chúng ta có một bảng sinh_vien như sau:

Full_name Gender Age City Weight
Nguyen Thanh Nhan Nam 19 Can Tho 56.5674
Pham Thu Huong Nu 20 Vinh Long 72.456
Nguyen Nhu Ngoc Nu 20 Soc Trang 85.387
Bui Thanh Bao Nam 19 Soc Trang 49.3
Le My Nhan Nu 22 Can Tho 62.963
Tan Thuc Bao Nam 35 An Giang 55.5678
Trinh Giao Kim Nam 44 Bac Lieu 67.34

Ví dụ 1

Lấy cột họ tên và cân nặng của sinh viên, làm tròn cân nâng đến số thập phân thứ 2

SELECT Full_name, ROUND(Weight,2)
FROM sinh_vien;

Sau khi thực thi, MySQL trả về bảng kết quả như sau:

Full_name ROUND(Weight,2)
Nguyen Thanh Nhan 56.57
Pham Thu Huong 72.46
Nguyen Nhu Ngoc 85.39
Bui Thanh Bao 49.30
Le My Nhan 62.96
Tan Thuc Bao 55.57
Trinh Giao Kim 67.34

Ví dụ 2

Lấy cột họ tên và cân nặng của những sinh viên nam, làm tròn cân nặng đến phần số nguyên

SELECT Full_name, ROUND(Weight, 0) AS Weight_SV_Nam
FROM sinh_vien
WHERE Gender = 'Nam';

Sau khi thực thi, MySQL trả về bảng kết quả như sau:

Full_name Weight_SV_Nam
Nguyen Thanh Nhan 57
Bui Thanh Bao 49
Tan Thuc Bao 56
Trinh Giao Kim 67

Hàm SUBSTRING() Lấy chuỗi con trong MySQL

Hàm SUBSTRING() & MID() được dùng để trích xuất một chuỗi ký tự con trong một chuỗi ký tự cha.

Về cách sử dụng, hàm MID() giống với hàm SUBSTRING(). Nên ở bài hướng dẫn này, tôi dùng hàm SUBSTRING() đại diện cho cả hai.

Cú pháp

SELECT SUBSTRING(column_name, start, length)
FROM table_name;

Trong đó:

  • column_name là cột chứa chuỗi ký tự cha.
  • start là vị trí bắt đầu lấy trong chuỗi cha.
  • length là độ dài của chuỗi con.

Một số ví dụ

Chúng ta có một bảng sinh_vien như sau:

Full_name Gender Age City
Nguyen Thanh Nhan Nam 19 Can Tho
Pham Thu Huong Nu 20 Vinh Long
Nguyen Nhu Ngoc Nu 20 Soc Trang
Bui Thanh Bao Nam 19 Soc Trang
Le My Nhan Nu 22 Can Tho
Tan Thuc Bao Nam 35 An Giang
Trinh Giao Kim Nam 44 Bac Lieu

Ví dụ 1

Lấy 5 ký tự đầu tiên của cột họ tên

SELECT SUBSTRING(Full_name, 1, 5)
FROM sinh_vien;

Sau khi thực thi, MySQL trả về bảng kết quả như sau:

SUBSTRING(Full_name, 1, 5)
Nguye
Pham
Nguye
Bui T
Le My
Tan T
Trinh

Ví dụ 2

Lấy thành phố & 6 ký tự đầu tiên bắt đầu từ vị trí thứ 2 trong cột họ tên của những sinh viên nam. Đổi tên cột thành ky_tu

SELECT City, SUBSTRING(Full_name, 2, 6) AS ky_tu
FROM sinh_vien
WHERE Gender='Nam';

Sau khi thực thi, MySQL trả về bảng kết quả như sau:

City ky_tu
Can Tho guyen
Soc Trang ui Tha
An Giang an Thu
Bac Lieu rinh G

Hàm UPPER() Đổi chữ hoa trong MySQL

Hàm UPPER() & UCASE() được dùng để chuyển một chuỗi, ký tự về dạng chữ HOA.

Về cách sử dụng, hàm UCASE() giống với hàm UPPER(). Nên ở bài hướng dẫn này, tôi dùng hàm UPPER() đại diện cho cả hai.

Cú pháp

SELECT UPPER(column_name)
FROM table_name;

Một số ví dụ

Chúng ta có một bảng sinh_vien như sau:

Full_name Gender Age City
Nguyen Thanh Nhan Nam 19 Can Tho
Pham Thu Huong Nu 20 Vinh Long
Nguyen Nhu Ngoc Nu 20 Soc Trang
Bui Thanh Bao Nam 19 Soc Trang
Le My Nhan Nu 22 Can Tho
Tan Thuc Bao Nam 35 An Giang
Trinh Giao Kim Nam 44 Bac Lieu

Ví dụ 1

Lấy cột họ tên của sinh viên ở dạng chữ IN HOA.

SELECT UPPER(Full_name)
FROM sinh_vien;

Sau khi thực thi, MySQL trả về bảng kết quả như sau:

UPPER(Full_name)
NGUYEN THANH NHAN
PHAM THU HUONG
NGUYEN NHU NGOC
BUI THANH BAO
LE MY NHAN
TAN THUC BAO
TRINH GIAO KIM

Ví dụ 2

Lấy họ tên và thành phố của những bạn sinh viên nữ ở dạng chữ IN HOA. Đổi tên cột thành City_HOA, Full_name_HOA

SELECT UPPER(Full_name) AS Full_name_HOA, UPPER(City) AS City_HOA
FROM sinh_vien
WHERE Gender = 'Nu';

Sau khi thực thi, MySQL trả về bảng kết quả như sau:

Full_name_HOA City_HOA
PHAM THU HUONG VINH LONG
NGUYEN NHU NGOC SOC TRANG
LE MY NHAN CAN THO

Hàm LOWER() Đổi chữ thường trong MySQL

Hàm LOWER() & LCASE() được dùng để chuyển một chuỗi, ký tự về dạng chữ thường.

Về cách sử dụng, hàm LCASE() giống với hàm LOWER(). Nên ở bài hướng dẫn này, tôi dùng hàm LOWER() đại diện cho cả hai.

Cú pháp

SELECT LOWER(column_name)
FROM table_name;

Một số ví dụ

Chúng ta có một bảng sinh_vien như sau:

Full_name Gender Age City
Nguyen Thanh Nhan Nam 19 Can Tho
Pham Thu Huong Nu 20 Vinh Long
Nguyen Nhu Ngoc Nu 20 Soc Trang
Bui Thanh Bao Nam 19 Soc Trang
Le My Nhan Nu 22 Can Tho
Tan Thuc Bao Nam 35 An Giang
Trinh Giao Kim Nam 44 Bac Lieu

Ví dụ 1

Lấy cột họ tên của sinh viên ở dạng chữ thường.

SELECT LOWER(Full_name)
FROM sinh_vien;

Sau khi thực thi, MySQL trả về bảng kết quả như sau:

LOWER(Full_name)
nguyen thanh nhan
pham thu huong
nguyen nhu ngoc
bui thanh bao
le my nhan
tan thuc bao
trinh giao kim

Ví dụ 2

Lấy họ tên và thành phố của những bạn sinh viên nữ ở dạng chữ thường. Đổi tên cột thành City_thuong, Full_name_thuong

SELECT LOWER(Full_name) AS Full_name_thuong, LOWER(City) AS City_thuong
FROM sinh_vien
WHERE Gender = 'Nu';

Sau khi thực thi, MySQL trả về bảng kết quả như sau:

Full_name_thuong City_thuong
pham thu huong vinh long
nguyen nhu ngoc soc trang
le my nhan can tho

Đặt lại tên cho bảng, cột trong MySQL

Từ khóa AS được dùng để cung cấp cho một bảng cơ sở dữ liệu (hoặc một cột trong bảng) một cái tên tạm thời.

Từ khóa AS thường được dùng khi:

  • Có nhiều hơn một bảng tham gia truy vấn
  • Đặt lại tên cột cho ngắn gọn hơn, dễ đọc hơn.

Cú pháp

Cú pháp đặt tên tạm thời cho cột

SELECT column_name AS new_column_name
FROM table_name;

Cú pháp đặt tên tạm thời cho bảng

SELECT *
FROM table_name AS new_table_name;

Một số ví dụ

Chúng ta có một bảng sinh_vien như sau:

Full_name Gender Age City
Nguyen Thanh Nhan Nam 19 Can Tho
Pham Thu Huong Nu 20 Vinh Long
Nguyen Nhu Ngoc Nu 20 Soc Trang
Bui Thanh Bao Nam 19 Soc Trang
Le My Nhan Nu 22 Can Tho
Tan Thuc Bao Nam 35 An Giang
Trinh Giao Kim Nam 44 Bac Lieu

Và một bảng ket_qua_hoc_tap như sau:

Full_name Grade
Nguyen Thanh Nhan Xuat Sac
Pham Thu Huong Kha
Nguyen Nhu Ngoc Yeu
Bui Thanh Bao Trung Binh
Le My Nhan Gioi
Tan Thuc Bao Gioi
Trinh Giao Kim Kha

Ví dụ 1

Truy xuất danh sách sinh viên, đổi tên cột Full_name thành ho_ten, Gender thành gioi_tinh, Age thành tuoi, City thành thanh_pho

SELECT Full_name AS ho_ten, Gender AS gioi_tinh, Age AS tuoi, City AS thanh_pho
FROM sinh_vien;

Sau khi thực thi, MySQL trả về một bảng kết quả như sau:

ho_ten gioi_tinh tuoi thanh_pho
Nguyen Thanh Nhan Nam 19 Can Tho
Pham Thu Huong Nu 20 Vinh Long
Nguyen Nhu Ngoc Nu 20 Soc Trang
Bui Thanh Bao Nam 19 Soc Trang
Le My Nhan Nu 22 Can Tho
Tan Thuc Bao Nam 35 An Giang
Trinh Giao Kim Nam 44 Bac Lieu

Ví dụ 2

Truy xuất Full_name, Gender, Grade của sinh viên có tên là Trinh Giao Kim (trường hợp KHÔNG sửa tên bảng)

SELECT sinh_vien.Full_name, sinh_vien.Gender, ket_qua_hoc_tap.Grade
FROM sinh_vien, ket_qua_hoc_tap
WHERE (sinh_vien.Full_name="Trinh Giao Kim") AND (ket_qua_hoc_tap.Full_name="Trinh Giao Kim");

Sau khi thực thi, MySQL trả về một bảng kết quả như sau:

Full_name Gender Grade
Trinh Giao Kim Nam Kha

Ví dụ 3

Truy xuất Full_name, Gender, Grade của sinh viên có tên là Trinh Giao Kim (trường hợp CÓ sửa tên bảng)

SELECT sv.Full_name, sv.Gender, kq.Grade
FROM sinh_vien AS sv, ket_qua_hoc_tap AS kq
WHERE (sv.Full_name="Trinh Giao Kim") AND (kq.Full_name="Trinh Giao Kim");

Sau khi thực thi, MySQL trả về một bảng kết quả như sau:

Full_name Gender Grade
Trinh Giao Kim Nam Kha

Chú thích trong MySQL 

Trong MySQL, các chú thích cũng có thể được đặt trong các truy vấn SQL. Chú thích có thể là một dòng hoặc nhiều dòng.

Có ba loại chú thích:

1. Sử dụng dấu #

Cú pháp

# comment goes here  

Ví dụ 1:

select *from # JAVATPOINT  
student_1;  

MySQL Comments

2. Sử dụng dấu -- 

Cú pháp

comment goes here  

Ví dụ 2:

 

select *from -- JAVATPOINT  
student_1;  

MySQL Comments

3. Sử dụng " /*  */ "

Cú pháp:

/* comment goes here */  

Ví dụ 3:

select *from student_1 /* JAVATPOINT.com */;  

MySQL Comments

Con trỏ(Cursor) trong MySQL

Trong MySQL, Con trỏ cũng có thể được tạo. Sau đây là các bước để tạo một con trỏ.

1. Khai báo con trỏ 

Con trỏ là một câu lệnh select, được định nghĩa trong phần khai báo trong MySQL.

Cú pháp

DECLARE cursor_name CURSOR FOR  
Select statement;  

Các tham số:

cursor_name: tên con trỏ

select_statement: Câu truy vấn

2. Mở Con trỏ

Sau khi khai báo con trỏ, bước tiếp theo là mở con trỏ bằng câu lệnh mở.

Cú pháp

Open cursor_name;  

Tham số:

cursor_name: Tên con trỏ đã khai báo.

3. Nạp con trỏ

Sau khi khai báo và mở con trỏ, bước tiếp theo là tìm nạp con trỏ. Nó được sử dụng để lấy hàng hoặc cột.

Cú pháp

FETCH [ NEXT [ FROM ] ] cursor_name INTO variable_list;  

Tham số:

cursor_name: tên con trỏ

variable_list: các biến, dấu phẩy, v.v. được lưu trữ trong một con trỏ cho tập kết quả

4. Đóng con trỏ

Bước cuối cùng đóng con trỏ.

Cú pháp

Close cursor_name;  

Tham số:

Cursor_name: tên con trỏ

Ví dụ:

Bước 1: Mở CSDL và Bảng

MySQL Cursor

Bước 2: Tạo con trỏ.

Câu truy vấn:

MySQL Cursor

Bước 3: Bây giờ, gọi con trỏ.

Câu truy vấn:

SET @name_list ="";  
CALL list_name(@name_list);  
SELECT @name_list;  

MySQL Cursor

Xây dựng hàm trong MySQL 

Tạo một hàm

Trong MySQL, Hàm cũng có thể được tạo. Một hàm luôn trả về một giá trị bằng cách sử dụng câu lệnh return. Hàm này có thể được sử dụng trong các truy vấn SQL.

Cú pháp:

CREATE FUNCTION function_name [ (parameter datatype [, parameter datatype]) ]   
RETURNS return_datatype  
BEGIN  
Declaration_section  
Executable_section  
END;  

Tham số:

Function_name: Tên hàm

Parameter: số lượng tham số. Có thể là một tham số hoặc nhiều hơn.

return_datatype: Giá trị kiểu dữ liệu trả về,

declaration_section: Các biến được khai báo.

executable_section: Mã của hàm được viết tại đây

Ví dụ 1

Bước  1: Tạo  CSDL và bảng.

CSDL: employee

MySQL Functions

Bảng 1 : designation

MySQL Functions

Bảng 2 : staff

MySQL Functions

Bước 2: Tạo một hàm

Câu truy vấn trong hàm:

DELIMITER $$   
CREATE FUNCTION get_designation_name(d_id INT) RETURNS VARCHAR( 20 )   
BEGIN   
DECLARE de_name VARCHAR( 20 ) DEFAULT "";  
SELECT name INTO de_name FROM designation WHERE id = d_id;  
RETURN de_name;  
END $$  

MySQL Functions

Bước 3: Thực thi hàm

Câu truy vấn :

SELECT id, get_designation1(`d_id`) as DESIGNATION, name FROM 'staff'

MySQL Functions

Xóa hàm

Trong MySQL hàm cũng có thể được xóa, Hàm có thể được xóa khỏi CSDL.

Cú pháp:

Drop function [ IF EXISTS ] function_name;  

Tham số

function_name: Tên hàm sẽ bị xóa.

Ví dụ 1:

Xóa hàm tên là get_designation_name;

MySQL Functions

1. Chuỗi ký tự
Trong MySQL, chuỗi ký tự nằm trong dấu ngoặc đơn (') hoặc dấu ngoặc kép (").

ví dụ 1:

Select class from table1 where name='Dolly';  

MySQL Programming Literals

Ví dụ 2

Select class from table1 where name="Dolly";  

MySQL Programming Literals

2. Hằng số

Trong MySQL, Hằng số có thể số dương hoặc âm

Ví dụ 1

Select class from table1 where id = 6;  

MySQL Programming Literals

Ví dụ 2

Select class from table1 where marks = +65;  

MySQL Programming Literals

Hằng: Date và Time

Trong MySQL , hằng Date và Time là dạng chuỗi hoặc số.

Một số định dạng khác trong đó ngày và thời gian có thể được hiển thị.

EXAMPLE FORMAT
'2018-10-18' 'YYYY-MM-DD'
'20181018' 'YYYYMMDD'
20181018 YYYYMMDD
'18-10-18' 'YY-MM-DD'
181018 YYMMDD
'2018-10-18 5:25:20' 'YYYY-MM-DD HH:MM:SS'
'2018101852520' 'YYYYMMDDHHMMSS'
2018101852520 YYYYMMDDHHMMSS
'18-10-18 5:25:20' 'YY-MM-DD HH:MM:SS'
'18101852520' 'YYMMDDHHMMSS'
18101852520 YYMMDDHHMMSS

Ví dụ 1

select id, name, salary, date_format(sal_date,'%d-%m-%y') as new_date_formate from staff1;  

MySQL Date and Time

Ví dụ 2

select id, name, salary, date_format(sal_date,'%d%m%y') as new_date_formate from staff1;

  

MySQL Date and Time

Injection trong MySQL và SQL

Nếu bạn nhận User Input thông qua một Webpage và chèn nó vào trong một SQL Database, thì tình cờ, bạn đã mở rộng cửa bảo mật ra bên ngoài, mà được biết đến với tên gọi là SQL Injection.

Chương này sẽ hướng dẫn bạn cách ngăn cản tình huống này xảy ra và giúp bạn bảo vệ Script của bạn và các lệnh SQL trong Server-Side Script như PERL Script.

Injection thường xảy ra khi bạn yêu cầu input từ một người dùng, như tên của họ, và thay vì cung cấp tên, họ cung cấp cho bạn một lệnh SQL mà bạn sẽ chạy trên Database của mình mà không hay biết.

Đừng bao giờ tin vào dữ liệu được cung cấp bởi người dùng, xử lý dữ liệu này, và như một qui tắc, điều này được thực hiện bởi Pattern Matching (so khớp mẫu).

Trong ví dụ dưới, name bị giới hạn là các ký tự chữ-số cộng với dấu gạch dưới và có độ dài từ 8 đến 20 ký tự (bạn có thể sửa đổi nếu thấy cần thiết).

if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
{
   $result = mysql_query("SELECT * FROM nhanvienIT 
                          WHERE username=$matches[0]");
}
 else 
{
   echo "Ten su dung khong duoc chap nhan";
}

Để minh họa vấn đề, bạn xem phần trích sau:

// gia su co input nhu sau:
$name = "Thanh'; DELETE FROM nhanvienIT;";
mysql_query("SELECT * FROM nhanvienIT WHERE name='{$name}'");

Lời gọi hàm được xem như để lấy một bản ghi từ bảng NHANVIEN, với cột name so khớp với name đã được xác định bởi người dùng. Thông thường, $name sẽ chỉ chứa các ký tự chữ-số và có thể có khoảng trống. Nhưng ở đây, bằng việc phụ thêm một truy vấn hoàn toàn mới tới $name, lời gọi tới Database sẽ gây ra vấn đề lớn: truy vấn DELETE bị tiêm vào sẽ xóa tất cả bản ghi từ bảng NHANVIEN.

May mắn là, nếu bạn sử dụng MySQL, hàm mysql_query() không cho phép Query Stacking hoặc thực thi nhiều truy vấn SQL trong một lời gọi hàm đơn. Nếu bạn nỗ lực để thực hiện nhiều truy vấn, lời gọi hàm sẽ thất bại.

Tuy nhiên, với PHP Database, ví dụ như SQLite và PostgreSQL, lại cho thực hiện nhiều truy vấn, thực thi tất cả truy vấn được cung cấp trong một chuỗi và điều này tạo ra một vấn đề rất nghiêm trọng.

Ngăn chặn SQL Injection

Bạn có thể xử lý tất cả Escape Character một cách khéo léo trong các ngôn ngữ Scripting như PERL và PHP. MySQL extension cho PHP cung cấp hàm mysql_real_escape_string() để tránh các ký tự được nhập vào mà có ý nghĩa đặc biệt với MySQL.

if (get_magic_quotes_gpc()) 
{
  $name = stripslashes($name);
}
$name = mysql_real_escape_string($name);
mysql_query("SELECT * FROM nhanvienIT WHERE name='{$name}'");

LIKE Quandary trong MySQL

Để định vị một LIKE Quandary, một kỹ thuật do người dùng tạo phải chuyển đổi các ký tự '%' và '_' do người dùng cung cấp thành literal (hằng). Sử dụng hàm addcslashes(), một hàm mà giúp bạn xác định một dãy ký tự để thoát.

$sub = addcslashes(mysql_real_escape_string("%something_"), "%_");
// $sub == \%something\_
mysql_query("SELECT * FROM messages WHERE subject LIKE '{$sub}%'");

Transaction trong MySQL

Transaction trong SQL là một đơn vị công việc được thực hiện bởi một Database. Transaction là đơn vị hoặc dãy công việc được thực hiện theo một thứ tự logic và hợp lý, có thể được thao tác bởi người dùng hoặc bởi một Database program.

Một transaction là một sự lan truyền của một hoặc nhiều thay đổi tới Database. Ví dụ, nếu bạn đang tạo một bản ghi hoặc cập nhật một bản ghi hoặc xóa một bản ghi từ một bảng, thì bạn đang thực hiện transaction trên bảng đó. Nó là quan trọng để điều khiển các transaction để bảo đảm toàn vẹn dữ liệu và để xử lý các Database Error.

Nói cách khác, một Transaction sẽ không bao giờ hoàn thành trừ khi mỗi hoạt động riêng bên trong nhóm được thực hiện thành công. Nếu bất kỳ hoạt động nào bên trong Transaction thất bại, thì toàn bộ Transaction đó sẽ thất bại.

Thực tế, bạn sẽ gộp nhiều truy vấn SQL vào thành một nhóm và bạn sẽ thực thi tất cả chúng cùng với nhau như là một Transaction.

Property của Transaction trong MySQL

Transaction có 4 property chuẩn và thường được biết đến với tên lược danh là ACID:

  • Atomicity: bảo đảm rằng tất cả hoạt động bên trong đơn vị công việc được hoàn thành một cách thành công; nếu không, transaction bị ngừng ở điểm thất bại, và các hoạt động trước được trao trả về trạng thái trước đó.

  • Consistency: bảo đảm rằng Database thay đổi một cách chính xác trạng thái theo một transaction đã được ký thác thành công.

  • Isolation: cho các transaction khả năng hoạt động một cách độc lập và không liên quan đến nhau.

  • Durability: bảo đảm rằng kết quả hoặc tác động của một transaction, mà đã được ký thác, vẫn còn tồn tại trong trường hợp hệ thống thất bại.

Trong MySQL, các Transaction bắt đầu với lệnh BEGIN WORK và kết thúc với hoặc một lệnh COMMIT hoặc lệnh ROLLBACK. Các lệnh SQL giữa các lệnh bắt đầu và kết thúc cấu tạo nên Transaction.

Lệnh COMMIT và ROLLBACK trong MySQL

Hai từ khóa Commit và Rollback được sử dụng chủ yêu cho Transaction trong MySQL.

  • Khi một Transaction được hoàn thành, lệnh COMMIT nên được thông báo để mà tất cả thay đổi tới các bảng liên quan sẽ có hiệu quả.

  • Nếu một lỗi xuất hiện, một lệnh ROLLBACK nên được thông báo để trả bảng đã tham chiếu trong Transaction về trạng thái trước đó.

Bạn có thể điều khiển cách vận hành của một Transaction bằng việc thiết lập biến session gọi là AUTOCOMMIT. Nếu AUTOCOMMIT được thiết lập là 1 (mặc định), thì mỗi lệnh SQL (bên trong một Transaction hoặc không) được xem như là một Transaction đã kết thúc và được ký thác theo mặc định khi nó kết thúc. Khi AUTOCOMMIT được thiết lập là 0, thì bằng việc thông báo lệnh SET AUTOCOMMIT=0, các chuỗi lệnh theo sau hoạt động như một Transaction và không có hoạt động nào được ký thác tới khi một lệnh COMMIT tường minh được thông báo.

Ví dụ chung về Transaction trong MySQL

Dãy sự kiện là độc lập với ngôn ngữ chương trình được sử dụng; logic path có thể được tạo trong bất kỳ ngôn ngữ nào bạn sử dụng để tạo ứng dụng của mình.

Bạn có thể thực thi các lệnh SQL trong PHP bởi sử dụng hàm mysql_query().

  • Bắt đầu Transaction bằng việc thông báo lệnh BEGIN WORK.

  • Thông báo một hay nhiều lệnh SQL như SELECT, INSERT, UPDATE hoặc DELETE.

  • Kiểm tra xem có lỗi nào hay không và mọi thứ có theo như yêu cầu của bạn không.

  • Nếu có bất kỳ lỗi nào, thì bạn thông báo lệnh ROLLBACK, nếu không có, bạn thông báo một lệnh COMMIT.

Các loại bảng bảo vệ Transaction trong MySQL

Bạn không thể sử dụng các Transaction một cách trực tiếp, bởi vì chúng không an toàn và không được bảo vệ. Nếu bạn muốn sử dụng các Transaction trong lập trình MySQL, thì bạn cần tạo các bảng theo một cách đặc biệt. Có nhiều loại bảng hỗ trợ cho các Transaction nhưng loại phổ biến nhất là InnoDB.

Sự hỗ trợ cho các bảng InnoDB yêu cầu một tham số biên dịch cụ thể khi biên dịch MySQL từ nguồn. Nếu phiên bản MySQL của bạn không có hỗ trợ cho InnoDB, bạn yêu cầu nhà cung cấp dịch vụ Internet để xây dựng một phiên bản MySQL với sự hỗ trợ cho loại bảng InnoDB hoặc tải và cài đặt MySQL-Max Binary Distribution cho Windows hoặc Linux/UNIX và làm việc với loại bảng này trong môi trường phát triển.

Nếu cài đặt MySQL của bạn hỗ trợ các bảng InnoDB, bạn chỉ cần đơn giản thêm định nghĩa TYPE=InnoDB ở phần lệnh tạo bảng. Ví dụ sau tạo một bảng InnoDB gọi là sinhvienk60:

//Lua chon co so du lieu
USE sinhvien;
//Tao bang sinhvienk60

CREATE TABLE sinhvienk60 (
   ten VARCHAR(40) NOT NULL,
   diemthi  INT
) TYPE=InnoDB;

Bạn có thể sử dụng các loại bảng khác như GEMINI hoặc BDB, tùy thuộc vào cài đặt của bạn có hỗ trợ các loại bảng này không.

Bảng tạm trong MySQL

Các bảng tạm (Temporary Table) tỏ ra rất có ích trong một số trường hợp cần lưu giữ các dữ liệu tạm thời. Điều quan trọng nhất bạn cần biết về các bảng tạm là chúng sẽ bị xóa khi phiên (session) hiện tại trên Client kết thúc.

Các bảng tạm được bổ sung trong phiên bản MySQL 3.23. Nếu bạn sử dụng phiên bản MySQL cũ hơn, thì bạn không thể sử dụng các bảng này, tuy nhiên, bạn có thể sử dụng các Heap Table.

Các bảng tạm sẽ chỉ tồn tại khi session còn sống. Nếu bạn chạy code trong một PHP Script, thì bảng tạm sẽ tự động bị hủy khi Script kết thúc việc thực thi. Nếu bạn kết nối với MySQL Database Server thông qua chương trình MySQL Client, thì bảng tạm sẽ tồn tại tới khi bạn đóng Client hoặc thao tác hủy bảng.

Ví dụ

Ví dụ sau tạo một bảng tạm có tên bangdiemk60 trong cơ sở dữ liệu sinhvien. Code này cũng có thể được sử dụng trong PHP Script bởi sử dụng hàm mysql_query().

//Chon co so du lieu
USE sinhvien;

//Tao bang tam bangdiemk60
CREATE TEMPORARY TABLE bangdiemk60 (
ho VARCHAR(50) NOT NULL,
ten VARCHAR(20) NOT NULL,
diemgk FLOAT(4,2) NOT NULL DEFAULT 0.00,
diemck FLOAT(4,2) NOT NULL DEFAULT 0.00
);

//Chen du lieu vao bang
INSERT INTO bangdiemk60 (ho, ten, diemgk, diemck)
VALUES ('Tran Minh', 'Chinh', 8, 9);

//hien thi du lieu cua bang
SELECT * FROM bangdiemk60;
+--------------+-------+---------+--------+
| ho           | ten   | diemgk  | diemck |
+--------------+-------+---------+--------+
| Tran Minh    | Chinh |  8.00   |  9.00  |
+--------------+-------+---------+--------+

Khi bạn thông báo một lệnh SHOW TABLES, thì bảng tạm của bạn sẽ không được liệt kê trong kết quả. Bây giờ, nếu bạn đăng xuất MySQL session và sau đó bạn sẽ thông báo một lệnh SELECT, thì bạn sẽ không thấy dữ liệu nào có sẵn trong cơ sở dữ liệu.

Xóa bảng tạm trong MySQL

Theo mặc định, tất cả bảng tạm bị xóa bởi MySQL khi kết nối tới cơ sở dữ liệu bị ngắt. Tuy nhiên, nếu bạn vẫn muốn xóa chúng, thì bạn có thể làm điều này bởi thông báo lệnh DROP TABLE.

Ví dụ sau sẽ xóa một bảng tạm trong MySQL:

DROP TABLE bangdiemk60;

//Bay gio, neu ban su dung lenh SELECT
SELECT * FROM bangdiemk60;
//thi no se cho mot loi nhu sau
Error Code: 1146. Table 'sinhvien.bangdiemk60' doesn't exist

 

Export và sao lưu (Backup) trong MySQL

Cách đơn giản nhất của việc truy xuất dữ liệu vào trong một text file là sử dụng lệnh SELECT…INTO OUTFILE mà xuất một kết quả truy vấn một cách trực tiếp vào trong file trên Server host.

Export với lệnh SELECT…INTO OUTFILE trong MySQL

Cú pháp của lệnh này là tổ hợp một lệnh SELECT thông thường với INTO OUTFILE ten_file ở cuối. Định dạng output mặc định là giống như LOAD DATA, vì thế lệnh sau sẽ xuất bảng sinhvienk60 vào trong /tmp/vietjack.txt.

SELECT * FROM sinhvienk60 
    INTO OUTFILE '/tmp/vietjack.txt';

Bạn có thể thay đổi định dạng output bởi sử dụng các tùy chọn để chỉ cách trích dẫn và giới hạn các cột và các hàng. Để xuất bảng sinhvienk60 với định dạng CSV với các dòng CRLF, sử dụng lệnh:

SELECT * FROM passwd INTO OUTFILE '/tmp/vietjack.txt'
    FIELDS TERMINATED BY ',' ENCLOSED BY '"'
    LINES TERMINATED BY '\r\n';

Lệnh SELECT ... INTO OUTFILE có các thuộc tính sau:

  • Output file được tạo một cách trực tiếp bởi MySQL Server, vì thế ten_file nên chỉ ra nơi bạn xác định file đó để ghi dữ liệu trên Server host. Không có phiên bản LOCAL của lệnh như trong LOAD DATA.

  • Bản phải được trao quyền MySQL FILE để thực thi lệnh SELECT…INTO.

  • Output file phải là chưa tồn tại. Điều này giúp bạn ngăn cản MySQL từ việc ghi đè các file quan trọng.

  • Bạn nên có một tài khoản đăng nhập trên Server host hoặc theo phương thức nào khác để lấy file từ host đó. Nếu không, lệnh SELECT…INTO OUTFILE sẽ không có giá trị với bạn.

  • Với UNIX, file được tạo sẽ là có thể đọc bởi mọi người và được sở hữu bởi MySQL Server. Nghĩa là, mặc dù bạn có thể đọc được file đó, nhưng bạn không thể xóa nó.

Xuất bảng dưới dạng dữ liệu thô

Chương trình mysqldump được sử dụng để sao hoặc backup các bảng hoặc cơ sở dữ liệu. Chương trình này có thể viết bảng output hoặc ở dạng file dữ liệu thô hoặc dưới dạng một tập hợp các lệnh INSERT mà tái tạo các bản ghi trong bảng.

Để xuất một bảng dưới dạng file dữ liệu, bạn phải xác định một tùy chọn -- mà chỉ dẫn thư mục, nơi bạn muốn MySQL Server để ghi file đó.

Ví dụ, để xuất bảng sinhvienk60 từ cơ sở dữ liệu sinhvien vào một file trong thư mục /tmp, sử dụng lệnh sau:

$ mysqldump -u root -p --no-create-info \
            --tab=/tmp sinhvien sinhvienk60
password ******

Xuất nội dung hoặc định nghĩa bảng trong định dạng SQL

Để xuất một bảng trong định dạng SQL vào một file, sử dụng lệnh giống như:

$ mysqldump -u root -p sinhvien sinhvienk60 > dump.txt
password ******

Lệnh này sẽ tạo một file chứa nội dung như sau:


-- MySQL dump 8.23
--
-- Host: localhost    Database: sinhvien
---------------------------------------------------------
-- Server version       3.23.58

--
-- Table structure for table `sinhvienk60`
--

CREATE TABLE sinhvienk60 (
mssv INT NOT NULL AUTO_INCREMENT,
ho VARCHAR(255) NOT NULL,
ten VARCHAR(255) NOT NULL,
tuoi INT NOT NULL,
diemthi FLOAT(4,2) NOT NULL,
PRIMARY KEY (mssv)
) TYPE=MyISAM;

--
-- Dumping data for table `sinhvienk60`
--

INSERT INTO sinhvienk60 (ho, ten, diemthi)
VALUES ("Dinh Van", "Cao", 8);

INSERT INTO sinhvienk60 (ho, ten, diemthi)
VALUES ("Nguyen Van", "Thanh", 9);

INSERT INTO sinhvienk60 (ho, ten, diemthi)
VALUES ("Nguyen Hoang", "Manh", 7.5);

INSERT INTO sinhvienk60 (ho, ten, diemthi)
VALUES ("Tran Van", "Nam", 10);

Để xuất nhiều bảng, bạn xác định tất cả bảng đó sau tên cơ sở dữ liệu. Để xuất cả cơ sở dữ liệu, đừng xác định bất kỳ bảng nào sau cơ sở dữ liệu, như sau:

$ mysqldump -u root -p sinhvien > database_dump.txt
password ******

Để backup tất cả cơ sở dữ liệu có sẵn trên host của bạn, sử dụng lệnh sau:

$ mysqldump -u root -p --all-databases > database_dump.txt
password ******

Tùy chọn --all--databases là có sẵn trong MySQL 3.23.12.

Phương thức này có thể được sử dụng để triển khai một chiến lược sao lưu cơ sở dữ liệu.

Sao chép bảng hoặc cơ sở dữ liệu tới Host khác

Nếu bạn muốn sao chép các bảng hoặc cơ sở dữ liệu từ một MySQL Server tới Server khác, thì sử dụng mysqldump với tên cơ sở dữ liệu và tên bảng.

Chạy lệnh sau tại source host. Lệnh này sẽ xuất toàn bộ cơ sở dữ liệu vào trong dump.txt file.

$ mysqldump -u root -p ten_database ten_bang > dump.txt
password *****

Bạn có thể sao chép toàn bộ cơ sở dữ liệu mà không cần sử dụng một tên bảng cụ thể như giải thích trên.

Bây giờ, dump.txt file trên host khác và sử dụng lệnh sau. Trước khi chạy lệnh, đảm bảo bạn có database_name đã được tạo trên Server đích.

$ mysql -u root -p ten_database < dump.txt
password *****

Một cách khác để thực hiện việc này mà không sử dụng một file trung gian là gửi output của mysqldump một cách trực tiếp thông qua mạng tới MySQL Server từ xa. Nếu bạn có thể kết nối tới cả hai Server từ host đó, nơi đặt source database, sử dụng lệnh này (đảm bảo bạn có thể truy cập với cả hai Server đó):

$ mysqldump -u root -p ten_database \
       | mysql -h other-host.com ten_database

 

 Export và Import bằng phpAdmin

  • Export database là một trong các cách dùng để backup database thao tác thủ công bằng tay, hoặc dùng để chuyển dữ liệu sang database khác.
  • Click chọn database (ví dụ tintuc) ở menu bên trái, click vào tab Export

phpMyAdmin, database export

  • Ở vị trí Export Method có 2 lựa chọn:

    • Quick: export tất cả các table vào cùng 1 file .sql
    • Custom: mỗi một table sẽ được export ra một file .sql riêng.
  • Sau khi lựa chọn phương pháp export xong, click Go để tiến hành export.

Import database - phpMyAdmin

  • Khi có file .sql, chúng ta cần đưa nội dung file vào database, import database chính là cách làm thủ công đơn giản nhất chúng ta có thể làm.
  • Tương tự như export, click chọn database (ví dụ tintuc) ở menu bên trái, click vào tab Import

phpMyAdmin, database import

  • Click Chọn tệp trỏ đến file .sql cần import.
  • Character set of the file: chọn Charset cho phù hợp.
  • Các thông số khác bạn có thể tùy chỉnh cho phù hợp với database của mình, không thì để mặc định và click Go để import database có trong file .sql
  • Chú ý bên trên có dòng chữ (Max: 2MiB), có nghĩa là chỉ được import file với dung lượng max 2mb, nếu muốn điều chỉnh dùng lượng lớn hơn, bạn có truy cập vào file C:\xampp\php\php.ini, tìm đến dòng post_max_size và upload_max_filesize tăng giá trị 2M đến giá trị dung lượng bạn mong muốn, save file php.ini

Toán tử Regexp

Bạn đã thấy cách MySQL so khớp mẫu (Pattern Matching) với LIKE …%. MySQL hỗ trợ hoạt động so khớp mẫu khác dựa trên Regular Expression và toán tử REGEXP. Nếu bạn đã hiểu về PHP hoặc PERL, thì nó là khá đơn giản để bạn hiểu về hoạt động này bởi vì việc so khớp này là khá tương tự như các Regular Expression trong các ngôn ngữ đó.

Bảng dưới liệt kê các Pattern có thể được sử dụng cùng với toán tử REGEXP.

Pattern So khớp với
^ Phần đầu của chuỗi
$ Phần cuối của chuỗi
. Bất kỳ ký tự đơn nào
[...] Bất kỳ ký tự nào được liệt kê trong dấu ngoặc vuông
[^...] Bất kỳ ký tự nào không được liệt kê trong dấu ngoặc vuông
p1|p2|p3 Bất kỳ mẫu p1, p2 hoặc p3 nào
* 0 hoặc nhiều instance (sự thể hiện) của phần tử ở trước
+ 1 hoặc nhiều instance (sự thể hiện) của phần tử ở trước
{n} n instance (sự thể hiện) của phần tử ở trước
{m,n} Từ m tới n instance (sự thể hiện) của phần tử ở trước

Ví dụ

Dựa vào bảng trên, bạn có thể thành lập nhiều kiểu truy vấn SQL đa dạng tùy theo yêu cầu của bạn. Ở đây, mình sẽ liệt kê một số kiểu cần thiết nhất. Giả sử chúng ta có một bảng sinhvienk60 và có một trường là ten:

Truy vấn để tìm tất cả ten bắt đầu với '^Ng':

SELECT ten FROM sinhvienk60 WHERE ten REGEXP '^Ng';

Truy vấn để tìm tất cả ten kết thúc với 'ng$':

SELECT ten FROM sinhvienk60 WHERE ten REGEXP 'ng$';

Truy vấn để tìm tất cả ten chứa 'ao':

SELECT ten FROM sinhvienk60 WHERE ten REGEXP 'ao';

Truy vấn để tìm tất cả ten bắt đầu với một nguyên âm và kết thúc với 'nh':

SELECT ten FROM sinhvienk60 WHERE ten REGEXP '^[aeiou]|nh$';

Hàm regexp_instr() trong MySQL

Hàm regexp_instr trong MySQL được sử dụng để so khớp mẫu đã cho. Nó trả về vọ trí  của chuỗi con từ chuỗi đã cho. Hàm này trả về 0 nếu không tìm thấy kết quả khớp nào khác, nó trả về 

Cú pháp:

select regexp_instr('str', 'pattern', ['position']);  

Ví dụ 1

select regexp_instr('BCA jhon', 'BCA')  

Kết quả:

MySQL regexp_instr Function

Ví dụ 2

select regexp_instr('BCA jhon', 'BCA', 1)  

Kết quả:

MySQL regexp_instr Function 

Hàm regexp_like() trong MySQL

Hàm regexp_like() trong MySQL được sử dụng để so khớp mẫu cho trước. Nó so sánh các chuỗi đã cho và trả về 1 nếu các chuỗi giống nhau, nó trả về 0.

Cú pháp

select regexp_like(str1, str2);  

Ví dụ 1

select regexp_like(str1, str2);  

Kết quả:

MySQL regexp_like Function

Ví dụ 2

select regexp_like('MCA', 'bca');  

Kết quả:

MySQL regexp_like Function

Hàm regexp_replace trong MySQL

Hàm regexp_replace() trong dùng để thay thế chuỗi.

Cú pháp

select regexp_replace('str', 'character', 'new_character'); 

Ví dụ 1

Select regexp_replace('BCA', 'B', 'M');  

Kết quả:

MySQL regexp_replace Operator

Ví dụ 2

Select regexp_replace('Java', 'Java', 'Mysql');  

Kết quả:

MySQL regexp_replace Operator

Hàm regexp_substr() trong MySQL

Hàm regexp_substr () trong MySQL được sử dụng đểso khớp mẫu. Nó trả về chuỗi con từ chuỗi đã cho.

Cú pháp

select regexp_substr('str', 'match_type', occurrence, position, );  

Ví dụ 1

select regexp_substr('str', 'match_type', occurrence, position, );  

Kết quả:
MySQL regexp_substr Function

Ví dụ 2

select regexp_substr('my sql function', '[a-z]+', 1, 3);  

Kết quả:

MySQL regexp_substr Function

MySQL Interview Questions

A list of top frequently asked MySQL interview questions and answers are given below.

1) What is MySQL?

MySQL is a multithreaded, multi-user SQL database management system which has more than 11 million installations. This is the world's second most popular and widely used open source database. It is interesting how MySQL name was given to this query language. The term My is coined by the name of the daughter of co-founder Michael Widenius`s daughter, and SQL is the short form of Structured Query Language. Using MySQL is free of cost for the developer, but enterprises have to pay a license fee to Oracle.

Formerly MySQL was initially owned by a for-profit firm MySQL AB, then Sun Microsystems bought it and then Oracle bought Sun Microsystems, so Oracle currently owns MySQL.

MySQL is an Oracle-supported Relational Database Management System (RDBMS) which is based on structured query language. MySQL supports wide ranges of operating systems most famous of those include Windows, Linux & UNIX. Although it is possible to develop a wide range of application with MySQL, it is only used for web applications & online publishing. It is a fundamental part of an open source enterprise known as Lamp.

What is Lamp?

Lamp is a platform used for web development. Lamp uses Linux, Apache, MySQL, and PHP as an operating system, web server, database & object-oriented scripting language respectively. And hence abbreviated as LAMP.


2) In which language MySQL has been written?

MySQL is written in C and C++, and its SQL parser is written in yacc.


3) What are the technical specifications of MySQL?

MySQL has the following technical specifications -

  • Flexible structure
  • High performance
  • Manageable and easy to use
  • Replication and high availability
  • Security and storage management
  • Drivers
  • Graphical Tools
  • MySQL Enterprise Monitor
  • MySQL Enterprise Security
  • JSON Support
  • Replication & High-Availability
  • Manageability and Ease of Use
  • OLTP and Transactions
  • Geo-Spatial Support

4) What is the difference between MySQL and SQL?

SQL is known as the standard query language. It is used to interact with the database like MySQL. MySQL is a database that stores various types of data and keeps it safe.

A PHP script is required to store and retrieve the values inside the database.

SQL is a computer language, whereas MySQL is a software or an application

SQL is used for the creation of database management systems whereas MySQL is used to enable data handling, storing, deleting and modifying data


5) What is the difference between database and table?

There is a major difference between a database and a table. The differences are as follows:

  • Tables are a way to represent the division of data in a database while the database is a collection of tables and data.
  • Tables are used to group the data in relation with each other and create a dataset. This dataset will be used in the database. The data which are stored in the table in any form is a part of the database, but the reverse is not true.
  • A database is a collection of organized data and also features which are used to access them, whereas table is a collection of rows and columns which are used to store the data.

6) Why do we use the MySQL database server?

First of all MYSQL server is free to use for developers and a small fee for enterprises.

MySQL server is open source.

The community of MySQL is tremendous and supportive hence any help regarding MySQL is resolved as soon as possible.

MySQL has very stable versions available, as MySQL has been in the market since a long time so all bugs arising in the previous builds have been continuously removed and a very stable version is provided after every update.

The MySQL database server is very fast, reliable and easy to use. You can easily use and modify the software. MySQL software can be downloaded free of cost from the internet.


7) What are the different tables present in MySQL?

There are many tables that remain present by default. But, MyISAM is the default database engine used in MySQL. There are five types of tables that are present:

  • MyISAM
  • Heap
  • Merge
  • INNO DB
  • ISAM

8) What is the difference between CHAR and VARCHAR?

A list of differences between CHAR and VARCHAR:

  • CHAR is variable-length whereas VARCHAR is of fixed length.
  • CHAR and VARCHAR types are different in storage and retrieval.
  • CHAR column length is fixed to the length that is declared while creating a table. The length value ranges from 1 and 255.
  • When CHAR values are stored when they are right-padded using spaces to a specific length. Trailing spaces are removed when CHAR values are retrieved.
  • CHAR uses static memory allocation whereas VARCHAR uses dynamic memory allocation.
  • CHAR is 50% faster than VARCHAR.

9) What is the difference between TRUNCATE and DELETE in MySQL?

TRUNCATE is a DDL command, DELETE is a DML command.

It is not possible to use Where command with TRUNCATE but you can use it with DELETE command.

TRUNCATE cannot be used with indexed views whereas DELETE can be used with indexed views.

The DELETE command is used to delete data from a table. It only deletes the rows of data from the table while, truncate is very dangerous command and should be used carefully because it deletes every row permanently from a table.


10) How many Triggers are possible in MySQL?

There are only six Triggers allowed to use in MySQL database.

  1. Before Insert
  2. After Insert
  3. Before Update
  4. After Update
  5. Before Delete
  6. After Delete

11) What is heap table?

Tables that are present in memory is known as HEAP tables. When you create a heap table in MySQL, you should need to specify the TYPE as HEAP. These tables are commonly known as memory tables. They are used for high-speed storage on a temporary basis. They do not allow BLOB or TEXT fields.


12) What is BLOB and TEXT in MySQL?

BLOB is an acronym stands for a large binary object. It is used to hold a variable amount of data.

There are four types of BLOB.

  1. TINYBLOB
  2. BLOB
  3. MEDIUMBLOB
  4. LONGBLOB

The differences among all these are the maximum length of values they can hold.

TEXT is a case-insensitive BLOB. TEXT values are non-binary strings (character string). They have a character set, and values are stored, and compared based on the collation of the character set.

There are four types of TEXT.

  1. TINYTEXT
  2. TEXT
  3. MEDIUMTEXT
  4. LONGTEXT

13) What is a trigger in MySQL?

A trigger is a set of codes that executes in response to some events.


14) What is the difference between heap table and temporary table?

Heap tables:

Heap tables are found in memory. They are used for high-speed storage on a temporary basis. They do not allow BLOB or TEXT fields.

Heap tables do not support AUTO_INCREMENT.

Indexes should be NOT NULL.

Temporary tables:

The temporary tables are used to keep the transient data. Sometimes it is beneficial in cases to hold temporary data. The Temporary table is deleted after the current client session terminates.

Main differences:

The heap tables are shared among clients while temporary tables are not shared.

Heap tables are just another storage engine, while for temporary tables you need a special privilege (create temporary table).


15) What is the difference between FLOAT and DOUBLE?

FLOAT stores floating point numbers with accuracy up to 8 places and allocates 4 bytes, on the other hand DOUBLE stores floating point numbers with accuracy up to 18 places and allocates 8 bytes.


16) What are the advantages of MySQL in comparison to Oracle?

  1. MySQL is a free, fast, reliable, open source relational database while Oracle is expensive, although they have provided Oracle free edition to attract MySQL users.
  2. MySQL uses only just under 1 MB of RAM on your laptop while Oracle 9i installation uses 128 MB.
  3. MySQL is great for database enabled websites while Oracle is made for enterprises.
  4. MySQL is portable.

17) What are the disadvantages of MySQL?

  1. MySQL is not so efficient for large scale databases.
  2. It does not support COMMIT and STORED PROCEDURES functions version less than 5.0.
  3. Transactions are not handled very efficiently.
  4. Functionality of MySQL is highly dependent of other addons.
  5. Development is not community driven.

18) What is the difference between CHAR and VARCHAR?

  1. CHAR and VARCHAR are differ in storage and retrieval.
  2. CHAR column length is fixed while VARCHAR length is variable.
  3. The maximum no. of character CHAR data type can hold is 255 character while VARCHAR can hold up to 4000 character.
  4. CHAR is 50% faster than VARCHAR.
  5. CHAR uses static memory allocation while VARCHAR uses dynamic memory allocation.

19) What is the difference between MySQL_connect and MySQL_pconnect?

Mysql_connect:

  1. It opens a new connection to the database.
  2. Every time you need to open and close database connection, depending on the request.
  3. Opens page whenever it is loaded.

Mysql_pconnect:

  1. In Mysql_pconnect, "p" stands for persistent connection so it opens the persistent connection.
  2. The database connection cannot be closed.
  3. It is more useful if your site has more traffic because there is no need to open and close connection frequently and every time when page is loaded.

20) What does "i_am_a_dummy flag" do in MySQL?

The "i_am_a_dummy flag" enables MySQL engine to refuse any UPDATE or DELETE statement to execute if the WHERE clause is not present. Hence it can save the programmer from deleting the entire table my mistake if he does not use WHERE clause.


21) How to get the current date in MySQL?

To get current date, use the following syntax:

  1. SELECT CURRENT_DATE();    

22) What are the security alerts while using MySQL?

Install antivirus and configure the operating system's firewall.

Never use the MySQL Server as the UNIX root user.

Change root username and password Restrict or disable remote access.


23) How to change a password for an existing user via Mysqladmin?

Mysqladmin -u root -p password "newpassword".


24) What is the difference between Unix timestamps and MySQL timestamps?

Actually both Unix timestamp and MySQL timestamp are stored as 32-bit integers but MySQL timestamp is represented in readable format of YYYY-MM-DD HH:MM:SS format.


25) How to display Nth highest salary from a table in a MySQL query?

Let us take a table named the employee.

To find Nth highest salary is:

select distinct(salary)from employee order by salary desc limit n-1,1

if you want to find 3rd largest salary:

select distinct(salary)from employee order by salary desc limit 2,1


26) What is MySQL default port number?

MySQL default port number is 3306.


27) What is REGEXP?

REGEXP is a pattern match using a regular expression. A Regular expression is a powerful way of specifying a pattern for a sophisticated search.

Basically it is a special text string for describing a search pattern. To understand it better you can think of a situation of daily life when you search for .txt files to list all text files in the file manager. The regex equivalent for .txt will be .*\.txt.


28) How many columns can you create for an index?

You can create maximum of 16 indexed columns for a standard table.


29) What is the difference between NOW() and CURRENT_DATE()?

NOW() command is used to show current year, month, date with hours, minutes and seconds while CURRENT_DATE() shows the current year with month and date only.


30) What is the query to display top 20 rows?

SELECT * FROM table_name LIMIT 0,20;

31) Write a query to display current date and time?

If you want to display current date and time, use -

SELECT NOW();

If you want to display current date only, use:

SELECT CURRENT_DATE();


32) What is save point in MySQL?

A defined point in any transaction is known as savepoint.

SAVEPOINT is a statement in MySQL which is used to set a named transaction save point with a name of identifier.


33) What is SQLyog?

SQLyog program is the most popular GUI tool for admin. It is the most popular MySQL manager and admin tool. It combines the features of MySQL administrator, phpMyadmin and others MySQL front ends and MySQL GUI tools.


34) How do you backup a database in MySQl?

It is easy to back up data with phpMyAdmin. Select the database you want to backup by clicking the database name in the left-hand navigation bar. Then click the export button and make sure that all tables are highlighted that you want to back up. Then specify the option you want under export and save the output.


35) What are the different column comparison operators in MySQL?

The =, <>, <=, <, >=, >, <<, >>, < = >, AND, OR or LIKE operator are the comparison operators in MySQL. These operators are generally used with SELECT statement.


36) Write a query to count the number of rows of a table in MySQL.

SELECT COUNT user_id FROM users;


37) Write a query to retrieve a hundred books starting from 20th.

SELECT book_title FROM books LIMIT 20, 100;


38) Write a query to select all teams that won either 1, 3, 5 or 7 games.

SELECT team_name FROM team WHERE team_won IN (1, 3, 5, 7);


39) What is the default port of MySQL Server?

The default port of MySQL Server is 3306.


40) How is MyISAM table stored?

MyISAM table is stored on disk in three formats.

  • '.frm' file : storing the table definition
  • '.MYD' (MYData): data file
  • '.MYI' (MYIndex): index file

41) What is the usage of ENUMs in MySQL?

ENUMs are string objects, by defining ENUMs we allow the end user to give correct input as in case the user provides an input which is not part of the ENUM defined data then the query won't execute and an error message will be displayed which says "Wrong Query". For instance suppose we want to take the gender of the user as an input so we specify ENUM('male', 'female', 'other') and hence whenever the user tries to input any string any other than these three it results in an error.

ENUMs are used to limit the possible values that go in the table:

For example:

CREATE TABLE months (month ENUM 'January', 'February', 'March'); INSERT months VALUES ('April').

42) What are the advantages of MyISAM over InnoDB?

MyISAM follows a conservative approach to disk space management and stores each MyISAM table in a separate file, which can be further compresses, if required. On the other hand, InnoDB stores the tables in tablespace. Its further optimization is difficult.


43) What are the differences between MySQL_fetch_array(), MySQL_fetch_object(), MySQL_fetch_row()?

Mysql_fetch_object is used to retrieve the result from the database as objects while mysql_fetch_array returns result as an array. This will allow access to the data by the field names.

For example:

Using mysql_fetch_object field can be accessed as $result->name.

Using mysql_fetch_array field can be accessed as $result->[name].

Using mysql_fetch_row($result) where $result is the result resource returned from a successful query executed using the mysql_query() function.

Example:

$result = mysql_query("SELECT * from students");    
while($row = mysql_fetch_row($result))    
{    
        Some statement;    
}    

44) What is the difference between mysql_connect and mysql_pconnect?

Mysql_connect() is used to open a new connection to the database while mysql_pconnect() is used to open a persistent connection to the database. It specifies that each time the page is loaded mysql_pconnect() does not open the database.


45) What is the use of mysql_close()?

Mysql_close() cannot be used to close the persistent connection. Though it can be used to close connection opened by mysql_connect().


46) What is MySQL data directory?

MySQL data directory is a place where MySQL stores its data. Each subdirectory under this data dictionary represents a MySQL database. By default the information managed my MySQL = server mysqld is stored in data directory.


47) How do you determine the location of MySQL data directory?

The default location of MySQL data directory in windows is C:\mysql\data or C:\Program Files\MySQL\MySQL Server 5.0 \data.


48) What is the usage of regular expressions in MySQL?

In MySQL, regular expressions are used in queries for searching a pattern in a string.

Example:

The following statement retrieves all rows where column employee_name contains the text 1000 (example salary):

Select employee_name    
From employee    
Where employee_name REGEXP '1000'    
Order by employee_name   

 * Matches 0 more instances of the string preceding it.

  • + matches one more instances of the string preceding it.
  • ? Matches 0 or 1 instances of the string preceding it.
  • . Matches a single character.
  • [abc] matches a or b or z
  • | separates strings
  • ^ anchors the match from the start.
  • "." Can be used to match any single character. "|" can be used to match either of the two strings
  • REGEXP can be used to match the input characters with the database.

49) What is the usage of "i-am-a-dummy" flag in MySQL?

In MySQL, the "i-am-a-dummy" flag makes the MySQL engine to deny the UPDATE and DELETE commands unless the WHERE clause is present.


50) Which command is used to view the content of the table in MySQL?

The SELECT command is used to view the content of the table in MySQL.


51) Explain Access Control Lists.

An ACL is a list of permissions which are associated with an object. MySQL keeps the Access Control Lists cached in memory and whenever the user tries to authenticate or execute a command, MySQL checks the permission required for the object and if the permissions are available then execution completes successfully.


52) What is InnoDB?

InnoDB is a storage database for SQL. The ACID-transactions are also provided in addition InnoDB also includes support for the foreign key. Initially owned by InnobaseOY now belongs to Oracle Corporation after it acquired the latter since 2005.


53. What is ISAM?

It is a system for file management developed by IBM which allows records to access sequentially or even randomly.


54. How can we run batch mode in MySQL?

To perform batch mode in MySQL we use the following command:

mysql;

mysql mysql.out;


55. What are federated tables?

Federated tables are tables which points to the tables located on other databases on some other server.


56. What is the difference between primary key and candidate key?

To identify each row of a table, a primary key is used. For a table, there exists only one primary key.

A candidate key is a column or a set of columns which can be used to uniquely identify any record in the database without having to reference any other data.


57. What are the drivers in MySQL?

Following are the drivers available in MySQL:

  • PHP Driver
  • JDBC Driver
  • ODBC Driver
  • C WRAPPER
  • PYTHON Driver
  • PERL Driver
  • RUBY Driver
  • CAP11PHP Driver
  • Ado.net5.mxz

58. What Is DDL, DML, And DCL?

Majorly SQL commands can be divided into three categories i.e. DDL, DML & DCL. Data Definition Language (DDL) deals with all the database schemas, and it defines how the data should reside in the database. Commands like CreateTABLE and ALTER TABLE are part of DDL.

Data Manipulative Language (DML) deals with operations and manipulations on the data the commands in DML are Insert, Select etc.

Data Control Languages (DCL) are related to the Grant and permissions. In short, the authorization to access any part of database is defined by these.