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