[每天记录一个问题,记录十年 Blog]
1.1 mysql增删_数据库
A. 创建数据库
creat database [if not exists] database_name # 创建数据库
character set utf8mb4 # 指定字符集
collate utf8mb4_general_ci # 指定排序规则
mysqladmin -u your_username -p create your_database \ # 使用mysql mysqladmin命令创建数据库
--default-character-set=utf8mb4 \ #指定字符集
--default-collation=utf8mb4_general_ci # 指定排序规则
B. 删除数据库
drop database [if exists] database_name # 删除数据库
mysqladmin -u your_username -p drop your_databsae # 使用mysql mysqladmin命令删除数据库
C. 选中数据库(确保数据库存在,否则将收到报错消息,可以先用show databases查询可用数据库)
use database_name # 选择数据库
mysql -u root -p -D your_database # -D参数用于指定要选择的数据库
1.2 mysql数据类型
A. 数值类型
| 类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
|---|---|---|---|---|
| tinyint | 1 Bytes | (-128,127) | (0,255) | 小整数值 |
| smallint | 2 Bytes | (-32 768,32 767) | (0,65 535) | 大整数值 |
| mediumint | 3 Bytes | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
| int或integer | 4 Bytes | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
| bigint | 8 Bytes | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
| float | 4 Bytes | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度 浮点数值 |
| double | 8 Bytes | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度 浮点数值 |
| decimal | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
B. 日期和时间类型
| 类型 | 大小 ( bytes) | 范围 | 格式 | 用途 |
|---|---|---|---|---|
| date | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
| time | 3 | ‘-838:59:59’/’838:59:59’ | HH:MM:SS | 时间值或持续时间 |
| year | 1 | 1901/2155 | YYYY | 年份值 |
| datetime | 8 | ‘1000-01-01 00:00:00’ 到 ‘9999-12-31 23:59:59’ | YYYY-MM-DD hh:mm:ss | 混合日期和时间值 |
| timestamp | 4 | ‘1970-01-01 00:00:01’ UTC 到 ‘2038-01-19 03:14:07’ UTC结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYY-MM-DD hh:mm:ss | 混合日期和时间值,时间戳 |
C. 字符串类型
| 类型 | 大小 | 用途 |
|---|---|---|
| char | 0-255 bytes | 定长字符串 |
| varchar | 0-65535 bytes | 变长字符串 |
| tinyblob | 0-255 bytes | 不超过 255 个字符的二进制字符串 |
| tinytext | 0-255 bytes | 短文本字符串 |
| blob | 0-65 535 bytes | 二进制形式的长文本数据 |
| text | 0-65 535 bytes | 长文本数据 |
| mediumblob | 0-16 777 215 bytes | 二进制形式的中等长度文本数据 |
| mediumtext | 0-16 777 215 bytes | 中等长度文本数据 |
| longblob | 0-4 294 967 295 bytes | 二进制形式的极大文本数据 |
| longtext | 0-4 294 967 295 bytes | 极大文本数据 |
注意:char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符。
CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
BINARY 和 VARBINARY(定长和变长的非二进制字节串,不是字符串) 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。
有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。
D. 枚举与集合类型(enumeration and set types)
| ENUM | 枚举类型,用于存储单一值,可以选择一个预定义的集合。 |
|---|---|
| SET | 集合类型,用于存储多个值,可以选择多个预定义的集合。 |
E. 空间数据类型(spatial data types)
geometry, point, linestring, polygon, multipoint, multilinestring, multipolygon, geometrycollection: 用于存储空间数据(地理信息、几何图形等)。
1.3 mysql增删_数据表
A. 创建表
① mysql创建表
create table table_name ( # 表名
column1 datatype, # 字段1 字段1类型
column2 datatype, # 字段2 字段2类型
);
create table users (
id int auto_increment primay key, # 用户id,整数类型,自增长,作为主键
username varchar(50) not null, # 用户名,变长字符串,不允许为空
email varchar(100) not null, # 用户邮箱,变长字符串,不允许为空
birthdate date, # 用户生日,日期类型
is_active boolean default true # 用户是否已激活,布尔类型,默认值true
);
如果希望在创建表时指定数据引擎,字符集和排序规则等,可以使用character set和collate子句
create table mytable (
id int primary key,
name varchar(50)
) character set utf8mb4 collate utf8mb4_general_ci; # 使用utf字符集且utf_ci排序
create table if not exists `runoob_tbl`(
`runoob_id` int unsigned auto_increment, # 定义列为自增,一般用于主键,数值会自动加1
`runoob_title` varchar(100) not null, # not null设置字段非空,当输入该字段为空值时,就会报错
`runoob_author` varchar(40) not null,
`submission_date` date,
primary key ( `runoob_id` ) # primary key定义列为主键,可以使用多列来定义主键,列间以,分隔
)engine=innodb default charset=utf8; # enging设置存储引擎,charset设置编码
② 通过命令提示符创建表
root@host# mysql -u root -p
enter password:*******
mysql> use runoob;
database changed
mysql> create table runoob_tbl(
-> runoob_id int not null auto_increment,
-> runoob_title varchar(100) not null,
-> runoob_author varchar(40) not null,
-> submission_date date,
-> primary key ( runoob_id )
-> )engine=innodb default charset=utf8;
query ok, 0 rows affected (0.16 sec)
mysql>
B. mysql删除表
drop table [if exists] table_name;
如果只是想删除表中的所有数据,但保留表的结构,可用truncate table语句:
truncate table table_name;
注意事项:
备份数据:在删除表之前,确保已经备份了数据,如果你需要的话。
外键约束:如果该表与其他表有外键约束,可能需要先删除外键约束,或者确保依赖关系被处理好。
C. 插入数据
① mysql插入数据insert into
insert into table_name (column1,column2,column3,···)
# 如果数据是字符型,必须使用单引号 ' 或者双引号 ",如: 'value1', "value1"。
values (value1,value2,value3,···);
如:
指定字段插入:
insert into user (username,email,birthdate,is_active)
# 用户名(字符串),邮箱地址(字符串),用户生日(字符串),是否已激活(布尔类型)
values ('test','test@runoob.com','1990-01-01',true);
如果要插入所有列的数据,可以省略列名(NULL是用于自增长列的占位符,表示系统将为id列生成一个唯一的值):
inster into users
values (null,'test','test#runoob.com','1990-01-01',true);
如果要插入多行数据,可以在value子句中指定多组数值:
insert into users (username,email,birthdate,is_active)
values
('test1','test1@runoob.com','1985-07-10',true),
('test2','test2@runoob.com','1988-11-25',false),
('test3','test3@runoob.com','1993-05-03',true);
② 通过命令提示符插入
root@host# mysql -u root -p password;
enter password:*******
mysql> use runoob;
database changed
mysql> insert into runoob_tbl
-> (runoob_title, runoob_author, submission_date) # 标题,作者,提交时间
-> values
-> ("学习 php", "菜鸟教程", now()); # 标题,作者,now()是mysql函数,该函数返回日期和时间
query ok, 1 rows affected, 1 warnings (0.01 sec)
mysql> insert into runoob_tbl
-> (runoob_title, runoob_author, submission_date)
-> values
-> ("学习 mysql", "菜鸟教程", now());
query ok, 1 rows affected, 1 warnings (0.01 sec)
mysql> insert into runoob_tbl
-> (runoob_title, runoob_author, submission_date)
-> values
-> ("java 教程", "runoob.com", '2016-05-06');
query ok, 1 rows affected (0.00 sec)
mysql>select * from runoob_tbl; # 读取数据表


