1. 程式人生 > >數據庫子查詢經典面試題

數據庫子查詢經典面試題

分析 查詢語句 head date 子查詢 itl values tab 分享圖片

數據庫】SQL經典面試題 - 數據庫查詢 - 子查詢應用二 發布於 1 年前 作者 tommy 575 次瀏覽 最後一次編輯是 10 個月前 來自 數據庫

上節課我們通過子查詢,完成了查詢的最高分學生的需求,今天我們來學習子查詢的分類,以及通過子查詢來完成工作中經常遇到一些個性化需求。

子查詢概念:

一個SELECT語句嵌套在另一個SELECT語句中,子查詢也叫做內部查詢,而包含子查詢的語句又稱為外部查詢或主查詢,子查詢自身可以包含一個或多個子查詢,一個查詢語句中可以嵌套任意數量的子查詢

子查詢可分類:

非相關子查詢:獨立於外部查詢,子查詢只執行一次,執行完將結果傳遞給外部查詢
相關子查詢:依賴於外部查詢的數據,外部查詢每執行一次,子查詢就執行一次

面試題:

還是這道數據庫面試題
檸檬班第30期學生要畢業了,他們的成績存放在下表中,寫出以下的SQL語句

技術分享圖片

1.創建表 create table table lemon_grade (id int(10) primary key auto_increment , name varchar(20), linux float(10), mysql float(10), java float(10), grade varchar(10));

2. 插入數據insert into lemon_grade (name,linux,mysql,java,grade)

values ("劉一",80,60,70,"18期"),("陳二”,70,90,80,"18期").....;

3.修改數據 update lemon_grade set mysgl = 70 where name ="劉一";

4.刪除數據delete from lemon_grade where name =‘鄭十’;

題目一:查詢最新的一條記錄

select * from lemon_grade group by id desc limit1;

select * from lemon_grade where id= max(id);

Order by 方式:

降序排列然後得到我們最新的一條記錄,這是我們常寫的一種方式

SELECT * FROM tb_lemon_grade ORDER BY id DESC LIMIT 1;
子查詢方式:

但查詢最新一條記錄,也可以這麽去思考:查看id值最大(id是自動增長的,最新表示id值最大)的記錄,所以可以這麽去寫查詢

SELECT * FROM tb_lemon_grade WHERE id = ( SELECT max(id) FROM tb_lemon_grade);

其中子查詢SELECT max(id) FROM tb_lemon_grade查詢的是記錄表中最大的一個id,在整個查詢中,只會查詢一遍,這種就是非相關子查詢,執行完畢後,會將值傳遞給外部查詢。

題目二:查詢Linux成績高於平均分的所有同學

select * from lemon_grade where linux>(select avg(linux) from lemon_grade);

子查詢方式:
SELECT * FROM tb_lemon_grade WHERE Linux > ( SELECT avg(Linux) FROM tb_lemon_grade );

上面子查詢SELECT avg(Linux) FROM tb_lemon_grade也是非相關子查詢,語句只會執行一遍

關聯查詢方式:

這個題目我們可以使用兩個表的關聯查詢得到結果

SELECT t1.* FROM tb_lemon_grade t1,
(SELECT avg(Linux) avgLinux FROM tb_lemon_grade) t2 
where t1.Linux>t2.avgLinux;

題目三:查詢每個班級Linux成績高於本班Linux平均分的所有同學:

子查詢方式
SELECT * FROM tb_lemon_grade t1 
WHERE t1.Linux >
( 
	SELECT avg(t2.Linux) FROM tb_lemon_grade t2 
	WHERE t1.class_name = t2.class_name 
);

我們來分析下這個題目,查詢每個班級Linux成績高於本班Linux平均分的所有同學,而每個班的Linux平均分不同,所以我們采用相關子查詢,語句中的這個子查詢依賴於外部的查詢( 子查詢中的t1.class_name = t2.class_name就是外部的表),外部查詢每執行一次,子查詢就執行一次。

分組的方式寫子查詢:
SELECT * FROM tb_lemon_grade t1 
WHERE t1.Linux > 
( 
	SELECT avg(t2.Linux) FROM tb_lemon_grade t2 
	GROUP BY t2.class_name 
	HAVING t1.class_name = t2.class_name
 );
關聯查詢方式:

通過分組查詢出每個班的最高分,再與原表進行等值連接查詢,得到最後結果。

SELECT * FROM tb_lemon_grade t1, 
( 
	SELECT avg(Linux) avgLinux, class_name 
	FROM tb_lemon_grade 
	GROUP BY class_name 
) t2
 WHERE t1.class_name = t2.class_name
 AND t1.Linux>t2.avgLinux;

數據庫子查詢經典面試題