Top 10 trong t sql năm 2022

Lệnh SELECT TOP được dùng để lấy dữ liệu từ 1 hay nhiều bảng trong SQL SERVER và trả về các dữ liệu được giới hạn dựa trên % cố định hoặc giá trị

Mục lục

  • 1 1. Cú pháp lệnh SELECT TOP trong lập trình dữ liệu cấu trúc SQL Server
  • 2 2. Tên biến (hoặc giá trị biến)
    • 2.1 Biến TOP
    • 2.2 Biến PERCENT
    • 2.3 Biến WITH TIES
    • 2.4 Biến WHERE
    • 2.5 Biến ORDER BY
  • 3 Kết luận

1. Cú pháp lệnh SELECT TOP trong lập trình dữ liệu cấu trúc SQL Server

SELECT TOP (giatridau) [PERCENT] [WITH TIES]

bieu_thuc

FROM bang

[WHERE dieukien]

[ORDER BY bieuthuc [ ASC | DESC ]];

2. Tên biến (hoặc giá trị biến)

Biến TOP

TOP (giatridau), lệnh trả về kết quả dựa trên giatridau. Ví dụ TOP(1) sẽ chèn 1 hàng đầu tiên từ kết quả, đây cũng có thể gọi là Select top 1 trong SQL.

Ví dụ thực tế:

SELECT TOP(10)

nhanvien_id, ho, ten

FROM nhanvien

WHERE ho = ‘LÊ’

ORDER BY nhanvien_id;

Lệnh này sẽ lấy 10 dữ liệu đầu tiên trong bảng nhanvien có họ là LÊ. Khi đã lấy đủ 5 dữ liệu thì những dữ liệu khác dù có họ LÊ cũng không được xuất hiện.

Nếu thêm mệnh đề WITH TIES

SELECT TOP(10) WITH TIES

nhanvien_id, ho, ten

FROM nhanvien

WHERE ho = ‘LÊ’

ORDER BY nhanvien_id;

Ví dụ này sẽ trả về các hàng giống với hàng cuối trong bộ kết quả.

Biến PERCENT

Tùy chọn. Nếu sử dụng kết quả trả về sẽ dựa trên % của giatridau. Ví dụ TOP(5) PERCENT sẽ chèn 5% giá trị đầu trong bộ kết quả.

Ví dụ thực tế:

SELECT TOP(20) PERCENT

nhanvien_id, ho, ten

FROM nhanvien

WHERE ho = ‘LÊ’

ORDER BY nhanvien_id;

Ví dụ này sẽ trả về bộ kết quả đúng 20% đầu tiên trong bảng nhanvien trong số các nhân viên có họ là LÊ. 80% còn lại sẽ không được trả về.

Thêm hàm WITH TIES ta có:

SELECT TOP(20) PERCENT WITH TIES

nhanvien_id, ho, ten

FROM nhanvien

WHERE ho = ‘LÊ’

ORDER BY nhanvien_id;

Kết quả trả về sẽ có các hàng giống với hàng cuối trong bộ kết quả. Bộ kết quả khi đó sẽ nhiều hơn 20%.

Biến WITH TIES

Tùy chọn. Sử dụng nếu các hàng cuối trong kết quả có giá trị giống với các hàng. Xảy ra khi số hàng trả về nhiều hơn biến TOP

bieuthuc

Cột hoặc giá trị muốn lấy về

bang

Bảng muốn lấy bản ghi từ đó. Phải có ít nhất 1 bảng trong mệnh đề FROM.

Biến WHERE

Điều kiện áp dụng để bản ghi được chọn.

Biến ORDER BY

Dùng để sắp xếp các kết quả trả về theo thứ tự tăng hoặc giảm (ASC hoặc DESC)

Kết luận

Vậy là chúng ta lại đi xong một câu lệnh nữa trong sql. Hy vọng rằng có thể tiếp thêm nhiều kiến thức cho các bạn. Cùng đón chờ các bài viết tiếp theo của tôi nhé.

