跳转至

SQL 刷题

记录遇到的SQL题,夯实使用数据库的技能。

596. 超过 5 名学生的课

image-20221009234735660

SQL
SELECT
    class
FROM
    courses
GROUP BY class
HAVING COUNT(DISTINCT student) >= 5
  • 关键:GROUP BY之后再HAVING COUNT()HAVING相当于做了一次筛选。

1873. 计算特殊奖金

image-20221010170922698

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. 修复表中的名字

image-20221011235906143

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. 按日期分组销售产品

image-20221013164603223

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 ';'

评论