【程序人生】MySQL数据库

部分参考来源

https://www.cnblogs.com/haiyan123/p/7476241.html
https://www.runoob.com/python3/python3-mysql.html
https://www.cnblogs.com/martinzhang/p/3455681.html
https://www.cnblogs.com/sench/p/8672370.html
http://c.biancheng.net/mysql/
https://www.cnblogs.com/xuchuankun/p/9451495.html
https://blog.csdn.net/Zhihua_W/article/details/80907525
https://blog.csdn.net/yoyofu007/article/details/80333569
https://www.cnblogs.com/ahu-lichang/p/10899747.html
https://www.jianshu.com/p/f5cf992564af
https://www.cnblogs.com/Eva-J/articles/10126413.html
https://www.runoob.com/python3/python3-mysql.html

理论部分

MySQL 是一个关系型数据库管理系统

数据存储方式

计算机数据(Data)的存储一般以硬盘为数据存储空间资源,从而保证计算机内的数据能够持续保存。对于数据的处理,一般会采用数据库相关的技术进行处理,从而保证数据处理的高效性

采用数据库的管理模式不仅提高了数据的存储效率,而且在存储的层面上提高了数据的安全性通过分类的存储模式让数据管理更加安全便捷,更能实现对数据的调用和对比,并且方便查询等操作的使用

什么是数据库

数据库是数据管理的有效技术是由一批数据构成的有序集合这些数据被存放在结构化的数据表里数据表之间相互关联,反映客观事物间的本质联系。数据库能有效地帮助一个组织或企业科学地管理各类信息资源。

数据是数据库中存储的基本对象,是按一定顺序排列组合的物理符号。数据有多种表现形式,可以是数字、文字、图像,甚至是音频或视频,它们都可以经过数字化后存入计算机。

数据库是数据的集合,具有统一的结构形式并存放于统一的存储介质内,是多种应用数据的集成,并可被各个应用程序所共享

在日常生活中,人们可以直接用中文、英文等自然语言描述客观事物。在计算机中,则要抽象出对这些事物感兴趣的特征,并组成一个记录来描述

例如,在学生档案中,学生信息是由学号、姓名、性别、年龄、籍贯、联系电话等特征组成的,那么这些具体的特征值所构成的一条记录就是一个学生的信息数据,例如“2016010102,张三,男,26,山西,计算机学院,185********”。

值得注意的是,数据的描述形式还不能完全表达其内容,需要经过解释。例如,对于上面这条学生记录,了解其含义的人会得到这样的信息:张三的学号是 2016010102,今年 26 岁,山西人,就读于计算机学院,他的联系电话是 185********;而不了解其语义的人则无法理解其含义。所以,数据和对数据的解释是不可分的,数据的解释是指对数据含义的说明,数据的含义也称数据的语义,因此数据与其语义密不可分,没有语义的数据是没有意义和不完整的。

数据库的存储结构

数据库的存储结构是指数据库中的物理数据和逻辑数据的表示形式、物理数据和逻辑数据之间关系映射方式的描述。在数据库技术中,可以使用两种形式描述客观现实的数据:物理数据描述和逻辑数据描述。物理数据和逻辑数据之间的转换通过数据库管理系统实现

物理数据描述

物理数据描述是指数据在存储设备上的存储方式,物理数据是实际存放在存储设备上的数据,这些数据也称为物理记录。根据物理记录存储的位置,又可以分为有序存储和无序存储。

在物理数据描述中,使用的数据描述术语包括以下各项:

  • 位(bit):二进制的一个单位称为位,位只能取 1 或 0。
  • 字节(byte):8 个位称为一个字节,可以存放对应 ASCII 码的一个字符。
  • 字(word):若干个字节组成一个字。一个字所含的二进制的位数称为字长,许多计算机的字长是不同的,例如计算机的字长可以是 8 位、16 位、24 位、32 位等。
  • 块(block):内存储器和外存储器交换信息的最小单位,又称为物理块或物理记录,每块的大小通常为 256 字节、512 字节、1024 字节等。
  • 卷(volume):一台输入输出设备所能装载的全部有用信息,例如磁带机的一盘磁带即为一卷,磁盘设备的一个盘组也是一卷。
  • 无序存储(unordered):数据记录按照插入的顺序进行存储。

