Các câu hỏi phỏng vấn dựa theo tài liệu của

https://www.toptal.com/sql/interview-questions

  1. Q: Lệnh Union để làm gì? Sự khác nhau giữa Union và Union All

A: Union dùng để hợp nhất nội dung của 2 bảng riêng rẽ thành 1 bảng. Sự khác nhau giữa UNION và UNION ALL là bởi UNION bỏ qua các bản ghi trùng nhau trong khi đó UNION ALL sẽ chấp nhận các bản ghi trùng nhau.

Chú ý rằng hiệu năng của lệnh UNION ALL thường cao hơn lệnh UNION, do lệnh UNION đòi hỏi việc xử lý các dữ liệu trùng nhau, do đó nếu không yêu cầu việc loại bỏ các kết quả trùng nhau, bạn nên sử dụng lệnh UNION ALL để có hiệu năng tốt hơn.

  1. Q:Liệt kê và giải thích sự khác nhau giữa các lệnh JOIN trong SQL

A:SQL hỗ trợ 5 lệnh JOIN như sau:

  • INNER JOIN : Trả về tất cả các hàng mà ít nhất 1 bảng có những kết quả giống nhau giữa 2 bảng.  Đây là kiểu join mặc định của SQL nếu bạn không chỉ ra loại JOIN.
  • LEFT JOIN: Trả về tất cả cách hàng bảng bên trái và các kết quả giống nhau giữa 2 bảng. Ví dụ kết quả sẽ bao gồm các kết quả từ bảng bên trái, kể cả khi lệnh JOIN không tìm thấy hàng nào giống nhau với bảng bên phải. Điều đó nghĩa là nếu mệnh đề ON không có kết quả khớp với bảng bên phải, lệnh JOIN sẽ trả về hàng về các bản ghi bảng bên trái, nhưng với NULL cho các hàng với bảng bên phải.
  • RIGHT JOIN: Trả về tất cả các hàng bên phải, và các kết quả khớp với bên bảng phía trái. Nó trái ngược với LEFT JOIN.
  • FULL JOIN: (hay FULL OUTER JOIN): Trả về các kết quả khớp 1 trong các bảng. Về mặt định nghĩa FULL JOIN là sẽ kết hợp của cả LEFT JOIN và RIGHT JOIN, kết quả tương đương với lệnh UNION các kết quả của 2 câu lệnh truy vấn LEFT JOIN và RÌHT JOIN .
  • CROSS JOIN : Trả về sự kết hợp của mỗi hàng của bảng đầu tiên kết hợp với một hàng của bảng thứ 2.
  1. Q: Giả sử có 2 câu lệnh query dưới đây:

SELECT count(*) AS total FROM orders;

 

+——-+

| total |

+——-+

|  100  |

+——-+

 

SELECT count(*) AS cust_123_total FROM orders WHERE customer_id = ‘123’;

 

+—————-+

| cust_123_total |

+—————-+

|       15       |

+—————-+

Tính kết quả của câu lệnh query dưới đây:

SELECT count(*) AS cust_not_123_total FROM orders WHERE customer_id <> ‘123’

A: Kết quả hiển nhiên sẽ là 85. Nhưng có những trường hợp ngoại lệ, khi một record customer_id nào đó bị NULL, nó sẽ không được đếm như là một cust_123_total cũng như cust_not_123_total. Ví dụ trường hợp có 1 trong 100 customer có customer_id là NULL, kết quả sẽ chỉ là 84.

  1. Q:Lấy kết quả của phép truy vấn sau đây? Giải thích câu trả lời tại sao và cung cấp câu truy vấn chính xác.

select case when null = null then ‘Yup’ else ‘Nope’ end as Result;

A : Câu truy vấn bên trên sẽ trả về ‘Nope’ bởi vì null không tương đương với chính nó. Các chính xác nhất để so sánh với null là sử dụng toán tử IS trong SQL, chứ không phải =

Câu lệnh đúng sẽ là:

select case when null is null then ‘Yup’ else ‘Nope’ end as Result;

  1. Q: Cho các bảng dưới đây:

Untitled

Kết quả của câu query dưới đây?

SELECT * FROM runners WHERE id NOT IN (SELECT winner_id FROM races)

A: Ngạc nhiên, là với câu query cung cấp như trên, kết quả trả về sẽ không có row nào cả. Lý do là câu SQL NOT IN với điều kiện trả về kết quả NULL, trả về tập rỗng, ko thể so sánh với giá trị có giá trị NULL.

Cấu query đúng sẽ là:

SELECT * FROM runners WHERE id NOT IN (SELECT winner_id FROM races WHERE winner_id IS NOT null)

  1. Q: Sự khác nhau giữa mệnh đề WHERE và HAVING.

 

 

A:Khi không có lệnh GROUP BY, lệnh WHERE và HAVING là tương đương.

Mặc dù vậy, khi lệnh GROUP BY được sử dụng:

  • Mệnh đề WHERE được sử dụng để filter các record từ một kết quả.
  • Mệnh đề HAVING được sử dụng đề filter các giá trị thuộc một nhóm.
  1. Q: Có gì sau với câu SQL dưới đây? Chỉnh lại câu này cho đúng.

