---
# System prepended metadata

title: Câu lệnh SQL
tags: [tìm hiểu]

---

# Câu lệnh SQL

## Các nhóm lệnh SQL

![image](https://hackmd.io/_uploads/rkFQwiwiT.png)

![image](https://hackmd.io/_uploads/rJCgqsDsp.png)

![image](https://hackmd.io/_uploads/r1ZGcivjp.png)

![image](https://hackmd.io/_uploads/rJ5mcjPiT.png)


![image](https://hackmd.io/_uploads/rJRIcjws6.png)


![image](https://hackmd.io/_uploads/H1Ma9sPj6.png)

## Cấu trúc một câu truy vấn

```sql!
SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
HAVING condition
ORDER BY column_name(s);
```

## Một số câu lệnh phổ biến
### SELECT
- SELECT dùng để truy xuất dữ liệu từ cơ sở dữ liệu Dữ liệu trả về được lưu trữ trong một bảng
- SYNTAX

```sql!
SELECT column1, column2, ...
FROM table_name;
```

### SELECT DISTINCT
- SELECT DISTINCT dùng để truy xuất dữ liệu khác nhau từ cơ sở dữ liệu (chỉ trả về một hàng trong trường hợp các hàng có cùng giá trị)
- Syntax

```sql!
SELECT DISTINCT column1, column2, ...
FROM table_name;
```

### Mệnh đề WHERE
- WHERE được sử dụng để lọc dữ liệu, chỉ truy vấn dữ liệu thoả mãn điều kiện trong mệnh đề WHERE
- Syntax

```sql!
SELECT column1, column2, ...
FROM table_name
WHERE condition;
```

### ORDER BY
- ORDER BY dùng để sắp xếp result-set theo thứ tự tăng dần hoặc giảm dần, mặc định là tăng dần.
- Syntax

```sql!
SELECT column1, column2, ...
FROM table_name
ORDER BY column1, column2, ... ASC|DESC;
```

### Toán tử
#### Toán tử bằng '='
VD:
```sql!
SELECT * FROM Products
WHERE Price = 10;
```

#### Toán tử lớn hơn '>'
#### Toán tử nhỏ hơn '<'
VD:
```sql!
SELECT * FROM Products
WHERE Price < 5;
```
#### Toán tử ">="
#### Toán tử '<='
VD:
```sql!
SELECT * FROM Products
WHERE Price <= 7;
```
#### Toán tử không bằng '<>', '!='
VD:
```sql!
SELECT * FROM Products
WHERE Price <> 18;
```
#### Toán tử AND, OR, NOT
- ```AND``` chọn bản ghi nếu các điều kiện là TRUE ```OR``` chọn bản ghi nếu một trong các điều kiện là TRUE ```NOT``` chọn bản ghi nếu điều kiện là FALSE
- AND Syntax:

```sql!
SELECT column1, column2, ...
FROM table_name
WHERE condition1 AND condition2 AND condition3 ...;
```
- OR Syntax:

```sql!
SELECT column1, column2, ...
FROM table_name
WHERE condition1 OR condition2 OR condition3 ...;
```

- NOT Syntax:

```sql!
SELECT column1, column2, ...
FROM table_name
WHERE NOT condition;
```

#### Toán tử BETWEEN
- BETWEEN cho phép lấy các giá trị trong phạm vi nhất định, có thể là số, văn bản hoặc ngày tháng.
- Syntax:

```sql!
SELECT column_name(s)
FROM table_name
WHERE column_name BETWEEN value1 AND value2;SELECT column_name(s)
FROM table_name
WHERE column_name BETWEEN value1 AND value2;
```

VD:
```sql!
SELECT * FROM Orders
WHERE OrderDate BETWEEN '1996-07-01' AND '1996-07-05';
```
```sql!
SELECT * FROM Products
WHERE ProductName BETWEEN 'Carnarvon Tigers' AND 'Chocolade'
ORDER BY ProductName;
```
#### Toán tử LIKE
- ```LIKE``` được dùng trong mệnh đề WHERE, dùng để tìm kiếm mẫu được chỉ định trong cột 2 ký tự thường được sử dụng trong toán tử LIKE
    - ```%```: đại diện cho 0, 1 hoặc nhiều ký tự
    - ```_```: đại diện cho 1 ký tự

- Syntax:

```sql!
SELECT column1, column2, ...
FROM table_name
WHERE columnN LIKE pattern;
```

VD: 
```sql!
SELECT * FROM Customers
WHERE CustomerName LIKE 'a%';
```

```sql!
SELECT * FROM Customers
WHERE CustomerName LIKE '_n%';
```

#### Toán tử IN
- IN được dùng trong mệnh đề WHERE, dùng để chỉ định nhiều giá trị trong cột, tương tự toán tử OR.
- Syntax:

```sql!
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1, value2, ...);
```

VD:
```sql!
SELECT * FROM Customers
WHERE Country IN (SELECT Country FROM Suppliers);
```
### INSERT INTO
- INSERT INTO dùng để chèn bản ghi mới vào bảng Có 2 cách sử dụng INSERT INTO:
- Chỉ định tên cột được chèn Syntax:
```sql!
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
```
- Trong trường hợp thêm giá trị cho tất cả các cột thì không cần chỉ định tên cột Syntax:

```sql!
INSERT INTO table_name
VALUES (value1, value2, value3, ...);
```

### DELETE
- DELETE dùng để xoá bản ghi hiện có trong bảng
- Syntax:

```sql!
DELETE FROM table_name WHERE condition;
```

### Join

- JOIN dùng để kết hợp các hàng có liên quan từ 2 bảng thành một bảng

#### INNER JOIN

![image](https://hackmd.io/_uploads/SkEqquvop.png)

- Syntax:

```sql!
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;
```

#### LEFT JOIN

![image](https://hackmd.io/_uploads/B1lU7oOvsa.png)

- Syntax:

```sql!
SELECT column_name(s)
FROM table1
LEFT JOIN table2
```

#### RIGHT JOIN

![image](https://hackmd.io/_uploads/HJVvidPsp.png)

- Syntax:

```sql!
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;
```
#### FULL OUTER JOIN

![image](https://hackmd.io/_uploads/rkQco_wsa.png)

- Syntax:

```sql!
SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name = table2.column_name
WHERE condition;
```

#### SELF JOIN
- SELF JOIN dùng để kết hợp một bảng với chính nó 
- Syntax:

```sql!
SELECT column_name(s)
FROM table1 T1, table1 T2
WHERE condition;
```
### UNION
- UNION là toán tử dùng để kết hợp result-set của hai hay nhiều câu lệnh SELECT
    - Các result-set phải có cùng số cột
    - Các cột phải có kiểu dữ liệu giống nhau
    - Các cột trong result-set phải có cùng thứ tự 
- Syntax:

```sql!
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
```

Nếu muốn in các giá trị trùng nhau nhiều lần, sử dụng UNION ALL Ví dụ:
```sql!
SELECT City FROM Customers
UNION ALL
SELECT City FROM Suppliers
ORDER BY City;
```

#### GROUP
- GROUP dùng để kết hợp các hàng có cùng giá trị thành một hàng GROUP thường được sử dụng cùng các function như COUNT(), MAX(), MIN(), SUM(), AVG() 
- Syntax:

```sql!
SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
ORDER BY column_name(s);
```
### HAVING
- HAVING có chức năng như WHERE nhưng vì WHERE không thể dùng được với các hàm kết hợp nên cần HAVING 
- Syntax:

```sql!
SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
HAVING condition
ORDER BY column_name(s);
```

### Một số function phổ biến
#### MIN(), MAX()
- MIN() trả về giá trị nhỏ nhất của cột đã chọn MAX() trả về giá trị lơn nhất của cột đã chọn 
- Syntax

```sql!
SELECT MIN(column_name)
FROM table_name
WHERE condition;
```

```sql!
SELECT MAX(column_name)
FROM table_name
WHERE condition;
```

#### COUNT(),AVG(), SUM()
- COUNT() trả về số hàng phù hợp AVG() trả về giá trị trung bình của một cột có giá trị là số SUM() trả về tổng của một cột có giá trị là số 
- Syntax: 

```sql!
SELECT COUNT(column_name)
FROM table_name
WHERE condition;
```

```sql!
SELECT AVG(column_name)
FROM table_name
WHERE condition;
```

```sql!
SELECT SUM(column_name)
FROM table_name
WHERE condition;
```

## Thứ tự thực hiện câu lệnh SQL

![image](https://hackmd.io/_uploads/SJU8nvDsT.png)


![image](https://hackmd.io/_uploads/HyqK3PwsT.png)

## Common Table Expression (CTE)

![image](https://hackmd.io/_uploads/Bk-B6wvop.png)

![image](https://hackmd.io/_uploads/SkGF6PDi6.png)

- Ví dụ

![image](https://hackmd.io/_uploads/H13nRwPjT.png)

![image](https://hackmd.io/_uploads/S1wg4oPia.png)

![image](https://hackmd.io/_uploads/B1d74iDj6.png)

![image](https://hackmd.io/_uploads/rJGr4oDsp.png)

![image](https://hackmd.io/_uploads/H1wINoPop.png)

![image](https://hackmd.io/_uploads/Hk5KriwsT.png)

## Windows Functions

![image](https://hackmd.io/_uploads/Hyd_UswjT.png)


![image](https://hackmd.io/_uploads/S1sDIoDoa.png)


![image](https://hackmd.io/_uploads/rJbeIjDip.png)

![image](https://hackmd.io/_uploads/HyCBLovoT.png)


