1. Trang chủ
  2. » Thể loại khác

Ngôn ngữ truy vấn CSDL MySQL Trần Tiến Dũng MySQL

54 255 3

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 54
Dung lượng 0,99 MB

Nội dung

CƠ SỞ DỮ LIỆU MYSQL SERVERQuản lý csdl trong MYSQL Tạo CSDL Để tạo mới một csdl trong MySQL, ta sử dụng lệnh CREATE DATABASE theo cú pháp sau: CREATE DATABASE IF NOT EXISTS] database_n

Trang 1

CƠ SỞ DỮ LIỆU MYSQL SERVER 3

QUảN LÝ CSDL TRONG MYSQL 3

T ạO CSDL 3

L IệT KÊ CÁC CSDL CÓ TRONG MÁY CHủ M Y SQL 3

L ựA CHọN CSDL Để LÀM VIệC 3

X ÓA Bỏ CSDL 4

CÁC KIểU BảNG Dữ LIệU TRONG MYSQL 4

ISAM 4

M Y ISAM 4

I NNO DB 5

BDB 5

MERGE 5

HEAP 5

THAO TÁC VớI BảNG Dữ LIệU 5

T ạO BảNG Dữ LIệU 5

L IệT KÊ CÁC BảNG CÓ TRONG CSDL 6

C HỉNH SửA CấU TRÚC CủA MộT BảNG Dữ LIệU 6

X ÓA Bỏ BảNG Dữ LIệU 7

X ÓA TRốNG Dữ LIệU CủA BảNG 8

QUảN LÝ CHỉ MụC CủA CSDL 8

T ạO CHỉ MụC 8

X ÓA Bỏ CHỉ MụC 9

TRUY VấN Dữ LIệU Từ CÁC BảNG 9

C Ú PHÁP 10

M ệNH Đề WHERE 10

T ừ KHÓA DISTINCT 10

S ắP XếP KếT QUả VớI ORDER BY 11

C ÂU LệNH SQL IN 11

C ÂU LệNH SQL BETWEEN 13

T OÁN Tử LIKE 13

G ộP CÁC KếT QUả TÌM KIếM BằNG TOÁN Tử UNION 16

T OÁN Tử JOIN 18

S ử DụNG CÁC HÀM TÍNH TOÁN 21

CÂU LệNH INSERT, UPDATE, DELETE 22

C ÂU LệNH INSERT 22

C ÂU LệNH UPDATE 25

C ÂU LệNH DELETE 26

NHữNG KĨ THUậT THÔNG DụNG 28

S AO CHÉP BảNG Dữ LIệU TRONG M Y SQL 28

Trang 2

L ấY NGẫU NHIÊN BảNG GHI TRONG CSDL 29

N HữNG BIểU THứC THƯờNG DÙNG 30

Đ ếM Số BảNG GHI 30

C HọN N BảNG GHI ĐầU TIÊN CủA CSDL 31

S O SÁNH 2 BảNG Dữ LIệU Để TÌM RA NHữNG BảNG GHI KHÁC BIệT 32

T HAY ĐổI GIÁ TRị NULL BằNG GIÁ TRị KHÁC 33

N ốI XÂU TRONG M Y SQL 34

THủ TụC PROCEDURE 35

T Hủ TụC STORED PROCEDURE TRONG M Y SQL 36

B IếN TRONG THủ TụC THƯờNG TRÚ 37

T HAM Số CủA THủ TụC THƯờNG TRÚ 38

C ÂU LệNH ĐIềU KIệN 41

V ÒNG LặP 42

C ON TRỏ TRONG THủ THụC THƯờNG TRÚ 43

TRIGGER 46

H OạT ĐộNG CủA TRIGGER TRONG M Y SQL 47

T ạO TRIGGER 47

Q UảN LÝ TRIGGER TRONG M Y SQL 50

BảNG ảO - VIEW 50

B ảNG ảO TRONG M Y SQL 51

T ạO BảNG ảO CÓ KHả NĂNG CậP NHậT Dữ LIệU 52

Q UảN LÝ BảNG ảO TRONG M Y SQL 53

Trang 3

CƠ SỞ DỮ LIỆU MYSQL SERVER

Quản lý csdl trong MYSQL

Tạo CSDL

