Hàm tổng hợp Sql cho các hàng. Hàm tổng hợp MIN và MAX

Bài học sẽ đề cập đến chủ đề sql đổi tên một cột (field) bằng từ dịch vụ AS; Chủ đề về các hàm tổng hợp trong sql cũng được đề cập. Sẽ được tháo dỡ ví dụ cụ thể yêu cầu

Tên cột trong truy vấn có thể được đổi tên. Điều này làm cho kết quả dễ đọc hơn.

Trong SQL, việc đổi tên các trường liên quan đến việc sử dụng NHƯ từ khóa, được sử dụng để đổi tên tên trường trong tập kết quả

Cú pháp:

LỰA CHỌN<имя поля>BẰNG<псевдоним>TỪ...

Hãy xem một ví dụ về đổi tên trong SQL:

Ví dụ về cơ sở dữ liệu “Viện”: Hiển thị tên giáo viên và mức lương của họ, đối với những giáo viên có mức lương dưới 15.000, đổi tên trường zarplata thành "lương_thấp"


✍ Giải pháp:

Đổi tên cột trong SQL thường là cần thiết khi tính toán các giá trị liên kết với nhiều trường những cái bàn. Hãy xem một ví dụ:

Ví dụ về cơ sở dữ liệu “Viện”: Từ bảng giáo viên hiển thị trường tên và tính số tiền lương thưởng, đặt tên trường "lương_thưởng"


✍ Giải pháp:
1 2 CHỌN tên, (zarplata+ premium) NHƯ zarplata_premia TỪ giáo viên;

CHỌN tên, (zarplata+premia) NHƯ zarplata_premia TỪ giáo viên;

Kết quả:

Các hàm tổng hợp trong SQL

Để lấy tổng giá trị và đánh giá biểu thức, các hàm tổng hợp trong sql được sử dụng:

Tất cả các hàm tổng hợp đều trả về một giá trị duy nhất.

Các hàm COUNT, MIN và MAX áp dụng cho mọi loại dữ liệu.

Các hàm SUM và AVG chỉ được sử dụng cho các trường số.
Có một sự khác biệt giữa hàm COUNT(*) và COUNT(): hàm thứ hai không tính đến giá trị NULL khi tính toán.

Quan trọng: khi làm việc với các hàm tổng hợp trong SQL, nó được sử dụng từ chức năng BẰNG


Ví dụ về cơ sở dữ liệu “Viện”: Lấy giá trị mức lương cao nhất trong số các giáo viên, hiển thị kết quả dưới dạng "mức lương tối đa"


✍ Giải pháp:
CHỌN MAX (zarplata) NHƯ max_salary TỪ giáo viên;

CHỌN MAX(zarplata) NHƯ max_salary TỪ giáo viên;

Kết quả:

Hãy xem xét thêm ví dụ phức tạp sử dụng các hàm tổng hợp trong sql.


✍ Giải pháp:

Mệnh đề GROUP BY trong SQL

Nhóm theo toán tử trong sql thường được sử dụng cùng với các hàm tổng hợp.

Chức năng tổng hợpđược thực thi trên tất cả các hàng truy vấn kết quả. Nếu truy vấn chứa mệnh đề GROUP BY thì mỗi tập hợp hàng được chỉ định trong mệnh đề GROUP BY sẽ tạo thành một nhóm và các hàm tổng hợp sẽ được thực thi cho từng nhóm riêng biệt.

Hãy xem một ví dụ với bảng bài học:

Ví dụ:

Quan trọng: Do đó, bằng cách sử dụng GROUP BY, tất cả các hàng đầu ra của truy vấn được chia thành các nhóm được đặc trưng bởi cùng một tổ hợp giá trị trong các cột đó (nghĩa là các hàm tổng hợp được thực hiện riêng biệt trên từng nhóm).

Cần lưu ý rằng khi nhóm theo một trường chứa các giá trị NULL, tất cả các bản ghi như vậy sẽ rơi vào một nhóm.

nhiều loại khác nhau máy in, xác định chi phí và số lượng trung bình của chúng (tức là riêng cho máy in laser, máy in phun và ma trận). Sử dụng các hàm tổng hợp. Kết quả sẽ trông như thế này:

Có câu lệnh SQL

Mệnh đề HAVING trong SQL là cần thiết để kiểm tra các giá trị, thu được bằng cách sử dụng hàm tổng hợp sau khi nhóm(sau khi sử dụng GROUP BY). Việc kiểm tra như vậy không thể chứa trong mệnh đề WHERE.

Ví dụ: Cửa hàng máy tính DB. Tính giá trung bình của các máy tính có cùng tốc độ xử lý. Chỉ thực hiện tính toán cho những nhóm đó giá trung bình trong đó có ít hơn 30.000.

Có thể thực hiện xử lý nhóm tổng quát các giá trị trường. Điều này được thực hiện bằng cách sử dụng các hàm tổng hợp. Các hàm tổng hợp tạo ra một giá trị duy nhất cho toàn bộ nhóm bảng. SQL cung cấp các hàm tổng hợp sau:

  • ĐẾM– đếm số hàng trong bảng có giá trị không NULL của trường được chỉ định làm đối số.
  • TỔNG– tính tổng số học của tất cả các giá trị đã chọn cho một trường nhất định.
  • AVG– tính trung bình tất cả các giá trị được chọn của trường này.
  • TỐI ĐA– hiển thị giá trị cao nhất từ tất cả các giá trị đã chọn của trường này.
  • PHÚT– hiển thị giá trị nhỏ nhất trong tất cả các giá trị được chọn cho trường này.

    Sử dụng hàm tổng hợp

    Các hàm tổng hợp được sử dụng tương tự như tên trường trong mệnh đề SELECT của truy vấn, với một ngoại lệ: chúng lấy tên trường làm đối số. Chỉ có thể sử dụng các trường số với TỔNGAVG. VỚI ĐẾM, TỐI ĐA, Và PHÚT Cả hai trường số và ký tự đều có thể được sử dụng. Khi được sử dụng với các trường ký tự TỐI ĐAPHÚT sẽ dịch chúng sang ASCII tương đương. Nó có nghĩa là PHÚT sẽ chọn cái đầu tiên, và TỐI ĐA giá trị cuối cùng Theo thứ tự bảng chữ cái.

    Để tìm tổng số tiền bán hàng trong bảng doanh số, chúng ta phải viết truy vấn sau:

    CHỌN SUM(SSum) TỪ Số lần bán

    Kết quả là chúng tôi nhận được:

    Truy vấn này đếm số lượng giá trị không null trong trường SNum của bảng Bán. Nếu chúng ta viết lại truy vấn như sau:

    CHỌN ĐẾM(SDate) TỪ Bán

    Kết quả là chúng tôi nhận được:

    SỐ SỐ SDNgày
    4

    Các kết quả truy vấn khác nhau khi tính toán những gì có vẻ giống nhau sẽ thu được do một trong các giá trị trường SDate trống ( VÔ GIÁ TRỊ). Hãy cẩn thận khi sử dụng các truy vấn như vậy.

Làm cách nào tôi có thể biết số lượng mẫu PC được sản xuất bởi một nhà cung cấp cụ thể? Cách xác định giá trung bình của các máy tính có cùng mức giá thông số kỹ thuật? Đối với những câu hỏi này và nhiều câu hỏi khác liên quan đến một số thông tin thống kê, bạn có thể nhận được câu trả lời bằng cách sử dụng hàm cuối cùng (tổng hợp). Tiêu chuẩn này cung cấp các hàm tổng hợp sau:

Tất cả các hàm này trả về một giá trị duy nhất. Đồng thời, các chức năng ĐẾM, PHÚTTỐI ĐAáp dụng cho bất kỳ loại dữ liệu nào, trong khi TỔNGAVG chỉ được sử dụng cho các trường số. Sự khác biệt giữa chức năng ĐẾM(*)ĐẾM(<имя поля>) là cái thứ hai không tính đến giá trị NULL khi tính toán.

