1、MySQL的DDL语句     
               MySQL中字符的大小写
                          SQL关键字及函数名不区字符大小写;
                          数据库、表、索引及视图的名称是否区分大小写取决于低层的OS及FS;
                          存储过程、存储函数及事件调度器不区分字符大小写;但触发器区分;
                          表别名不区分大小写;
                          字段中字符数据,类型为binary、blog、varbinary时区分大小写;其它的不区分;

              DDL:CREATE/ALTER/DROP 
                          CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
                          MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%char%'; 
                          DROP {DATABASE | SCHEMA} [IF EXISTS] db_name  
                    表:
                          约束:PRIMARY KEY, UNIQUE KEY, FOREIGN KEY 
                          索引:特殊的数据结构,用于快速找到数据记录(行) 
                                    键可用作索引;并非所有索引都是键;
                          索引类型:B-Tree (B+ Tree) (左前缀), hash (key-value), R-Tree, FullText 
                          索引优点:
                                     减少服务器扫描数据量 
                                     创建索引后该字段本身就为排序后结果,查找时可以尽量避免排序时创建临时表  
                                     索引可以将随机I/O转换为顺序I/O  

              B-Tree (B+ Tree) (左前缀)索引:
                            全值匹配:比较操作符=、<=>
                            左前缀匹配:like ‘string%’
                            列前缀匹配:
                            匹配范围值:  
                            组合索引:第一列必须为精确匹配,之后可以为范围匹配。     

              聚集索引、非聚集索引
                          聚簇索引:索引和数据一起存放;
                          非聚簇索引:索引和数据分开存放,而数据记录未必顺序存放;但索引数据一般顺序存放;   
  
                          MyISAM为非聚集索引,InnoDB为聚集索引。 一个表只能有一个聚集索引,对InnoDB来说一般为主键索引,

              注意事项:
                         MyISAM是支持全文索引的,但不支持外键。InnoDB不支持全文索引。现在大多引擎为InnoDB ,只有InnoDb可以设置表空间 TABLESPACE tablespace_name [STORAGE {DISK|MEMORY|DEFAULT}]

             常用命令:
                          help create | alter | drop;查看相关创建语句帮助。
                          show global variables like '%char%';:显示字符集
                          help create table: 查看创建表的相关信息
                          create temporary table test (name char(20));:创建临时表。临时表内存不能超16M,如超变为磁盘临时表,性能很差。
                          create table tb1 (name char(20),gender enum('m','f'),primary key(name));  创建带主键的表 
                          create table tb2 (name char(20),gender enum('m','f'),primary key(name)) engine 'innodb';:修改存储引擎
                          create table tb5 select * from tb1;:把tb1中的表结构和数据 一起复制到tb5中,表中属性不复制。
                          create table tb3 like tb2;:复制tb2表结构创建新表tb3只复制表结构,并复制表中所有属性;
                          insert into tb1 values('xj','f'),('tan','m'),('zhang','m');:插入数据 
                          show index form tables;:显示索引
                          show global variables like '%storage%';:显示存储引擎。 
                          show engines;:查看当前支持的存储引擎。
                          show table status like 'tb1'\G:查看表的相关属性。

2、MySQL的DDL语及索引的使用策略
          help drop table tbname;:查看删除表的命令。

          常用语句:
                 alter table tb3 drop primary key;:删除主键。
                 alter table tb3 add index (gender);:在gender字段上添加索引。默认为b-tree索引。
                 alter table tb3 drop index name;:删除tb3表中name的索引。
                 alter table tb3 rename to tb4;修改tb3表名为tb4。
                 drop index index_name on tb_name;删除索引;

3、SELECT查询语句  DML(CRUD)

INSERT INTO

UPDATE

DELETE


INSERT的3种表达方式:

INSERT [INTO] tbl_name [(col_name,...)]  {VALUES | VALUE} (...),...

批量插入

        例如:insert into tb5 (name,geder) values ('zhangsan','m'),('lisi','f')...     

