运维开发宝典026-MySQL02数据库表操作



大家好,我是云计算磊哥,从业20年的IT老鸟。运维培训15年,总结了一套从入门到精通的全运维开发宝典手册。准备用300天时间写一套博文,手把手从安装软件讲起,从行业到产品,从过去到未来,从理论到操作,从视频到文档工具,一站式。从零基础入门到20k运维开发工程师岗位诸多就业问题。多方位全方面的给你讲清楚云计算这个行业该如何做。关注我。后续AI大模型开发课程更精彩。


开源数据库MySQL DBA运维实战 表

1 初识SQL语言

SQL(Structured Query Language 即结构化查询语言)

DDL (data definition language)语句 数据库定义语言: 数据库、表、视图、索引、存储过程,例如CREATE DROP ALTER

DML(data manipulation language)语句 数据库操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE

DQL (Data Query Language )语句 数据库查询语言: 查询数据SELECT

DCL (Data Control Language)语句 数据库控制语言: 例如控制用户的访问权限GRANT、REVOKE

2 名词解释

数据库服务器: 运行着数据库应用程序的设备.

数据库: 表的管理单元.

默认数据库:

  • information_schema: 虚拟库,主要存储了系统中的一些数据库对象的信息,例如用户表信息、列信息、权限信息、字符信息等
  • performance_schema: 主要存储数据库服务器的性能参数
  • mysql: 授权库,主要存储系统用户的权限信息
  • sys: 主要存储数据库服务器的性能参数

表: 记录的管理单元

记录: 字段的管理单元

字段: 字段名,字段类型(长度),字段约束组成

类型: 字符,数字,日期

约束: 不能为空,自动增长等

图示

3 DDL1(库)
3.1 定义库

创建业务数据库

shell 复制代码
语法:CREATE DATABASE 数据库名;

要求:

  • 区分大小写
  • 唯一性
  • 不能使用关键字如 create select
  • 不能单独使用数字

查看数据库

shell 复制代码
语法: SHOW DATABASES;

选择数据库

复制代码
USE 数据库名

查询当前库

复制代码
SELECT database();

删除数据库

复制代码
DROP DATABASE 数据库名;

系统中的位置

/usr/local/mysql/data/ 源码安装

/var/lib/mysql/ RPM安装

3.2 数据类型

MySQL常见的数据类型

前言

在MySQL数据库管理系统中,可以通过存储引擎来决定表的类型。同时,MySQL数据库管理系统也提供了数据类型决定表存储数据的类型。

数值类型

  • 整数类型 INT
    • 浮点数类型 FLOAT DOUBLE
    • 定点数类型 DEC
      • 位类型 BIT

字符串类型

  • CHAR系列 CHAR VARCHAR
    • TEXT系列 TEXT
    • BLOB 系列 BLOB
    • BINARY系列 BINARY VARBINARY
    • 枚举类型:ENUM
  • 集合类型: SET

时间和日期类型

  • DATE
    • TIME
      • DATETIME
      • TIMESTAMP
    • YEAR

数据类型测试

===整数类型测试:tinyint,int

复制代码
1 创建一个表
mysql> create table test1( 
    tinyint_test tinyint,
   int_test int
  );
2 查询表结构
mysql> desc test1;
+--------------+------------+------+-----+---------+-------+
| Field        | Type       | Null | Key | Default | Extra |
+--------------+------------+------+-----+---------+-------+
| tinyint_test | tinyint(4) | YES  |     | NULL    |       | 
| int_test     | int(11)    | YES  |     | NULL    |       | 
+--------------+------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
3 插入数值
mysql> insert into test1 values (111,111);
Query OK, 1 row affected (0.09 sec)
mysql> insert into test1(tinyint_test) values(128);
ERROR 1264 (22003): Out of range value for column 'tinyint_test' at row 1
mysql> insert into test1(int_test) values(2147483647);
Query OK, 1 row affected (0.05 sec)
mysql> insert into test1(int_test) values(2147483648);
ERROR 1264 (22003): Out of range value for column 'int_test' at row 1
结论:
TINYINT有符号型最大127
INT有符号型最大2147483647

===浮点数类型测试:float

shell 复制代码
1 创建一个表
mysql> create table test4(float_test float(5,2));		//一共5位,小数占2位
Query OK, 0 rows affected (0.00 sec)
2查询表结构
mysql> desc test4;
+------------+------------+------+-----+---------+-------+
| Field      | Type       | Null | Key | Default | Extra |
+------------+------------+------+-----+---------+-------+
| float_test | float(5,2) | YES  |     | NULL    |       | 
+------------+------------+------+-----+---------+-------+
1 row in set (0.00 sec)
3插入合法数据,非法数据
mysql> insert into test4 values (10.2), (70.243), (70.246);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0
4查询表内容
mysql> select * from test4;
+------------+
| float_test |
+------------+
|      10.20 | 
|      70.24 | 
|      70.25 | 
+------------+
3 rows in set (0.00 sec)
5插入非法数据
mysql> insert into test4 values (1111.2);
ERROR 1264 (22003): Out of range value for column 'float_test' at row 1

===时间和日期类型测试:year、date、time、datetime、timestamp

复制代码
1 创建一个表
mysql> create table test_time(
 d date,
 t time,
 dt datetime
 );
Query OK, 0 rows affected (0.03 sec)

2查看表结构
mysql> desc test_time;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| d     | date     | YES  |     | NULL    |       |
| t     | time     | YES  |     | NULL    |       |
| dt    | datetime | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
3 rows in set (0.01 sec)
3插入时间
mysql> insert into test_time values(now(),now(),now());
Query OK, 1 row affected, 1 warning (0.02 sec)
4查看表内容
mysql> select * from test_time;
+------------+----------+---------------------+
| d          | t        | dt                  |
+------------+----------+---------------------+
| 2016-12-18 | 00:06:10 | 2013-12-18 00:06:10 |
+------------+----------+---------------------+
1 row in set (0.00 sec)

===字符串类型测试:CHAR、VARCHAR

复制代码
1创建表
mysql> create table vc (
v varchar(4),
 c char(4)
 );
Query OK, 0 rows affected (0.03 sec)
2 查看表结构
mysql> desc vc;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| v     | varchar(4) | YES  |     | NULL    |       |
| c     | char(4)    | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
3插入数据
mysql> insert into vc values('a','a');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into vc values('ab   ','ab   ');
Query OK, 1 row affected, 1 warning (0.00 sec)
4查询表内容
mysql> select * from vc;
+------+------+
| v    | c    |
+------+------+
| a   | a   |
| ab   | ab   |
+------+------+
1 row in set (0.00 sec)
5调动函数   length(v) 统计长度的函数
mysql> select length(v),length(c) from vc;
+-----------+-----------+
| length(v) | length(c) |
+-----------+-----------+
|         1 |         1|
|         4 |         2 |
+-----------+-----------+
1 row in set (0.00 sec)

mysql> select concat(v,'='), concat(c,'=') from vc;	 //在后面加字符'=',看的更清楚
+---------------+---------------+
| concat(v,'=') | concat(c,'=') |
+---------------+---------------+
| a=         | a=           |
| ab  =         | ab=           |
+---------------+---------------+
1 row in set (0.00 sec)
在检索的时候,CHAR列删除了尾部的空格,而VARCHAR则保留这些空格

===枚举类型、集合类型:ENUM类型,SET测试

作用

复制代码
字段的值只能在给定范围中选择
常见的是单选按钮和复选框
enum  单选	  只能在给定的范围内选一个值,如性别 sex 男male/女female
set  	   多选    在给定的范围内可以选择一个或一个以上的值(爱好1,爱好2,爱好3...)

目标

复制代码
表school.student3											                
姓名	name	varchar(50)									            
性别	sex		enum('m','f')							                    
爱好	hobby	set('music','book','game','disc')	   

示例

复制代码
1 创建表
mysql> use school
mysql> create table student3(
 name varchar(50),
 sex enum('m','f'),
 hobby set('music','book','game','disc')
 );
Query OK, 0 rows affected (0.31 sec)
2查看表结构
mysql> desc student3;
+-------+-----------------------------------+------+-----+---------+-------+
| Field | Type                              | Null | Key | Default | Extra |
+-------+-----------------------------------+------+-----+---------+-------+
| name  | varchar(50)                       | YES  |     | NULL    |       |
| sex   | enum('m','f')                     | YES  |     | NULL    |       |
| hobby | set('music','book','game','disc') | YES  |     | NULL    |       |
+-------+-----------------------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> show create table student3\G
*************************** 1. row ***************************
       Table: student3
Create Table: CREATE TABLE `student3` (
  `name` varchar(50) default NULL,
  `sex` enum('m','f') default NULL,
  `hobby` set('music','book','game','disc') default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
========================================================
3插入数据
mysql> insert into student3 values  ('tom','m','book,game');
Query OK, 1 row affected (0.00 sec)
4查询数据

mysql> select * from student3;
+------+------+-----------+
| name | sex  | hobby     |
+------+------+-----------+
| tom  | boy  | book,game | 
+------+------+-----------+
1 row in set (0.00 sec)
5插入非法数据
mysql>  insert into student3 values ('jack','m','film');
ERROR 1265 (01000): Data truncated for column 'hobby' at row 1
超出范围
3.3 DDL2(表)

前言

复制代码
在了解的数据类型后,下面我们就完整的学习,一张表该如何管理。
通过什么类型存储什么样的数据呢?
表的创建之后,后期该如何管理呢?

分类

复制代码
MySQL表操作  DDL

目的

复制代码
表是数据库存储数据的基本单位,由若干个字段组成,主要用来存储数据记录。表的操作
包括创建表、查看表、修改表和删除表。
这些操作都是数据库管理中最基本,也是最重要的操作。本节内容包括:

命令汇总

复制代码
创建表 create table
查看表结构 desc    table,  show    create table
表完整性约束
修改表 alter table
复制表 create table ...
删除表 drop table

表school.student1示例

复制代码
1.创建表

mysql> CREATE  DATABASE school;				            //创建数据库school
mysql> use school;		//使用库
mysql> create table student1(
  id int,
 name varchar(50),                 
 sex enum('m','f'),
 age int
 );
Query OK, 0 rows affected (0.03 sec)

2.查看所有表
mysql> show tables;			                                    //查看表(当前所在库)
+------------------+
| Tables_in_school |
+------------------+
| student1         |
+------------------+
1 row in set (0.00 sec)
3.查看表内容
mysql> select * from student1;			  //查询表中所有字段的值
Empty set (0.00 sec)
mysql> select id,name,sex,age from student1;	//查询表中所有字段的值
Empty set (0.00 sec)
mysql> select name,age from student1;		        //查询表中指定字段的值
Empty set (0.00 sec)
4.查看表结构
mysql> desc student1;
5.表中插入内容
mysql>insert into student values
(1,'zhangsan','m',33) ,
(2,'lisi','f',20) ,
(1,'wangwu','m',40) ,
6.查询表的内容
mysql> select * from student;
3.4 完整性约束扩展

目的

复制代码
由于生活中需要避免重名的情况,所以数据库中使用完整性约束来限定此类要求。
用于保证数据的完整性和一致性

约束类型

复制代码
PRIMARY KEY (PK)
	    标识该字段为该表的主键,可以唯一的标识记录,不可以为空  UNIQUE + NOT NULL
		员工信息表
FOREIGN KEY (FK)
	    标识该字段为该表的外键,实现表与表(父表主键/子表1外键/子表2外键)之间的关联
		员工工资表
UNIQUE KEY  (UK)
	    标识该字段的值是唯一的,可以为空,一个表中可以有多个UNIQUE KEY
AUTO_INCREMENT
		标识该字段的值自动增长(整数类型,而且为主键)
DEFAULT
		为该字段设置默认值
		字段是否有默认值,缺省的默认值是NULL,如果插入记录时不给字段赋值,此字段使用默认值

NOT NULL	
	    标识该字段不能为空
		是否允许为空,默认NULL,可设置NOT NULL,字段不允许为空,必须赋值
UNSIGNED
		无符号,正数
ZEROFILL 
		使用0填充,例如0000001

约束类型测试

===默认值、空值:DEFAULT、NOT NULL

复制代码
目的:
1 某列设置为"不允许为空",请思考可否不插入数值。
2  某列设置默认值,并不输入数值,请思考该列是否会显示默认值。
1创建表
mysql> create table student.student4(
 id int not null, 
name varchar(50) not null, 
sex enum ('m','f') default 'm' not null, 
age int unsigned default 18 not null, 
hobby set('music','disc','dance','book') default 'book,dance'
 );
Query OK, 0 rows affected (0.01 sec)

2 查看表结构
MariaDB [student]> desc student4;
+-------+------------------------------------+------+-----+------------+-------+
| Field | Type                               | Null | Key | Default    | Extra |
+-------+------------------------------------+------+-----+------------+-------+
| id    | int(11)                            | NO   |     | NULL       |       |
| name  | varchar(50)                        | NO   |     | NULL       |       |
| sex   | enum('m','f')                      | NO   |     | m          |       |
| age   | int(10) unsigned                   | NO   |     | 18         |       |
| hobby | set('music','disc','dance','book') | YES  |     | dance,book |       |
+-------+------------------------------------+------+-----+------------+-------+
5 rows in set (0.00 sec)
3 插入数据
mysql> insert into student4 values(1,'jack','m',20,'book');
Query OK, 1 row affected (0.00 sec)

mysql> select * from student4;

mysql> insert into student4(id,name) values(2,'robin');
Query OK, 1 row affected (0.00 sec)

mysql> select * from student4;
4插入非法数据
随便找一列,插入空值
mysql> insert into student4 values(3,NULL,'m',40,'book');
ERROR 1048 (23000): Column 'name' cannot be null
注意观察输出错误的结果,理解默认值和空值的含义。NULL函数是空值的意思。

===设置唯一约束 UNIQUE

复制代码
目的
1 unique唯一的特性。
2 unique是可以为空的。
为部门创建一张员工信息表
1 创建表 表company.department1
mysql>  CREATE TABLE company.department1 (dept_id INT,
dept_name VARCHAR(30) UNIQUE,
comment VARCHAR(50)
);
2查看表结构 观察UNIQUE的显示位置
MariaDB [(none)]> desc company.department1;
+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| dept_id   | int(11)     | YES  |     | NULL    |       |
| dept_name | varchar(30) | YES  | UNI | NULL    |       |
| comment   | varchar(50) | YES  |     | NULL    |       |
+-----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

3插入数据
insert into department1 values (1,'zhangsan','yyy');
insert into department1 values (1,NULL,'yyy');
非法数据
insert into department1 values (1,'zhangsan','yyy');
ERROR 1062 (23000): Duplicate entry 'zhangsan' for key 'dept_name'

===设置主键约束 PRIMARY KEY

复制代码
目的
1.primary key 字段的值是不允许重复,且不允许NULL(UNIQUE + NOT NULL)
2.单列做主键
3.多列做主键(复合主键)
1创建表
表school.student6 方法一
mysql> create table student6(
 id int primary key not null auto_increment,
 name varchar(50) not null,
 sex enum('male','female') not null default 'male', 
 age int not null default 18
 );
Query OK, 0 rows affected (0.00 sec)
2查询表结构
desc student6;
+-------+-----------------------+------+-----+---------+----------------+
| Field | Type                  | Null | Key | Default | Extra          |
+-------+-----------------------+------+-----+---------+----------------+
| id    | int(11)               | NO   | PRI | NULL    | auto_increment |
| name  | varchar(50)           | NO   |     | NULL    |                |
| sex   | enum('male','female') | NO   |     | male    |                |
| age   | int(11)               | NO   |     | 18      |                |
+-------+-----------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

3插入数据

mysql> insert into student6 values (1,'alice','female',22);

mysql> insert into student6(name,sex,age) values
 ('jack','male',19),
 ('tom','male',23);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0
4查询表内容
mysql> select * from student6;
+----+-------+------+-----+
| id | name  | sex  | age |
+----+-------+------+-----+
|  1 | alice | female |  22 | 
|  2 | jack  | male  |  19 | 
|  3 | tom   | male  |  23 | 
+----+-------+------+-----+
3 rows in set (0.00 sec)

5 插入非法数据
MariaDB [company]> insert into student6(name,sex,age) values  (3,'jack','male',19);
ERROR 1136 (21S01): Column count doesn't match value count at row 1
6 主键设置了自动增长,再次尝试插入数据。成功(注意不要插入主键)
3.5 DDL3(修改)课下作业

分类

修改表名

复制代码
  ALTER TABLE 表名 
                      RENAME 新表名;

增加字段

复制代码
	  ALTER TABLE 表名
                    	  ADD 字段名  数据类型 [完整性约束条件...],
                          ADD 字段名  数据类型 [完整性约束条件...];
	追加
     ALTER TABLE 表名
                      	  ADD 字段名  数据类型 [完整性约束条件...]  FIRST;
	首列
     ALTER TABLE 表名
	                  	  ADD 字段名  数据类型 [完整性约束条件...]  AFTER 字段名;
	中间

删除字段

sql 复制代码
	  ALTER TABLE 表名
						   DROP 字段名;

修改字段

sql 复制代码
	  ALTER TABLE 表名 
	                      MODIFY  字段名 数据类型 [完整性约束条件...];
	  ALTER TABLE 表名 
	                      CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件...];
	  ALTER TABLE 表名 
	                      CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件...];

示例

sql 复制代码
1.修改表名
ALTER TABLE t1 RENAME  t2;
2. 添加字段
mysql> create table student10 (id int);
mysql> alter table student10
    -> add name varchar(20) not null,
    -> add age int not null default 22;
    
mysql> alter table student10
    -> add stu_num int not null after name;		                        //添加name字段之后

mysql> alter table student10                        
    -> add sex enum('male','female') default 'male' first;		        //添加到最前面
3. 删除字段
mysql> alter table student10
        -> drop sex;

mysql> alter table service
        -> drop mac;
4.删除主键[primary key auto_increment]
a. 删除自增约束
mysql> alter table student10 modify id int not null; 

b. 删除主键
mysql> alter table student10                                 
        -> drop primary key;
5.1修改字段类型modify
mysql> alter table student10
        -> modify age tinyint  not null default 22;              //注意保留原有的约束条件
    
mysql> alter table student10
        -> modify id int not null primary key ;	    //修改字段类型、约束、主键
5. 2增加约束(针对已有的主键增加auto_increment)
mysql> alter table student10 
modify id int not null 
primary key 
auto_increment;         //错误,该字段已经是primary key

ERROR 1068 (42000): Multiple primary key defined

mysql> alter table student10 
modify id int not null 
???
auto_increment;

Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0
6. 增加复合主键
mysql> alter table student10  add primary key(host_ip,port);		
7. 增加主键
mysql> alter table student1
        -> add primary key(id);
