Mysql (高级查询)

@作者 Stone的博客 www.1314sl.com

    ----- 字段属性:
    主键:primary key 主键 唯一约束;不能重复
        
        在创建表的时候,在后面加 primary key 关键字
        
    -- 追加主键
        alter table 表名 modify 字段名 primary key
        alter table 表名 add primary key(字段名);

    --更新&删除主键
        
        alter table 表名 drop primary key;


    --主键分类
    id int primary key comment '逻辑主键'
    
    
------ 自动增长
    不给值或者给NULL的时候,会自动被系统+1操作
    
    --自增长通常跟主键搭配
    
    auto_increment
    1.任何一个字段要做自增长前提是本身是一个索引(Key 拦有值)
    2.必须是int型
    3.一张表只能有一个自增长
    
    default NUll 不给值 都会触动自增长
    
    
----列属性(修改自增长)
    向下修改不生效
    向上修改生效
    
    alter table 表名 auto_increment = 值;
    
    
    查看字增长变量
    show variables like 'auto_increment%';
    -- 修改自增长步长
    set auto_increment_increment=5;--一次自增5

-- 删除自增长
    字段的一个属性,可以通过 modify 进行修改(没有 auto_increment)
    Alter table 表名 modify 字段 类型;
    
    alter table 表 modify id int;
    
    --查看 desc 表名
    

-- 列属性(唯一键) 
    unique key  --唯一键 
    数据不能重复,可以有多个唯一,允许为空。
    
    本质与主键差不多。
    
    
-- 增加唯一键
    1.在创建表的时候,字段之后跟 unique / unique key;
    
    2.在所有的字段之后。unique key(字段,字段);
        not null unique key --PRI 表中又没有主键
        
    3.在创建表之后增加唯一
        
        alter table 表名 add unique key (字段);
        
    

--- 删除唯一键
    先删除后新增
    
    alter table 表名 drop unique key -- 错误的
    
    alter table 表名 dropindex 索引名字;
    
    

--------索引

    几乎所有的索引都是建立在字段之上
    
    根据某种算法,将已有得数据(未来可能新增的数据)
    
    
    --索引的意义
        1.提示查询数据的效率
        2.约束数据的有效性(唯一性等)
        

        Mysql中提供了多种索引
        
        主键:primary key
        唯一: unique key
        全文: fulltext index
        普通: index
        
        全文索引,最大的问题是如何确定关键字
            英文很容易:单词与单词之间有空格
            中文很难:没有空格,中文可以各种随意组合(分词:sphinx)
            
            
    
    
---------------- 关系
    一对一
    一对多(多对一)
    多对多
    
    sqlserver 主表 外表
    
    
    ---- 范式:减少数据冗余
    
    1NF - 6NF
    
    
------- 1NF
        第一范式:在设计表存储数据的时候,如果表中设计的字段存储的数据,在取出来使用之前
        还血药额外的处理,不满足第一范式。
        
        数据不需要再次拆封
    
    -- 2NF
        /*
        不允许出现部分依赖
        在输出舍得的过程中,如果有复合主键
        且表中又字段并不是由整个主键来确定,
        而是依赖主键中的某个字段,存在字段依赖的部分问题
        称之为:部分依赖
        */
    
    -- 3NF
    不能出现传递依赖
    
    --逆规范化
    磁盘利用率与效率的对抗
    就是增大空间,提高效率
    

    
    
-------------数据高级操作---------------------    
    
    数据操作:增删改查
    
    新增:
    insert into 表名【字段名】 values (值列表);
    
    在数据插入的时候,假设主键对应的值已经存在,插入一定会失败!
    
    -- 主键冲突
        更新操作
        insert into 表名【字段名】values(值列表) on dupllcate key update 字段=值;
        
      替换
        replace into 表名【字段名】values(值列表;
    
    
    
-------蠕虫复制
        
        复制创建表(表结构)
        
        create table 新表名 like 旧表名; 
        
        蠕虫复制:先查出数据,然后将查出的数据新增一遍
        
        insert into 表名【字段列表】 select 字段列表 * from 数据表名(旧表)
        
        -- 蠕虫复制 成倍增长
        insert into 自己 select * from 自己;
        
        
        意义:
            1.从已有表拷贝数据到新表中
            2.可以迅速的让表中的数据膨胀到一定的数量级。测试表的压力已经效率
        
---- 高级 更新数据

        基本语法
        update 表名 set 字段=值 |where 条件|
        
        高级更新
        update 表名 set 字段 =值 |where 条件| limit 更新数量|
        
            -- 把表中的 a 变成 c
            update 表 set 字段='c' where 字段='a' limit 3;
            
            !!!GBK 不区分大小写。
    
---- 高级 删除数据 可以 通过 limit 来限制数量

    delete from 表名【where 条件】【limit 数量】;
     
    删除数据以后,自增长
    
    思路:数据的删除是不会该表表结构,只能删除表后重建。
    
    TRUNCATE 表名  -删除后,重置自增长
    
    
------- 高级 数据查询(select 选项)

    基本语法:
    select 字段列表 * from 表名 where 条件|
    
    完整语法:
    select 字段列表 * from 数据源 where 条件 group by 
    having  order  by limit;
    
        All:默认的,保留所有的结果
        Distinct : 去重,将重复的去掉
    
    
    -- 字段别名
        
        字段名 [as] 别名;
        
        不写 as 也行
        
    --- 数据源
    /*  从一张表中取出一条记录,去另外一张表中匹配所有的记录
        而且保留  记录数和字段数
        这种结果为:笛卡尔积(交叉连接)
        没什么用,尽量不用

    */  
    
    子查询:
    
    select * from (select * from 表名);
    
    
    
    
-- 高级 where 子句

        where 子句的目标用来判断数据,筛选数据
        
        where 返回结果 0 或者 1   0 带表false 1带表true ;
        
    
    运算符:
            >   大于
            <   小于
            >=  大于等于
            <=  小于等于
            !=  <>  不等于
            =   等于
            模糊查询里用到的:
            like
            between  and
            in / not in
            
    逻辑运算符:
            &&(and)  并
            ||(or)  或者
            !(not)  非
    
    rand 取得一个0和1之间的随机数
    floor 向下取整!
    1.
        select * from 表 where id=1 || id=3 || id=5;
                        ||
                        ||
        select * from 表 where id in(1,3,5);
        
    2.
        select * from 表 where height>=170 and heihgt<=180;
                        ||
                        ||
        select * from 表 where height between 170 and 180;               
    

--------------- Group by  分组----------------
    聚合函数:
    COUNT() :统计分组后的记录数,每一组有多少条记录
    Max()   :统计每组中最大的值
    Min()   :统计最小值
    AVG()   :统计平均值
    SUM()   : 统计和
    
    
select  聚合函数,字段名 from 表名 group by 字段名

多字段排序:
    --order by  放在语句最后
select * from 表名 border by 字段名(desc/asc),

    group_concat(字段)
    
    回溯统计:with rollup
    
    
--  Having 子句
    
    Having 字句 进行条件判断
     
    having 能做 where 能做的几乎所有事情 但是where却不能
    
    select 字段名 from 表名 group by 字段  having 条件
    
--- order by    
    
    select * from 表名 order by 字段 desc/asc;
    
    
--  limit 子句
    limit 有两种使用方式。
        只用来限制长度
    
    
    ------
    length:每页显示的数量
    Offset:offset-(页码-1)*每页显示数量


@作者 Stone的博客 www.1314sl.com

oneNate笔记

@作者 Stone的博客 www.1314sl.com

你可能感兴趣的:(Mysql (高级查询))