1.什么是数据库?
    存储数据的仓库

2.提供数据库服务的软件有哪些?
    关系型:mysql
    非关系型:mongodb 
    mysql和mariaDB基本一模一样,一个团队做的。   
 
3.生产环境中,如何选择使用哪个数据库?
    1、是否开源(开源不等于免费)
        1、开源:mysql、mariadb、 mongodb
        2、商业软件:oracle、sql_server

    2、是否跨平台
        1、不跨平台:sql_server 只能用在windows
        2、跨平台:mysql、mariadb、 mongodb、oracle

    3、公司的类型
        1、商业软件:政府部门、金融机构
        2、开源软件:游戏网站、电商网站

4、mysql特点:
    1、关系型数据库
        1、关系型数据库特点:
            1、数据是以行和列(表格)形式存储
            2、表中行叫记录,表中列叫字段
            3、表和表之间的逻辑关联叫关系
            4、示例:
                1、关系型数据库存储
                    表1 :学生信息表
                        姓名      年龄      班级
                  
                    表2:班级信息表
                        班级        班主任
                 

            2、非关系型数据库存储
                {
                    姓名:佩琦,
                    年龄:20,
                    班级:三班,
                    班主任:儒入修,
                }
    
        2、跨平台:支持unix、linux、windows上部署数据库服务

        3、支持多种编程语言。
            python java php ....

        4、数据库软件、数据库、数据仓库概念:
            1、数据库软件
                一个软件,看得见,可操作。
            2、数据库
                逻辑概念,实现存储数据的功能。
            3、数据仓库
                数据量:比数据库庞大的多
                侧重点:数据库侧重存储,数据仓库侧重于数据分析和数据挖掘。

5、mysql操作:
        1.启动连接
            1.mysql -h 主机地址(可选) -u 用户名 -p 密码
            2.退出:exit | quit
            3.sudo /etc/init.d/mysql restart 重启

        2.基本sql命令
            1.sql命令使用规则
                1.每条命令必须以;结尾
                2.sql命令不区分字母大小写
                3.使用\c来终止当前命令执行
        
            2.库的管理
                1.mysql数据库结构
                    mysql数据库 >>> 多个库 >>> 多个表 >>> 多个行(元素)
                2.库的基本操作
                    1.查看已有的库
                        show databases;
                    2.创建库
                        create database 库名;
                            指定创建库的字符编码
                                create database 库名 character set utf8;
                    
                    3.查看创建库的语句
                        show create database 库名;
                    
                    4.查看当前所在库
                        select database();
                    
                    5.切换库
                        use 库名;
                    
                    6.查看库中已有表
                        show tables;
                    
                    7.删除库
                        drop database 库名;

                    8.库的命名规则
                        1.数字、字母、下划线,但不能使用纯数字;
                        2.库名区分字母大小写;
                        3.不能使用特殊字符和mysql关键字;

                    9.更改库的默认字符集
                        1.方法(更改配置文件)
                            1.步骤: 
                                cd /etc/mysql/mysql.conf.d
                                cp mysqld.cnf mysqld.cnf.bak 备份配置文件
                                vi mysqld.cnf #配置文件
                                在mysqld下面添加一行character_set_sever = uft8
                                重启mysql
        
        3.表的管理
            1.表的基本操作
                1.创建表
                    create table 表名(
                        字段名1 数据类型
                        字段名2 数据类型);

                2.创建指定字符集的表
                    create table 表名(
                    字段名1 数据类型
                    字段名2 数据类型)character set utf8;

                    create table 表名(
                    字段名1 数据类型
                    字段名2 数据类型)charset utf8;
                
                3.查看创建表的语句(字符集、存储引擎)
                    show create table 表名;
                
                4.查看表结构
                    desc 表名;

                5.删除表
                    drop table 表名;
                
                6.删除表数据
                    delete from 表名 where 表达式; delete是在删除数据行的层面操作。
                    delete from 表名;  delete 相当于用橡皮擦。
                    truncate 相当于删除表后再重建一个,全清空的话,效率比较高
        
        4.注意:
            1.当你创建完库和表之后,他就会以在数据库的目录下以目录和文件的形式存储。
            2..frm是存放的表结构,.ibd存放的是表信息
            3.数据库目录:/var/lib/mysql
        
        5.表记录的管理
            1.插入表记录(insert)
                insert into 表名 (字段1,字段2,字段3) values (值1,值2,值3),(值1,值2,值3),(值1,值2,值3);
                insert into 表名 (字段1,字段2,字段3) values (值1,值2,值3);
                insert into 表名 values (值1,值2,值3);

            2.查询表记录(select)
                select * from 表名;
                select * from 表名 where 条件;
                select 字段1,字段2 from 表名 where 条件;

