1. 程式人生 > 實用技巧 >SQL 查詢(進階)

SQL 查詢(進階)

SQL 查詢(進階)

單表查詢

-- 1.查詢有直接先行課的課程的課號,課名和先行課號。
select 課程號,課程名,先行課號
from kc
where 先行課號 is not null

where 語句用於對查詢前的篩選條件,本例中通過where語句,查詢結果只有先行課號非空的元組。

巢狀查詢

巢狀查詢思路很直接: 一步步求,碰見直接無法得到的資料,就遞迴地一層層求解出來。缺點是查詢資料過多時,多表聯合查詢比巢狀查詢速度快很多。

巢狀select語句也叫子查詢,一個 select 語句的查詢結果能夠作為另一個語句的輸入值。子查詢不但能夠出現在where子句中,也能夠出現在from子句中

,作為一個臨時表使用,也能夠出現在select list中,作為一個欄位值來返回。

  • 單行子查詢

單行子查詢是指子查詢的返回結果只有一行資料

當主查詢語句的條件語句中引用單行子查詢結果時可用單行比較符號來進行比較

單行比較符號

=  !=
>  >=
<  <=

例如

select ename,deptno,sal
from emp
where deptno=(select deptno from dept where loc='NEW YORK')
  • 多行子查詢

多行子查詢即是子查詢的返回結果是多行資料(組成的表)

當主查詢語句的條件語句中引用多行子查詢結果時必須用多行比較符號來進行比較

多行比較符號

in
all
any

例如

  • in

查詢所有部門編號為A的資料:

select ename,job,sal
from emp
where deptno in (
    		select deptno  -- 查詢部門A的所有資料號碼
    		from dept
    		where dname like 'A%'
		)
  • all

查詢有一門以上的成績高於Kaka的最高成績的學生的名字

select stName
from Student
where stId in(
             select distinct stId 
    	     from score 
    	     where score > all(
                 	      select score -- 高於Kaka的所有成績,就高於最高成績
                 	      from score 
                 	      where stId = (
                                           select stId 
                                  	   from Student 
                                  	   where stName = 'Kaka'
                              		   )
             		      )
	     )
  • any

查詢有一門以上的成績高於Kaka的任何一門成績的學生的名字

select stName
from student
where stId in(
	     select distinct stId
	     from score
	     where score > any (
			       select score
	                       from score
		               where stId = (
			                    select stId
		                            from student
			 		    where stName = 'Kaka'
		          	            )
			       )
    	     )

級聯查詢

級聯查詢包含

inner join -- 根據連線條件(on) 可以分成等值連線和不等值連線
left join -- 左外連線,返回左表中的所有行,如果左表中行在右表中沒有匹配行,則結果中右表中的列返回空值
right join -- 右外連線,返回右表中的所有行,如果右表中行在左表中沒有匹配行,則結果中左表中的列返回空值
full join -- 全外連線,返回兩個表中的所有行,如果存在某一個行不能匹配,則為空值
cross join -- 笛卡爾積