• 主页
  • 基础类
  • 应用实例
  • 新技术前沿

初学,弱弱地问存储过程最基本知识

try_okey 2004-12-25 01:05:46
比如:
USE pubs
IF EXISTS(SELECT name FROM sysobjects
WHERE name='au_info_all' AND type='P')
DROP PROCEDURE au_info_all
GO
CREATE PROCEDURE au_info_all
AS
SELECT au_lname,au_fname,title,pub_name
FROM authors a INNER JOIN titleauthor ta
ON a.au_id=ta.au_id INNER JOIN titles t
ON t.title_id=ta.title_id INNER JOIN publishers p
ON t.pub_id=p.pub_id
-----------------------
1、IF EXISTS(。。。) DROP 。。。这句什么意思?这里的SELECT 和下面的SELECT有何关系??我看不出有什么关系嘛?!
2、FROM authors a INNER JOIN titleauthor ta这句后面的“a INNER JOIN titleauthor ta”什么意思?
3、ON a.au_id=ta.au_id INNER JOIN titles t这句,“ON a.au_id=ta.au_id ”什么意思?同样地,“INNER JOIN titles t”什么意思?

...全文
65 点赞 收藏 6
写回复
6 条回复
long111 2004年12月25日
楼上的楼上说的好详细
我先收藏
回复 点赞
zhonghlning 2004年12月25日
1. IF EXISTs 是判断系统中是否有名叫au_info_all
的存储过程。如果有,则执行”DROP PROCEDURE au_info_all“语句,删除名叫au_info_all的存储过程。
2.au_lname,au_fname,title,pub_name 这四个字段在不同的表中,因此就要把不同的表连接在一起才能执行SQL语句。

3. a 和ta 是给两个表名取得临时表名。a 是他的authors 。 在你问的内容中“INNER JOIN ”是找两个表的连接点,找他们的共同点。

4.同样的意思找titles t 和publishers p的共同点,使他们在内联。
回复 点赞
yingqing 2004年12月25日
2
使用內部聯結
內部聯結 (Inner Join) 指的是被聯結資料行的數值是使用比較運算子 (Comparison Operator) 來進行比較的聯結。

在 SQL-92 標準之中,內部聯結可指定於 FROM 或 WHERE 子句中。這是 SQL-92 在 WHERE 子句中唯一支援的聯結類型。指定於 WHERE 子句中的內部聯結稱為舊式的內部聯結。

下列的 Transact-SQL 查詢是內部聯結的範例:

USE pubs
SELECT *
FROM authors AS a INNER JOIN publishers AS p
ON a.city = p.city
ORDER BY a.au_lname DESC

此內部聯結稱為等聯結 (Equi-Join)。它將傳回兩個資料表中的所有資料行,並只傳回聯結資料行中擁有相同數值的資料列。

以下為結果集:

au_id au_lname au_fname phone address city
----------- -------- -------- ------------ --------------- --------
238-95-7766 Carson Cheryl 415 548-7723 589 Darwin Ln. Berkeley
409-56-7008 Bennet Abraham 415 658-9932 6223 Bateman St. Berkeley

state zip contract pub_id pub_name city state country
----- ----- -------- ------ --------------------- -------- ----- -------
CA 94705 1 1389 Algodata Infosystems Berkeley CA USA
CA 94705 1 1389 Algodata Infosystems Berkeley CA USA

(2 row(s) affected)

在結果集之中,city 資料行將出現兩次。因為同樣的資訊重複出現並沒有什麼意義,您可藉著變更選取清單來刪除這兩個相同的資料行之一。此結果稱為自然聯結 (Natural Join)。您可以重新改寫上一個 Transact-SQL 查詢,以形成一個自然聯結,例如:例如:

USE pubs
SELECT p.pub_id, p.pub_name, p.state, a.*
FROM publishers p INNER JOIN authors a
ON p.city = a.city
ORDER BY a.au_lname ASC, a.au_fname ASC

以下為結果集:

pub_id pub_name state au_id au_lname au_fname
------ --------------- -------- ----------- -------- -------- 1389 Algodata Infosystems CA 409-56-7008 Bennet Abraham
1389 Algodata Infosystems CA 238-95-7766 Carson Cheryl

phone address city state zip contract
--------------- ------------- -------- ----- ----- ---------
415 658-9932 6223 Bateman St. Berkeley CA 94705 1
415 548-7723 589 Darwin Ln. Berkeley CA 94705 1

(2 row(s) affected)

在此範例中,publishers.city 並沒有顯示在結果之中。

使用非 Equal 運算子的聯結
您也可以聯結 (Join) 兩個資料行中不相等的數值。用於內部聯結 (Inner Join) 的相同運算子與述詞 (Predicate) 可用在不相等聯結之中。如需有關聯結中可用運算子與述詞的詳細資訊,請參閱在運算式中使用運算子 與 WHERE。

下列的 Transact-SQL 範例是大於 (>) 聯結的範例,它可找出居住州名的字母順序位於 Massachusetts (位於 New Moon Books 所在州名) 後面的 New Moon 作者。

USE pubs
SELECT p.pub_name, p.state, a.au_lname, a.au_fname, a.state
FROM publishers p INNER JOIN authors a
ON a.state > p.state
WHERE p.pub_name = 'New Moon Books'
ORDER BY au_lname ASC, au_fname ASC

以下為結果集:

