Bộ câu hỏi phỏng vấn SQL Server phần 3

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 transactiontrong 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ảng Customer có các cột bao gồm Name, LocationCredit 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ó NameLocation của Customer đượ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 NameEmail)?

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 keyunique 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ột clustered index trên cột, trong khi đó unique key sẽ tạo ra một non-clustered index.
  • Một sự khác biệt lớn nữa là, primary key không cho phép NULL, nhưng unique key chỉ cho phép duy nhất một NULL.
Avatar Techmely Team
VIẾT BỞI

Techmely Team