Tốt nghiệp Graduated Windesheim 2020, top Đại học lớn nhất thế giới, tôi mở blog chia sẻ kiến thức, kinh nghiệm về SQL Xem thêm bài viết

Điều hướng bài viết

I have an big problem with an SQL Statement in Oracle. I want to select the TOP 10 Records ordered by STORAGE_DB which aren't in a list from an other select statement.

This one works fine for all records:

SELECT DISTINCT 
  APP_ID, 
  NAME, 
  STORAGE_GB, 
  HISTORY_CREATED, 
  TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') AS HISTORY_DATE  
  FROM HISTORY WHERE 
      STORAGE_GB IS NOT NULL AND 
        APP_ID NOT IN (SELECT APP_ID
                       FROM HISTORY
                        WHERE TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') = '06.02.2009') 

But when I am adding

AND ROWNUM <= 10
ORDER BY STORAGE_GB DESC

I'm getting some kind of "random" Records. I think because the limit takes in place before the order.

Does someone has an good solution? The other problem: This query is realy slow (10k+ records)

Top 10 trong t sql năm 2022

asked Mar 23, 2010 at 6:41

Top 10 trong t sql năm 2022

opHASnoNAMEopHASnoNAME

19.9k25 gold badges97 silver badges140 bronze badges

0

You'll need to put your current query in subquery as below :

SELECT * FROM (
  SELECT DISTINCT 
  APP_ID, 
  NAME, 
  STORAGE_GB, 
  HISTORY_CREATED, 
  TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') AS HISTORY_DATE  
  FROM HISTORY WHERE 
    STORAGE_GB IS NOT NULL AND 
      APP_ID NOT IN (SELECT APP_ID FROM HISTORY WHERE TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') ='06.02.2009')
  ORDER BY STORAGE_GB DESC )
WHERE ROWNUM <= 10

Oracle applies rownum to the result after it has been returned.
You need to filter the result after it has been returned, so a subquery is required. You can also use RANK() function to get Top-N results.

For performance try using NOT EXISTS in place of NOT IN. See this for more.

answered Mar 23, 2010 at 6:46

Top 10 trong t sql năm 2022

5

If you are using Oracle 12c, use:

FETCH NEXT N ROWS ONLY

SELECT DISTINCT 
  APP_ID, 
  NAME, 
  STORAGE_GB, 
  HISTORY_CREATED, 
  TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') AS HISTORY_DATE  
  FROM HISTORY WHERE 
    STORAGE_GB IS NOT NULL AND 
      APP_ID NOT IN (SELECT APP_ID FROM HISTORY WHERE TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') ='06.02.2009')
  ORDER BY STORAGE_GB DESC
FETCH NEXT 10 ROWS ONLY

More info: http://docs.oracle.com/javadb/10.5.3.0/ref/rrefsqljoffsetfetch.html

answered Aug 3, 2016 at 11:02

Top 10 trong t sql năm 2022

VolpatoVolpato

1,3831 gold badge9 silver badges10 bronze badges

3

try

SELECT * FROM users FETCH NEXT 10 ROWS ONLY;

Top 10 trong t sql năm 2022

answered Jun 22, 2017 at 12:31

ShaabanShaaban

5074 silver badges3 bronze badges

0

With regards to the poor performance there are any number of things it could be, and it really ought to be a separate question. However, there is one obvious thing that could be a problem:

WHERE TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') = '06.02.2009') 

If HISTORY_DATE really is a date column and if it has an index then this rewrite will perform better:

WHERE HISTORY_DATE = TO_DATE ('06.02.2009', 'DD.MM.YYYY')  

This is because a datatype conversion disables the use of a B-Tree index.

answered Mar 23, 2010 at 6:57

APCAPC

142k19 gold badges172 silver badges278 bronze badges

You get an apparently random set because ROWNUM is applied before the ORDER BY. So your query takes the first ten rows and sorts them.0 To select the top ten salaries you should use an analytic function in a subquery, then filter that:

 select * from 
     (select empno,
             ename,
             sal,
             row_number() over(order by sal desc nulls last) rnm
    from emp) 
 where rnm<=10

APC

142k19 gold badges172 silver badges278 bronze badges

answered Mar 23, 2010 at 9:19

vijayavijaya

1492 bronze badges

you may use this query for selecting top records in oracle. Rakesh B

select * from User_info where id >= (select max(id)-10 from User_info);

answered Jan 6, 2021 at 16:17

Top 10 trong t sql năm 2022

1

Có cách nào để chọn, ví dụ, 10 hàng đầu tiên của một bảng trong T-SQL (MSSQL làm việc) không? Tôi nghĩ rằng tôi đã thấy một cái gì đó trong Oracle được định nghĩa là biến Meta Rownum, được sử dụng theo cách tiếp theo
I think I saw something in Oracle defined as rownum meta variable, used in a following way

select * from Users where rownum<=10

Nhưng những gì về MSSQL?

Hỏi ngày 11 tháng 10 năm 2009 lúc 22:57Oct 11, 2009 at 22:57

2

select top(@count) * from users

Nếu @count là hằng số, bạn có thể thả dấu ngoặc đơn:

select top 42 * from users

(Cái sau hoạt động trên SQL Server 2000, trong khi cái trước yêu cầu ít nhất 2005)

Đã trả lời ngày 11 tháng 10 năm 2009 lúc 22:58Oct 11, 2009 at 22:58

Top 10 trong t sql năm 2022

Bạn có thể sử dụng hàm row_number () của Microsoft để quyết định trả lại hàng nào. Điều đó có nghĩa là bạn không giới hạn ở chỉ các kết quả X hàng đầu, bạn có thể lấy các trang.

SELECT * 
FROM (SELECT row_number() over (order by UserID) AS line_no, * 
      FROM dbo.User) as users
WHERE users.line_no < 10
OR users.line_no BETWEEN 34 and 67

Mặc dù vậy, bạn phải làm tổ câu hỏi ban đầu, bởi vì nếu không bạn sẽ nhận được một thông báo lỗi cho bạn biết rằng bạn không thể làm những gì bạn muốn theo cách bạn có thể có thể trong một thế giới lý tưởng.

Msg 4108, Level 15, State 1, Line 3
Windowed functions can only appear in the SELECT or ORDER BY clauses.

Đã trả lời ngày 17 tháng 5 năm 2013 lúc 13:45May 17, 2013 at 13:45

JonathanjonathanJonathan

25.2K13 Huy hiệu vàng66 Huy hiệu bạc85 Huy hiệu Đồng13 gold badges66 silver badges85 bronze badges

SELECT TOP 10 *
FROM Users

Lưu ý rằng nếu bạn không chỉ định mệnh đề

select top(@count) * from users
0 thì bất kỳ 10 hàng nào cũng có thể được trả về, bởi vì "10 hàng đầu tiên" không thực sự có ý nghĩa gì cho đến khi bạn nói với cơ sở dữ liệu nên sử dụng.

Đã trả lời ngày 11 tháng 10 năm 2009 lúc 22:59Oct 11, 2009 at 22:59

LukehlukehLukeH

257K57 Huy hiệu vàng360 Huy hiệu bạc409 Huy hiệu đồng57 gold badges360 silver badges409 bronze badges

1

Bạn cũng có thể sử dụng RowCount, nhưng Top có lẽ tốt hơn và sạch hơn, do đó là Upvote cho Mehrdad

SET ROWCOUNT 10
SELECT * FROM dbo.Orders
WHERE EmployeeID = 5
ORDER BY OrderDate

SET ROWCOUNT 0

Đã trả lời ngày 11 tháng 10 năm 2009 lúc 23:01Oct 11, 2009 at 23:01

1

Thử cái này.

declare @topval int

set @topval = 5 (customized value)

SELECT TOP(@topval) * from your_database

Top 10 trong t sql năm 2022

Đã trả lời ngày 20 tháng 12 năm 2013 lúc 6:27Dec 20, 2013 at 6:27

Rameshwar Pawalerameshwar PawaleRameshwar Pawale

6022 Huy hiệu vàng15 Huy hiệu bạc34 Huy hiệu đồng2 gold badges15 silver badges34 bronze badges

Chọn top 10 * từ bảng_name đặt hàng theo đơn đặt hàng_unique_column descTABLE_NAME ORDER BY ORDERED_UNIQUE_COLUMN DESC

Đặt hàng_unique_column có thể là khóa chính gia tăng hoặc dấu thời gian của bạn could be your incrementing primary key or a timestamp

Đã trả lời ngày 13 tháng 12 năm 2017 lúc 15:43Dec 13, 2017 at 15:43

RahulrahulRahul

1.2361 Huy hiệu vàng15 Huy hiệu bạc18 Huy hiệu đồng1 gold badge15 silver badges18 bronze badges

Thử cái này:

SELECT * FROM USERS LIMIT 10;

Top 10 trong t sql năm 2022

Himanshu

30.9k30 Huy hiệu vàng109 Huy hiệu bạc130 Huy hiệu đồng30 gold badges109 silver badges130 bronze badges

Đã trả lời ngày 12 tháng 10 năm 2009 lúc 9:40Oct 12, 2009 at 9:40

RPLRPLRPL

811 Huy hiệu vàng3 Huy hiệu bạc10 Huy hiệu đồng1 gold badge3 silver badges10 bronze badges

1

Làm cách nào để nhận được 10 dữ liệu hàng đầu trong SQL?

Ví dụ - Sử dụng từ khóa phần trăm hàng đầu Ví dụ: Chọn TOP (10) phần trăm contact_id, last_name, first_name từ các liên hệ trong đó last_name = 'Anderson' đặt hàng theo contact_id; Ví dụ hàng đầu chọn SQL này sẽ chọn 10% bản ghi đầu tiên từ tập kết quả đầy đủ.SELECT TOP(10) PERCENT contact_id, last_name, first_name FROM contacts WHERE last_name = 'Anderson' ORDER BY contact_id; This SQL SELECT TOP example would select the first 10% of the records from the full result set.

Top trong T SQL là gì?

Giới hạn các hàng được trả về trong kết quả truy vấn được đặt thành một số lượng hàng hoặc tỷ lệ phần trăm được chỉ định trong SQL Server.Khi bạn sử dụng TOP với Đơn hàng theo mệnh đề, tập kết quả được giới hạn ở số n đầu tiên của các hàng được đặt hàng.Mặt khác, TOP trả về số n đầu tiên của hàng theo thứ tự không xác định.. When you use TOP with the ORDER BY clause, the result set is limited to the first N number of ordered rows. Otherwise, TOP returns the first N number of rows in an undefined order.

Làm cách nào để có được top 10 trong mysql?

Để chọn 10 phần tử đầu tiên từ cơ sở dữ liệu bằng mệnh đề SQL theo thứ tự với giới hạn 10. Chèn một số bản ghi vào bảng bằng lệnh chèn.Hiển thị tất cả các bản ghi từ bảng bằng cách sử dụng câu lệnh CHỌN.Dưới đây là truy vấn thay thế để chọn 10 yếu tố đầu tiên.ORDER BY clause with LIMIT 10. Insert some records in the table using insert command. Display all records from the table using select statement. Here is the alternate query to select first 10 elements.

Top 1 làm gì trong SQL?

Top 1 có nghĩa là chỉ trả về một bản ghi là tập kết quả.Bản ghi nào được trả về, phụ thuộc vào cột được chỉ định theo thứ tự theo mệnh đề.Nếu bạn muốn tìm bản ghi có giá trị tối thiểu cho một cột cụ thể, bạn sẽ truy vấn bản ghi với thứ tự bằng cách tăng dần (ASC).to only return one record as the result set. which record is returned, depends on the column that is specified in the order by clause. If you want to find the record with the minimum value for a particular column, you would query the record with the ORDER BY being ascending (ASC).