SQL多表查詢

之前做過一個(gè)關(guān)于數(shù)據(jù)庫的使用總結(jié),里面寫過一些關(guān)于數(shù)據(jù)庫的常用方法的集合,但是我們在實(shí)例工作中,很可能涉及到一需要聯(lián)立多個(gè)表格同時(shí)查詢的情況。而這些也是我們在面試過程中常常會考到的這樣一個(gè)情況,今天我就來用一個(gè)案例,來學(xué)習(xí)一下怎么使用sql的多表查詢。順便鞏固一下我們之前的sql基礎(chǔ)技術(shù)。

例題

現(xiàn)在學(xué)校需要建立一個(gè)數(shù)據(jù)庫,假設(shè)學(xué)校情況如下:一個(gè)系有若干個(gè)專業(yè),每個(gè)專業(yè)有一個(gè)班,每個(gè)班有若干個(gè)學(xué)生,現(xiàn)在需要建立關(guān)于學(xué)生,班級,系的數(shù)據(jù)庫,關(guān)系模型如下。
STUDENT (stu_id(學(xué)號),name(姓名),age(年齡),class_id(班號))
CLASS (class_id(班號),spe_name(班級名),dept_id(系號)stu_data(入學(xué)年份))
DEPARTMENT(dept_id(系號),dept_name(系名))

問題:

1.找出所有名字只有兩個(gè)字的學(xué)生,并且按照年齡的從大到小的排序
2.找出入學(xué)年份在2005年以后的學(xué)生學(xué)號,姓名,所在班級的名稱。
3.找出學(xué)生人數(shù)大于等于3的系的編號和名稱。

首先我們先要自己建立數(shù)據(jù)庫,然后向里面插入數(shù)據(jù)。

//創(chuàng)建STUDENT表
sqlite> create table STUDENT(
   ...> stu_id int not null primary key,
   ...> name varchar(20) not null,
   ...> age int not null,
   ...> class_id int not null);

//插入數(shù)據(jù)
sqlite> insert into STUDENT (stu_id,name,age,class_id)
   ...> value (1,"hao",22,11);
//創(chuàng)建CLASS表
sqlite> create table CLASS (
   ...> class_id int not null primary key,
   ...> spe_name varchar(20) not null,
   ...> dept_id int not null,
   ...> stu_data int not null);
//創(chuàng)建DEPARTMENT表
sqlite> create table DEPARTMENT (
   ...> dept_id int not null primary key,
   ...> dept_name varchar(20) not null);

最后表中結(jié)果如下


CLASS
STUDENT
DEPARTMENT

一、找出所有名字只有兩個(gè)字的學(xué)生,并且按照年齡的從大到小的排序

里面有兩個(gè)重點(diǎn),一個(gè)匹配字符,一個(gè)是倒序排序。
所以會用到 like 和 order by 兩個(gè)限定條件。

  • 通過 “ _ ” 符號,我們來限定所需要顯示的模板。“ _ ”表示一個(gè)占位符,中間可以是任意字符。
  • 通過order by實(shí)現(xiàn)對某一列的順序還是倒序,ASC順序,DESC倒序。

因?yàn)橹恍枰獙W(xué)生,所以,我們只需要一個(gè)表就好了。

sqlite> select * from STUDENT where name like "__" order by age DESC;

二、找出入學(xué)年份在2005年以后的學(xué)生學(xué)號,姓名,所在班級的名稱。

分析問題:

學(xué)號、姓名在STUDENT表里面有,而所在班級的名稱就只有CLASS里面才有,所以現(xiàn)在我們就需要從兩個(gè)表里面找東西了。

實(shí)現(xiàn)過程:
  • 從CLASS里面找到2005年之后的班級id
  • 用班級id在STUDENT里面找學(xué)生的id和姓名
sqlite> select STUDENT.stu_id,STUDENT.name,CLASS.spe_name from STUDENT,CLASS
  where CLASS.class_id=(select class_id from CLASS where stu_data>2005) 
  and CLASS.class_id=STUDENT.class_id;

注意:在關(guān)聯(lián)表查詢的時(shí)候,一定要保證兩個(gè)表中,有一項(xiàng)相同的列,并且給予相等,這樣才能保證兩個(gè)表中得到的數(shù)據(jù)對應(yīng)是一致的。

三、找出學(xué)生人數(shù)大于等于3的系的編號和名稱。

分析問題

從STUDENT里面找到人數(shù)大于3的班級id
從CLASS里面利用班級id找到系的id
從DEPARTMENT里面利用系的id找到系的名稱

select * from DEPARTMENT 
where dept_id = 
(select dept_id from CLASS where class_id = 
( select class_id from STUDENT group by class_id having COUNT(class_id)>3));
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • SQL多表查詢 多表連接示范 兩張表t_user t_judge 給兩張表設(shè)置外鍵約束查詢內(nèi)容 SQL多表查詢 多...
    Bob林閱讀 2,116評論 0 2
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,811評論 18 399
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 4,031評論 0 11
  • 堵車 路口堵車 你 寸步不讓 他 步步緊逼 滴滴的喇叭聲 給憤怒火上澆油 一張焦急的臉 搖下車窗 向后探望 左轉(zhuǎn)燈...
    伯顏817閱讀 197評論 0 0
  • 這周發(fā)生了一件讓我比較在意的事:我的某位同事小L,在看到我從公司冰箱拿出之前存放的酸奶后,走上前并說道“給我也來一...
    90000Tank閱讀 303評論 0 0

友情鏈接更多精彩內(nèi)容