6.客户端把数据存储到数据库服务器上的过程
    连接到数据库 >>> 选择库 >>> 修改表 >>> 断开与数据库的连接

7.数据类型
    1.数值类型(分为有符号和无符号)
        1.整型
            1.int 大整型(一个int占4个字节空间)
                (-2的31次方) ~ (+2的31次方)-1
                0~(2的32次方)-1
            
            2.tinyint 微小整型(一个tinyint占据1字节空间)
                1.有符号(signed): -128 ~ +127
                2.无符号(unsigned):0 ~ 255
                age tinyint unsigned
            
            3.smallint 小整型(一个smallint占据2字节)
                -2的15次方~(+2的15次方)-1
                (+2的16次方)-1

            4.meiumint()

            5.bigint极大整型(一个bigint占8个字节)
                -2的63次方~(+2的63次方)-1
                2的64次方

            *zerofill 是当数字不足指定位数时在数字前面填充0

        2.浮点型
            1.float(浮点型 四个字节)
                1.用法:
                    score float(m,n) 
                    m不含小数点总位数
                    d小数点后位数
                    最多显示七个有效位

            2.double(双精度 八个字节)
                    double(m,d)
                    15个有效位

            3.decimal(m,n)定点型
                    decimal是把整数、小数分开存储,比float精确
                    规则:将9的倍数封装为4个字节
    

    2.字符类型
        1.char(定长,即固定的最大字符数,非字节。)
            取值范围:1~255
            浪费系统空间性能高,因为针对定长,无论够不够指定长度,时即都占据指定的长度(假设为n),如果不够n个长度,则会用空格在末尾补至N个长度。
        
        2.varchar(变长)
            取值范围:1~65535
            节省系统空间,性能低,因为边长是在每组数据前有一个1~2字节的前缀,前缀里声明了字符长度,便于读取,所以变长不用空格补齐。

        3.text/longtext
            存储大文本内容,但搜索速度较慢,不需要加默认值或指定长度
        
        4.blob/longblob
            存储二进制信息,如图片,视频等,也可以存储文字,blob在于防止因为字符集问题而导致信息丢失,如oxff字节在acsii字符集中被认为非法,会被过滤掉,但是blob则不会出现此问题。

    3.枚举类型
        enim 选一个
        set 选一个或多个

    4.日期时间类型
        1.date:'YYYY-MM-DD'
        2.time:'HH:MM:SS'
        3.datetime:'YYYY-MM-DD HH:MM:SS' 不给值默认返回null
        4.timestamp:'YYYY-MM-DD HH:MM:SS' 不给值默认返回当前时间
        5.日期时间函数:
            1.now():返回系统当前时间,'YYYY-MM-DD HH:MM:SS'
            2.curdate():返回当前日期,'YYYY-MM-DD'
            3.curtime():返回当前时间,'HH:MM:SS'
            4.year(date):取出年份
            5.date(date):取出日期
            6.time(date):取出时间

8.表字段操作
    1.语法:alter table 表名 执行动作;
    2.添加字段(add)
        alter table 表名 add 字段名 数据类型;  默认添加到最后
        alter table 表名 add 字段名 数据类型 first;  在最开始增加字段。
        alter table 表名 add 字段名1 数据类型 after 字段名2;  在字段2后面增加字段1
    3.删除字段(drop)
        alter table 表名 drop 字段名;
    4.修改数据类型(modify)
        alter table 表名 mondify 字段名 新数据类型
    5.字符类型宽度和字符类型宽度区别
        1.数值类型的宽度为显示宽度,只用于select查询时显示,和存储无关,可用zerofill查看效果。
        2.字符类型宽度超过之后无法存储。

9.表记录的管理 
    1.删除表记录(delete)
        1.delete from 表名 where 条件;    不加where,删除全部表记录
    2.更改表记录(update)
        1.update 表名 set 字段1 = 值1,字段2 = 值2 where条件;    不加where,更改全部表记录

