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. 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 DESCI'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)
asked Mar 23, 2010 at 6:41
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 <= 10Oracle 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
5
If you are using Oracle 12c, use:
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 ONLYFETCH NEXT N ROWS ONLY
More info: //docs.oracle.com/javadb/10.5.3.0/ref/rrefsqljoffsetfetch.html
answered Aug 3, 2016 at 11:02
VolpatoVolpato
1,3831 gold badge9 silver badges10 bronze badges
3
try
SELECT * FROM users FETCH NEXT 10 ROWS ONLY;
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
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
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
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 67Mặ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
Đã 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;
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