經常用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...