逻辑数据描述

逻辑数据描述是指用户或程序员用于操作的数据形式,逻辑数据是一种抽象的概念,是对客观现实世界的反映和记录,这些数据也可以称为逻辑记录。

逻辑数据包含两个层次,一个层次是对客观现实信息世界的描述,另一个层次是对数据库管理系统中数据的描述

在对客观现实信息世界的描述中,使用的术语包括以下几项:

  • 实体(entity):客观现实存在的东西使用实体来描述。实体既可以是具体的、有形的对象,也可以是抽象的、无形的对象。例如,一本书是一个有形对象,一次借书过程则是一个无形的对象。
  • 实体集(entities):特性完全相同的同类实体的集合称为实体集。例如,一个图书馆所有的书籍是一个实体集,该图书馆的所有借书过程也是一个实体集。
  • 属性(attribute):实体的特性称为属性。每个属性都有一个值域,这些值域可以是整数类型、浮点数类型、字符类型或日期类型等。例如,实体书的属性包括书名、书号、出版日期、页数、价格以及出版社等,这些属性对应的值域分别为字符类型、字符类型、日期类型、整数类型、浮点数类型和字符类型等。
  • 标识符(identifier):能够唯一地标识每个实体的属性或属性集。例如,书的书号属性是实体书的标识符,借书过程实体的标识符包括借书证号、书号两个属性。

这些逻辑数据最终要通过数据库管理系统来转换成物理数据。在数据库管理系统中,描述逻辑数据的术语包括哪些呢?

下面以关系型数据库管理系统为例进行介绍:

  • 数据项(data item):也称为字段(field),标记实体属性的可以命名的最小信息单位,数据项的命名一般采用属性的描述性名称。这些名称可以是中文、英文或汉语拼音。
  • 元组(tuple):也称为记录(record),数据项的集合称为元组。一个元组表示一个具体的实体
  • 关系(relation):在关系型数据库系统中,同一类元组所在的集合称为关系。关系适用于描述实体集,它包括一个实体集的所有元组。例如,所有的图书可以组成一个 books 关系。
  • 键码(key):在关系型数据库系统中,能够唯一地标识关系中每个元组的数据项或数据项的组合称为关系的键码

客观实体经过两层逻辑数据的描述,最后转变成实际存储的物理数据

数据库在开发中的作用

从数据库系统应用角度来看,数据库系统常见的运行与应用结构有:客户端/服务器结构浏览器/服务器结构

在客户端/服务器(Client/Server,C/S)结构中,数据库的使用者(如 DBA、程序设计者)通过命令行客户端、图形化界面管理工具或应用程序等连接到数据库管理系统,可以通过数据库管理系统查询和处理存储在底层数据库中的各种数据。

数据库使用者与命令行客户端、图形化界面管理工具或应用程序等直接交互,而不与数据库管理系统直接联系

在这种结构中,命令行客户端、图形化界面管理工具或应用程序等称为“客户端”或“前台”,主要完成与数据库使用者的交互任务;而数据库管理系统则称为“服务器”或“后台”,主要负责数据管理。这种结构经常被称为“C/S”结构

在客户端/服务器模式中,客户端和服务器可以同时工作在同一台计算机上,这种工作方式称为“单机方式”;也可以“网络方式”运行,即服务器被安装和部署在网络中某一台或多台主机上。

对于客户端应用程序的开发,目前常用的语言工具主要有 Visual C++、Delphi、.NET 框架、Visual Basic、Python 等。

数据库能有效存储数据,读取数据、查找数据更是方便,其实那些管理软件就是通过软件的界面向内部的数据库进行数据的增、删、改、查操作。

表关系

