MySQL查询
目录
MySQL查询
查询语法及顺序
select 查询列表 ⑦
from 表1 别名 ①
连接类型 join 表2 ②
on 连接条件 ③
where 筛选 ④
group by 分组列表 ⑤
having 筛选 ⑥
order by排序列表 ⑧
limit 起始条目索引,条目数; ⑨
关键字顺序:
select
-->显示列from
--> 查询的表\<left, right\> join .... on ....
--> 左外右外链接where
--> 查询条件group by
--> 分组查询having
--> 筛选order by
--> 排序(asc desc)limit
--> 分页查询
基础查询
查询表中所有数据
select * from 表名;
显示指定列
select 列名1, 列名2... from 表名;
去重查询
distinct
关键字, 下面查询是对列名1进行去重
select distinct 列名1,列名2 from 表明;
条件查询(where)
操作符 | 描述 |
---|---|
= | 等于 |
<> 和 != | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
between... and ... | 在某个范围之间 |
like | 模糊查询(% 代表任意数量字符, _ 代表一个字符) |
and | 与 |
or | 或 |
查询范围(between)
between x and y
在x和y之间 包括x和y
查询id在5~9之间的内容
select * from 表 where id between 5 and 9;
模糊查询(like)
查询第二个字是 '雷' 的name;
select * fron 表 where name like '_雷%';
查询包含 '雷' 字的name;
select * from 表 where name like '%雷%';
null处理 ifnull()函数
ifnull(列, 替换值)
: 如果指定的列为null, 则使用替换值
多表查询(... join... on...)
等值连接
select * from A,B
where A.x=B.x and A.age=18
内连接 用的更多
select * from A join B
on A.x=B.x
where A.age=18;
左外查询 (常用)
left join 表 on 表关系
格式:
select * from 表1 left join 表2 on 表1和表2的关系
左外查询案例:
select * from dept left join emp
on emp.dept_id=dept.id; -- 左外连接查询
右外查询
right join 表 on 表关系
格式和案例和左外连接基本类似
左外查询的时候, from后面的表是主表, 数据会完全展示, join后面的表只有和主表有关系的才会展示, 右外查询反之.
多行查询
注意:
- 多行函数和是否分组有关,如果查询结果中的数据没有经过分组,默认整个查询结果是一个组,多行函数就会默认统计当前这一个组的数据。产生的结果只有一个。
- 如果查询结果中的数据经过分组(分的组不止一个),多行函数会根据分的组进行统计,有多少个组,就会统计出多少个结果。
多行函数:
多行函数 | 说明 |
---|---|
count(列名 | *) | 统计结果集中指定列的记录的行数 |
max(列名) | 统计结果集中某一列值中的最大值 |
min(列名) | 统计结果集中某一列值中的最小值 |
sum(列名) | 统计结果集中某一列所有值的和 |
avg(列名) | 统计结果集中某一列值的平均值 |
统计表中总条数
select count(*) from 表;
统计某一列最大值
select max(类名) from 表;
统计某一列平均值
select avg(列名) from 表;
分组查询(group by)
统计各个部门人数
select 部门列, count(*) from 表 group by 部门列;
显示各个部门的最高薪资
select 部门列, max(薪资列) from 表 group by 部门列;
筛选(having)
having一定要和group by一起使用, 用于筛选
having可以使用多行函数
例如: 查询每个分类商品所对应的平均单价,要求平均单价低于100
select
category_id,
avg(price) as p
from t_item
group by category_id having p<100;
排序查询(order by)
升序(asc), 降序(desc) 默认升序;
升序查询示例
按薪资升序查询
select 名字, 薪资 from 表 order by 薪资 asc;
-- 或者可以省略asc, 因为默认为升序asc
select 名字, 薪资 from 表 order by 薪资;
分页查询(limit)
格式: limit m, n
-
m是从第几条数据开始(最小为0), (页码-1)*每页记录数
-
n为这一页显示的数据总量, 每页记录数
分页显示示例
每页显示3条记录,返回第 2 页。
select * from 表 limit 3, 3;
/*
每页3个数据, 所以limit第二个参数是3
第一页是 0, 1, 2
第二页是 3, 4, 5
因为要查询第二页, 所以应该从3开始, 所以第二个下标为3
*/
子查询
子查询, 可以把一个 查询语句的结果当作一个值, 让其他语句使用.
例如:
查询emp表中工资最高的员工信息
select max(sal) from emp; -- 得到5000
select * from emp where sal=5000; -- 根据5000找到对象的员工
将以上两条合并成一条sql语句
select * from emp where sal=(
select max(sal) from emp
);
合并查询
关键字: union
用来把两个查询语句的结果合并为一个结果, 例如
select 列a, 列b from 表1
union
select 列c, 列d from 表2;
结果是两条查询语句合并的结果, 结果会默认去重,
而且查询的时候两条查询语句的列数要一样才可以
别名 (as)
关键字: as
(可省略)
一旦使用了别名, 后续在语句中使用的时候必须要使用别名
例如:
select
e.name as name,
d.name as dept
from
emp e,
dept d
where
e.dept_id = d.id;