day02 mysql基本语句 存储引擎 数据类型 完整性约束

day02 mysql
 
一.sql的基本语句
    系统数据库
        information_schema: 虚拟库, 不占磁盘空间(在内存汇中): 存的是数据库启动后的一些参数, 如用户表信息, 列信息, 权限信息, 字符信息等
        performance_schema: 性能信息库: 5.5版本后新增的: 主要用于收集数据库服务性能参数, 如记录处理查询请求时发生的各种事件, 锁等现象
        mysql: 授权库: 主要存储系统用户的权限信息
        test: 测试库: mysql数据库系统自动创建的
    
    数据库的命名规则:
        可以由 字母 数字 下滑线, @ # $ 组成
        区分大小写
        唯一性
        不能使用sql的关键字
        不能单独使用数字
        最长128位
    
    sql语言的分类: sql语言主要用于存取数据, 查询数据, 更新数据和关系关系数据库系统, 分为以下3种类型
        1.DDL语句    数据库定义语言: 数据库, 表, 视图, 索引, 存储过程: 如 create drop alter
        2.DML语句    数据库操纵语言: 对数据的操作: 如增insert 删delete 改update 查select
        3.DCL语句    数据库控制语言: 控制相关: 如访问权限的grant revoke
    
    对数据库sql语句操作
        > create database db1 charset utf8;      //增    charset utf8 加后面指定字符集  
        > drop database db1;                     //删
        > alter database db1 charset gbk;        //改    修改数据库 (alter 改变)
        > select database();                     //查    查看当前所在数据库
        > show create database db1;              //查  
        > show databases;                        //查
        > use db1;                               //用
    
    对表的sql语句操作
        > create table t2 select * from t1;              //复制表        前面创建表 + 后面是创建的方式:把表的内容查出来    既复制了表结构,又复制了表记录
        > create table t3 select * from t1 where 0>1;    //复制表结构    小技巧: 后面查询的时候,查不到记录,那就只剩下表结构了
        > create table t4 like t1;                       //复制表结构    这个是正宗的 
        > create table db1.t2(id int,name char(10));     //增  
        > drop table db1.t1;                             //删
        > alter table t1 modify name char(6);            //改    修改表的字段的属性
        > alter table t1 change name username char(7);   //改    改变表的字段的名字和字段的属性
        > show tables;                                   //查  
        > show create table t1;                          //查    
        > desc db1.t1;                                   //查    查看表结构 (field 字段)
 
    对数据(表记录)的sql语句操作
        > insert into db1.t2(id,name) values(1,'bajie'),(2,'悟空');     //增    db1.t2(id,name)括号里的省略的时候,就是所有字段的值都写
        > delete from t1;                                               //删    删掉所有记录
        > truncate t1;                                                  //删    只能删所有: 删的时候释放自增键; 数据量大时用这个, 快
        > truncate table t1;                                            //删    也可以不加table
        > delete from t1 where id=1;                                    //删
        > update db1.t1 set name='datang'                               //改
        > update db1.t1 set name='xiyou' where id=2;                    //改
        > select * from db1.t2;                                         //查    *最好不用, 对性能消耗大
        > select * from db1.t2 where id = 2;                            //查    带条件查询
 
二.存储引擎(表的类型: 对应mysql不同的存取机制)
    存储引擎就是如何存储数据,如何为存储的数据建立索引和如何更新,查询数据等技术的实现方式,
    因为关系型数据库中数据的存储是以表的形式存储的, 所以存储引擎也可以成为表的类型(即存储和操作此表的类型)
    oracle 和 sql_server等数据库只有一种存储引擎, 而mysql提供了多种
            --------------------------------------------------
                    支持的接口
            标准c的api, jdbc, net, php, python, perl, ruby, vb
----------------------------------------------------------------------------------------------mysql server
企业管理服务和工具                                        连接池                                                ---> client连接我时做的操作                             
备份与恢复                           验证与授权--线程--连接限制--内存与缓存管理        
安全                   ----------------------------------------------------------------------
复制                        sql接口:      数据管理语言,数据定义语言,存储过程,视图,触发器,等等
集群                        解析器:       查询,事务对象优先级
分区管理                    优化:         访问路径统计
事例管理                    缓存和缓冲池: 全局和具体引擎的缓存和缓冲池
数据模板管理           -----------------------------------------------------------------------
工作台                                可插式存储引擎: 内存,索引和存储管理
查询浏览                     MyISAM InnoDB:支持事务 Memory:缓存里的 等等很多类型
合并工具包             -----------------------------------------------------------------------
                        文件系统:                            文件和日志:
                        新技术文件系统: 网络文件系统         rodo undo data index binary
                        存储区域网络和网络附加存储           error query slow
