mysql笔记五之分页、连接查询、自关联、子查询

版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/kan2016 https://blog.csdn.net/kan2016/article/details/82771683

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);
    -- 表级子查询 子查询语句查询出来的结果是多行多列

猜你喜欢

转载自blog.csdn.net/kan2016/article/details/82771683