美文网首页
进一步使用MySQL

进一步使用MySQL

作者: 随便都赢 | 来源:发表于2020-10-15 12:23 被阅读0次

    首先昨天的外键,是一个字段关联一个字段。现在我们用两个字段关联两个字段。

    create table t1{
        nid int(11) not null AUTO_INCREMENT,
        pid int(11) not null,
        primary key(nid,pid)
    }
    create table t2{
        id int(11) not null AUTO_INCREMENT primary key,
        id1 int,
        id2 int,
        CONSTRAINT fk_t1_t2 foreign key(id1,id2) references t1(nid,pid)
    }
    

    select *和写字段的区别?

    1、在 abc 字段有索引的情况下,mysql 是可以不用读 data,直接使用 index 里面的值就返回结果的。但是一旦用了 select *,就会有其他列需要读取,这时在读完 index 以后还需要去读 data 才会返回结果,这样就造成了额外的性能开销。

    2、SELECT *,需要数据库先 Query Table Metadata For Columns,一定程度上为数据库增加了负担(影响网络传输的性能)。

    AUTO_INCREMENT的设置:

    # 会话可以理解为 cmd下mysql -u -p之后到你关闭的这段时间
    # SQL Server默认是全局的
    show session variable like 'auto_inc%';#查看当前会话全局变量
    set session auto_increment_increment=2;#设置当前会话步长
    set session auto_increment_offset=10;#设置会话自增起始值下一个id为10
    
    show global variable like 'auto_inc%';#查看系统全局变量
    set global auto_increment_increment=2;#设置系统步长
    set global auto_increment_offset=10;#设置系统自增起始值下一个id为10
    
    alter table t1 AUTO_INCREMENT=20;# 设置表步长
    

    唯一索引与联合唯一索引

    create table t1(
        id int,
        mun int,
        num int,
        unique uniqueName(num),# 单独唯一索引
        unique uniqueNane(num,mun)# 联合唯一索引
    )
    

    表与表之间的关系

    #一对一
    一根笔只能对应一个笔盖,创建一个笔与笔盖关系表。用笔主体设置外键关联到笔盖,然后设置联合唯一索引
    FK+UNIQUE
    #一对多
    一个班级对应多个学生,创建一个班级表。用学生设置外键关联到班级,然后学生设置唯一索引
    FK+UNIQUE
    #多对多
    去网吧一个人可以玩很多台机器,一台机器也可以被很多人玩,创建一个上机记录表。用机器设置外键关联到人。
    FK
    

    对记录操作的深入应用:

    # 插入
    insert into table t1(name,age) values('alex',18),('eric',12);# 多条插入
    insert into table t1(name,age) select name,age from t2;表记录插入
    
    # 修改
    update t1 set name='name2',age=12 where id>2 and name='name1';# 多条件查询修改
    
    # 查询
    select id,name as nickname from t1 where id <> 12;# i!=12,不等于的两种方式
    select id,name from t1 where id between 1 and 12;# 区间查询[1,12]
    select id,name from t1 where id not in(1,2,3);# not in查询
    select id,name from t1 where id in(select oid from t2 where oid > 10)# in查询
    
    # 通配符查询
    select id,name from t1 where name like "a%"# 通配符
    # a%;asad,ass,aaaa
    # a_;aw,aq,ae
    select * from user where username like 'P_boy';
    # 表示长度为5,以p开头,以boy结尾
    select username from user where username like '%pbo/_%' escape '/'; 
    # escape的作用是用来转义,比方说我们有需求:要查%或者_,那么我们就需要用到转义
    
    # 限制查询
    select * from t1 limit 2;# 取2条
    select * from t1 limit 2,10;# 2向后取10条
    select * from t1 limit 10 offset 2;# 2向后取10条
    select * from t1 order by desc limit 10;# 大到小,后10条
    select * from t1 order by asc;# 小到大
    select * from t1 order by name asc,id desc;# 先name小到大,同样的name按id从大到小
    
    # 聚合查询
    select departid,max(id) from t1 group by departid;# 取departid分组中最大的id
    select departid,min(id) from t1 group by departid;# 取departid分组中最小的id
    select departid,count(id) from t1 group by departid;# departid分组的人数
    # sum()统计字段值
    # avg()统计平均值
    select count(id) from t1;# 不分组 直接返回记录数
    select departid,count(id) from t1 group by departid having count(id)>1;# where 后面不能加聚合函数
    # 连表查询
    select id,name,departname from user,depart;# 笛卡尔积
    select id,name,departname from user,depart where user.departid=depart.id;
    select id,name,departname from user left join depart on user.departid=depart.id;# 左边(user)表的全部展示
    select id,name,departname from user right join depart on user.departid=depart.id;# 右边(depart)表的全部展示
    select id,name,departname from user inner join depart on user.departid=depart.id;# 左右边存在null的记录隐藏
    

    相关文章

      网友评论

          本文标题:进一步使用MySQL

          本文链接:https://www.haomeiwen.com/subject/vzvnpktx.html