MySQL--数据的查找

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL--数据的查找相关的知识,希望对你有一定的参考价值。

- 基本查询
| 查询所有列 
select * from students;
| 指定条件查询 
select * from students where is_delete=1;
| 查询指定列 
select name, gender from students;
| 字段的顺序 
select gender, name from students;
| as的使用
# 在查询指定列的同时,修改字段名显示
select 字段名 as 显示名 from 列表;
select name as 姓名, gender as 性别 from students;
# 在sql语句中暂时修改表名,减少代码量
select students.name, students.gender from students;
select s.name, s.gender from students as;
| 消除重复行 
distinct 字段 
select gender from students; 
select distinct gender from students;
- 条件
| 比较运算符
>
select * from students where age > 18;
<=
select * from students where age <= 18;
| 逻辑运算符
and
select * from students where age>18 and gender=2;
or
select * from students where age>18 or height>=180;
not
select * from students where not (age>18 and gender=2);
| 模糊查询
--like
"%"
查找以某字符开头的名字
select name from students where name like "小%";
"_"  
查询有几个字的名字
select name from students where name like "__";
select name from students where name like "___";
--rlike(支持正则)
select name from students where name rlike "^周";
select name from students where name rlike "^周.*伦$";
| 范围查询
-- in 表示在一个非连续范围内
select name from students where age in (18,34);
-- not in
select name , age from students where age not in (18,34);
【附:左右两个数字必须是表内含有的】
-- between ...and ... 表示在一个连续的范围内
select * from students where age between 18 and 34;
-- not between ...and.. 不需要加括号
select * from students where age not between 18 and 34;
【左右两个数字没有限制】
| 空判断
--判断is null  判断为空
select * from students where height is null;
--判断is not null 判断不为空
select * from students where height is not null;
- 排序
order by 字段
acs 升序 (没有asc也默认升序) 
select * from students where (age between 18 and 34) and gender=1 order by age; 
select * from students where (age between 18 and 34) and gender=1 order by age asc;
desc 降序 
select * from students where (age between 18 and 34) and gender=2 order by height desc;
# 哪个排序操作在前,就先执行哪个
年龄从小到大,身高从高到矮的排序
select * from students order by age asc, height desc;
先对身高降序,如果体重相同,年龄升序
select * from students where (age between 18 and 34) and gender=2 order by height desc, age asc;
- 聚合函数
总数 (统计数量) 
count 
select * from students where gender=1; 
select count(*) as 男生的人数 from students where gender=1; 
select count(*) as 女生的人数 from students where gender=2; 
# *的效率比选择的字段要高 
select count(name) as 男生的人数 from students where gender=1;
最大值 
max 
select age from students; 
select max(age) from students; 
select max(height) from students where gender=2;
最小值 
min 
select sum(age) from students;
求和 
sum 
select sum(age) from students;
平均值 
avg 
select sum(age)/count(*) from students; 
select avg(age) from students;
四舍五入 round(数字,保留位数) 
select round(avg(age) ,2) from students where gender=1; 
计算所有人的年龄,保留两位小数 
select round(avg(age) ,2) from students;
- 分组
--group by
选择字段,
数据去重后分成一组
按照性别分组
select * from students group by gender; # 错误
select gender from students group by gender;
--group_concat
取出分组对应的
其他字段下的数据
select gender, group_concat(name) from students
group by gender;
select gender, group_concat(name, age) from students
group by gender;
--having
附加查询
每种性别的平均年龄
select gender, avg(age) from students
group by gender;
查询平均年龄超过30岁的性别
select gender, group_concat(name) from students
group by gender having avg(age)>30;
--with rollup
--在最后新增一行,记录当前列所有数的总和
select gender, count(*) from students group by gender with rollup;
-
分页
(limit start, count     
0表示第一个)
1-操作
查询前5个数据 
select * from students limit 0,5; 
查询id4-8的数据 
select * from students limit 3,5; 
每页显示2个,第1,2,3个页面 
select * from students limit 0,2;----每页数量*(页数-1) 
select * from students limit 2,2; 
select * from students limit 4,2; 
每页显示2个,显示第3页的信息,按照年龄从小到大排序 
select * from students limit 2*(4-1),2; 失败 
select * from students limit 6,2 order by age asc; 失败  
select * from students order by age asc limit 6,2 ;
2-加速查找
- 连表查询
-
inner join ...on..
内连接,取交集
--对inner join ...on...的理解
select * from goods inner join goods_brands
on goods.id=goods_brands.id;
分析:从goods某个范围内中查找数据,
而这个范围是含有goods_brands的交集,
且必须满足on后面的条件
--按照要求显示字段
select goods.name from goods inner join goods_brands
on goods.id=goods_brands.id;
--显示要求字段的同时,插入表中其他字段数据
select b.*,g.name from goods as g inner join goods_brands as b
on g.id=b.id;
--给数据表起短名字
select g.name from goods as g inner join goods_brands as b
on g.id=b.id;
-
left join ...on...
左连接以左边表为主
--左连接,以左表为基础,匹配另一个表数据,
--无数据用NULL表示
select b.*,g.name from goods as g left join goods_brands as b
on g.id=b.id;
--清除NULL的数据
select b.*,g.name from goods as g left join goods_brands as b
on g.id=b.id where b.name is not null;
-
自关联
(待补充)
create table areas(
    aid int primary key,
    atitle varchar(20),
    pid int
);
查询所有省份 
select * from areas where pid is null; 
查询山东省的所有市 
select * from areas as city inner join areas as province 
on city.pid=province.aid where province.atitle="山东省";
数据库导入数据命令——source 文件.sql
- 子查询
- 标量子查询
返回一个数据(一行一列)
select * from students height > avg(height); 失败 
select * from students where height > select avg(height) from students;  失败 
select * from students where height > (select avg(height) from students);
- 列级子查询
返回的结果是一列(一列多行)
select name from classes where id in (select cls_id from students);
- 行级子查询
返回结果是一行(一行多列)
select * from students where (height,age) = (select max(height),max(age) from students);
- 组合Union
-- 组合,自动处理重合
    select nickname from A union select name from B
-- 组合,不处理重合
    select nickname from A union all select name from B

以上是关于MySQL--数据的查找的主要内容,如果未能解决你的问题,请参考以下文章

mysql查找一个数据库中所有特定前缀的表

mysql数据库 怎么在多个表中 查找一个关键词

mysql索引查找原理及优化

(转引)数据库索引(MySQL)

MySQL实现递归查找树形结构

MySQL学习笔记-索引