【牛客】SQL刷题篇入门篇

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
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浪里摸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值