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

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

Đ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

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ài liệu cùng người dùng

Tài liệu liên quan