關於SQL子查詢中列優先的問題

2022-02-13 11:22:48 字數 4433 閱讀 7896

經常用sql ,有一些小的問題平時不注意也不會發現,下面這個問題是以前碰到過的,覺得有點意思,所以記錄在此。

--創始乙個班級表

,主鍵是

cid,

該主鍵被

student

表引用為外來鍵約束

create

table class( cid int

identity

, cno varchar(8),cname varchar(10)

constraint

[pk_class] primary

keynonclustered

( cid asc

)on [primary],

constraint

[ix_class_cno] unique

nonclustered

( [cno] asc

) )

on [primary]

--建立乙個學生表

,其主鍵為

sno,

外來鍵為cid,

引用了class

表中的cid

--注意:student

中有乙個

cno欄位

,class

表中也有乙個

cno欄位

create

table student( cid int

, sno varchar(8),sname varchar(10),cno varchar(8)

constraint

[pk_sno] primary

keyclustered

( sno asc

)on [primary] )

on [primary]

go--

加入外來鍵引用

alter

table student with

nocheck

addconstraint [fk_student_cid] foreign

key([cid])

references

class(cid)

表之間的關係如下圖

--插入班級測試資料

insert

into class(cno,cname)

select

'0001','

班級'union

select

'0002','

班級'union

select

'0003','

班級'union

select

'0004','

班級'union

select

'0005','

班級'---

插入學生測試資料

insert

into student(cid,sno,sname,cno)

select

1,'s0001','

學生','s0001'

union

select

1,'s0002','

學生','s0001'

union

select

1,'s0003','

學生','s0001'

union

select

2,'s0004','

學生','s0002'

union

select

2,'s0005','

學生','s0002'

union

select

2,'s0006','

學生','s0002'

union

select

3,'s0007','

學生','s0003'

union

select

3,'s0008','

學生','s0003'

union

select

3,'s0009','

學生','s0003'

union

select

4,'s0010','

學生','s0004'

union

select

4,'s0011','

學生','s0004'

union

select

4,'s0012','

學生','s0004'

union

select

5,'s0013','

學生','s0005'

union

select

5,'s0014','

學生','s0005'

union

select

5,'s0015','

學生','s0005'

go--

檢視兩個表中的所有資料

select

*from class

select

*from student

--這是乙個內連線的測試

select

*from dbo.class inner

join dbo.student on dbo.class.cid = dbo.student.cid

--這是乙個普通的子查詢

,結果是屬於班級的所有學生

select

*from dbo.student where cid in

(select cid from dbo.class where cname ='班級

')--這是乙個普通的子查詢

,結果是班級的學生

,並且姓名是'學生

' select

*from dbo.student where cid in

(select cid from dbo.class where cname ='班級

')andsname ='學生

' --現在將要查詢的姓名放在子查詢中

,查詢可以成功嗎?注意

class

表中並沒有

sname

字段 select

*from dbo.student where cid in

(select cid from dbo.class

where

cname ='班級

'and sname ='學生

')--

現在更換乙個查詢的方式,注意

class

與student

表中都有

cno欄位

,但只有

student

表中有sname

字段 select

*from dbo.student where cid in

(select cid from dbo.class

where

cno =

'0001'

and sname ='學生

')--

結果可以看到上面兩個查詢都成功了

,這裡的

cno被自動解釋為

class

表的cno,

而sname

又被解釋為

student

表中的sname

這裡是兩個查詢的執行計畫情況:

--看到這裡是否覺得有些奇怪

,因為子查詢中可以引用父查詢中的字段

,但是當子查詢與父查詢中具有相同欄位時

, --

子查詢對同名的子段具有優先權

--如果要引用的是父查詢中的

cno,

應該直接指定

,如下面:

select

*from dbo.student where cid in

(select cid from dbo.class

where

student.cno =

'0001'

and sname ='學生

')go

--以下語句會返回錯誤

,指出列名

'cno'

不明確,

因為直譯器無法判斷你的查詢要採用哪個表的

cno欄位

select

*from dbo.class inner

join dbo.student on dbo.class.cid = dbo.student.cid

where

cno=

'0001'

go drop

table student

drop

table class

關於動態sql的子查詢

工作中遇到了乙個查詢需求,想查出來的資料結構是這樣的 list selectstudentinfo student的結構是這樣的 public class student public class report 可以用以下動態sql完成 studentmap type student id prop...

關於多行子查詢中的空值問題,not null

在操作表查詢時,發現乙個問題,進行子查詢時使用not in的查詢結果不存在 如下的操作 查詢不是老闆的員工 select from emp where empno not in select mager from emp 這條語句執行的結果為空,但是從資料上來看並不會為空,看來還是語法的錯誤,查詢了...

關於子查詢中的order by子句

關於子查詢中能否用order by子句,有以下兩種情況 第一種例如 select a.col1 from a where a.col2 in select b.col2 from b order by b.col1 這種情況下子查詢只是乙個集合,並不需要進行order by。第二種例如 select...