语句排序
-- 排序: ORDER BY 字段名 ase(从小到大,升序)/desc(从大到小,降序)
SELECT * FROM goods ORDER BY price ASC
SELECT * FROM goods ORDER BY price DESC
-- 排序 价格从小到大排序,价格相同,就按照数量,从数量多到少
-- 先用价格排序,价格排序之后,再用num进行排序
SELECT * FROM goods ORDER BY price ASC,num DESC
聚合函数
常见的聚和函数
- count():查询总记录数
查询总记录数
count(*)表示计算总行数,括号中也可以使用字段名
-- 注意:统计数据总数时,推荐使用*,它会按照数据最多的一列进行统计
SELECT count(num) FROM goods
SELECT count(*) FROM goods
- max():查询最大值
-- 计算最大值(计算最高的价格)
SELECT MAX(price) FROM goods
- min():查询最小值
-- 计算最小值(计算最小价格)
SELECT MIN(price) FROM goods
- sum():求和
-- 计算蒙牛牛奶的总数量
SELECT sum(num) FROM goods WHERE company LIKE '%蒙%';
- avg():求平均值
-- 计算平均值(计算平均价格)
SELECT avg(price) FROM goods
分组
对比where和having
- where是对from后面指定的表进行数据筛选,属于对原始数据的筛选
- having是对group by的结果进行筛选
- having后面的条件可以用聚合函数,where后面不可以
-- 分组查询:GROUP BY字段
SELECT * FROM goods GROUP BY company
-- 注意:一般情况下,分组要配合聚合函数一起使用,对分组后的数据进行下一步统计
SELECT company 公司名称,COUNT(*) FROM goods GROUP BY company
-- 注意:如果想要在分组后再次进行条件筛选,可以使用having关键字
SELECT company as '公司名称' FROM goods GROUP BY company HAVING company='蒙牛'
分页
获取部分行
当数据量过大时,在一页中查看数据是一件非常麻烦的事情
语法
select * from 表名 Limit start,count
从star开始,获取count数据
start索引从0开始
-- 分页 LIMIT START(起始索引),count(数据行数)
-- 索引:在计算机中,索引计数起始值从0开始
-- 起始索引:实际数据顺序-1,即为其对应的索引值
-- 例:查询3-6行的数据
SELECT * from goods LIMIT 2,4
-- 扩展,如果获取是当前数据中的第一行数据,索引值可以省略
-- 例:获取当前数据中的第一行数据
SELECT * FROM goods LIMIT 1
分页查询
-- 分页查询
-- 每页显示m条数据,求:显示第n页的数据
-- 公式:(n-1)*m,m
-- 例:每页显示2条数据,求:显示第4页的数据
SELECT * FROM goods LIMIT 6,2
连接查询
先创建表
内连接
查询的结果为两个表匹配到的数据
-- 在查询中,需要将两张表存在的对应关系的数据全部显示出来,需要使连接查询-内连接
-- 内连接:显示两张表中存在对应关系的数据,无对应关系的数据不显示
-- 语法:表1 inner join 表1.字段 = 表2.字段
SELECT * from student INNER JOIN address on student.addre_id = address.addre_id
-- 连接查询公用知识点:连接后的表进行字段限制
-- 注意:需要由对应的表名.字段的方式实现(防止表与表之间存在相同的字段名)
SELECT student.`name`,address.addre from student INNER JOIN address on student.addre_id = address.addre_id
-- 连接查询中,往往会给表名起别名,目的:(1)缩短表名(2)给表单独创建空间(了解)
SELECT stu.`name`,ad.addre from student stu INNER JOIN address ad on stu.addre_id = ad.addre_id
左连接
查询的结果是两个表匹配到的数据加左表特有的数据,对于右表中不存在的数据使用null填充
左连接:以left join关键为界,关键字左侧的表信息要全部显示出来,而关键字右侧的表的信息有对应的部分显示,无对应的部分以null占位填充即可
语法:表1 left jion 表2 on 表1.字段=表2.字段
-- 左连接
-- 语法:表1 left jion 表2 on 表1.字段=表2.字段
SELECT * FROM student stu left join address ad on stu.addre_id = ad.addre_id
右连接
查询的结果是两个表匹配到的数据加右表特有的数据,对于左表中不存在的数据使用null填充
右连接:以right join关键为界,关键字右侧的表信息要全部显示出来,而关键字左侧的表的信息有对应的部分显示,无对应的部分以null占位填充即可
语法:表1 right jion 表2 on 表1.字段=表2.字段
-- 右连接 主要解决3张及以上表进行连接查询时常见
SELECT * FROM address ad RIGHT join student stu on stu.addre_id = ad.addre_id
自关联
特征:只有一张表,表中最少存在两列字段具备对应关系
**原理:**通过起别名的方式,将1张表变成2张表,通过对应字段的字段关系,进行条件对比,实现连接查询
自关联:(1)通过起别名的方式,将一个表变两个表
-- (2)通过 表1.字段 = 表2.字段 实现表间关联
SELECT * FROM city c1
INNER JOIN city c2 on c1.aid = c2.pid
子查询的介绍
定义:在一条查询语句中,利用另一条语句作为条件或者数据源,充当条件或数据源的语句称为子查询语句
注意:子查询语句,在使用时,务必使用括号括起来
-- 平均价格
SELECT avg(price) FROM goods
-- 查询大于平均价格的
SELECT * FROM goods WHERE price > 4.85
-- 优化实现 -子查询(充当条件)
SELECT * FROM goods WHERE price > (SELECT avg(price) FROM goods)
-- 查询所有男生信息,包含地址
SELECT * from student where sex='男'
SELECT * from address
-- 需求实现(充当数据源)
SELECT * from address ad
INNER JOIN (SELECT * from student where sex='男') a on ad.addre_id = a.addre_id
扩展1:子查询的分类
根据子查询语句返回的结果形式体现,子查询共分为四类
- 子查询返回的结果是一个值(一行一列),称之为:标量子查询
- 子查询返回的结果是一列数据(一列多行),称之为:列子查询
- 子查询返回的结果是一行数据(一行多列),称之为:行子查询
- 子查询返回的结果是多汗多列(相当于一张表),称之为:表级子查询
扩展2:子查询关键字 - in:
-- in:范围
SELECT * FROM student where height in (SELECT height FROM student where height BETWEEN 170 AND 180);
- some/any:
-- some/any :任意一个
SELECT * FROM student where height = some(SELECT height FROM student where height BETWEEN 170 AND 180);
SELECT * FROM student where height = any(SELECT height FROM student where height BETWEEN 170 AND 180);
- all:
-- all:全部(=all,等于所有,想要匹配括号里面的所有,结果就是空数据)
SELECT * FROM student where height = all(SELECT height FROM student where height BETWEEN 170 AND 180);
-- !=,不等于所有
SELECT * FROM student where height != all(SELECT height FROM student where height BETWEEN 170 AND 180);