1. Trang chủ
  2. » Nghệ sĩ và thiết kế

Bài giảng thực hành Cơ sở dữ liệu – UET – Tài liệu VNU

124 47 1

Đ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 124
Dung lượng 4,25 MB

Nội dung

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

Ngày đăng: 28/12/2020, 10:31

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

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

TÀI LIỆU LIÊN QUAN

w