10.运算符操作
    1.数值比较&&字符比较&&逻辑比较
        1.数值比较: = != > >= < <=
        2.字符比较: = !=
        3.逻辑比较: and ;or ;between 值1 and 值2 
                            where id between 100 and 200;
                            where id >= 100 and id <= 200
    2.范围内比较
        1.in:where 字段名 in (值1,值2)
        2.not in:where 字段明 not in (值1,值2)
    3.匹配空、非空
        1.where 字段 is NULL
        2.were 字段 is not NULL
    4.注意:
        1.NULL:空值,只能用is、is not 去匹配
        2."":空字符串,用=、!=去匹配

11.模糊查询(like)
    1.where 字段 like 表达式
    2.表达式    
        %:匹配0到多个字符;select name from sanguo where name like "赵%"
        _:匹配1个字符;select name from sanguo where name like "赵_"

12.sql查询
        select ....聚合函数 from 表名 where ... group by ... having ... order by ... limit

    1.聚合函数
        1.分类
            avg(字段):平均值
            max(字段):最大值
            min(字段):最小值
            sum(字段):总和
            count(字段):统计该字段记录的条数
    
    2.where 跟条件表达式

    3.group by 给查询的结果进行分组
        select 字段1,avg(字段2) from 表名 group by 字段1

        分组               聚合函数             去重
        蜀国
        蜀国                    100                吴国
        蜀国

        吴国
        吴国                    101                吴国
        吴国

        *group by后字段名必须要为select后的字段
        *如果查询字段和group by后字段不一致,则必须对该字段进行聚合处理(聚合函数)

    4.having 对分组聚合后的结果进行进一步筛选,即having可以操作聚合语句
        select 字段1,avg(字段2) from 表名 group by 字段1 having avg(字段2)>条件 order by avg(字段2) 排序 limit 显示数量;

        *having 语句通常与group by联合使用
        *having语句存在弥补了where关键字不能与聚合函数联合使用的不足,where只能操作表中实际存在的字段,having操作的是聚合函数生成的显示列

    5.order by 给查询结果进行排序
        1. order by 字段名 ASC(升序)/DESC(降序)

    6.limit 永远放在sql语句的最后
        1.limit n  显示n条记录
        2.limit m,n  从第m+1条记录开始,显示n条
            limit 2,3  显示第3、4、5三条记录
        3.分页
            每页显示m条记录,显示第n页的记录
            limit (n-1)*m,m

    7.distinct:不显示字段的重复值
        select distinct 字段 from 表名;
        select distinct 字段1,字段2 from 表名; 如果两个字段值都相同才去重
        select count(distinct 字段) from 表名; 
        *distinct 和 from 之间所有字段值都相同才会去重。

    8.查询表记录时做数学运算
        运算符 +(加) -(减) *(乘) /(除) %(取余)
       例:select 字段1,字段2*2 as 自定义字段名 from 表名;

13.嵌套查询(字查询)
    1.定义:把内层的查询结果作为外层的查询条件
    2.语法:
        select ... from 表名 where 字段名  运算符 (select ....)
    3.例:
        select avg(age) from class ; +  select name,age from class where age < 平均值; == select name,age from class where (select avg(age) from class)
        *注意,where后的表达式中前面是什么运算符,后面一定要跟相对应的值

        嵌套查询效率比较低
    
14.多表查询
    1.两种方式
        1.不加where条件(笛卡尔积)
            select * from 表1,表2,表3;
            select 表1.字段,表2.字段,表3.字段 from 表1,表2,表3;

        2.加where条件
            select 表1.字段1,表2.字段1 from 表1,表2 where 表1.字段2 运算符 表2.字段2

        3.连接查询
            1.内连接(inner join)
                1.语法格式
                    select .... from 表1 inner join 表2 on 条件 inner join 表3 on 条件;
                    可以无限循环下去,以inner join 表4 on 条件为一段

            2.外连接
                1.左连接 (left join)
                    1.以左表为主显示查询结果
                        select .... from 表1 left join 表2 on 条件 inner join 表3 on 条件;
                        即左表全部显示,左表有而右表没有的则显示左表:null

                2.右连接(right join)
                    1.以右表为主显示查询结果
                        select .... from 表1 right join 表2 on 条件 inner join 表3 on 条件;
                        即以右表

