关系型数据库MySQL(基础)

1. 数据库

1.1 数据库的概念

数据库是一种特殊的文件,比通常的文件增删改查速度快的多。html

1.2 MySQL核心元素

  • 记录(行)
  • 字段(列)
  • 数据表(字段、记录的集合)
  • 数据库(数据表的集合)

1.3 RDBMS(关系型数据库)

常见的关系型数据库(RDBMS):python

  • oracle:在之前的大型项目中使用,银行,电信等项目(收费)
  • mysql:web时代使用最普遍的关系型数据库(开源)
  • ms sql server:在微软的项目中使用
  • sqlite:轻量级数据库,主要应用在移动平台

常见的非关系型数据库:mysql

  • Redis
  • MongoDB

1.4 RDBMS和数据库的关系

SQL就是操做RDBMS即关系型数据库的专用语言,经过SQL来实现增删改查。不区分大小写

有一款图形化界面的软件Navicat,是封装SQL语言的一款软件,能够经过图形化界面手动操做数据库建立等全部操做web

2. MySQL数据类型

2.1 经常使用的数据类型

使用数据类型的原则是:够用就行,尽可能使用取值范围小的,而不用大的,这样能够更多的节省存储空间正则表达式

  • 整数:int,bit
  • 小数:decimal
  • 字符串:varchar,char
  • 枚举类型:enum
  • 日期时间: date, time, datetime
  1. 数值类型经常使用
类型 字节大小 有符号范围(Signed) 无符号范围(Unsigned)
bit 2个比特 默认表示0 只有0和1
tinyint 1 -128 ~ 127 0 ~ 255
smallint 2 -32768 ~ 32767 0 ~ 65535
mediumint 3 -8388608 ~ 8388607 0 ~ 16777215
int/integer 4 -2147483648 ~2147483647 0 ~ 4294967295
bigint 8 -9223372036854775808 ~ 9223372036854775807 0 ~ 18446744073709551615
  1. 字符串经常使用
类型 字节大小 示例
char 0-255 类型:char(3) 输入 'ab', 实际存储为'ab ', 输入'abcd' 实际存储为 'abc'
varchar 0-255 类型:varchar(3) 输 'ab',实际存储为'ab', 输入'abcd',实际存储为'abc'
text 0-65535 大文本
  1. 日期时间类型
类型 字节大小 示例
date 4 '2020-01-01'
time 3 '12:29:59'
datetime 8 '2020-01-01 12:29:59'
year 1 '2017'
timestamp 4 '1970-01-01 00:00:01' UTC ~ '2038-01-01 00:00:01' UTC

2.2 约束条件

  • primary key(主键):物理上存储的顺序
  • not null(非空):此字段不容许填写空值
  • unique(惟一):此字段的值不容许重复
  • default(默认):当不填写此值时会使用默认值,若是填写时以填写为准
  • foreign key(外键):对关系字段进行约束,当为关系字段填写值时,会到关联的表中查询此值是否存在,若是存在则填写成功,若是不存在则填写失败并抛出异常

说明:虽然外键约束能够保证数据的有效性,可是在进行数据的crud(增长、修改、删除、查询)时,都会下降数据库的性能,因此不推荐使用,那么数据的有效性怎么保证呢?答:能够在逻辑层进行控制 数值类型(经常使用)sql

3. 命令SQL

3.1 基本操做

说明:一切操做基于安装好MySQL以后,且不分大小写数据库

  • 链接MySQL:mysql -uroot -p密码
  • 退出数据库:exit/quit/Ctrl+d
  • 显示数据库版本:select version();
  • 显示时间:select now();
  • 查看全部数据库:show databases;
  • 建立数据库:create database 数据库名 charset=utf8;
  • 查看建立数据库所使用的全部语句:show crate database 数据库名;
  • 删除数据库:drop database 数据库名;(工做中慎用)
  • 使用数据库:use 数据库名;
  • 查看当前使用的数据库:select database();