Ví dụ. Tìm giá trị nhỏ nhất và giá tối đađến máy tính cá nhân:

Ví dụ. Tìm số máy tính hiện có của nhà sản xuất A:

Ví dụ. Nếu chúng ta quan tâm đến số lượng mẫu mã khác nhau do nhà sản xuất A sản xuất thì truy vấn có thể được xây dựng như sau (sử dụng thực tế là trong bảng Sản phẩm, mỗi mẫu mã được ghi lại một lần):

Ví dụ. Tìm số lượng mẫu mã khác nhau có sẵn do nhà sản xuất A sản xuất. Truy vấn tương tự như câu hỏi trước, trong đó yêu cầu xác định tổng số mẫu mã do nhà sản xuất A sản xuất. Ở đây bạn cũng cần tìm số lượng mẫu mã khác nhau trong bàn PC (tức là những bàn có sẵn để bán).

Để đảm bảo rằng chỉ sử dụng các giá trị duy nhất khi lấy các chỉ số thống kê, khi đối số của hàm tổng hợp có thể được sử dụng tham số DISTINCT. Khác tham số TẤT CẢ là mặc định và giả định rằng tất cả các giá trị trả về trong cột đều được tính. Nhà điều hành,

Nếu chúng ta cần biết số lượng mẫu PC được sản xuất mọi người nhà sản xuất, bạn sẽ cần phải sử dụng Mệnh đề NHÓM THEO, theo cú pháp mệnh đề WHERE.

ưu đãi NHÓM QUA

Mệnh đề NHÓM THEOđược sử dụng để xác định các nhóm dòng đầu ra có thể được áp dụng cho các hàm tổng hợp (COUNT, MIN, MAX, AVG và SUM). Nếu mệnh đề này bị thiếu và các hàm tổng hợp được sử dụng thì tất cả các cột có tên được đề cập trong LỰA CHỌN, nên được đưa vào Chức năng tổng hợp và các hàm này sẽ được áp dụng cho toàn bộ tập hợp các hàng thỏa mãn vị từ truy vấn. Ngược lại, tất cả các cột của danh sách CHỌN không bao gồm trong các hàm tổng hợp phải được chỉ định trong mệnh đề GROUP BY. Kết quả là tất cả các hàng truy vấn đầu ra được chia thành các nhóm được đặc trưng bởi sự kết hợp giống nhau của các giá trị trong các cột này. Sau này, các hàm tổng hợp sẽ được áp dụng cho từng nhóm. Hãy nhớ rằng đối với GROUP BY mọi thứ Giá trị NULLđược đối xử bình đẳng, tức là khi nhóm theo một trường chứa giá trị NULL, tất cả các hàng như vậy sẽ rơi vào một nhóm.
Nếu như nếu có mệnh đề GROUP BY, trong mệnh đề SELECT không có hàm tổng hợp, thì truy vấn sẽ chỉ trả về một hàng từ mỗi nhóm. Tính năng này cùng với từ khóa DISTINCT có thể được sử dụng để loại bỏ các hàng trùng lặp trong tập kết quả.
Hãy xem một ví dụ đơn giản:
CHỌN model, COUNT(model) AS Qty_model, AVG(price) AS Avg_price
TỪ PC
NHÓM THEO mô hình;

Trong yêu cầu này, đối với mỗi mẫu PC, số lượng của chúng được xác định và chi phí trung bình. Tất cả các dòng với những giá trị giống nhau mô hình (số kiểu) tạo thành một nhóm và đầu ra SELECT tính toán số lượng giá trị và giá trị giá trung bình cho mỗi nhóm. Kết quả truy vấn sẽ là bảng sau:
người mẫu số lượng_model giá_trung bình
1121 3 850.0
1232 4 425.0
1233 3 843.33333333333337
1260 1 350.0

Nếu SELECT có cột ngày thì có thể tính toán các chỉ báo này cho từng ngày cụ thể. Để thực hiện việc này, bạn cần thêm ngày làm cột nhóm và sau đó các hàm tổng hợp sẽ được tính cho từng tổ hợp giá trị (model-date).

Có một số cụ thể quy tắc để thực hiện các chức năng tổng hợp:

  • Nếu do yêu cầu không nhận được hàng nào(hoặc nhiều hàng cho một nhóm nhất định), thì không có dữ liệu nguồn để tính toán bất kỳ hàm tổng hợp nào. Trong trường hợp này, kết quả của các hàm COUNT sẽ bằng 0 và kết quả của tất cả các hàm khác sẽ là NULL.
  • Lý lẽ chức năng tổng hợp Bản thân nó không thể chứa các hàm tổng hợp(chức năng từ chức năng). Những thứ kia. trong một truy vấn, không thể lấy được giá trị trung bình tối đa.
  • Kết quả thực hiện hàm COUNT là số nguyên(Số nguyên). Các hàm tổng hợp khác kế thừa kiểu dữ liệu của các giá trị mà chúng xử lý.
  • Nếu hàm SUM tạo ra kết quả lớn hơn giá trị tối đa của kiểu dữ liệu được sử dụng, lỗi.

Vì vậy, nếu yêu cầu không chứa mệnh đề GROUP BY, Cái đó Chức năng tổng hợp bao gồm trong mệnh đề CHỌN, được thực thi trên tất cả các hàng truy vấn kết quả. Nếu yêu cầu chứa Mệnh đề NHÓM THEO, mỗi tập hợp các hàng có cùng giá trị của một cột hoặc nhóm cột được chỉ định trong Mệnh đề NHÓM THEO, tạo thành một nhóm và Chức năng tổng hợpđược thực hiện riêng biệt cho từng nhóm.

CÓ ưu đãi

Nếu như mệnh đề WHERE xác định một vị từ để lọc các hàng, sau đó CÓ ưu đãiáp dụng sau khi nhómđể xác định một vị từ tương tự để lọc các nhóm theo giá trị Chức năng tổng hợp. Mệnh đề này cần thiết để xác thực các giá trị thu được bằng cách sử dụng chức năng tổng hợp không phải từ các hàng riêng lẻ của nguồn bản ghi được xác định trong mệnh đề FROM, và từ nhóm các dòng như vậy. Vì vậy, việc kiểm tra như vậy không thể được thực hiện trong mệnh đề WHERE.

Để tóm tắt thông tin có trong cơ sở dữ liệu, SQL cung cấp các hàm tổng hợp. Hàm tổng hợp lấy toàn bộ cột dữ liệu làm đối số và trả về một giá trị duy nhất tóm tắt cột đó theo một cách cụ thể.

Ví dụ: hàm tổng hợp AVG() lấy một cột số làm đối số và tính giá trị trung bình của chúng.

Để tính thu nhập bình quân đầu người của cư dân Zelenograd, bạn cần truy vấn sau:

CHỌN ‘THU NHẬP TRUNG BÌNH ĐẦU NGƯỜI=’, AVG(SUMD)

SQL có sáu hàm tổng hợp cho phép bạn có được các loại khác nhau thông tin tóm tắt (Hình 1):

– SUM() tính tổng tất cả các giá trị có trong một cột;

– AVG() tính trung bình cộng của các giá trị chứa trong cột;

– MIN() tìm giá trị nhỏ nhất trong tất cả các giá trị có trong cột;

– MAX() tìm giá trị lớn nhất trong số tất cả các giá trị có trong cột;

– COUNT() đếm số giá trị chứa trong một cột;

– COUNT(*) đếm số hàng trong bảng kết quả truy vấn.

Đối số cho hàm tổng hợp có thể là một tên cột đơn giản, như trong ví dụ trước hoặc một biểu thức, như trong truy vấn sau, chỉ định cách tính thuế bình quân đầu người:

