目录
1. 表的创建
1.1 创建表语法
create table student (
列属性名1 列数据类型,
列属性名2 列数据类型
) character set 字符集 collate 校验集 engine 存储引擎
可以在最后指定字符集等,也可以不指定使用默认配置的
也可以带选项,比如create table if not exists xxx;表示没有才创建
还有一种写法,比如有一张a表,然后像创建一张结构与a表一样的b表时语法如下:
create table b like a;
1.2 创建表案例
mysql> create table users(id int,
name varchar(20) comment '用户名',
password char(32) comment '32位密码',
birthday date comment '生日')charset=utf8mb4;
int表示整形,varchar表示变长字符串类型,char表示定长字符串类型,date表示日期类型,而comment表示对当前列属性的一个说明
当使用不同的存储引擎创建表时,最终在目录中所创建相关的文件个数是不同的,使用innoDB引擎时:
root@VM-16-3-ubuntu:/var/lib/mysql/base# ls
users.ibd
使用MyISAM引擎时:
root@VM-16-3-ubuntu:/var/lib/mysql/base# ls
users_375.sdi users.MYD users.MYI
1.3 查看表
使用show可以查看当前数据库中存在的表:
mysql> show tables;
+----------------+
| Tables_in_base |
+----------------+
|users|
+----------------+
1 row inset(0.00 sec)
前提是要在对应的数据库中
要查看某个表的详细信息时使用desc:
mysql> desc users;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
|id| int | YES || NULL ||| name | varchar(20)| YES || NULL ||| password | char(32)| YES || NULL ||| birthday |date| YES || NULL ||
+----------+-------------+------+-----+---------+-------+
4 rows inset(0.01 sec)
从左到右分别表示的是:字段名称(列属性)、字段类型、是否允许为空、索引类型、默认值和扩充
格式化显示带上\G:desc users \G;
如果要查看更加详细的表信息是可以使用如下指令:
mysql> show create table users;
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|users| CREATE TABLE `users`(`id` int DEFAULT NULL,
`name` varchar(20) DEFAULT NULL COMMENT '用户名',
`password` char(32) DEFAULT NULL COMMENT '32位密码',
`birthday`date DEFAULT NULL COMMENT '生日')ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row inset(0.00 sec)
格式化显示只需要把最后的冒号换成\G:
mysql> show create table users\G
*************************** 1. row ***************************
Table: users
Create Table: CREATE TABLE `users`(`id` int DEFAULT NULL,
`name` varchar(20) DEFAULT NULL COMMENT '用户名',
`password` char(32) DEFAULT NULL COMMENT '32位密码',
`birthday`date DEFAULT NULL COMMENT '生日')ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row inset(0.00 sec)
这种做法相当于是把当初创建表时的有效操作给记录下来了,所以是最详细的,包含了说明和字符集等等,不过可以发现的时候上面的写法貌似和当初自己写的不太一样,这是因为mysqld要对命令进行语法和词法分析,并对其按照标准进行修改优化,最后再去执行优化后的命令,也就是上面这样
2. 表的修改
2.1 修改表名
将表名user修改为us:
mysql> alter table usersrename to us;
Query OK, 0 rows affected (0.03 sec)
mysql> show tables;
+----------------+
| Tables_in_base |
+----------------+
| us |
+----------------+
1 row inset(0.00 sec)
其中to可以省略
还有一种写法:
rename table table_name_a to table_name_b [, ...]
2.2 插入数据
插入一条记录:
mysql> insert into us values (1, 'lzh', '12345', '2003.9.10');
也叫全列插入
插入多条记录,中间使用逗号隔开
如果只想插入其中几列时写法如下:
mysql> insert into us (id, password) values (1, '12345');
前面一个括号里填入需要写入的列名,后面则是对应的数据,但要注意的是,当使用指定列插入时,必须确保:
- 指定的列名在表中存在
- 提供的值的数量与指定的列的数量相匹配
- 值的类型与对应列的数据类型兼容。
而且如果表中有任何列被设置为not null且没有默认值,并且这些列没有被包括在insert语句中,那么将无法执行该insert操作,除非为这些列提供了默认值或允许它们接受null值
查看表内容:
mysql>select * from us;
+------+------+----------+------------+
|id| name | password | birthday |
+------+------+----------+------------+
|1| lzh |12345|2003-09-10 ||1| zz |12345|2003-09-10 |
+------+------+----------+------------+
2.3 新增一列
假设新增一列用来保存存储路径:
mysql> alter table us add path varchar(128) comment '路径' after birthday;
Query OK, 4 rows affected (0.06 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql>select * from us;
+------+------+----------+------------+------+
|id| name | password | birthday | path |
+------+------+----------+------------+------+
|1| lzh |12345|2003-09-10 | NULL ||1| zz |12345|2003-09-10 | NULL ||4| lzh |12345|2003-09-10 | NULL ||5| pp |666|2024-09-19 | NULL |
+------+------+----------+------------+------+
4 rows inset(0.00 sec)
新增并不会对之前列中的数据产生影响,只是新增列中的数据为空
after xxx表示在xxx那一列之后添加
2.4 修改某列
2.4.1 修改列的类型
将name列的数据类型改为varchar(60):
mysql> alter table us modify name varchar(60);
Query OK, 4 rows affected (0.05 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> show create table us \G;
*************************** 1. row ***************************
Table: us
Create Table: CREATE TABLE `us`(`id` int DEFAULT NULL,
`name` varchar(60) DEFAULT NULL,
`password` char(32) DEFAULT NULL COMMENT '32位密码',
`birthday`date DEFAULT NULL COMMENT '生日',
`path` varchar(128) DEFAULT NULL COMMENT '路径')ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row inset(0.00 sec)
ERROR:
No query specifie
可以发现,修改是直接覆盖最初的指令,把原来的属性和描述信息直接替换了
2.4.2 修改列名
把列名id改成user_id:
mysql> alter table us change columnid user_id int;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc us;
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| user_id | int | YES || NULL ||| name | varchar(60)| YES || NULL ||| password | char(32)| YES || NULL ||| birthday |date| YES || NULL ||| path | varchar(128)| YES || NULL ||
+----------+--------------+------+-----+---------+-------+
change column 旧列名 新列名 新数据类型和属性 (约束)
column可以省略
2.5 删除某列
删除当前表中的password列:
mysql> alter table user drop password;
Query OK, 4 rows affected (0.03 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> desc user;
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| user_id | int | YES || NULL ||| name | varchar(60)| YES || NULL ||| birthday |date| YES || NULL ||| path | varchar(128)| YES || NULL ||
+----------+--------------+------+-----+---------+-------+
mysql>select * from user;
+---------+------+------------+------+
| user_id | name | birthday | path |
+---------+------+------------+------+
|1| lzh |2003-09-10 | NULL ||1| zz |2003-09-10 | NULL ||4| lzh |2003-09-10 | NULL ||5| pp |2024-09-19 | NULL |
+---------+------+------------+------+
删除某列后,该列对应的数据也被删掉了
3. 表的删除
语法类似库的删除,很简单,drop table xxx:
mysql> show tables;
+----------------+
| Tables_in_base |
+----------------+
| stu || user |
+----------------+
2 rows inset(0.00 sec)
mysql> drop table stu;
Query OK, 0 rows affected (0.04 sec)
mysql> show tables;
+----------------+
| Tables_in_base |
+----------------+
| user |
+----------------+
1 row inset(0.00 sec)
也可以带选项,比如drop table if exists xxx;存在才删除
4. 注意
和库一样,不要轻易对表进行修改和删除,因为数据库是比较接近底层的,上层程序可能有很多地方都要用到这个数据库以及对应的表,如果你把名字改了,那上层都得跟着改,降低了维护性
版权归原作者 Zi_z 所有, 如有侵权,请联系我们删除。