2011-07-26 39 views
2

考慮到2以下查詢:SELECT查詢中常量的含義是什麼?

1)

USE AdventureWorks 
GO 
SELECT a.ProductID, a.ListPrice 
FROM Production.Product a 
WHERE EXISTS (SELECT 1 FROM Sales.SalesOrderDetail b 
      WHERE b.ProductID = a.ProductID) 

2)

USE AdventureWorks 
GO 
SELECT a.ProductID, a.Name, b.SalesOrderID 
FROM Production.Product a LEFT OUTER JOIN Sales.SalesOrderDetail b 
ON a.ProductID = b.ProductID 
ORDER BY 1 

我唯一的問題是知道什麼是數這些查詢的含義是什麼?如果我將它們更改爲2或其他內容,那麼如何?

感謝您的幫助

+3

你試過了嗎?你有沒有注意到一種模式? –

回答

7

在第一種情況下並不重要;你可以選擇一個2或者其他任何東西,因爲它是一個存在查詢。一般情況下,除了存在查詢之外,還可以將其他常量用於選擇常量(它只是將常量放入結果集的列中),但存在查詢是最有可能遇到常量的地方。

例如,給定一個表稱爲含person三列,idfirstnamelastname,並birthdate,你可以寫這樣的查詢:

select firstname, 'YAY' 
from person 
where month(birthdate) = 6; 

,這將返回類似

name  'YAY' 
--------------- 
Ani  YAY 
Sipho  YAY 
Hiro  YAY 

這沒有用,但它是可能的。這個想法是在select語句中選擇表達式,它不僅可以是列名,也可以是常量和函數調用。更可能的情況是:

select lastname||','||firstname, year(birthday) 
from person; 

這裏||是字符串連接運算符,並且year是我編了一個功能。

你有時看到1存在查詢的原因是這樣的。假設你只想知道是否有名字以'H'開頭的人,但你並不關心這個人是誰。你可以說

select id 
from person 
where lastname like 'H%'; 

但由於我們不需要ID,你也可以說

select 1 
from person 
where lastname like 'H%'; 

,因爲所有你關心的是你是否沒有得到一個非空的結果集或不。

在第二種情況下,1是列號;這意味着您希望您的結果按第一列中的值排序。將其更改爲2將按第二列排序。

順便說一句,選擇常量的另一個地方是當您從關係數據庫轉儲到將在類似NOSQL系統中處理的高度非規範化CSV文件時。

+0

對不起,我不明白你對第一次使用1所說的話。第二次,我明白了。 – Richard77

+0

對不起,我將在一個編輯中展開。 –

0

順便說一句,使用像1這樣的常量代替使用實際列的原因是避免實際獲取列值的I/O。這可能會提高性能。

1

在第二種情況下,1根本不是字面意思。相反,它是一個序號,表示結果集應該按照它的第一列進行排序。如果將1更改爲4,則查詢將失敗並顯示錯誤,因爲結果集只有三列。