CHỌN AVG(SUMD*0,13)

Truy vấn này tạo một cột tạm thời chứa các giá trị (SUMD*0,13) cho mỗi hàng của bảng PERSON, sau đó tính giá trị trung bình của cột tạm thời.

Mức thu nhập của tất cả cư dân Zelenograd có thể được tính bằng hàm tổng hợp SUM:

CHỌN SUM(SUMD) TỪ NGƯỜI

Hàm tổng hợp cũng có thể được sử dụng để tính tổng từ một bảng kết quả thu được bằng cách nối nhiều bảng nguồn. Ví dụ: bạn có thể tính tổng thu nhập mà cư dân nhận được từ một nguồn có tên là “Học bổng”:

CHỌN SUM(TIỀN)

TỪ LỢI NHUẬN, HAVE_D

Ở ĐÂU LỢI NHUẬN.ID=HAVE_D.ID

VÀ LỢI NHUẬN.SOURCE='Học bổng'

Các hàm tổng hợp MIN() và MAX() cho phép bạn tìm các giá trị nhỏ nhất và lớn nhất trong một bảng tương ứng. Cột có thể chứa giá trị số hoặc chuỗi hoặc giá trị ngày hoặc giờ.

Ví dụ: bạn có thể xác định:

(a) tổng thu nhập mà người cư trú nhận được thấp nhất và số thuế phải nộp cao nhất:

CHỌN MIN(SUMD), MAX(SUMD*0,13)

(b) ngày sinh của cư dân lớn tuổi nhất và trẻ nhất:

CHỌN MIN(RDATE), MAX(RDATE)

(c) họ, tên và họ của những cư dân đầu tiên và cuối cùng trong danh sách, được sắp xếp theo thứ tự bảng chữ cái:

CHỌN MIN(FIO), MAX(FIO)

Khi sử dụng các hàm tổng hợp này, bạn cần nhớ rằng dữ liệu số được so sánh bằng các quy tắc số học, ngày được so sánh tuần tự (giá trị ngày trước đó được coi là nhỏ hơn giá trị sau) và các khoảng thời gian được so sánh dựa trên khoảng thời gian của chúng.

sử dụng hàm MIN() và MAX() với dữ liệu chuỗi, kết quả so sánh hai chuỗi phụ thuộc vào bảng mã hóa ký tự được sử dụng.

Hàm tổng hợp COUNT() đếm số lượng giá trị trong một cột thuộc loại bất kỳ:

(a) có bao nhiêu căn hộ ở quận 1?

CHỌN ĐẾM(ADR) TỪ FLAT Ở ĐÂU ADR THÍCH "%, 1_ _-%"

(b) bao nhiêu người dân có nguồn thu nhập?

CHỌN ĐẾM(NOM KHÁC BIỆT) TỪ HAVE_D

(c) người dân sử dụng bao nhiêu nguồn thu nhập?

SELECT COUNT(DISTINCT ID) FROM HAVE_D (Từ khóa DISTINCT chỉ định rằng các giá trị không trùng lặp trong cột sẽ được tính).

Hàm tổng hợp đặc biệt COUNT(*) đếm các hàng trong bảng kết quả, không phải giá trị dữ liệu:

(a) có bao nhiêu căn hộ ở quận 2?

CHỌN ĐẾM(*) TỪ FLAT Ở ĐÂU ADR THÍCH "%, 2__-%"

(b) Ivan Ivanovich Ivanov có bao nhiêu nguồn thu nhập?

CHỌN ĐẾM(*) TỪ NGƯỜI, HAVE_D WHERE FIO="Ivanov Ivan Ivanovich" VÀ PERSON.NOM=HAVE_D.NOM

(c) có bao nhiêu cư dân sống trong một căn hộ tại một địa chỉ nhất định?

CHỌN ĐẾM(*) TỪ NGƯỜI Ở ĐÂU ADR="Zelenograd, 1001-45"

Một cách để hiểu cách thực thi các truy vấn tóm tắt với các hàm tổng hợp là hãy coi việc thực thi truy vấn được chia thành hai phần. Đầu tiên, chúng tôi xác định cách truy vấn sẽ hoạt động nếu không có hàm tổng hợp, trả về nhiều hàng kết quả. Sau đó, các hàm tổng hợp được áp dụng cho kết quả truy vấn, trả về một hàng kết quả duy nhất.

Ví dụ, hãy xem xét những điều sau đây truy vấn phức tạp: tìm tổng thu nhập bình quân đầu người, tổng thu nhập của cư dân, cũng như thu nhập trung bình của nguồn tính theo tỷ lệ phần trăm trong tổng thu nhập của cư dân. Người điều hành đưa ra câu trả lời

CHỌN AVG(SUMD), SUM(SUMD), (100*AVG(MONEY/SUMD)) TỪ NGƯỜI, LỢI NHUẬN, HAVE_D WHERE PERSON.NOM=HAVE_D.NOM AND HAVE_D.ID=PROFIT.ID

Nếu không có hàm tổng hợp, truy vấn sẽ như sau:

CHỌN SUMD, SUMD, TIỀN/SUMD TỪ NGƯỜI, LỢI NHUẬN, HAVE_D WHERE PERSON.NOM=HAVE_D.NOM VÀ HAVE_D.ID=PROFIT.ID

và sẽ trả về một hàng kết quả cho mỗi cư dân và nguồn thu nhập cụ thể. Các hàm tổng hợp sử dụng các cột trong bảng kết quả của truy vấn để tạo ra một bảng một hàng chứa các kết quả tóm tắt.

Bạn có thể chỉ định hàm tổng hợp trong hàng cột được trả về thay vì bất kỳ tên cột nào. Ví dụ: nó có thể là một phần của biểu thức cộng hoặc trừ các giá trị của hai hàm tổng hợp:

CHỌN MAX(SUMD)-MIN(SUMD) TỪ NGƯỜI

Tuy nhiên, hàm tổng hợp không thể là đối số cho hàm tổng hợp khác, tức là Các hàm tổng hợp lồng nhau đều bị cấm.

Ngoài ra, danh sách các cột được trả về không thể sử dụng các hàm tổng hợp và tên cột thông thường cùng một lúc, vì điều này vô nghĩa, ví dụ:

CHỌN FIO, SUM(SUMD) TỪ NGƯỜI

Ở đây, phần tử đầu tiên của danh sách hướng dẫn DBMS tạo một bảng bao gồm nhiều hàng và chứa một hàng cho mỗi cư dân. Phần tử thứ hai của danh sách yêu cầu DBMS lấy một giá trị kết quả duy nhất, là tổng của các giá trị trong cột SUMD. Hai hướng dẫn này mâu thuẫn với nhau, dẫn đến lỗi.

Cách trên không áp dụng cho các trường hợp xử lý truy vấn con và truy vấn có nhóm.

Các tiểu mục sau đây mô tả các đề xuất khác câu lệnh CHỌN, có thể được sử dụng trong các truy vấn cũng như các hàm tổng hợp và tập hợp toán tử. Hãy để tôi nhắc bạn điều đó tại thời điểm này Chúng ta đã xem xét cách sử dụng mệnh đề WHERE và trong bài viết này, chúng ta sẽ xem xét các mệnh đề GROUP BY, ORDER BY và HAVING, đồng thời cung cấp một số ví dụ về cách sử dụng các mệnh đề này kết hợp với các hàm tổng hợp được hỗ trợ trong Transact-SQL.

Mệnh đề NHÓM THEO

Lời đề nghị NHÓM THEO nhóm một tập hợp các hàng đã chọn để tạo ra một tập hợp các hàng tóm tắt theo giá trị của một hoặc nhiều cột hoặc biểu thức. Một trường hợp đơn giản sử dụng mệnh đề GROUP BY được hiển thị trong ví dụ bên dưới:

