单表查询
关键字的语法顺序
SELECT DISTINCT field_list
FROM table
WHERE <where_condition>
GROUP BY <group_by_list>
HAVING <having_condition>
ORDER BY <order_by_condition>
LIMIT <limit_number>
关键字的执行顺序
from # 找到表
where # 筛选
group by # 分组
having # 再筛选
select # 选择查看内容
distinct # 内容去重
order by # 内容排序
limit # 限制内容条数
补充,语法顺序和执行顺序不一致,在写sql查询语句时,先用 select * 占位,最后再将*替换为具体查询数据
where筛选条件
据根据条件,筛选出满足条件的数据,分组前使用的筛选关键字
# 查询id大于等于3小于等于6的数据
select id,name from emp where id >=3 and id <=6;
筛选条件
<1> 支持 and not or 逻辑判断
<2> 支持 > < = 等比较运算;
<3> 范围 where id between 3 and 10
<4> 支持 成员运算 in、not in 如 salary in (2000, 4000, 6000)
<5> 模糊查询 like "%"(匹配任意多个字符);"_"(匹配任意单个字符)
<6> 注意 null的字段不能使用等号匹配,必须使用 is 关键词 post_comment is null
group by分组
按照某种逻辑分类分组,然后以组为单位统计分析数据。
分组后不能使用表内普通字段作为select后的查询字段,只能使用分组字段或者使用聚合函数
<1> 如果没有设置严格模式,分组后使用非分组字段,则会返回组内第一个该字段数据
<2> 如果设置了严格模式,分组后是哟个非分组字段,则直接报错
<3> set global sql_mode = 'strict_trans_tables, only_full_group_by';
聚合函数 group function
max() min() sum() avg() count()
group_concat() 分组后使用,获取表内字段的数据,字符拼接
concat() 不分组使用
# 查询分组之后的部门名称和每个部门下所有的员工姓名和薪资
select post, group_concat(name,':',salary) from emp group by post;
补充:as可以给字段起别名,也可以直接省略不写 (推荐不省略的写法,语意清晰)
select post as '部门',max(salary) as '最高薪资'
from emp
group by post;
分组注意事项:
<1> 关键字where和group by同时出现的时候group by必须在where的后面
<2> where先对整体数据进行过滤之后再分组操作
<3> where后面的筛选条件不能使用聚合函数
<4> 如果不分组,表示默认表整体就是一组
having 筛选条件
having是分组之后的筛选,可以直接使用聚合函数
select post, avg(salary) from emp
where age>30
group by post
having avg(salary) > 10000;
distinct 去重
去重,数据必须完全一样才能去重,不要忽视主键的存在,主键或者说编号不一样不能去重。
select distinct id, age from emp; # 无法去重
select distinct age from age;
order by排序
对去重后的数据做排序,使用关键字 asc为升序;使用关键字 desc为降序。默认升序。
select * from emp order by salary; # 默认升序
select * from emp order by salary asc; # ascend
select * from emp order by salary desc; # descand
limit 限制展示条数
<1> limit后跟一个数字,表示从头开始展示的条数
<2> limit后跟两个数字,第一个参数是起始位置,第二个参数是展示的条数
select * from emp limit 3; # 只展示三条数据, 1 2 3
select * from emp limit 0,5; # 展示,1 2 3 4 5
select * from emp limit 5,5; # 展示,6 7 8 9 10
regexp正则
mysql支持正则表达式匹配数据
select * from emp where name regexp '^j.*(n|y)$';
补充关键字
# concat_ws() 多个字段拼接
concat_ws(':', name, age, sex) # 如,xliu:18:male
# exists 存在判断查询结果是否为空,只返回布尔值, True|False
返回True的时候外层查询语句执行,返回False的时候外层查询语句不再执行
select * from emp where exists
(select id from emp where id>300);

浙公网安备 33010602011771号