15.约束
    1.非空约束(not null)
        1.不允许该字段的值为null
        ## name varchar(20) not null ;
    2.默认约束(default)
        1.插入记录时,不给该字段赋值,则使用默认值
        ##sex enum ('M','F','S') not null default 'S';

16.索引
    1.定义:对数据库表的一列或者多列的值进行排序的一种结构(BTree方式)

    2.优点:加快数据的检索速度

    3.缺点:
        1.占用物理空间
        2.当对表中数据更新时,索引需要动态维护,占用系统资源,降低数据维护速度

    4.索引示例。
        1.开启运行时间检测
            show variables like 'profiling';
            查看sql语句执行命令的时间检测是否打开
            set  profiling=1;在终端打开为临时,如果mysql退出,下次进入则需要再次启动。修改配置文件才能永久打开。

        2.执行查询语句(没有索引)
            select name from t1 where name = 'lucy8888';

        3.在某一字段创建索引
            create index 字段 on 表名(索引名(一般为字段名)); 

        4.执行查询语句(有索引)
            select name from t1 where name = 'lucy8888';

        5.对比执行时间
        show profiles;
    

    5.索引分类
        1.普通索引(index) && 唯一索引(unique)
            1.使用规则
                1.可设置多个字段
                2.约束
                    普通索引:无约束    key标志 MUL
                    唯一索引:字段值不允许重复,可为null    key标志 UNL
                    索引标志在desc中可以看到
                3.把经常用来查询的字段设置为索引字段,不要将经常做写操作的字段设置为索引字段。
            2.创建表创建
                create table 表名(
                    字段名数据类型
                    index(字段1),
                    index(字段2),
                    unique(字段1)
                    unique(字段2)
                );

            3.已有表创建
                create [unique] index 索引名 on 表名 (字段名)

            4.查看索引
                1.desc 表名;    查看key标志
                2.show index from 表名;     
                3.show index from 表名/G;     
                    Non_unique   1普通索引    0唯一索引
                    Key_name   索引名
                    Column_name   字段名

            5.删除索引
                drop index 索引名 on 表名;

        2.主键(primary key) && 自增长(auto_increment)
            1.使用规则:
                1.主键只能有一个,但可以创建复合主键。
                2.约束:字段值不允许重复,且不能为null
                3.key标志:PRI
                4.通常设置编号id为主键,能唯一锁定1条记录

            2.创建表时创建
                create table 表名(
                    id int primary key auto_increment,
                    .....................
                );

            3.在已有表创建
                alter table 表名 add primary key(id);

            4.复合主键
                create table t1(
                    id int primary key auto_increment,
                    name varchar(20),
                    primary key(id,name)
                );
                复合主键同时不能为null,也同时不能重复。

            5.删除
                1.先删除自增长
                    alter table 表名 modify id int;
                2.删除主键
                    alter table 表名 drop primary key;

        3.外键(foreign key)
            1.定义:让当前表字段的值在另一个表范围内选择。

            2.语法
                foreign key (参考字段名)
                references 主表(被参考字段名)
                on delete 级联动作
                on update 级联动作

            3.使用规则  
                1.主表、从表字段数据类型要一致
                2.主表被参考字段:主键
                
            4.示例
                1.缴费信息表(财务)
                    id            姓名         班级      缴费
                    1          唐伯虎       AID08     300
                    2          点秋香       AID08     200

                    create table jftab(
                        id int primary key,
                        name varchar(20) not null,
                        class char(5) default 'AID',
                        money smallint
                    )charset = utf8;

                    insert into jftab values
                    (1,'唐伯虎','AID08',300),
                    (2,'点球','AID08',200);

                2.学生信息表(班主任)
                    stu_id      姓名      缴费金额
                    create table bjtab(
                        stu_id int,
                        name varchar(15)
                        money smallint,
                        foreign key(stu_id) references jftab(id)
                        on delete cascade
                        on update cascade
                    );

 

            5.删除
                1.查看外键名
                    show create table bjtab;
                2.删除外键
                    alter table 表名 drop foreign key 外键名;
            
            6.在已有表中添加外键
                alter table bjtab add foreign key(stu_id)
                references jftab(id)
                on delete set null
                on update set null;

            7.级联动作
                1.cascade
                    数据级联删除、更新(参考字段)
                
                2.set null
                    从表有相关联记录,字段值设置为null

                3.restrict(默认)
                    从表有相关联记录,不让主表删除、更新