# 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;
```