pub_name state au_lname au_fname state
---------------- ------- -------------------- -------------------- -----
New Moon Books MA Blotchet-Halls Reginald OR
New Moon Books MA del Castillo Innes MI
New Moon Books MA Greene Morningstar TN
New Moon Books MA Panteley Sylvia MD
New Moon Books MA Ringer Albert UT
New Moon Books MA Ringer Anne UT

(6 row(s) affected)

使用不相等運算子的聯結
不相等聯結 (< >) 較少使用。一般來說,不相等聯結只在用於自我聯結 (Self-Join) 時才有意義。例如,下列的不相等 Transact-SQL 聯結與自我聯結,將用來找出具有兩個或多個不同價格之廉價 (少於 $15) 書籍的類別:

USE pubs
SELECT DISTINCT t1.type, t1.price
FROM titles t1 INNER JOIN titles t2
ON t1.type = t2.type
AND t1.price <> t2.price
WHERE t1.price < $15 AND t2.price < $15



附註 運算式 NOT column_name = column_name 相當於 column_name < > column_name。


此 Transact-SQL 範例可使用不相等聯結來與自我聯結合併,以找出 titleauthor 資料表中的所有資料列,在此資料表中兩個或多個資料列擁有相同的 title_id,但有不同的 au_id 編號 (也就是書籍擁有多位作者):

USE pubs
SELECT DISTINCT t1.au_id, t1.title_id
FROM titleauthor t1 INNER JOIN titleauthor t2
ON t1.title_id = t2.title_id
WHERE t1.au_id <> t2.au_id
ORDER BY t1.au_id

以下為結果集:

au_id title_id
----------- --------
213-46-8915 BU1032
267-41-2394 BU1111
267-41-2394 TC7777
409-56-7008 BU1032
427-17-2319 PC8888
472-27-2349 TC7777
672-71-3249 TC7777
722-51-5454 MC3021
724-80-9391 BU1111
724-80-9391 PS1372
756-30-7391 PS1372
846-92-7186 PC8888
899-46-2035 MC3021
899-46-2035 PS2091
998-72-3567 PS2091
回复 点赞
yingqing 2004年12月25日
IF EXISTS(SELECT name FROM sysobjects WHERE name='au_info_all' AND type='P')
DROP PROCEDURE au_info_all
判斷當前數據庫是否存在命名為'au_info_all' 的存取過程
sysobjects
包含在資料庫中建立的每一個物件 (條件約束、預設值、記錄檔、規則、預存程序等等) 的一資料列。只存在於 tempdb,這個資料表包含每一個暫時物件。

資料行名稱 資料型別 描述
name sysname 物件名稱。
Id int 物件識別碼。
xtype char(2) 物件類型。可以是這些物件類型之一:
C = CHECK 條件約束
D = DEFAULT 條件約束
F = FOREIGN KEY 條件約束
L = 記錄檔
FN = 存量函數IF = 內嵌資料表函數P = 預存程序
PK = PRIMARY KEY 條件約束 (類型為 K)
RF = 複寫篩選條件預存程序
S = 系統資料表
TF = 資料表函數TR = 觸發程序
U = 使用者資料表
UQ = UNIQUE 條件約束 (類型為 K)
V = 檢視表
X = 延伸預存程式

uid smallint 擁有者物件的使用者識別碼。
info smallint 保留。限內部使用。
status int 保留。限內部使用。
base_schema_
ver int 保留。限內部使用。
replinfo int 保留。僅用於複寫。
parent_obj int 父物件的物件識別碼 (例如,如果是觸發程序或條件約束,即為資料表的識別碼)。
crdate datetime 物件建立的日期。
ftcatid smallint 註冊為全文索引之所有使用者資料表的全文類別識別項,如果所有的使用者資料表都未註冊,值為 0。
schema_ver int 隨每次資料表的結構檢視變更而漸增的版本號碼。
stats_schema_
ver int 保留。限內部使用。
type char(2) 物件類型。它可以是下列各值之一:
C = CHECK 條件約束
D = DEFAULT 條件約束
F = FOREIGN KEY 條件約束
FN = 純量函數IF = 內嵌資料表函數K = PRIMARY KEY 或 UNIQUE 條件約束
L = 記錄檔
P = 預存程序
R = 規則
RF = 複製篩選預存程序
S = 系統資料表
TF = 資料表函數TR = 觸發程序
U = 使用者資料表
V = 檢視表
X = 延伸預存程式

userstat smallint 保留。
sysstat smallint 內部狀態資訊。
indexdel smallint 保留。
refdate datetime 保留以供未來使用。
version int 保留以供未來使用。
deltrig int 保留。
instrig int 保留。
updtrig int 保留。
seltrig int 保留。
category int 使用於發行集、條件約束與識別項。
cache smallint 保留。
存在的話就Drop掉
回复 点赞
ljian_mail 2004年12月25日
IF EXIST是判断系统表中是否存在你要写的存储过程,如果存在的话,则要删除。固定的开头。

inner join连接。你还是好好看看书吧
回复 点赞
kongguyoulan2002 2004年12月25日
1。IF EXIST是判断系统表中是否存在你要写的存储过程,如果存在的话,则要删除。固定的开头。

2。inner join是内连接。 语法是这样的。
3。on后跟表达式。连接的条件。
回复 点赞
发动态
发帖子
MS-SQL Server
创建于2007-09-28

1.4w+

社区成员

25.3w+

社区内容

MS-SQL Server相关内容讨论专区
社区公告
暂无公告