一、数据库管理系统DBMS
    软件

    写程序时需要做的:
        a、数据库在本地
            1、找到目录
            2、添加数据
        b、数据库在远程
            1、socket连接上远程机器
            2、socket发送(命令)

    我们需要做些什么:
        a、
            A、程序
                程序,socket客户端
            B、数据
                socket服务端
            C、制作一套规则
                ...
            D、socket客户端和服务端用户认证,授权,限制

    有人做了一套软件,已经做好了以上操作:
    -- SqlServer(收费),Oracle,sqlite,access...MySQL

二、下载安装(解压方式)

1.下载地址https://dev.mysql.com/downloads/file/?id=476476 点击最下面No thanks,just start my download
2.解压到任意目录
3.服务器端运行(命令行下)
    mysqld(报错的话在指定位置下新建data目录)
    初始化:mysqld --initialize-insecure
    mysqld
4.客户端连接(命令行下)
    mysql -u root -p(初始的时候没有密码,直接回车)

简化操作:
    1.设置环境变量
    2.
    将mysql服务端制作成一个Windows服务:
        管理员身份运行cmd,输入mysqld -install
    net start mysql
    net stop mysql


三、MySQL数据库
1、概念

    数据库---文件夹
    数据库表---文件
    数据行---文件中的一行

2、初始:
    show databases; 查看当前MySQL下的数据库

    create database 数据库名; 创建数据库

    use 数据库名; 进入选中数据库

    show tables; 查看当前数据库下的表

    create table 表名(nid int,name varchar(20),pwd varchar(64)); 创建数据表

    select * from 表名; 查看表中的所有数据

    insert into 表名(nid,name,pwd) values(1,'lql','123'); 插入数据

    desc 表名; 以简洁形式查看表中的所有数据

3.用户授权
    用户管理的时候有一些特殊的命令:
        创建用户
            create user '用户名'@'IP地址' identified by '密码';
        删除用户
            drop user '用户名'@'IP地址';
        修改用户
            rename user '用户名'@'IP地址' to '用户名'@'IP地址';
        修改密码
            set password for '用户名'@'IP地址' = Password('新密码')

    权限管理:
        默认什么权限都没有

        grant 权限 on 数据库.表名 to '用户名';
        *:代表所有的

        =======要点:远程连接=======

4.SQL语句

    数据库级别
        显示数据库 SHOW DATABASES;

        默认数据库
            mysql--用户权限相关数据
            test--用于用户测试数据
            information_schema--MySQL本身架构相关数据

        创建数据库 CREATE DATABASE 数据库名称 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

        使用数据库 USE 数据库名称;

        删除数据库 DROP DATABASE 数据库名称;


    表级别
        SHOW TABLES;

        DESC 表名

        ******CREATE TABLE 表名(nid int, name varchar(20))ENGINE=InnoDB DEFAULT defalut CHARSET=utf8;
            InnoDB支持事务,原子操作,回滚
            a.null|not null 是否可以为空
            b.default x 默认值
            c.auto_increment 自增(数字,必须是索引-主键)
            d.primary key||primary key(x,x,x,)主键索引:
                一张表只能有一个主键(可以多列组成主键),唯一不能重复,不能为null,一般情况下自增列设置主键
                唯一索引:
                    可以为null,一张表可以有多个
                    1,2,3,4,5,6,null
                --约束
                --索引,加速查找
            e.foreign key外键,两张表建立约束:
                创建:alter table 从表 add constraint 外键名称(形如:fk_从表_主表) foreign key 从表(外键字段) reference 主表(主键字段)
                删除:alter table 表名 drop foreign key 外键名称
            f.数据类型:数值、时间、字符串
                http://www.runoob.com/mysql/mysql-data-types.html


        修改表
            添加列:alter table 表名 add 列名 类型
            删除列:alter table 表名 drop column 列名
            修改列:
                    alter table 表名 modify column 列名 类型;  -- 类型
                    alter table 表名 change 原列名 新列名 类型; -- 列名,类型

            添加主键:
                    alter table 表名 add primary key(列名);
            删除主键:
                    alter table 表名 drop primary key;
                    alter table 表名  modify  列名 int, drop primary key;

            添加外键:alter table 从表 add constraint 外键名称(形如:FK_从表_主表) foreign key 从表(外键字段) references 主表(主键字段);
            删除外键:alter table 表名 drop foreign key 外键名称

            修改默认值:ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
            删除默认值:ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;


        DROP TABLE 表名; 直接删除表

        DELETE FROM 表名; 清空表 自增接着清空前的
        TRUNCATE TABLE 表名; 清空表 速度快,自增回到原点


    数据行级别
        增删改查:http://www.runoob.com/sql/sql-tutorial.html

        1.导入另一个表的数据:insert into 表名(列名,) select(列名,) from 表名

        2.通配符:%(多个字符串) _(单个字符)

        3.分页:
            select * from 表名 limit x,y;
            select * from 表名 limit y offset x;(推荐)
            (x表示起始位置,y表示取几条)

        4.排序:
            正序 select * from 表名 order by 列名 asc;
            反序 select * from 表名 order by 列名 desc;
            排序后可能出现相同的,对相同的再进行排序 select * from 表名 order by 列名1 排序方式,列名2 排序方式

        5.分组:
            单一分组:select 列名 from 表名 group by 列名;

            ***聚合函数max()取最大,min()取最小,sum()取求和,count()计算数量,avg()平均

            多项分组:select 列名,聚合函数(列名),... from 表名 group by 列名;

            多项分组和改名:select 列名 as 新列名,聚合函数(列名) as 新列名,... from 表名 group by 列名;

            对聚合后的数据进行筛选:
                ...having 条件

        6.联合:
            select 列名 from 表名 union select 列名 from 表名;默认去重   union all不去重

        7.连表:
            select * from 表名,表名; 笛卡儿积

            a. select * from 表名,表名 where 表名.列名 = 表名.列名;
            b. select * from 表名 left join 表名 on 表名.列名 = 表名.列名;右表依赖左表(推荐)
            c. inner join 去null