SỬ DỤNG SampleDb; CHỌN Công việc TỪ Works_On NHÓM THEO Công việc;

Ví dụ này chọn và nhóm các vị trí nhân viên.

Trong ví dụ trên, mệnh đề GROUP BY tạo một nhóm riêng cho tất cả các giá trị có thể có (bao gồm giá trị NULL) cho cột Job.

Việc sử dụng các cột trong mệnh đề GROUP BY phải đáp ứng một số điều kiện nhất định. Cụ thể, mỗi cột trong danh sách lựa chọn của truy vấn cũng phải xuất hiện trong mệnh đề GROUP BY. Yêu cầu này không áp dụng cho các hằng số và cột là một phần của hàm tổng hợp. (Các hàm tổng hợp sẽ được trình bày trong tiểu mục tiếp theo.) Điều này hợp lý vì Chỉ các cột trong mệnh đề GROUP BY mới được đảm bảo có một giá trị cho mỗi nhóm.

Bạn có thể nhóm một bảng theo bất kỳ sự kết hợp nào giữa các cột của nó. Ví dụ bên dưới minh họa việc nhóm các hàng của bảng Works_on thành hai cột:

SỬ DỤNG SampleDb; CHỌN Số dự án, Công việc TỪ Works_On NHÓM THEO Số dự án, Công việc;

Kết quả của truy vấn này:

Dựa trên kết quả truy vấn, bạn có thể thấy rằng có chín nhóm với sự kết hợp khác nhau về số lượng và vị trí dự án. Trình tự tên cột trong mệnh đề GROUP BY không nhất thiết phải giống với danh sách các cột trong mệnh đề SELECT.

Chức năng tổng hợp

Các hàm tổng hợp được sử dụng để thu được tổng giá trị. Tất cả các hàm tổng hợp có thể được chia thành các loại sau:

    các hàm tổng hợp thông thường;

    hàm tổng hợp thống kê;

    các hàm tổng hợp do người dùng định nghĩa;

    chức năng tổng hợp phân tích.

Ở đây chúng ta sẽ xem xét ba loại hàm tổng hợp đầu tiên.

Các hàm tổng hợp chung

Transact-SQL hỗ trợ sáu hàm tổng hợp sau: PHÚT, TỐI ĐA, TỔNG, AVG, ĐẾM, COUNT_BIG.

Tất cả các hàm tổng hợp đều thực hiện các phép tính trên một đối số duy nhất, có thể là một cột hoặc một biểu thức. (Ngoại lệ duy nhất là dạng thứ hai của hai hàm: COUNT và COUNT_BIG, lần lượt là COUNT(*) và COUNT_BIG(*).) Kết quả của bất kỳ phép tính hàm tổng hợp nào là một giá trị không đổi, được hiển thị trong một cột kết quả riêng biệt.

Các hàm tổng hợp được chỉ định trong danh sách cột của câu lệnh SELECT, danh sách này cũng có thể chứa mệnh đề GROUP BY. Nếu câu lệnh SELECT không có mệnh đề GROUP BY và danh sách các cột được chọn chứa ít nhất, một hàm tổng hợp thì hàm đó không được chứa các cột đơn giản (ngoại trừ các cột đóng vai trò là đối số cho hàm tổng hợp). Do đó, mã trong ví dụ bên dưới không chính xác:

SỬ DỤNG SampleDb; CHỌN Họ, MIN(Id) TỪ Nhân viên;

Ở đây, cột Họ của bảng Nhân viên không được nằm trong danh sách chọn cột vì nó không phải là đối số của hàm tổng hợp. Mặt khác, danh sách chọn cột có thể chứa các tên cột không phải là đối số của hàm tổng hợp nếu các cột đó là đối số của mệnh đề GROUP BY.

Một đối số hàm tổng hợp có thể được đặt trước bởi một trong hai từ khóa có thể có:

TẤT CẢ

Chỉ định rằng các phép tính được thực hiện trên tất cả các giá trị trong cột. Đây là giá trị mặc định.

RIÊNG BIỆT

Chỉ định rằng chỉ các giá trị cột duy nhất được sử dụng để tính toán.

Hàm tổng hợp MIN và MAX

Các hàm tổng hợp MIN và MAX lần lượt tính toán giá trị nhỏ nhất và lớn nhất của một cột. Nếu truy vấn chứa mệnh đề WHERE thì hàm MIN và MAX trả về giá trị nhỏ nhất và lớn nhất của các hàng khớp với điều kiện đã chỉ định. Ví dụ dưới đây cho thấy việc sử dụng hàm tổng hợp MIN:

SỬ DỤNG SampleDb; -- Trả về 2581 SELECT MIN(Id) AS "Giá trị Id tối thiểu" TỪ Nhân viên;

Kết quả trả về trong ví dụ trên không có nhiều thông tin. Ví dụ: họ của nhân viên sở hữu số này không xác định. Nhưng lấy họ này theo cách thông thường là không thể vì như đã đề cập trước đó, bạn không được phép chỉ định rõ ràng cột Họ. Để có được họ của nhân viên này cùng với mã số nhân sự thấp nhất của nhân viên đó, một truy vấn con sẽ được sử dụng. Ví dụ bên dưới cho thấy cách sử dụng truy vấn con như vậy, trong đó truy vấn con chứa câu lệnh SELECT từ ví dụ trước:

Kết quả của yêu cầu:

Sử dụng tổng hợp Hàm MAX thể hiện trong ví dụ dưới đây:

Hàm MIN và MAX cũng có thể chấp nhận chuỗi và ngày tháng làm đối số. Trong trường hợp đối số chuỗi, các giá trị được so sánh bằng thứ tự sắp xếp thực tế. Đối với tất cả các đối số dữ liệu tạm thời thuộc loại "ngày" giá trị thấp nhất cột sẽ là nhiều nhất ngày sớm, và lớn nhất là mới nhất.

Với các hàm MIN và MAX bạn có thể sử dụng từ khóa RIÊNG BIỆT. Trước khi sử dụng hàm tổng hợp MIN và MAX, tất cả các giá trị NULL đều bị loại khỏi cột đối số của chúng.

Hàm tổng hợp SUM

Tổng hợp hàm tổng tính tổng các giá trị của một cột. Đối số của hàm tổng hợp này phải luôn có kiểu số dữ liệu. Việc sử dụng hàm tổng hợp SUM được thể hiện trong ví dụ bên dưới:

SỬ DỤNG SampleDb; CHỌN SUM (Ngân sách) "Tổng ngân sách" TỪ Dự án;

Ví dụ này tính toán tổng số tiền ngân sách cho tất cả các dự án. Kết quả của yêu cầu:

Trong ví dụ này, hàm tổng hợp nhóm tất cả các giá trị ngân sách dự án và xác định tổng số tiền của chúng. Vì lý do này, truy vấn chứa hàm nhóm ẩn (cũng như tất cả các truy vấn tương tự). Hàm nhóm ngầm từ ví dụ trên có thể được chỉ định rõ ràng, như trong ví dụ bên dưới:

SỬ DỤNG SampleDb; CHỌN SUM (Ngân sách) "Tổng ngân sách" TỪ NHÓM Dự án THEO();

Sử dụng tham số DISTINCT sẽ loại bỏ tất cả các giá trị trùng lặp trong một cột trước khi áp dụng hàm SUM. Tương tự, tất cả giá trị NULL đều bị xóa trước khi áp dụng hàm tổng hợp này.

Hàm tổng hợp AVG

Tổng hợp chức năng AVG trả về giá trị trung bình số học của tất cả các giá trị trong một cột. Đối số của hàm tổng hợp này phải luôn là kiểu dữ liệu số. Trước khi sử dụng Chức năng AVG tất cả các giá trị NULL đều bị xóa khỏi đối số của nó.

