1. 程式人生 > >mysql筆記五之分頁、連線查詢、自關聯、子查詢

mysql筆記五之分頁、連線查詢、自關聯、子查詢

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);
    -- 表級子查詢 子查詢語句查詢出來的結果是多行多列