1.数据类型
    1.数值类型
    2.字符类型
    3.枚举类型
    4.日期时间类型
        1.date : 日期 "YYYY-MM-DD"
        2.time : 时间 "HH:MM:SS"
        3.datetime : 日期时间 "YYYY-MM-DD HH:MM:SS"
        4.timestamp : 日期时间 "YYYY-MM-DD HH:MM:SS"
        5.注意
            1. datetimp : 不给值默认返回NULL
            2. timestamp : 不给默认返回当前时间

2. 日期时间函数
    1.NOW()返回服务器当前时间
    2.CURDATE() 返回当前日期
    3.CURTIME() 返回当前时间
    4.日期时间运算
        1.语法格式
            select ... from 表名
            where 字段名 运算符 (时间 - interval 时间间隔单位);
            时间间隔单位: 1 day | 2 hour | 1 minute | 1 year | 3 month
            where meeting > (now() - interval 1 day);
                           现在的时间 - 1天的时间 = 1天前的时间点
        2.练习
            1.查询1天以内的记录
                select * from t1 where meeting > (now() - interval 1 day);
            2.查询1年以前的记录
                select * from t1 where meeting > (now() - interval 1 year);
            3.查询1天以前,3天以内的记录 # where id > 3 and id < 10
    5.练习
        1.创建库 studb2
            create database studb2;
        2.在库中创建表 stuinfo,字段有3个:
            name age phone char(11)
            create table stuinfo(
                                           name char(20),
                                          age tinyint unsigned,
                                          phone char(11));
        3.查看表结构
            desc stuinfo;
        4.在表中第一列添加一个id字段
            alter table stuinfo add id int first;
        5.把phone的数据类型改为bigint
            alter table stuinfo modify phone bigint;
        6.在表中最后一列添加一个字段:注册时间 register , 数据类型为: timestamp
            alter table stuinfo add register timestamp;
        7.在表中 id name age phone 四个字段插入1条记录
            insert into stuinfo values(1,"小羊",29,13456798212,CURTIME());
        8.查询5分钟内的注册信息
            select * from stuinfo where register > (now() - interval 5 minute);        

4. 表记录管理
    1.删除表记录(delete)
        1.delete from 表名 where 条件;
        2.注意
            delete语句后没有加where条件,表中所有记录全部清除
    2.更新表记录(update)
        1.update 表名 set 字段1=值1,字段2=值2,...where条件;
        2.注意
            必须加where条件

5.运算符操作(查询 修改 删除)
    1.数值比较&字符比较&逻辑比较
        数值:  =  !=  >  >=  <  <=
        字符:  =  !=
        逻辑:  and  or
    2.范围内比较
        1.运算符
            between 值1 and 值2
            in(值1,值2,...)
            not in(值1,值2,...)
    3.匹配空 非空
        1.空 : is null
        2.非空: is not null
        3.示例
            1.查找姓名为NULL的魏国女英雄信息
                select * from sanguo
                where name is null and country = "魏国" and sex = "女";
        
            注意
             1.NULL:空值,必须用is 或者 is not 去匹配
                2.空字符串 只能用 = 或者 != 去匹配
    4.模糊比较
        1.where 字段名 like 表达式
        2.表达式
            1. _ :匹配单个字符
            2. % : 匹配0到多个字符
        3.示例
            select * from sanguo where name like "_%_";   #至少两个
            select * from sanguo where name like "%";    # 0 到多个(空值除外)
            select * from sanguo where name like "___"; # 只有三个
            select * from sanguo where name like "赵%";  # 姓赵的

