【MySQL — 数据库基础】深入解析MySQL常用表操作
1. 查看所有表
在使用表操作时,我们需要先选中一个数据库 :
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| java113 |
| mysql |
| performance_schema |
| sys |
| test |
| xiaolei |
+--------------------+
7 rows in set (0.00 sec)
mysql> use test;
Database changed
选中一个数据库之后,查看当前数据库有哪些表:
mysql> show tables;
Empty set (0.04 sec)
解析:
因为我们查看表时选中的数据库是刚刚创建好的,所以是空表 ;
set 在不同上下文有不同的含义:
1. 设置
面向对象,使用 get/set 方法;
2. 集合(指的是数学上的集合)
(1)无序(不是升序降序的那种有序,而是区分不同集合只看元素种类,不看元素顺序)
(2)唯一(集合内无重复元素)
上述的 set 则表示集合的意思,在数据库中进行一些查询操作,就会得到一系列的结果数据,把这些结果数据称为 “结果集”。
2. 创建表
语法:
CREATE TABLE table_name (
column1 datatype [constraint],
column2 datatype [constraint],
...
);
- table_ name:指定表的名称。
- column:定义列的名称。
- datatype: 指定列的数据类型,常见的如INT,VARCHAR, DATE 等。
- constraint: 可选项,用来定义列的约束,如 NOT NULL、PRIMARY KEY, AUTO_INCREMENT 等。
示例
- (1)创建一个用户表,其中包含用户编号、用户名、密码、生日,并指定字符集为utf8mb4,排序规则为 utf8mb4_0900_ai_ci
mysql> create table users (
id bigint,
name varchar(20) comment '用户名',
password char(32) comment'密码是32位的md5值',
birthday date comment'生日'
) CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci;
Query oK, o rows affected(0.01 sec)
注释 :
- (2) 创建一个表并指定存储引擎为MyISAM
mysql> create table t_myisam (
id bigint,
name varchar(20) comment'用户名'
) engine = MyISAM;
Query ok, 0 rows affected (0.01 sec)
在关系型数据库中,一个表有哪些列,每个列叫什么名字,每个列使用什么类型,都是需要提前确定好的,后续往表里存储的数据,都要严格遵守上述类型的要求:
mysql> create table test(id int , name varchar(20));
Query OK, 0 rows affected (0.11 sec)
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| test |
+----------------+
1 row in set (0.01 sec)
3. 查看表结构
mysql> desc 表名;
这个表操作是查看指定表的详细情况,查看的表结构是查看有哪些列,每个列是什么情况,不能查看表里的内容;
通过 desc 表名,查看到的就是类似于"文件详情"内容,这样的内容也称为"元数据"(Meta Data)
mysql> create table test(id int , name varchar(20));
Query OK, 0 rows affected (0.11 sec)
mysql> desc test;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.18 sec)
解析表结构
4. 删除表
语法:
mysql> DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [,tbl_name] ...
# TEMPORARY:表示临时表 tbl_name:将要删除的表名
说明 :
- 删除表是一个危险操作,执行删除语句时一定要谨慎
- 删除表成功后,磁盘上对应的数据文件也会被删除
- 一次可以删除多个表,表与表之间用逗号隔开
注意:
- 删表操作比删库操作更危险,进行该操作一定要慎重!
- 虽然删库意味着把所有的表都删除了,但是删库可以第一时间发现问题,程序在操作数据库时,可以第一时间反馈问题;处理问题越及时,损失越小;
- 但是删表操作造成的问题非常隐蔽,程序在使用数据库的时候,绝大部分的逻辑是可以正常运行的,但是得到的数据是否正确,是否靠谱,后续的业务流程是否正确就很难说了;
- 删表操作只是删除一个数据库的其中一个表,不知道多久才会访问到这张表从而触发报错,程序猿很可能在很久之后才能发现问题,造成的损失难以估量;
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| test |
+----------------+
1 row in set (0.01 sec)
mysql> desc test;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.18 sec)
mysql> drop table test;
Query OK, 0 rows affected (0.38 sec)
mysql> show tables;
Empty set (0.06 sec)
5. 表操作实践
创建一个store数据库,用来管理商店的商品、顾客和订单数据,这个数据库有以下三个表组成:
创建一个store数据库
mysql> create database store;
Query OK, 1 row affected (0.01 sec)
mysql> use store; # 使用新创建的 store 数据库
Database changed
创建商品、顾客和订单数据的表
mysql> create table goods(
goods_id bigint comment '商品编号',
goods_name varchar(50) comment '商品名',
goods_unitprice decimal(12,2) comment'零售单价',
goods_costprice decimal(12,2) comment '成本价',
goods_category varchar(20) comment '商品类型',
goods_provider varchar(50) comment '供应商'
);
Query OK, 0 rows affected (0.06 sec)
mysql> desc goods;
+-----------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+---------------+------+-----+---------+-------+
| goods_id | bigint | YES | | NULL | |
| goods_name | varchar(50) | YES | | NULL | |
| goods_unitprice | decimal(12,2) | YES | | NULL | |
| goods_costprice | decimal(12,2) | YES | | NULL | |
| goods_category | varchar(20) | YES | | NULL | |
| goods_provider | varchar(50) | YES | | NULL | |
+-----------------+---------------+------+-----+---------+-------+
6 rows in set (0.01 sec)
mysql> create table customer(
customer_id bigint,
customer_name varchar(20),
customer_gender bool,
customer_phone_num varchar(20),
customer_email_address varchar(255),
customer_create_time datetime
);
Query OK, 0 rows affected (0.04 sec)
mysql> desc customer;
+------------------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------------+--------------+------+-----+---------+-------+
| customer_id | bigint | YES | | NULL | |
| customer_name | varchar(20) | YES | | NULL | |
| customer_gender | tinyint(1) | YES | | NULL | |
| customer_phone_num | varchar(20) | YES | | NULL | |
| customer_email_address | varchar(255) | YES | | NULL | |
| customer_create_time | datetime | YES | | NULL | |
+------------------------+--------------+------+-----+---------+-------+
6 rows in set (0.01 sec)
mysql> create table purchase(
order_id varchar(32),
customer_id bigint,
goods_id bigint,
nums int,
amount decimal(12, 2),
create_time datetime
);
Query OK, 0 rows affected (0.02 sec)
mysql> desc purchase;
+-------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+-------+
| order_id | varchar(32) | YES | | NULL | |
| customer_id | bigint | YES | | NULL | |
| goods_id | bigint | YES | | NULL | |
| nums | int | YES | | NULL | |
| amount | decimal(12,2) | YES | | NULL | |
| create_time | datetime | YES | | NULL | |
+-------------+---------------+------+-----+---------+-------+
6 rows in set (0.01 sec)
mysql> show tables;
+-----------------+
| Tables_in_store |
+-----------------+
| customer |
| goods |
| purchase |
+-----------------+
3 rows in set (0.01 sec)
补充
(1)使用 int 表示钱来增加运算效率
注意:如果用 decimal 来表示钱,会出现存储空间大,运算速度慢的问题:
要改进这个问题,让价格运算能按照比较高效的方式来运算存储,同时又保证高精度运算,我们可以直接使用 int 来表示钱:
- 使用小数表示,意思是单位是“元”,如果使用“分”或者“厘”来表示单位,就可以使用整数来表示;
- 某个商品的价格是1块2毛5分,使用 int 可以表示为 125;
- 但是有些场景要求更高精度,不方便单位换算,就还是用回 decimal。