mysql高级查询语法
Posted autofelix
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql高级查询语法相关的知识,希望对你有一定的参考价值。
〝 古人学问遗无力,少壮功夫老始成 〞
在数据库的读写中,如何高效有用的读是数据库优化的重中之重,如果能够优化好这点,对于高并发有着非常好的缓解,而对于数据库的高级查询语法将会变得越发重要。如果大家觉得文章有帮助,请给博主一波关注和评论。
目录
一、 子语句
-
where 条件语句
select * from table where 1;
- group by 分组统计
- 相同的数据只会显示一条
select * from table where 1 group by name;
- having 附属条件语句
select * from table where 1 having name='xxx';
-
order by 排序
--升序排列
select * from table where 1 order by id;
select * from table where 1 order by id asc;
-- 降序排列
select * from table where 1 order by id desc;
-
limit 查询条数
-- 查询两条数据
select * from table where 1 limit 2;
-- 跳过4条数据,查询两条数据
select * from table where 1 limit 4,2;
二、聚合函数
函数名 | 描述 |
count() | 统计指定字段在表中的记录总条数,不统计null值。 |
max() | 统计指定字段数据的最大值。 |
min() | 统计指定字段数据的最小值。 |
avg() | 统计指定字段所有符合条件数据的平均值。(average) |
sum() | 统计指定字段所有符合条件数据的总和。 |
concat() | 用指定的字符连接指定多个字段的数据。 |
三、运算符
-
算数运算符 + 、- 、 * 、 / 、 %
-
比较运算符 > 、 >= 、 < 、 <= 、 = 、 != 、 <>
-
逻辑运算符 and 、 or 、 not 、 in 、 is nul 、 is not null 、like
select * from table where age=23 and name='xxx';
select * from table where age=23 or name='xxx';
select * from table where not (name='小明' or name='小红');
select * from table where id in (1,2,6,8);
select * from table where id not in (1,2,6,8);
select * from table where tel is null;
select * from table where tel is not null;
select * from table where name like '李%';
四、 联合查询
-
联合两条查询数据,如果存在相同的数据,则保留其中一条
(select * from table where id>200)
union
(select * from table where id>200);
- 联合两条查询数据,如果存在相同的数据,则全部保留
(select * from table where id>200)
union all
(select * from table where id>200);
五、子查询
-
标量子查询
-
标量子查询就是 本条查询语句的查询条件 是 另一个查询语句查询出来的单个值
-- 查询id为10的老师所带的所有班级信息
select * from class where teacher_name = (
select name from teacher where id = 10
);
-
列子查询
-
列子查询就是 本条查询语句的查询条件 是 另一个查询语句查询出来的一列结果。
-- 查询id为10和30的老师所带的所有班级
select * from class where teacher_name in (
select name from teacher where id = 10 or id=30
);
-
行子查询
-
本条查询语句中的查询条件 是 另一个查询语句所查出来的一行记录
select * from class where (teacher_name,teacher_num)=(
select name,num from teacher where id = 10
)
- 表子查询
- 本条查询语句所查询的表 是 另一个查询语句查询出来的一个虚拟表结果集。
-- 蠕虫复制
insert into table values(select * from teacher where 1);
- exists查询
-- 查询出table1和table2表name字段同时存在相同值的数据
select * from table1 where exists (select * from table2 where table1.name == table2.name);
六、连接查询
- 内连接
- 在两张表中,如果任意一张表的数据根据条件连不上另外一张表中的数据,则这条记录直接被忽略不展示出来。
select * from table1 inner join table2 on table1.name = table2.name;
-- 内连接的简写方式可以省略inner关键字
select * from table1 join table2 on table1.name = table2.name;
-- 在内连接中,where关键字可以代替on关键字
select * from table1 join table2 where table1.name = table2.name;
-- using演示案例 两个表存在相同的name字段且值相同才连接
select * from table1 join table2 on using(name);
- 交叉连接
-
所谓的交叉连接,指的是将左表的每条数据都与右表的每条数据连接一次。
-- 如果内连接不指定条件,就是交叉连接。
select * from table1 inner join table2;
- 左外连接
select * from table left outer join table2 on table.name = table2.name;
-- 简写
select * from table left join table2 on table.name = table2.name;
- 右外连接
select * from table right outer join table2 on table.name = table2.name;
-- 简写
select * from table right join table2 on table.name = table2.name;
- 全外连接
-- 左外连接 和 右外连接 联合起来
(select * from table right join table2 on table.name = table2.name)
union
(select * from table right join table2 on table.name = table2.name);
- 自然连接
- 使用要求:两张表有且仅有一个相同的字段,否则数据会出错,所以,实际项目中并没有什么卵用
-- 自然内连接 等同于 内连接使用using条件
select * from table join table2 using(name);
-- 等同于
select * from table natural join table2;
-- 自然左外连接
select * from table natural left join table2;
-- 自然右外连接
select * from table natural right join table2;
以上是关于mysql高级查询语法的主要内容,如果未能解决你的问题,请参考以下文章