6.SQL查询
    1.总结
        3.select ...聚合函数 from 表名
        1.where ...
        2.group by ...
        4.having ...
        5.order by ...
        6.limit ...;
    2.order by
        1.给查询的结果进行排序
        2.order by 字段名 排序方式
        3.排序方式
            1.升序:ASC(默认)
            2.降序:DESC
        4.练习
            1.将蜀国的英雄按照攻击值从高到低排序
                select * from sanguo
                where country = "蜀国" order by gongji desc
            2.将魏蜀两国的男英雄中名字为三个字符的英雄按防御值升序排列
               select * from sanguo 
               where country in("魏国","蜀国") and sex="男" and name like "___" 
               order by fangyu ASC;
    3.limit(永远放在SQL语句的最后)
        1.作用: 限制显示查询记录的个数
        2.用法
            1.limit n --> 显示n条记录
            2.limit m,n
                m : 表示从 m + 1 条记录开始显示
                n : 表示显示 n 条
                limit 2,4 : 显示第三条开始 共四条(3,4,5,6)
                limit 0,2 : 显示1,2两条记录
        3.示例
            1.在蜀国英雄中查找攻击值前三名且名字不为NULL的英雄姓名,攻击值和国家
                select name,gongji,country from sanguo
                where country = "蜀国" and name is not NULL
                order by gongji DESC
                limit 3;
            2.在蜀国英雄中查找防域值倒数第二名至倒数第四名的英雄
                select * from sanguo 
                where 
                country = "蜀国" 
                order by fangyu limit 1,3;
        4.分页
            每页显示5(n)条记录,显示第4(m)页
            第1页: limit 0,5  # 1 2 3 4 5
            第2页: limit 5,5  # 6 7 8 9 10
            第3页: limit 10,5  # 11 12 13 14 15
            第4页: limit 15,5  # 16 17 18 19 20
            分页公式:limit (m-1) * n , n
    4.聚合函数
        1.分类
            avg(字段名) : 平均值
            max(字段名) : 最大值
            min(字段名) : 最小值
            sum(字段名) : 求和
            count(字段名) : 统计该字段记录的个数
        2.示例
            1.攻击力最强值
                select max(gongji) as zq from sanguo;
            2.统计一下表中id name字段分别有多少条记录
                select count(id),count(name) from sanguo;
                ## 空值NULL不会被记录
                    select count(*) from sanguo;
    5. group by
        1.作用 : 给查询的结果进行分组
        2.示例
            1.计算所有国家的平均攻击力,显示国家名和平均攻击力
                select country,avg(gongji) from sanguo
                group by country;
                先分组-再聚合-去重
                 蜀国
                 蜀国  400  蜀国
                 蜀国
                 魏国  300  魏国
                 魏国
                 吴国  200  吴国
            2.查找所有国家中,英雄数量最多的前两名,显示国家名称和英雄数量
                select country,count(name) as number from sanguo
                group by country
                order by number desc 
                limit 2;
            3.注意
                1.group by之后的字段名必须要为select之后的字段名,
                如果select后的字段名和group by之后的字段不一致,
                则必须对该字段进行聚合处理(聚合函数)
    6.having
        1.作用 : 查询结果进一步筛选
        2.示例
            1.找出平均攻击力大于105的国家的前2名,显示国家名称和平均攻击力
                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.where只能操作表中实际存在的字段,having操作由聚合函数生成的显示列
    7.distinct
        1.作用: 不显示字段的重复值
        2.示例
            1.sanguo表中有哪些国家
                select distinct country from sanguo;
            2.计算魏国一共有多少个英雄
                select count(distinct name) as number from sanguo
                where country = "魏国";
        3.注意
            1.处理distinct和from之间的所有字段,所有字段值必须全部完全相同才可以去重

7. 约束
    1.作用
        保证数据完整性 一致性 有效性的规则
    2.约束分类
        1.默认约束(default)
            1.插入记录时,如果不给该字段赋值,则使用默认值
            2.字段名 数据类型 default 默认值
        2.非空约束(not null)
            1.不允许该字段值有NULL记录
            2.字段名 数据类型 not null default 值
8.索引
    1.索引优缺点
        1.优点
            加快数据的检索速度
        2.缺点
            1.当对表中数据进行增加 修改 删除时,索引需要动态维护,降低了数据的维护速度
            2.索引需要占用物理存储空间

select user_id,count(user_id) from comment
group by user_id
order by count(user_id) DESC
limit 10;

    .练习
        1.找出攻击力高于150的蜀国英雄的名字和攻击值
            select name,gongji from sanguo where gongji > 150 and country = "蜀国";
        2.将赵云的攻击力改为666,防御力改为88
            update sanguo set gongji = 666,fangyu = 88 where name = "赵云666";
        3.查找蜀国和魏国的英雄信息
            select * from sanguo where country = "蜀国" or country = "魏国";
        4.将吴国英雄中攻击值为110的英雄的攻击值设置为100,防御力设置为60
            updata sanguo set gongji = 100,fangyu = 60 where gongji = 110 and country = "吴国";