使用数据库后数据表的操做:浏览器

  • 查看当前数据库中全部表:show tables;
  • 建立表:create table 数据表名(字段1 字段类型 字段约束条件,字段2 类型 约束...);
  • 查看表结构:desc 数据表名;
  • 向表里添加数据:insert into 数据表名 values(0, xx, xxx,...);
  • 查看数据表内全部数据(少数据类型):select * from 数据表名;
  • 查看表的建立语句:show create table 数据表名;

3.2 修改数据表

  • 添加字段:alter table 表名 add 字段名(列) 类型 约束等;
  • 修改字段中类型/约束:alter table 表名 modify 字段名(列) 要修改的类型/约束;
  • 修改字段名及类型/约束:alter table 表名 change 原名 新名 类型/约束;
  • 删除字段(基本不用):alter table 表名 drop 字段(列)名
  • 删除表(工做中慎用):drop table 表名;

3.3 增长表内数据

  • 全列插入:insert into 表名 values(...);
  • 部分插入:insert into 表名(列1,...) values(值1,...)
  • 多行插入:insert into 表名 values(...), (...), ...;

3.4 修改表内数据

  • 修改:updata 表名 set 列1=值1,列2=值2... where 判断条件;(不加where所有修改成列1=值1...,加上where修改知足判断条件的列1=值1...)

3.5 删除

  • 物理删除(不推荐):delete from 表名 where 判断条件;(删除知足判断条件的数据,其它主键不变,删除的主键消失)
  • 逻辑删除(推荐):alter table 表名 add 字段名 bit;(添加一个bit类型的字段,表示已经不能再使用了)

3.6 查询的基本使用

  • 查询全部列:select * from 表名;
  • 条件查询:select * from 表名 where 判断条件;(多行、某行或某个数据)
  • 查询指定列:select 列1,列2... from 表名;
  • 为列或表指定别名:select 字段名1 as 别名1,字段名1 as 别名1... from 数据表 as 别名;(数据显示按书写顺序显示,可调换先后位置,显示的数据也会调换)

4. 查询的全部经常使用用法

4.1 条件查询

  • 消除重复行:select distinct 字段名 from 表名;
  • 比较运算符:select * from 表名 where >、<、<=、>=、=、!=;
  • 逻辑运算符:select * from 表名 where 条件1 and、or、not 条件2;

4.2 模糊查询

  • select 列1 from 表名 where 列1 like "_表示一个、%表示0个或多个、中文表示知足该位置出现那个中文的数据";
  • select 列1 from 表名 where 列1 rlike "正则表达式";

4.3 范围查询

  • 查询在in(条件)非连续的条件中的数据:select 列1 from 表名 where 列1 in(...);
  • 查询不在not in(条件)非连续的条件中的数据:select 列1 from 表名 where 列1 not in(...);
  • 查询在一个连续范围内的数据:select 列1 from 表名 where 列1 between x and y;
  • 查询在一个连续范围以外的数据:select 列1 from 表名 where 列1 not between x and y;

4.4 空判断

  • 判空:select * from 表名 where 判断对象 is null;
  • 判非空:select * from 表名 where 判断对象 is not null; 注意:Python中None不等于""、[]、()、{}等,此处也是。

4.5 排序

  • 默认从小到大排训asc:select 列1 from 表名 where 判断条件 order by 列1 (asc可省略);
  • 从大到小排desc:select * from 表名 where 判断条件 order by 列1 desc;

例:给定一个students表,查询年龄在18-34岁之间的女性,身高从高到矮排序,若是身高相同的状况下按照年龄从小到大排序,若是年龄也相同按照id从大到小排序。安全

select * from students where (age between 18 and 34) and gender=2 order by height desc, age asc, id desc;bash

