一般来说SQL主要是指SQL查询语言,mysql主要是数据库。
检索数据简单应用
SELECT * FROM 数据库.表名
- 表示通配符,匹配表中所有字段。
# 搜索某一个字段
SELECT city FROM 数据库.表名;
# 搜索某两个个字段
SELECT city,name FROM 数据库.表名;
# 限制搜索一百条数据
SELECT city,name FROM 数据库.表名
limit 100;
这里的分号在图形操作界面可以删掉,在命令行操作一定要带上。
排序用 order by
一般用数字字段来
# 升序排列
SELECT city,name FROM 数据库.表名
order by id;
# 降序排列
SELECT city,name FROM 数据库.表名
order by id desc
limit 100;
过滤用 where
SELECT city,name FROM 数据库.表名
where name = '杭州;
SELECT * FROM 数据库.表名
where id > 100;
SELECT * FROM 数据库.表名
where id between 100 and 200;
SELECT * FROM 数据库.表名
where city in ('上海','长沙');
SELECT * FROM 数据库.表名
where city not in ('上海','长沙');
SELECT * FROM 数据库.表名
where city != '上海';
SELECT * FROM 数据库.表名
where city <> '上海';
and or
通常的场景是筛选条件很多。
筛选出城市是上海,学历为本科或者工作经验为1-3年的。
SELECT * FROM 数据库.表名
where city = '上海';
and education = '本科'
or workyear = '1-3年'
这样执行得不到我们想要的结果的,因为在SQL中and优先执行。
那么上面的代码解释起来就是:满足城市是上海和学历是本科或者工作年限为1-3年。也就是下面的代码:
SELECT * FROM 数据库.表名
where (city = '上海';
and education = '本科')
or workyear = '1-3年'
我们的需求应该这样写:
SELECT * FROM 数据库.表名
where city = '上海';
and (education = '本科'
or workyear = '1-3年')
一旦遇到复杂的逻辑一定要加上括号,最里面的括号优先级最高。
模糊查找
# 包含后端
SELECT * FROM 数据库.表名
where secondtype like '%后端%'
# 以后端开头
SELECT * FROM 数据库.表名
where secondtype like '后端%'
# 以后端结尾
SELECT * FROM 数据库.表名
where secondtype like '%后端'
分组
按照城市分组
SELECT * FROM 数据库.表名
group by city
严格一点的写法,选择城市,不能用 * 号。
SELECT city FROM 数据库.表名
group by city
有一个需求这样:想知道不同城市下招聘的数量,就可以对城市进行分组,对职位进行计数:
SELECT city count(positionID) FROM 数据库.表名
group by city
又有需求啦:想知道城市中招聘数量在一百以上的数据,招聘岗位少的我希望把它过滤掉。这时候就是对分组 group by 提出了一个过滤 where 的挑战。
在 SQL 中这种语法叫做 having 可以把它等价于 where 只是这个 having 只是单纯针对分组之后的结果进行过滤。
实现起来就是这样的:
SELECT city,count(1) FROM 数据库.表名
group by city
having count(positionID) >= 100
还可以在过滤的基础上分组:
SELECT city,count(1) FROM 数据库.表名
where industryField like %电子商务%
group by city
having count(positionID) >= 50
等价于:
SELECT city,count(1) FROM 数据库.表名
group by city
having count(if(where industryField like %电子商务%,1,null)) >= 50
如果满足条件就为 1 计数,否则为 null 不计数。
把薪资过滤出来,提取最小薪资最大薪资。
select
left(salary,location('k',salary)-1),
salary
from 表
substr(salary,locate('-',salary)+1,length(salary)-locate('-',salary)-1)
#从中间截取字段,从哪里开始,到哪里结束
from 表
利用子查询:
select
case
when(bottom + top)/2 <= 10 then '0-10'
when(bottom + top)/2 <= 20 then '10-20'
when(bottom + top)/2 <= 30 then '20-30'
else '30+'
end,
salary from(
select
left(salary,location('k',salary)-1) as bottem,
substr(salary,locate('-',salary)+1,length(salary)-locate('-',salary)-1) as top,
salary
from 表 ) as t