Việc sử dụng hàm tổng hợp AVG được hiển thị trong ví dụ bên dưới:

SỬ DỤNG SampleDb; -- Return 133833 SELECT AVG (Ngân sách) "Ngân sách trung bình cho dự án" TỪ Dự án;

Ở đây tính trung bình số học của giá trị ngân sách cho tất cả ngân sách.

Hàm tổng hợp COUNT và COUNT_BIG

Tổng hợp hàm ĐẾM có hai dạng khác nhau:

COUNT(col_name) COUNT(*)

Dạng đầu tiên của hàm đếm số giá trị trong cột col_name. Nếu truy vấn sử dụng từ khóa DISTINCT thì tất cả các giá trị trùng lặp trong cột sẽ bị loại bỏ trước khi sử dụng hàm COUNT. Dạng hàm COUNT này không tính đến giá trị NULL khi đếm số lượng giá trị trong một cột.

Việc sử dụng dạng đầu tiên của hàm tổng hợp COUNT được hiển thị trong ví dụ bên dưới:

SỬ DỤNG SampleDb; CHỌN ProjectNumber, COUNT(DISTINCT Job) "Hoạt động trong dự án" TỪ NHÓM Works_on THEO ProjectNumber;

Ở đây số lượng vị trí khác nhau cho mỗi dự án được tính. Kết quả của truy vấn này:

Như bạn có thể thấy từ truy vấn được trình bày trong ví dụ, các giá trị là NULL hàm ĐẾMđã không được tính đến. (Tổng của tất cả các giá trị trong cột vị trí hóa ra là 7, không phải 11 như lẽ ra phải vậy.)

Dạng thứ hai của hàm COUNT, tức là Hàm COUNT(*) đếm số hàng trong một bảng. Và nếu câu lệnh SELECT của một truy vấn có hàm COUNT(*) chứa mệnh đề WHERE kèm theo một điều kiện thì hàm sẽ trả về số hàng thỏa mãn điều kiện đã chỉ định. Không giống như phiên bản đầu tiên của hàm COUNT, dạng thứ hai không bỏ qua các giá trị NULL vì hàm này hoạt động trên hàng chứ không phải cột. Ví dụ dưới đây minh họa cách sử dụng hàm COUNT(*):

SỬ DỤNG SampleDb; CHỌN Công việc NHƯ "Loại công việc", COUNT(*) "Cần công nhân" TỪ Works_on NHÓM THEO Công việc;

Ở đây số lượng vị trí trong tất cả các dự án được tính toán. Kết quả của yêu cầu:

hàm COUNT_BIG tương tự như hàm COUNT. Sự khác biệt duy nhất giữa chúng là kiểu kết quả mà chúng trả về: hàm COUNT_BIG luôn trả về các giá trị kiểu BIGINT, trong khi hàm COUNT trả về các giá trị dữ liệu kiểu INTEGER.

Hàm tổng hợp thống kê

Các hàm sau tạo nên nhóm hàm tổng hợp thống kê:

VAR

Tính toán phương sai thống kê của tất cả các giá trị được biểu thị trong một cột hoặc biểu thức.

VARP

Tính toán phương sai thống kê của tổng thể của tất cả các giá trị được biểu thị trong một cột hoặc biểu thức.

STDEV

Tính độ lệch chuẩn (được tính như Căn bậc hai từ phương sai tương ứng) của tất cả các giá trị của một cột hoặc biểu thức.

STDEVP

Tính độ lệch chuẩn của tập hợp tất cả các giá trị trong một cột hoặc biểu thức.

Hàm tổng hợp do người dùng xác định

Thành phần Cơ sở dữ liệu cũng hỗ trợ việc thực hiện các chức năng do người dùng xác định. Khả năng này cho phép người dùng tăng cường các chức năng tổng hợp của hệ thống bằng các chức năng mà họ có thể tự triển khai và cài đặt. Các hàm này đại diện cho một lớp đặc biệt của các hàm do người dùng định nghĩa và sẽ được thảo luận chi tiết sau.

CÓ ưu đãi

Trong một câu ĐANG CÓ xác định một điều kiện áp dụng cho một nhóm hàng. Vì vậy, mệnh đề này có cùng ý nghĩa đối với các nhóm hàng giống như mệnh đề WHERE đối với nội dung của bảng tương ứng. Cú pháp CÓ ưu đãi Kế tiếp:

CÓ điều kiện

Ở đây, tham số điều kiện biểu thị điều kiện và chứa các hàm hoặc hằng số tổng hợp.

Việc sử dụng mệnh đề HAVING kết hợp với hàm tổng hợp COUNT(*) được minh họa trong ví dụ dưới đây:

SỬ DỤNG SampleDb; -- Trả về "p3" CHỌN số dự án TỪ NHÓM Works_on THEO số dự án CÓ COUNT(*)

Trong ví dụ này, hệ thống nhóm tất cả các hàng theo giá trị của cột ProjectNumber bằng mệnh đề GROUP BY. Sau đó, số hàng trong mỗi nhóm được đếm và các nhóm chứa ít hơn bốn hàng (ba hoặc ít hơn) sẽ được chọn.

Mệnh đề HAVING cũng có thể được sử dụng mà không cần các hàm tổng hợp, như trong ví dụ bên dưới:

SỬ DỤNG SampleDb; -- Trả về "Tư vấn" CHỌN Công việc TỪ NHÓM Works_on THEO Công việc CÓ Công việc THÍCH "K%";

Ví dụ này nhóm các hàng của bảng Works_on theo chức danh công việc và loại bỏ những công việc không bắt đầu bằng chữ cái "K".

Mệnh đề HAVING cũng có thể được sử dụng mà không cần mệnh đề GROUP BY, mặc dù đây không phải là thông lệ. Trong trường hợp này, tất cả các hàng của bảng được trả về trong một nhóm.

mệnh đề ĐẶT HÀNG THEO

Lời đề nghị ĐẶT BỞI xác định thứ tự sắp xếp của các hàng trong tập kết quả được truy vấn trả về. Câu này có cú pháp như sau:

Thứ tự sắp xếp được chỉ định trong tham số col_name. Tham số col_number là chỉ báo thứ tự sắp xếp thay thế giúp xác định các cột theo thứ tự chúng xuất hiện trong danh sách chọn của câu lệnh SELECT (1 là cột đầu tiên, 2 là cột thứ hai, v.v.). tham số ASC chỉ định sắp xếp theo thứ tự tăng dần và tham số DESC- theo hướng đi xuống. Mặc định là ASC.

Tên cột trong mệnh đề ORDER BY không nhất thiết phải nằm trong danh sách các cột được chọn. Nhưng điều này không áp dụng cho các truy vấn như SELECT DISTINCT, bởi vì trong các truy vấn như vậy, tên cột được chỉ định trong mệnh đề ORDER BY cũng phải được chỉ định trong danh sách các cột được chọn. Ngoài ra, mệnh đề này không thể chứa tên cột từ các bảng không được chỉ định trong mệnh đề FROM.

Như bạn có thể thấy từ cú pháp của mệnh đề ORDER BY, tập kết quả có thể được sắp xếp theo nhiều cột. Việc sắp xếp này được thể hiện trong ví dụ dưới đây:

Trong ví dụ này, mã số phòng ban và tên nhân viên được chọn cho những nhân viên có số lượng nhân sự dưới 20.000 và được sắp xếp theo họ và tên. Kết quả của truy vấn này:

Các cột trong mệnh đề ORDER BY có thể được chỉ định không phải bằng tên mà theo thứ tự của chúng trong danh sách chọn. Theo đó, câu trong ví dụ trên có thể viết lại như sau:

