zoukankan      html  css  js  c++  java
  • MySQL基础-2

    配置文件的使用

    大家发现每次进入mysql都需要进行登录操作,而且服务器的编码为Latin1,客户端的编码为GBK,这样就很容易造成乱码,所以我们就需要进行一个统一

    1. 在根目录(程序安装的路径)下创建一个配置文件,名称为my.ini

      内容为cfg格式,即section+option

    2. [mysqld] 分区为服务器端配置,修改后需要重启服务器

      [mysql] 分区为客户端配置,修改后需要进行重连

    3. 统一编码方式配置文件:

      # 客户端配置
      [client]
      user = root
      password = 你的密码
      default-character-set = utf8
      
      # 服务器端配置 需要重启服务器
      [mysqld]
      character-set-server = utf8
      

    表的分类——数据库引擎

    数据库引擎是数据库最核心的部分,地位相当于人类的心脏,它是负责存储数据的模块

    可以通过 show engines; 查看引擎

    可以看到,mysql里面有好几个引擎,但到底那个好呢?

    这个是没有定论的,每个引擎有不同的作用,我们要根据实际需求来选择合适的引擎

    • Mysql数据库默认引擎为InnoDB

    • 创建表指定引擎

      create table 名称(字段 类型 ) engine = XXXX;

    简单的表的增删改查(CRUD)

    # 插入数据
    insert into 表名 values(数据1,数据2,……); # 该方式必须保证插入的数据个数和表格字段数量一样
    
    # 选择部分字段插入
    insert into 表名(字段名称1,字段名称2)  values(数据1,数据2);  # 该方式必须保证插入的数据个数与指定的字段数量一样
    
    # 同时插入多个记录
    insert into   表名(字段名称1,字段名称2)  values(数据1,数据2),(数据1,数据2);
    
    # 查询所有记录
    select * from 表名;
    
    # 查询符合条件的字段
    select 字段 from 表名 where 条件;
    
    
    # 更新所有的记录
    uptade 表名 set 字段1=新的值1,字段2=新的值2;
    
     # 更新符合条件的记录
    update 表名 set 字段1=新的值1,字段2=新的值2 where 条件;
    
    # 删除所有记录
    delete from 表名;
    
    # 删除满足条件的记录
    delete from 表名 where 条件;
    

    创建表的完整写法

    create table 表名(字段名称1 字段类型[(长度) 约束],字段名称1 字段类型[(长度) 约束]……) charset utf8;

    Mysql中的数据类型

    数字类型

    • 注意:

      整型:
      1. 默认情况下为有符号的,需要设置为无符号要在增加unsigned约束

        alter table 表名 modify 字段 数据类型 unsigned;

        create table 表名(字段 数据类型 unsigned)

      2. mysql 5.6 版本在默认情况下,为非加严模式,如果数据类型超过范围,就会自动取最大值,这样就不能保证数据的安全,所以可以在配置中设置为加严模式,或者临时设置sql_mode,但退出后又会恢复非加严模式

        # 查看当前的sql模式
        
        select @@sql_model   # @ 表示全局变量   @@ 表示局部变量
        +---------------------+
        | @@sql_mode          |
        +---------------------+
        | STRICT_TRANS_TABLES |    # 当前为非加严模式
        +---------------------+
        
        # 1.临时设置
        set  @@sql_mode = " STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"
        select @@sql_model
        +--------------------------------------------+
        | @@sql_mode                                 |
        +--------------------------------------------+
        | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |   # 加严模式
        +--------------------------------------------+
        
        # 2.修改配置,永久有效
        [mysqld]
        sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 
        
      3. 指定长度

        比如int(5),表示数据最小长度为5,如果数据不足5位,默认用空填充,如果要用0填充,需要增加zerofill约束

        create table test(x int(5) zerofill);
        insert into test values(2);
        insert into test values(201780);   # 证明5并不是限制最大长度的
        select *from test;
        +--------+
        | x      |
        +--------+
        |  00002 |
        | 201780 |
        +--------+
        
      浮点型
      1. 数据类型(M,D) 表示整数位最大长度为M-D,超出则会报错,小数位最大长度为D,如果小数位超过了,则会自动进行四舍五入

        create table test(x float(5,3));
        insert into test values(2.56789);
        Query OK, 1 row affected (0.21 sec)
        select *from test;
        +-------+
        | x     |
        +-------+
        | 2.568 |
        +-------+
        
        insert into test values(100);   # 报错,最大只能为99.999
        ERROR 1264 (22003): Out of range value for column 'x' at row 1
        
      2. float类型 不需要指定位数,最大只能精确到小数点后5位

        double类型 不需要指定位数,最大只能精确到小数点后15位

        decimal类型 必须指定位数,长度最大为65,小数点后面最长为30

    字符串类型

    类型 大小 用途
    CHAR 0-255字节 定长字符串
    VARCHAR 0-65535 字节 变长字符串
    TINYBLOB 0-255字节 不超过 255 个字符的二进制字符串
    TINYTEXT 0-255字节 短文本字符串
    BLOB 0-65 535字节 二进制形式的长文本数据
    TEXT 0-65 535字节 长文本数据
    MEDIUMBLOB 0-16 777 215字节 二进制形式的中等长度文本数据
    MEDIUMTEXT 0-16 777 215字节 中等长度文本数据
    LONGBLOB 0-4 294 967 295字节 二进制形式的极大文本数据
    LONGTEXT 0-4 294 967 295字节 极大文本数据
    1. char

      定义时需要指定字符串长度,默认为1,比如char(10),表示最大只能有10个字符,超出长度自动取前10个字符,而少于10个字符的自动在前面补足空格

      • 优点:读取速度快
      • 缺点:浪费空间
    2. varchar

      定义时也需要指定字符串长度,但是和char的区别就是varchar不会自动补空格,而且varcher最终占⽤的空间为实际内容所占字节数+1,因为需要一个bit 存储字符长度

      • 优点:节省空间
      • 存取速度慢一些
      char(4) 存储需求 varcher(4) 存储需求
      ‘’ ' ' 4个字节 '' 1个字节
      ‘ab' 'ab ' 4个字节 'ab' 3个字节
      'abcd' 'abcd 4个字节 'abcd' 5个字节
      'abcdefg' 'abcd' 4个字节 'abcd' 5个字节
    3. text

      存放长度较大的字符串

    4. blob

      存放的是二进制

    枚举和集合

    类型 大小
    ENUM 对1-255个成员的枚举需要1个字节存储; 对于255-65535个成员,需要2个字节存储; 最多允许65535个成员。
    SET 1-8个成员的集合,占1个字节 9-16个成员的集合,占2个字节 17-24个成员的集合,占3个字节 25-32个成员的集合,占4个字节 33-64个成员的集合,占8个字节
    1. 枚举是提前规定一个范围 你的值只能是其中之一 多选一

    2. 集合是提前规定一个范围 你的值可以是其中的多个 多选多

      集合在插入数据时 ,多个值之前用逗号隔开 但他们必须包含在同一个字符串内!

      create table t10 (name char(20),gender enum('female','male'));
      Query OK, 0 rows affected (0.01 sec)
      
      # 选择enum('female','male')中的一项作为gender的值,可以正常插入
      insert into t10 values ('nick','male');
      Query OK, 1 row affected (0.00 sec)
      
      # 不能同时插入'male,female'两个值,也不能插入不属于'male,female'的值
      insert into t10 values ('nick','male,female');
      ERROR 1265 (01000): Data truncated for column 'gender' at row 1
      
      create table t11 (name char(20),hobby set('抽烟','喝酒','烫头','翻车'));
      Query OK, 0 rows affected (0.01 sec)
      
      # 可以任意选择set('抽烟','喝酒','烫头','翻车')中的项,并自带去重功能
      insert into t11 values ('tank','烫头,喝酒,烫头');
      Query OK, 1 row affected (0.01 sec)
      
      select * from t11;
      +------+---------------+
      | name | hobby        |
      +------+---------------+
      | tank | 喝酒,烫头     |
      +------+---------------+
      row in set (0.00 sec)
      
      # 不能选择不属于set('抽烟','喝酒','烫头','翻车')中的项,
      insert into t11 values ('jason','烫头,翻车,看妹子');
      ERROR 1265 (01000): Data truncated for column 'hobby' at row 1
      

    时间和日期

    类型 大小 (字节) 范围 格式 用途
    DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 年月日
    TIME 3 '-838:59:59'/'838:59:59' HH:MM:SS 时分秒
    YEAR 1 1901/2155 YYYY 年份值
    DATETIME 8 0000-00-00 00:00:00/9999-12-31 23:59:59 YYYY-MM-DDHH:MM:SS 年月日时分秒
    TIMESTAMP 4 1970-01-01 00:00:00/2038 结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 YYYYMMDDHHMMSS 混合日期和时间值,时间戳
    1. date/time/datatime类型

      create table t4 (d date,t time,dt datetime);
      Query OK, 0 rows affected (0.02 sec)
      
      desc t4;
      +-------+----------+------+-----+---------+-------+
      | Field | Type     | Null | Key | Default | Extra |
      +-------+----------+------+-----+---------+-------+
      | d     | date     | YES  |     | NULL    |       |
      | t     | time     | YES  |     | NULL    |       |
      | dt    | datetime | YES  |     | NULL    |       |
      +-------+----------+------+-----+---------+-------+
      rows in set (0.01 sec)
      
      insert into t4 values (now(),now(),now());
      Query OK, 1 row affected, 1 warning (0.01 sec)
      
      select * from t4;
      +------------+----------+---------------------+
      | d          | t        | dt                  |
      +------------+----------+---------------------+
      | 2018-09-21 | 14:51:51 | 2018-09-21 14:51:51 |
      +------------+----------+---------------------+
      row in set (0.00 sec)
      
      insert into t4 values (null,null,null);
      Query OK, 1 row affected (0.01 sec)
      
      select * from t4;
      +------------+----------+---------------------+
      | d          | t        | dt                  |
      +------------+----------+---------------------+
      | 2018-09-21 | 14:51:51 | 2018-09-21 14:51:51 |
      | NULL       | NULL     | NULL                |
      +------------+----------+---------------------+
      rows in set (0.00 sec)
      
    2. timestamp类型

      create table t5 (id1 timestamp);
      Query OK, 0 rows affected (0.02 sec)
      
      desc t5;
      +-------+-----------+------+-----+-------------------+-----------------------------+
      | Field | Type      | Null | Key | Default           | Extra                       |
      +-------+-----------+------+-----+-------------------+-----------------------------+
      | id1   | timestamp | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
      +-------+-----------+------+-----+-------------------+-----------------------------+
      row in set (0.00 sec)
      
      # 插入数据null,会自动插入当前时间的时间
      insert into t5 values (null);
      Query OK, 1 row affected (0.00 sec)
      
      select * from t5;
      +---------------------+
      | id1                 |
      +---------------------+
      | 2018-09-21 14:56:50 |
      +---------------------+
      row in set (0.00 sec)
      
      #添加一列 默认值是'0000-00-00 00:00:00'
      alter table t5 add id2 timestamp;
      Query OK, 0 rows affected (0.02 sec)
      Records: 0  Duplicates: 0  Warnings: 0
      
      show create table t5 G;
      *************************** 1. row ***************************
             Table: t5
      Create Table: CREATE TABLE `t5` (
        `id1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
        `id2` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8
      row in set (0.00 sec)
      
      ERROR: 
      No query specified
      
      # 手动修改新的列默认值为当前时间
      alter table t5 modify id2 timestamp default current_timestamp;
      Query OK, 0 rows affected (0.02 sec)
      Records: 0  Duplicates: 0  Warnings: 0
      
      show create table t5 G;
      *************************** 1. row ***************************
             Table: t5
      Create Table: CREATE TABLE `t5` (
        `id1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
        `id2` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8
      row in set (0.00 sec)
      
      ERROR: 
      No query specified
      
      insert into t5 values (null,null);
      Query OK, 1 row affected (0.01 sec)
      
      select * from t5;
      +---------------------+---------------------+
      | id1                 | id2                 |
      +---------------------+---------------------+
      | 2018-09-21 14:56:50 | 0000-00-00 00:00:00 |
      | 2018-09-21 14:59:31 | 2018-09-21 14:59:31 |
      +---------------------+---------------------+
      rows in set (0.00 sec)
      
    3. year类型

      create table t7 (y year);
      Query OK, 0 rows affected (0.02 sec)
      
      insert into t7 values (2018);
      Query OK, 1 row affected (0.00 sec)
      
      select * from t7;
      +------+
      | y    |
      +------+
      | 2018 |
      +------+
      row in set (0.00 sec)
      

      注意:上述时间,两位数0-69 翻译为 2000-2069 70-99 翻译为1790-1999

  • 相关阅读:
    228. Summary Ranges
    227. Basic Calculator II
    224. Basic Calculator
    222. Count Complete Tree Nodes
    223. Rectangle Area
    221. Maximal Square
    220. Contains Duplicate III
    219. Contains Duplicate II
    217. Contains Duplicate
    Java编程思想 4th 第4章 控制执行流程
  • 原文地址:https://www.cnblogs.com/Hades123/p/11180585.html
Copyright © 2011-2022 走看看