Mysql进阶2

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql进阶2相关的知识,希望对你有一定的参考价值。

数据类型:

字符类型的宽度和数值类型的宽度的区别
1、数值类型的宽度为显示宽度,只用于select查询时显示,和占用的存储空间大小无关,可用zerofill来显示效果
2、字符类型的宽度超过指定宽度则无法存储
create table t1(
id int(3) zerofill,
name char(20)
);
insert into t1 values(1,"lucy"); ## 显示效果为 001

表字段的操作

1、语法:alter table 表名 执行动作;
2、添加字段(add)
    1、添加到末尾
        alter table 表名 add 字段名 数据类型;
    2、添加到第一列
        alter table 表名 add 字段名 数据类型 first;
    3、添加到指定位置
        alter table 表名 add 字段名 数据类型 after 字段名;
3、删除字段(drop)
    alter table 表名 drop 字段名;
4、修改字段数据类型(modify)
    alter table 表名 modify 字段名 新的数据类型;
5、修改字段名(change)
    alter table 表名 change 旧字段名 新字段名 数据类型;
6、修改表名(rename)
    alter table 表名 rename 新表名;

表记录的管理

1、删除表记录
    1、delete from 表名 where 条件;
    2、注意
        delete语句后如果不加where条件子句会将表中所有记录全部删除
    3、示例
        create table t4(
        id int(3) zerofill,
        name varchar(20),
        sex enum("boy","girl")
        );

        insert into t4 values
        (1,"Lucy","girl"),
        (2,"Tom","boy"),
        (3,"Bob","boy");

        select * from t4;

更新表记录

    1、update 表名 set 字段名=值1,字段名=值2,...,where 条件;
    2、注意
        update语句后如果不加where条件会将表中所有的值修改
    3、练习(见建表脚本MOSHOU.hero.txt)
        1、查找所有蜀国人的信息
            select * from hero where country="蜀国";
        2、查找女英雄的姓名、性别和国家
            select name,sex,country from hero where sex="女";
        3、把曹操的国籍改为蜀国
            update hero set country="蜀国" where name="曹操";
        4、把魏延的性别改为 女 ,国籍改为 泰国
        5、把id为2的记录的姓名改为司马懿,性别为男,国家为魏国
        6、删除所有的泰国人
        7、将表中所有的记录的国家改为吴国
        8、删除所有英雄的信息

4、运算符操作(配合查询、修改、删除)
1、数值比较&字符比较
1、数值比较运算符:=、!=、>、>=、<、<=
2、字符比较运算符:=、!=
3、练习
1、找出攻击力高于150的英雄的名字和攻击力的值
2、找出防御力值不是66的英雄信息
2、逻辑比较
1、运算符:and(多个条件同时满足)
or(多个条件有一个满足即可)
2、练习
1、找出攻击值大于200的蜀国英雄的名字、攻击值及国家
2、将吴国英雄中攻击值为110的英雄的攻击值设置为100,防御值设置为60
3、查找蜀国和魏国的英雄信息
3、范围内比较
1、运算符:between and、in、not in
2、语法
字段名 between 值1 and 值2
字段名 in(值1,值2,...,值N)
字段名 not in(值1,值2,...,值N)
3、练习
1、查找攻击值在100-200之间的蜀国英雄信息
2、找到蜀国和吴国以外的国家的女英雄信息
3、找到编号为1、3或5的蜀国英雄和貂蝉的编号、姓名、国家
4、匹配空、非空
1、空:is null
2、非空:is not null
3、练习
1、查找姓名为空值(NULL)的蜀国男英雄信息
2、查找姓名为空字符串("")的英雄信息
4、注意
1、NULL :空值,必须用is或者is not去匹配
2、"" :空字符串,用 = 或者 != 去匹配
5、模糊比较
1、语法
字段名 like 表达式
2、表达式
1、 :匹配单个字符
2、% :匹配0到多个字符
3、练习
1、select id,name from sanguo where name like "
%_";

匹配名字中至少有两个字符的

        2、select id,name from sanguo where name like "%";
            # 匹配除NULL之外的所有英雄信息
        3、select id,name from sanguo where name like "___";
            # 匹配名字中有三个字符的
        4、select id,name from sanguo where name like "赵%";
            # 匹配姓赵的英雄信息

SQL查询

1、总结(执行顺序)
    3、 select ...聚合函数 from ...
    1、 where ...
    2、 group by ...
    4、 having ...
    5、 order by ...
    6、 limit ...
2、order by
    1、作用:给查询的结果进行排序
    2、排序方式
        1、ASC(默认) :升序
        2、DESC :降序
    3、语法格式
        order by 字段名 排序方式
    4、练习
        1、将英雄信息按防御值从低到高排序
            select * from sanguo order by fangyu asc;
        2、将蜀国英雄信息按攻击值从高到低排序
            select * from sanguo where country="蜀国" order by gongji DESC;
        3、将魏蜀两国的男英雄中名字为三个字的英雄按防御值升序排列
            select * from sanguo where
            country in("蜀国","魏国") and sex="男" and name like "___"
            order by fangyu;
    3、limit(永远放在SQL语句的最后写)
        1、作用 :限制显示查询记录的条数
        2、用法
            1、limit n -->显示几条记录
            2、limit m,n
                m -> 从第几条记录开始显示,n表示显示几条
                ## m的值是从0开始计数的,3则表示第四条记录开始
                limit 3,5 :显示4-8条记录
        3、练习
            1、查找攻击值前三名且名字不为空值的蜀国英雄的姓名、攻击值和国家
                -> select name,gongji,country from sanguo
                -> where
                -> name is not null and country="蜀国"
                -> order by gongji desc
                -> limit 3;
            2、查找防御值倒数第二名到倒数第四名的蜀国英雄记录
                -> select * from sanguo
                -> where
                -> country="蜀国"
                -> order by fangyu asc limit 1,3;

