Python day 41:数据库的增删改查初级操作/外键(一对多)

## 数据库的操作:

```python
增加:create database 数据库名称;
    例:create database db1;
删除:drop database 数据库名称;
    drop database db1;
修改: 没有专门的的指令,只能删了重建
查询: show databases;
使用: use 数据库名;  #对表/列/记录的操作都必须先use 数据库名
    例: use db1;

```

## 数据表的操作:

```python
#首先 use 数据库名称;
创建:create table 表名(列名1 列类型 ,列名2 列类型);
    例:create table t1( id int auto_increment primary key,name char(32) not null default "")engine=Innodb charset=utf8;
添加:insert into 表名(列名1,列名2) values(值1,值2);
    例:insert into t1 (id,name) values (1,"owen")
查询:show tables;
    desc 表名; 查看表的结构
    show create table 表名;查看表的创建过程;#以上三个查看表本身
    select 列名 from 表名;#查看表中数据
    例: select * from t1;
删除:drop table 表名;
    drop table t1;(删除数据表所有数据,实际生产用不到该命令)
修改:alter table 表名 change 原列名 新列名 新列类型
      例: alter table t1 change name  username varchar(16)
    alter table 表名 add 新列  新列类型
    例:alter table t1 name char(16);
    alter table 表名 drop 列名
    例:alter table t1 drop name;

列类型:                    
a. 数值型
        create table t4 (id  unsigned mediumint auto_increment primary key, name char(32)  not null  default '',pwd  char(32)  not null  default '')engine=Innodb charset=utf8;
    tinyint : 范围: 有符号: -128到127无符号: 0 到 255  unsigned
    smallint范围: 有符号: -32768到32767无符号: 0 到 65535  unsigned 
    mediumint范围:有符号: -8388608到8388607无符号: 0 到 16777215  unsigned int
    bigint区别: a. 取值范围不一样, 根据自己公司的业务来去选择
               b. 无符号和有符号的意思
     float(M,D) 浮点型
    decimal(M,D) 定点型 比float更加的精准
    例如: 3.1415151519868789789
    float: 3.141515000000000000
    decimal : 3.1415151519868789789
    126.35:M:小数总共多少位 decimal(5, )
           D:小数点后面几位 decimal(5, 2)
    使用场景:比如 说存 salary 工资 : 6000.23 decimal(,2)
    b. 字符串类型
    char : 定长 char(32)  这一列的值就是32  优点: 速度快  缺点: 浪费
    archar : 变长 varchar(32) 优点: 不浪费, 节省空间  缺点: 速度慢
    根据自己公司的业务来去选择:
    create table userinfo (id  unsigned mediumint auto_increment primary key, name varchar(128)  not null  default '',pwd  char(32)  not null  default '',
    create_time  datetime not null default  '1970-01-01 00:00:00')engine=Innodb charset=utf8;
    一般情况下, 如果没有100%的把握, 都是用varchar()
    text: 文本  范围比较大, 如果存储大量字符的话, 可以使用这个字段
    c. 时间类型
    date 2019-6-12
    推荐使用datetime
  
```

## 数据行的操作:

```python
增:
    insert into 表名 (列名1,列名2) values (id,name);
    上面已介绍;
查询:
    select 列名 from 表名;将表中所有数据列出
删:
    delete from 表名;将表中的所有的 数据删除掉, 再次添加的时     候, 继续会延续上一个 ID
    truncate 表名(t3);    将表中的所有的 数据删除掉, 再次添加         的时候, ID 会重新开始
修改:
    update 表名 set username="...";
    例:update t3 set username='zekai';
       update t3 set username='xxxx'  where  id=3;
       update t3 set username='xxxx', pwd='xxxxx'  where           id=3;
```

## 外键:

```python
问题:
    1. 数据重复
    2. 如果 部门过长的话, 太占用空间
解决方法:重新设计一张表, 这张表 中存放部门的相关信息
部门表案例:
    create table department(id int auto_increment primary key,department_name varchar(16) not null default "")engine=Innodb charset=utf8;
    insert into department (depart_name) values ("公关部"),("销售部"),("财务部");
    create table userinfo(id int auto_increment primary key,name varchar(16) not null default "",depart_id int not null default "",constraint userinfo_depart foreign key (depart_id) references department(id))engine=Innodb charset=utf8;
    insert into userinfo(name,depart_id) values ("owen",1)
    '注意:depart_id的值,必须是表department中列depart_name有的值!'
    '创建多个外键的时候,名称不能一样
    以上是 一对多 外键情况
```



​    
原文地址:https://www.cnblogs.com/huhongpeng/p/11042331.html