1. 程式人生 > >關於面試總結6-SQL經典面試題

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

前言

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

having和not in

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

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

解決辦法一: having

如果不考慮學生的課程少錄入情況(比如張三隻有2個課程,王五有3個課程)

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

如果考慮學生的課程數大於等於3的情況

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

解決辦法二:not in

可以用反向思維,先查詢出表裡面有小於80分的name,然後用not in去除掉

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

刪除

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

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

刪除除了自動編號不同, 其他都相同的學生冗餘資訊

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分的學生資訊;

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 中,可使用以下萬用字元:

萬用字元 描述
% 替代 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);