数据库管理
类比概念
数据库: 文件夹
数据表: excel文件
数据库的相关指令
- 查看当前所有的的数据库
show databases
; - 创建数据库
create database 数据库名 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
后面的是编码以及排序规则 - 删除数据库
drop database 数据库名;
- 进入数据库
use 数据库名
import pymysql
conn = pymysql.connect(host="127.0.0.1", port=3306, user='root', passwd="jhy030116", charset='utf8')
# 创建光标
cursor = conn.cursor()
# 参看数据库
cursor.execute("show databases")
# 接收数据
result = cursor.fetchall()
print(result)
"""
# 2.创建数据库
cursor.execute(" create database day2 DEFAULT CHARSET utf8 COLLATE utf8_general_ci")
# 新增删除修改等操作需要添加一个commit
# conn.commit()
"""
cursor.execute("show databases")
result = cursor.fetchall()
print(result)
cursor.execute("use mysql")
cursor.execute("show tables")
result = cursor.fetchall()
print("mysql文件夹的内容")
print(result)
cursor.close()
conn.close()
数据表的相关内容
- 创建一个表
create tables 表名(
列名 类型,
列名 类型,
列名 类型
)default charset=utf8;
mysql> create table tb1(
-> id int,
-> name varchar(16)
-> )default charset=utf8;
Query OK, 0 rows affected (0.45 sec)
mysql> show tables;
+----------------+
| Tables_in_day2 |
+----------------+
| tb1 |
+----------------+
1 row in set (0.00 sec)
mysql> create table tb2(id int, name varchar(16) not null, --不允许为空
-> email varchar(32) null, -- 允许为空(默认的)
-> age int
-> )default charset=utf8;
Query OK, 0 rows affected (0.55 sec)
mysql> create table tb3(id int, name varchar(16) not null, --不允许为空
-> email varchar(32) null, -- 允许为空(默认的)
-> age int default 3 -- 设置默认值, 如果不赋值默认为3
-> )default charset=utf8;
Query OK, 0 rows affected (0.55 sec)
mysql> create table tb4(id int primary key, -- 设置为主键不允许为空, 不能重复
-> name varchar(16) not null, -- 不允许为空
-> email varchar(32) null, -- 允许为空(默认的)
-> age int default 3 -- 设置默认值, 如果不赋值默认为3
-> )default charset=utf8;
Query OK, 0 rows affected (0.55 sec)
在实际使用的时候由于每次自己添加主键的数字不叫麻烦可以使用自增的方式
mysql> create table tb5(id int not null auto_increment primary key, -- 设置为主键不允许为空, 不能重复,自增
-> name varchar(16) not null, -- 不允许为空
-> email varchar(32) null, -- 允许为空(默认的)
-> age int default 3 -- 设置默认值, 如果不赋值默认为3
-> )default charset=utf8;
Query OK, 0 rows affected (0.55 sec)
- 删除表
drop table 表名;
- 清空表
delete from 表名
或者truncate table 表名;
后者速度较快, 不可恢复 - 查看表的数据格式
describe tb1
mysql> describe tb1;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(16) | YES | | NULL | |
| pwd | varchar(64) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.40 sec)
- 修改表
- 添加列
alter table 表名 add 列名 类型;
alter table 表名 add 列名 类型 DEFAULT 默认值;
alter table 表名 add 列名 类型 not null default 默认值;
alter table 表名 add 列名 类型 not null primary key auto_increment;
- 删除列
alter table 表名 modify column 列名 类型;
- 修改列
alter table 表名 change 原来的列名 新的列名 新类型;
可以用来删除默认值以及主键, 自增
- 修改列默认值
ALTER TABLE 表名 ALTER 列名 SET DEFAULT 100;
- 删除列的默认值
ALTER TABLE 表名 ALTER 列名 DROP DEFAULT;
- 添加主键
alter table 表名 add primary key(列名);
- 删除主键
alter table 表名 drop primary key;
常见的数据类型
整形
int [(m)][unsigned][zerofill]
int 有符号, 有范围
int unsigned 无符号, 有范围, 2^32, 可以在配置文件中设置超过范围就截断
int(5)zerofill 仅用于显示, 当不满5位的时候左边补充0, 满足的时候正常显示
示例
mysql> create table L1(id int , uid int unsigned , zid int(5) zerofill) -> default charset=utf8; Query OK, 0 rows affected (0.68 sec) mysql> insert into L1(id , uid , zid) values(1, 2, 3); Query OK, 1 row affected (0.42 sec) mysql> insert into L1(id , uid , zid) values(2147483614, 4292967294, 300000); Query OK, 1 row affected (0.32 sec) mysql> select * from L1; +------------+------------+--------+ | id | uid | zid | +------------+------------+--------+ | 1 | 2 | 00003 | | 2147483614 | 4292967294 | 300000 | +------------+------------+--------+ 2 rows in set (0.00 sec)
tinyitnt[(m)] [unsigned] zerofill
相当于char 2^8bigint [(m)] [unsigned] zerofill
相当于long 2^64
小数
decimal [(m[, d])] [unsigned] zerofill
m: 表示数字的整个数(不算符号), d是小数点之后的个数, m最大为65, d最大是30, 小数超出的话遵循四舍五入, 整数超出的会报错
```sql mysql> create table L2(id int not null primary key auto_increment, salary decimal(8, 2))default charset=utf8; Query OK, 0 rows affected (0.49 sec) mysql> insert into L2(salary) values(1.28); Query OK, 1 row affected (0.38 sec)
mysql> insert into L2(salary) values(5.298); Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select * from L2; +—-+——–+ | id | salary | +—-+——–+ | 1 | 1.28 | | 2 | 5.30 | +—-+——–+ 2 rows in set (0.00 sec)
FLOAT[(M,D)] [unsigned] [zerofill]
单精度浮点小数, 非准确小数值DOUBLE[(M,D)] [unsigned] [zerofill]
双精度浮点数, 同上
字符串
char(m)
定长字符串, m代表存储的字符个数, 最大255, 存储的字符就算是小于m也会按照m进行存储, 超出报错
在配置文件中加入
sql-mode='NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION'
会非严格模式, 超出不报错
默认的情况下不用会用空白进行补全, 查询的时候会把空白去除, 想保留空白在
sql-mode
中加入PAD_CHAR_TO_FULL_LENGTH
, 查看sql-mode
模式执行命令:show variables like 'sql-mode'
varchar(m)
变长字符串, m代表字符个数, 最大是65535个字字节
按照实际的存入的字符的个数进行保存, 超出的话进行报错截段
- text
用于保存大字符串, 最多65535, 一般情况下长段的字符会使用
mediumtext
最大2^24^个字符
- longtext
最大2^32^个字符
时间
datatime
YYYY-MM-DD HH:MM:SS (1000-01-01 00:00:00/9999-12-31 23:59:59)
timestamp
YYYY-MM-DD HH:MM:SS (1970-01-01 00:00:00/2037)
自己显示的值和时区有关, 存储的时候转换为UTC时间, 在显示的时候会转换为当前时区的时间
mysql> create table l5 (
-> id int not null primary key auto_increment,
-> dt datetime,
-> tt timestamp
-> )default charset=utf8;
Query OK, 0 rows affected (0.34 sec)
mysql> insert into l5(tt, dt) value("2020-11-12 11:11:12", "2323-12-31 12:23:32");
Query OK, 1 row affected (0.34 sec)
mysql> select * from l5;
+----+---------------------+---------------------+
| id | dt | tt |
+----+---------------------+---------------------+
| 1 | 2323-12-31 12:23:32 | 2020-11-12 11:11:12 |
+----+---------------------+---------------------+
1 row in set (0.00 sec)
mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| system_time_zone | |
| time_zone | SYSTEM |
+------------------+--------+
2 rows in set, 1 warning (0.00 sec)
mysql> set time_zone='+0:00';
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| system_time_zone | |
| time_zone | +00:00 |
+------------------+--------+
2 rows in set, 1 warning (0.00 sec)
mysql> select * from l5;
+----+---------------------+---------------------+
| id | dt | tt |
+----+---------------------+---------------------+
| 1 | 2323-12-31 12:23:32 | 2020-11-12 03:11:12 |
+----+---------------------+---------------------+
1 row in set (0.00 sec)
- data
YYYY-MM-DD(1000-01-01/9999-12-31
- time
-838:59:59/8:59:59