zoukankan      html  css  js  c++  java
  • 博客整理day35 数据库多表查询

    python day35 数据库多表查询

    单表查询

    #单表操作语法
    SELECT DISTINCT 字段1,字段2... FROM 表名
                                  WHERE 条件
                                  GROUP BY field
                                  HAVING 筛选
                                  ORDER BY field
                                  LIMIT 限制条数
    

    分组 : group by

    #group by:将取出的一条条记录进行分组group by,如果没有group by,则整体作为一组
    #语法  
    select 聚合函数,筛选的字段名 from 表名 group by 分组的字段名
    
    #1.以性别为例, 进行分组, 统计一下男生和女生的人数是多少个
    select count(id),gender from employee group by gender;
    
    #2. 对部门进行分组, 求出每个部门年龄最大的那个人
    select depart_id,max(age) from employee group by depart_id;
    

    max : 求最大值

    min : 求最小值

    sum : 求和

    count : 计数

    avg : 求平均值

    过滤 : having

    where和having

    执行优先级从高到低 : where > group by > having
        1. where 发生在分组group by之前,因而where中可以有任意字段,但不能使用聚合函数
        2.having发生在分组group by之后,因而having中可以使用分组字段,无法直接取到其他字段,可以使用聚合函数
    

    语法

    #having 表示对group by之后的数据,进行二次筛选
    #对每一个部门进行分组
    select depart_id,avg(age) from employee group by depart_id;
    
    #显示平均年龄高于35的部门
    select depart_id,avg(age) from employee group by depart_id having avg(age) >35;
    

    查询排序 order by

    #语法
    select * from 表名 order by 字段名;
    
    select * from 表名 order by 字段名 asc;   #升序
    
    select * from 表名 order by 字段名 desc;	 #降序
    
    #先按照age排序,如果年纪相同,则按照薪资排序
    select * from employee order by age,salary desc;
    

    限制查询的记录数 limit

    '''
    limit 分页查询
    limit offset, size	
        offset: 行数据索引
        size: 取多少条数据
    '''
    #语法
    select * from 表名 order by 字段名 desc limit 3; #默认初始位置为0
    
    select * from 表名 order by 字段名 desc limit 1,3#从第2条开始往后查3条
    
    select * from employee limit 10,10;
    

    单表小结

    #使用顺序
    where > group by > having > order by > limit
    

    多表操作

    外键 foreign key

    外键优点:

    1. 减少占用空间
    2. 只需修改关联表中的数据,其余表中的数据也会相应的修改
    
    #语法
    constraint 外键名 foreign key 
    	(被约束字段名) references 约束的表(约束的字段名);
        
    constraint fk_user foreign key 
    	(depart_id) references department(id);
    

    多对多

    create table boy(
    	id int auto_increment primary key,
        bname varchar(32) not null default''
    )charset utf8;
    
    insert into (bname) values ('simple'),('simple2');
    
    create table girl(
    	id int auto_increment primary key,
        gname varchar(32) not null default''
    )charset utf8;
    
    insert into girl (gname) values ('momo'),('momo2');
    
    create table boy2girl(
    	id int auto_increment primary key,
        bid int not null default 1,
    	gid int not null default 1,
        
        constraint fk_boy2girl_boy foreign key(bid) references boy(id),
        constraint fk_boy2girl_girl foreign key(gid) references girl(gid)
    )varchar utf8;
    
    insert into boy2girl (bid,gid) values (1,1),(1,2),(2,2);
    
    select * from boy left join boy2girl on boy.id = boy2girl.bid left join girl on girl.id = boy2girl.gid;
    

    一对一

    #(外键 + unique)
    create table priv(
    	id int auto_increment primary key,
        salary int not null default 0,
        uid int not null default 1,
        
        contraint fk_priv_user foreign key (uid) references user(id),unique(uid)
    )varchar utf8;
    
    insert into priv (salary, uid) values (2000, 1);
    insert into priv (salary, uid) values (2800, 2);
    insert into priv (salary, uid) values (3000, 3);
    
    #如果uid重复添加,会报错
    

    多表联查

    #语法
    select 字段列表 from 
    	表1 inner/left/right join 表2 on 表1.字段 = 表.2字段;
    

    内连接

    # 找两张表共有的部分,相当于利用条件从笛卡尔积结果中筛选出了正确的结果
    # department没有204这个部门,因而employee表中关于204这条员工信息没有匹配出来
    select * from employee inner join department on employee.dep_id=department.id; 
    

    外链接

    #优先显示左表全部记录
    # 以左表为准,即找出所有员工信息,当然包括没有部门的员工
    # 本质就是:在内连接的基础上增加左边有右边没有的结果
    select * from employee left join department on employee.dep_id=department.id;
    

    外链接

    #优先显示右表全部记录
    # 以右表为准,即找出所有部门信息,包括没有员工的部门
    # 本质就是:在内连接的基础上增加右边有左边没有的结果
    
    select * from employee right join department on employee.dep_id=department.id;
    
  • 相关阅读:
    Codeforces Round #447 Div. 2 A.B.C
    Codeforces Round #445 Div. 2 A ACM ICPC+B Vlad and Cafes
    51Nod 1035 最长的循环节 数论
    Codeforces Round #444 (Div. 2) C.Solution for Cube 模拟
    POJ 3111 K Best
    POJ 2976 Dropping tests
    POJ 3045 Cow Acrobats
    POJ 3045 Cow Acrobats
    POJ 3273
    POJ 3258 River Hopscotch
  • 原文地址:https://www.cnblogs.com/samoo/p/11768314.html
Copyright © 2011-2022 走看看