聚合函数

        1、分类
            1、avg(字段名) : 求字段的平均值
            2、sum(字段名) : 求字段的和
            3、max(字段名) : 求字段的最大值
            4、min(字段名) : 求字段的最小值
            5、count(字段名):统计该字段的记录的个数
        2、练习
            1、攻击力最强值是多少
                select max(gongji) from sanguo;
            2、统计一下表中id,name字段分别有独傲少条记录
                select count(id),count(name) from sanguo;
                ## 空值NULL不会被统计,空字符串""会被统计
            3、计算蜀国英雄的总攻击力
                -> select sum(gongji) from sanguo
                -> where country="蜀国";
            4、统计蜀国英雄中攻击值大于200的英雄的数量
                -> select count(*) from sanguo
                -> where 
                -> country="蜀国" and gongji>200;
    5、group by
        1、作用:给查询的结果进行分组
        2、练习
            1、查询sanguo表中一共有几个国家
                select country from sanguo group by country;
            2、计算所有国家的平均攻击力
                select country,avg(gongji) from sanguo
                group by country;
            3、查找所有国家中英雄数量最多的前两名的国家名称和英雄数量
                -> select country,count(*) from sanguo
                -> group by country
                -> order by count(*) desc
                -> limit 2;
        3、注意
            1、group by之后的字段名必须要为select之后的字段名
            2、如果select之后的字段名和group by之后的字段名不一致,则必须要对该字段值进行聚合处理(聚合函数)
    6、having语句
        1、作用:对查询的结果进行进一步的筛选
        2、练习
            1、找出平均攻击力大于105的国家的前两名,显示国家名和平均攻击力
            -> select country,avg(gongji) from sanguo
            -> group by country
            -> having avg(gongji)>105
            -> order by avg(gongji) desc
            -> limit 2;
        3、注意
            1、having语句通常与group by语句联合使用,用于过滤由group by语句返回的记录集
            2、having语句的存在弥补了where条件子句不能与聚合函数联合使用的不足,where只能操作表中实际存在的字段,having操作的是聚合函数生成的显示列
    7、distinct
        1、作用:不显示字段的重复值
        2、练习
            1、sanguo表中有哪几个国家
                select distinct country from sanguo;
                # 多个字段用逗号隔开
            2、计算蜀国一共有多少个英雄
                select count(distinct name) from sanguo where country="蜀国";
            3、注意
                1、distinct处理的是distinct与from之间的所有字段,所有字段值必须全部相同才能去重
                2、distinct不能对任何字段做聚合处理
    8、查询表记录时做数学运算
        1、运算符
            +、-、*、/、%
        2、练习
            1、查询显示时所有英雄的攻击力全部乘以10
                select id,name,country,gongji*10 as xgj from sanguo;
            2、查询时显示所有英雄的防御力+5
                select id,name,country,fangyu+5 from sanguo;

约束

1、作用
    为了保证数据的完整性、一致性、有效性的规则
    可以限制无效的数据插入到数据表中
2、约束分类
    1、默认约束(default)
        1、作用 :在插入记录时,如果不给该字段赋值,则使用默认值
        2、格式 :字段名 数据类型 default 值
    2、非空约束(not null)
        1、作用 :不允许该字段的值有NULL记录
        2、格式 :字段名 数据类型 not null

索引

1、定义
    对数据库中表的一列或者多列的值进行排序的一种结构(mysql中用BTREE方式)
2、优点
    可以加快数据的检索速度
3、缺点
    1、当你对表中的数据进行增加、修改和删除的时候,索引也要动态维护,降低了数据的维护速度
    2、索引需要占用物理空间
4、索引类型
    1、普通索引(index)
        1、使用规则
            1、一个表中可以有多个index字段
            2、字段的值可以有重复,且可以为NULL值
            3、经常把做查询条件的字段设置为index字段
            4、index字段的key标志是MUL
        2、创建index
            1、创建表时创建
                index(字段名1),index(字段名2)
            2、在已有表中创建index
                create index 索引名 on 表名(字段名);
            3、注意
                索引名一般和字段名相同
        3、查看普通索引
            1、desc 表名;  -->查看key标志为MUL
            2、show index from 表名;
        4、删除普通索引
            drop index 索引名 on 表名;
            注意:
                删除索引只能一个一个删除
    2、唯一索引
    3、主键索引
    4、外键索引

以上是关于Mysql进阶2的主要内容,如果未能解决你的问题,请参考以下文章

我的C语言学习进阶之旅解决 Visual Studio 2019 报错:错误 C4996 ‘fscanf‘: This function or variable may be unsafe.(代码片段

我的C语言学习进阶之旅解决 Visual Studio 2019 报错:错误 C4996 ‘fscanf‘: This function or variable may be unsafe.(代码片段

我的OpenGL学习进阶之旅NDK开发中find_library查找的系统动态库在哪里?

我的OpenGL学习进阶之旅NDK开发中find_library查找的系统动态库在哪里?

我的Android进阶之旅关于Android平台获取文件的mime类型:为啥不传小写后缀名就获取不到mimeType?为啥android 4.4系统获取不到webp格式的mimeType呢?(代码片段

我的Android进阶之旅关于Android平台获取文件的mime类型:为啥不传小写后缀名就获取不到mimeType?为啥android 4.4系统获取不到webp格式的mimeType呢?(代码片段