1.題目:現在運營想要對用戶的年齡分布開展分析,在分析時想要剔除沒有獲取到年齡的用戶,請你取出所有年齡值不為空的用戶的設備ID,性別,年齡,學校的信息。
錯誤:select device_id,gender,age,university from user_profile where age!=null;
在 SQL 中,判斷?NULL
?的值需要使用?IS NULL
?或?IS NOT NULL
,而不能直接用?!= null
?來比較。NULL
?在 SQL 中表示一個未知的值,因此不能使用普通的比較運算符(如?!=
?或?=
)進行比較。
正確:
select device_id,gender,age,university from user_profile where age is not null;
select device_id,gender,age,university from user_profile where age!='';
select device_id,gender,age,university from user_profile where age<>'';
2.題目:運營想要知道復旦大學學生gpa最高值是多少,請你取出相應數據,根據輸入,你的查詢應返回以下結果,結果保留到小數點后面1位
正確:注意起別名和保留一位小數
select round(max(gpa),1) gpa from user_profile where university='復旦大學';
3.題目:現在運營想要對每個學校不同性別的用戶活躍情況和發帖數量進行分析,請分別計算出每個學校每種性別的用戶數、30天內平均活躍天數和平均發帖數量。
錯誤:select gender,university,count(gender) user_num,round(avg(active_days_within_30),1) avg_active_day,round(avg(question_cnt),1) avg_question_cnt from user_profile order by (gender,university) desc group by (gender,university) ;
group by和 order by后面不加括號,order by在group by后面
正確:
select?gender,?university,?count(gender) user_num,?round(avg(active_days_within_30), 1) avg_active_day,?round(avg(question_cnt), 1) avg_question_cnt from?user_profile group by?gender, university order by gender asc,university asc;
4.題目:現在運營想查看每個學校用戶的平均發貼和回帖情況,尋找低活躍度學校進行重點運營,請取出平均發貼數低于5的學校或平均回帖數小于20的學校。
錯誤:
select university,round(avg(question_cnt),3) avg_question_cnt,round(avg(answer_cnt),3) avg_answer_cnt from user_profile group by university having avg_question_cnt <5 or answer_cnt<20 ;
注意!!!
在 SQL 查詢中,執行的順序大致如下:
FROM
: 從哪個表或視圖獲取數據。WHERE
: 過濾數據。GROUP BY
: 按照指定的列對數據進行分組。HAVING
: 對分組后的數據進行過濾(通常用于聚合條件)。SELECT
: 從分組后的數據中選擇列。ORDER BY
: 對結果進行排序。LIMIT
: 限制返回的結果行數(如果有的話)。
所以HAVING不能使用select中的別名!
5.
運營想要了解每個學校答過題的用戶平均答題數量情況,請你取出數據。
正確:
select university,(count(question_id)/count(distinct(u.device_id))) avg_answer_cnt from user_profile u join ?question_practice_detail q on u.device_id=q.device_id group by university order by university ;
一定要加distinct!
6.題目:運營想要計算一些參加了答題的不同學校、不同難度的用戶平均答題量,請你寫SQL取出相應數據
select u.university,s.difficult_level,round(count(s.question_id)/count(distinct u.device_id),
4
) avg_answer_cnt?
from user_profile u join?
(select p.device_id,p.question_id,q.difficult_level from question_practice_detail p left join question_detail q on p.question_id=q.question_id) s?
on u.device_id=s.device_id GROUP BY u.university, s.difficult_level;
為什么需要兩個字段:
- 如果你只按?
u.university
?進行分組,你將無法區分不同難度的題目,只能得到每個學校的總答題量。 - 如果你只按?
s.difficult_level
?進行分組,你將無法區分不同學校的答題量。 - 因此,使用?兩個字段?(
university
?和?difficult_level
)來分組,是為了獲取每個學校和每個難度題目的詳細統計。
具體例子:
假設有以下數據:
- 學校 A 和學校 B 的用戶分別參與了難度為?
easy
?和?medium
?的題目。 - 如果我們只按學校分組,難度將無法區分;
- 如果只按難度分組,學校也無法區分。
因此,按學校和難度同時分組能夠準確計算每個學校和每個難度下的答題統計數據。
7.運營想要查看參加了答題的山東大學的用戶在不同難度下的平均答題題目數,請取出相應數據
報錯:Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'niuke.u.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
原因:
根據 SQL 標準,SELECT
?列表中的列要么應該包含在?GROUP BY
?子句中,要么應該使用聚合函數進行處理。
最直接的方法是修改 SQL 查詢,使得 SELECT 列表中的所有列都包含在 GROUP BY 子句中,或者使用聚合函數。
8.
UNION
:合并多個查詢的結果集,并去除重復的行。它在返回結果時會進行去重操作。UNION ALL
:合并多個查詢的結果集,但不會去除重復的行。返回結果中可能包含重復的記錄。
9.題目:現在運營想要查看用戶在某天刷題后第二天還會再來刷題的留存率。請你取出相應數據。
第一眼看,完全沒有思路!!!
select count(distinct q2.device_id,q2.date)/count(distinct q1.device_id,q1.date) as avg_ret
from question_practice_detail as q1 left join
question_practice_detail as q2
on q1.device_id = q2.device_id
and datediff(q2.date,q1.date)=1;
COUNT(DISTINCT q1.device_id, q1.date)
?計算的是,q1
?表中?不同設備和日期的組合?的數量。
10.題目:現在運營舉辦了一場比賽,收到了一些參賽申請,表數據記錄形式如下所示,現在運營想要統計每個性別的用戶分別有多少參賽者,請取出相應結果。
str
:要操作的字符串。delim
:分隔符,用來拆分字符串。count
:返回子字符串的數量。- 如果?
count
?是正數,表示從左側開始計算,返回從左到右第?count
?次出現分隔符之前的所有部分。 - 如果?
count
?是負數,表示從右側開始計算,返回從右到左第?count
?次出現分隔符之前的所有部分。
- 如果?
假設有以下字符串:'apple,banana,cherry'
我們希望提取分隔符?,
?前面的第一個部分(即?apple
)
SELECT SUBSTRING_INDEX('apple,banana,cherry', ',', 1) AS first_part;
我們希望提取分隔符?,
?后面的最后一個部分(即?cherry
)。
SELECT SUBSTRING_INDEX('apple,banana,cherry', ',', -1) AS last_part;
我們希望提取第二部分(即?banana
)。
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('apple,banana,cherry,date', ',', 2), ',', -1) AS second_part;
11.blog_url是sql中的一個字段,舉例http:/url/bisdgboy777,我怎么提取最后斜杠后的bisdgboy777?SELECT SUBSTRING_INDEX(blog_url, '/', -1) AS extracted_value
FROM your_table;
在 MySQL 示例中,SUBSTRING_INDEX
?函數用于獲取最后一個斜杠后的部分。
12.select substring_index(substring_index(profile,',',3),',',-1) as age
,count(age) as number from user_submit group by age;
為什么count(age)不正確,count(*)正確
`count(age)` 只會統計 `age` 列中非 `NULL` 的值
`count(*)` 計算的是所有行的數量,包括 `NULL` 和非 `NULL` 的值