交叉連接查詢
這種查詢方式基本不會使用,原因就是這種查詢方式得到的是兩個表的乘積(笛卡兒集)
語法就是select * from a,b;
內連接查詢,可以有效的去除笛卡爾集現象
內連接查詢分為兩類:
隱式內連接 select * from A,B where 條件
隱式連接使用別名:select * from A 別名1,B 別名2 where 別名1.xx=別名2.xx;
顯示內連接 select * from A inner join B on 條件 (inner可以省略)
顯示連接使用別名: select * from A 別名1 inner join B 別名2 on 別名1.xx=別名2.xx
舉例:
SELECT * FROM category c,product p WHERE c.cid=p.category_id;
外連接
外連接有兩種方式,一種是左外連接,一種是右外連接
左外連接:select * from A left outer join B on條件
右外連接:select * from A right out join B on 條件
左外連接就是左邊的表的內容全部顯示,然後匹配右邊的表,如果右邊的表匹配不到,則空
右外連接就是右邊的表的內容全部顯示,然後匹配左邊的表,如果左邊的表匹配不到,則空
總結:
內連接就是兩個表的交集
左外連接就是左邊表加兩表交集
右外連接就是右邊表加兩表交集
子查詢
子查詢就是查詢中還有查詢,就是一條select語句結果作為另外一條select語法的一部分(查詢結果,查詢條件,表等)
子查詢的用處很多比如:查詢本公司工資最高的員工的詳細信息
select * from emp where sal=max(sal)這個是錯誤的,原因是聚合函數不可以用在條件中,要想解決這個問題,只能用子查詢
select* from emp where sal=(select max(sal)from emp)
exists關鍵字
select * from emp where exists(select max(sal) from emp)
這句話的意思是隻要(select max(sal) from emp)有結果則執行select * from emp,否則不執行
子查詢出現在where後是作為條件出現的
子查詢出現在from之後是作為表存在的
作為表舉例 select e.emono,e.ename from(select * from where deptno=30) e
還給表起了一個別名e
作為條件有以下幾種情況
單行單列:可以使用=,>,=,<=,!=
多行單列(集合)可以用All ANY IN not IN
單行多列(對象),就是一行,像一個對象一樣什麼屬性都有
多行多列:多行多列一直用在from後面作為表
單行單列舉例:select * from emp where sal >(select avg(sal) from emp)
多行多列舉例:select * from emp where sal> All(select sal from emp where deptno=10)
單行多列舉例:select * from emp where(job,deptno,sal)IN(select job,deptno,sal from emp where ename='殷天正');(查詢和殷天正一樣工作,工號,工資的人的工作,工號,工資從emp表中)
閱讀更多 幻風的編程日記 的文章