单表查询

关键字的语法顺序

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> 关键字wheregroup 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);
posted @ 2020-05-06 15:04  the3times  阅读(148)  评论(0)    收藏  举报