4.6 聚合函数

  • 查总数:select count(*) from 表名;
  • 查最大值:select max(*) from 表名;
  • 查最小值:select min(*) from 表名;
  • 求和:select sum(*) from 表名;
  • 求平均值:select avg(*) from 表名;等同于:select sum()/count() from 表名;
  • 四舍五入,保留2位小数:select round(avg(*), 2) from 表名;

4.7 分组

  • 按照性别分组,查询全部性别:select gender from 表名 group by gender;
  • 查询同种性别的姓名:select gender,group_concat(name) from 表名 where gender="男" group by gender;
  • having和where:查询出的数据判断用having,未查出的数据判断用where.

4.8 分页

  • 限制查询出来的数据个数:select * from 表名 limit 2;限制只显示2个
  • 分页显示:select * from 表名 limit (第n页-1【不能为计算式,只能是数字或参数】),数据个数;

4.9 链接查询

  • 查询的信息有表A和表B的数据:select ... from 表A inner join 表B on 表A.关联字段=表B.关联字段;
  • 查询表A对应的表B:select * from 表A left join 表B on 表A.关联字段=表B.关联字段;(不管如何都会显示完表A,right join on 表名位置相反)

4.10 自关联

例:省级联动 url:demo.lanrenzhijia.com/2014/city06…

  • 查询全部省份(省份最大上级是null):select * from areas where pid is null;
  • 查询陕西省有哪些市:select * from areas as province inner join areas as city on city.pid=province.aid having province.atitle="陕西省";或者 select province.atitle, city.atitle from areas as province inner join areas as city on city.pid=province.aid having province.atitle="山东省";
  • 查询西安市有哪些县城(区):select province.atitle, city.atitle from areas as province inner join areas as city on city.pid=province.aid having province.atitle="青岛市"; 或者 select * from areas where pid=(select aid from areas where atitle="青岛市")
  • 子查询:在一个查询信息中查询

例:查出最高的男生信息 select * from students where height=(select max(height) from students);

5. 视图

5.1 视图的概念

通俗的讲,视图就是一条select语句执行后返回的结果集。也是对若干基本表的引用,一张虚表,指向各个表的内存地址(不可操做,只可查,基本表数据发生了改变,视图也会跟着改变)

5.2 视图的定义

建议以v_开头

create view 视图名称 as select语句;
复制代码

5.3 查看视图

查看表会将全部的视图也列出来

show tables;
复制代码

5.4 使用视图

视图的用途就是方便查询

select * from v_stu_score;
复制代码

5.5 删除视图

drop view 视图名称;
例:
drop view v_stu_sco;
复制代码

例:视图demo

5.6 视图的做用

  1. 提升了重用性
  2. 对数据库重构,却不影响程序的运行
  3. 提升了安全性能,能够对不一样的用户开放
  4. 让数据更加清晰

6. 事务

6.1 为何要有事务

  • 事务普遍的运用于订单系统、银行系统等多种场景。
  • 若是A给B转帐,A帐户扣钱以后,系统出了故障,B没有收到钱,而A也白白损失了钱,这种状况是不被容许发生的
  • 所谓事务,它就是一个操做序列,这些操做要么都执行,要么都不执行,它是一个不可分割的工做单位。

例:要么转帐成功,要么转帐失败,不存在转帐过程当中流失的问题。

6.2 事务的四大特性(简称ACID)

  1. 原子性(Atomicity)
  2. 一致性(Consistency)
  3. 隔离性(Isolation)
  4. 持久性(Durability) 能够用start transaction语句开始一个事务,而后要么使用commit提交将修改的数据持久保存,要么使用rollback回滚全部的修改,事务SQL的样本以下:
start transaction;

select balance from checking where customer_id = 10233276;

update checking set balance = balance - 200.00 where customer_id = 10233276;

update savings set balance = balance + 200.00 where customer_id = 10233276;

commit;
复制代码

一个好的事务应该知足上述4大特性

6.3 事务命令

表的引擎类型必须是innodb类型才可使用事务,这是mysql表的默认引擎

