zoukankan      html  css  js  c++  java
  • MySQL 数据类型和操作数据库(二)

    2、 数据类型与操作数据表

    数据类型:指的是列、存储过程中参数、表达式和局部变量的数据特征,它决定了数据的存储格式,代表了不同的信息类型。

    2.1、myql 数据类型之整型

    有符号位的范围大致是无符号位范围的 2 倍,无符号位只有正数,选择合适的数据类型很重要,尤其是要存储的数据量特别大的时候,不同的数据类型占的字节不同。

    五种整型

    2.2、mysql 数据类型之浮点型

    有些数据适合用整型,而有些数据是小数,使用浮点型更合适,双精度大约是单精度范围的 10 倍。

    浮点型

    2.3、mysql 数据类型之日期时间型

    日常项目开发中很少使用 日期时间型,大多使用数字的形式存储,主要是因为存在时区的问题。

    • date:1000年1月1日--9999年12月31日
    • datetime:1000年1月1日00:00点--9999年12月31日23:59分
    • timestamp(时间戳):1970年1月1日00:00点---2017年(现在)的一个值
    • time:-8385959--8285959
    • year:可以存储 2 位也可以是 4位,默认 4 位(可以70-69,表示19070-2069年)

    日期时间型

    2.4、mysql 数据类型之字符型

    2.5、mysql 创建数据表

    数据表(或称表)是数据库最重要的组成部分之一,是其他对象的基础。

    打开数据库命令:

    # USE 数据库名称
    mysql> USE test;
    Database changed
    mysql>
    

    检查当前打开的数据库是否为我们刚打开的数据库:

    # SELECT DATABASE();
    mysql> SELECT DATABASE();
    +------------+
    | DATABASE() |
    +------------+
    | test       |
    +------------+
    1 row in set (0.00 sec)
    

    2.5.1、创建数据表

    语法结构:

    CREATE TABLE [IF NOT EXISTS] table_name(column_name data_type,
    ...
    DROP TABLE table_name           # 删除数据表
    )
    # column_name(列名称)  事先需要经过分析计算出需要多少列,而不是凭空想象
    # data_type(数据类型)
    

    示例:

    # 创建一个名为 tb1 的数据表,其中包含名字、年龄、工资(salary)
    mysql> CREATE TABLE tb1(
        -> username VARCHAR(20),                     # VARCHAR(20) 表示名字长度最长为20
        -> age TINYINT UNSIGNED,                     # 因为年龄是正的,所有是无符号位(UNSIGNED)
        -> salary FLOAT(8,2) UNSIGNED                # 最后一个字段,不需要在最后➕逗号
        -> );
    Query OK, 0 rows affected (0.07 sec)
    

    2.5.2、查看数据表

    在当前数据库下查看别的数据库下的数据表,并不会改变数据库。

    语法结构:

    SHOW TABLES [FROM db_name] [LIKE 'pattern' | WHERE expr]
    

    示例:

    # 查看当前数据库下的数据表
    mysql> SHOW TABLES;
    +----------------+
    | Tables_in_test |
    +----------------+
    | tb1            |
    +----------------+
    1 row in set (0.00 sec)
    
    # 不仅可以查看当前数据库下的数据表,还可以查看别的数据库下的数据表
    mysql> SHOW TABLES FROM mysql;
    

    2.5.3、查看数据表结构

    语法结构:

    SHOW COLUMNS FROM tbl_name;
    

    示例:

    # 查看 tb1 的数据表结构
    mysql> SHOW COLUMNS FROM tb1;
    +----------+---------------------+------+-----+---------+-------+
    | Field    | Type                | Null | Key | Default | Extra |
    +----------+---------------------+------+-----+---------+-------+
    | username | varchar(20)         | YES  |     | NULL    |       |
    | age      | tinyint(3) unsigned | YES  |     | NULL    |       |
    | salary   | float(8,2) unsigned | YES  |     | NULL    |       |
    +----------+---------------------+------+-----+---------+-------+
    3 rows in set (0.01 sec)
    

    2.6、mysql 记录的插入与查找

    通过上面的创建,我们创建了数据表的列,行就是(记录)。

    2.6.1、数据表的记录(行)插入

    语法结构:

    INSERT [INTO] tbl_name [ (col_name,...)] VALUES(CAL,...)
    # col_name 表示数据表中哪几个列要赋值,可省略,省略的时候表示所有的列都必须赋值,否则出错
    # VALUES 为要赋的值
    

    示例:

    # 省略 col_name时,需要给每个列度都赋值
    mysql> INSERT tb1 VALUES('Tom',25,7863.25);
    Query OK, 1 row affected (0.01 sec)
    
    # 没有给全部列赋值,程序出错
    mysql> INSERT tb1 VALUES('Tom',25);
    ERROR 1136 (21S01): Column count doesn't match value count at row 1
    
    # 也可以只给其中一个或几个列赋值
    mysql> INSERT tb1(username,salary) VALUES('John',4500.69);
    Query OK, 1 row affected (0.01 sec)
    

    2.6.2、查看记录

    语法结构:

    # expr 表达式
    SELECT expr,...FROM tbl_name
    

    示例:

    # * 在这里表示的是字段的过滤(可以理解为全部字段的过滤),这里只是比较简单的表示
    mysql> SELECT * FROM tb1;
    +----------+------+---------+
    | username | age  | salary  |
    +----------+------+---------+
    | Tom      |   25 | 7863.25 |
    | John     | NULL | 4500.69 |
    +----------+------+---------+
    2 rows in set (0.00 sec)
    

    2.7、mysql 空值与非空

    在上述列子中,我们给数据表 tb1 插入记录时,John 没有指定年龄,在我们查看数据表结构时,发现年龄的位置为空(NULL),而大多数情况下,我们在网站用户名创建时,往往有些地方不能为空,或者说是显示的不是空,为此我们可以更加深入地完善空。

    • NULL:字段值可以为空(默认为可以为空)
    • NOT NULL:字段值禁止为空

    示例:

    # 创建一个数据表 tb2,将列(username 设置为非空(NOT NULL), age 设置为可以为空(NULL),可省略不写)
    mysql> CREATE TABLE tb2(
        -> username VARCHAR(20) NOT NULL,
        -> age TINYINT UNSIGNED NULL
        -> );
    Query OK, 0 rows affected (0.04 sec)
    
    # 查看数据表结构
    mysql> SHOW COLUMNS FROM tb2;
    +----------+---------------------+------+-----+---------+-------+
    | Field    | Type                | Null | Key | Default | Extra |
    +----------+---------------------+------+-----+---------+-------+
    | username | varchar(20)         | NO   |     | NULL    |       |
    | age      | tinyint(3) unsigned | YES  |     | NULL    |       |
    +----------+---------------------+------+-----+---------+-------+
    2 rows in set (0.00 sec)
    
    # 插入记录,将年龄设置为 NULL,显示可以
    mysql> INSERT tb2 VALUES('TOM',NULL);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> SELECT * FROM tb2;
    +----------+------+
    | username | age  |
    +----------+------+
    | TOM      | NULL |
    +----------+------+
    1 row in set (0.00 sec)
    
    # 插入记录,将用户名(username设置为空)出错,因为在创建时,设置它不能为空
    mysql> INSERT tb2 VALUES(NULL,26);
    ERROR 1048 (23000): Column 'username' cannot be null
    

    2.8、mysql 自动编号

    为了保证记录的唯一性,避免在数据表中,记录不能出现重复,可以为某个字段添加 AUTO_INCREMENT(自动编号) 属性。

    • 自动编号,且必须与主键组合使用
    • 默认起始值为1,每次增量为1

    示例:

    # 创建一个数据表,id 设置为自动编号
    mysql> CREATE TABLE tb3(
        -> id SMALLINT UNSIGNED AUTO_INCREMENT,
        -> username VARCHAR(30) NOT NULL
        -> );
    
    # 出错内容意思是必须与主键配合(it must be defined as a key)
    ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
    

    2.8.1、初涉主键(PRIMARY KEY)约束

    主键可以理解为一个表格的类别(自我理解的)

    • 主键约束
    • 每张数据表只能存在一个主键
    • 主键保证记录的唯一性
    • 主键自动为 NOT NULL
    • 可以不用赋值

    示例:

    # 创建一个数据表 tb3
    mysql> CREATE TABLE tb3(
        -> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,  # 将id 定义为主键(AUTO_INCREMENT PRIMARY KEY)
        -> username VARCHAR(30) NOT NULL
        -> );
    Query OK, 0 rows affected (0.05 sec)
    
    # 查看数据表结构
    mysql> SHOW COLUMNS FROM tb3;   # 查看这个结构,发现 id 为主键(PRI),还有一个 Extra(增量)
    +----------+----------------------+------+-----+---------+----------------+
    | Field    | Type                 | Null | Key | Default | Extra          |
    +----------+----------------------+------+-----+---------+----------------+
    | id       | smallint(5) unsigned | NO   | PRI | NULL    | auto_increment |
    | username | varchar(30)          | NO   |     | NULL    |                |
    +----------+----------------------+------+-----+---------+----------------+
    2 rows in set (0.00 sec)
    
    # 插入 4 条记录(Tom、John、Rose、Alice)
    mysql> INSERT tb3(username) VALUES('John');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> INSERT tb3(username) VALUES('Tom');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> INSERT tb3(username) VALUES('Rose');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> INSERT tb3(username) VALUES('Alice');
    Query OK, 1 row affected (0.00 sec)
    
    # 查看记录
    mysql> SELECT * FROM tb3;    # 发现数据表结构自动编号,起始值为1,每次递增为1
    +----+----------+
    | id | username |
    +----+----------+
    |  1 | John     |
    |  2 | Tom      |
    |  3 | Rose     |
    |  4 | Alice    |
    +----+----------+
    4 rows in set (0.00 sec)
    

    AUTO_INCREMENT 字段必须定位为主键,但主键不一定与 AUTO_INCREMENT 字段使用

    可以理解为,AUTO_INCREMENT 为递增量,它必须定义为主键才能使用,如果没有给 第一个列(id)插入值,那么起始值为 1,插入记录时,那么第 2 条记录的编号则为2,依次增加1,但是主键可以自己使用,当把 第一个列(id )定义为主键时,插入记录时,每条记录都需要插入值(编号),它没有递增量。

    示例:

    # 创建一个数据表 tb4
    mysql> CREATE TABLE tb4(
        -> id SMALLINT UNSIGNED PRIMARY KEY,   # 将 id 定义为主键,但没有设置 AUTO_INCREMENT 属性
        -> age VARCHAR(20) NOT NULL
        -> );
    Query OK, 0 rows affected (0.05 sec)
    
    # 查看数据表结构
    mysql> SHOW COLUMNS FROM tb4;     # 发现 Extra 位置,id 为空,并没有出现 AUTO_INCREMENT(增量)
    +-------+----------------------+------+-----+---------+-------+
    | Field | Type                 | Null | Key | Default | Extra |
    +-------+----------------------+------+-----+---------+-------+
    | id    | smallint(5) unsigned | NO   | PRI | NULL    |       |
    | age   | varchar(20)          | NO   |     | NULL    |       |
    +-------+----------------------+------+-----+---------+-------+
    2 rows in set (0.00 sec)
    
    # 插入两条记录
    mysql> INSERT tb4 VALUES(4,'Tom');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> INSERT tb4 VALUES(20,'Rose');
    Query OK, 1 row affected (0.01 sec)
    
    # 查看插入记录
    mysql> SELECT * FROM tb4;         # 第一条记录的编号为 4,第二条为 20,如果再插入 20 则会出错
    +----+------+
    | id | age  |
    +----+------+
    |  4 | Tom  |
    | 20 | Rose |
    +----+------+
    2 rows in set (0.00 sec)
    

    2.8.2、初涉唯一约束(UNIQUE KEY)

    每张表中只能有一个主键,而往往主键与 AUTO_INCREMENT 使用了,要保证记录的唯一性,也可以使用唯一约束。

    • 唯一约束
    • 唯一约束可以保证记录的唯一性
    • 唯一约束的字段可以为空(NULL)
    • 每张数据表可以存在多个唯一约束

    示例:

    # 创建一个数据表 tb5
    mysql> CREATE TABLE tb5(
        -> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,  # 将 id 定位为主键
        -> username VARCHAR(20) NOT NULL UNIQUE KEY,       # 将 username 定义为UNIQUE KEY
        -> age TINYINT UNSIGNED
        -> );
    Query OK, 0 rows affected (0.04 sec)
    
    # 查看数据表结构
    mysql> SHOW COLUMNS FROM tb5;
    +----------+----------------------+------+-----+---------+----------------+
    | Field    | Type                 | Null | Key | Default | Extra          |
    +----------+----------------------+------+-----+---------+----------------+
    | id       | smallint(5) unsigned | NO   | PRI | NULL    | auto_increment |
    | username | varchar(20)          | NO   | UNI | NULL    |                |
    | age      | tinyint(3) unsigned  | YES  |     | NULL    |                |
    +----------+----------------------+------+-----+---------+----------------+
    3 rows in set (0.00 sec)
    
    # 插入两条一样的记录
    mysql> INSERT tb5(username,age) VALUES('Tom',22);
    Query OK, 1 row affected (0.00 sec)
    
    # 插入第二条时,发生错误,提示 Tom 重复,也就是说唯一约束的唯一性
    mysql> INSERT tb5(username,age) VALUES('Tom',22);
    ERROR 1062 (23000): Duplicate(重复的) entry 'Tom' for key 'username'
    
    # 查看插入记录
    mysql> SELECT * FROM tb5;
    +----+----------+------+
    | id | username | age  |
    +----+----------+------+
    |  1 | Tom      |   22 |
    +----+----------+------+
    1 row in set (0.00 sec)
    

    2.8.3、初涉默认约束(DEFAULT)

    • 默认值
    • 当插入记录时,如果没有明确为字段赋值,则自动赋予默认值

    示例:

    # 创建一个数据表 tb6
    mysql> CREATE TABLE tb6(
        -> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        -> username VARCHAR(20) NOT NULL UNIQUE KEY,
        -> sex ENUM('男','女','保密') DEFAULT '保密'   # 性别列设置默认值(DEFAULT)为保密
        -> );
    Query OK, 0 rows affected (0.04 sec)
    
    # 仓库数据表结构
    mysql> SHOW COLUMNS FROM tb6;
    +----------+------------------------+------+-----+---------+----------------+
    | Field    | Type                   | Null | Key | Default | Extra          |
    +----------+------------------------+------+-----+---------+----------------+
    | id       | smallint(5) unsigned   | NO   | PRI | NULL    | auto_increment |
    | username | varchar(20)            | NO   | UNI | NULL    |                |
    | sex      | enum('男','女','保密') | YES  |     | 保密    |                |
    +----------+------------------------+------+-----+---------+----------------+
    3 rows in set (0.00 sec)
    
    # 插入记录
    mysql> INSERT tb6(username) VALUES('Tom');  # 性别没有赋值,将使用默认值
    Query OK, 1 row affected (0.01 sec)
    
    # 查看插入记录
    mysql> SELECT * FROM tb6;
    +----+----------+------+
    | id | username | sex  |
    +----+----------+------+
    |  1 | Tom      | 保密 |
    +----+----------+------+
    1 row in set (0.00 sec)
    

    2.9、总结

    1. 数据类型:字符型、整型、浮点型、日期时间型

    2. 数据表操作:插入记录、查找记录

    3. 记录操作:创建数据表、约束的使用

  • 相关阅读:
    vue中的 computed 和 watch 的区别
    mysql8.0 初始化数据库及表名大小写问题
    sql server alwayson 调整数据文件路径
    zabbix 自定义监控 SQL Server
    mysql 创建用户及授权
    mysql 设置从库只读模式
    mysql8.0 主从复制安装及配置
    centos8.0安装mysql8.0
    centos8替换阿里数据源
    npm publish 报错 【you or one of your dependencies are requesting a package version that is forbidden by your security policy】
  • 原文地址:https://www.cnblogs.com/midworld/p/13617317.html
Copyright © 2011-2022 走看看