【牛客】SQL刷题篇入门篇

348 阅读6分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

目录

1.基础查询⭐

1.1基础查询🔥

查找表中的列1,列2…(SELECT 列名1,列名2…)

SELECT 列名1,列名2...
FROM 表名;

查找表中所有列(SELECT * )

SELECT * 
from 表名

1.2简单处理查询结果🔥

去重(DISTINCT)

SELECT DISTINCT(列名) 
FROM 表名

取前N个(limit)

SELECT 列名 FROM 表名
LIMIT N;

更改列名(as)

SELECT 列名 from 表名 AS 更改表名

2.条件查询⭐

2.1基础排序🔥

asc代表升序,desc代表降序,如果不写默认升序

升序(asc)

SELECT 列名
FROM 表名
ORDER BY 列名 ASC

ASC可以省略

多列升序

先按列1排序,再按列2排序

select 列名1,列名2,列名3
FROM 表名
order by
    列名1,列名2;

多列降序(desc)

select 列名1,列名2,列名3
FROM 表名
order by
    列名1 desc,列名2 desc;

2.2基础操作符🔥

列筛选=某条件

SELECT 列名1,列名2,列名3
FROM 表名
WHERE 列名2="北京大学"

列筛选>某条件

SELECT 列名1,列名2,列名3
FROM 表名
WHERE 列名2>24

列筛选不满足某条件

SELECT 列名1,列名2,列名3
FROM 表名
#where 列名2 <> '复旦大学';
#where 列名2 != '复旦大学';
where 列名2 not in ('复旦大学');

注意:要加 ' '

过滤空值

判断空值:
(1) where 列名 is null
(2) where 列名 =‘NULL’
(3) where isnull(列名)

过滤空值的三种方法:
(1) Where 列名 is not null
(2) Where 列名 != ‘null’
(3) Where 列名 <> ‘null’

2.3高级操作符🔥

与(&&、and)

where 需要同时满足两个条件时

或(||、or)

where 需要同时满足其中一个条件时

查找一串字符中的几个

方法一:模糊查找
where university like ‘%北京%’;
like表示模糊搜索,%表示不确定北京前后各有几个字
方法二:
WHERE university REGEXP “北京”

3. 高级查询⭐

3.1 计算函数🔥

取最大值(max)

max(列名)
列名会直接保留

平均值(avg)

avg(列名)

保留小数(round)

Round(列名,保留小数个数)

计数(count)

count(列名)

3.2 分组查询🔥

聚合函数筛选(having)

聚合函数作为筛选条件时,用having代替where
聚合函数:对一组值执行计算并返回一个数
例如:AVG(好几个数求一个平均值)、COUNT、MAX 、MIN、SUM…

4.多表查询⭐

4.1 子查询🔥

4.2 链接查询🔥

4.3 组合查询🔥

5.必会函数⭐

5.1 条件函数🔥

方法一:case when then

case 列

  • when v1 then r1
  • when v2 then r2
  • ……
  • else rN
  • end
# 分为两段
select 
	(case when age>=25 then '25岁及以上' else '25岁以下' end) as age_cut, 
	count(device_id) as number
from user_profile
group by age_cut

# 分为四段
select device_id,gender,
case
    when age<20 then '20岁以下'
    when age<25 then '20-24岁'
    when age>=25 then '25岁及以上'
    else '其他'
end age_cut
from user_profile;
# 写age<25,而不是age>20||age<25

方法二:IF(expr1,expr2,expr3)

如果 expr1 是TRUE,返回 expr2; 是FAULT返回 expr3。

# 分为两段
SELECT 
IF(age>=25,'25岁及以上','25岁以下') AS age_cut, 
COUNT(device_id) AS number 
FROM user_profile 
GROUP BY age_cut

# 分为四段
SELECT device_id, gender, 
IF (age <20, '20岁以下',
    IF(age >=25, '25岁以上', 
      IF(age BETWEEN 20 AND 24, '20-24岁', '其他'))) AS age_cut
FROM user_profile; 

方法三:拼接

union all拼接两个表

select '25岁以下' as age_cut,count(device_id) as number
from user_profile
where age<25 or age is null
union all
select '25岁及以上' as age_cut,count(device_id) as number
from user_profile
where age>=25;

5.2 日期函数🔥

获取年月日

DAY(date) 获取日

截取函数(substr、substring)

substr(string,start,length)
# string:要截取的字符串
# start:字符串开始,正数 - 从头开始,负数 - 从尾开始
# length:截取的长度
# 返回:字符串一部分 
substring( expression, start, length )
# expression:字符串、二进制字符串、文本、图像、列或包含列的表达式,不支持聚合函数。
# start:字符串开始
# length:截取的长度
# 返回值:如果 expression 是一种支持的字符数据类型,则返回字符数据。如果 expression 是一种支持的二进制数据类型,则返回二进制数据。

5.3 文本函数🔥

截取函数(substring_index)

substring_index(str,delim,count)
# str:要处理的字符串
# delim:分隔符
# count:正数-截取第几个分隔符之前的字符
#       负数-截取第几个分隔符之后的字符

5.4 窗口函数🔥

语法:<窗口函数> over (partition by <用于分组的列名> order by <用于排序的列名>)

<窗口函数>可以放以下两种函数:

  • 专用窗口函数,比如rank, dense_rank, row_number等
  • 聚合函数,如sum, avg, count, max, min等

窗口函数使用

# 不用group by 也能做!
# 利用相关子查询,把每个学校的最低gpa当作查询条件,去找出每个学校的gpa最低的同学。因为每个学校只有一个gpa最低的同学,
# 所以最后出来的结果不需要再用group by,用order by排序就好。看代码!!
# 在子查询中,我们利用到了主查询的表,WHERE university = u.university 这个条件使得mysql去主表得每一行进行查询,
# 比如第一行是2138的北京大学的同学,那么子查询会找出所有北京大学的同学,并且找出其中最低得gpa,如果他是最低的那个就留下,
# 不是就下一个。以此类推找出所有大学的最低gpa的同学,最后排序得最终结果。

# 直接用min输出gpa没办法和device_id进行匹配
# 所以可以先找到最小值,然后用where对应gpa在表格中查找
# SELECT
# 	device_id,
# 	university,
# 	MIN( gpa )
# FROM
# 	user_profile
# group by university
# ORDER BY university

SELECT
    device_id,
    university,
    gpa
FROM user_profile u
WHERE gpa = 
    (SELECT MIN(gpa)
     FROM user_profile
     WHERE university = u.university)
ORDER BY university

创作打卡挑战赛

赢取流量/现金/CSDN周边激励大奖