关系型数据库,表与表的记录之间存在着三种关系:一对多、多对多、一对一的关系。

  • 一对多:在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键
  • 多对多:需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键
    在这里插入图片描述
  • 一对一:在实际的开发中应用不多,因为一对一可以创建成一张表

这里涉及主键和外键的概念:

  • 主键:一张表中,可以用于唯一标识一条记录的字段组(或者说是属性组)。给你一个主键的值,你就可以找到一条确定的记录。
  • 外键:如果一个表A的主键还存在与另一个表B中,那么B中这个字段可以作为表A的外键。

主键是唯一的,用于标识一张表。外键可以有多个,用于建立表和表的关系。

MySQL常见的约束条件

限制表中的数据,保证添加到数据表中的数据准确和可靠性。凡是不符合约束的数据,插入时就会失败。
约束条件在创建表时可以使用, 也可以修改表的时候添加约束条件。

  1. NOT NULL :非空约束,保证字段的值不能为空
  2. DEFAULT:默认约束,保证字段总会有值,即使没有插入值,都会有默认值
  3. UNIQUE:唯一,保证唯一性,但是可以为空,比如座位号
  4. PRIMARY KEY:主建约束,同时保证唯一性和非空
  5. FOREIGN KEY:外键约束,用于限制两个表的关系,保证从表该字段的值来自于主表相关联的字段的值
  • 表级约束:对多个数据列建立的约束,称为表级约束。表级约束只能在列定义后声明
  • 列级约束:对一个数据列建立的约束,称为列级约束。列级约束既可以在列定义时声明,也可以在列定义后声明

数据库设计原则

  1. 命名规则
    数据库的的名字一般都是很随意,最好和我们的项目业务一致,这样比较好进行区分;数据表的命名应尽可能和所服务的业务模块名一致,也就是我们所存储实体的名称,表名应尽量包含与所存放数据对应的单词,一眼可以看出此表所保存的是什么;表字段的命名也应尽量保持和实际数据相对应,联合索引名称应尽量包含所有索引键字段名或缩写且各字段名在索引名中的顺序应与索引键在索引中的索引顺序一致

  2. 字段类型
    经常需要计算和排序等消耗CPU的字段,应该尽量选择更为迅速的字段,如用TIMESTAMP(4个字节,最小值1970-01-01 00:00:00)代替DATATIME(8个字节,最小值1001-01-01 00:00:00),通过整型替代浮点型和字符型;
    变长字段使用varchar,不要使用char,注意设计合适的长度
    对于二进制多媒体数据、流水队列数据(如日志)、超大文本数据不要放在数据库字段中
    业务逻辑执行过程必须读到的表中字段必须要有初始的值,避免业务读出为负或无穷大的值导致程序失败。

  3. 存储引擎选择
    一般情况可以选择MyISAM存储引擎,如果需要事务支持必须使用InnoDB存储引擎。

  4. 表设计
    业务逻辑执行过程必须读到的表中字段必须要有初始的值,避免业务读出为负或无穷大的值导致程序失败。
    并不需要一定遵守范式理论,字段适度的冗余,可以让Query尽量减少Join,提高查询速度。
    访问频率较低的大字段拆分出数据表。
    有些大字段占用空间多,访问频率较其他字段明显要少很多,这种情况进行拆分,频繁的查询中就不需要读取大字段,造成IO资源的浪费。
    大表可以考虑水平拆分。
    大表影响查询效率,根据业务特性有很多拆分方式,像根据时间递增的数据,可以根据时间来分。
    以id划分的数据,可根据id%数据库个数的方式来拆分。

  5. 索引设计
    业务需要的相关索引是根据实际的设计所构造sql语句的where条件来确定的,业务不需要的不要建索引,不允许在联合索引(或主键)中存在多余的字段。特别是该字段根本不会在条件语句中出现。唯一确定一条记录的一个字段或多个字段要建立主键或者唯一索引不能唯一确定一条记录,为了提高查询效率建普通索引。业务使用的表,有些记录数很少,甚至只有一条记录,为了约束的需要,也要建立索引或者设置主键。
    对于取值不能重复,经常作为查询条件的字段,应该建唯一索引(主键默认唯一索引)并且将查询条件中该字段的条件置于第一个位置没有必要再建立与该字段有关的联合索引对于经常查询的字段,其值不唯一,也应该考虑建立普通索引查询语句中该字段条件置于第一个位置对联合索引处理的方法同样
    业务通过不唯一索引访问数据时,需要考虑通过该索引值返回的记录稠密度,原则上可能的稠密度最大不能高于0.2,如果稠密度太大,则不合适建立索引了。需要联合索引(或联合主键)的数据库要注意索引的顺序。SQL语句中的匹配条件也要跟索引的顺序保持一致

  6. 查询语句设计
    INSERT语句中,根据测试,批量一次插入1000条时效率最高,多于1000条时,要拆分,多次进行同样的插入,应该合并批量进行。注意query语句的长度要小于mysqld的参数max_allowed_packet查询条件中各种逻辑操作符性能顺序是and、or、in,因此在查询条件中应该尽量避免使用在大集合中使用in。永远用小结果集驱动大记录集,因为在mysql中,只有NestedJoin一种Join方式,就是说mysql的join是通过嵌套循环来实现的。通过小结果集驱动大记录集这个原则来减少嵌套循环的循环次数,以减少IO总量及CPU运算次数。尽量优化Nested Join内层循环。只取需要的columns,尽量不要使用select *。仅仅使用最有效的过滤字段,where 字句中的过滤条件少为好。尽量避免复杂的Join和子查询。

