WEB06-MYSQL
    MYSQL的数据库的概述
        什么是数据库:就是一个文件系统,通过SQL访问
        常见关系型数据库:mysql,Oracle,SQLServer...
    SQL对数据库和表操作
        对数据库进行CRUD的操作
        对表进行CRUD的操作
        day07-mysql回顾
            SQL的概述
                SQL:结构化的查询语言.
                分类:
                    DDL:数据定义语言
                        create,alter,drop...
                    DML:数据操纵语言
                        update,insert,delete
                    DCL:数据控制语言
                        grant,if..
                    DQL:数据查询语言
                        select
                特点:
                    非过程性语言: 一条语句就会有一个运行的结果
            SQL对数据库和表操作
                对数据库进行CRUD的操作
                    创建数据库
                        create database 数据库名称 [character set 字符集 collate 字符集校对];
                    查看数据库
                        查看数据库服务器中所有的数据库:
                            show databases;
                        查看某个数据库的定义信息.
                            show create database 数据库名;
                        查看当前正在使用的数据库信息.
                            select database();
                    删除数据库
                        删除数据库:
                            drop database 数据库名;
                    修改数据库
                        修改数据库修改的是的数据库的字符集和校对规则.
                            alter database 数据库名 character set 新字符集 collate 校对规则;
                    切换数据库
                        use 数据库名称;
                
                对表进行CRUD的操作
                    创建表
                        语法:
                            create table 表名 (
    字段名 类型(长度) 约束,
    字段名 类型(长度) 约束,
    字段名 类型(长度) 约束
);
                        数据类型:
                            Java类型
                                MySQL
                             byte/short/int/long
                                tinyint/smallint/int/bigint
                            String
                                char/varchar
                                    区别?  char是固定长度的字符串,varchar可变长度的字符串.
                                        char(8) 和 varchar(8)
                                        如果插入一个字符串hello 插入到char 那么 插入hello   .
插入到varchar中 插入hello
                            float
                                float
                            double
                                double
                            boolean
                                bit
                            Date
                                date/time/datetime/timestamp
                                    datetime和timestamp都是既有日期又有时间的日期类型
                                    区别? datetime需要使用外部传入的日期.如果没传这个值就是Null. timestamp会使用系统当前的时间作为这个值的默认值.
                            ***** MYSQL中除了字符串类型需要设置长度其他的类型都有默认长度.
                            文件
                                文本文件
                                    Text
                                二级制文件
                                    BLOB
                                ***** Oralce使用CLOB/BLOB 对应文本文件/二进制文件
                        约束:
                            单表约束:
                                主键约束:primary key (默认就是唯一非空的)
                                唯一约束:unique
                                非空约束:not null
                    
                    表的查看
                        查看数据库中有哪些表:
                            show tables;
                        查看表结构:
                            desc 表名;
                    表的删除
                        drop table 表名;
                    
                    表的修改
                        修改表添加列:
                            alter table 表名 add 列名 类型(长度) 约束;
                                alter table employee add image varchar(50);
                        修改表删除列:
                            alter table 表名 drop 列名;
                                alter table employee drop job;
                        修改表的列的类型长度及约束:
                            alter table 表名 modify 列名 类型(长度) 约束;
                                alter table employee modify image varchar(80) not null;
                        修改表的列名:
                            alter table 表名 change 旧列名 新列名 类型(长度) 约束;
                                alter table employee change image eimage varchar(60);
                        修改表名:
                            rename table 旧表名 to 新表名;
                                rename table employee to user;
                        修改表的字符集:
                            alter table 表名character set 字符集;
                                alter table user character set gbk;
            MYSQL的数据库的概述
                什么是数据库:就是一个文件系统,这个文件必须通过标准的SQL访问
                关系型的数据库存放的都是实体之间的关系.
                常见关系型数据库
                    MySQL        :免费的小型的数据库,现在被Oracle收购.
                    Oracle        :Oracle公司收费的大型的数据库.
                    SQLServer    :微软公司收费中型的数据库.
                    DB2            :IBM公司收费的大型的数据库.
                    SyBase        :SyBase公司收费的数据库.已经被淘汰.PowerDesigner数据建模的工具.
                    SQLite        :小型的嵌入式的数据库.
                    ***** Java程序中经常使用的数据库
                        MySQL
                        Oracle
    SQL对单表记录操作
        day08-mysql表
