# Truy cập dữ liệu trong SQL (MySQL và MSSQL)
Truy cập dữ liệu trong SQL là một phần quan trọng trong công việc xử lý dữ liệu trong hệ quản trị cơ sở dữ liệu (DBMS). SQL (Structured Query Language) là ngôn ngữ được sử dụng rộng rãi để tương tác với cơ sở dữ liệu. Câu lệnh chính để truy cập dữ liệu trong SQL là `SELECT`.
## Câu lệnh SELECT
Câu lệnh `SELECT` được sử dụng để truy vấn dữ liệu từ một hoặc nhiều bảng trong cơ sở dữ liệu. Dưới đây là cú pháp cơ bản của câu lệnh `SELECT`:
**MySQL:**
```sql
SELECT column1, column2, ...
FROM table_name;
```
**MSSQL:**
```sql
SELECT column1, column2, ...
FROM table_name;
```
- `SELECT`: Từ khóa bắt đầu câu lệnh truy vấn.
- `column1, column2, ...`: Danh sách các cột mà bạn muốn lấy dữ liệu.
- `FROM table_name`: Tên của bảng mà bạn muốn truy vấn dữ liệu từ đó.
### Ví dụ:
**MySQL:**
```sql
SELECT first_name, last_name
FROM employees;
```
**MSSQL:**
```sql
SELECT first_name, last_name
FROM employees;
```
Trong ví dụ này, chúng ta truy vấn tất cả các cột `first_name` và `last_name` từ bảng `employees`.
## Giải thích biểu thức với câu lệnh SELECT
Biểu thức có thể được sử dụng trong câu lệnh `SELECT` để tính toán dữ liệu hoặc biểu thức mới từ dữ liệu hiện có. Các biểu thức có thể bao gồm các phép tính cơ bản, hàm toán học và hàm xây dựng sẵn trong SQL.
### Ví dụ:
**MySQL:**
```sql
SELECT first_name, last_name, salary * 12 AS annual_salary
FROM employees;
```
**MSSQL:**
```sql
SELECT first_name, last_name, salary * 12 AS annual_salary
FROM employees;
```
Trong ví dụ này, chúng ta sử dụng biểu thức `salary * 12` để tính toán thu nhập hàng năm của mỗi nhân viên và đặt tên cho cột kết quả là `annual_salary` bằng cách sử dụng `AS`.
## Các mệnh đề khác nhau được sử dụng với SELECT
Các mệnh đề khác nhau như `WHERE`, `DISTINCT`, `LIMIT`, và `OFFSET` có thể được sử dụng cùng với câu lệnh `SELECT` để tùy chỉnh kết quả truy vấn.
### Mệnh đề WHERE
**MySQL:**
```sql
SELECT first_name, last_name
FROM employees
WHERE department = 'HR';
```
**MSSQL:**
```sql
SELECT first_name, last_name
FROM employees
WHERE department = 'HR';
```
Mệnh đề `WHERE` được sử dụng để lọc dữ liệu dựa trên điều kiện cụ thể. Trong ví dụ này, chúng ta chỉ truy vấn nhân viên thuộc phòng ban 'HR'.
### Mệnh đề DISTINCT
**MySQL:**
```sql
SELECT DISTINCT department
FROM employees;
```
**MSSQL:**
```sql
SELECT DISTINCT department
FROM employees;
```
Mệnh đề `DISTINCT` được sử dụng để loại bỏ các giá trị trùng lặp trong kết quả truy vấn. Trong ví dụ này, chúng ta truy vấn danh sách các phòng ban duy nhất trong bảng `employees`.
### Mệnh đề LIMIT và OFFSET
**MySQL:**
```sql
SELECT first_name, last_name
FROM employees
LIMIT 10
OFFSET 20;
```
**MSSQL:**
```sql
SELECT first_name, last_name
FROM employees
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;
```
Mệnh đề `LIMIT` (MySQL) và `OFFSET` (MSSQL) được sử dụng để giới hạn số lượng hàng được trả về trong kết quả và bỏ qua một số hàng từ kết quả đầu tiên. Trong ví dụ này, chúng ta truy vấn 10 nhân viên bắt đầu từ hàng thứ 21.
## Mệnh đề ORDER BY
Mệnh đề `ORDER BY` được sử dụng để sắp xếp kết quả truy vấn theo một hoặc nhiều cột cụ thể theo thứ tự tăng dần hoặc giảm dần.
**MySQL:**
```sql
SELECT first_name, last_name, salary
FROM employees
ORDER BY salary DESC;
```
**MSSQL:**
```sql
SELECT first_name, last_name, salary
FROM employees
ORDER BY salary DESC;
```
- `column1, column2, ...`: Các cột bạn muốn sắp xếp theo.
- `ASC`: Sắp xếp theo thứ tự tăng dần (mặc định).
- `DESC`: Sắp xếp theo thứ tự giảm dần.
Trong ví dụ này, chúng ta sắp xếp danh sách nhân viên theo mức lương giảm dần.
## Mệnh đề GROUP BY và HAVING
Mệnh đề `GROUP BY` và `HAVING` được sử dụng để nhóm các hàng có giá trị cột giống nhau lại với nhau và lọc
dữ liệu sau khi đã được nhóm.
### Mệnh đề GROUP BY
**MySQL:**
```sql
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department;
```
**MSSQL:**
```sql
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department;
```
- `column1`: Cột mà bạn muốn nhóm.
- `aggregate_function(column2)`: Hàm tổng hợp (như SUM, COUNT, AVG) được áp dụng cho cột `column2`.
Trong ví dụ này, chúng ta nhóm các nhân viên theo phòng ban và tính mức lương trung bình cho từng phòng ban.
### Mệnh đề HAVING
**MySQL:**
```sql
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 50000;
```
**MSSQL:**
```sql
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 50000;
```
Mệnh đề `HAVING` được sử dụng để lọc dữ liệu sau khi đã nhóm. Trong ví dụ này, chúng ta chỉ hiển thị các phòng ban có mức lương trung bình lớn hơn 50,000 đô la Mỹ.
<hr>
Trong mệnh đề `WHERE` của SQL, cả MySQL và Microsoft SQL Server (MSSQL) hỗ trợ nhiều toán tử khác nhau để thực hiện các phép so sánh và lọc dữ liệu dựa trên điều kiện cụ thể. Dưới đây là một số toán tử phổ biến mà bạn có thể sử dụng trong mệnh đề `WHERE` của cả MySQL và MSSQL:
## Toán tử So sánh
1. **Toán tử bằng nhau (=)**: So sánh giá trị của hai biểu thức, và nếu chúng bằng nhau, điều kiện là đúng.
**Ví dụ:**
```sql
SELECT * FROM employees WHERE department = 'HR';
```
2. **Toán tử Không bằng (!= hoặc <>)**: So sánh giá trị của hai biểu thức, và nếu chúng không bằng nhau, điều kiện là đúng.
**Ví dụ:**
```sql
SELECT * FROM products WHERE category <> 'Electronics';
```
3. **Toán tử Lớn hơn (>)** và **Toán tử Nhỏ hơn (<)**: So sánh giá trị của hai biểu thức, và nếu biểu thức bên trái lớn hơn (hoặc nhỏ hơn) biểu thức bên phải, điều kiện là đúng.
**Ví dụ:**
```sql
SELECT * FROM orders WHERE order_date > '2023-01-01';
```
4. **Toán tử Lớn hơn hoặc bằng (>=)** và **Toán tử Nhỏ hơn hoặc bằng (<=)**: So sánh giá trị của hai biểu thức, và nếu biểu thức bên trái lớn hơn hoặc bằng (hoặc nhỏ hơn hoặc bằng) biểu thức bên phải, điều kiện là đúng.
**Ví dụ:**
```sql
SELECT * FROM products WHERE price >= 50;
```
## Toán tử Logic
5. **Toán tử AND**: Kết hợp nhiều điều kiện và chỉ trả về kết quả đúng nếu tất cả các điều kiện là đúng.
**Ví dụ:**
```sql
SELECT * FROM employees WHERE department = 'HR' AND salary > 50000;
```
6. **Toán tử OR**: Kết hợp nhiều điều kiện và trả về kết quả đúng nếu ít nhất một trong các điều kiện là đúng.
**Ví dụ:**
```sql
SELECT * FROM employees WHERE department = 'HR' OR department = 'Finance';
```
7. **Toán tử NOT**: Đảo ngược giá trị của một điều kiện, nếu điều kiện ban đầu là đúng, thì sau khi sử dụng toán tử NOT sẽ trở thành sai, và ngược lại.
**Ví dụ:**
```sql
SELECT * FROM products WHERE NOT (price >= 50);
```
8. **Toán tử BETWEEN**: Kiểm tra xem một giá trị có nằm trong một khoảng giá trị nào đó không. Nó được sử dụng với toán tử AND.
**Ví dụ:**
```sql
SELECT * FROM orders WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31';
```
9. **Toán tử LIKE**: Sử dụng để kiểm tra xem một chuỗi có khớp với một biểu thức chính quy (regular expression) hay không. Thường được sử dụng với `%` để đại diện cho một chuỗi bất kỳ.
**Ví dụ:**
```sql
SELECT * FROM products WHERE product_name LIKE 'Laptop%';
```
10. **Toán tử IN**: Kiểm tra xem một giá trị có trong danh sách giá trị cho trước không.
**Ví dụ:**
```sql
SELECT * FROM employees WHERE department IN ('HR', 'Finance', 'Marketing');
```
Nhớ rằng cú pháp và cách sử dụng có thể thay đổi một chút giữa MySQL và MSSQL, nhưng ý nghĩa và chức năng của các toán tử là tương tự. Bạn có thể sử dụng các toán tử này để xây dựng điều kiện phù hợp với nhu cầu truy vấn cụ thể của bạn trong cả hai hệ quản trị cơ sở dữ liệu này.
<hr>
Mệnh đề `GROUP BY` trong SQL được sử dụng để nhóm các hàng dữ liệu dựa trên giá trị của một hoặc nhiều cột cụ thể. Sau khi các hàng đã được nhóm lại, bạn có thể áp dụng các hàm tính toán để tính toán tổng, trung bình, số lượng, tối đa, tối thiểu hoặc thậm chí tự định nghĩa hàm cho từng nhóm. Đây là một số hàm tính toán phổ biến được sử dụng cùng với mệnh đề `GROUP BY`:
1. **COUNT**: Hàm này được sử dụng để đếm số lượng hàng trong từng nhóm.
2. **SUM**: Hàm này tính tổng giá trị của một cột trong từng nhóm.
3. **AVG**: Hàm này tính giá trị trung bình của một cột trong từng nhóm.
4. **MAX**: Hàm này tìm giá trị lớn nhất của một cột trong từng nhóm.
5. **MIN**: Hàm này tìm giá trị nhỏ nhất của một cột trong từng nhóm.
Dưới đây là một ví dụ cụ thể về cách sử dụng mệnh đề `GROUP BY` và các hàm tính toán trong SQL:
Giả sử bạn có một bảng `orders` lưu trữ thông tin về các đơn hàng của khách hàng và bạn muốn tính tổng số tiền đã chi tiêu cho mỗi khách hàng trong năm 2023.
```sql
SELECT customer_id, SUM(order_amount) AS total_spent
FROM orders
WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31'
GROUP BY customer_id;
```
Trong ví dụ này:
- Chúng ta sử dụng `GROUP BY customer_id` để nhóm các đơn hàng theo `customer_id`. Điều này có nghĩa là tất cả các đơn hàng có cùng `customer_id` sẽ được nhóm lại thành một nhóm.
- Sau đó, chúng ta sử dụng hàm `SUM(order_amount)` để tính tổng số tiền đã chi tiêu bởi mỗi khách hàng trong từng nhóm.
Kết quả truy vấn sẽ trả về một danh sách các khách hàng (`customer_id`) và tổng số tiền đã chi tiêu (`total_spent`) cho mỗi khách hàng trong năm 2023. Điều này giúp bạn thấy được khách hàng nào đã chi tiêu nhiều nhất trong khoảng thời gian cụ thể này.
Sử dụng mệnh đề `GROUP BY` và các hàm tính toán là cách mạnh mẽ để phân tích dữ liệu tổng hợp trong SQL, và chúng rất hữu ích trong việc trả lời các câu hỏi liên quan đến tổng hợp dữ liệu từ nhiều hàng trong cơ sở dữ liệu của bạn.
<hr>
Dưới đây là một số điểm giống và khác nhau trong cấu trúc T-SQL của MySQL và MSSQL:
**Điểm Giống:**
1. **Ngôn ngữ T-SQL:** Cả MySQL và MSSQL đều sử dụng T-SQL (Transact-SQL) làm ngôn ngữ truy vấn chính.
2. **Các loại dữ liệu:** Cả hai hệ thống đều hỗ trợ các loại dữ liệu cơ bản như INT, VARCHAR, DATE, và TEXT.
3. **Tạo bảng:** Cách tạo bảng cơ bản trong cả hai hệ thống là tương tự, sử dụng câu lệnh CREATE TABLE.
4. **Ràng buộc:** Cả hai hệ thống đều hỗ trợ ràng buộc khóa ngoại (FOREIGN KEY) và ràng buộc duy nhất (UNIQUE CONSTRAINT).
5. **Câu lệnh SELECT:** Các câu lệnh SELECT để truy vấn dữ liệu cũng tương tự nhau, bao gồm các phần như SELECT, FROM, WHERE, GROUP BY, HAVING và ORDER BY.
**Điểm Khác Nhau:**
1. **Cú pháp Câu lệnh LIMIT/OFFSET:** Trong MySQL, bạn sử dụng LIMIT để giới hạn số hàng kết quả, còn trong MSSQL, bạn sử dụng OFFSET FETCH hoặc TOP.
MySQL:
```sql
SELECT * FROM table_name LIMIT 10;
```
MSSQL:
```sql
SELECT TOP 10 * FROM table_name;
```
2. **Kiểu dữ liệu:** Một số kiểu dữ liệu có thể khác nhau giữa hai hệ thống, ví dụ, kiểu dữ liệu DATETIME trong MSSQL có thể được thay thế bằng kiểu dữ liệu TIMESTAMP trong MySQL.
3. **Câu lệnh AUTO_INCREMENT/IDENTITY:** MySQL sử dụng AUTO_INCREMENT để tạo cột tự động tăng giá trị, trong khi MSSQL sử dụng IDENTITY.
MySQL:
```sql
id INT AUTO_INCREMENT PRIMARY KEY
```
MSSQL:
```sql
id INT IDENTITY(1,1) PRIMARY KEY
```
4. **Câu lệnh nối chuỗi:** Cách nối chuỗi có thể khác nhau. MySQL sử dụng hàm CONCAT(), trong khi MSSQL sử dụng dấu '+'.
MySQL:
```sql
CONCAT(first_name, ' ', last_name)
```
MSSQL:
```sql
first_name + ' ' + last_name
```
5. **Quyền truy cập và bảo mật:** Cách quản lý quyền truy cập và bảo mật dữ liệu có thể khác nhau giữa MySQL và MSSQL.
Dưới đây là một số điểm giống và khác nhau về kiểu dữ liệu trong Microsoft SQL Server (MSSQL):
**Điểm Giống:**
1. **Kiểu dữ liệu cơ bản:** MSSQL và MySQL đều hỗ trợ các kiểu dữ liệu cơ bản như INT, VARCHAR, CHAR, DATE, TIME, DATETIME, FLOAT, BOOLEAN (bit trong MSSQL và tinyint trong MySQL), và TEXT.
2. **Kiểu dữ liệu nhị phân:** Cả hai hệ thống hỗ trợ kiểu dữ liệu nhị phân như BINARY và VARBINARY.
3. **Kiểu dữ liệu ngày tháng:** MSSQL và MySQL đều cung cấp kiểu dữ liệu để lưu trữ ngày và thời gian, chẳng hạn như DATETIME hoặc DATE.
**Điểm Khác Nhau:**
1. **Kiểu dữ liệu chuỗi ký tự:** Trong MSSQL, kiểu dữ liệu VARCHAR tương đương với NVARCHAR trong khi trong MySQL, VARCHAR là chuỗi ký tự không Unicode và NVARCHAR là chuỗi ký tự Unicode. MySQL sử dụng CHAR để lưu trữ chuỗi ký tự không Unicode, và UTF-8 là mặc định từ phiên bản 8.0 trở đi.
2. **Kiểu dữ liệu nguyên bản:** MSSQL cung cấp kiểu dữ liệu UNIQUEIDENTIFIER để lưu trữ GUIDs, trong khi MySQL không có kiểu dữ liệu tương tự.
3. **Kiểu dữ liệu tự động tăng giá trị:** Trong MSSQL, bạn sử dụng kiểu dữ liệu IDENTITY để tạo cột tự động tăng giá trị, trong khi MySQL sử dụng AUTO_INCREMENT.
4. **Kiểu dữ liệu JSON:** MSSQL hỗ trợ kiểu dữ liệu JSON từ SQL Server 2016 trở lên, trong khi MySQL đã hỗ trợ kiểu dữ liệu JSON từ phiên bản 5.7 trở lên.
5. **Kiểu dữ liệu XML:** MSSQL hỗ trợ kiểu dữ liệu XML để lưu trữ và truy vấn dữ liệu dưới dạng XML, trong khi MySQL không có kiểu dữ liệu tương tự.
6. **Kiểu dữ liệu địa lý và không gian:** MSSQL cung cấp kiểu dữ liệu địa lý và không gian để lưu trữ và truy vấn dữ liệu liên quan đến vị trí và không gian, trong khi MySQL cần sử dụng các thư viện bên ngoài như Spatial Extensions để hỗ trợ tính năng này.
Dưới đây là một so sánh giữa các câu lệnh DDL (Data Definition Language) trong MySQL và Microsoft SQL Server (MSSQL):
**Điểm Giống:**
1. **Câu lệnh CREATE TABLE:** Cả MySQL và MSSQL đều sử dụng câu lệnh `CREATE TABLE` để tạo bảng trong cơ sở dữ liệu.
2. **Câu lệnh ALTER TABLE:** Cả hai hệ thống đều hỗ trợ câu lệnh `ALTER TABLE` để thay đổi cấu trúc của bảng, bao gồm thêm cột, xóa cột, và sửa đổi ràng buộc.
3. **Câu lệnh DROP TABLE:** Cả MySQL và MSSQL cho phép bạn sử dụng câu lệnh `DROP TABLE` để xóa bảng từ cơ sở dữ liệu.
4. **Câu lệnh CONSTRAINT:** Cả hai hệ thống đều hỗ trợ việc định nghĩa ràng buộc khóa ngoại (FOREIGN KEY) và ràng buộc duy nhất (UNIQUE CONSTRAINT) khi tạo bảng hoặc thay đổi cấu trúc bảng.
**Điểm Khác Nhau:**
1. **Câu lệnh AUTO_INCREMENT/IDENTITY:** Trong MySQL, bạn sử dụng `AUTO_INCREMENT` để tạo cột tự động tăng giá trị, trong khi MSSQL sử dụng `IDENTITY`.
MySQL:
```sql
id INT AUTO_INCREMENT PRIMARY KEY
```
MSSQL:
```sql
id INT IDENTITY(1,1) PRIMARY KEY
```
2. **Câu lệnh DEFAULT:** Cách bạn đặt một giá trị mặc định cho một cột có thể khác nhau. Trong MySQL, bạn sử dụng `DEFAULT`, trong khi MSSQL sử dụng `DEFAULT CONSTRAINT`.
MySQL:
```sql
column_name INT DEFAULT 0
```
MSSQL:
```sql
column_name INT CONSTRAINT DF_column_name DEFAULT 0
```
3. **Câu lệnh INDEX:** Cả hai hệ thống hỗ trợ tạo index cho cột trong bảng, nhưng cú pháp có thể khác nhau. MySQL sử dụng `INDEX`, trong khi MSSQL sử dụng `CREATE INDEX`.
MySQL:
```sql
CREATE INDEX index_name ON table_name (column_name)
```
MSSQL:
```sql
CREATE INDEX index_name ON table_name (column_name)
```
4. **Câu lệnh CHECK CONSTRAINT:** MSSQL hỗ trợ ràng buộc kiểm tra (CHECK CONSTRAINT) để kiểm tra giá trị của cột trong khi MySQL không hỗ trợ tính năng này.
MSSQL:
```sql
column_name INT CONSTRAINT CHK_column_name CHECK (column_name >= 0)
```
5. **Câu lệnh COLLATION:** Cách bạn đặt thuộc tính Collation cho cột để xác định cách so sánh và sắp xếp chuỗi có thể khác nhau. MySQL và MSSQL có cú pháp riêng để thực hiện điều này.
Nhớ rằng cú pháp và tính năng cụ thể có thể thay đổi theo phiên bản cụ thể của MySQL và MSSQL, vì vậy bạn nên kiểm tra tài liệu của phiên bản bạn đang sử dụng để biết thêm chi tiết.