1、查询的基本语法 select * from 表名;
- from 关键字后面写表名,表示数据来源于这张表
- select后面写表中的列名,如果是*表示结果中显示表中的所有列
- 在select后边的列名部分,可以使用as为列起个别名,这个别名出现在结果集中
- 如果需要查询多个列,之间使用逗号隔开
2、消除重复行 (在select后面列前使用distinct可以消除重复行)
比如:seelct distinct gender from students;
3、条件查找(使用where) select * from 表名 where 条件;
(1)条件运算符:
等于= 大于> 小于< 大于等于>= 小于等于<= 不等于!=或<>
比如:编号大于3的学生:select * from students where id >3;
(2)逻辑运算符:
and or not
比如:编号大于3的女学生:select * from students where id >3 and gender=0;
(3)模糊查询:
- like
- %表示任意多个字符
- _表示一个任意字符
比如:
- 查询姓黄的同学: select * from students where name='黄%';
- 查询姓黄且名字是一个字的同学: select * from students where name like '%黄_';
- 查询姓黄或叫靖的学生: select * from students where name like '黄%' or name like '%靖%';
(4)范围查询
- in表示在一个非连续的范围内查找
- between...and...表示在一个连续的范围内查找
比如:
- 查找编号是1或3或8的学生: select * from students where id in (1,3,8);
- 查询学生是3至8的男生: select * from students where id between 3 and 8 and gender=1;
(5)空判断 null和''是不同的 is null 判空 is not null判非空
比如:
- 查询没有写地址的学生: select * from students where hometown is null;
- 查询填写了地址的女生: select * from students where hometown is not null and gender=0;
优先级:小括号>not>比较运算符>逻辑运算符
and 比 or 先运算,若同时出现,且想先运算or,可以使用()
4、聚合 (5个聚合函数===>为了快速得到统计数据)
(1)count(*) 表示计算总行数,括号中写*与列名,结果相同
比如:查询学生总数: select count(*) from students;
(2)max(列) 表示此列的最大值
比如:查询女生的编号最大值: select max(id) from students where gender=0;
(3)min(列) 表示此列最小值
比如:查询未删除的学生的最小编号: select min(id) from students where idelete=0;
(4)sum(列) 表示求此列的和
比如:查询男生的编号之后: select sum(id) from students where gender=1;
(5)avg(列)表示求此列的平均值
比如:查询未删除女生的编号平均值: select avg(id) from students where isdelete=0 and gender=0;
5、分组
(1)介绍:
按照字段分组,表示此字段相同的数据会被放到一个组中;分组后,只能查询出相同的数据列,对于有差异的数据列无法出现在结果集中;可以对分组后的数据进行统计,做聚合运算。
(2)基本语法:
select 列1,列2,聚合... from 表名 group by 列1,列2,列3...
比如:查询男女生总数: select gender as 性别, count(*) from students group by gender;
查询各城市人数: select hometown as 家乡, count(*) from students group by hometown;
(3)分组后的筛选:
select 列1,列2,聚合... from 表名 group by 列1,列2,列3...having 列1,列2,聚合,...
比如:查询男生总人数:(使用where语句):select count(*) from students where gender=1;
(使用分组后筛选having): select gender as 性别,count(*) from students group by gender having gender=1;
注:where和having的比较:
where是对from后面指定的表进行筛选,属于原始数据的筛选
having是对group by的结果进行筛选
6、排序
select * from 表名 order by 列1 asc|desc, 列2 asc|desc,...; 将行数据按列1进行排序,若列1值相同,就按列2排序,...
默认是从小到大排序,asc从小到大排序,即升序;des从大到小排序,即降序
比如:查询未删除男生学生信息,并降序表示:select * from students where gender=1 and isdelete=0 order by id desc;
7、分页(获取部分行)
select * from 表名 limit start,count; 从start开始,获取count条数据,start索引从0开始
8、sql连接查询(inner join、full join、left join、 right join)
(1)内连接的过程(inner join):将符合条件的记录组合起来,放在一张新表里面
(2)左连接的过程(left join):将左边表的所有记录拿出来,不管右边表有没有对应的记录
(3)右连接的过程(right join):将右边表的所有记录拿出来,不管左边表有没有对应的记录
(4)全连接(full join):这里要注意的是mysql本身并不支持全连接查询,可以使用UNION关键字实现。使用UNION关键字将左连接和右连接,联合起来
9、视图
对于复杂的查询,在多次使用后,维护是一个非常麻烦的事===>使用视图===>视图本质就是对查询的一个封装
定义视图:create view stuscore as select students.*, scores.score from scores inner join students on scores.id=students.id;
视图的用途是查询:select * from stuscore;