Như là thay đổi phương pháp việc chỉ định các cột theo vị trí của chúng thay vì tên được sử dụng nếu tiêu chí sắp xếp có chứa hàm tổng hợp. (Một cách khác là sử dụng tên cột, sau đó xuất hiện trong mệnh đề ORDER BY.) Tuy nhiên, trong mệnh đề ORDER BY, bạn nên chỉ định các cột theo tên thay vì theo số, để dễ cập nhật hơn truy vấn xem các cột có cần được thêm hoặc xóa khỏi danh sách chọn hay không. Việc chỉ định các cột trong mệnh đề ORDER BY theo số của chúng được hiển thị trong ví dụ bên dưới:

SỬ DỤNG SampleDb; CHỌN Số dự án, COUNT(*) "Số lượng nhân viên" TỪ NHÓM Works_on THEO Số dự án ĐẶT HÀNG THEO 2 DESC;

Ở đây, đối với mỗi dự án, số lượng dự án và số lượng nhân viên tham gia vào dự án được chọn, sắp xếp kết quả theo số lượng nhân viên giảm dần.

Transact-SQL đặt các giá trị NULL ở đầu danh sách khi sắp xếp theo thứ tự tăng dần và ở cuối danh sách khi sắp xếp theo thứ tự giảm dần.

Sử dụng mệnh đề ORDER BY để phân trang kết quả

Hiển thị kết quả truy vấn trên trang hiện tại có thể được thực hiện trong ứng dụng người dùng hoặc hướng dẫn máy chủ cơ sở dữ liệu thực hiện việc này. Trong trường hợp đầu tiên, tất cả các hàng cơ sở dữ liệu được gửi đến ứng dụng, công việc của ứng dụng là chọn các hàng cần thiết và hiển thị chúng. Trong trường hợp thứ hai, về phía máy chủ, chỉ những hàng cần thiết cho trang hiện tại. Như bạn có thể mong đợi, việc tạo các trang phía máy chủ thường cung cấp hiệu suất tốt hơn, bởi vì Chỉ những dòng cần thiết để hiển thị mới được gửi đến máy khách.

Để hỗ trợ việc tạo trang phía máy chủ trong Máy chủ SQL 2012 giới thiệu hai mệnh đề câu lệnh SELECT mới: OFFSET và FETCH. Việc áp dụng hai câu này được thể hiện trong ví dụ dưới đây. Tại đây, từ cơ sở dữ liệu AdventureWorks2012 (bạn có thể tìm thấy trong nguồn), ID doanh nghiệp, chức danh công việc và ngày sinh của tất cả nhân viên nữ được truy xuất, sắp xếp kết quả theo chức danh công việc theo thứ tự tăng dần. Tập hợp các hàng kết quả được chia thành các trang 10 dòng và trang thứ ba được hiển thị:

Trong một câu BÙ LẠI chỉ định số dòng kết quả cần bỏ qua trong kết quả được hiển thị. Con số này được tính sau khi các hàng được sắp xếp bằng mệnh đề ORDER BY. Trong một câu TÌM KIẾM TIẾP THEO chỉ định số lượng hàng thỏa mãn điều kiện WHERE và được sắp xếp để trả về. Tham số của mệnh đề này có thể là hằng số, biểu thức hoặc kết quả của một truy vấn khác. Mệnh đề FETCH NEXT tương tự như mệnh đề LẤY ĐẦU TIÊN.

Mục tiêu chính khi tạo các trang phía máy chủ là có thể triển khai các dạng trang phổ biến bằng cách sử dụng các biến. Tác vụ này có thể được thực hiện bằng gói SQL Server.

Câu lệnh CHỌN và Thuộc tính IDENTITY

thuộc tính IDENTITY cho phép bạn xác định giá trị cho một cột trong bảng cụ thể dưới dạng bộ đếm tăng tự động. Các cột kiểu dữ liệu số như TINYINT, SMALLINT, INT và BIGINT có thể có thuộc tính này. Đối với một cột trong bảng như vậy, Database Engine sẽ tự động tạo các giá trị tuần tự bắt đầu từ giá trị bắt đầu được chỉ định. Do đó, thuộc tính IDENTITY có thể được sử dụng để tạo các giá trị số có một chữ số cho cột đã chọn.

Một bảng chỉ có thể chứa một cột có thuộc tính IDENTITY. Chủ sở hữu bảng có tùy chọn chỉ định giá trị bắt đầu và mức tăng, như trong ví dụ bên dưới:

SỬ DỤNG SampleDb; TẠO BẢNG Sản phẩm (Id INT IDENTITY(10000, 1) CÓ GIÁ TRỊ, Tên NVARCHAR(30) NOT NULL, Price MONEY) CHÈN VÀO GIÁ TRỊ Sản phẩm(Tên, Giá) ("Product1", 10), ("Product2", 15), ("Product3", 8), ("Product4", 15), ("Sản phẩm5", 40); -- Trả về 10004 SELECT IDENTITYCOL FROM Product WHERE Name = "Product5"; -- Tương tự như câu lệnh trước SELECT $identity FROM Product WHERE Name = "Product5";

Ví dụ này trước tiên tạo bảng Sản phẩm chứa cột Id có thuộc tính IDENTITY. Các giá trị trong cột Id được hệ thống tự động tạo ra, bắt đầu từ 10.000 và tăng dần theo đơn vị cho mỗi giá trị tiếp theo: 10.000, 10.001, 10.002, v.v.

Một số hàm và biến hệ thống được liên kết với thuộc tính IDENTITY. Ví dụ: mã ví dụ sử dụng biến hệ thống nhận dạng $. Như bạn có thể thấy từ đầu ra của mã này, biến này tự động tham chiếu thuộc tính IDENTITY. Bạn cũng có thể sử dụng chức năng hệ thống thay thế IDENTITYCOL.

Có thể tìm thấy giá trị ban đầu và số gia của một cột có thuộc tính IDENTITY bằng cách sử dụng các hàm IDENT_SEEDIDENT_INCR tương ứng. Các chức năng này được sử dụng như sau:

SỬ DỤNG SampleDb; SELECT IDENT_SEED("Sản phẩm"), IDENT_INCR("Sản phẩm")

Như đã đề cập, các giá trị IDENTITY được hệ thống đặt tự động. Nhưng người dùng có thể chỉ định rõ ràng giá trị của chúng cho một số hàng nhất định bằng cách gán tham số IDENTITY_INSERT Giá trị ON trước khi chèn một giá trị rõ ràng:

BẬT tên bảng IDENTITY INSERT ON

Vì bạn có thể sử dụng tham số IDENTITY_INSERT để đặt cột có thuộc tính IDENTITY thành bất kỳ giá trị nào, kể cả giá trị trùng lặp, nên thuộc tính IDENTITY thường không thực thi tính duy nhất của các giá trị của cột. Do đó, để thực thi tính duy nhất của các giá trị cột, bạn nên sử dụng các ràng buộc UNIQUE hoặc PRIMARY KEY.

Khi bạn chèn các giá trị vào bảng sau khi bật IDENTITY_INSERT, hệ thống sẽ tạo giá trị tiếp theo của cột IDENTITY bằng cách tăng giá trị hiện tại lớn nhất của cột đó.

TẠO câu lệnh SEQUENCE

Có một số nhược điểm đáng kể khi sử dụng thuộc tính IDENTITY, trong đó đáng kể nhất là những nhược điểm sau:

    việc áp dụng thuộc tính được giới hạn trong bảng đã chỉ định;

    giá trị cột mới không thể đạt được bằng bất kỳ cách nào khác ngoài việc áp dụng nó;

    thuộc tính IDENTITY chỉ có thể được chỉ định khi tạo cột.