INSERT [INTO] tbl_name SET col_name={expr | DEFAULT}, ...

       例:insert into tb5 set name='zhangsan',geder='f';

       INSERT  [INTO] tbl_name [(col_name,...)] SELECT ...

        例:DESC tb2;查看是否有效字段

            select * from tb2  (将tb2的查询结果插入tb5)

            insert into tb5 (name,gender) select * from tb2 where gender='f';

            select * from tb5;

        UPDATE:实现单表更新

UPDATE table_reference SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...

   [WHERE where_condition]

   [ORDER BY ...] [LIMIT row_count]

   判断某字段值为空:IS NULL  不空:IS NOT NULL

    ORDER BY col1[,...] {ASC|DESC} LIMIT #

            例如:#cp hellodb.sql

                  >mysql < /tmp/hellodb.sql

                  >use hellodb.sql

                  >update students set age=70 where classid is null; ###classid为空的年龄改为70            

                  >updata students set classID=3 where age<=20;将年龄小于20的classID改成3

                  >update students set classID=3 order by age {ASC|DESC}limit 3;根据年龄排序,只改前3个classID,默认升序;DESC为降

                  >update * from students where age<20 order by age;

        DELETE:

DELETE FROM tbl_name [WHERE where_condition]

    [ORDER BY ...] [LIMIT row_count]

            例如:help delete

                  delete from tb_name where --- order by --- limit n;

                  delete from students where age >60; 删除60岁的

                  delete from students order by age limit 3; 年龄排序,删除前三用户


        SELECT:

SELECT @@GLOBAL.query_cache_size;

+---------------------------+

| @@GLOBAL.query_cache_size |

+---------------------------+

|                  16777216 |

+---------------------------+


SELECT @@GLOBAL.query_cache_type;

+---------------------------+

| @@GLOBAL.query_cache_type |

+---------------------------+

| ON                        |

+---------------------------+

DEMAND:按需进行缓存,意思是只有明确写明要缓存结果的SELECT语句的结果才会进行缓存;


注意:几乎所有的缓存中,缓存的内容都是key-value格式

key: 查询语句的hash码;

value: 查询的语句的执行result;

       

              SELECT values_to_display 

            FROM table_name 

            WHERE expression 逻辑表达式,between 30 and 50, in

            GROUP BY how_to_group  根据指定条件分组,为了聚合,如求和,求平均数等

            HAVING expression  对group by 的结果做过滤

            ORDER BY how_to_sort  排序

            LIMIT row_count; 限定返回值范围

                distinct: 去除重复值。select distinct name form tb5;
  

           聚合函数:
                 AVG(), SUM(), MAX(), MIN(), COUNT();having对聚合结果做过滤。
          
           连接查询:
                cross join:笛卡尔积,
                 inner join:内连接
                 outer join:外连接,分为lift outer join左外连接和right out join右外连接
                SELECT US.user_name,x.FK_ROLE_ID FROM USER US LIFT JOIN USER_ROLE x on US.PK_ID = x.FK_USER_ID
                 natural join:等值连接

           常用语句:
               update tb5 set name='xxxx' where name='xj';     
               update tb5 set gender='f' order by name limit 1;:只修改排序后的第一条用limit 1。
               show global variables like 'query_cache%';:查询缓存大小,只要大于0的值都为开启缓存,0表示缓存关闭
               SELECT @@GLOBAL.query_cache_size;:也可以查看缓存是否启用。
               select current_time();:显示时间。
               SELECT @@GLOBAL.query_cache_type;:查询后有三种值(demand、on、off)      
                         demand:按需进行缓存,由用户决定哪些语句需要缓存,
                         on:又mysql决定哪些查询语句结果需要缓存。

4、子查询、视图及EXPLAIN
         联合查询:
                   SELECT statement UNION SELECT statement:把多个查询结果联合在一起为一个结果,字段数必须一样。

         视图:VIEW,存储下来的select语句
                  create view view_name as select * from tabel_name ;

          explain :分析执行的sql语句。肯以更具分析结果优化数据库。
                       explain select * from tb5\G