数据库三大范式(1NF、2NF、3NF)

三大范式递次规范,越高的范式数据库冗余越小

  1. 1NF —— 强调数据表的原子性
    据库表的每一列都是不可分割的原子数据项,而不能是集合关系型数据库自动满足1NF

  2. 2NF
    2NF在1NF基础上,消除非主属性对码的部分函数依赖,这句话涉及4个概念:“码”“非主属性”“部分函数依赖”和“函数依赖”,下面对这些概念进行解读。
    码:假设 K 为某表中的一个属性或属性组,若除 K 之外的所有属性都完全函数依赖于 K(这个“完全”不要漏了),那么我们称 K 为候选码,简称为码,即当 K 确定的情况下,该表除 K 之外的所有属性的值也就随之确定,那么 K 就是码,一个表可以有多个码
    非主属性:除去所有的主属性,剩下的就都是非主属性
    函数依赖:在一张表中如果属性x的值确定,那么属性y的值也就确定下来了,可以说属性y函数依赖x,即xy,y=f(x)x→y, y=f(x)
    对函数依赖进行细分后可以划分为三大类,分别是:
    完全函数依赖:在一张表中,若 X → Y,且对于 X 的任何一个真子集(假如属性组 X 包含超过一个属性的话),X → Y 不成立,那么我们称 Y 对于 X 完全函数依赖。
    传递函数依赖:假如 Z 函数依赖于 Y,且 Y 函数依赖于 X (严格来说还有一个X 不包含于Y,且 Y 不函数依赖于Z的前提条件),那么我们就称 Z 传递函数依赖于 X。
    部分函数依赖:假如 Y 函数依赖于 X,但同时 Y 并不完全函数依赖于 X,那么我们就称 Y 部分函数依赖于 X。
    数据表结构是否符合2NF的判断方法是:
    1、找出数据表中的码
    2、根据码确定主属性
    3、确定非主属性
    4、判断非主属性是否部分依赖于码
    消除部分函数依赖,需要将数据表结构拆分成多个数据表

  3. 3NF
    在2NF的基础之上,消除了非主属性对于码的传递函数依赖。存在非主属性对于码的传递函数依赖,则不符合3NF的要求

操作部分

ubuntu安装MySQL

  1. 下载MySQL源码包
    https://downloads.mysql.com/archives/community/

在这里插入图片描述

  1. 新建一个用户组mysql
