SQL學習筆記----第一天
阿新 • • 發佈:2021-01-12
通過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語句中的情況。