So sánh Function với Stored Procedure trong SQL Server?
Stored Procedure (SP) | Function (UDF - User Defined Function) |
---|---|
SP có thể trả về 0, 1 hoặc nhiều giá trị. | Function phải trả về duy nhất một giá trị (có thể là một scalar hoặc một table). |
Chúng ta có thể sử dụng transaction | trong SP. Chúng ta không thể sử dụng transaction trong UDF |
SP có thể có tham số đầu vào / đầu ra (input / output). | Chỉ tham số đầu vào (input). |
Chúng ta có thể gọi function từ SP . | Chúng ta không thể gọi SP từ function. |
Chúng ta không thể sử dụng SP trong câu lệnh SELECT / WHERE / HAVING . | Chúng ta có thể sử dụng UDF trong câu lệnh SELECT / WHERE / HAVING . |
Chúng ta có thể sử dụng Try-Catch trong SP. | Chúng ta không thể sử dụng Try-Catch trong UDF . |
Con trỏ (cursor) là gì, nó hoạt động như thế nào?
Con trỏ là một đối tượng cơ sở dữ liệu được sử dụng để thao tác dữ liệu theo từng row
. Các bước liên quan:
- Khai báo con trỏ.
- Mở con trỏ.
- Tìm
row
từ con trỏ. - Xử lý
row
được tìm thấy. - Đóng con trỏ.
- Giải phóng con trỏ.
Làm cách nào để view có thể được sử dụng để cung cấp lớp bảo mật cho ứng dụng của bạn?
View
có thể được sử dụng để hiển thị dữ liệu có chọn lọc cho người dùng. Ví dụ hãy xem xét bảngCustomer
có các cột bao gồmName
,Location
vàCredit card number
.- Vì Credit card number là thông tin khách hàng nhạy cảm, nên có thể phải ẩn Credit card number khỏi một số người dùng cơ sở dữ liệu nhất định.
- Vì người dùng không thể được cấp quyền truy cập vào toàn bộ bảng
Customer
, nên một view cóName
vàLocation
củaCustomer
được tạo ra. Người dùng cơ sở dữ liệu chỉ có thể được cấp quyền truy cập vào view đó. - Theo cách này view cung cấp một lớp bảo mật đảm bảo quyền truy cập hạn chế vào bảng cơ sở dữ liệu.
Tìm các giá trị trùng lặp trong bảng SQL?
Chúng tôi có một table như sau:
ID NAME EMAIL
1 John asd@asd.com
2 Sam asd@asd.com
3 Tom asd@asd.com
4 Bob bob@asd.com
5 Tom asd@asd.com
Vấn đề: tìm các row có cùng name và email.
Giải pháp:
SELECT
name, email, COUNT(*) as CountOf
FROM
users
GROUP BY
name, email
HAVING
COUNT(*) > 1
Hash table index hoạt động như thế nào?
Giả sử chúng ta muốn chạy một truy vấn để tìm tất cả thông tin chi tiết về bất kỳ nhân viên nào có tên là ‘Abc’? Hash table index hoạt động như thế nào?
SELECT * FROM Employee
WHERE Employee_Name = 'Abc'
Giải pháp: lý do Hash index được sử dụng là vì Hash table
cực kỳ hiệu quả khi chỉ cần tìm kiếm các giá trị. Vì vậy, các truy vấn so sánh với một chuỗi có thể truy xuất các giá trị rất nhanh nếu chúng sử dụng một Hash index
. Ví dụ truy vấn trong câu hỏi có thể được hưởng lợi từ Hash index
được tạo trên cột Employee_Name
. Cách một Hash index
hoạt động đó là giá trị cột sẽ là khóa trong Hash table
và giá trị thực tế được ánh xạ tới khóa đó sẽ chỉ là một con trỏ đến dữ liệu hàng trong bảng. Hash table
cơ bản là một mảng kết hợp, một entry điển hình sẽ trông giống như Abc => 0x28939
, trong đó 0x28939
là một tham chiếu đến row của bảng nơi "Abc" được lưu trữ trong bộ nhớ. Tìm kiếm một giá trị như "Abc" trong Hash index và nhận lại một tham chiếu đến row trong bộ nhớ rõ ràng là nhanh hơn rất nhiều so với việc quét bảng để tìm tất cả các hàng có giá trị là "Abc" trong cột Employee_Name
.
Làm thế nào để chọn 5 records đầu tiên từ một bảng?
-- SQL Server
SELECT TOP 5 * FROM EMP;
-- Oracle
SELECT \* FROM EMP WHERE ROWNUM <= 5;
-- Generic
SELECT name FROM EMPLOYEE o
WHERE (SELECT count(\*) FROM EMPLOYEE i WHERE i.name < o.name) < 5
Làm cách nào để UPDATE từ một SELECT trong SQL Server?
UPDATE
Table_A
SET
Table_A.col1 = Table_B.col1,
Table_A.col2 = Table_B.col2
FROM
Some_Table AS Table_A
INNER JOIN Other_Table AS Table_B
ON Table_A.id = Table_B.id
WHERE
Table_A.col3 = 'cool'
hoặc sử dụng MERGE:
MERGE INTO YourTable T
USING other_table S
ON T.id = S.id
AND S.tsql = 'cool'
WHEN MATCHED THEN
UPDATE
SET col1 = S.col1,
col2 = S.col2;
Cách tạo row number trong SQL mà không cần ROWNUM?
SELECT name, sal, (SELECT COUNT(*) FROM EMPLOYEE i WHERE o.name >= i.name) row_num
FROM EMPLOYEE o
order by row_num
Làm sao để thực hiện câu lệnh UPDATE với JOIN trong SQL?
Chúng ta có 2 bảng như sau:
sale
id (int)
udid (int)
assid (int)
ud
id (int)
assid (int)
sale.assid
chứa giá trị chính xác để cập nhật ud.assid
truy vấn MS SQL
nào sẽ thực hiện điều này? Bạn có thể làm điều đó mà không cần JOIN
?
Giải pháp:
UPDATE u
SET u.assid = s.assid
FROM ud u
INNER JOIN sale s on
u.id = s.udid
không có JOIN:
UPDATE ud
SET assid = sale.assid
FROM sale
WHERE sale.udid = id
Làm sao để xóa các giá trị trùng lặp trong bảng SQL?
Chúng ta có một bảng:
ID NAME EMAIL
1 John asd@asd.com
2 Sam asd@asd.com
3 Tom asd@asd.com
4 Bob bob@asd.com
5 Tom asd@asd.com
làm thế nào để xóa các trùng lắp khỏi bảng trên (có cùng Name
và Email
)?
Giải pháp:
DELETE FROM users
WHERE id IN (
SELECT id/*, name, email*/
FROM users u, users u2
WHERE u.name = u2.name AND u.email = u2.email AND u.id > u2.id
)
hoặc sử dụng PARTITION BY
:
DELETE d
FROM @YourTable d
INNER JOIN (SELECT
y.id,y.name,y.email,ROW_NUMBER() OVER(PARTITION BY y.name,y.email ORDER BY
y.name,y.email,y.id) AS RowRank
FROM @YourTable y
INNER JOIN (SELECT
name,email, COUNT(*) AS CountOf
FROM @YourTable
GROUP BY name,email
HAVING COUNT(*)>1
) dt ON y.name=dt.name AND y.email=dt.email
) dt2 ON d.id=dt2.id
WHERE dt2.RowRank!=1
SELECT * FROM @YourTable
Sự khác biệt giữa Primary key và Unique key là gì?
- Cả
primary key
vàunique key
đều thực thi tính duy nhất của cột mà chúng được xác định. - Nhưng theo mặc định,
primary key
tạo mộtclustered index
trên cột, trong khi đóunique key
sẽ tạo ra mộtnon-clustered index
. - Một sự khác biệt lớn nữa là,
primary key
không cho phépNULL
, nhưngunique key
chỉ cho phép duy nhất mộtNULL
.