-----------------------------------------------------------------------------------------------
 
    mysql几种搜索引擎的介绍
    InnoDB的表有两个文件(默认新创建表使用的搜索引擎)
        t1.frm: 存的表结构
        t1.idb: 存的数据        //查询时先去找表结构,然后找数据, 所以查询的会很快                                   
    MyISAM的表有三个文件(mysql.user这个表是延续的之前的搜索引擎)
        user.frm:存的表结构
        user.MYD:存的数据
        user.MYI:存的索引
    Memory的表
        t1.frm:存的表结构      //数据都存放在内存中,数据库重启或崩溃,表中的数据都消失,一般应用于临时数据的临时表,默认使用哈希索引,而不是B+树索引
    blackhole的表              //(blackhole 黑洞)
        t1.frm:存的表结构      //正如其名, 插入数据相当如扔入黑洞, 可以应用于主备复制中的分发主库  
   
  mysql支持的所有的存储引擎
    > show engines\G;
   
  查看正在使用的存储引擎
    > show variables like '%engine%';
   
  创建表的时候指定存储引擎
        > create table t1(id int)engine=innodb;
        > create table t2(id int)engine=myisam;
        > create table t3(id int)engine=memory;
        > create table t4(id int)engine=blackhole;    //(affect 影响)
 
    数据库分类
    关系型数据库:
        mysql db2 oricle sqlite :数据一般都在表中储存
    非关系型数据库:
        monogodb redis  :一般用字典的格式key:value存储, 一般用作缓存
 
三.数据类型
    作用: 为每个字段做约束: 约束的作用: 保证数据的一致性和完整性
    数字
        整型: 默认是有符号:
              tinyint 小整型    1字节    [-128 127] [0 255]    //tinyint[(m)] [unsigned] [zerofill]    //(fill 填满)
              int 大整型        4字节    0 40亿+ (integer 也可以)
              bigint 极大整型   8字节
        小数: float    单精度    在位数比较短的情况下使用,不精准     //float[M,D] [unsigned] [zerofill]    //M全长: 最大为255    D小数点后个数: 最大30
              double   双精度    在位数比较长的情况下使用,不精准
              decimal  小数      精准, 小数时建议用这个, 准确的原因在于: 其内部是按照字符串存储的 (dec 也可以)
        布尔型:
            mysql中没有这个类型, 使用的是 tinyint(1)来构造的
            > create table t5(id int, a boolean);                //(desc t5: tinyint(1)) //1: true  0: false
        宽度:
            int类型后面的是显示宽度,不是存储宽度, 就这个是例外,其他数据类型都是存储宽度, 所以建表时, int的宽度不用写
            默认的显示宽度: 是存储宽度 + 1 位
            为何看到的显示宽度好像没起作用? 需要分情况讨论
                1.当插入的数据宽度不够时
                    默认不填充: 所以看不到效果
                    用0来填充: zerofill 时,可以看到不足的位数在前面有一串0
                2.当插入的数据宽度大于显示宽度
                    显示宽度不生效, 数据完全显示(可以认为是最少显示宽度)
    
    字符串
        length(); 查看字节数
        char_length(); 查看字符数
            > create table db5.t1(x char(5),y varchar(4));
            > insert into t1 values('八戒 ','八戒 ');                    //注意我这里'八戒 '后面有个空格
            > select x,char_length(x),y,char_length(y) from db5.t1;
                +--------+----------------+---------+----------------+
                | x      | char_length(x) | y       | char_length(y) |
                +--------+----------------+---------+----------------+
                | 八戒   |              2 | 八戒    |              3 |    //问题点: char()不仅占用了5个字符的空间, 而且显示的时候空格也不算在长度里. varchar()这个没有问题
                +--------+----------------+---------+----------------+
            > set sql_mode='pad_char_to_full_length';                    //命令行临时改参数,为了验证char()是完全占用了预先设置的空间
            > select @@sql_mode;
            > select x,char_length(x),y,char_length(y) from db5.t1;
                +-----------+----------------+---------+----------------+
                | x         | char_length(x) | y       | char_length(y) |
                +-----------+----------------+---------+----------------+
                | 八戒      |              5 | 八戒    |              3 |    //char()实际占了5个字符空间
                +-----------+----------------+---------+----------------+
        char(m):  定长,简单粗暴,浪费空间,但存取速度快    //[0 255]    //能存多少个字符
        varchar(m):变长,节省内存,存取速度慢              //[0 65535]    
        text:     长文本用这个
        sql优化:  创建表时, 定长放前面, 变长放后面
    
    时间类型
        now()函数, 获取当前的时间:  2019-12-05 10:41:55
        year:        YYYY                ['1901' '2155']    
        date:        YYYY-MM-DD          ['1000-01-01' '9999-12-31']
        time:        HH:MM:SS            ['-838:59:59' '838:59:59']
        datetime:    YYYY-MM-DD HH:MM:SS ['1000-01-01 00:00:00'   '9999-12-31 23:59:59']
        timestamp:   YYYYMMDD HHMMSS     ['1970-01-01 00:00:00'   '2038']
        > create table t6(y year, d date, t time, dt datetime, ts timestamp);
        > insert into t6 values(now(),now(),now(),now(),now());                       //注意如果手动加时间时, 要用字符串形式,即加上''引号,因为你中间的一些符号 : - 等缘故
        > mysql> select * from t6;                                                    //插入时:'2019@12#05' '20191205' 貌似也可以, 会自动转成'2019-12-05'
            +------+------------+----------+---------------------+---------------------+
            | y    | d          | t        | dt                  | ts                  |
            +------+------------+----------+---------------------+---------------------+
            | 2019 | 2019-12-05 | 10:43:56 | 2019-12-05 10:43:56 | 2019-12-05 10:43:56 |
            +------+------------+----------+---------------------+---------------------+            
    
    枚举类型 集合类型
        enum:  表示从多个里面选一个
        set: 表示多个里面选一个, 或者选择多个
        > create table customer(
            id int unsigned,
            name varchar(20),
            sex enum('male','female','other'),
            level enum('vip','vvip','vvvip'),
            yl set('smoke','drink','piao')
            );
        > insert into customer values(1,'bajie','other','vip','smoke,drink');
 