操作回顾
            SQL对单表记录操作
                插入记录:insert
                    insert into 表名 (列名,列名,...) values (值1,值2,...);
                        ---插入指定列的值
                    insert into 表名 (列名,列名,...) values
 (值1,值2,...),
 (值1,值2,...),
 (值1,值2,...);
                        -- 批量插入
                    insert into 表名 values (值1,值2,...);
                        ---插入所有列的值
                    插入中文报错
                        修改MYSQL的安装路径/my.ini文件 client 编码为gbk
                            重新启动mysql服务
                        注意事项:
                        * 列名的个数与值的个数对应.
                        * 列的类型与值的类型对应.位置也要对应.
                        * 列的类型如果是字符串或者日期,写值的时候使用单引号将值引起来.
                        * 插入的值的最大长度不能超过列的最大长度.
                
                修改记录:update
                     update 表 set 列名=值,列名=值 [ where 条件];
                        注意事项:
                            * 列名和值类型也要一致.
                            * 值不能超过列的最大长度.
                            * 值是字符串或日期,需要使用单引号.
                
                删除记录:delete
                    delete from 表 [ where 条件];
                        注意事项:
                            * 删除表中的一行记录,不能删除某列值
                            * 如果没有条件删除表中的所有列.
                    删除表中的所有记录 truncate 表名 和 delete from 表名区别?
                        truncate table 删除表的记录:将整个表删除掉,重新创建一个新的表. truncate 属于DDL.
                        delete from 删除表的记录:一条一条进行删除. delete属于DML。
                        事务管理 只能作用在DML语句上.如果在一个事务中使用delete删除所有记录,可以找回 rollback.
                
                查询记录:select
                    基本查询
                        select [distinct] *|列名 from 表 [where 条件];
                    别名查询
                        使用 as 起别名, as 可以省略.
                    条件查询
                        =  >  <  >=  <=  <>
                            between 值1 and 值2
                        like
                            可以使用占位符: _ 和 %  :下划线匹配一个字符, %:可以匹配任意多个字符
                         in
                            后跟着一组值
                                id in (1,2,3)
                        and or not
                        is not null ; is null
                        limit
                            数据分页,是MySQL所特有的关键字 (orcale: rownum sqlserver : top)
                                两种
                                    limit  值
                                        查询前 几(值) 条
                                    limit 从哪开始, 向后获取几条
                                        分页显示数据
                                            limit 0,10
                                                第一页显示10条数据
                                            limit 10,10
                                                第二页显示10条数据
                    排序:order by
                        asc 升序(默认)
                        desc 降序
                    聚合函数:
                        sum()
                            ifnull(english,0)
                                如果english是null的话,就把它改为0
                                    任何值+null = null
                        count(*)
                        max()
                        min()
                        avg()
                    where 和 having的区别?
                        where 用于分组前 后不能跟聚合函数
                        having 用于分组后 可以跟聚合函数
                    分组:group by
                        分组条件过滤:having
                    SQL的查询语句的总结
                        顺序:    s...f...w...g...h...o...;
            SQL对多表记录操作
                多表设计:
                    正确分析表关系:
                        一对多:在多的一方创建一个字段,这个字段作为外键指向一的一方的主键
                            客户和订单:一个客户可以产生多个订单,一个订单只能属于是某一个客户.
                            部门和员工:一个部门下可以有多个员工,一个员工只能属于某一个部门.
                        
                        多对多: 创建一个中间表,中间表中至少需要两个字段分别作为外键指向多对多双方的各自的主键
                            学生和课程:一个学生可以选择多门课程,一门课程可以被多个学生选择.
                            订单和商品:一个订单中包含多个商品,一个商品也可以出现多个订单中.
                        
                        一对一:(很少)
                            唯一外键对应:
                                假设一对一的双方是一对多的关系.在多的一方创建外键指向一的一方的主键.需要在外键上添加一个unique约束
                            主键对应:
                                将一对一的双方的主键建立映射
                        案例
                            实现权限
                                1. 通过五张表设计
                                    user, role(角色), resources(资源), 还有两张中间表
                                2. 权限框架  shiro
                                    跟着开涛学shiro
                    
                    ***** 约束:用来保证数据的完整性.
                        * 多表约束:外键约束!!!
                
                多表查询:
                    连接查询
                        笛卡尔积连接(交叉连接)
                            select * from A , B ;
                        内连接 :
                            inner join -- inner 可以省略
                                显式内连接
                                    select * from A inner join B on 条件;
                                        SELECT * FROM customer c INNER JOIN orders o ON c.cid = o.cid;
                                隐式内连接
                                    select * from A,B where 条件;
                                        SELECT * FROM customer c ,orders o WHERE c.cid = o.cid;
                                查询的结果都是两个表的交集
                        
                        外连接
                            outer join -- outer 可以省略
                                左外连接:
                                    left outer join  -- select * from A left outer join B on 条件;
                                        SELECT * FROM customer c LEFT OUTER JOIN orders o ON c.cid = o.cid;
                                    查询的是左边表的全部和两个表的交集
                                右外连接:
                                    right outer join -- select * from A right outer join B on 条件;
                                        SELECT * FROM customer c RIGHT OUTER JOIN orders o ON c.cid = o.cid;
                                    查询的是右边表的全部和两个表的交集
                                查询的是主表中的所有以及从表中符合条件的数据,如果从表中没有数据的话,用 null 填充
                        子连接
                            一个SQL需要依赖另一个SQL语句的查询结果
        插入记录:insert
        删除记录:delete
        修改记录:update
        查询记录:select
            基本查询
            别名查询
            带条件查询
                = > < >= <= <>
                like , in
                and or not
            排序:order by
            聚合函数:sum,count,max,min,avg
            分组:group by
            分组条件过滤:having
    SQL对多表记录操作
        多表设计:
            正确分析表关系:
                一对多:在多的一方创建外键指向一的一方的主键
                多对多:创建中级表,中级表至少两个字段,分别指向双方主键
                一对一:(很少)
        多表查询:
            连接查询
                交叉连接
                内连接
                    隐式内连接:where
                    显式内连接:inner join  ... on
                外连接
                    左外连接:
                    右外连接:
            子查询
                一个SQL需要依赖另一个SQL语句的查询结果