8. 增加主键和自动增长
mysql> alter table student1
        -> modify id int not null primary key auto_increment;
9. 修改存储引擎
mysql> alter table service   engine=innodb; 	 
//engine=myisam|memory|....
innodb提供事物支持及主外键高级功能
MyISAM不支持事物处理,强调高性能。
memory仅内存
3.6 DDL4(复制删除)扩展

分类

  • 复制表结构+记录 (key不会复制: 主键、外键和索引)
  • 只复制表结构
  • 复制表结构,包括Key
  • 删除表

示例

1 .复制表结构+记录 (key不会复制: 主键、外键和索引)

sql 复制代码
mysql> create table new_service 
select * from service;

2.只复制表结构

sql 复制代码
mysql> create table new1_service select * from service where 1=2;  //条件为假,查不到任何记录

3.复制表结构,包括Key

sql 复制代码
mysql> create table t4 like employees;

4.删除表

sql 复制代码
DROP TABLE 表名;

mysql阶段csdn配套视频 https://edu.csdn.net/course/detail/40864

相关推荐
小二·1 小时前
Redis 内存溢出(OOM)排查与恢复实战
数据库·redis·bootstrap
pqk6V6Vep1 小时前
Redis 分布式锁进阶第一篇讲解
数据库·redis·分布式
天天进步20151 小时前
Tunnelto 源码解析 #9:控制服务器设计:Warp、WebSocket、Ping/Pong 与连接保活
运维·服务器·websocket
giaz14n9X1 小时前
Redis 分布式锁进阶第六十一篇
数据库·redis·分布式
是一个Bug1 小时前
MongoDB:像搭积木一样存数据
数据库·mongodb
ULIi096kr2 小时前
MySQL解决Too many connections报错:连接数爆满排查、优化与永久解决方案
数据库·mysql·adb
极客先躯2 小时前
高级java每日一道面试题-2026年02月01日-实战篇[Docker]-Docker Volume 的生命周期管理是怎样的?
java·运维·docker·容器·持久化·架构图·容器卷
Java面试题总结2 小时前
Linux-Ubantu-贴士-apt的地盘
linux·运维·服务器
SL-staff2 小时前
(一)数据源配置 —— JVS-Rules规则引擎 V2.5 操作说明介绍
数据库·jar·规则引擎·数据源·jvs-rules·api 接口·jvs低代码