# Bài thực hành MySQL số 2 ## I. Đổi cổng MySQL: Chọn config -> my.ini -> đổi các port thành cổng khác Vào thư mục xampp -> phpAdmin -> config.inc.php Sửa 2 dòng lệnh: ```php /* Bind to the localhost ipv4 address and tcp */ $cfg['Servers'][$i]['host'] = '127.0.0.1'; $cfg['Servers'][$i]['connect_type'] = 'tcp'; ``` thành ```php /* Bind to the localhost ipv4 address and tcp */ $cfg['Servers'][$i]['host'] = '127.0.0.1'; $cfg['Servers'][$i]['port'] = 'tên cổng'; $cfg['Servers'][$i]['connect_type'] = 'tcp'; ``` ## II. Nạp dữ liệu trong MySQL Vào shell trong xampp, sau đó đăng nhập mysql bằng cách: ```bash mysql -u root -p ``` với mật khẩu trống. Sau đó thực hiện nạp dữ liệu: ```bash mysql> SOURCE ...-schema.sql; mysql> SOURCE ...-data.sql; ``` ## III. Bài tập: Database sakila 1. Đưa ra thông tin khách hàng và số lượng đĩa đang được thuê, chưa trả tại cửa hàng có mã là 2 trong tháng 2, năm 2006. ```sql SELECT c.first_name, c.last_name, COUNT(*) AS NUMBER FROM customer c JOIN rental r ON c.customer_id = r.customer_id WHERE r.return_date IS NULL AND EXTRACT(YEAR_MONTH FROM r.rental_date) = "200602" AND c.store_id = 2 GROUP BY c.customer_id; ``` 2. Đưa ra danh sách các film trong bảng film_text mà trong mô tả (description) xuất hiện đồng thời hai từ là ‘drama’ và ‘teacher’ a. Sử dụng từ khóa LIKE ```sql SELECT * FROM film_text ft WHERE ft.description LIKE '%drama%' AND ft.description LIKE '%teacher%'; ``` b. Sử dụng FULL TEXT SEARCH (FTS) Xem chỉ mục của bảng: ```sql SHOW INDEX FROM table; ``` Đáp án: ```sql SELECT * FROM film_text ft WHERE MATCH(ft.title, ft.description) AGAINST( '+drama +teacher' IN BOOLEAN MODE ); ``` 3. Sử dụng FTS tìm kiếm film mà mô tả chứa cụm từ “Mad Scientist” ```sql SELECT * FROM film_text ft WHERE MATCH(ft.title, ft.description) AGAINST("Mad Scientist" IN BOOLEAN MODE); ``` 4. Đưa ra tên 10 bộ phim được thuê nhiều nhất trong tháng 2/2006, sử dụng hai cách: truy vấn con và cách nối bảng. - Nối bảng: ```sql SELECT f.film_id, f.title, COUNT(*) AS NUMBER FROM rental r JOIN inventory i ON r.inventory_id = i.inventory_id JOIN film f ON i.film_id = f.film_id WHERE EXTRACT(YEAR_MONTH FROM r.rental_date) = "200602" GROUP BY f.film_id ORDER BY NUMBER DESC LIMIT 10; ``` - Subquery: ```sql SELECT f.film_id, f.title, ( SELECT COUNT(*) FROM rental r WHERE EXTRACT(YEAR_MONTH FROM r.rental_date) = '200602' AND EXISTS( SELECT i.film_id FROM inventory i WHERE i.inventory_id = r.inventory_id AND i.film_id = f.film_id ) ) AS NUMBER FROM film f ORDER BY NUMBER DESC LIMIT 10; ``` 5. Đưa ra danh sách cửa hàng và tổng số đĩa film được thuê của mỗi cửa hàng trong tháng 2/2006, danh sách sắp xếp theo thứ tự số lượng giảm dần ```sql SELECT *, ( SELECT COUNT(*) FROM rental r JOIN inventory i ON r.inventory_id = i.inventory_id WHERE EXTRACT(YEAR_MONTH FROM r.rental_date) = '200602' AND i.store_id = s.store_id ) AS NUMBER FROM store s ORDER BY NUMBER DESC; ``` 6. Đưa ra số lượng các đĩa phim có tiêu đề ‘AGENT TRUMAN’ còn trong store_id là 1 ```sql SELECT f.film_id, f.title, COUNT(*) AS NUMBER FROM film f JOIN inventory i ON f.film_id = i.film_id WHERE f.title = 'AGENT TRUMAN' AND i.store_id = 1 GROUP BY f.film_id; ```