Quá trình thực hiện truy vấn như sau: với mỗi dòng sản phẩm của truy vấn bên ngoài, câu lệnh truy vấn bên trong sẽ tìm ra số lượng sản phẩm trung bình của của sản phẩm cùng loại với sả[r]
(1)TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
KHOA CÔNG NGHỆ THÔNG TIN
-oOo -
BÀI GIẢNG
THỰC HÀNH CƠ SỞ DỮ LIỆU
Giảng viên:
ThS Vũ Bá Duy
ThS Dư Phương Hạnh ThS Lê Hồng Hải
(2)Lời nói đầu
Cài đặt hệ quản trị CSDL quản lý CSDL
1. Cài đặt hệ quản trị CSDL MySQL Server 3
2. Cấu trúc MyQSL Server 7
3. Kết nối tới MySQL server 9
4. Tạo, xóa sở liệu (CSDL) 12
Bài thực hành số 14
Các kiểu liệu Tạo sửa đổi cấu trúc bảng 14
1. Các kiểu liệu 14
2. Tạo bảng Cơ sở liệu 16
3. Thay đổi cấu trúc bảng 22
4. Xóa bảng 24
Bài tập thực hành 24
Bài thực hành số 26
Truy vấn (phần 1) 26
1. Cài đặt cở sở liệu mẫu 26
2. Thực truy vấn với câu lệnh SELECT 27
3. Mệnh đề WHERE 30
4. Kết nối điều kiện với toán tử AND OR 31
5. IS NULL: m giá trị không xác định 32
6. Từ khoá DISTINCT 33
7. Giới hạn số lượng kết với LIMIT 34
Bài tập thực hành: 36
Bài thực hành số 37
Truy vấn (phần 2) 37
1. Toán tử IN 37
2. Toán tử BETWEEN 38
3. Toán tử LIKE 40
4. Thuộc tính suy diễn (Derived Attribute) 44
5. Sắp xếp kết với ORDER BY 45
(3) Bài tập thực hành: 51
Bài thực hành số 52
Các hàm xử lý MySQL 52
1. Hàm xử lý chuỗi SUBSTRING 52
2. Hàm CONCAT 53
3. Hàm REPLACE 56
4. Hàm IF 57
5. Hàm LAST_INSERT_ID 59
6. Hàm DATEDIFF 61
7. Hàm ADDDATE, EXTRACT 62
Bài tập thực hành: 66
Bài thực hành số 67
Truy vấn nhóm 67
1. Các hàm nhóm 67
2. Mệnh đề nhóm GROUP BY 69
3. Mệnh đề điều kiện HAVING 73
Bài tập thực hành 75
Bài thực hành số 76
Các phép nối bảng liệu 76
1. PHÉP NỐI TRONG (INNER JOIN) 76
2. PHÉP NỐI TRÁI (LEFT JOIN) 83
3. PHÉP TỰ NỐI (Self Join) 87
Bài tập thực hành: 88
Bài thực hành số 89
Truy vấn (Subquery) 89
1. Khái niệm truy vấn 89
2. Truy vấn không tương quan 89
3. Truy vấn tương quan 91
4. Sử dụng truy vấn 92
Bài tập thực hành 95
Bài thực hành số 96
(4)1. Câu lệnh INSERT 96
2. Câu lệnh UPDATE 99
3. Câu lệnh DELETE 100
4. Cập nhật liệu có ràng buộc 102
Bài tập thực hành 104
Bài thực hành số 10 105
Mơ hình hóa CSDL sử dụng cơng cụ MySQL Workbench 105
1. Giới thiệu MySQL Workbench 105
2. Tạo mơ hình quan hệ thực thể EER 106
3. Tạo CSDL từ mơ hình quan hệ thực thể EER 113
4. Đồng hóa mơ hình EER với CSDL MySQL Server 114
5. Tạo mơ hình quan hệ thực thể EER từ CSDL có sẵn 116
(5)1 Lời nói đầu
Hiện có nhiều phần mềm Hệ quản trị sở liệu theo mơ hình quan hệ (Relational DBMS) khác nhau, may mắn hệ quản trị sở liệu sử dụng chung ngôn ngữ gọi SQL (Structured Query Language- Ngôn ngữ truy vấn có cấu trúc) Các hệ quản trị sở liệu hỗ trợ chuẩn ANSI 2003 SQL
Có thể nói ngơn ngữ SQL yếu tố đóng góp cho thành công sở liệu quan hệ Đây ngôn ngữ mức cao nên người dùng cần viết lệnh thực để đạt kết truy vấn, phần tính tốn tối ưu hóa câu lệnh hệ quản trị đảm nhận
SQL bao gồm ba phần chính:
Ngơn ngữ thao tác liệu (Data manipulation language - DML): sử dụng để
lưu trữ, sửa đổi truy xuất liệu từ CSDL Có thành phần tiêu chuẩn dùng để thêm, cập nhật xóa liệu delete data
Ngôn ngữ định nghĩa liệu (Data definition language - DDL): sử dụng để
định nghĩa cấu trúc liệu Các câu lệnh dùng để định nghĩa cấu trúc sở liệu, bao gồm định nghĩa hàng, cột, bảng liệu, số số thuộc tính khác liên quan đến sở liệu
Ngôn ngữ điều khiển liệu (Data control language - DCL): sử dụng để
quản lý truy cập tới liệu người dùng
Nội dung thực hành tập trung chủ yếu vào hai phần ngôn ngữ DML DDL sử dụng DBMS mã nguồn mở MySQL server 5.5 làm công cụ thực hành Nội dung giảng chủ yếu thao tác, câu lệnh truy vấn, khai thác liệu minh họa phần lý thuyết môn học mà không nhằm tới việc sử dụng hay khai thác toàn Hệ quản trị sở liệu MySQL
(6)2
(7)3 Bài thực hành số
Cài đặt hệ quản trị CSDL quản lý CSDL
Nội dung
- Cài đặt MySQL server, thiết lập cổng làm việc, tạo tài khoản quản lý; kết nối với MySQL server
- Cấu trúc thư mục MySQL, ý nghĩa thư mục - Làm quen với thao tác tạo sở liệu
1 Cài đặt hệ quản trị CSDL MySQL Server
MySQL Server chạy nhiều tảng khác Linux, Windows, Mac, FreeBSD, Unix MySQL Server cài đặt từ cài đặt cài đặt biên dịch từ mã nguồn mở MySQL Server tải từ địa http://dev.mysql.com/downloads/mysql/ Phần minh họa trình cài đặt hệ điều hành MS Windows
Cài đặt hệ điều hành MS Windows
Sau thực trình cài đặt Window, trình cài đặt MySQL Server bắt đầu qua bước sau:
Bước 1: Lựa chọn kiểu server
Chúng ta lựa chọn kiểu server sau:
Developer Machine: Lựa chọn thích hợp cài đặt làm máy phát triển Với cấu hình này, MySQL sử dụng số lượng nhớ tối thiểu
(8)4
Dedicated MySQL Server Machine: Thích hợp cho máy tính chủ yếu làm server sở liệu (Database Server) Trong cấu hình này, MySQL sử dụng tối đa số lượng nhớ hệ thống
(9)5
Decision Support: thích hợp với ứng dụng khơng u cầu số lượng kết nối đồng thời cao
OLTP: thích hợp với ứng dụng yêu cầu số lượng kết nối đồng thời cao, webserver có tải lớn
Manual Setting: cho phép người sử dụng tự thiết lập số kết nối đồng thời
Bước 3: Xác định cổng làm việc MySQL Server
Với việc lựa chọn TCP/IP cho phép máy kết nối theo giao thức TCP/IP; ngược lại, cho phép kết nối cục Khi lựa chọn TCP/IP, phải xác định Port Number: số hiệu cổng làm việc MySQL server Cổng ngầm định MySQL 3306
Enable Strict Mode: tùy chọn sử dụng, không cho phép đưa giá trị khơng hợp lệ vào bảng liệu: ví dụ liệu NULL vào cột NOT NULL
(10)6
Standard Character Set: ngầm định sử dụng tập chữ latin (ANSI)
Best Support for Multilingualism: Với lựa chọn này, Unicode UTF8 ngầm định sử dụng (thích hợp với Việt Nam)
Manual Selected Default Character Set/Collation: cho phép lựa chọn hệ kí tự cụ thể khác hộp Character set
(11)7
Bước thiết lập mật cho tài khoản root quản trị hệ thống
Nếu Enable root access from remote machines chọn Tài khoản đăng nhập quản trị MySQL từ máy tính xa
Anonymous Account: lựa chọn, người dùng đăng nhập vào hệ thống (chỉ nên sử dụng q trình phát triển, kiểm thử, khơng sử dụng triển khai hệ thống)
2 Cấu trúc MyQSL Server
File cấu hình
Tất cấu hình cài đặt hệ thống lưu lại file cấu hình Tên file my.ini sử dụng Windows my.cnf Linux, Unix, Mac Nội dung
file cấu sau (dịng bắt đầu kí tự # dịng thích):
(12)8
port=3306
# Path to installation directory All paths are
# usually resolved relative to this
basedir="C:/Program Files/MySQL/MySQL Server 5.5/"
# Path to the database root
datadir="C:/Program Files/MySQL/MySQL Server 5.5/Data/"
Tùy chọn port: xác định số hiệu cổng làm việc MySQL Server Tùy chọn basedir: thư mục cài đặt MySQL server
Tùy chọn datadir: đường dẫn tới thư mục lưu trữ liệu
Gợi ý: Người sử dụng nên sử dụng thư mục làm việc thư mục lưu trữ liệu khác với
cài đặt ngầm định để tăng tính bảo mật hệ thống
Cấu trúc thư mục MySQL
Thư mục Nội dung
bin File nhị phân - mysqld chương trình server, tất chương trình khách
và cơng cụ để sử dụng quản trị MySQL server
data Nơi MySQL lưu trữ (đọc ghi) liệu, file log server
include Tập file header, sử dụng viết biên dịch chương trình sử dụng thư viện MySQL
lib Các file thư viện MySQL
(13)9
share SQL scripts để sửa đặc quyền, tập file ngôn ngữ
Thư mục Bin chứa file chương trình MySQL Dưới mơ tả số chương trình thư mục:
Tên chương trình Mơ tả chức
mysqld MySQL server
mysql Công cụ khách giúp thực thi tương tác câu lệnh SQL
mysqladmin Trợ giúp tác vụ quản trị khác (hiện thị trạng thái, tắt server, )
mysqldump Lưu nội dung CSDL MySQL
mysqlimport Nhập liệu vào bảng từ file
mysqlshow Hiển thị thông tin CSDL, bảng, cột
myisamchk Kiểm tra toàn vẹn file bảng MyISAM sửa chữa
mysqlcheck Thực tác vụ bảo trì bảng
3 Kết nối tới MySQL server
Trước hết đảm bảo MySQL Server bật sau trình cài đặt
Một cách khác khởi động MySQL Server trực tiếp thơng qua câu lệnh sau từ giao diên dòng lệnh command line
basedir\mysqld.exe console
(14)10
Minh họa cho thấy tiến trình MySQL server chạy chờ kết nối tới cổng có số hiệu 3306
Chương trình khách kết nối tới MySQL server sử dụng số tham số bảng dưới, hai cách sử dụng tương đương
-u <username> user=username
Xác định người dùng đăng nhập MySQL
-p password
Hỏi mật sau lệnh bắt đầu
-p<password> password=xxx
Mật truyền trực tiếp Khác với lựa chọn khác, khơng có khoảng cách sau –p Sẽ thuận tiện giảm an toàn (nên tránh)
-h hostname host=hostname
Xác định tên địa IP máy tính (giá trị ngầm định máy tính localhost)
-P port port=port
(15)11 Ví dụ: Hai cách đăng nhập vào hệ thống MySQL server sử dụng chương trình khách
mysql.exe
Cách 1: Gõ lệnh sau từ cửa sổ lệnh
basedir\mysql.exe –u user_name –p your_password Cách 2: Gõ lệnh sau từ cửa sổ lệnh
shell> basedir\mysql.exe user=user_name password=your_password
Trong basedir thư mục chứa chương trình mysqld.exe
Ngầm định ban đầu hệ quản trị CSDL có tài khoản quản trị username root mật để trống
* Bên cạnh sử dụng chương trình khách mysql.exe để kết nối làm việc với mysql server, bạn sử dụng chương trình khách khác mysql workbench, php myadmin Sau khi kết nối thành công tới MySQL Server hình trên, ta thao tác với CSDL, Ví
dụ: mysql> show databases;
(16)12 4 Tạo, xóa sở liệu (CSDL)
Sau đăng nhập vào MySQL server sử dụng chương trình khách mysql.exe, bước sau mô tả cách khởi tạo xóa sở liệu.Khởi tạo CSDL
Để tạo CSDL MySQL, sử dụng câu lệnh CREATE DATABASE sau:
CREATE DATABASE [IF NOT EXISTS] database_name;
Chú ý: Các câu lệnh SQL kết thúc dấu ; \g, \G bấm phím Enter
Câu lệnh CREATE DATABASE tạo CSDL có tên database_nameđược xác định IF NOT EXISTS tùy chọn tránh lỗi tồn CSDL tên Nếu tồn CSDL tên MySQL server, câu lệnh khơng thi hành
Ví dụ: tạo CSDL tên classicmodels
CREATE DATABASE classicmodels;
Hiển thị CSDL
Câu lệnh SHOW DATABASES hiển thị tất CSDL server Có thể sử dụng câu lệnh để kiểm tra CSDL tạo hiển thị tên tất CSDL có server trước tạo CSDL
SHOW DATABASES;
(17)13
Để chọn CSDL có dự định làm việc, sử dụng câu lệnh USE sau:
USE database_name;
Ví dụ: chọn CSDL classicmodels, sử dụng câu lệnh sau
USE classicmodels;
Từ thao tác bảng liệu CSDL chọn Ví dụ để hiển thị bảng liệu CSDL thời sử dụng lệnh:
SHOW TABLES
Xóa Cơ sở Dữ liệu
Xóa CSDL có nghĩa xóa CSDL vật lý, tất liệu đối tượng liên quan CSDL bị xóa vĩnh viễn Do cần cẩn thận thi hành câu lệnh
MySQL cung cấp câu lệnh theo chuẩn DROP DATABASE phép xóa CSDL
DROP DATABASE [IF EXISTS] database_name;
(18)14
Bài tập thực hành:
1 Thay đổi cổng ngầm định MySQL server thành 3307 kết nối tới MySQL server cổng
2 Thay đổi đường dẫn ngầm định thư mục chứa CSDL file cấu hình
3 Tạo CDSL tên my_database, sau dùng lệnh thị CSDL có server
4 Kiểm tra thư mục chứa CSDL xem CSDL tạo
5 Xóa CSDL my_database, sau dùng lệnh hiển thị CSDL có server.
Bài thực hành số
Các kiểu liệu Tạo sửa đổi cấu trúc bảng
Nội dung chính:
- Các kiểu liệu MySQL - Tạo bảng liệu
- Thay đổi cấu trúc bảng - Xóa bảng
1 Các kiểu liệu
MySQL hỗ trợ bảng CSDL chứa cột với kiểu liệu khác Các bảng liệt kê kiểu liệu MySQL hỗ trợ
Các kiểu liệu số
Bảng sau mô tả kiểu liệu số MySQL:
Kiểu Lưu trữ
TINYINT byte
(19)15
MEDIUMINT bytes
INT/INTEGER bytes
BIGINT bytes
Lưu ý: Kiểu BOOLEAN tương ứng với TINYINT(1)
Kiểu liệu Lưu trữ
FLOAT bytes
DOUBLE bytes
DECIMAL Phụ thuộc vào
định nghĩa cột
Các kiểu liệu xâu
Trong MySQL, xâu lưu thứ từ liệu văn tới liệu nhị phân ảnh, file Xâu so sánh tìm kiếm dựa mẫu sử dụng mệnh đề LIKE biểu thức quy Bảng phía kiểu liệu xâu MySQL:
Kiểu liệu xâu Mơ tả
CHAR Một chuỗi ký tự có độ dài cố định
VARCHAR Một chuỗi ký tự có độ dài thay đổi
BINARY Một chuỗi nhị phân độ dài có định
VARBINARY Một chuỗi nhị phân độ dài thay đổi
TINYBLOB Một đối tượng nhị phân nhỏ
BLOB Một đối tượng nhị phân nhỏ
MEDIUMBLOB Một đối tượng nhị phân cỡ trung bình
(20)16
TINYTEXT Mỗi chuỗi văn nhỏ
TEXT Mỗi chuỗi văn nhỏ
MEDIUMTEXT Mỗi chuỗi văn cỡ trung bình
LONGTEXT Mỗi chuỗi văn dài
Các kiểu liệu ngày thời gian
MySQL cung cấp kiểu liệu ngày, thời gian tổ hợp ngày thời gian Ngoài MySQL cung cấp kiểu liệu timestamp để lưu thời gian thay đổi ghi
Các kiểu liệu Mô tả
DATE Giá trị ngày định dạng 'YYYY-MM-DD'
TIME Giá trị thời gian định dạng 'hh:mm:ss'
DATETIME Giá trị ngày tháng thời gian định dạng
'YYYY-MM-DD hh:mm:ss'
TIMESTAMP Giá trị nhãn thời gian định dạng 'YYYY-MM-DD
hh:mm:ss'
Cột có kiểuTIMESTAMP đóng vai trò đặt biệt tự động cập nhật giá trị thời gian thay đổi gần ghi thêm vào cập nhật
2 Tạo bảng Cơ sở liệu
Để tạo bảng, MySQL sử dụng câu lệnh CREATE TABLE Câu lệnh có cấu trúc sau:
CREATE TABLE [IF NOT EXISTS] table_name(
(21)17 <column name><type> [<default value>] [column constraints], <table constraint>,
<table constraint>
) type=table_type
MySQL hỗ trợ tùy chọn IF NOT EXISTS để tránh lỗi tạo bảng tồn CSDL table_name tên bảng muốn tạo
Giá trị DEFAULT: MySQL cho phép gán giá trị ngầm định cho cột Nếu giá trị
cột khơng xác định thêm liệu vào bảng, giá trị cột gán giá trị value Giá trị ngầm định cột NULL
Table_type: xác định kiểu bảng liệu lưu trữ (chú ý thuộc tính đặc
điểm riêng MySQL) Nếu khơng xác định MySQL sử dụng kiểu bảng ngầm định MySQL hỗ trợ kiểu bảng lưu trữ khác nhau, cho phép tối ưu CSDL theo mục đích sử dụng Một số kiểu bảng MySQL MyISAM, InnoDB, BerkeleyDB (BDB), MERGE, HEAP…
MyISAM: Các bảng MyISAM làm việc nhanh, không hỗ trợ giao dịch Thường
được sử dụng ứng dụng Web, kiểu bảng ngầm định phiên MySQL trước 5.5
InnoDB: Các bảng InnoDB hỗ trợ giao dịch an tồn, hỗ trợ khóa ngồi InnoDB kiểu
lưu trữ ngầm định từ phiên MySQL 5.5
Định nghĩa tập cột: Các cột liệt kê với thuộc tính kiểu liệu, giá trị
ngầm định có, ràng buộc cột
Các ràng buộc SQL gồm có: Primary Key, Foreign Key, Not Null, Unique,
Check Nếu liệu cập nhật vi phạm ràng buộc khai báo bị từ chối
Các ràng buộc định nghĩa theo hai cách:
(22)18
2) Table constraint(Ràng buộc bảng): khai báo tách rời, áp dụng ràng buộc cho nhiều cột
PRIMARY KEY (ràng buộc khóa chính): Ràng buộc định nghĩa cột
tổ hợp cột xác định dòng bảng
NOT NULL: Ràng buộc yêu cầu giá trị cột không phép NULL
UNIQUE: ràng buộc yêu cầu giá trị cột phân biệt Chú ý với ràng buộc giá
trị cột NULL ràng buộc NOT NULL không áp dụng cột
CHECK:
Ràng buộc khóa khai báo theo kiểu ràng buộc mức cột
Column_name datatype [CONSTRAINT constraint_name] PRIMARY KEY
Ràng buộc khóa khai báo theo kiểu ràng buộc mức bảng
[CONSTRAINT constraint_name] PRIMARY KEY (column_name1,column_name2, )
Ví dụ: Tạo bảng employees với khóa xác định định nghĩa cột
CREATE TABLE employees (
employeeNumber int(11) NOT NULL PRIMARY KEY ,
lastName varchar(50) NOT NULL,
firstName varchar(50) NOT NULL,
extension varchar(10) NOT NULL,
email varchar(100) NOT NULL,
(23)19 reportsTo int(11) default NULL,
jobTitle varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Hoặc sử dụng cách đặt tên cho ràng buộc
CREATE TABLE employees (
employeeNumber int(11) NOT NULL CONSTRAINT
emp_id_pk PRIMARY KEY,
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)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Đặt tên ràng buộc
(24)20
buộc sửa đổi hóa xóa ràng buộc Như ví dụ trên, ràng buộc khóa đặt tên emp_id_pk
Ví dụ: Tạo bảng employees với khóa xác định theo kiểu ràng buộc bảng thay
khai báo với định nghĩa cột
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)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
FOREIGN KEY (Ràng buộc khóa ngồi)
Từ khóa FOREIGN KEY dùng để xác định khóa ngồi Trong ví dụ xác định cột country_id làm khóa ngồi, tham chiếu đến khóa bảng country
CREATE TABLE city (
city_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
city VARCHAR(50) NOT NULL,
(25)21 last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY(city_id),
CONSTRAINT fk_city_country FOREIGN KEY (country_id)
REFERENCES country (country_id) ON DELETE RESTRICT ON
UPDATE CASCADE
)
Ý nghĩa tùy chọn kèm khai báo ràng buộc khóa ngồi:
ON DELETE RESTRICT:có nghĩa khơng cho phép xóa dịng liệu bảng tham chiếu liệu tham chiếu tới Trong ví dụ khơng phép xóa dịng liệu bảng country tồn dòng liệu từ bảng city tham chiếu tới
ON UPDATE CASCADE:có nghĩa cập nhật liệu bảng tham chiếu, liệu bên bảng tham chiếu tự động cập nhật Trong ví dụ trên, thay đổi liệu cột country_id bảng country cột country_id bảng city tự động cập nhật
Khi không sử dụng tùy chọn này, ngầm định RESTRICT sử dụng cho kiện DELETE UPDATE
Sau tạo bảng liệu, kiểm tra xem cấu trúc cột liệu
Ví dụ: Hiển thị thông tin bảng employees
DESCRIBE employees;
(26)22
Bên cạnh lệnh DESCRIBE sử dụng câu lệnh:
SHOW CREATE TABLE Table_Name
sẽ hiển thị câu lệnh sử dụng để tạo bảng liệu
3 Thay đổi cấu trúc bảng
Bên cạnh tạo bảng, để sửa đổi cấu trúc bảng tồn CSDL sử dụng câu lệnh ALTER TABLE Câu lệnh dùng để:
Thêm, xóa, sửa cột bảng Thêm xóa ràng buộc
Cú pháp lệnh ALTER TABLE sau:
ALTER TABLE table_name tùy chọn[, tùy chọn ]
Các tùy chọn:
ADD [COLUMN] <column_definition> MODIFY [COLUMN] <create_definition>
DROP [COLUMN] <column_name>
(27)23 DROP <constraint_name>
Ví dụ: Thêm cột salary có kiểu INT, khơng vượt q 10 chữ số, ràng buộc không
để trống vào bảng liệu employees
ALTER TABLE employees ADD salary INT(10) NOT NULL
Ví dụ: Sửa kiểu cột salary thành kiểu decimal(15,2)
ALTER TABLE employees MODIFY salary decimal(15,2);
(28)24
ALTER TABLE employees DROP officeCode
4 Xóa bảng
Để xóa bảng khỏi CSDL, sử dụng câu lệnh DROP TABLE: DROP TABLE [IF EXISTS] <table_name>
MySQL cho phép xóa nhiều bảng lúc cách liệt kê tên bảng cách dấu phẩy Tùy chọn IF EXISTS sử dụng để tránh xóa bảng khơng tồn CSDL
Bài tập thực hành
1 Tạo CSDL my_classicmodels gồm bảng: productlines, products, orders orderdetails với thuộc tính hình vẽ phía Các khóa có kiểu INT sử dụng kiểu tự tăng AUTO_INCREMENT Gợi ý: Khóa tạo thành từ tổ hợp cột cần khai báo theo ràng buộc mức bảng
(29)(30)26 Bài thực hành số
Truy vấn (phần 1)
Nội dung
- Câu lệnh Select: cú pháp cách sử dụng - Mệnh đề where
- Loại bỏ liệu kết trùng lặp với DISTINCT - Giới hạn ghi trả LIMIT
1 Cài đặt cở sở liệu mẫu
Cơ sở liệu mẫu bao gồm bảng sau:
Customers: Lưu trữ thông tin khách hàng
Products: Lưu trữ danh sách sản phẩm
ProductLines: Lưu trữ danh mục loại sản phẩm
Orders: Lưu trữ đơn hàng đặt khách hàng
OrderDetails: Lưu trữ chi tiết dòng đơn hàng
Payments: Lưu trữ toán khách hàng
Employees: Lưu trữ thông tin nhân viên tổ chức
Offices: Lưu thông tin văn phòng tổ chức
(31)27
Tải file script sampledatabase.sql để tạo CSDLvề từ địa chỉ:
http://www.mysqltutorial.org/mysql-sample-database.aspx
Giả sử file sampledatabase.sql đặt thư mục gốc ổ C:
Đăng nhập vào MySQL server từ chương trình khách mysql.exe sử dụng tài khoản root
Từ dấu nhắc mysql> thi hành câu lệnh sau:
source c:\sampledatabase.sql
Cơ sở liệu tạo có tên classicmodels
2 Thực truy vấn với câu lệnh SELECT
Trong phần này, học cách sử dụng mệnh đề SELECT để truy vấn liệu từ bảng
cơ sở liệu
(32)28
SELECT tên cột 1, tên cột 2, FROM bảng
[WHERE điều kiện chọn] [GROUP BY nhóm]
[HAVING điều kiện chọn nhóm] [ORDER BY cột xếp] [LIMIT giới hạn số lượng];
Trong truy vấn SELECT có nhiều yếu tố tùy chọn mà sử dụng Các
tùy chọn đặt dấu ngoặc vuông []
Thứ tự xuất từ khoá WHERE, GROUP BY, HAVING, ORDER BY
và LIMIT phải theo thứ tự
Để chọn tất cột bảng sử dụng dấu (*) ký hiệu thay liệt kê
tất tên cột sau từ khố SELECT
Ví dụ: cần phải truy vấn tất thông tin nhân viên, sử dụng truy vấn
sau đây:
SELECT * FROM employees
(33)29 Ví dụ: cần phải xem tên, họ vị trí cơng việc nhân viên, sử dụng truy
vấn sau đây:
SELECT lastname, firstname, jobtitle FROM Employees
Ví dụ: Muốn lấy thông tin mã sản phẩm tên sản phẩm, thực truy vấn
sau:
(34)3 Mệnh đề WHERE
Mệnh đề WHERE câu lệnh SELECT cho phép điều kiện tiêu chí tìm kiếm
một điều kiện định
Ví dụ: tìm thấy chủ
SELECT FirstName, LastName, email FROM Employees
WHERE jobtitle = "President"
Hoăc tìm thông tin v
sau:
ủa câu lệnh SELECT cho phép chọn hàng cụ thể phù h ếm Sử dụng mệnh đề WHERE để lọc ghi
ấy chủ tịch công ty cách sử dụng truy vấn sau đây:
SELECT FirstName, LastName, email
WHERE jobtitle = "President"
ìm thơng tin tên khách hàng có mã số 112 truy vấn nh
30
phù hợp với ản ghi dựa
ằng cách sử dụng truy vấn sau đây:
(35)31
SELECT *
FROM Customers
WHERE customerNumber=112
Ví dụ sau đưa đơn hàng có mã khách hàng 181
SELECT * FROM orders
WHERE customerNumber = 181
4 Kết nối điều kiện với toán tử AND OR
Chúng ta kết hợp hai hay nhiều điều kiện khác mệnh đề WHERE, sử dụng toán tử AND, OR Với hai điều kiện nối AND, cần hai để điều kiện kết hợp Với hai điều kiện nối OR, điều kiện kết hợp hai điều kiện
Ví dụ: đưa khách hàng Mỹ người chăm sóc khách hàng có mã 1165
SELECT *
FROM customers
(36)32
Ví dụ: đưa đơn hàng có trạng thái ‘On Hold’ ‘In Process’
SELECT * FROM orders
WHERE status = 'On Hold' or status ='In Process'
5 IS NULL: tìm giá trị không xác định
Với trường chưa nhập liệu (coi giá trị chưa xác định), SQL coi giá trị NULL Để kiểm tra trường có giá trị NULL hay khơng, thay sử dụng phép so sánh =, SQL sử dụng phép tốn is NULL
Ví dụ: Đưa khách hàng chưa gán nhân viên chăm sóc
SELECT customerName, salesRepEmployeeNumber
FROM customers
(37)33
Nếu sử dụng phép so sánh = trên, khơng có dịng kết trả Nếu thay phép so sánh = is NULL
SELECT customerName, salesRepEmployeeNumber
FROM customers
WHERE salesRepEmployeeNumber is NULL
6 Từ khoá DISTINCT
Với từ khóa DISTINCT, loại bỏ liệu trùng lặp từ câu lệnh SELECT
Ví dụ: để tìm thấy vị trí cơng việc tất nhân viên, sử dụng từ khóa
DISTINCT câu lệnh SELECT sau:
(38)Hoặc tìm mã số sản phẩm đ
SELECT DISTINCT productCode
7 Giới hạn số lượng kết với LIMIT
Trong hầu hết lần truy vấn,
hàng triệu ghi không mu
đảm bảo hiệu suất lưu lượng truy cập máy chủ
ố sản phẩm mua truy vấn sau:
productCode FROM OrderDetails;
ợng kết với LIMIT
ầu hết lần truy vấn, làm việc với bảng liệu có chứa
à không muốn viết truy vấn để có tất liệu để
ợng truy cập máy chủ sở liệu v
34
ư sau:
ệc với bảng liệu có chứa hàng nghìn đến
ợc tất liệu để
(39)35
dụng MySQL hỗ trợ tính LIMIT cho phép hạn chế ghi trả lại với
câu lệnh SELECT
Giả thiết ta có bảng sở liệu với 10.000 ghi muốn nhận N ghi đầu tiên, sử dụng truy vấn sau đây:
SELECT * FROM table_name LIMIT N
LIMIT cho phép lấy số lượng ghi định tính từ vị trí đó:
LIMIT S, N
Trong câu truy vấn trên, S điểm bắt đầu ghi số MySQL xác định vị trí
đầu tiên ghi lại bắt đầu với 0; N số lượng ghi muốn chọn
Ví dụ: Có thể lấy thơng tin tên sản phẩm bảng Product
truy vấn sau:
SELECT productName FROM Products LIMIT 5;
Hoặc lấy thông tin 10 khách hàng Pháp truy vấn sau:
(40)36
Bài tập thực hành:
1 Đưa danh sách nhân viên có trường reportsTo chưa xác định Đưa danh sách CustomerNumber có thực giao dịch
3 Đưa danh sách đơn hàng có ngày yêu cầu vận chuyển ‘18/1/2003’ Lưu ý: MySQL lưu liệu ngày tháng theo định dạng năm/tháng/ngày
4 Đưa danh sách đơn hàng có ngày đặt tháng năm 2005 có trạng thái ‘Shipped’
(41)37 Bài thực hành số
Truy vấn (phần 2)
Nội dung
Trong này, đề cập đến cách sử dụng số toán tử IN, BETWEEN, UNION,
LIKE, ORDER BY; Thuộc tính suy diễn
1 Tốn tử IN
Toán tử IN cho phép chọn giá trị phù hợp từ tập giá trị Cú pháp sử dụng
sau:
SELECT danh sách cột FROM tên bảng
WHERE cột IN ("giá trị 1","giá trị 2"…)
Các cột mệnh đề WHERE không cần phải xuất danh sách cột chọn, phải cột bảng Nếu danh sách có nhiều giá trị, mục phân cách dấu phẩy Ngồi ra, sử dụng toán tử NOT kèm với toán tử IN cho mục đích phủ định
Chúng ta xem số ví dụ sau:
Giả sử muốn tìm tất văn phịng đặt Mỹ (USA) Pháp (France), có
thể thực truy vấn sau đây:
SELECT officeCode, city, phone FROM offices
WHERE country = 'USA' OR country = 'France'
Trong trường hợp này, sử dụng IN thay truy vấn trên:
SELECT officeCode, city, phone FROM offices
WHERE country IN ('USA','France')
(42)38
Để có tất văn phịng khơng nằm Mỹ Pháp, sử dụng NOT
IN sau:
SELECT officeCode, city, phone FROM offices
WHERE country NOT IN ('USA','France')
Kết trả sau: Kết trả sau:
2 Toán tử BETWEEN
BETWEEN cho phép lấy giá trị phạm vi cụ thể Nó phải sử dụng
trong mệnh đề WHERE Sau minh họa cú pháp:
SELECT column_list FROM table_name
WHERE column_1 BETWEEN lower_range AND upper_range
MySQL trả lại tất ghi giá trị column_1 nằm phạm vi lower_rage
upper_range Truy vấn tương đương để có kết là:
SELECT column_list FROM table_name
(43)39 Ví dụ:
Giả sử muốn tìm tất sản phẩm có giá nằm phạm vi 90 $ 100 $,
chúng ta thực truy vấn sau đây:
SELECT productCode,ProductName,buyPrice FROM products
WHERE buyPrice BETWEEN 90 AND 100 ORDER BY buyPrice DESC
Kết trả sau:
Để tìm tất ghi khơng nằm phạm vi, sử dụng NOT
BETWEEN Ví dụ: để tìm tất sản phẩm với giá mua nằm phạm vi 20
100, viết truy vấn sau đây:
SELECT productCode,ProductName,buyPrice FROM products
WHERE buyPrice NOT BETWEEN 20 AND 100
(44)40
Truy vấn tương đương với truy vấn sau:
SELECT productCode,ProductName,buyPrice FROM products
WHERE buyPrice < 20 OR buyPrice > 100 ORDER BY buyPrice DESC
Kết trả sau:
3 Toán tử LIKE
LIKE cho phép thực việc tìm kiếm thơng tin dựa so sánh ký tự (‘giống như’) LIKE thường sử dụng với câu lệnh SELECT mệnh đề
WHERE MySQL cung cấp cho hai ký tự đại diện sử dụng với LIKE, % _
Ký tự đại diện tỷ lệ phần trăm (%) đại diện cho chuỗi khơng có
có nhiều ký tự
Gạch (_) đại diện cho ký tự
Ví dụ: Giả sử muốn tìm kiếm nhân viên có tên bắt đầu với ký tự 'a', làm
điều sau:
SELECT employeeNumber, lastName, firstName FROM employees
WHERE firstName LIKE 'a%'
(45)41
MySQL quét tồn bảng employees (nhân viên) để tìm tất nhân viên có tên bắt đầu
với ký tự 'a' theo sau số lượng ký tự
Ví dụ: Để tìm kiếm tất nhân viên có họ kết thúc với chuỗi ‘on’, thực
truy vấn sau:
SELECT employeeNumber, lastName, firstName FROM employees
WHERE lastName LIKE '%on'
Kết trả sau:
Nếu biết chuỗi tìm kiếm nhúng vào vị trí giá trị
cột, đặt % đầu cuối chuỗi tìm kiếm để tìm tất khả
Ví dụ: muốn tìm tất nhân viên mà họ nhân viên có chứa cụm 'on', có
thể thực truy vấn sau đây:
SELECT employeeNumber, lastName, firstName FROM employees
WHERE lastName LIKE '%on%'
(46)42
Chúng ta dùng NOT kèm với LIKE để hàm chứa ý nghĩa phủ định
Ví dụ: muốn tìm nhân viên có họ khơng bắt đầu ký tự ‘B’, viết sau:
SELECT employeeNumber, lastName, firstName FROM employees
WHERE lastName NOT LIKE 'B%'
Kết trả sau:
Lưu ý MySQL không phân biệt chữ hoa chữ thường nên ‘b%’ ‘B%’
Trong trường hợp chuỗi tìm kiếm lại bắt đầu ký tự đại diện, chẳng hạn
‘_’, mysql cung cấp cho ký tự ‘\’ để ký tự đại diện sau sử
dụng theo nghĩa đen khơng cịn ký tự đại diện
Ví dụ: tìm sản phẩm mà mã chúng có chứa chuỗi ‘_20’, phải viết truy vấn
như sau:
(47)43
WHERE productCode LIKE '%\_20%'
Kết trả sau:
LIKE cung cấp cho cách thuận tiện để tìm ghi có cột chứa chuỗi phù
hợp với mẫu tìm kiếm Tuy nhiên, việc thực thi LIKE qt tồn bảng để
tìm tất ghi phù hợp khơng cho phép database engine sử dụng index
để tìm kiếm nhanh Khi liệu bảng đủ lớn, hiệu suất thực thi LIKE bị suy
giảm Trong số trường hợp, tránh vấn đề cách sử dụng kỹ thuật
khác để đạt kết tương tự Hoặc sử dụng phương pháp đánh mục
FULLTEXT MySQL (sẽ đề cập kỹ thuật khóa học Hệ quản trị CSDL
MySQL)
Ví dụ: muốn tìm tất nhân viên có tên bắt đầu với chuỗi quy định
có thể sử dụng hàm LEFT() giống truy vấn sau đây:
SET @str = 'b';
SELECT employeeNumber, lastName, firstName FROM employees
WHERE LEFT(lastname,length(@str)) = @str;
(48)44
Kết trả truy vấn tương đương với truy vấn đây, nhiên tốc độ
thực thi cách viết sau tốt nhiều sử dụng index cột
lastname
SELECT employeeNumber, lastName, firstName FROM employees
WHERE lastname LIKE 'b%'
4 Thuộc tính suy diễn (Derived Attribute)
SQL cung cấp khả tạo thuộc tính suy diễn bảng kết trả sử dụng toán tử hàm dựa thuộc tính có sẵn Tên cột thuộc tính suy diễn phụ thuộc vào hệ thống, nhiên gán bí danh làm tên cột
Ví dụ sau tạo cột suy diễn đặt tên lineTotal, thuộc tính kết phép nhân hai thuộc tính priceEach quantityOrdered
SELECT orderNumber, (priceEach*quantityOrdered) as lineTotal
(49)45 5 Sắp xếp kết với ORDER BY
Mệnh đề ORDER BY cho phép xếp kết nhiều cột kết
truy vấn theo thứ tự tăng dần hay giảm dần Để xếp kết theo thứ tự tăng dần, sử
dụng ASC; giảm dần DESC Theo mặc định, ORDER BY xếp kết theo
thứ tự tăng dần
Ví dụ: để xếp danh sách nhân viên theo tên vị trí cơng việc, thực truy
vấn sau đây:
SELECT FirstName, LastName, jobtitle FROM Employees
(50)46
Hoặc đưa thơng tin tên sản phẩm theo thứ tự tăng dần số lượng hàng
tồn kho truy vấn sau:
SELECT productName FROM Products
ORDER BY quantityInStock;
Trong câu lệnh từ khóa ASC khơng sử dụng, mặc định xếp kết theo
(51)47
Nếu không rõ việc xếp thực theo thứ tự tăng hay giảm dần, MySQL
mặc định việc xếp liệu thực theo thứ tự tăng dần
6 Kết hợp kết với toán tử UNION
UNION cho phép kết hợp hai nhiều kết từ nhiều bảng với Cú pháp
của việc sử dụng MySQL UNION sau:
SELECT statement
UNION [DISTINCT | ALL] SELECT statement
UNION [DISTINCT | ALL] …
Để sử dụng UNION, có số nguyên tắc cần phải làm theo:
Số lượng cột câu lệnh SELECT phải giống
Các kiểu liệu cột danh sách cột câu lệnh SELECT phải giống
(52)48
Theo mặc định, UNION MySQL loại bỏ tất hàng trùng lặp từ kết không sử dụng từ khoá DISTINCT sau từ khoá UNION
Nếu sử dụng UNION ALL, hàng trùng lặp tập hợp kết cuối
chỉ nên sử dụng điều trường hợp muốn giữ lại hàng,
hoặc chắn có khơng có hàng tập hợp kết
Ví dụ: kết hợp thông tin khách hàng nhân viên thành tập hợp kết quả, sử
dụng truy vấn sau đây:
SELECT customerNumber id, contactLastname name FROM customers
UNION
SELECT employeeNumber id,firstname name FROM employees
(53)49 Ví dụ: Giả sử kết hợp thông tin của nhân viên khách hàng, sau muốn xếp kết theo tên ID thứ tự tăng dần
(SELECT customerNumber, contactLastname FROM customers)
UNION
(SELECT employeeNumber, firstname FROM employees)
ORDER BY contactLastname, customerNumber
Nếu tên cột không giống hai mệnh đề SELECT phép UNION, tên
được hiển thị đầu khơng sử dụng bí danh cho cột mệnh đề
SELECT Câu trả lời MySQL sử dụng tên cột câu lệnh SELECT
tên cột kết đầu
(SELECT customerNumber, contactLastname
FROM customers)
(54)50
(SELECT employeeNumber, firstname
FROM employees)
ORDER BY contactLastname, customerNumber
Kết phép toán hợp hai tập kết từ bảng liệu customers employees
MySQL cung cấp lựa chọn khác để xếp kết thiết lập dựa vị trí
cột mệnh đề ORDER BY truy vấn sau đây:
(SELECT customerNumber, contactLastname
FROM customers)
UNION
(SELECT employeeNumber,firstname
FROM employees)
(55)51
Bài tập thực hành:
1 Dùng toán tử IN để đưa thông tin khách hàng sống thành phố
Nantes Lyon
2 Sử dụng BETWEEN để tìm đơn hàng chuyển khoảng thời gian
từ ‘10/1/2003’ đến ‘10/3/2003’
3 Sử dụng LIKE để đưa thông tin nhóm hàng hố có chứa từ ‘CARS’
4 Truy vấn 10 sản phẩm có số lượng kho lớn
(56)52 Bài thực hành số
Các hàm xử lý MySQL
Nội dung : Trong này, làm quen với số hàm (functions) bản:
- Hàm xử lý xâu kí tự: Substring, Concat, Replace - Hàm điều kiện If
- Hàm LAST_INSERT_ID
- Hàm xử lý thời gian: DATEDIFF, ADDDATE, EXTRACT
1 Hàm xử lý chuỗi SUBSTRING
Hàm Substring cho phép trích xuất chuỗi từ chuỗi khác, bắt đầu vị trí cụ
thể với độ dài định Sau minh họa hình thức sử dụng khác
hàm
SUBSTRING(str,pos);
SUBSTRING(str FROM pos);
Kết câu lệnh trả chuỗi từ chuỗi str vị trí pos
SUBSTRING(str,pos,len);
SUBSTRING(str FROM pos FOR len);
Hai câu lệnh trả chuỗi từ chuỗi str, bắt đầu vị trí pos chuỗi
con trả có len ký tự Lưu ý FROM từ khoá cú pháp SQL chuẩn Chúng ta
hãy xem xét số ví dụ sau”
SELECT substring('MySQL Substring',7); Trả về: Substring
SELECT substring('MySQL Substring' FROM 7); Trả về: Substring
SELECT substring('MySQL Substring',7,3); Trả về: Sub
(57)53
Trả về: Sub
sử dụng giá trị âm cho tham số pos Nếu sử dụng giá trị âm cho tham số
pos, bắt đầu chuỗi tính từ cuối chuỗi, ví dụ
SELECT substring('MySQL Substring',-9);
Trả về: Substring
Đôi thấy đoạn mã sử dụng substr () thay hàm substring () Substr từ đồng nghĩa
với substring, có tác dụng tương tự
2 Hàm CONCAT
Hàm Concat sử dụng để nối hai nhiều chuỗi Nếu đối số số, chúng
được chuyển đổi thành chuỗi trước nối Nếu đối số danh sách đối số
NULL, hàm concat trả NULL
CONCAT(str1,str2, )
Ví dụ: Để hiển thị tên đầy đủ địa liên lạc khách hàng sử
dụng hàm concat để nối tên tên cuối dấu phân cách
chúng Dưới truy vấn:
SELECT CONCAT(contactLastname,', ',contactFirstname) fullname
(58)54
MySQL hỗ trợ hàm concat_ws cho phép nối hai hay nhiều hai chuỗi
với dấu phân cách xác định trước Cú pháp hàm concat_ws là:
CONCAT_WS(seperator,str1,str2, )
Tham số dấu phân cách định nghĩa sau chuỗi muốn
nối Kết trả chuỗi ghép nối,với dấu phân cách thành phần
ghép nối Có thể đạt kết tương tự ví dụ cách sử dụng concat_ws thay hàm concat
SELECT CONCAT_WS('; ',contactLastname,contactFirstname) fullname
(59)55
Dưới ví dụ khác việc sử dụng concat_ws để có định dạng địa
khách hàng
SELECT CONCAT_WS(char(10),
CONCAT_WS(' ',contactLastname,contactFirstname), addressLine1, addressLine2,
(60)56 3 Hàm REPLACE
MySQL cung cấp cho hàm xử lý chuỗi hữu ích Replace, cho phép thay
chuỗi cột bảng chuỗi
Cú pháp hàm sau:
UPDATE <tên bảng>
SET tên cột = REPLACE(tên cột,xâu cần tìm,xâu thay thế) WHERE <các điều kiện>
Lưu ý: tìm kiếm văn để thay thế, MySQL có phân biệt chữ hoa chữ
thường
Ví dụ: muốn sửa lỗi tả bảng Product sở liệu mẫu, sử dụng
hàm Replace sau:
UPDATE products
SET productDescription =
(61)57
Truy vấn xem xét cột productDescription tìm thấy tất lần xuất lỗi
chính tả 'abuot' thay từ xác 'about'
Điều quan trọng cần lưu ý hàm Replace, tham số tên trường
không đặt dấu ‘’ Nếu đặt dấu để tên trường 'field_name’, truy vấn cập nhật
nội dung cột 'field_name’, gây liệu
Hiện hàm Replace khơng hỗ trợ biểu thức quy cần phải thay
một chuỗi văn mẫu, cần phải sử dụng hàm người dùng định nghĩa
(UDF) từ thư viện bên
4 Hàm IF
IF hàm điều khiển, trả kết chuỗi số dựa điều kiện cho trước Cú pháp hàm IF sau:
IF(expr,if_true_expr,if_false_expr)
Tham số expr kiểm tra hay sai Giá trị thực có
nghĩa expr không expr không NULL Lưu ý NULL
một giá trị đặc biệt, khơng điều khác, thân
Nếu expr đánh giá đúng, hàm IF trả lại if_true_expr, không
sẽ trả lại if_false_expr
Ví dụ:
SELECT IF(1 = 2,'true','false'); Trả về: false
SELECT IF(1 = 1,' true','false'); Trả về: true
Ví dụ: Trong bảng khách hàng, tất khách hàng có thơng tin
state Vì vậy, lựa chọn khách hàng, thông tin state hiển thị giá trị NULL,
khơng có ý nghĩa cho mục đích báo cáo
(62)58
state, country FROM customers;
Chúng ta sử dụng IF để hiển thị trạng thái khách hàng N / A
NULL sau:
SELECT customerNumber, customerName,
IF(state IS NULL,'N/A',state) state, country
(63)59 Ví dụ: Hàm IF hữu ích với chức tổng hợp. Giả sử muốn biết có đơn đặt hàng vận chuyển huỷ bỏ lúc, sử dụng IF để
đếm sau:
SELECT SUM(IF(status = 'Shipped',1,0)) AS Shipped, SUM(IF(status = 'Cancelled',1,0)) AS Cancelled FROM orders;
Trong truy vấn trên, tình trạng đơn đặt hàng SHIPPED CANCELLED, IF
sẽ trả lại giá trị 1, khơng trả Và sau hàm SUM tính toán tổng số để vận
chuyển bị hủy bỏ dựa giá trị trả hàm IF
5 Hàm LAST_INSERT_ID
Hàm LAST_INSERT_ID trả ID ghi cuối chèn vào bảng, với điều
kiện đólà ID cột có thuộc tính AUTO_INCREMENT.Trong thiết kế sở liệu,
(64)60
vào bảng có cột AUTO_INCREMENT, MySQL tạo ID cho tự động dựa thiết
lập cột có ID cách sử dụng hàm LAST_INSERT_ID
Ví dụ: tạo bảng để thử nghiệm gọi TBL Trong bảng TBL,
sử dụng ID cột AUTO_INCREMENT
CREATE TABLE tbl(
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, description varchar(250) NOT NULL
);
Sau đó, sử dụng hàm LAST_INSERT_ID () để có ID chèn
INSERT INTO tbl(description) VALUES('MySQL last_insert_id');
Thực truy vấn:
SELECT LAST_INSERT_ID();
Điều quan trọng cần lưu ý chèn nhiều ghi vào bảng cách sử dụng câu
lệnh INSERT nhất, hàm LAST_INSERT_ID trả lại giá trị tạo cho ghi
chèn vào Hãy thử bước sau:
INSERT INTO tbl(description) VALUES('record 1'),
('record 2'), ('record 3');
Thực truy vấn:
(65)61
Chúng ta chèn ghi cách sử dụng câu lệnh INSERT hàm
LAST_INSERT_ID trả lại ID ghi mong muốn MySQL
LAST_INSERT_ID hoạt động dựa nguyên tắc độc lập với client Nó có nghĩa giá
trị trả hàm LAST_INSERT_ID cho client cụ thể giá trị mà client
tạo Điều đảm bảo client nhận ID riêng mà khơng
cần phải quan tâm đến hoạt động client khác không cần sử dụng chế
lock hay transaction (sẽ học sau)
6 Hàm DATEDIFF
Trong số trường hợp, cần phải tính tốn số ngày hai mốc thời gian, ví dụ số
ngày từ ngày vận chuyển ngày yêu cầu đơn đặt hàng Trong trường
hợp này, cần phải sử dụng hàm DATEDIFF
Cú pháp DATEDIFF sau:
DATEDIFF(expr1,expr2)
expr1 expr2 hai mốc thời gian
Ví dụ:
SELECT DATEDIFF('2011-08-17','2011-08-17');
Trả về: day
SELECT DATEDIFF('2011-08-17','2011-08-08');
Trả về: days
SELECT DATEDIFF('2011-08-08','2011-08-17');
Trả về: days
Ví dụ: Để tính tốn số ngày cịn lại ngày vận chuyển ngày yêu cầu để đơn
đặt hàng, sử dụng DATEDIFF sau:
SELECT orderNumber,
(66)62
FROM orders
ORDER BY daysLeft DESC;
7 Hàm ADDDATE, EXTRACT
MySQL hỗ trợ số hàm xử lý ngày tháng khác như: ADDDATE, EXTRACT
Hàm ADDDATE: trả giá trị thời gian kết thao tác giá trị thời gian khác
Ví dụ: đưa ngày tháng sau ngày 30 ngày:
SELECT ADDDATE(NOW(), INTERVAL 30 DAY);
Sử dụng từ khóa DAY để giá trị cộng vào ngày
Ví dụ: đưa đơn đặt hàng khoảng 30 ngày tính từ ngày 1/5/2005
SELECT * FROM orders
(67)63
Kết truy vấn:
Ví dụ: đưa đơn đặt hàng tính từ trước ngày 1/5/2005, 30 ngày đến ngày 1/5/2005
SELECT * FROM orders
WHERE orderDate<= '2005-5-1' AND orderDate > ADDDATE('2005-5-1', INTERVAL -30 DAY);
Nếu thời gian cộng vào tháng, năm từ khóa tương ứng sử dụng MONTH,
YEAR
(68)64
SELECT * FROM orders
WHERE orderDate<= '2005-5-1' AND orderDate > ADDDATE('2005-5-1', INTERVAL -1 MONTH);
Hàm EXTRACT: tách giá trị ngày, tháng, năm từ giá trị có kiểu thời gian
Ví dụ: đưa tháng giá trị thời gian:
SELECT EXTRACT(MONTH FROM '2004-12-31 23:59:59');
* Có thể sử dụng hàm MONTH('2004-12-31 23:59:59') cho ví dụ
Ví dụ: đưa tháng giá trị thời gian:
SELECT EXTRACT(YEAR FROM '2004-12-31 23:59:59');
Ví dụ: đưa đơn hàng đặt năm 2005
(69)65
FROM orders
WHERE EXTRACT(YEAR FROM orderDate) = 2005
Ví dụ: đưa đơn hàng đặt tháng năm 2005
SELECT * FROM orders
(70)66
Bài tập thực hành:
1 Lấy 50 ký tự phần mô tả sản phẩm, đặt tên ‘Title of products’
2 Đưa mô tả nhân viên theo định dạng ‘Fullname, jobTitle.’
3 Thay tồn tên nhóm hàng ‘Cars’ thành ‘Automobiles’
4 Tìm đơn hàng vận chuyển sớm so với ngày yêu cầu
5 Đưa đơn đặt hàng tháng năm 2005 có ngày chuyển hàng đến
(71)67 Bài thực hành số
Truy vấn nhóm
Nội dung chính: Trong này, làm quen với hàm nhóm truy
vấn nhóm:
- Các hàm nhóm: SUM, AVG, MAX MIN , COUNT - Mệnh đề GROUP BY
- Mệnh đề HAVING
1 Các hàm nhóm
Hàm SUM
Đôi thông tin cần không lưu trữ thực bảng sở
liệu, lấy chúng cách tính tốn từ liệu lưu
trữ Ví dụ, có bảng OrderDetails để lưu trữ thơng tin đơn đặt hàng Khi
chúng ta nhìn vào đó, khơng biết tổng số tiền tất sản phẩm bán
được Tuy nhiên, hàm tính tổng SUM giúp trả lời câu hỏi
này Trước hết xem hoạt động hàm SUM, việc thực nhóm liệu
trình bày phần
Ví dụ: Tính tổng số lượng hàng hóa kho
SELECT sum(quantityInStock) FROM products
Kết trả sau:
Hoặc để tính tổng số tiền thu từ đầu tới giờ, viết truy vấn sau:
(72)68
Kết trả sau:
Hàm AVG
AVG sử dụng để tính giá trị trung bình biểu thức, Nó khơng chấp nhận giá
trị NULL Chúng ta sử dụng AVG để tính tốn giá trung bình tất sản
phẩm mua sau:
SELECT AVG(buyPrice) average_buy_price FROM Products
Kết trả sau:
Hàm MAX MIN
Hàm MAX trả giá trị lớn hàm MIN trả giá trị nhỏ tập giá
trị
MAX(expression) MIN(expression)
Ví dụ: Sử dụng MAX MIN để lấy mức giá cao mức giá nhỏ sản
phẩm
SELECT MAX(buyPrice) highest_price, MIN(buyPrice) lowest_price FROM Products
(73)69 Hàm COUNT
Hàm COUNT hàm đếm số lượng, chẳng hạn đếm số lượng sản phẩm
đang bán sau:
SELECT COUNT(*) AS Total FROM products
Kết trả sau:
Lưu ý: phiên khác hàm COUNT sử dụng tham số tên cột Nếu cách
được sử dụng, đếm dòng mà giá trị cột khác NULL
2 Mệnh đề nhóm GROUP BY
Mệnh đề GROUP BY sử dụng để gộp ghi có giá trị hay nhiều
cột, thành tập hợp GROUP BY có phải đứng sau mệnh đề WHERE
FROM Theo sau từ khoá GROUP BY danh sách biểu thức, phân cách
bởi dấu phẩy
SELECT col1_,col_2, col_n, hàm nhóm(biểu thức) FROM tên bảng
WHERE điều kiện
GROUP BY col_1, col_2, col_n ORDER BY danh sách cột
(74)70 Ví dụ: Giả sử muốn phân chia đơn đặt hàng theo nhóm phụ thuộc vào tình trạng
của đơn hàng, làm sau:
SELECT status FROM orders GROUP BY status
Kết trả sau:
Các hàm nhóm sử dụng với GROUP BY để thực tính tốn nhóm
cácbản ghi trả giá trị cho hàng
Ví dụ: muốn biết có đơn đặt hàng nhóm trạng thái, sử dụng hàm COUNT sau:
SELECT status, count(*) FROM orders
GROUP BY status
(75)71 Ví dụ: muốn biết có loại sản phẩm loại dòng sản phẩm
SELECT productLine, count(*) FROM products
GROUP BY productline
Ví dụ: Để có tổng số tiền cho sản phẩm bán, cần sử dụng chức
năng SUM nhóm sản phẩm Dưới truy vấn:
SELECT productCode,sum(priceEach * quantityOrdered) total FROM orderdetails
GROUP by productCode
(76)72 Ví dụ: Giả sử muốn xem kết truy vấn trên, hiển thị theo thứ tự tăng
dần làm sau:
SELECT productCode,sum(priceEach * quantityOrdered) total FROM orderdetails
GROUP by productCode ORDER BY total DESC
Kết trả sau:
Lưu ý: khác GROUP BY MySQL ANSI SQL
MySQL tuân theo chuẩn ANSI SQL Tuy nhiên, có khác biệt sử dụng GROUP
BY MySQL sau:
Trong ANSI SQL, phải thực GROUP BY tất cột xuất mệnh
đề SELECT MySQL khơng địi hỏi vậy, đưa thêm cột vào
mệnh đề SELECT không bắt buộc chúng phải xuất mệnh đề GROUP
(77)73
MySQL cho phép xếp nhóm theo thứ tự kết tính tốn, mặc
định giảm dần
3 Mệnh đề điều kiện HAVING
HAVING mệnh đề xuất khơng mệnh đề SELECT Nó
chỉ điều kiệ lọc liệu nhóm ghi kết việc thực
hiện hàm nhóm HAVING thường sử dụng với GROUP BY, điều kiện
lọc áp dụng cột xuất mệnh đề GROUP BY mà Nếu
HAVING không di kèm với GROUP BY, có ý nghĩa WHERE mà
Lưu ý rằng, HAVING áp dụng nhóm ghi, cịn WHERE áp dụng
bản ghi riêng lẻ
Ví dụ: Chúng ta sử dụng mệnh đề GROUP BY để có tất đơn đặt hàng, số
lượng mặt hàng bán tổng giá trị đơn đặt hàng sau:
SELECT ordernumber,
sum(quantityOrdered) AS itemsCount,
sum(priceEach * quantityOrdered) AS total FROM orderdetails
(78)74
Bây giờ, yêu cầu hiển thị đơn hàng có tổng giá trị lớn $1000 cách sử dụng HAVING sau:
SELECT ordernumber,
sum(quantityOrdered) AS itemsCount,
sum(priceEach * quantityOrdered) AS total FROM orderdetails
GROUP BY ordernumber HAVING total > 1000
Chúng ta sử dụng bí danh cho cột sum (priceEach * quantityOrdered) total,
vậy mệnh đề HAVING, cần dùng bí danh thay
Gõ sum( priceeach) lần
Có thể sử dụng điều kiện kết hợp mệnh đề HAVING với tốn tử OR, AND
Ví dụ: muốn biết đơn hàng có tổng giá trị lớn $ 1000 có 600 mặt
(79)75
SELECT ordernumber,
sum(quantityOrdered) AS itemsCount, sum(priceeach) AS total
FROM orderdetails GROUP BY ordernumber
HAVING total > 1000 AND itemsCount > 600
Bài tập thực hành
1 Đưa tên thành phố số lượng khách hàng thành phố
2 Đưa số lượng đơn đặt hàng tháng 3/2005
3 Đưa số lượng đơn đặt hàng tháng năm 2005
4 Đưa 10 mã đơn đặt hàng có giá trị lớn
(80)76 Bài thực hành số
Các phép nối bảng liệu
Nội dung chính: Trong thực hành trước, truy vấn thực trên bảng liệu Không ngạc nhiên nhiều truy vấn yêu cầu thông tin
từ nhiều bảng liệu khác Ví dụ muốn đưa thơng tin khách hàng
đơn hàng, cần kết hợp thông tin từ hai bảng liệu customers orders Kết
hợp bảng liệu để tạo bảng suy diễn gọi phép nối (join)
Trong này, làm quen với phép toán nối để truy vấn liệu từ
nhiều bảng : INNER JOIN, LEFT JOIN, SELF JOIN
1 PHÉP NỐI TRONG (INNER JOIN)
INNER JOIN hay gọi phép nối trong, phần tùy chọn câu lệnh
SELECT Nó xuất liền sau mệnh đề FROM Trước sử dụng INNER JOIN,
phải xác định rõ tiêu chí sau đây:
Trước tiên, cần phải xác định bảng mà muốn liên kết với bảng Bảng
chính xuất mệnh đề FROM Bảng muốn nối với bảng phải xuất
(81)77
lượng không giới hạn bảng khác, nhiên, để có hiệu suất tốt hơn, nên hạn
chế số lượng bảng tham gia phép nối dựa điều kiện nối khối lượng
liệu bảng
Thứ hai, cần phải xác định điều kiện nối Điều kiện nối xuất sau từ khóa
ON Điều kiện nối ngun tắc để tìm ghi phù hợp
bảng nối chúng lại với
Cú pháp INNER JOIN sau:
SELECT column_list FROM table1
INNER JOIN table2 ON join_condition1 INNER JOIN table3 ON join_condition2
WHERE WHERE_conditions;
Ví dụ, nối hai bảng A B, INNER JOIN so sánh ghi bảng A với
bản ghi bảng B để tìm tất cặp ghi đáp ứng điều kiện nối Khi điều
kiện nối thoả mãn, giá trị cột cho cặp ghi phù hợp bảng A bảng B
được kết hợp thành ghi kết trả
Hạn chế trùng tên cột sử dụng INNER JOIN: Nếu nối nhiều bảng có cột với tên tương tự, phải rõ tên bảng có chứa cột liệu định lấy để tránh lỗi cột không rõ ràng Giả sử bảng tbl_A tbl_B có cột tương tự M Trong câu lệnh SELECT với INNER JOIN, phải tham chiếu tới cột M cách sử dụng cú pháp tbl_A.M
Ví dụ: Hãy xem xét hai bảng products orderDetails Bảng products bảng liệu
(82)Ví dụ: muốn biết sản phẩm đ
SELECT products.productCode, orderDetails.orderNumber
FROM products
INNER JOIN orderDetails on orderDetails.productCode;
ết sản phẩm bán, sử dụng INNER JOIN
.productCode, products.productName, orderNumber
INNER JOIN orderDetails on products.productCode = productCode;
78 INNER JOIN sau:
.productName,
(83)79
INNER JOIN so sánh dòng bảng products OrderDetails để tìm cặp
ghi có productCode Nếu cặp ghi có mã sản phẩm, tên sản
phẩm số thứ tự kết hợp thành hàng để trả lại kết
Bí danh (Alias): tạo bí danh bảng tbl_A A tham chiếu đến cột M A.M ,
như khơng cơng gõ lại tên bảng Ví dụ viết lại sau:
SELECT p.productCode, p.productName, o.orderNumber FROM products p
INNER JOIN orderDetails o on p.productCode = o.productCode;
Lưu ý: Bên cạnh phép nối sử dụng mệnh đề INNER JOIN ON, nối
hai bảng cách đưa điều kiện nối vào mệnh đề WHERE Ví dụ viết lại
như sau:
SELECT p.productCode, p.productName, o.orderNumber FROM products p, orderDetails o
WHERE p.productCode = o.productCode;
Chúng ta xem xét số ví dụ khác sử dụng phép nối đây:
Ví dụ: Bảng Employees bảng lưu giữ thơng tin nhân viên công ty; bảng
Customers bảng lưu giữ thông tin khách hàng, có thơng tin liên quan
đến mã số nhân viên chăm sóc khách hàng Như liên kết hai bảng
thực thông qua cột employeeNumber bảng Employees cột salesRep
employeeNumber bảng Customers
Để biết thông tin khách hàng tên nhân viên chăm sóc khách hàng đó, viết
truy vấn sử dụng INNER JOIN sau:
SELECT customerName, firstname as EmployeeName FROM customers C join employees E
on C.salesrepemployeenumber = e.employeenumber
(84)80 Ví dụ: Đưa thơng tin dịng sản phẩm tổng số hàng có dịng sản phẩm
đó
SELECT pl.productLine, pl.textDescription, sum(quantityInStock)
FROM productlines pl JOIN products p ON pl.productLine =p.productLine
GROUP BY pl.productLine;
(85)81 Ví dụ: Đưa thơng tin sản phẩm tổng giá trị đặt hàng cho sản phẩm,
xếp theo tổng giá trị tăng dần
SELECT P.productCode,
P.productName,
SUM(priceEach * quantityOrdered) total FROM orderdetails O
INNER JOIN products P ON O.productCode = P.productCode GROUP by productCode
ORDER BY total
(86)82
Bên cạnh phép nối hai bảng liệu, ta nối nhiều bảng liệu câu
lệnh SELECT
Ví dụ: Đưa tên khách hàng tổng giá trị đơn hàng khách hàng
SELECT C.customerName, sum(OD.priceEach*OD.quantityOrdered) as total
FROM customers C
INNER JOIN orders O on C.customerNumber = O.customerNumber INNER JOIN orderdetails OD on O.orderNumber =
OD.orderNumber
GROUP BY C.customerName
Như ví dụ thơng tin cần kết hợp từ ba bảng liệu customers, orders
orderdetails
(87)83
SELECT O.orderNumber,C.customerName,
sum(OD.priceEach*OD.quantityOrdered) as total FROM customers C
INNER JOIN orders O on C.customerNumber = O.customerNumber INNER JOIN orderdetails OD on O.orderNumber =
OD.orderNumber
GROUP BY O.orderNumber;
2 PHÉP NỐI TRÁI (LEFT JOIN)
LEFT JOIN tùy chọn câu lệnh SELECT cho phép lấy thêm liệu từ
các bảng khác LEFT JOIN bao gồm từ khóa LEFT JOIN, bảng thứ hai
muốn thực nối Yếu tố từ khóa ON theo sau điều kiện nối
Mệnh đề LEFT JOIN thực sau: hàng từ bảng bên trái phù hợp
với hàng từ bảng bên phải dựa điều kiện nối, nội dung hàng lựa
chọn dòng kết đầu Khi hàng bảng bên trái khơng tìm
được hàng phù hợp bảng nối, xuất kết đầu ra,
(88)Tóm lại, LEFT JOIN cho phép ch
có ghi phù hợp với b
Ví dụ: sử dụng LEFT JOIN
Chúng ta xét vào hai bảng
hố đơn họ tình tr
JOIN sau:
SELECT c.customerNumber, FROM customers c
LEFT JOIN orders o ON c.customerNumber = o.customerNumber; i, LEFT JOIN cho phép chọn tất hàng từ bảng bên trái c
i bảng bên phải
ng customers orders Nếu muốn biết khách hàng v
và tình trạng hố đơn nào, sử dụng MySQL LEFT
SELECT c.customerNumber, customerName,orderNUmber, o.status
LEFT JOIN orders o ON c.customerNumber = o.customerNumber;
84
ng bên trái không
t khách hàng với
ng MySQL LEFT
customerName,orderNUmber, o.status
(89)Ở bảng kết trên, nh
những ghi có thơng tin khách h
NULL Điều có nghĩa nh
nào lưu sở li
LEFT JOIN hữu ích muốn t
với ghi b
thêm mệnh đề WHERE để lựa chọn h
bảng bên phải Vì vậy, để tìm th
nào sở liệu chúng
SELECT c.customerNumber, customerName,orderNUmber, o.status FROM customers c
LEFT JOIN orders o ON c.customerNumber = o.customerNumber WHERE orderNumber is NULL
Kết trả sau:
ể nhìn thấy tất khách hàng liệt kê
ững ghi có thơng tin khách hàng tất thơng tin v
à khách hàng khơng có đ
ệu
ất hữu ích muốn tìm ghi bảng bên trái mà không phù h
ào bảng bên phải thực điều n
ột mệnh đề WHERE để lựa chọn hàng có giá trị NULL cột
ìm thấy tất khách hàng khơng có đ
ệu chúng ta, sử dụng LEFT JOIN sau:
SELECT c.customerNumber, customerName,orderNUmber, o.status
LEFT JOIN orders o ON c.customerNumber = o.customerNumber WHERE orderNumber is NULL
85
ê Tuy nhiên, có
các thơng tin đơn hàng
ỳ đơn đặt hàng
ên trái mà không phù hợp
ải thực điều cách
ỉ có giá trị NULL cột
ất kỳ đơn đặt hàng
ư sau:
SELECT c.customerNumber, customerName,orderNUmber, o.status
(90)Như vậy, truy vấn trả các giá trị NULL
Tương tự vậy, để tìm nh bước đầu, thực truy vấn nh
Select * from employees e left join customers c
on e.employeenumber=c.salesrepemployeenumber
các khách hàng mà khơng có đơn hàng nh
những nhân viên không làm nhiệm vụ chăm sóc khách hàng, ấn sau:
Select * from employees e left join customers c
on e.employeenumber=c.salesrepemployeenumber
86
đơn hàng nhờ vào
(91)87
Sau lọc ghi nhận giá trị null cột customerNumber, kết truy vấn
Select * from employees e left join customers c
on e.employeenumber=c.salesrepemployeenumber where customerNumber is null
3 PHÉP TỰ NỐI (Self Join)
Một phép tự nối kiểu nối bảng nối với nó, cụ thể bảng có khóa ngồi tham chiếu tới khóa
Ví dụ: Bảng employees có khóa ngồi reportsTo tham chiếu tới khóa employeeNumber bảng employees
Cần thiết phải sử dụng bí danh cho bảng để tránh nhập nhằng
SELECT concat (e1.lastName ," ",e1.firstName) as fullname, e1.email, concat (e2.lastName ," ",e2.firstName) as
manager, e2.email
FROM employees e1, employees e2
WHERE e1.reportsTo = e2.employeeNumber;
(92)88
Bài tập thực hành:
1 Đưa thông tin nhân viên tên văn phòng nơi họ làm việc
2 Đưa thông tin tên khách hàng tên sản phẩm họ mua
3 Đưa thơng tin mặt hàng chưa có đặt mua
4 Đưa đơn hàng tháng 3/2005 (gồm orderDate, requiredDate, Status) tổng giá trị đơn hàng
(93)89 Bài thực hành số
Truy vấn (Subquery)
Nội dung chính: Khái niệm sử dụng truy vấn con, truy vấn tương quan không tương quan
1 Khái niệm truy vấn
Để kết hợp bảng liệu với nhau, ngồi phép nối tốn tử tập hợp, SQL cung cấp cách khác để trả lại liệu từ nhiều bảng gọi truy vấn (subquery) Khi câu lệnh SELECT sử dụng câu lệnh khác, câu lệnh SELECT bên gọi truy vấn (subquery), cách gọi khác truy vấn lồng (nested query), truy vấn (inner query) Cơ truy vấn sử dụng nơi đâu mà biểu thức sử dụng
Ví dụ: Đưa đơn hàng gần
SELECT * FROM orders
WHERE orderDate = (SELECT MAX(orderDate) FROM orders)
Truy vấn SELECT MAX(orderDate) FROM orders trả lại ngày gần đơn hàng giá trị sử dụng mệnh đề WHERE truy vấn Kết hợp hai truy vấn trả lại danh sách đơn hàng ngày gần
Truy vấn chia làm hai loại: truy vấn không tương quan (non-correlated) truy vấn có tương quan (correlated)
2 Truy vấn không tương quan
(94)90
bộ câu lệnh Kết truy vấn điền vào truy vấn bên ngoài, cuối thi hành truy vấn bên ngồi
Ví dụ: đưa các sản phẩm khơng có mặt đơn hàng Truy vấn
bên trả mã sản phẩm có bảng orderdetails Truy vấn bên ngồi trả sản phẩm có mã khơng danh sách mã sản phẩm
SELECT *
FROM products
WHERE productCode not in (SELECT productCode FROM orderdetails )
Ví dụ:đưa sản phẩm có mặt đơn hàng
SELECT * FROM products WHERE productCode in (SELECT productCode FROM orderdetails
(95)91 3 Truy vấn tương quan
Truy vấn tương quan khơng độc lập với truy vấn bên ngồi Một truy vấn tương quan truy vấn sử dụng giá trị từ truy vấn bên mệnh đề WHERE Q trình thực sau: truy vấn bên thực trước tiên sau thi hành truy vấn bên cho dòng kết truy vấn bên ngồi
Ví dụ:đưa sản phẩm có số lượng kho lớn trung bình số lượng kho
của sản phẩm loại
SELECT * FROM products p WHERE quantityInStock >
(SELECt avg(quantityInStock) FROM products
WHERE productLine = p.productLine )
Quá trình thực truy vấn sau: với dịng sản phẩm truy vấn bên ngồi, câu lệnh truy vấn bên tìm số lượng sản phẩm trung bình của sản phẩm loại với sản phẩm kết truy vấn đưa vào mệnh đề WHERE để kiểm tra
Ví dụ: đưa sản phẩm có mặt đơn hàng, cách viết cách
khác ví dụ phần trước Sử dụng toán tử EXISTS để kiểm tra tồn
(96)92
WHERE exists
(SELECT productCode FROM orderdetails
WHERE productCode = p.productCode)
4 Sử dụng truy vấn
Ngoài sử dụng truy vấn mệnh đề WHERE, truy vấn cịn sử dụng danh sách cột câu lệnh SELECT mệnh đề FROM
Ví dụ: với dòng đơn hàng, đưa vào thêm tên sản phẩm
SELECT orderNumber, quantityOrdered,
(SELECT productName FROM products WHERE productCode = o.productCode) as productName
(97)93
Trong ví dụ tên sản phẩm kết truy vấn bảng products
Ví dụ: với sản phẩm, đưa kèm thêm tổng số lượng sản phẩm đặt hàng
SELECT productName,
(SELECT sum(quantityOrdered) FROM orderdetails WHERE productCode = p.productCode) as totalQuantityOrderd FROM products as p
(98)94
Trong ví dụ giá trị tổng số lượng đặt kết truy vấn từ bảng orderDetails
Ví dụ viết lại cách coi kết truy vấn bảng liệu, sau nối bảng products với bảng kết
SELECT productName, totalQuantityOrderd FROM products,
(SELECT productCode,sum(quantityOrdered) as totalQuantityOrderd FROM orderdetails group by productCode) AS productOrder
WHERE products.productCode = productOrder.productCode
(99)95
Bài tập thực hành
1 Sử dụng truy vấn đưa sản phẩm có đơn đặt hàng tháng 3/2005 2 Tương tự câu hỏi dùng phép nối bảng thay sử dụng truy vấn Sử dụng truy vấn đưa thông tin đơn hàng tháng gần
(sử dụng thông tin từ bảng orders)
4 Sử dụng truy vấn đưa thông tin đơn hàng tổng giá trị đơn hàng (sử dụng thông tin từ bảng orders orderdetails)
5
(100)96 Bài thực hành số
Thêm, sửa, xóa liệu bảng
Nội dung: Các câu lệnh cập nhật liệu - Lệnh INSERT
- Câu lệnh UPDATE - Câu lệnh DELETE
1 Câu lệnh INSERT
Câu lệnh INSERT cho phép thêm dòng liệu vào bảng xác định Có hai biến thể lệnh INSERT: cách thứ thêm dòng giá trị, cách thứ hai thêm tập dòng trả từ câu lệnh SELECT
Thêm dòng giá trị
INSERT INTO table_name [(column_name, )]
VALUES((expression | DEFAULT), ),( ),
INSERT tạo dòng bảng <table_name> Dòng chứa giá trị xác định biểu thức danh sách VALUES Nếu column_name không đưa vào, trình tự cột bảng <table_name> sử dung Nếu column_name đưa, theo cách này, dòng liệu thêm vào bảng cách xác định tên cột liệu cho cột
Ví dụ: thêm ghi vào bảng offices
INSERT INTO classicmodels.offices (officeCode,
city, phone,
(101)97
addressLine2, state,
country, postalCode, territory )
VALUES ('8', 'Boston',
'+1 215 837 0825', '1550 dummy street', NULL,
'MA, 'USA', '02107', 'NA'
)
Nếu giá trị chưa xác định sử dụng từ khóa NULL Sử dụng giá trị ngầm định từ khóa DEFAULT
Có thể kiểm tra kết lệnh câu lệnh truy vấn:
(102)98
Kết dòng liệu ghi vào cuối bảng liệu
Chú ý: Nếu không xác định tên cột, trật tự cột thay đổi, SQL đưa
giá trị vào sai vị trí Do cách tốt để tránh điều xác định tên cột kèm với liệu thêm liệu vào bảng
Thêm nhiều dòng với lệnh SELECT
Ngồi thay cung cấp liệu trực tiếp, chọn từ bảng khác sử dụng câu lệnh SELECT
INSERT INTO table_name [(column_name, )] <SELECT statement>;
Không giống với cách trước, cách cho phép tạo nhiều dòng liệu với Danh sách cột kết lệnh SELECT phải trùng với danh sách cột bảng Cũng giống cách trước, cột không xác định gán giá trị ngầm ngậm cột
Ví dụ: tạo bảng tạm thêm vào tất offices US
INSERT INTO temp_table SELECT *
FROM classicmodels.offices WHERE country = 'USA'
Có thể kiểm tra kết lệnh câu lệnh truy vấn:
(103)99 2 Câu lệnh UPDATE
Câu lệnh UPDATE sử dụng để cập nhật liệu tồn bảng CSDL Câu lệnh dùng để thay đổi giá trị dịng, nhóm dịng chí tất dòng bảng Cấu trúc câu lệnh UPDATE sau:
UPDATE table_name [, table_name ] SETcolumn_name1=expr1
[, column_name2=expr2 ] [WHERE condition]
Sau từ khóa UPDATE tên bảng muốn thay đổi liệu Mệnh đề SET xác định
cột thay đổi giá trị thay đổi Giá trị thay đổi giá trị cố định, biểu thức chí truy vấn
Mệnh đề WHERE xác định dòng bảng cập nhật Nếu mệnh đề
WHERE bị bỏ qua, tất dòng bảng bị cập nhật
Mệnh đề WHERE quan trọng, không nên bị bỏ qua Nếu muốn thay đổi dòng bảng, quên mệnh đề WHERE cập nhật toàn bảng
Nếu câu lệnh UPDATE vi phạm ràng buộc tồn vẹn nào, MySQL
khơng thực cập nhật đưa thông báo lỗi
Ví dụ: Trong bảng employees, muốn cập nhật email Diane Murphy với
employeeNumber 1002 thành diane-murphy @classicmodelcars.com,
Thực câu truy vấn sau:
SELECT firstname, lastname, email
FROM employees
(104)100
Kết cập nhật email diane-murphy@classicmodelcars.com
UPDATE employees
SET email = 'diane-murphy @classicmodelcars.com' WHERE employeeNumber = 1002
Thực câu truy vấn SELECT lại, thấy email thay đổi giá trị mới:
3 Câu lệnh DELETE
Để xóa dòng liệu bảng CSDL, sử dụng câu lệnh DELETE
Cấu trúc lệnh DELETE sau:
DELETE FROM table_name [WHERE conditions]
Sau DELETE FROM tên bảng muốn xóa ghi Mệnh đề WHERE xác
định điều kiện để giới hạn dòng muốn loại bỏ Nếu ghi thỏa mãn điều kiện WHERE bị loại bỏ khỏi bảng CSDL
Nếu mệnh đề WHERE bị bỏ qua câu lệnh DELETE, tất dịng
bảng bị xóa Để giảm nguy hiểm câu lệnh DELETE UPDATE, nên luôn kiểm tra điều kiện WHERE câu lệnh SELECT trước thực lệnh DELELE UPDATE
Ví dụ: Xóa tất nhân viên văn phịng có mã officeNumber 6, thực câu
(105)101
DELETE
FROM employees
WHERE officeCode =
Thực lại câu lệnh truy vấn bảng employees.Trong bảng khơng cịn dịng có officeCode =
Chú ý: Nếu loại bỏ điều kiện WHERE
DELETE FROM employees
Sẽ xóa tất dịng bảng employees Do cần ý điều kiện mệnh đề WHERE thực lệnh DELETE
MySQL hỗ trợ xóa ghi từ nhiều bảng khác
Ví dụ: xóa tất nhân viên (employee) làm việc cho văn phịng có mã officecode
và xóa văn phịng
DELETE employees,offices FROM employees,offices
WHERE employees.officeCode = offices.officeCode AND offices.officeCode =
(106)102
Bảng offices khơng cịn dịng có officeCode =
4 Cập nhật liệu có ràng buộc
(107)103
Nếu xóa dịng liệu bảng productline mà tồn dòng liệu bảng products tham chiếu tới dòng liệu này, ngầm định khơng phép
Ví dụ: Xóa dịng sản phẩm có mã ‘Ships’
DELETE FROM productlines WHERE productLine='Ships'
Sẽ thông báo lỗi “Cannot delete or update a parent row: a foreign key constraint fails (`classicmodels`.`products`, CONSTRAINT `fk_products_productlines` FOREIGN KEY (`productLine`) REFERENCES `productlines` (`productLine`) ON DELETE NO ACTION ON UPDATE NO ACTION)”
Nếu khai báo khóa ngồi với tùy chọn ON DELETE CASCADE, hệ thống tự động xóa dịng liệu bảng products tham chiếu tới dòng liệu
(108)104
Bài tập thực hành
1 Thực hành lệnh INSERT, UPDATE DELETE bảng hình
dưới CSDL classicmodels
2 Tạo bảng đặt tên temp_orderdetails, sau thực thêm liệu ngày gần từ bảng orderdetails vào bảng
(109)105 Bài thực hành số 10
Mơ hình hóa CSDL sử dụng công cụ MySQL Workbench
Nội dung chính:
- Giới thiệu MySQL Workbench - Tạo mơ hình EER
- Tạo CSDL từ mơ hình quan hệ thực thể EER ngược lại
1 Giới thiệu MySQL Workbench
MySQL Workbench cung cấp công cụ đồ họa để làm việc với MySQL Server
CSDL MySQL Workbench cung cấp ba lĩnh vực chức chính:
Phát triển SQL: giúp tạo quản lý kết nối tới CSDL server, cấu hình tham số kết nối MySQL Workbench cung cấp khả thi hành truy vấn SQL kết nối CSDL
Mơ hình hóa liệu: Cho phép tạo mơ hình lược đồ CSDL cách trực quan Cung cấp khả tạo lược đồ từ CSDL có sẵn (reverse) tạo CSDL từ lược đồ (forward) Chức Table Editor giúp dễ dàng sửa đổi bảng, cột, mục, phân mảnh
(110)106
MySQL Workbench cung cấp môi trường khác nhau: Windows
Linux
Mac OS X
Trên môi trường Windows, để chạy Workbench máy tính cần cài đặt NET framework
Phần sau tập trung vào chức mơ hình hóa liệu
2 Tạo mơ hình quan hệ thực thể EER
(111)(112)108 Bước 3: Thêm bảng yêu cầu vào biểu đồ tạo bước trước sửa đổi
bảng để đạt yêu cầu đặt
Để thêm bảng vào mơ hình, chọn vào biểu tượng khoanh trịn hình
Để sửa đổi bảng, chọn bảng chọn chức Edit Table
Ví dụ: sửa tên bảng tạo film bổ sung thêm cột hình vẽ
PK: thuộc tính khóa
NN: giá trị không để trống
UQ: ràng buộc giá trị
BIN: để giá trị lưu dạng nhị phân
(113)109
AI: Nếu giá trị thuộc tính tự tăng
Default: Là giá trị ngầm định cột
Tạo liên kết bảng
Công cụ hỗ trợ tạo mối quan hệ bảng: gồm quan hệ 1-1, quan hệ 1-n, quan hệ n-m
(114)110
Nếu lựa chọn biểu tượng nét đứt: thuộc tính tự động tạo bên bảng tham chiếu để tham chiếu tới khóa bảng tham chiếu, thuộc tính tạo khơng phải thuộc tính khóa bảng tham chiếu
Nếu lựa chọn biểu tượng nét liền: thuộc tính tương tự tạo ra, khác biệt chỗ thuộc tính có thuộc tính khóa bảng tham chiếu
Nếu lựa chọn biểu tượng nét liền kèm bút: cho phép lựa chọn thuộc tính có sẵn bảng tham chiếu làm khóa ngồi tham chiếu tới khóa bảng tham chiếu
Ví dụ: Tạo quan hệ 1-n bảng language bảng film tạo bước
Bước 1: Chọn vào biểu tượng hình vẽ dưới
Bước 2: Click chuột vào bảng film, tiếp click chuột vào bảng language
(115)111
Ngồi cách tạo liên kết khóa ngồi trên, tạo liên kết khóa ngồi cách
Chọn sửa đổi bảng tham chiếu
Chọn vào tab Foreign Keys hình vẽ đây:
Chú ý: Giao diện ngồi tạo liên kết khóa ngồi cịn hỗ trợ sửa đổi tùy chọn
(116)112 Ví dụ: Tạo liên kết n-m hai bảng film category
Bước 1: Chọn vào biểu tượng hình vẽ dưới
Bước 2: Click chuột vào bảng film sau bảng category
Kết công cụ tự động sinh bảng có tên film_has_category có khóa chính là tổ hợp từ khóa hai bảng film bảng category
(117)113 3 Tạo CSDL từ mơ hình quan hệ thực thể EER
Để tạo sở liệu tên my_classicmodels lưu vào MySQL từ mơ hình trên:
Bước 1: Sử dụng chức Database -> Forward Engineer
Bước 2: Chọn đối tượng từ mơ hình EER lưu vào CSDL
(118)114 4 Đồng hóa mơ hình EER với CSDL MySQL Server
(119)115
Ví dụ trên, mơ hình EER bổ sung bảng actor Để tiến hành đồng hóa, thực bước sau:
Bước 1: Chọn chức Database -> Synchronize Model
Bước 2: Chọn kết nối tới MySQL server cần đồng hóa
Bước 3: Chọn CSDL muốn đồng đối tượng cần đồng hóa mơ hình EER
(120)116 5 Tạo mơ hình quan hệ thực thể EER từ CSDL có sẵn
(121)117
Hộp thoại Database server muốn kết nối đến
(122)118
(123)119
Bài tập thực hành
1 Tạo mơ hình tên my_classicmodels gồm bảng sau:
Các ràng buộc khóa ngồi với tùy chọn ON UPDATE CASCADE
Các bảng sử dụng engine InnoDB
Các khóa kiểu số tự động tăng
Dùng chức Forward Engine để tạo sở liệu đặt tên my_classicmodels
(124)120
Bảng orders tạo câu tham chiếu tới bảng customers
Sau sử dụng chức đồng hóa để đồng mơ hình với CSDL