--集合運算set
--聯集union
select 姓名 from 員工
union
select 姓名 from 學生
--交集intersect
select 姓名 from 員工
intersect
select 姓名 from 學生
--差集except
select 姓名 from 員工
except
select 姓名 from 學生
select 姓名 from 學生
except
select 姓名 from 員工
-------------------------------
select 姓名 from 員工
union all
select 姓名 from 學生
--------------------------------
--語法注意:欄位數目一樣,欄位資料型態一樣
select 身份證字號,姓名 from 員工
union
select 姓名,性別 from 學生
子查詢
(同一個查詢) ex.班級表裡面張無忌選了哪幾門課但只有他的學號(在另外一張表內)
資料筆數大時合併查詢效能比子查詢好
1.合併查詢(join別張資料表進來且關聯後下條件)
2.子查詢(先用以知資料查詢到查詢資料,再用查詢資料查詢)
select * from 班級 where 學號=(select 學號 from 學生 where 學生.姓名='張無忌')
select *
from 員工
where 薪水>=50000
--找哪些員工的薪水>=平均薪資
select *
from 員工
where 薪水>=(select avg(薪水) from 員工)
竭盡可能的去想出一段sql去看能否拉出資料,再來才重複驗證是否正確
合併查詢 效能 > 子查詢 >= 集合運算
取別名就像取id,可用於完全表達法
自身取別名合併 (卡式基扣掉自己)
原因自身表欄位無法跟自身運算去比較
on 看成 where 的條件
--利用合併查詢寫法
select a.身份證字號,a.姓名,a.薪水
from 員工 as a inner join 員工 as b
on a.身份證字號!=b.身份證字號
group by a.身份證字號,a.姓名,a.薪水
having a.薪水>=avg(b.薪水)
select a.身份證字號,a.姓名,a.薪水
from 員工 as a cross join 員工 as b
where a.身份證字號!=b.身份證字號
group by a.身份證字號,a.姓名,a.薪水
having a.薪水>=avg(b.薪水)
select a.身份證字號,a.姓名,a.薪水
from 員工 as a , 員工 as b
where a.身份證字號!=b.身份證字號
group by a.身份證字號,a.姓名,a.薪水
having a.薪水>=avg(b.薪水)
SelectCommand="SELECT * FROM [Members]"
SelectCommand="SELECT account,pswd, [name], birthday,email, gender, edu.EduLevel,notes
FROM [Members] inner join Edu on Members.EduLevel=edu.EduLevel_Code