sudo groupadd mysql
cat /etc/group
// 查看所有用户组

/etc/group 存放的是,组及其属性信息

mysql : x : 1001 :
群组名称 : 群组密码 : GID : 附加组

  1. 新建一个系统帐号mysql,并指定系统帐号mysql所属组为mysql
    系统帐号不用于登录,一般是给程序来使用
sudo useradd -r -g mysql mysql 
cat /etc/passwd
// 查看所有用户

/etc/passwd 存放的是,用户及其属性信息

mysql : x : 999:1001 : : /home/mysql :
登录用户名 : 密码 : UID : GID : 全名或注释 : 用户主目录 : 用户默认使用shel

创建这个单独的系统帐号mysql指定为mysqld的运行用户,是为了安全,这样做的好处是,当别人黑了你的数据库的时候,只能得到系统的mysql权限,得不到整个root的权限

  1. 安装依赖
sudo apt-get install make cmake gcc g++ bison libncurses5-dev build-essential
  1. 编译安装
cmake -DCMAKE_INSTALL_PREFIX=/thirdparty/mysql/ -DMYSQL_DATADIR=/thirdparty/mysql/data -DMYSQL_UNIX_ADDR=/thirdparty/mysql/mysqld.sock -DMYSQL_TCP_PORT=3306 -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_READLINE=1 -DSYSCONFDIR=/etc -DMYSQL_USER=mysql -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/thirdparty-source/mysql-boost-5.7.27
cmake参数 描述
-DCMAKE_INSTALL_PREFIX 安装根目录
-DMYSQL_DATADIR 数据存储目录
-DMYSQL_UNIX_ADDR UNIX socket文件
-DMYSQL_TCP_PORT TCP/IP端口
-DDEFAULT_CHARSET 默认字符集
-DDEFAULT_COLLATION 默认字符校对
-DWITH_READLINE readline库
-DSYSCONFDIR 配置文件(my.cnf)目录
-DMYSQL_USER mysqld运行用户
-DDOWNLOAD_BOOST
-DWITH_BOOST
cmake存储引擎选项(默认支持csv、myisam、myisammrg、heap) 描述
-DWITH_INNOBASE_STORAGE_ENGINE=1 启用InnoDB引擎支持
-DWITH_ARCHIVE_STORAGE_ENGINE=1 启用IARCHIVE引擎支持
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 启用BLACKHOLE引擎支持
-DWITHOUT_<某种引擎>_STORAGE_ENGINE 除去对某种引擎的支持
make -j4
sudo make install
  1. 添加环境变量
# mysql
export MYSQL_HOME="/thirdparty/mysql":$MYSQL_HOME
export PATH="/thirdparty/mysql/bin":$PATH

配置MySQL

  1. 利用chown将mysql安装目录的拥有者改为前面新建的系统帐号mysql
cd /thirdparty/mysql
sudo chown -R mysql:mysql ./
  1. 初始化mysql,生成mysql临时密码
sudo /thirdparty/mysql/bin/mysqld --initialize --user=mysql

2020-03-08T07:06:18.947930Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2020-03-08T07:06:19.107070Z 0 [Warning] InnoDB: New log files created, LSN=45790
2020-03-08T07:06:19.149147Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2020-03-08T07:06:19.205975Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 4f5a149f-610b-11ea-8bfa-f875a4065aa0.
2020-03-08T07:06:19.206823Z 0 [Warning] Gtid table is not ready to be used. Table ‘mysql.gtid_executed’ cannot be opened.
2020-03-08T07:06:19.207402Z 1 [Note] A temporary password is generated for root@localhost: 临时密码

  1. 开启SSL功能
    SSL(Secure Socket Layer:安全套接字层)利用数据加密、身份验证和消息完整性验证机制,为基于TCP等可靠连接的应用层协议提供安全性保证
sudo /thirdparty/mysql/bin/mysql_ssl_rsa_setup

运行完这个命令后,会在,DMYSQL_DATADIR,目录下生成一些pem文件,这些文件就是用于启用SSL功能的

  1. 测试启动MySQL
