select * from 課程 where 課程編號 in
(select 課程編號 from 班級 where 學號 in
(select 學號 from 學生 where 姓名='周杰輪'))
子查詢效能較不好最好以 inner join 寫法 先將多表和為一表並關聯最後查詢一次
select 課程.* from 課程
inner join 班級 on 課程.課程編號=班級.課程編號
inner join 學生 on 學生.學號=班級.學號
where 學生.姓名='周杰輪'
反向子查詢 在in前+not即可
select * from 課程 where 課程編號 not in
(select 課程編號 from 班級 where 學號 in
(select 學號 from 學生 where 姓名='周杰輪'))
不用子查詢但同樣結果 做差集 或 EXCEPT前+NOT
select 課程.* from 課程
except
select 課程.* from 課程
inner join 班級 on 課程.課程編號=班級.課程編號
inner join 學生 on 學生.學號=班級.學號
where 學生.姓名='周杰輪
Not 效能較差會盡量避免 < 集合運算 < 直接查詢
ANSI - SQL 用在任何資料庫都可以的
sybase infoint
mysql
sqlserver t-sql
oracle pl sql
Select * from tbname
all 全部都滿足
select * from 員工 where 薪水>=all
(select 薪水 from 員工 where 城市='台北')
some 或 any (t-sql) 只要其中滿足
select * from 員工 where 薪水>=some
(select 薪水 from 員工 where 城市='台北')
select * from 員工 where 薪水>=any
(select 薪水 from 員工 where 城市='台北')
order by 子句 offset x rows
排序後空出x筆後查詢顯示
select 身份證字號,姓名,薪水
from 員工
order by 身份證字號
offset 3 rows
fetch next 只顯示
select 身份證字號,姓名,薪水
from 員工
order by 身份證字號
offset 3 rows
fetch next 2 rows only
null與資料轉換
is null 不是 = null
=' ' 空字串
函數ISNULL(欄位,函式)
ex. ISNULL(電話,'尚未填寫')
select * from 員工 where 電話 is null
select 身份證字號,姓名,ISNULL(電話,'尚未填寫'),薪水 from 員工
生日時間型態資料餵尚未填寫字串
資料轉換
CAST (值 AS 資料型態)
select 學號,姓名, isnull(cast(生日 as varchar),'尚未填寫') from 學生
select cast(生日 as varchar) from 學生
select cast(100 as varchar)
CONVERT 萬用轉型
CONVERT ( 資料型態 , 值 , 格式代號 )
select convert(varchar,生日,20) from 學生
select 學號,姓名, isnull(convert(varchar,生日,20),'尚未填寫') from 學生
CTE查詢
ex.此人同時是員工也是教授
bl遞迴方式查詢
通常會合併表
暫存表 with
with 有名字的教授表
as
(select 教授.*, 員工.姓名
from 員工 inner join 教授
on 員工.身份證字號=教授.身份證字號)
select *
from 班級
inner join 學生 on 班級.學號=學生.學號
inner join 課程 on 課程.課程編號=班級.課程編號
inner join 有名字的教授表 on 有名字的教授表.教授編號=班級.教授編號
--------
遞迴錨點
類似自身合併查詢
AS內為CTE內容
with 主管2
as
(
select 員工字號,姓名, 1 as 階層 from 主管 where 主管字號 is null
union all
select 主管.員工字號,主管.姓名, 階層+1 from 主管 inner join 主管2 on 主管.主管字號=主管2.員工字號
)
select * from 主管2
order by 階層