Vì những lý do này, SQL Server 2012 giới thiệu các chuỗi có cùng ngữ nghĩa với thuộc tính IDENTITY nhưng không có thuộc tính IDENTITY trước đó. liệt kê những khuyết điểm. TRONG trong ngữ cảnh này Trình tự là một chức năng cơ sở dữ liệu cho phép bạn chỉ định các giá trị bộ đếm cho các đối tượng cơ sở dữ liệu khác nhau, chẳng hạn như các cột và biến.

Trình tự được tạo bằng cách sử dụng hướng dẫn TẠO TRÌNH TỰ. Câu lệnh CREATE SEQUENCE được định nghĩa trong tiêu chuẩn SQL và được hỗ trợ bởi các hệ thống cơ sở dữ liệu quan hệ khác như IBM DB2 và Oracle.

Ví dụ dưới đây cho thấy cách tạo một chuỗi trong SQL Server:

SỬ DỤNG SampleDb; TẠO CHUỖI dbo.Sequence1 NHƯ INT BẮT ĐẦU VỚI 1 TĂNG LÊN 5 GIÁ TRỊ TỐI THIỂU 1 GIÁ TRỊ TỐI ĐA 256 CHU KỲ;

Trong ví dụ trên, các giá trị của Sequence1 được hệ thống tạo tự động, bắt đầu bằng giá trị 1 và tăng dần 5 cho mỗi giá trị tiếp theo. Do đó trong BẮT ĐẦU ưu đãi giá trị ban đầu được chỉ định và trong ưu đãi TĂNG- bước chân. (Bước này có thể là tích cực hoặc tiêu cực.)

Trong hai câu tùy chọn tiếp theo GIÁ TRỊ TỐI THIỂUGIÁ TRỊ TỐI ĐA tối thiểu và gia trị lơn nhâtđối tượng trình tự. (Lưu ý rằng giá trị MINVALUE phải nhỏ hơn hoặc bằng giá trị ban đầu và giá trị MAXVALUE không thể lớn hơn giới hạn trên của loại dữ liệu được chỉ định cho chuỗi.) Trong mệnh đề XE ĐẠP chỉ ra rằng chuỗi được lặp lại từ đầu khi vượt quá giá trị tối đa (hoặc tối thiểu đối với chuỗi có bước âm). Theo mặc định, điều khoản này được đặt thành KHÔNG CÓ CHU KỲ, có nghĩa là vượt quá mức tối đa hoặc giá trị tối thiểu trình tự ném một ngoại lệ.

Đặc điểm chính của trình tự là tính độc lập của chúng với các bảng, tức là chúng có thể được sử dụng với bất kỳ đối tượng cơ sở dữ liệu nào, chẳng hạn như các cột trong bảng hoặc các biến. (Thuộc tính này có tác động tích cực đến việc lưu trữ và theo đó, đến hiệu suất. Một trình tự nhất định không cần lưu trữ; Chỉ giá trị cuối cùng của nó được lưu.)

Các giá trị chuỗi mới được tạo bằng cách sử dụng GIÁ TRỊ TIẾP THEO CHO biểu thức, ứng dụng của nó được thể hiện trong ví dụ dưới đây:

SỬ DỤNG SampleDb; -- Trả về 1 CHỌN GIÁ TRỊ TIẾP THEO CHO dbo.sequence1; -- Trả về 6 (bước tiếp theo) CHỌN GIÁ TRỊ TIẾP THEO CHO dbo.sequence1;

Bạn có thể sử dụng biểu thức NEXT VALUE FOR để gán kết quả của một chuỗi cho một ô biến hoặc cột. Ví dụ dưới đây cho thấy cách sử dụng biểu thức này để gán kết quả cho một cột:

SỬ DỤNG SampleDb; TẠO BẢNG Sản phẩm (Id INT KHÔNG NULL, Tên NVARCHAR(30) NOT NULL, Giá MONEY) CHÈN VÀO GIÁ TRỊ Sản phẩm (GIÁ TRỊ TIẾP THEO CHO dbo.sequence1, "Product1", 10); CHÈN VÀO GIÁ TRỊ Sản phẩm (GIÁ TRỊ TIẾP THEO CHO dbo.sequence1, "Product2", 15); -- ...

Trong ví dụ trên, trước tiên chúng ta tạo bảng Sản phẩm gồm bốn cột. Tiếp theo, hai câu lệnh INSERT chèn hai hàng vào bảng này. Hai ô đầu tiên của cột đầu tiên sẽ có giá trị 11 và 16.

Ví dụ dưới đây cho thấy việc sử dụng chế độ xem thư mục sys.sequencesđể xem giá trị hiện tại của một chuỗi mà không cần sử dụng nó:

Thông thường, câu lệnh NEXT VALUE FOR được sử dụng trong câu lệnh INSERT để khiến hệ thống chèn các giá trị được tạo. Biểu thức này cũng có thể được sử dụng như một phần của truy vấn nhiều hàng bằng mệnh đề OVER.

Để thay đổi thuộc tính của chuỗi hiện có, hãy sử dụng Câu lệnh THAY ĐỔI TRÌNH TỰ. Một trong những cách sử dụng quan trọng nhất của câu lệnh này là với tùy chọn REStart WITH, tùy chọn này sẽ đặt lại trình tự đã chỉ định. Ví dụ bên dưới cho thấy việc sử dụng ALTER SEQUENCE để đặt lại gần như tất cả các thuộc tính của Sequence1:

SỬ DỤNG SampleDb; THAY ĐỔI TRÌNH TỰ dbo.sequence1 KHỞI ĐỘNG LẠI VỚI 100 TĂNG LÊN 50 GIÁ TRỊ TỐI THIỂU 50 GIÁ TRỊ TỐI ĐA 200 KHÔNG CÓ CHU KỲ;

Xóa một chuỗi bằng lệnh TRÌNH TỰ THẢ.

Đặt toán tử

Ngoài các toán tử đã thảo luận trước đó, Transact-SQL còn hỗ trợ thêm ba toán tử tập hợp: UNION, INTERSECT và EXCEPT.

nhà điều hành UNION

nhà điều hành UNION kết hợp kết quả của hai hoặc nhiều truy vấn vào một tập kết quả duy nhất bao gồm tất cả các hàng thuộc về tất cả các truy vấn trong liên kết. Theo đó, kết quả của việc nối hai bảng là một bảng mới chứa tất cả các hàng có trong một trong các bảng gốc hoặc trong cả hai bảng này.

Dạng tổng quát của toán tử UNION trông như thế này:

select_1 UNION chọn_2 ( select_3])...

Các tham số select_1, select_2, ... là các câu lệnh SELECT tạo ra một phép nối. Nếu tùy chọn TẤT CẢ được sử dụng, tất cả các hàng sẽ được hiển thị, bao gồm cả các hàng trùng lặp. Trong toán tử UNION, tham số ALL có cùng ý nghĩa như trong danh sách lựa chọn SELECT, nhưng có một điểm khác biệt: đối với danh sách lựa chọn SELECT, tham số này được sử dụng theo mặc định, nhưng đối với toán tử UNION, nó phải được chỉ định rõ ràng.

Ở dạng ban đầu, cơ sở dữ liệu SampleDb không phù hợp để thể hiện việc sử dụng toán tử UNION. Do đó, phần này tạo một bảng mới Nhân viênEnh, giống hệt với bảng Nhân viên hiện có, nhưng có cột phụ Thành phố. Cột này cho biết nơi cư trú của nhân viên.

Việc tạo bảng StaffEnh cung cấp cho chúng ta một cơ hội tốt để chứng minh việc sử dụng mệnh đề VÀO TRONG trong câu lệnh SELECT. Câu lệnh SELECT INTO thực hiện hai thao tác. Đầu tiên, một bảng mới được tạo với các cột được liệt kê trong danh sách CHỌN. Sau đó, các hàng từ bảng gốc sẽ được chèn vào bảng mới. Tên của bảng mới được chỉ định trong mệnh đề INTO và tên của bảng nguồn được chỉ định trong mệnh đề FROM.