Để tạo mới một csdl trong MySQL, ta sử dụng lệnh CREATE DATABASE theo cú pháp sau:

CREATE DATABASE IF NOT EXISTS] database_name ;

Câu lệnh trên tạo một cssdl với tên là được chỉ ra là database_name Phần [IF NOT EXISTS] nhằm giúp ta tránh khỏi lỗi tạo một csdl mới trùng tên với một csdl đã có trong máy chủ csdl

Ví dụ: để tạo csdl classicmodels ta sử dụng cú pháp sau:

CREATE DATABASE classicmodels ;

Sau khi thực thi câu lệnh trên, MySQL sẽ thông báo thành công hoặc thất bại của việc tạo lập csdl

(Video minh họa)

Liệt kê các csdl có trong máy chủ MySQL

Câu lệnh SHOW DATABASES liệt kê tất cả các csdl có trong máy chủ MySQL Bạn có thể

sử dụng câu lệnh này để kiểm tra csdl vừa tạo hoặc để xem tên các csdl có trong máy trước khi quyết định đặt tên cho csdl sẽ tạo lập của mình

Trang 4

Sau đó ta tiến hành truy vấn, chỉnh sửa, xóa, cập nhật trên các bảng dữ liệu của csdl này

Xóa bỏ CSDL

Xóa bỏ csdl có nghĩa là bạn xóa bỏ hoàn toàn csdl của bạn ra khỏi máy Tất cả dữ liệu và các đối tượng liên quan nằm trong csdl đều bị xóa bỏ vĩnh viễn và không thể phục hồi Vì vậy cần rất thận trọng khi quyết định xóa bỏ một csdl

DROP DATABASE IF EXISTS temp_database ;

Các kiểu bảng dữ liệu trong MySQL

MySQL hỗ trợ nhiều kiểu bảng dữ liệu hoặc các máy lưu trữ khác nhau để giúp chúng ta tối ưu hóa CSDL của mình Các kiểu bảng dữ liệu trong MySQL gồm:

Đặc điểm quan trọng nhất để phân biệt các kiểu bảng dữ liệu ở trên là tính có an toàn giao tác hoặc không Chỉ các bảng dữ liệu kiểu InnoDB và BDB là có tính an toàn giao tác (transaction)

và chỉ những bảng dữ liệu kiểu MyISAM hỗ trợ chỉ mục toàn văn bản (full text index) và các đặc tính tìm kiếm MyISAM cũng là kiểu bảng dữ liệu mặc định khi bạn tạo bảng dữ liệu mới mà không khai báo kiểu bảng dữ liệu cụ thể Dưới đây là những đặc điểm chính của từng kiểu bảng

Trang 5

InnoDB

Khác với bảng dữ liệu kiểu MyISAM, bảng dữ liệu kiểu InnoDB có đặc tính an toàn giao tác và

hỗ trợ khóa dòng (row level locking) Các khóa ngoại được hỗ trợ trong kiểu InnoDB Tập tin dữ liệu của bảng dữ liệu kiểu InnoDB có thể lưu trữ ở nhiều file khác nhau Vì thế dung lượng của bảng InnoDB phụ thuộc vào dung lượng của ổ đĩa Giống như bảng dữ liệu kiểu MyISAM, tập tin dữ liệu của InnoDB có thể chuyển từ hệ thống này sang hệ thống khác Điểm bất lợi của InnoDB so với MyISAM là nó cần nhiều không gian lưu trữ

HEAP

Bảng dữ liệu kiểu Heap được lưu trữ trong bộ nhớ Do đó, nó là kiểu bảng được thao tác nhanh nhất Do bởi cơ chế lưu trữ, dữ liệu sẽ bị mất đi khi máy tính không còn nguồn điện và đối khi nó còn có thể gây ra tình trạng tràn bộ nhớ đối với máy chủ csdl Các bảng Heap không hỗ trợ những trường có kiểu AUTO_INCREMENT, BLOB và TEXT

Thao tác với bảng dữ liệu

Các bảng trong csdl là những thành phần quan trọng nhất của một csdl quan hệ Làm thế nào để tạo các bảng dữ liệu chính xác là công việc cốt yếu khi bạn thao tác với các hệ quản trị csdl đặc biệt là với MySQL Trong bài học này, bạn sẽ học cách tạo một bảng dữ liệu đơn giản và cách hiển thị tất cả các bảng dữ liệu có trong một csdl

Trang 6

· Mệnh đề IF NOT EXISTS giúp bạn gặp lỗi khi tạo ra một bảng mới trùng tên với một bảng khác đã có trong csdl

· Table_name là tên của bảng dữ liệu mà bạn muốn tạo Tiếp theo bạn định nghĩa các cột (các

trường) theo mẫu sau: column_name data_type(size) [NOT] NULL

· Bạn có thể chỉ ra kiểu bảng dữ liệu dùng cho bảng dữ liệu của mình

Ví dụ 1:

CREATE TABLE employees (

employeeNumber int( 11 ) NOT NULL,

lastName varchar( 50 ) NOT NULL,

firstName varchar( 50 ) NOT NULL,

extension varchar( 10 ) NOT NULL,

email varchar( 100 ) NOT NULL,

officeCode varchar( 10 ) NOT NULL,

reportsTo int( 11 ) default NULL,

jobTitle varchar( 50 ) NOT NULL,

PRIMARY KEY ( employeeNumber )

);

Ví dụ 2: CREATE TABLE payments (

customerNumber int( 11 ) NOT NULL,

checkNumber varchar( 50 ) NOT NULL,

paymentDate datetime NOT NULL,

amount double NOT NULL,

PRIMARY KEY ( customerNumber , checkNumber ) );

Liệt kê các bảng có trong csdl Để hiển thị các bảng có trong csdl ta sử dụng câu lệnh SHOW TABLES Ví dụ: SHOW TABLES; Trong một vài trường hợp chúng ta có thể muốn xem cấu trúc của một bảng dữ liệu Để thực hiện yêu cầu này, sử dụng câu lệnh DESCRIBE table_name; Ví dụ: DESCRIBE employees ; Chỉnh sửa cấu trúc của một bảng dữ liệu Cú pháp của lệnh chỉnh sửa cấu trúc bảng dữ liệu như sau: ALTER IGNORE] TABLE table_name options [, options ]

Trang 7

ADD COLUMN] create_definition [ FIRST | AFTER col_name ]

or ADD COLUMN] ( create_definition , create_definition , )

or ADD INDEX index_name ] ( index_col_name , )

or ADD PRIMARY KEY index_col_name , )

or ADD UNIQUE index_name ] ( index_col_name , )

or ALTER COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}

or CHANGE COLUMN] old_col_name create_definition

or MODIFY COLUMN] create_definition [ FIRST | AFTER col_name ]

or DROP COLUMN] col_name

or DROP PRIMARY KEY

or DROP INDEX index_name

· RENAME cho phép bạn đổi tên của một bảng dữ liệu

(Video minh họa thực hiện các thao tác trên bằng câu lệnh và bằng giao diện đồ họa)

Xóa bỏ bảng dữ liệu

Để xóa bảng dữ liệu ra khỏi csdl ta dùng lệnh

DROP TEMPORARY] TABLE IF EXISTS] table_name [, table_name , ]

Từ khóa TEMPORARY được sử dụng để xóa các bảng tạm MySQL cho phép bạn xóa nhiều bảng cùng một lúc

(Video minh họa – sau khi DROP thì SHOW TABLES sẽ không còn bảng đã xóa)

Trang 8

Xóa trống dữ liệu của bảng

Trong một vài trường hợp, bạn muốn xóa tất cả dữ liệu của bảng một cách nhanh chóng và thiết lập lại các chỉ số tăng tự động của các cột dữ liệu MySQL cho phép bạn thực hiện điều này với câu lệnh sau:

TRUNCATE TABLE table_name

Ghi chú:

· Câu lệnh TRUNCATE TABLE xóa bỏ bảng dữ liệu rồi sau đó tạo lại chính bảng đó, câu lệnh này không hỗ trợ tính an toàn giao tác

· Số các dòng bị xóa không được báo lại như câu lệnh DELETE TABLE

· Các trigger theo dõi thao tác DELETE sẽ không bị kích hoạt bởi vì câu lệnh TRUNCATE TABLE không sử dụng đến lệnh DELETE

Quản lý chỉ mục của CSDL

Các chỉ mục của CSDL giúp tăng tốc độ thực thi việc trích rút dữ liệu từ máy chủ CSDL MySQL Khi trích rút dữ liệu từ bảng dữ liệu , trước tiên MySQL sẽ kiểm tra có chỉ mục nào trên bảng đó hay không Nếu có, nó sẽ sử dụng chỉ mục để lựa chọn chính xác những dòng dữ liệu mà không cần phải quét qua toàn bộ bảng dữ liệu

Nói chung, người ta khuyến khích bạn tạo chỉ mục trên những trường (cột) mà bạn thường xuyên trích rút dữ liệu Ví dụ như các cột hay sử dụng để nối bảng hay sắp xếp Lưu ý: tất cả các khóa chính đồng thời là các chỉ mục chính của bảng dữ liệu

Tại sao lại không lập chỉ mục cho tất cả các trường (cột)? Điểm quan trọng nhất là việc xây dựng

và duy trì một bảng chỉ mục chiếm khá nhiều thời gian và không gian lưu trữ của CSDL Thêm vào đó khi thực hiện các thao tác thêm mới, cập nhật hay xóa dữ liệu khỏi bảng thì chỉ mục cũng phải được xây dựng lại và do đó nó làm giảm hiệu năng của hệ thống khi thay đổi dữ liệu trong bảng

Tạo chỉ mục

Thông thường, bạn tạo chỉ mục cùng lúc với tạo bảng dữ liệu Bất cứ cột nào được khai báo là PRIMARY KEY, KEY, UNIQUE hay INDEX đều sẽ được MySQL tự động lập chỉ mục Ngoài

ra, bạn còn có thể thêm chỉ mục cho bảng đã chứa dữ liệu bằng cách sử dụng câu lệnh sau:

CREATE UNIQUE| FULLTEXT | SPATIAL ] INDEX index_name

USING BTREE | HASH | RTREE ]

Trang 9

Lưu ý:

· UNIQUE có nghĩa là MySQL sẽ tạo ràng buộc trên tất cả các giá trị của cột đều phải phân biệt lẫn nhau Tuy nhiên giá trị NULL lại có thể được lặp ngoại trừ đối với bảng dữ liệu kiểu BDB

· Chỉ mục FULLTEXT chỉ được hỗ trợ bởi MyISAM và chỉ hợp lệ đối với những trường có kiểu CHAR, VARCHAR hay TEXT

· Chỉ mục SPATIAL hỗ trợ cột trong bảng kiểu MyISAM Lưu ý, giá trị của cột không thể là NULL

Tiếp theo bạn quyết định kiểu chỉ mục là as BTREE, HASH or RTREE Điều này cũng phải dựa trên kiểu của bảng dữ liệu Tham khảo bảng sau:

Kiểu bảng dữ liệu Kiểu chỉ mục hợp lệ

MEMORY/HEAP HASH, BTREE

Cuối cùng, bạn khai báo cột nào sẽ được lập chỉ mục

Trong csdl mẫu của chúng ta, bạn có thể tạo chỉ mục trên cột officeCode của bảng employees để tạo thuận tiện cho thao tác nối (join) với bảng office diễn ra được nhanh hơn Câu lệnh SQL thực hiện điều này như sau:

CREATE INDEX officeCode ON employees(officeCode)

Xóa bỏ chỉ mục

Để xóa bỏ chỉ mục ta sử dụng câu lệnh với cú pháp như sau:

DROP INDEX index_name ON table_name

Trang 10

Cú pháp

Cú pháp chung của một câu truy vấn SELECT như sau:

SELECT column_name1 , column_name2

Ví dụ 1: để truy vấn tất cả các cột của bảng office ta có câu truy vấn như sau:

SELECT * FROM employees

Ví dụ 2: để xem một phần dữ liệu của bảng ta liệt kê tên các cột cần truy vấn sau từ khóa SELECT

SELECT lastname , firstname , jobtitle

FROM employees

Mệnh đề WHERE

Mệnh đề WHERE của câu lệnh SELECT cho phép bạn chọn ra các dòng phù hợp với điều kiện lọc Bạn sử dụng mệnh đề WHERE để lọc ra những bảng ghi mà bạn muốn xem

Ví dụ: chúng ta muốn tìm ra chủ tịch của công ty

SELECT firstname , lastname , email

Trang 11

SELECT DISTINCT jobTitle FROM employees ;

Sắp xếp kết quả với ORDER BY

Mệnh đề ORDER BY cho phép bạn sắp xếp tập kết quả trên một hoặc nhiều cột theo thứ tự tăng dần hoặc giảm dần Để sắp xếp tập kết quả tăng dần theo giá trị một cột nào đó ta thêm vào từ khóa ASC sau tên cột đó, và ngược lại đối với từ khóa DESC

Ví dụ: để sắp xếp tên của nhân viên theo tên (tăng dần) và chức danh (giảm dần) ta thực thi câu truy vấn sau:

SELECT firstname , lastname , jobtitle

WHERE column IN "list_item1" , "list_item2" …

Ngoài ra bạn còn có thể sử dụng toán tử NOT để thực hiền phép phủ định trên điều kiện lọc

Ví dụ 1

Bạn muốn tìm ra tất cả các văn phòng ở Mỹ và Pháp, câu truy vấn có dạng như sau

SELECT officeCode , city , phone

WHERE country = 'USA' OR country = 'France'

Câu truy vấn trên có thể viết lại bằng cách sử dụng SQL…IN như sau:

SELECT officeCode , city , phone

Trang 12

Trước tiên, chọn ra tất cả các hóa đơn có tổng chi phí lớn hơn $60000 Bạn ấy thông tin này từ bảng OrderDetails như sau:

SELECT orderNumber

GROUP BY orderNumber

HAVING SUM ( quantityOrdered * priceEach ) > 60000

Tiếp theo, bạn sử dụng câu truy vấn con với SQL IN như sau:

SELECT orderNumber , customerNumber ,status, shippedDate

Trang 13

Câu lệnh SQL BETWEEN

Cú pháp

SELECT column_list

WHERE column_1 BETWEEN lower_range AND upper_range

MySQL trả về tất cả các bảng ghi có giá trị của column_1 nằm trong vùng lower_range và

upper_range Câu truy vấn tương đương với SQL BETWEEN là

Tìm ra tất cả các sản phẩm có giá mua nằm trong từ 90$ đến 100$

SELECT productCode , ProductName , buyPrice

WHERE buyPrice BETWEEN 90 AND 100

ORDER BY buyPrice DESC

Ví dụ 2

Để tìm tất cả các sản phẩm có giá mua không nằm trong vùng 20$ đến 100$

SELECT productCode , ProductName , buyPrice

WHERE buyPrice NOT BETWEEN 20 AND 100

ORDER BY buyPrice DESC

Câu truy vấn trên tương đương với câu truy vấn sau:

SELECT productCode , ProductName , buyPrice

WHERE buyPrice < 20 OR buyPrice > 100

ORDER BY buyPrice DESC

Toán tử LIKE

Toán tử LIKE thường được sử dụng khi trích chọn dữ liệu theo một mẫu lọc nào đó Trong bài học này, chúng ta sẽ tìm hiểu cách sử dụng toán tử LIKE như thế nào và khi nào nên tránh dùng toán tử LIKE để tăng tốc độ trích rút dữ liệu từ các bảng

Trang 14

Toán tử LIKE thường được sử dụng trong mệnh đề WHERE của câu lệnh SELECT MySQL cung cấp hai kí hiệu thay thế được sử dụng trong toán tử LIKE:

· Kí hiệu (%) là kí tự đại diện cho một xâu bất kì

· Kí hiệu (_) là kí tự đại diện cho một kí tự đơn lẻ duy nhất

Tìm tất cả nhân viên mà giá trị của trường lastname kết thúc bằng ‘on’

SELECT employeeNumber , lastName , firstName

WHERE lastName LIKE '%on'

Ví dụ 3

Tìm tất cả nhân viên trong bảng employees mà giá trị của trường lastname có chứa ‘on’

SELECT employeeNumber , lastName , firstName

Trang 15

SELECT employeeNumber , lastName , firstName

WHERE firstName LIKE 'T_m'

MySQL cho phép bạn dùng toán tử NOT kết hợp với toán tử LIKE

Ví dụ 5

Tìm tất cả nhân viên mà giá trị của trường lastname không bắt đầu bằng kí tự B

SELECT employeeNumber , lastName , firstName

WHERE lastName NOT LIKE 'B%'