SELECT Id, YEAR(BillingDate) AS BillingYear FROM InvoicesWHERE BillingYear >= 2010;

A: Biểu thức BillingYear trong mệnh đề WHERE là không hợp lệ. Mặc dù nó định nghĩa phần Alias cho lệnh SELECT nhưng nó hiển thị sau mệnh đề WHÊRE, phần logic của các cụm lệnh được xử lý trước.

Biểu thức đúng là:

SELECT Id, YEAR(BillingDate) AS BillingYearFROM InvoicesWHERE YEAR(BillingDate) >= 2010;

  1. Có bảng Customer với nội dung như sau:

Untitled.png

Dưới đây là câu query trả về danh sách các khách hàng không giới thiệu bởi Jane Smith.

SELECT Name FROM Customers WHERE ReferredBy <> 2;

Kết quả của câu query này thế nào? Tại sao? Có cách nào tốt hơn để viết nó?

Câu này trả về 4 kết quả không giới thiệu bởi Jane Smith, mà không trả về 1 như bạn kì vọng.

Bạn có thể xử dụng câu lệnh sau đây:

SELECT Name FROM Customers WHERE ReferredBy IS NOT NULL OR ReferredBy <> 2

  1. Q: Giả sử chúng ta có database schema hiển thị SQLServer diagram dưới đây, viết dòng truy vấn SQL trả về danh sách tất cả các hóa đơn. Với mỗi hóa đơn, hiện thị một InvoiceId, Billing date, customer name, và tên của một khách hàng người giới thiệu khách hàng đó. Danh sách dưới đây nên được sắp xếp bởi billing date.

Untitled.png

A:

Untitled.png

 

  1. Q: Giả sử có bảng Emp(Id, Name, DeptId), Dept (Id, Name).

Nếu có 10 bản ghi cho bảng Emp và có 5 bản ghi có bảng Dept, sẽ có bao nhiêu bản ghi hiển thị cho câu query dưới đây:

Select * From Emp, Dept

A:50

  1. Cho một bảng Salaries như một bảng dưới đây, trong đó m=male và f=female. Đổi chỗ giá trị f và m với một câu query mà không dùng các bản hay giá trị temp.

Untitled.png

12: Có 2 bảng được tạo dưới đây:

create table test_a(id numeric); create table test_b(id numeric); insert into test_a(id) values  (10),  (20),  (30),  (40),  (50); insert into test_b(id) values  (10),  (30),  (50);

create table test_b(id numeric); insert into test_a(id) values  (10),  (20),  (30),  (40),  (50); insert into test_b(id) values  (10),  (30),  (50);

 insert into test_a(id) values  (10),  (20),  (30),  (40),  (50); insert into test_b(id) values  (10),  (30),  (50);

(10),  (20),  (30),  (40),  (50); insert into test_b(id) values  (10),  (30),  (50);

(20),  (30),  (40),  (50); insert into test_b(id) values  (10),  (30),  (50);

(30),  (40),  (50); insert into test_b(id) values  (10),  (30),  (50);

(40),  (50); insert into test_b(id) values  (10),  (30),  (50);

(50); insert into test_b(id) values  (10),  (30),  (50);

 insert into test_b(id) values  (10),  (30),  (50);

(10),  (30),  (50);

(30), (50);

(50);

Viết câu query lấy giá trị của bảng test_a mà không nằm trong bảng test_b mà không sử dụng từ khóa NOT.

Với SQL Server, PostgreSQL, and SQLite, Bạn có thể dùng từ khóa except

select * from test_aexceptselect * from test_b;

Với Oracle, bạn có thể dùng từ khóa Minus

 

MySQL không hỗ trợ từ khóaexcept , do đó cần dùng từ khóa not in.

  1. Q: Cho một bảng TBL với trường Nmbr có các hàng với giá trị như sau:

1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1

Viết một câu truy vấn thêm 2 vào các trường giá trị 0 và thêm 3 vào các giá trị 1.

A:

update TBL set Nmbr = case when Nmbr > 0 then Nmbr+3 else Nmbr+2 end;

  1. Q: Viết truy vấn tìm người lương cao thứ 10 trong bảng Employee.

A:

SELECT TOP (1) Salary FROM(    SELECT DISTINCT TOP (10) Salary FROM Employee ORDER BY Salary DESC) AS Emp ORDER BY Salary

 

14: Sử dụng câu lệnh UNION ALL để loại bỏ các giá trị trùng nhau, không dùng UNION.

A:

SELECT * FROM mytable WHERE a=X UNION ALL SELECT * FROM mytable WHERE b=Y AND a!=X

15.Q: Sự khác nhau chính của Delete và Truncate

 

A: Truncate sử dụng để xóa content và nó không thể rollback trong khi Delete sử dụng để xóa một hay nhiều hàng của dữ liệu và có thể rollback.

  1. Giả sử có 1 bảng dbo.users trong đó có cột user_id là khóa chính, bằng cách nào chúng ta có thể select 100 user_id lẻ đầu tiên của bảng.

A:

SELECT TOP 100 user_id FROM dbo.users WHERE user_id % 2 = 1 ORDER BY user_id

File Doc

https://drive.google.com/open?id=0B1crY7GYX9BsNUd0YTlHSVJWYjA