① sqlserver排序
排序可以是升序的
(ASC),也可以是降序的
(DESC)。如果未指定是升序還是降序,就假定為
ASC。
下面的查詢返回按
ProctID
升序排序的結果:
代碼如下
復制代碼
USE
AdventureWorks2008R2;
GO
SELECT
ProctID,
ProctLine,
ProctModelID
FROM
Proction.Proct
ORDER
BY
ProctID;
如果
ORDER
BY
子句中指定了多個列,則排序是嵌套的。下面的語句先按產品子類別降序排序
Proction.Proct
表中的行,然後在每個產品子類別中按
ListPrice
升序排序這些行。
代碼如下
復制代碼
USE
AdventureWorks2008R2;
GO
SELECT
ProctID,
ProctSubcategoryID,
ListPrice
FROM
Proction.Proct
ORDER
BY
ProctSubcategoryID
DESC,
ListPrice;
問題
同一...排序可以是升序的
(ASC),也可以是降序的
(DESC)。如果未指定是升序還是降序,就假定為
ASC。
下面的查詢返回按
ProctID
升序排序的結果:
代碼如下
復制代碼
USE
AdventureWorks2008R2;
GO
SELECT
ProctID,
ProctLine,
ProctModelID
FROM
Proction.Proct
ORDER
BY
ProctID;
如果
ORDER
BY
子句中指定了多個列,則排序是嵌套的。下面的語句先按產品子類別降序排序
Proction.Proct
表中的行,然後在每個產品子類別中按
ListPrice
升序排序這些行。
代碼如下
復制代碼
USE
AdventureWorks2008R2;
GO
SELECT
ProctID,
ProctSubcategoryID,
ListPrice
FROM
Proction.Proct
ORDER
BY
ProctSubcategoryID
DESC,
ListPrice;
問題
同一個查詢的結果集為什麽有時候是按他想要的順序排列,有時候又不是,或者是在SQL2000里是這個順序,到了SQL2005/2008又是那個順序?
其實,只要語句里沒有指定「order
by」,SQLSERVER並不會按照順序返回的。有可能你的表裡有一個欄位已經建立了索引
你想結果集按照那個建立了索引的欄位排序,那麼你不指定「order
by」是沒有問題的,因為表的存儲順序就是按照那個欄位
的順序排好序了,所以可以不指定「order
by」,但是如果你沒有在想排序的那個欄位建立索引,或者在SQL2000里建立了
索引,而在SQL2005/2008里沒有建立索引,那麼就要明確地用「order
by」指定。如果你沒有指定,哪怕一模一樣的查詢,
結果集順序這一次和上一次不一樣是很正常的。
② sqlserver編程求一查詢語句,簡單,在線等
select top 10 * from test order by 欄位名(想要按哪個列排序) ASC
select top 10 * from test order by 欄位名(想要按哪個列排序) DESC
倒過來排 前10條不就是最後10條嗎?
DESC 是descend 降序意思 ASC 是ascend 升序的意思
③ SQLServer如何查看錶結構呢有同oracle的desc一樣命令嗎
use Roy --資料庫
go
--2005實現資料庫表欄位屬性統計(2000里的系統表sysproperties描述表不存在,2005里用sys.extended_properties視圖替代)
select
[表名]=c.Name,
[表說明]=isnull(f.[value],''),
[列名]=a.Name,
[列序號]=a.Column_id,
[標識]=case when is_identity=1 then '√' else '' end,
[主鍵]=case when exists(select 1 from sys.objects x join sys.indexes y on x.Type=N'PK' and x.Name=y.Name
join sysindexkeys z on z.ID=a.Object_id and z.indid=y.index_id and z.Colid=a.Column_id)
then '√' else '' end,
[類型]=b.Name,
[位元組數]=case when a.[max_length]=-1 and b.Name!='xml' then 'max/2G'
when b.Name='xml' then '2^31-1位元組/2G'
else rtrim(a.[max_length]) end,
[長度]=case when ColumnProperty(a.object_id,a.Name,'Precision')=-1 then '2^31-1'
else rtrim(ColumnProperty(a.object_id,a.Name,'Precision')) end,
[小數]=isnull(ColumnProperty(a.object_id,a.Name,'Scale'),0),
[是否為空]=case when a.is_nullable=1 then '√' else '' end,
[列說明]=isnull(e.[value],''),
[默認值]=isnull(d.text,'')
from
sys.columns a
left join
sys.types b on a.user_type_id=b.user_type_id
inner join
sys.objects c on a.object_id=c.object_id and c.Type='U'
left join
syscomments d on a.default_object_id=d.ID
left join
sys.extended_properties e on e.major_id=c.object_id and e.minor_id=a.Column_id and e.class=1
left join
sys.extended_properties f on f.major_id=c.object_id and f.minor_id=0 and f.class=1
④ SQLserver 聯合查詢排序問題
不知道你原來的sql語句啥樣子啊。。。
SELECT
ISNULL(sale_item, '總計') AS item,
CASE
WHEN GROUPING(sale_item) = 1
AND GROUPING(STR(DATEPART(qq, sale_date))) = 1
THEN '總計'
WHEN GROUPING(sale_item) = 0
AND GROUPING(STR(DATEPART(qq, sale_date))) = 1
THEN '小計'
ELSE
STR(DATEPART(qq, sale_date))
END AS sale_q,
SUM(sale_money) [money]
FROM
sale_report
GROUP BY
sale_item, STR(DATEPART(qq, sale_date)) WITH ROLLUP;
item sale_q money
---- ---------- ----------------------------------------
A 1 180810.00
A 2 182819.00
A 3 184828.00
A 4 184828.00
A 小計 733285.00
B 1 180.00
B 2 455.00
B 3 735.00
B 4 1012.00
B 小計 2382.00
C 1 1398.00
C 2 1426.00
C 3 1457.00
C 4 1457.00
C 小計 5738.00
T 3 100.00
T 小計 100.00
總 總計 741505.00
(18 行受影響)
<hr/>
如果希望 總計、小計顯示在上面, 那麼 ORDER BY 設置一下.
SELECT
ISNULL(sale_item, '總計') AS item,
CASE
WHEN GROUPING(sale_item) = 1
AND GROUPING(STR(DATEPART(qq, sale_date))) = 1
THEN '總計'
WHEN GROUPING(sale_item) = 0
AND GROUPING(STR(DATEPART(qq, sale_date))) = 1
THEN '小計'
ELSE
STR(DATEPART(qq, sale_date))
END AS sale_q,
SUM(sale_money) [money]
FROM
sale_report
GROUP BY
sale_item, STR(DATEPART(qq, sale_date)) WITH ROLLUP
ORDER BY
GROUPING(sale_item) desc, item,
GROUPING(STR(DATEPART(qq, sale_date))) desc
item sale_q money
---- ---------- ----------------------------------------
總 總計 741505.00
A 小計 733285.00
A 1 180810.00
A 2 182819.00
A 3 184828.00
A 4 184828.00
B 小計 2382.00
B 1 180.00
B 2 455.00
B 3 735.00
B 4 1012.00
C 小計 5738.00
C 1 1398.00
C 2 1426.00
C 3 1457.00
C 4 1457.00
T 小計 100.00
T 3 100.00
(18 行受影響)
⑤ SQLServer資料庫收縮相關知識
SQL Server 資料庫採取預先分配空間的方法來建立資料庫的數據文件或者日誌文件,比如數據文件的空間分配了300MB,而實際上只佔用了20MB空間,這樣就會造成磁碟存儲空間的浪費。可以通過資料庫收縮技術對資料庫中的每個文件進行收縮,刪除已經分配但沒有使用的頁。從而節省伺服器的存儲的成本。
官方解釋:收縮數據文件通過將數據頁從文件末尾移動到更靠近文件開頭的未佔用的空間來恢復空間。在文件末尾創建足夠的可用空間後,可以取消對文件末尾的數據頁的分配並將它們返回給文件系統。
收縮後的資料庫不能小於資料庫最初創建時指定的大小。 或是上一次使用文件大小更改操作(如 DBCC SHRINKFILE)設置的顯式大小。
比如:如果資料庫最初創建時的大小為 10 MB,後來增長到 100 MB,則該資料庫最小隻能收縮到 10 MB,即使已經刪除資料庫的所有數據也是如此。
不能在備份資料庫時收縮資料庫。 反之,也不能在資料庫執行收縮操作時備份資料庫。
介紹:收縮指定資料庫中的數據文件大小。
語法格式:
參數說明:
介紹:收縮當前資料庫的指定數據或日誌文件的大小,或通過將數據從指定的文件移動到相同文件組中的其他文件來清空文件,以允許從資料庫中刪除該文件。文件大小可以收縮到比創建該文件時所指定的大小更小。這樣會將最小文件大小重置為新值。
語法格式:
參數說明:
例如,如果創建一個10MB 的文件,然後在文件仍然為空的時候將文件收縮為2 MB,默認文件大小將設置為2 MB。這只適用於永遠不會包含數據的空文件。
另附SqlServer常見問題解答
1)管理器不會主動刷新,需要手工刷新一下才能看到最新狀態(性能方面的考慮)
2)很少情況下,恢復進程被掛起了。這個時候假設你要恢復並且回到可訪問狀態,要執行:
RESTORE database dbname with recovery
這使得恢復過程能完全結束。
3)如果你要不斷恢復後面的日誌文件,的確需要使資料庫處於「正在還原狀態」,
這通常是執行下面命令:
RESTORE database dbname with norecovery
原來SQL Server對伺服器內存的使用策略是用多少內存就佔用多少內存,只用在伺服器內存不足時,才會釋放一點佔用的內存,所以SQL Server 伺服器內存往往會佔用很高。我們可以通過DBCC MemoryStatus來查看內存狀態。
SQL SERVER運行時會執行兩種緩存:
1. 數據緩存:執行個查詢語句,SQL SERVER會將相關的數據頁(SQL SERVER操作的數據都是以頁為單位的)載入到內存中來, 下一次如果再次請求此頁的數據的時候,就無需讀取磁碟了,大大提高了速度。
2.執行命令緩存:在執行存儲過程,自定函數時,SQL SERVER需要先二進制編譯再運行,編譯後的結果也會緩存起來, 再次調用時就無需再次編譯。
可以調用以下幾個DBCC管理命令來清理這些緩存:
但是,這幾個命令雖然會清除掉現有緩存,為新的緩存騰地方,但是Sql server並不會因此釋放掉已經佔用的內存。SQL SERVER並沒有提供任何命令允許我們釋放不用到的內存。因此我們只能通過動態調整SQL SERVER可用的物理內存設置來強迫它釋放內存。
解決SQLSERVER內存佔用過高的方法:
1、清除所有緩存DBCC DROPLEANBUFFERS
2、調整SQLSERVER可使用的最大伺服器內存。
在SQL管理器,右擊實例名稱
在屬性實例屬性裡面找到內存選項
把最大內存改成合適的內存,確定後內存就會被強制釋放,然後重啟實例。再看看任務管理器,內存使用率就降下來啦。
1、查看連接對象
USE master
GO
--如果要指定資料庫就把注釋去掉
SELECT * FROM sys.[sysprocesses] WHERE [spid]>50 --AND DB_NAME([dbid])='gposdb'
當前連接對象有67個其中『WINAME』的主機名,『jTDS』的進程名不屬於已知常用軟體,找到這台主機並解決連接問題。在360流量防火牆中查看有哪個軟體連接了伺服器IP,除之。
2、然後使用下面語句看一下各項指標是否正常,是否有阻塞,正常情況下搜索結果應該為空。
SELECT TOP 10
[session_id],
[request_id],
[start_time] AS '開始時間',
[status] AS '狀態',
[command] AS '命令',
dest.[text] AS 'sql語句',
DB_NAME([database_id]) AS '資料庫名',
[blocking_session_id] AS '正在阻塞其他會話的會話ID',
[wait_type] AS '等待資源類型',
[wait_time] AS '等待時間',
[wait_resource] AS '等待的資源',
[reads] AS '物理讀次數',
[writes] AS '寫次數',
[logical_reads] AS '邏輯讀次數',
[row_count] AS '返回結果行數'
FROM sys.[dm_exec_requests] AS der
CROSS APPLY
sys.[dm_exec_sql_text](der.[sql_handle]) AS dest
WHERE [session_id]>50 AND DB_NAME(der.[database_id])='gposdb'
ORDER BY [cpu_time] DESC
查看是哪些SQL語句佔用較大可以使用下面代碼
--在SSMS里選擇以文本格式顯示結果
SELECT TOP 10
dest.[text] AS 'sql語句'
FROM sys.[dm_exec_requests] AS der
CROSS APPLY
sys.[dm_exec_sql_text](der.[sql_handle]) AS dest
WHERE [session_id]>50
ORDER BY [cpu_time] DESC
3、如果SQLSERVER存在要等待的資源,那麼執行下面語句就會顯示出會話中有多少個worker在等待
SELECT TOP 10
[session_id],
[request_id],
[start_time] AS '開始時間',
[status] AS '狀態',
[command] AS '命令',
dest.[text] AS 'sql語句',
DB_NAME([database_id]) AS '資料庫名',
[blocking_session_id] AS '正在阻塞其他會話的會話ID',
der.[wait_type] AS '等待資源類型',
[wait_time] AS '等待時間',
[wait_resource] AS '等待的資源',
[dows].[waiting_tasks_count] AS '當前正在進行等待的任務數',
[reads] AS '物理讀次數',
[writes] AS '寫次數',
[logical_reads] AS '邏輯讀次數',
[row_count] AS '返回結果行數'
FROM sys.[dm_exec_requests] AS der
INNER JOIN [sys].[dm_os_wait_stats] AS dows
ON der.[wait_type]=[dows].[wait_type]
CROSS APPLY
sys.[dm_exec_sql_text](der.[sql_handle]) AS dest
WHERE [session_id]>50
ORDER BY [cpu_time] DESC;
4、查詢CPU佔用最高的SQL語句
SELECT TOP 10
total_worker_time/execution_count AS avg_cpu_cost, plan_handle,
execution_count,
(SELECT SUBSTRING(text, statement_start_offset/2 + 1,
(CASE WHEN statement_end_offset = -1
THEN LEN(CONVERT(nvarchar(max), text)) * 2
ELSE statement_end_offset
END - statement_start_offset)/2)
FROM sys.dm_exec_sql_text(sql_handle)) AS query_text
FROM sys.dm_exec_query_stats
ORDER BY [avg_cpu_cost] DESC;
5、索引缺失查詢
SELECT
DatabaseName = DB_NAME(database_id)
,[Number Indexes Missing] = count(*)
FROM sys.dm_db_missing_index_details
GROUP BY DB_NAME(database_id)
ORDER BY 2 DESC;
SELECT TOP 10
[Total Cost] = ROUND(avg_total_user_cost * avg_user_impact * (user_seeks + user_scans),0)
, avg_user_impact
, TableName = statement
, [EqualityUsage] = equality_columns
, [InequalityUsage] = inequality_columns
, [Include Cloumns] = included_columns
FROM sys.dm_db_missing_index_groups g
INNER JOIN sys.dm_db_missing_index_group_stats s
ON s.group_handle = g.index_group_handle
INNER JOIN sys.dm_db_missing_index_details d
ON d.index_handle = g.index_handle
ORDER BY [Total Cost] DESC;
找到索引缺失的表,根據查詢結果中的關鍵次逐一建立索引。
⑥ 高分懸賞:SQLServer裡面相當於Oracle中DESC的命令是什麼
現提供SQLServer查詢表結構兩條命令:
1.sp_helptable_name;
盯滾如:[sql]sp_helpStudent;
2.sp_columnstable_name;
如:[sql]sp_columnsStudent;
剛剛找到的,我先啟絕試一下。
發現可以的呀樓主,望采悄則姿納,呵呵。
1.
⑦ sqlserver排序
select top 3 ui.username,u.titles,u.[date],u.plate from BigPlate b left join littleplate l on(l.id=b.littleplateid)
left join Userblog u on(u.plate=l.id)
left join userinfo ui on(ui.id=u.id)
where b.bigplate = 'KZ極限專區' order by u.[date] desc,u.plate asc
直接加就行了瞎嫌塵吧,主排序放前者前邊,次排序放後邊,弄對磨禪順序就好