Chú ý: toán tử LIKE không phân biệt chữ hoa hay chữ thường

Điều gì sẽ xảy ra nếu bạn muốn tìm kiếm những bảng ghi mà trong điều kiện lọc lại có chứa kí tự thay thế?

Ví dụ 6

Tìm tất cả sản phẩm có mà giá trị của trường productCode có chứa ‘_20’

SELECT productCode , productName

WHERE productCode LIKE '% \_ 20%'

Lưu ý: do SQL LIKE quét toàn bộ bảng dữ liệu để tìm những bảng ghi thỏa mãn yêu cầu tìm

kiếm nên nó không cho phép máy chủ dữ liệu sử dụng chỉ mục trong quá trình tìm kiếm này Khi

dữ liệu trong bảng là đủ lớn thì hiệu năng của toán tử SQL LIKE sẽ giảm đi Trong một vài trường hợp bạn cần tránh sử dụng SQL LIKE mà thay vào đó bằng những kĩ thuật khác để đạt được kết quả tương tự như SQL LIKE

Trang 16

WHERE LEFT( lastname , length ( @str )) @str ;

Hay: Tìm tất cả nhân viên mà giá trị của trường lastname kết thúc bằng ‘on’

SELECT employeeNumber , lastName , firstName

WHERE RIGHT lastname , length ( @str )) @str ;

Gộp các kết quả tìm kiếm bằng toán tử UNION

Cú pháp

SELECT statement

SELECT statement

Để sử dụng được lệnh UNION, cần thỏa mãn các điều kiện sau:

· Số cột của mỗi câu truy vấn SELECT phải bằng nhau

· Kiểu dữ liệu của mỗi cột trong câu SELECT này phải giống với kiểu dữ liệu của cột tương ứng trong câu SELECT kia hay tối thiểu cũng có thể chuyển đổi được

Kết nối thông tin về khách hàng và nhân viên vào trong một tập kết quả

SELECT customerNumber id , contactLastname name

UNION

Trang 17

SELECT employeeNumber id , firstname name

Lưu ý

Khi sử dụng ORDER BY để sắp xếp kết quả với UNION thì bạn phải đặt mệnh đề ORDER BY này ở câu lệnh SELECT cuối cùng Cách tốt nhất là đặt tất cả các câu truy vấn SELECT trong cặp dấu () và cuối cùng là mệnh đề ORDER BY

Xét câu truy vấn sau

(SELECT customerNumber , contactLastname

Trang 18

Để sắp xếp tập kết quả, thay vì ta chỉ ra tên cột cần sắp xếp trong mệnh đề ORDER BY, ta có thể chỉ ra số thứ tự của cột được lựa chọn làm tiêu chí sắp xếp

Ví dụ 4

Xét câu truy vấn sau:

(SELECT customerNumber , contactLastname

Cú pháp

SELECT column_list FROM table_1

INNER LEFT RIGHT] table_2 ON conditions_2

INNER LEFT RIGHT] table_3 ON conditions_3 .

· hoặc sử dụng bí danh của bảng dữ liệu

· Tiếp đến, bạn chỉ ra bảng chính và bảng muốn nối vào

· Bạn có thể sử dụng phép nối INNER JOIN, LEFT JOIN hay RIGHT JOIN

Trang 19

· Bạn có thể nối bảng này với hai hay nhiều bảng khác và thậm chí là nối với chính nó (SELF JOIN)

· Trong mệnh đề JOIN, bạn phải khai báo điều kiện kết nối

Sử dụng phép nối INNER JOIN

INNER JOIN được sử dụng để lấy dữ liệu từ tất cả các bảng được liệt kê sau từ khóa ON Nếu điều kiện nối không thỏa mãn, thì kết quả là rỗng

Ví dụ 1

Xét 2 bảng dữ liệu employees và offices Hai bảng này được nối với nhau bởi cột officeCode Để tìm ra bản quốc và quê quán của từng nhân viên ta sử dụng phép nối inner join trong câu truy vấn SELECT như sau

SELECT employees firstname ,

INNER JOIN offices

INNER JOIN offices p

Sử dụng phép nối LEFT JOIN và RIGHT JOIN

LEFT JOIN được sử dụng khi bạn muốn lấy dữ liệu từ bảng chính (table_1) ngay cả trong trường hợp điều kiện nối với các bảng khác (table_2, ) không được thỏa mãn

RIGHT JOIN được sử dụng khi bạn muốn lấy dữ liệu ở các bảng (table_2, table_3, ) ngay cả khi điều kiện nối với bảng chính (table_1) không được thỏa mãn

Ví dụ 1

Xét CSDL mẫu của chúng ta, khi công ty muốn thiết lập một văn phòng mới cần thêm vào dữ liệu về văn phòng mới thiết lập như sau:

Trang 20

INSERT INTO classicmodels offices

Tại thời điểm này công ty chưa tuyển dụng nhân viên mới cho văn phòng vừa mới thiết lập Điều

đó có nghĩa là văn phòng mới không có nhân viên nào cả

Nếu chúng ta muốn biết tất cả các nhân viên của công ty thuộc về văn phòng cụ thể nào và danh sách tất cả các văn phòng của công ty thì ta sử dụng phép nối RIGHT JOIN với câu truy vấn như sau:

SELECT firstname ,

addressLine1

RIGHT JOIN offices o ON o officeCode = e officeCode

Ghi chú: như bạn thấy trong tập kết quả trả về của câu truy vấn trên, phép nối RIGHT JOIN lấy tất cả dữ liệu từ bảng thứ 2 (offices) và những dữ liệu phù hợp điều kiện kết nối của bảng thứ nhất

Nối bảng với chính nó

Bạn có thể sử dụng mệnh đề JOIN để nối một bảng với chính bản thân nó Xét ví dụ sau:

Ví dụ 1

SELECT concat ( firstname , ',' , lastname ) AS employee ,

INNER JOIN employees AS e ON m employeeNumber = e reportsTo

ORDER BY employee

Trang 21

Sử dụng các hàm tính toán

Trong một vài trường hợp, thông tin chúng ta cần biết lại không lưu trữ trong các bảng dữ liệu

mà cần phải trải qua một số phép tính Ví dụ, chúng ta có bảng chi tiết hóa đơn (orderDetails) dùng để lưu trữ dữ liệu về đơn đặt hàng Và rõ ràng là chúng ta không biết tổng số tiền bán hàng của từng hóa đơn nếu chỉ nhìn đơn thuần vào bảng dữ liệu orderDetails Sử dụng các hàm tính toán sẽ giúp chúng ta giải quyết yêu cầu này

Theo định nghĩa, các hàm tính toán cho phép chúng ta thực hiện phép tính trên một tập các bảng

ghi và trả về một giá trị duy nhất Các hàm tính toán bỏ qua những giá trị NULL trong khi thực

hiện phép tính của mình (ngoại trừ hàm COUNT)

Các hàm tính toán thường được sử dụng với mệnh đề GROUP BY của câu lệnh SELECT

Sau đây là một số hàm tính toán thông dụng được MySQL hỗ trợ

Trang 22

SELECT AVG ( buyPrice ) average_buy_price

SELECT MAX ( buyPrice ) highest_price ,

Hàm COUNT

Ví dụ

Để đếm có tất cả bao nhiêu sản phẩm mà công ty đang kinh doanh

SELECT COUNT (*) AS Total

INSERT LOW_PRIORITY DELAYED] [IGNORE]

INSERT LOW_PRIORITY DELAYED] [IGNORE]

INSERT LOW_PRIORITY DELAYED] [IGNORE]

Trang 23

Dạng thứ 2 của câu lệnh INSERT được sử dụng khi ta tiến hành đưa dữ liệu vào bảng mà dữ liệu

đó được lấy từ bảng khác thông qua câu lệnh SELECT Giả sử chúng ta tạo ra một bảng tạm và rồi đưa tất cả các văn phòng đặt tại Mỹ của công ty vào bảng tạm đó Câu lệnh tương ứng như sau:

INSERT INTO temp_table

SELECT FROM offices WHERE country = 'US'

Ví dụ 3

Dạng thứ 3 của câu lệnh INSERT được sử dụng khi bạn muốn chỉ ra cụ thể dữ liệu sẽ được đưa vào cột nào của bảng dữ liệu

INSERT INTO productlines

Trang 24

Điều này có nghĩa ta chỉ đưa dữ liệu vào cột productLine

Trang 25