sudo /thirdparty/mysql/bin/mysqld_safe --user=mysql &

mysqld_safe是个守护进程,加了&设置成后台程序,也是会卡在这的,需要ctrl+c退出会话,注意只是退出会话,mysqld_safe作为守护进程是不退出的。这个守护进程当发现mysqld程序退出时,会重新把mysqld启动。

  1. 启动MySQL服务,并更改root账户密码
sudo /thirdparty/mysql/support-files/mysql.server start
sudo /thiedparty/mysql/bin/mysql -u root -p

Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.27

Copyright © 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql>

键入:

SET PASSWORD FOR 'root'@'localhost' = PASSWORD('新密码');

Query OK, 0 rows affected, 1 warning (0.00 sec)

键入:

exit;

退出MySQL会话

  1. 停止MySQL服务
sudo /thirdparty/mysql/support-files/mysql.server stop

MySQL创建新用户并分配权限

root帐户是无法远程登陆的,只可以本地登陆
给数据库创建新用户:

CREATE USER 新用户名称@新用户IP地址 IDENTIFIED BY "新用户登录密码";

给用户分配权限:

GRANT 权限1, 权限2, ... ON 数据库名称.表名称 TO 新用户名称@新用户IP地址;

权限列表:

  • SELECT
  • INSERT
  • UPDATE
  • DELETE
  • CREATE
  • DROP
  • INDEX
  • ALTER
  • GRANT
  • REFERENCES
  • RELOAD
  • SHUTDOWN
  • PROCESS
  • FILE

新建用户,这个用户对数据库中的所有表有所有权限

GRANT ALL PRIVILEGES ON 数据库名称.* TO 新用户名称@新用户IP地址;

删除用户:

DROP USER 新用户名称@新用户IP地址;

查看某个数据库存在的所有用户:

SELECT USER,HOST FROM mysql.user;

使用MySQL

基础操作

  1. 显示所有存在的数据库
show databases;
  1. 新建一个数据库
CREATE DATABASE 数据库名称;
  1. 删除一个存在的数据库
DROP DATABASE 数据库名称;
  1. 选定对某个数据库进行操作
use 数据库名称;
  1. 显示当前选定数据库中所有的表
show tabels;
  1. 创建表
CREATE TABLE 表名称(列名称1 数据类型, 列名称2 数据类型, 列名称3 数据类型, ....)
数据类型 描述
integer(size) 仅容纳整数。在括号内规定数字的显示宽度。4字节。有符号范围(-2147483648,2147483647)。无符号范围(0,4294967295)
int(size) 仅容纳整数。在括号内规定数字的显示宽度。4字节。有符号范围(-2147483648,2147483647)。无符号范围(0,4294967295)
smallint(size) 仅容纳整数。在括号内规定数字的显示宽度。2字节。有符号范围(-32768,32767)。无符号范围(0,65535)
tinyint(size) 仅容纳整数。在括号内规定数字的显示宽度。1字节。有符号范围(-128,127)。无符号范围(0,255)
decimal(size,d) 容纳带有小数的数字。 “size” 规定数字的最大位数。“d” 规定小数点右侧的最大位数。要求d<=size
numeric(size,d)
char(size) 容纳固定长度的字符串(可容纳字母、数字以及特殊字符)。在括号中规定字符串的长度。
varchar(size) 容纳可变长度的字符串(可容纳字母、数字以及特殊的字符)。在括号中规定字符串的最大长度。
date(yyyymmdd) 容纳日期。
  1. 删除表
DROP TABLE 表名称;
  1. 查看表的全部内容
SELECT * FROM 表名称;
  1. 查看表的指定字段的内容
SELECT 列名称1, 列名称2, ...列名称n FROM 表名称;
  1. 插入内容到表
INSERT INTO 表名称(1名称,2名称, ... 列n名称) VALUES(1的值,2的值, ... 列n的值);
  1. 删除表内容