四.完整性约束
    表的设计: 
        对字段的属性做约束
    约束的作用:
        用于保证数据的完整性和一致性
> desc big_data;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(16) | YES  | MUL | NULL    |                |
| age   | int(11)     | YES  |     | NULL    |                |
| email | varchar(64) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
    
  not null 与 default
    NULL字段:
        null - 允许为空
        not null - 不允许为空,必须赋值
    Default字段:
        default - 设置默认值;如果不设置默认是null
        > create tables t6(id int not null default 2, name char(29) not null);
    
    unique     //(unique 唯一的 [juˈniːk])  
    Key字段:
        > create table t7(id int not null, name varcher(20) unique);            //单列唯一, UNI
        > create table t7(id int unique, name varcher(20) unique);              //多列唯一:方式一, UNI UNI字段的值可以是空, 也可以给多个字段赋"唯一"这个属性
        > create table t10(id int, name varchar(10), unique(id),unique(name));  //多列唯一:方式二, UNI UNI另一种写法, '唯一'属性在创建表的最后用unique()函数指出
        > create table t10(id int, name varchar(10), unique(id,name));          //组合唯一, MUL,只要组合字段的值不完全一样,就可插入 (联合唯一)
    
    primary key    //not null + unique    //主要用于索引优化查询
    Key字段:
        sql版本中, 一张表中只允许一个字段有'主键',通常是 id, cid, pid
        > create table student(id int primary key auto_increment, name varchar(10) unique);    //单列主键: PRI 而且NULL自动为NO
        > create table t2(id int not null unique auto_increment, name varchar(10) unique);     //单列主键: not null+unique: 这样的效果和主键相同,为啥不用,因为不能做优化查询
        > create table t3(id int auto_increment, name varchar(10),primary key(id,name));       //复合主键: 这样可以有 
    
    auto_increment //整数类型,而且为主键
        一般和主键一起使用, 默认从 1 开始赋值, 所以主键的字段不用手动添加.
        注意: 当你delete删除一条记录, 自增长的值不会释放, 而且当你尝试插入一条数据失败时, 也会消耗一个自增长的值
        > create table t4(id int primary key auto_increment, name varchar(20) not null);        
        > insert into t4(name) values('bajie');
        > insert into t4 values(6,'wukong');        //若中间有指定主键, 则下次插入时, 按顺序自增长
        > show variables like 'auto_inc%';          //(variables 变量)
            +--------------------------+-------+
            | Variable_name            | Value |
            +--------------------------+-------+
            | auto_increment_increment | 1     |    //步长,一次自增数是多少
            | auto_increment_offset    | 1     |    //偏移量: 从几开始
            +--------------------------+-------+
        > set session auto_increment_increment = 5;    //session: 设置当前会话有效,重启会话时失效    //global: 相当于往my.ini去写, 重启会话生效
        > set session auto_increment_offset = 100;
    
    foreign key  //两个表之间如何发生关系? 用这个
        
 
 
内容总结:
    1.mysql的基本语法
        对库的操作
            show databases;
            create database db1;
            drop database db1;
            use db1;
        对表的操作
            对表的设计
            create table t1(
                id int not null unique unsigned,
                name char(10) not null,
                sex enum('male','female','other'),
                fav set('make','drink','jump'),
                bordt datetime
            );
        对数据的操作
            增insert into t1() values();//要一一对应  insert into t1 values();//所有时,前面括号可省
            删delete from t1;//删所有记录             delete from t1 where 0>1;//按条件删           
            改update..set..
            查select * from t1;//查所有
    2.数据类型
        tinyint int bigint float double decimal
        char() varchar() text
        datetime date time year timestamp
        enum() set()
        boolean        //内部转成了 tinyint(1)
    3.完整性约束
        作用: 保证数据的完整性和一致性
        not null 和 default
        unique 单列唯一unique(id)    多列唯一unique(id), unique(name)     联合唯一unique(id,name)
        primary key
        auto_increment
        foreign key
        unsigned
        zerofill
 
 
  

猜你喜欢

转载自www.cnblogs.com/aiaii/p/12084523.html