---
# System prepended metadata

title: Bài thực hành MySQL số 2

---

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