DELETE FROM 表名称 WHERE 条件;
  1. 显示表所有字段
SHOW COLUMNS FROM 表名称;
  1. 创建表时添加约束:
DROP TABLE IF EXISTS students;
CREATE TABLE students(
id INT,
s_name VARCHAR(10) NOT NULL,  # 非空约束
s_sex CHAR(1) DEFAULT '男',   # 默认约束
s_seat INT,
age INT,
teacher_id INT, 
 
# 上面是列级约束的写法,下面是表级约束的写法
 
CONSTRAINT pk PRIMARY KEY(id), # 主建约束,pk是给约束起名字,方便以后通过这个名字来删除这个约束。后面一样
CONSTRAINT uq UNIQUE(s_seat),  # 唯一约束
CONSTRAINT fk_students_teacher FOREIGN KEY(teacher_id) REFERENCES teacher(id)  # 外键约束
);
  1. 表更换名称
ALTER TABLE 表名称 RENAME TO 表新名称;  

列属性修改操作

语法:

ALTER TABLE 表名称 操作关键字 操作具体内容;  

ALTER COLUMN、MODIFY COLUMN、CHANGE的区别:

  • ALTER COLUMN,对于部分只需要修改表定义而不需要修改表数据的操作,使用ALTER COLUMN操作可以直接修改.frm文件避免数据发生移动,操作很快
  • MODIFY COLUMN,会引起表的重建,非常慢
  • CHANGE,主要用于列的重命名、列类型的变更以及列位置的移动,也很慢

仅需要修改表结构的操作有:

  • 更改字段的默认值
  • 增加和删除字段的AUTO_INCREMENT属性,(AUTO_INCREMENT用于主键自动增长的,从1开始增长)
  • 增删改ENUM的常量值,(ENUM是字段的一种类型,表示枚举类型,字段的数据只能是ENUM设置的常量值之一)
  1. 修改字段类型
ALTER TABLE 表名称 MODIFY COLUMN 字段名称 字段类型(size);  
  1. 增加列
ALTER TABLE 表名称 ADD COLUMN 字段名称 字段类型(size);  
  1. 删除列
ALTER TABLE 表名称 DROP COLUMN 字段名称;  
  1. 添加约束
ALTER TABLE 表名称 MODIFY COLUMN 字段名称 字段类型(size) NOT NULL;
// 添加非空约束

ALTER TABLE 表名称 ADD PRIMARY KEY(字段名称);
// 指定字段为主键方式一
ALTER TABLE 表名称 MODIFY COLUMN 字段名称 字段类型(size) PRIMARY KEY; 
// 指定字段为主键方式二
  1. 删除约束
ALTER TABLE 表名称 MODIFY COLUMN 字段名称 字段类型(size);
// MODIFY理解为重构, 重构这一字段, 不添加非空约束, 就是删除非空约束

ALTER TABLE 表名称 DROP PRIMARY KEY;
// 去掉表的主键约束
  1. 显示表中所有键
  • 键:在数据库中关键码(简称,键),由一个或多个属性组成
SHOW KEYS FROM 表名称;
  1. 修改字段名称
ALTER TABLE 表名称 CHANGE 旧字段名 新字段名 新数据类型;

查询

  1. 查询语句
SELECT 字段名称1, 字段名称2, ... FROM 表名称 WHERE 条件;

注意字段名称1, 字段名称2等,是值查询这些字段的值,和后面的WHERE条件无关

  1. 指定查询前几条或者中间某几行数据
    根据条件查询指定字段的值,从第参数1行开始,返回参数2条结果
SELECT 字段名称1, 字段名称2, ... FROM 表名称 WHERE 条件 LIMIT 参数1, 参数2;
SELECT 字段名称1, 字段名称2, ... FROM 表名称 WHERE 条件 LIMIT 参数1;
// 等价于
SELECT 字段名称1, 字段名称2, ... FROM 表名称 WHERE 条件 LIMIT 0, 参数1;
  1. 关系运算符筛选
    等于:=
    大于:>
    大于等于:>=
    小于:<
    小于等于:<=
    不等于:!=
