文章目录
1.完整语法
先给一下完整的语法,后面将逐一来讲解。
- 基础语法:select 字段列表 from 数据源
- 完整语法:
select 去重选项 字段列表 [as 字段别名] from 数据源
[where子句]
[group by 子句]
[having子句]
[order by 子句]
[limit子句];
- 具体用法:
SELECT * FROM xx表
语句一
语句二
……
;
<注意:最后结尾;
一定要加!>
例如,dataanalyst_sql表有positionId, city, companyId等变量,SELECT * FROM data.dataanalyst_sql
表示加载所有字段数据,SELECT city FROM data.dataanalyst_sql
表示仅显示city列数据
2.字段另取名(as语句)
语法:select 字段 as 新名字 from 表名;
★★★ 注意的一点是,新名字
别名不可以在select函数中调用,只能在select函数外使用,例如在while或者having语句中调用
示例:
select * from student;
select name as "姓名",gender as "性别" from student;
!!!特别地,别名不可以在select函数中调用:
select girl_number as girl, number as total ,
select girl/number as "porpotion" (这里会出错)
from student;
3.去重
语法:select all/distinct 列名 from 表名;
all:不去重
distinct:去重
样例:
创建具有三个重复值的列表student
create table student(name varchar(15),gender varchar(15));
insert into student(name,gender) values("lilei","male");
insert into student(name,gender) values("lilei","male");
进行去重
select * from student;
select distinct * from student;
结果如下所示
4.排序(order by语句)
语法:
select 列名or* from 表名
order by 列1,列2.. asc/desc
;
先按列1排,再按列2…
asc代表排序递增的
desc代表是递减的
如果想要先列1递增,再列2递减需要这样写
order by 列1 asc,列2 desc
5.筛选(where语句)
语法:
select 列名or* from 表名
where 列名=''xx''
where 列名!=''xx''
where 列名 in ('A','B')
where 列名 not in ('A','B')
where 列名 >10
where 列名 >=10
where 列名 between 10 and 20
where 列1>10 and 列2 in ('A','B')
where 列1>10 or 列2 in ('A','B')
where 列1>10 and 列2 in ('A','B') or 列3=2
where 列1>10 and (列2 in ('A','B') or 列3=2)
;
容易出错的点:
where
列1>10
and 列2 in ('A','B')
or 列3=2
表示同时满足列1和列2条件,或满足列3,若想要的逻辑为满足列1的同时,满足列2或列3,则需加括号():
where
列1>10
and (列2 in ('A','B') or 列3=2)
where几种语法:
基于值:
= : where 字段 =值 ;查找出对应字段等于对应值的记录。(相似的,<是小于对应值,<=是小于等于对应值,>是大于对应值,>=是大于等于对应值,!=是不等于),例如:where name = 'lilei'
like:where 字段 like 值 ;功能与 = 相似 ,但可以使用模糊匹配来查找结果。例如:where name like 'li%'
基于值的范围:
in: where 字段 in 范围;查找出对应字段的值在所指定范围的记录。例如:where age in (18,19,20)
not in : where 字段 not in 范围;查找出对应字段的值不在所指定范围的记录。例如:where age not in (18,19,20)
between x and y :where 字段 between x and y;查找出对应字段的值在闭区间[x,y]范围的记录。例如:where age between 18 and 20。
条件复合:
or : where 条件1 or 条件2… ; 查找出符合条件1或符合条件2的记录。
and: where 条件1 and 条件2… ; 查找出符合条件1并且符合条件2的记录。
not : where not 条件1 ;查找出不符合条件的所有记录。
&&的功能与and相同;||与or功能类似,!与not 功能类似。
6.分组(group by语句)
基础语法:
select 列名or* from 表名
group by 列1,列2...
;
得到的表为先按照列1进行分组,列1名相同的分为一组,依次靠着展示(但mysql上仅显示一个代表行),若列1中有列2相同的数据,则再按列2进行分组排序展示
示例:
SELECT city,count(positionId),count(distinct companyId) FROM data.dataanalyst_sql
group by city
;
上述代码是按城市进行分组,研究各城市职位招聘总数以及公司招聘总数,而一家公司可能招募多个岗位,count(distinct companyId)
是做了去重处理,得到结果如下:
- 实际上,group by 的作用主要是统计(使用情景很多,比如说统计某人的总分数,学生中女性的数量),所以一般会配合一些统计函数来使用:
count(x):统计每组的记录数
count(*)和count(1)计数时空值也算进去,count(列名)不算空值
max(x):统计最大值,x是字段名
min(x):统计最小值,x是字段名
avg(x):统计平均值,x是字段名
sum(x):统计总和,x是字段名
- group by 字段 后面还可以跟上asc或desc,代表分组后是否根据字段排序。
解决group by 出错的问题:
在my.ini中的[mysql]和[mysqld]中都加入:
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
然后重启mysql
7.group by中筛选(having语句)
基础语法:
select 列名or* from 表名
group by 列名
having 条件
;
having
的用法和where
一样
示例:
SELECT city,count(1) FROM data.dataanalyst_sql
where industryField like ''%电子商务''
group by city
having count(positionId)>=50
;
以上代码表示先从行业中选取有电子商务字段的行业where industryField like '%电子商务'
(模糊匹配),接着按城市分组,然后筛选出职位数大于等于50的行,结果如下:
8.综合练习
SELECT city,
count(1) as total,
count(if(industryField like ''%电子商务%'',industryField,null)) as emarket,
count(if(industryField like ''%电子商务%'',industryField,null))/count(1) as '比例'
FROM data.dataanalyst_sql
group by city
having emarket>=10
order by emarket
;
-
结果展示的第一列
city
是按city分组后的城市字段,total
是指城市下的总岗位数量(一行有代表一个职位,所以对不同城市下的行计数表示总的岗位数),emarket
是指包含电子商务领域岗位数(类似金融、互联网这样的算领域),比例
是指电子商务岗位占了总岗位的比例。 -
接下去对电子商务岗划分,仅计算电子商务岗大于10的数量,并按照电子商务岗位数从小到大排序。
-
★★★ 注意的一点是,
比例
不可以写成SELECT emarket/total as '比例
,别名只能在select函数外使用,例如在while或者having语句中调用
文章参考:https://www.cnblogs.com/progor/p/8786133.html