SQL 刷题¶
记录遇到的SQL
题,夯实使用数据库的技能。
596. 超过 5 名学生的课¶
- 关键:
GROUP BY
之后再HAVING COUNT()
,HAVING
相当于做了一次筛选。
1873. 计算特殊奖金¶
SQL
select
employee_id,
if(employee_id % 2 != 0 and left(name,1) != 'M',salary,0) as bonus
from Employees
order by employee_id
-
取模运算用
MOD(a, b)
,或者a % b
。 -
判断字符串是否以'M'开头用
LIKE 'M%'
。 -
注意是
LIKE
,而不是=
。 -
IF(expr,v1,v2)
其中:表达式 expr
得到不同的结果,当 expr
为真是返回 v1
的值,否则返回 v2
。
1667. 修复表中的名字¶
SQL
select
user_id,
concat(upper(SUBSTRING(name,1,1)), lower(SUBSTRING(name,2,length(name)))) AS name
from Users
ORDER BY
user_id
UPPER(str)
与LOWER(str)
-
UPPER(str)
将字符串中所有字符转为大写 -
LOWER(str)
将字符串中所有字符转为小写 -
SUBSTRING(str, begin, end)
截取字符串。 end
不写默认为空,则截取到最后一个字符。-
SUBSTRING(name, 2)
从第二个截取到末尾,注意并不是下标,就是第二个。即SUBSTRING(abcd, 2)
的结果是bcd
。 -
CONCAT()
函数可以将多个字符串拼接在一起。
1484. 按日期分组销售产品¶
SQL
SELECT
sell_date,
COUNT(DISTINCT product) AS num_sold,
GROUP_CONCAT(DISTINCT product
ORDER BY product
SEPARATOR ',') AS products
FROM
Activities
GROUP BY
sell_date
ORDER BY
sell_date
COUNT(DISTINCT product)
:唯一值计数group_concat()
函数,顾名思义与 group by 有关,功能:将 group by 产生的同一个分组中的值连接起来,返回一个字符串结果。Distinct
:去除重复值。Order By
:组内的字符串按照什么排序。可以加DESC
用于降序。Separator
:默认情况下,组的值由,
运算符分隔。如果想把分隔符改成;
,可以使用SEPARATOR ';'
。