SELECT 字段名称1, 字段名称2, ... FROM 表名称 WHERE 某字段=某值;
  1. 逻辑运算符
    与:AND
    或:OR
    非:NOT
SELECT 字段名称1, 字段名称2, ... FROM 表名称 WHERE 某字段=某值 AND 某字段>=某值;
  1. 范围查询
    IN
    BETWEEN 小数值 AND 大数值
SELECT 字段名称1, 字段名称2, ... FROM 表名称 WHERE 某字段 IN (某值1, 某值2, ...);
// 查询某字段的值是某值1、或某值2、或... 的字段名称1、字段名称2、... 的值
SELECT 字段名称1, 字段名称2, ... FROM 表名称 WHERE 某字段 BETWEEN 小数值 AND 大数值;
// 查询某字段的值范围是[小数值, 大数值]的字段名称1、字段名称2, ... 的值(范围包括边界)
  1. 空判断
SELECT 字段名称1, 字段名称2, ... FROM 表名称 WHERE 某字段 IS NULL;       
// 查询条件是某字段为空
SELECT 字段名称1, 字段名称2, ... FROM 表名称 WHERE 某字段 IS NOT NULL;    
// 查询条件是某字段不为空
  1. 模糊查询
    LIKE
    %表示任意多个字符(包括0)
    _表示任意一个字符
    ESCAPE:取消%或_字符的通配符特性
    [ ]表示括号内所列出的字符中的一个
    [^ ] 表示不在括号所列之内的单个字符
SELECT * FROM student WHERE name LIKE "%王%";
// 查询name中有”王“字的数据

索引

索引的目的在于提高查询效率,与我们查阅图书所用的目录是一个道理:先定位到章,然后定位到该章下的一个小节,然后找到页数。

本质是:通过不断地缩小想要获取数据的范围来筛选出最终想要的结果同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据。

安装MySQL的python接口

sudo pip3 install PyMySQL

使用PyMySQL

import pymysql
 
 
db = pymysql.connect("localhost","user","key","database")
// 连接到数据库
  • localhost:如果在本机上登录,就填"localhost"。如果是远程登录,就填"数据库所在主机的IP地址"
  • user:"用户名称"
  • key:"密码"
  • database:"数据库名称"

创建表:

import pymysql
 
 
db = pymysql.connect("localhost","user","key","database")
// 连接到数据库
cursor = db.cursor()
// 使用cursor()方法获取操作游标
cursor.execute("MySQL语法的创建表语句")
// 创建表
db.close()
// 关闭数据库连接

数据库插入操作:

import pymysql
 
 
db = pymysql.connect("localhost","user","key","database")
// 连接到数据库
cursor = db.cursor()
// 使用cursor()方法获取操作游标

try:
   cursor.execute("MySQL语法的插入语句")
   db.commit()
   // 提交到数据库执行
except:
   db.rollback()
   // 如果发生错误则回滚

db.close()
// 关闭数据库连接

数据库查询操作:

import pymysql
 
 
db = pymysql.connect("localhost","user","key","database")
// 连接到数据库
cursor = db.cursor()
// 使用cursor()方法获取操作游标

try:
   cursor.execute("MySQL语法的查询语句")
   results = cursor.fetchall()
   // 获取所有记录列表
   // cursor.fetchone() 获取单条记录
   for row in results:
      查询到的字段1= row[0]
      查询到的字段2= row[1]
      ...
      查询到的字段n值 = row[n-1]
      
      print("字段1=%s,字段2=%s,... 字段n=%s" % \
            (查询到的字段1, 查询到的字段2, ... 查询到的字段n值))
      // 打印结果
except:
   print ("Error: unable to fetch data")

db.close()
// 关闭数据库连接

结语

如果您有修改意见或问题,欢迎留言或者通过邮箱和我联系。
手打很辛苦,如果我的文章对您有帮助,转载请注明出处。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章