Câu lệnh UPDATE

Cập nhật hay thay đổi giá trị hiện có trong csdl là một trong những thao tác quan trọng nhất khi làm việc với CSDL Câu lệnh UPDATE được sử dụng với mục đích này Nó có thể thay đổi giá trị của một hay nhiều dòng trong bảng dữ liệu

Cú pháp:

UPDATE LOW_ PRIORITY ] [IGNORE] table_name [, table_name ]

[WHERE condition ]

Ghi chú:

· Theo sau từ khóa UPDATE là tên bảng dữ liệu mà bạn muốn thay đổi dữ liệu Trong

MySQL, bạn có thể thay đổi dữ liệu ở nhiều bảng khác nhau cùng lúc Nếu một câu lệnh

UPDATE gây lỗi không đảm bảo ráng buộc toàn vẹn của CSDL thì MySQL sẽ không thực hiện câu lệnh update đó và sẽ báo lỗi

· Mệnh đề SET xác định cột nào sẽ tiến hành thay đổi gía trị Giá trị thay đổi có thể là một hằng số, biểu thức hay thậm chí là một câu truy vấn con

· Mệnh đề WHERE xác định dòng nào của bảng sẽ được thay đổi giá trị Đây là phần quan trọng của câu lệnh UPDATE Bới nếu bỏ qua không khai báo mệnh đề này thì lệnh UPDATE sẽ tiến hành thay đổi giá trị của cột đã chỉ ra trên toàn bộ bảng

· Từ khóa LOW_PRIORITY được dùng để trì hoãn việc thực thi câu lệnh UPDATE cho đến khi không có bất kì ứng dụng khách nào đọc dữ liệu trên CSDL nữa thì mới tiến hành thực hiện câu lệnh UPDATE

· Từ khóa IGNORE được sử dụng để chỉ ra cần thực thi lệnh update ngay cả khi xảy ra lỗi trong quá trình thực hiện câu lệnh UPDATE

Ví dụ 1:

Xét bảng employees, nếu bạn muốn thay đổi địa chỉ email của nhân viên có employeeNumber =

1 thì tiến hành như sau:

SELECT firstname ,

Trang 26

lastname ,

email

WHERE employeeNumber = 1

(Xem e-mail hiện tại)

Thay đổi địa chỉ email

Cú pháp câu lệnh DELETE trong MySQL có 3 dạng như sau:

DELETE LOW_PRIORITY] [ QUICK ]

[WHERE conditions ] [ORDER BY ] LIMIT rows ]

DELETE LOW_PRIORITY] [ QUICK ]

FROM table-references

WHERE where_definition ]

DELETE LOW_PRIORITY] [ QUICK ]

Trang 27

USING table-references

[WHERE where_definition ]

Ghi chú:

· Dạng thứ nhất: theo sau DELETE FROM là tên bảng dữ liệu mà bạn muốn xóa dữ liệu Mệnh đề WHERE chỉ ra điều kiện lọc những bảng ghi cần xóa Nếu một bảng ghi thỏa mãn điều kiện chỉ ra trong mệnh đề WHERE thì nó sẽ bị xóa Nếu không khai báo mệnh đề WHERE thì toàn bộ dữ liệu của bảng sẽ bị xóa

· Dạng thứ hai: MySQL cho phép bạn xóa các dòng trên nhiều bảng dữ liệu

· Dạng thứ ba: tương tự với dạng thứ hai nhưng thay vì sử dụng từ khóa FROM thì nó lại sử dụng từ khóa USING

Ví dụ 1:

Nếu bạn muốn xóa tất cả nhân viên của văn phòng có mã số là 4 thì

DELETE FROM employees

WHERE officeCode = 4

Nếu bạn muốn xóa toàn bộ dữ liệu của bảng employees thì

DELETE FROM employees

Ví dụ 2:

Nếu bạn muốn xóa tất cả nhân viên làm việc trong văn phòng 1 và xóa luôn cả văn phòng 1 thì

DELETE employees , offices

WHERE employees officeCode = offices officeCode AND

Ví dụ 3:

Cùng yêu cầu như ví dụ 2 nhưng sử dụng dạng 3 của câu lệnh DELETE

DELETE FROM employees , offices

USING employees , offices

Ngày đăng: 21/01/2018, 11:11

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w