1.-- 分页
-- limit start, count
-- 表示获取多少条数据
-- start 默认值为0 可以省略
-- 表示跳过多少条数据
select * from students limit 5;
-- 跳过一条数据 向后获取5条
select * from students limit 1, 5;
第一页
select * from students limit 0, 5;
-- 跳过5条数据 再获取5条数据
已知:每页显示m条数据,已知当前需要显示的页码n(从1开始) 求:需要显示哪些数据??
答案:limit (n - 1)*m,m
第二页
select * from students limit 5, 5;
第三页
select * from students limit 10, 5;
-- 每页显示2个,显示第6页的信息
-- 计算交给程序来完成 sql 专注于查询
select * from students limit (6 - 1) * 2,2;
-- 每页显示4个,显示第3页的信息, 按照年龄从小到大排序
# 错误select * from students limit 8,4 order by age asc;
select * from students order by age asc limit 8,4;
2.-- 连接查询 将两个表按照某种条件合并到一起
-- 查询学生的信息和学生对应的班级名字
-- 学生名字: students
-- 班级名字: classes
-- 笛卡尔积查询 有可能合并出一张超级大的表
select students.name,classes.name from students,classes;
select students.*, classes.* from students,classes where students.cls_id = classes.id;
-- inner join ... on 内连接查询 连接某一张表
-- on 表示连接条件
-- 将students 表和 classes 表按照条件合并成一张表
select students.*, classes.* from students inner join classes on students.cls_id = classes.id;
查询学生的信息和学生对应的班级名字
select students.name, classes.name from students inner join classes on students.cls_id = classes.id;
select s.name, c.name from students as s inner join classes as c on s.cls_id = c.id;
-- 在以上的查询中,将班级名字显示在第1列
select c.name, s.name from students as s inner join classes as c on s.cls_id = c.id;
-- 查询 有能够对应班级的学生以及班级信息, 按照班级进行排序
-- select c.xxx s.xxx from student as s inner join classes as c on .... order by ....;
select c.name, s.name from students as s inner join classes as c on s.cls_id = c.id order by c.name;
-- 左连接和右连接统称为外连接
-- left join 左外连接查询
-- 查询每位学生对应的班级信息
-- 以左表的表为主表 主表中所有的数据都显示(满足连接条件+ 不满足连接条件), 不满足连接条件的数据使用NULL填充
select * from students inner join classes on students.cls_id = classes.id;
select * from students left join classes on students.cls_id = classes.id;
-- right join 右边的表做为主表 , 右边的表的所有数据都显示
-- 不符合人的正常阅读习惯
-- 将数据表名字互换位置,用left join完成
select * from classes left join students on students.cls_id = classes.id;
-- 内连接和外连接的其他写法
select * from students join classes on students.cls_id = classes.id;
select * from students cross join classes on students.cls_id = classes.id;
-- 外连接
select * from classes left outer join students on students.cls_id = classes.id;
3.-- 自关联 自己关联自己 a join a
-- 准备数据
create table areas(
aid int primary key,
atitle varchar(20),
pid int
);
source xxx.sql;
-- 省级联动 url: http://demo.lanrenzhijia.com/2014/city0605/
-- 查询所有省份 pid
select * from areas where pid is null;
-- 查询出广东省有哪些市
-- 广东省 广州市
-- 广东省 深圳市
-- 发挥想象力 想象两张表
-- 在省表和市表中 查询省的名字 和市的名字 需要连接查询
select p.atitle, c.atitle from areas as p inner join areas as c on c.pid = p.aid where p.atitle = "广东省";
-- 查询出广州市有哪些区县
-- p parent s: son
select p.atitle, s.atitle from areas as p inner join areas as s on s.pid = p.aid where p.atitle = "广州市";
-- 适用于无限向下分级的业务场景
4.-- 子查询
-- 子查询 select .... select
-- 在一个select 语句中有嵌套了一个select 语句
-- 子查询语句 需要出现在 小括号之内
-- 标量子查询 子查询得到的结构 是一行一列
-- 查询学生的平均身高
select avg(height) from students;
-- 查询出高于平均身高的信息
select * from students where height > 172.64;
select * from students where height > (select avg(height) from students);
-- 列级子查询 查询的结果是一列多行
-- 使用 in 关键字 表示一个不连续的范围
-- 查询年龄是18或者34的学生
select * from students where age in (18,34);
select * from students where age in (select age from students where age = 18 or age = 34);
-- 查询哪些班级有学生 查找的是班级的名字
select classes.name from classes where classes.id in (select students.cls_id from students);
-- 查找哪些班级没有学生
select classes.name from classes where classes.id not in (select students.cls_id from students);
-- 行级子查询
select * from students where (height,age) = (select max(height),max(age) from students);
-- 表级子查询 子查询语句查询出来的结果是多行多列