查看表的建立语句,能够看到engine = innodb

  • 开启事务:begin、start transaction;
  • 完成后提交:commit;
  • 误操做后后退回滚操做:rollback;

7. 索引

数据量很大时,查询数据会很慢,能够添加索引来优化查询。

7.1 索引的概念

索引是一种特殊的文件,它们包含着对数据表里全部记录的引用指针。

7.2 索引的原理

字典目录就是典型的索引,数据库也能够用此类方法查询,好比,把数据分红段,而后分段查询,若是有1000条数据,要查第250条,每100条分红一段,第三段就能够找到第250条数据,除去了90%无用效数据。

7.3 索引的操做

  1. 建立索引
    • 若是指定字段是字符串,须要指定长度,建议长度与定义字段时长度一致
    • 字段类型若是不是字符串,能够不填写长度部分

create index 索引名称 on 表名(字段名称(长度))

  1. 删除索引:drop index 索引名称 on表名;

例:create table test_index(title varchar(10));

7.4 注意事项

创建太多的索引将会影响更新个插入的速度,由于它须要一样更新每一个索引文件,对于一个常常须要更新和插入的表格,就不必创建索引了,对于较小的表,排序的开销不会很大,也不必创建另外的索引。创建索引会占用磁盘空间

8. MySQL主从同步配置

8.1 主从同步的定义

主从同步使得数据能够从一个数据库服务器复制到其余服务器上,在复制数据时,一个服务器充当主服务器(master),其他的服务器充当从服务器(slave)。由于复制是异步进行的,因此从服务器不须要一直链接着主服务器,从服务器甚至能够经过拨号断断续续地链接主服务器。经过配置文件,能够指定复制全部的数据库,某个数据库,甚至是某个数据库上的某个表。 主从同步的好处:

  • 经过增长从服务器来提升数据库的性能,在主服务器上执行写入和更新,在从服务器上向外提供读功能,能够动态地调整从服务器的数量,从而调整整个数据库的性能
  • 提升数据安全,由于数据已复制到从服务器,从服务器能够终止复制进程,因此,能够在从服务器上备份而不破坏主服务器相应数据
  • 在主服务器上生成实时数据,而在从服务器上分析这些数据,从而提升主服务器的性能

8.2 主从同步的基本步骤

有不少种配置主从同步的方法,能够总结为以下的步骤:

  1. 在主服务器上,必须开启二进制日志机制和配置一个独立的ID
  2. 在每个从服务器上,配置一个惟一的ID,建立一个用来专门复制主服务器数据的帐号
  3. 在开始复制进程前,在主服务器上记录二进制文件的位置信息
  4. 若是在开始复制以前,数据库中已经有数据,就必须先建立一个数据快照(可使用mysqldump导出数据库,或者直接复制数据文件)
  5. 配置从服务器要链接的主服务器的IP地址和登录受权,二进制日志文件名和位置

9. 服务器的动态资源请求

9.1 浏览器请求动态页面的过程

9.2 WSGI

WSGI容许开发者将选择web框架和web服务器分开。能够混合匹配web服务器和web框架,选择一个适合的配对。好比,能够在Gunicorn 或者 Nginx/uWSGI 或者 Waitress上运行 Django, Flask, 或 Pyramid。真正的混合匹配,得益于WSGI同时支持服务器和架构:

web服务器必须具有WSGI接口,全部的现代Python Web框架都已具有WSGI接口,它让你不对代码做修改就能使服务器和特色的web框架协同工做。

9.3 定义WSGI

只要求Web开发者实现一个函数,就能够响应HTTP请求

def application(environ, start_response):
    start_response("200 OK", [("Content-Type", "text/html")])
    return "Hello World!"
复制代码

上面的application()函数就是符合WSGI标准的一个HTTP处理函数,它接收两个参数:

  • environ:一个包含全部HTTP请求信息的dict对象;
  • start_response:一个发送HTTP响应的函数。

10. web整体简图

相关文章
相关标签/搜索