關於面試總結6-SQL經典面試題

前言

用一條SQL 語句查詢xuesheng表每門課都大於80 分的學生姓名,這個是面試考sql的一個很是經典的面試題面試

having和not in

查詢 xuesheng表每門課都大於80 分的學生姓名正則表達式

name kecheng score
張三 語文 81
張三 數學 73
李四 語文 86
李四 數學 90
王五 數學 89
王五 語文 88
王五 英語 96

解決辦法一: having

若是不考慮學生的課程少錄入狀況(好比張三隻有2個課程,王五有3個課程)sql

SELECT name 
FROM xuesheng 
GROUP BY name
HAVING MIN(score)> 80

若是考慮學生的課程數大於等於3的狀況spa

SELECT name 
FROM xuesheng 
GROUP BY name
HAVING MIN(score)> 80
AND COUNT(kecheng)>=3

解決辦法二:not in

能夠用反向思惟,先查詢出表裏面有小於80分的name,而後用not in去除掉code

SELECT DISTINCT name 
FROM xuesheng 
WHERE name NOT IN
	(SELECT DISTINCT name 
	FROM xuesheng 
	WHERE score <=80);

刪除

學生表xueshengbiao 以下:自動編號 學號 姓名 課程編號 課程名稱 分數blog

autoid id name kcid kcname score
1 2005001 張三 0001 數學 69
2 2005002 李四 0001 數學 89
3 2005001 張三 0001 數學 69

刪除除了自動編號不一樣, 其餘都相同的學生冗餘信息ci

DELETE t1 
FROM xueshengbiao t1, xueshengbiao t2
WHERE t1.id = t2.id
and t1.name = t2.name
and t1.kcid = t2.kcid
and t1.kcname = t2.kcname
and t1.score = t2.score
and t1.autoid < t2.autoid

若是隻是查詢出自動編號不一樣, 其餘都相同的學生冗餘信息,能夠用group by數學

SELECT * from xueshengbiao t1
WHERE t1.autoid
NOT IN
	(SELECT MIN(autoid) as autoid FROM xueshengbiao
	GROUP BY id, name, kcid, kcname, score)

模糊查詢%

表名:student ,用sql查詢出「張」姓學生中平均成績大於75分的學生信息;table

name kecheng score
張青 語文 72
張華 英語 81
王華 數學 72
張青 物理 67
李立 化學 98
張青 化學 76
select * from student
where name in 
(select name from student
where name like '張%' group by name having avg(score) > 75);

SQL 通配符

在 SQL 中,通配符與 SQL LIKE 操做符一塊兒使用。SQL 通配符用於搜索表中的數據。在 SQL 中,可以使用如下通配符:select

通配符 描述
% 替代 0 個或多個字符
_ 替代一個字符
[charlist] 字符列中的任何單一字符
[^charlist]或[!charlist] 不在字符列中的任何單一字符

**MySQL 中使用 REGEXP 或 NOT REGEXP 運算符 (或 RLIKE 和 NOT RLIKE) 來操做正則表達式 **

找出姓張和姓李的同窗, 用rlike實現匹配多個

-- 找出姓張和姓李的
select * from xuesheng
where name in 
(select name from xuesheng
where name rlike '[張李]' group by name having avg(score) > 75);

也能夠用 REGEXP,結合正則匹配

select * from xuesheng
where name in 
(select name from xuesheng
where name REGEXP '^[張李]' group by name having avg(score) > 75);

交流QQ羣:779429633

相關文章
相關標籤/搜索