zoukankan      html  css  js  c++  java
  • MariaDB数据库(二)

    1. MariaDB数据类型

      MariaDB数据类型可以分为数字,日期和时间以及字符串值。

      使用数据类型的原则:够用就行,尽量使用范围小的,而不用大的。

    1.1  常用的数据类型

      整数:int,bit(位,0和1);bit(1)有两种可能,0或1,bit(2)有四种可能,00、01、10、11。

      小数:decimal;                                     #decimal(5,2)

      字符串:varchar,char                         

      日期时间:date,time,datetime

      枚举类型(enum),比如gender类型有男、女等。

    1.2  约束

      1)主键primary key:物理上存储的顺序,有索引功能,不为空,不能重复,按序排序;

      2)非空not null:此字段不能为空;

      3)唯一unique:此字段不允许重复;

      4)默认default:当不填写此值时会使用默认值,如果填写则已填写为准;

      5)外键foreign key:对关系字段进行约束,当为关系字段填写值时,会到关联的表中查询此值是否存在,如果存在则填写成功,如果不存在则填写失败并抛出异常。外键设置原则:谁的范围小给谁设置外键。

    数值类型

    类型

    字节大小

    有符号范围(Signed)

    无符号范围(Unsigned)

    TINYINT

    1

    -128~127

    0~256

    SMALINT

    2

    -32768~32767

    0~65535

    MEDIUINT

    3

    -8388608~8388607

    0~16777215

    INT/INTEGER

    4

    BIGINT

    8

    字符串

    类型

    字节大小

    示例

    CHAR

    0~255

    CHAR(20)不管写多少,占用均为20字符

    VARCHAR

    0~255

    可伸缩,VARCHAR(22)最多22个字符,写多少占用多少,查询效率比CHAR差

    TEXT

    0~65535

    日期时间类型

    类型

    字节大小

    示例

    DATE

    4

    只有年月日,2019-5-15

    TIME

    3

    只有时分秒,14:56:36

    DATETIME

    8

    年月日时分秒

    YEAR

    1

    年 2019

    TIMESTAP

    4

    带有时区的详细信息,如‘2019-5-15 14:56:36’UTC

    2. SQL语句增删改

    进入数据库

    [root@localhost ~]# mysql -uroot -p123

    1> 查看

      查看数据库

    MariaDB [(none)]> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | testbase           |
    +--------------------+

      创建数据库testdb用作实验

    MariaDB [(none)]> create database testdb character set utf8;    #支持中文
    MariaDB [(none)]> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | testdb             |
    +--------------------+

      使用数据库testdb

    MariaDB [(none)]> use testdb;
    MariaDB [testdb]> show tables;                        #查看表
    Empty set (0.000 sec)                                 #空表

      创建一个classes表,有ip、name两个字段(列),ip为无符号的整型数,设置有主键,name为VARCHAR类型的字符串

    MariaDB [testdb]> create table classes (id tinyint unsigned primary key,name varchar(20));
    Query OK, 0 rows affected (0.005 sec)
    MariaDB [testdb]> show tables;
    +-------------------+
    | Tables_in_testdb  |
    +-------------------+
    | classes           |
    +-------------------+

      查看表的字段

    MariaDB [testdb]> desc classes;    #describe,描述
    +-------+---------------------+------+-----+---------+------+
    | Field | Type                | Null | Key | Default | Extra|
    +-------+---------------------+------+-----+---------+------+
    | id    | tinyint(3) unsigned | NO   | PRI | NULL    |      |
    | name  | varchar(20)         | YES  |     | NULL    |      |
    +-------+---------------------+------+-----+---------+------+
     #定义     类型                是否为空 是否主键  默认值    扩展

      linux当中的注释用#,而数据库中的注释用--

      创建一个复杂的students表,包含字段id、name、age、high、gender、cls_id

    MariaDB [testdb]> create table students (id tinyint unsigned primary key auto_increment,
        -> name varchar(20),        
        -> age tinyint unsigned,
      -> gender enum('', '', '人妖','保密')not null default '人妖',   #枚举,默认为‘人妖’
        -> cls_id tinyint unsigned
      -> );
    MariaDB [testdb]> show tables;
    +------------------+
    | Tables_in_testdb |
    +------------------+
    | classes          |
    | students         |
    +------------------+
    MariaDB [testdb]> desc students;
    +--------+-----------------------------+------+-----+----------+---------------+
    | Field  | Type                        | Null | Key | Default | Extra          |
    +--------+-----------------------------+------+-----+---------+----------------+
    | id     | tinyint(3) unsigned         | NO   | PRI | NULL    | auto_increment |
    | name  | varchar(20)                  | YES  |     | NULL    |                |
    | age   | tinyint(3) unsigned          | YES  |     | NULL    |                |
    | gender | enum('','','人妖','保密') | NO   |     | 人妖    |                |
    | cls_id | tinyint(3) unsigned         | YES  |     | NULL    |                |
    +--------+-----------------------------+------+-----+---------+----------------+

      查看表的创建

    MariaDB [testdb]> show create table students;
    ……..                                                  #列出语法
    | students | CREATE TABLE `students` (
      `id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(20) DEFAULT NULL,
      `age` tinyint(3) unsigned DEFAULT NULL,
      `gender` enum('','','人妖','保密') NOT NULL DEFAULT '人妖',
      `cls_id` tinyint(3) unsigned DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8                  #默认引擎为InnoDB
    ………

    MariaDB处理引擎有InnoDB、MyISAM、blackhole等,最主要的区别在于InnoDB支持事务处理与外键和行级锁。

    2> 改字段

      修改表:修改用命令alter

      添加一个brithday字段,类型为date

    MariaDB [testdb]> alter table students add brithday date;
    MariaDB [testdb]> desc students;
    +----------+--------------------------------------+-----+---------+----------------+
    | Field | Type | Null | Key | Default | Extra | +----------+--------------------------------------+-----+---------+----------------+ | id | tinyint(3) unsigned | NO | PRI | NULL | auto_increment | | name | varchar(20) | YES | | NULL | | | age | tinyint(3) unsigned | YES | | NULL | | | gender | enum('','','人妖','保密') | NO |人妖 | | | | cls_id | tinyint(3) unsigned YES | |NULL | | | | brithday | date | YES | | NULL | |

      更改字段名

    MariaDB [testdb]> alter table students change brithday birthday date;

      更改表的类型

    MariaDB [testdb]> alter table students modify birthday datetime;

      删除字段

    MariaDB [testdb]> alter table students drop birthday;

      删除表

    MariaDB [testdb]> drop table students;

    3>  给字段插入数据

      向students表插入数据,value接值,ip为1,name为zxj,字符串类型用单引号引起,age为250,high为250.253,gender为人妖id_cls为1

    MariaDB [testdb]> insert into students values (1,'zxj',250.253,'人妖',1);

      查看插入的字段

    MariaDB [testdb]> select * from students;
    +----+------+------+--------+--------+
    | id | name | age  | gender | cls_id |
    +----+------+------+--------+--------+
    |  1 | zxj  | 250  | 人妖    |    1   |
    +----+------+------+--------+--------+
    1 row in set (0.000 sec)

      由于id设置的是自增,因此每次插入时id都是增加的,为体现效果,手动插入id为4的一条数据

    MariaDB [testdb]> select * from students;
    +----+------+------+--------+--------+
    | id | name | age  | gender | cls_id |
    +----+------+------+--------+--------+
    |  1 | zxj  |  250 | 人妖    |    1   |
    |  4 | zxj  |  250 | 人妖    |    1   |
    +----+------+------+--------+--------+
    MariaDB [testdb]> insert into students values (0,'zxj',250.253,'人妖',1);
    Query OK, 1 row affected (0.001 sec)
    
    MariaDB [testdb]> select * from students;
    +----+------+------+--------+--------+
    | id | name | age  | gender | cls_id |
    +----+------+------+--------+--------+
    |  1 | zxj  |  250 | 人妖    |    1   |
    |  4 | zxj  |  250 | 人妖    |    1   |
    |  5 | zxj  |  250 | 人妖    |    1   |
    +----+------+------+--------+--------+
    3 rows in set (0.000 sec)
    MariaDB [testdb]> show create table students;
    ….
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8       #当前默认值为为6,因此下一次默认添加数据时自增为6

      对部分插入,比如仅对name、age添加数据

    MariaDB [testdb]> insert into students (name,age) values ('wrl' ,24);
    MariaDB [testdb]> select * from students;
    +----+------+------+--------+--------+
    | id | name | age  | gender | cls_id |
    +----+------+------+--------+--------+
    |  1 | zxj  |  250 | 人妖   |    1   |
    |  4 | zxj  |  250 | 人妖   |    1   |
    |  5 | zxj  |  250 | 人妖   |    1   |
    |  6 | wrl  |   24 | 人妖   |  NULL  |                        #gender设置了默认值为‘人妖’
    +----+------+------+-------+---------+

      删除一条数据

    MariaDB [testdb]> delete from students where id=6;           #条件表达式where
    MariaDB [testdb]> select * from students;
    +----+------+------+--------+--------+
    | id | name | age  | gender | cls_id |
    +----+------+------+--------+--------+
    |  1 | zxj  |  250 | 人妖    |     1  |
    |  4 | zxj  |  250 | 人妖    |     1  |
    |  5 | zxj  |  250 | 人妖    |     1  |
    +----+------+------+--------+--------+

      插入多条数据

    MariaDB [testdb]> insert into students (name,age) values ('wrl' ,24),('my',23);   #多条数据以逗号隔开,字符串加单引号
    MariaDB [testdb]> select * from students;
    +----+------+------+--------+--------+
    | id | name | age  | gender | cls_id |
    +----+------+------+--------+--------+
    |  1 | zxj  |  250 | 人妖   |      1 |
    |  4 | zxj  |  250 | 人妖   |      1 |
    |  5 | zxj  |  250 | 人妖   |      1 |
    |  7 | wrl  |   24 | 人妖   |  NULL  |
    |  8 | my   |   23 | 人妖   |  NULL  |

    4> 修改字段数据,用命令update

      修改id>=7的数据的gender为‘保密’

    MariaDB [testdb]> update students set gender='保密' where id>=7;
    MariaDB [testdb]> select * from students;
    +----+------+------+----------+-------+
    | id | name | age  |  gender  |cls_id |
    +----+------+------+--------- +-------+
    |  1 | zxj  |  250 |   人妖   |      1 |
    |  4 | zxj  |  250 |   人妖   |      1 |
    |  5 | zxj  |  250 |   人妖   |      1 |
    |  7 | wrl  |   24 |   保密   |  NULL  |
    |  8 | my   |   23 |   保密   |  NULL  |
    +----+------+------+---------+--------+

      由于gender设置是枚举,选项有四个,因此可以用1、2、3、4来代替男、女、人妖、保密 四个选项。

    MariaDB [testdb]> update students set gender=1 where id=7;
    MariaDB [testdb]> update students set gender=2 where id=8;
    MariaDB [testdb]> update students set gender=4 where name='zxj';
    MariaDB [testdb]> select * from  students;
    +----+------+------+---------+----------+
    | id | name | age  | gender  | cls_id   |
    +----+------+------+---------+----------+
    |  1 | zxj  |  250 |  保密   |         1 |
    |  4 | zxj  |  250 |  保密   |         1 |
    |  5 | zxj  |  250 |  保密   |         1 |
    |  7 | wrl  |   24 |  男     |      NULL |
    |  8 | my   |   23 |  女     |      NULL |
    +----+------+------+--------+-----------+

      还可以修改多条数据的多个字段(列),如

    MariaDB [testdb]> update students set gender=2,age=23 where name='zxj';
    Query OK, 3 rows affected (0.001 sec)
    Rows matched: 3  Changed: 3  Warnings: 0
    MariaDB [testdb]> select * from students;
    +----+------+------+--------+--------+
    | id | name | age  | gender | cls_id |
    +----+------+------+--------+--------+
    |  1 | zxj  |   23 | 女     |    1   |
    |  4 | zxj  |   23 | 女     |    1   |
    |  5 | zxj  |   23 | 女     |    1   |
    |  7 | wrl  |   24 | 男     |NULL    |
    |  8 | my   |   23 | 女     |NULL    |
    +----+------+------+--------+--------+
    5 rows in set (0.000 sec)

    5> 删除

      删除students表中id为4、5的数据

    MariaDB [testdb]> delete from students where id=4;
    MariaDB [testdb]> delete from students where id=5;
    MariaDB [testdb]> select * from students;
    +----+------+------+--------+--------+
    | id | name | age  | gender | cls_id |
    +----+------+------+--------+--------+
    |  1 | zxj  |  23  | 女     |     1  |
    |  7 | wrl  |  24  | 男     | NULL   |
    |  8 | my   |  23  | 女     | NULL   |
    +----+------+------+--------+--------+

      清空表。清空表的内容不要随便用,会清除所有数据。

    MariaDB [testdb]> delete from students;

    面试:用delete并不会清除自增AUTO_UNCREMENT的值,若要清空表后重置自增值为1,用truncate命令,truncate会清空表的所有内容且不可恢复(不能回滚)。

    MariaDB [testdb]> truncate table students;

    6> 逻辑删除 

      用一条字段来表示这条信息是否已经不能在使用了,比如游戏企业通过设置一个字段来表示哪些用户活跃,哪些用户不活跃等。一般企业都将逻辑删除标记为bit(0和1)。逻辑删除并不会删除磁盘数据。

      先在students表中添加一个逻辑删除标记ls_delete,bit类型,默认为0

    MariaDB [testdb]> alter table students add is_delete  bit default 0;
    MariaDB [testdb]> desc students;
    ………
    | is_delete | bit(1)                              | YES  |     | b'0'    |               
    MariaDB [testdb]> insert into students (name,age,is_delete) values ('jony',24,1);
    MariaDB [testdb]> select * from students;
    +----+------+------+--------+--------+-----------+
    | id | name | age  | gender | cls_id | is_delete |
    +----+------+------+--------+--------+-----------+
    |  1 | zxj  |   23 | 女     |      1 |           |        #bit=0数值较小,不显示不代表没有
    |  7 | wrl  |   24 | 男     |   NULL |           ||  8 | my   |   23 | 女     |   NULL |           |
    |  9 | jony |   24 | 人妖   |   NULL | 口         |        #bit=1
    +----+------+------+--------+--------+-----------+
    4 rows in set (0.000 sec)

      用is_delete来表明删除项,如筛选bit不为0的用户

    MariaDB [testdb]> select * from students where is_delete=0;
    +----+------+------+--------+--------+-----------+
    | id | name | age  | gender | cls_id | is_delete |
    +----+------+------+--------+--------+-----------+
    |  1 | zxj  |  23  | 女     |     1  |           |
    |  7 | wrl  |  24  | 男     | NULL   |           |
    |  8 | my   |  23  | 女     | NULL   |           |
    +----+------+------+--------+--------+-----------+
  • 相关阅读:
    Java实现 LeetCode 27 移除元素
    Java实现 LeetCode 26 删除排序数组中的重复项
    Java实现 LeetCode 26 删除排序数组中的重复项
    Java实现 LeetCode 26 删除排序数组中的重复项
    Java实现 LeetCode 25 K个一组翻转链表
    Java实现 LeetCode 25 K个一组翻转链表
    Java实现 LeetCode 25 K个一组翻转链表
    Java实现 LeetCode 24 两两交换链表中的节点
    Java实现 LeetCode 24 两两交换链表中的节点
    Java实现 LeetCode 24 两两交换链表中的节点
  • 原文地址:https://www.cnblogs.com/ajunyu/p/10919025.html
Copyright © 2011-2022 走看看