1. 程式人生 > 其它 >SQL學習筆記----第一天

SQL學習筆記----第一天

技術標籤:sql學習sql資料庫

通過With子句檢索學生選課名字、高校歸屬城市名----目錄

前言

本節使用With子句來完成一些比較複雜的查詢功能


一、With子句

with子句一般出現在複雜的查詢中,有助於將更復雜的大型查詢分解為更簡單的查詢,增加SQL程式碼的可讀性,每一個with子句查詢可以看作一個檢視,資料暫存在記憶體中。
with子查詢不但可以在select語句中使用,而且也支援在delete、update、insert語句中,並且with子句必須在使用之前定義,定義格式為:

with 別名 as (子查詢)

定義好別名之後就可以在SQL中通過別名來引用子查詢了。首先看下這個包含子查詢的SQL:

select c.cid,c.cname from cource c where c.cid in (select e.cid from elective e where e.sid = '1001')

這條SQL的作用是查詢編號為1001學生的選課課程資訊,下面將sql改寫成with子句的形式:

with  v_elective as (select e.cid from elective e where e.sid = '1001');
select c.cid,c.cname from course c inner
join v_elective a on c.cid = a.cid

with子句查詢獲得的結果集和上面利用子查詢的結果是一樣的
在這裡插入圖片描述
也可以在with子查詢中為返回的欄位定義別名:

with v_elective(id) as (select e.cid from elective e where e.sid='1001');
select c.cid,c.cname from course c inner join v_elective a on c.cid=a.id

這條SQL是將子查詢中返回的欄位e.cid重新定義了別名為id,在主查詢中就可以使用別名id了。下面一起看下怎麼使用with子句查詢高效的歸屬城市名稱:

with v_school as (select* from school where name="暨南大學")
select b.name,a.name as city_name,a.provinceid from city a inner join v_school b on a.id=b.cityid

結果集:
在這裡插入圖片描述
下面一個例子更可以體現with子句的優勢,首先使用內聯結查詢高校個數在50以上的城市名稱:

select a.name as city_name,b.v_count from city a inner join(select cityid.count(1) as v_count from school group by cityid)b on a.id = b.cityid where v_count>50; 

在使用with子句實現同樣的查詢功能:

with v_school as (select cityid,count(1) as v_count from school group by cityid);
select a.name as city_name,b.v_count from city a inner join v_school b on a.id = b.cityid where v_count>50

結果集:
在這裡插入圖片描述
兩種方式查詢方式儘管返回結果集是一樣的,但是with子句更加簡潔,可讀性更強。

二、With後面跟多個子句

with後面可以跟著多個子句,但只能使用一個with,多個子句中間用逗號:

with course_cte as (select cid,cname from course c where credit>3),
	 student_cte as (select sid,stu_name from student s where s.age>30);
select c.cname,s.stu_name,e.grade from elective e
	   inner join course_cte c on c.cid = e.cid
	   inner join student_cte s on s.sid = e.sid;

結果集:
在這裡插入圖片描述
上面的with後面緊跟兩個子查詢,別名分別為course_cte和student_ste,這樣在主查詢中直接引用這兩個別名,看起來就會簡潔很多。

總結

提示:這裡對文章進行總結:
本次學習我們主要是使用了with子句使複雜的查詢變的更加通俗易懂,with子句就像定義了一個臨時表,可以在後面的查詢語句中使用該臨時表,避免了多張表堆積在一個SQL語句中的情況。