Python学习-- 数据库和MySQL入门
数据库
变量、元组、列表、字典、集合、文件(xml yml json)
数据库的分类
关系型数据库
是指采用了关系模型来组织数据的数据库,其以行和列的形式来存储数据,便于用户理解。这一系列行和列组成的被称为表,一组表组成了数据库
关系型数据库有 MySQL Oracle MSSQLServer 等
非关系型数据库
NoSQL(Not-Only SQL)系列数据库,将非关系型数据转换为关系型数据
非关系型数据库有 Redis MongoDB 等
SQL语言分类 (面试高频考点)
结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存储数据以及查询、更新和管理关系型数据库
-
数据查询语言(DQL:Data Query Language):其语句,也称为数据检索语句,用以从表中获得数据,确定数据怎样在应用程序给出。保留字
SELECT
是DQL(也是所有SQL)用得最多的动词,其他DQL常用的保留字有WHERE
,ORDER BY
,GROUP BY
和HAVING
。这些DQL 保留字常与其它类型的SQL语句一起使用。 -
数据操作语言(DML: Data Manipulation Language):其语句包括动词
INSERT
、UPDATE
和DELETE
。它们分别用于添加、修改和删除。 -
事务控制语言(TCL:Transaction Controller Language):它的语句能确保被DML语句影响的表的所有行及时得以更新。包括
COMMIT
(提交)命令、SAVEPOINT
(保存点)命令、ROLLBACK
(回滚)命令。 -
数据控制语言(DCL:Data Controller Language):它的语句通过
GRANT
或REVOKE
实现权限控制,确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT
或REVOKE
控制对表单个列的访问。 -
数据定义语言(DDL:Data Definition Language):其语句包括动词
CREATE
,ALTER
和DROP
。在数据库中创建新表或修改、删除表(CREATE TABLE
或DROP TABLE
):为表加入索引等。
MySQL 语言
MySQL是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,属于 Oracle 旗下产品。 My SQL是最流行的关系型数据库管理系统之一, 在 WEB 应用方面, MySQL是最好的RDBMS(Relational Database ManagementSystem,关系数据库管理系统)应用软件之一。
MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。 MySQL 软件采用了双授权政策, 分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型和大型网站的开发都选择 MySQL 作为网站数据库。
MySQL与Oracle区别
区别 MySQL Oracle 字符串类型 varchar varchar2 int类型自动递增 支持自动递增 AUTO_INCREMENT 不支持,要使用序列 分组语法 如果出现分组,select后面可以出现其他字段,不报错但不建议 一旦出现分组,那么select后面只允许出现分组字段和统计函数 分页语法 使用limit关键字分页 使用偏移量offset分页
01 安装与卸载
见 预科学习
02 命令详情
基础命令
数据库基础命令
登录 MySQL mysql -u root -p [password] [-h HOST] [-P PORT]
查看所有数据库 show databases;
使用数据库 use <database>
删除数据库 drop <database>;
创建数据库 create <database>;
查看数据库创建信息 show create database <database>;
查看数据库中的表 show tables;
查看某个表格的详细信息 desc <table>
MySQL 常用数据类型 Int Double Datetime Varchar
表基础命令
创建表 create table <表名称>(<字段(列名)1 类型(长度)>,<字段2 类型(长度)>,...);
删除表 drop table <表名称>;
修改表 添加列 alter table <表名称> add 字段 类型
删除列 alter table <表名称> drop column 字段
修改列的数据类型 alter table <表名称> modify column 字段 新的类型
修改列名 alter table <表名称> change column 旧字段名 新字段名 的类型
值基础命令
添加
# 方式一 将所有字段都添加
insert into 表格名称 values (字段1值,字段2值,...);
# 方式二 添加指定字段
insert into 表格名称 (字段1,字段2,...) value (字段1值,字段2值,...);
修改
update 表名 set 字段 = '新值' where 字段条件 = '条件值';
# 如果不加where条件,那么结果是修改所有数据
删除
delete from 表名 where 字段条件 = '条件值';
# 如果不加where条件,那么条件是清空表格!
查询
select * from 表名;
建表约束 CONSTRAINT
非空约束 NK not null
# 方法一 直接在属性后加 not null 关键字
create table t_nk(id int(5) not null
);
# 方法二 在语句后用constraint关键字指定约束名
create table t_uk(id int(5),CONSTRAINT NK_name NOT NULL (id)
);desc t_nk;
# 结果
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| id | int | NO | | NULL | |
+-------+------+------+-----+---------+-------+
1 row in set (0.04 sec)
唯一约束 UK unique
# 方法一 直接在属性后加 unique 关键字
create table t_uk(id int(5) UNIQUE
);
# 方法二 在语句后用constraint关键字指定约束名
create table t_uk(id int(5),CONSTRAINT UK_name UNIQUE (id)
);desc t_uk;
# 结果
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| id | int | YES | UNI | NULL | |
+-------+------+------+-----+---------+-------+
1 row in set (0.04 sec)
主键约束 PK primary key
(NK+UK)
# 方法一 直接在属性后加 primary key 关键字
create table t_pk(id int(5) primary key
);
# 方法二 在语句后用constraint关键字指定约束名
create table t_uk(id int(5) AUTO_INCREMENT, # 自动递增CONSTRAINT NK_name primary key (id)
);desc t_pk;
# 结果
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
+-------+------+------+-----+---------+-------+
1 row in set (0.04 sec)
一般将id编号设置为主键,而且每一张表建议至少一个主键。
加主键的目的就是为了索引
-
当主键为int数字类型的时候,一般设置自动递增
- 方式一 MySQL支持自动递增,可以在创表时追加
AUTO_INCREMENT
- 方式二 通过python程序做自动递增 id+=1
- 方式一 MySQL支持自动递增,可以在创表时追加
-
当主键为varchar字符串类型的时候,无法再做自动递增
- 方式一 通过python程序来生成固定格式且不会重复的主键 id+=1 “格式+id”
- 方式二 通过某些算法来生成不会重复的主键 例如 雪花算法 等
联合主键
当需要两个及两个以上字段共同约束非空加唯一的时候,可以使用联合主键,指定多个主键
create table t_uk(id int(5) AUTO_INCREMENT, # 自动递增name varchar(255),CONSTRAINT NK_name primary key (id,name)
);
# 结果
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | PRI | NULL | |
+-------+--------------+------+-----+---------+----------------+
2 rows in set (0.04 sec)
外键约束 FK foreign key
constraint FK_name foreign key(外键列名称) references 主表名称(主表列名称)
一对多 一个主表列可以有多个子表列,一个子表列只能有一个主表列
create table t_fk(id int(5),constraint FK_name foreign key (id) references t_pk(id) # 两步,先指定外键,再指定引用表和字段
);desc t_fk;
# 结果
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| id | int | YES | MUL | NULL | |
+-------+------+------+-----+---------+-------+
1 row in set (0.04 sec)
多对多 权限管理
一个角色可以有多个菜单,一个菜单可以被多个角色访问
表设计 用户表 n–n 角色表 n–n 功能菜单表
要实现多对多关系,就要加上一个中间表作为多对多外键管理,因此,上面的表设计就要优化,优化后为下:
用户表 n-- 用户角色表 --n 角色表 n-- 角色菜单表 --n 功能菜单表
create table t_person(pid int(10) auto_increment,pname VARCHAR(10) not null,phone VARCHAR(11),CONSTRAINT pk_pid PRIMARY KEY(pid)
);CREATE TABLE t_role(rid int(5) auto_increment,rname varchar(10),CONSTRAINT pk_rid PRIMARY KEY(rid)
);CREATE TABLE t_menu(mid int(5) auto_increment,mname varchar(10),image VARCHAR(10),url VARCHAR(255),pid int(5),CONSTRAINT pk_mid PRIMARY KEY(mid),CONSTRAINT fk_mid FOREIGN KEY(pid) REFERENCES t_menu(mid)
);CREATE TABLE t_person_role(id int(5) auto_increment,pid int(5),rid int(5),CONSTRAINT pk_pr_id PRIMARY KEY(id),CONSTRAINT fk_pr_pid FOREIGN KEY(pid) REFERENCES t_person(pid),CONSTRAINT fk_pr_rid FOREIGN KEY(rid) REFERENCES t_role(rid)
);CREATE TABLE t_role_menu(id int(5) auto_increment,rid int(5),mid int(5),CONSTRAINT pk_rm_id PRIMARY KEY(id),CONSTRAINT fk_rm_rid FOREIGN KEY(rid) REFERENCES t_role(rid),CONSTRAINT fk_rm_mid FOREIGN KEY(mid) REFERENCES t_menu(mid)
);
级联操作
在创建外键的过程可以追加两种特殊的外键操作:
- 级联删除(危险) 删除引用的父表中的数据时会将引用其的子表中的数据给一齐删除
on delete cascade
一般网站数据库都会使用逻辑删除,即给数据设置一个标识位(flag),当数据删除时使用update更新标识位使其不可被查询,而不会使用物理删除(delete)
不到万不得已的情况下不要使用物理删除/级联删除!
- 级联设置null(推荐) 删除引用的父表中的数据时会将引用其的子表中的数据给设置为null
on delete set null
# 级联删除
create table t_user(id int(10) primary key AUTO_INCREMENT,name varchar(20),password varchar(20),pid int(10),constraint fk_cascade_pid foreign key(pid) references t_menu(id) on delete cascade
);
# 级联设置null (推荐)
create table t_user(id int(10) AUTO_INCREMENT,name varchar(20),password varchar(20),address varchar(20),pid int(10),constraint pk_id primary key(id),constraint fk_null_pid foreign key(pid) references t_menu(id) on delete set null
);
检查约束 CK check
constraint CK_name check (id > 0) and (id < 100)
create table t_fk(id int(5),constraint CK_name check (id > 0) and (id < 100)
);
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| id | int | YES | MUL | NULL | |
+-------+------+------+-----+---------+-------+
1 row in set (0.04 sec)
检查约束实际上是程序的业务逻辑,一般会写在程序里而不是数据库中,所以一般会在数据库中使用check
语句以缓解数据库压力
在MySQL8.0.16以下版本对check的支持不完整,所以可以设置但不会生效,8.0.16以上版本对其进行优化使其正常生效