Mysql基础入门(一)select语句

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 by1,列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

where1>10 and2 in ('A','B')
where1>10 or2 in ('A','B')

where1>10 and2 in ('A','B') or3=2
where1>10 and (2 in ('A','B') or3=2)
;

容易出错的点:

where1>10 
and2 in ('A','B') 
or3=2

表示同时满足列1和列2条件,或满足列3,若想要的逻辑为满足列1的同时,满足列2或列3,则需加括号():

where1>10 
and (2 in ('A','B') or3=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 by1,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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值