Ví dụ dưới đây minh họa cách tạo bảng Nhân viênEnh từ bảng Nhân viên:

SỬ DỤNG SampleDb; CHỌN * VÀO Nhân viênTỪ Nhân viên; ALTER TABLE Nhân viênEnh THÊM Thành phố NCHAR(40) NULL;

Trong ví dụ này, câu lệnh SELECT INTO tạo bảng Nhân viên, chèn tất cả các hàng từ bảng nguồn Nhân viên vào đó, sau đó câu lệnh ALTER TABLE sẽ thêm cột Thành phố vào bảng mới. Nhưng cột Thành phố được thêm vào không chứa bất kỳ giá trị nào. Các giá trị trong cột này có thể được chèn bằng cách sử dụng Quản lý môi trường Studio hoặc sử dụng đoạn mã sau:

SỬ DỤNG SampleDb; CẬP NHẬT Nhân viênEnh SET Thành phố = "Kazan" WHERE Id = 2581; CẬP NHẬT Nhân viênEnh SET Thành phố = "Moscow" WHERE Id = 9031; CẬP NHẬT Nhân viênEnh SET Thành phố = "Ekaterinburg" WHERE Id = 10102; CẬP NHẬT Nhân viênEnh SET Thành phố = "St. Petersburg" WHERE Id = 18316; CẬP NHẬT Nhân viênEnh SET Thành phố = "Krasnodar" WHERE Id = 25348; CẬP NHẬT Nhân viênEnh SET Thành phố = "Kazan" WHERE Id = 28559; CẬP NHẬT Nhân viênEnh SET Thành phố = "Perm" WHERE Id = 29346;

Bây giờ chúng ta đã sẵn sàng để chứng minh việc sử dụng lệnh UNION. Ví dụ bên dưới hiển thị một truy vấn để tạo liên kết giữa các bảng StaffEnh và Department bằng cách sử dụng câu lệnh sau:

SỬ DỤNG SampleDb; CHỌN Thành phố LÀ "Thành phố" TỪ ĐOÀN Nhân viên CHỌN Địa điểm TỪ Sở;

Kết quả của truy vấn này:

Chỉ các bảng tương thích mới có thể được nối bằng câu lệnh UNION. Theo các bảng tương thích, chúng tôi muốn nói rằng cả hai danh sách cột được chọn phải chứa cùng số cột và các cột tương ứng phải có kiểu dữ liệu tương thích. (Về các loại tương thích dữ liệu INT và SMALLINT không tương thích.)

Kết quả của sự hợp nhất chỉ có thể được sắp xếp bằng cách sử dụng mệnh đề ĐẶT HÀNG BY trong câu lệnh SELECT cuối cùng, như trong ví dụ bên dưới. Mệnh đề GROUP BY và HAVING có thể được sử dụng với hướng dẫn riêng CHỌN, nhưng không phải trong chính công đoàn.

Truy vấn trong ví dụ này chọn những nhân viên làm việc ở phòng d1 hoặc bắt đầu làm việc trên dự án trước ngày 1 tháng 1 năm 2008.

Toán tử UNION hỗ trợ tham số ALL. Việc sử dụng tùy chọn này sẽ không loại bỏ các bản sao khỏi tập kết quả. Bạn có thể sử dụng toán tử OR thay vì toán tử UNION nếu tất cả các câu lệnh SELECT được nối bởi một hoặc nhiều toán tử UNION đều tham chiếu đến cùng một bảng. Trong trường hợp này, tập hợp các câu lệnh SELECT được thay thế bằng một câu lệnh SELECT bằng một tập hợp các câu lệnh OR.

Toán tử INTERSECT và EXCEPT

Hai toán tử khác để làm việc với tập hợp, GIAO NHAUNGOẠI TRỪ, lần lượt xác định giao điểm và hiệu. Dưới phần giao nhau trong ngữ cảnh này có một tập hợp các hàng thuộc cả hai bảng. Và sự khác biệt giữa hai bảng được định nghĩa là tất cả các giá trị thuộc về bảng đầu tiên và không có trong bảng thứ hai. Ví dụ dưới đây cho thấy việc sử dụng toán tử INTERSECT:

Transact-SQL không hỗ trợ việc sử dụng tham số ALL với toán tử INTERSECT hoặc EXCEPT. Việc sử dụng toán tử EXCEPT được thể hiện trong ví dụ dưới đây:

Cần nhớ rằng ba toán tử tập hợp này có mức độ ưu tiên thực hiện khác nhau: toán tử INTERSECT có mức ưu tiên cao nhất, theo sau là toán tử EXCEPT và toán tử UNION có mức độ ưu tiên thấp nhất. Không chú ý đến mức độ ưu tiên thực hiện khi sử dụng nhiều Người vận hành khác nhauđể làm việc với tập hợp có thể dẫn đến kết quả không mong muốn.

Biểu thức CASE

Trong lĩnh vực lập trình ứng dụng cơ sở dữ liệu, đôi khi cần phải sửa đổi cách biểu diễn dữ liệu. Ví dụ: mọi người có thể được chia nhỏ bằng cách mã hóa họ theo tầng lớp xã hội của họ, sử dụng các giá trị 1, 2 và 3, lần lượt biểu thị nam, nữ và trẻ em. Kỹ thuật lập trình này có thể giảm thời gian cần thiết để thực hiện một chương trình. biểu thức CASE Ngôn ngữ Transact-SQL giúp dễ dàng triển khai loại mã hóa này.

Không giống như hầu hết các ngôn ngữ lập trình, CASE không phải là một câu lệnh mà là một biểu thức. Do đó, biểu thức CASE có thể được sử dụng ở hầu hết mọi nơi mà Transact-SQL cho phép biểu thức. Biểu thức CASE có hai dạng:

    biểu thức CASE đơn giản;

    biểu thức tìm kiếm CASE.

Cú pháp cho một biểu thức CASE đơn giản là:

Một câu lệnh có biểu thức CASE đơn giản trước tiên sẽ tìm kiếm danh sách tất cả các biểu thức trong Mệnh đề KHI biểu thức đầu tiên khớp với biểu thức_1, sau đó thực thi lệnh tương ứng mệnh đề THEN. Nếu không có biểu thức nào phù hợp trong danh sách WHEN, mệnh đề ELSE.

Cú pháp biểu thức tìm kiếm CASE như sau:

TRONG trong trường hợp này nó tìm kiếm điều kiện khớp đầu tiên và sau đó thực thi mệnh đề THEN tương ứng. Nếu không có điều kiện nào đáp ứng yêu cầu thì mệnh đề ELSE sẽ được thực thi. Việc sử dụng biểu thức tìm kiếm CASE được hiển thị trong ví dụ bên dưới:

SỬ DỤNG SampleDb; CHỌN Tên dự án, TRƯỜNG HỢP KHI Ngân sách > 0 VÀ Ngân sách 100000 VÀ Ngân sách 150000 VÀ Ngân sách

Kết quả của truy vấn này:

Ví dụ này cân nhắc ngân sách của tất cả các dự án và sau đó hiển thị trọng số được tính toán cùng với tên dự án tương ứng.

Ví dụ bên dưới cho thấy một cách khác để sử dụng biểu thức CASE, trong đó mệnh đề WHEN chứa các truy vấn con tạo thành một phần của biểu thức:

SỬ DỤNG SampleDb; CHỌN Tên dự án, TRƯỜNG HỢP KHI p1.Ngân sách (CHỌN AVG(p2.Budget) TỪ Dự án p2) SAU ĐÓ "trên mức trung bình" KẾT THÚC "Danh mục ngân sách" TỪ Dự án p1;

Kết quả của truy vấn này như sau: