数据库:
是存储和管理数据的仓库 每个数据库都有一个或多个不同的API(接口)用于创建,访问,管理,搜索和复制所保存的数据。
API(Application Programming Interface,应用程序编程接口) 接口属于一种操作系统或程序接口,而后两者都属于直接用户接口。是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。 有时公司会将 API 作为其公共开放系统。也就是说,公司制定自己的系统接口标准,当需要执行系统整合、自定义和程序应用等操作时,公司所有成员都可以通过该接口标准调用源代码,该接口标准被称之为开放式 API。
现在我们使用关系型数据库管理系统(RDBMS)所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
关系数据库管理系统( Relational Database Management System)
特点:
1.数据以表格的形式出现
2.每行为各种记录名称
3.每列为记录名称所对应的数据域
4.许多的行和列组成一张表单
5.若干的表单组成database
在关系数据库中,这种基于表(Table)的一对多的关系就是关系数据库的基础。
RDBMS的一些术语:
数据库,数据表,列,行,冗余,主键,外键,复合键,索引,参照完整性
冗余:存储两倍数据,冗余可以使系统速度更快。查询时可能经常需要在多个表之间进行连接查
询;而进行连接操作会降低查询速度。因此可以在表中增加一个冗余字段,这样就不用每
次都进行连接操作了。
主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
外键:外键用于关联两个表。主键是被引用的 外键是引用别人的
复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
索引:索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须
满足的完整性约束条件,目的是保证数据的一致性。
当从几亿的大数据中查找一个数据时,可以用hash ()函数,二分法则进行快速查询,2的几次方就需要几次
安装服务器 mysql 客户端 sqlyog
MySQL使用标准的SQL数据语言形式,SQL是一种介于关系代数与关系演算之间的结构化查询语
MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一
个大仓库内,这样就增加了速度并提高了灵活性。
关系型数据库:
关系型数据库,是指采用了关系模型来组织数据的数据库。都使用结构化查询语言SQL
DB2数据库: IBM的产品,听起来挺高端在企业级的应用最为广泛
SQL Server 数据库: 属于Microsoft 微软自家产品,Windows定制专款;
Sybase数据库: 属于Sybase公司,曾经跟微软是好基友,后来关系破裂,现在家境惨淡。
Oracle数据库: 典型的高富帅,最初是一家专门开发数据库的公司,成为世界上使用最广泛的关系数据系统之一。
虽然功能强劲,但它毕竟是为商业用途而存在的,目前很少在游戏中使用到。
这些数据库都是不开源而且付费的,最大的好处是花了钱出了问题可以找厂家解决,不过在Web的世界里,常常需要部署成千上万的数据库服务器,当然不能把大把大把的银子扔给厂家,所以,无论是Google、Facebook,还是国内的BAT,无一例外都选择了免费的开源数据库:
MySQL 数据库: 由瑞典MySQL AB公司开发,目前属于Oracle公司。
Access数据库: 属于Microsoft 微软公司
FoxPro数据库: 属于Microsoft 微软公司
PostgreSQL: 学术气息有点重,其实挺不错,但知名度没有MySQL高;
sqlite: 嵌入式数据库,适合桌面和移动应用。
非关系类型数据库:又被称为NoSQL,非关系型数据库严格上不是一种数据库,应该是一种数据结构
化存储方法的集合。
非关系型数据库主要有四种数据存储类型:键值对存储(key-value),文档存储(document
store),基于列的数据库(column-oriented),还有就是图形数据库(graph database)。
memcached
Redis:
Tokyo CabinetTokoy Tyrant
MongoDB
CouchDB
Cassandra
Voldemort
LevelDB
SQLite:SQLite是一种嵌入式数据库,特点是轻量级、可嵌入,但不能承受高并发访问,适合桌面和移动应用,它的数据库就是一个文件,Python就内置了SQLite3,所以,在Python中使用SQLite,不需要安装任何东西,直接使用。具体参考廖雪峰数据库
使用SQLAlchemy:在Python中,最有名的ORM框架是SQLAlchemy。ORM框架的作用就是把数据库表的一行记录与一个对象互相做自动转换。具体参考廖雪峰数据库
SQL:结构化查询语言:四大块
DML:数据操作语言 ——用于操作数据库中所包含的数据
命令:INSERT, 插入
UPDATE , 修改
DELETE,删除
DDL:数据定义语言——用于创建和删除数据库对象等操作
命令: CREATE, 创建
DROP , 删除
ALTER,修改
DQL:数据查询语言——用来对数据库中的数据进行查询
命令: SELECT ,查寻
DCL:数据控制语言——用老控制数据库组件的存取许可,存取权限等
命令: GRANT, 管理 授权
COMMIT,提交
ROLLBACK,回滚
也有算数运算符 + , -, *, / , %
赋值运算符: =
逻辑运算符: and or not
比较运算符 = ,> ,< ,>=, <= , != ,<>不等于
MySQL有多种存储引擎,每种存储引擎有各自的优缺点,可以择优选择使用:
MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。
常用的两种引擎:
区别: innoDB 偏向增删改 myisam 偏向查询
事务处理: 支持 不支持
(事务是在同时操作1个一上数据的时候 同时成功或失败 就要设置事务)
数据行锁定: 支持 不支持
(当多个人进行数据操作的时候,把要修改的数据锁定,其他人无法同时修改 )
外键约束: 支持 不支持
(主要约束给从表插入数据时 外键的值主键也要存在)
全文索引: 不支持 支持
(索引指通过目录查询 全文指有大量文本时 )
表空间大小 : 较大,约两倍 较小
(表的存储空间)
查看默认引擎:
show variables like 'storage_engine%';
修改数据库默认引擎 :修改my.ini配置文件
default-storage-engine=InnoDB---可改为其它存储
创建表时设置引擎:
语法 CREATE TABLE 表名(。。。代码)ENGINE=存储引擎
MyISAM类型表文件:
*.frm 表结构定义文件
*.myd 数据文件
*.myi 索引文件
InnoDB类型表文件:
*.frm 表结构定义文件
ibadata1 文件
存储位置:
因操作系统因人而异,可查my.ini
查看my.ini配置文件,可查看更改配置 (MySQL装在哪就去哪找
datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/"
innodb_data_home_dir="D:/MySQL Datafiles
mysql:系统默认4个数据库:
Information_schema
Performance_schema
mysql
test
默认端口号3306,默认字符集utf8
启动数据库:
如果没有默认启动 可以在计算机管理里 服务查看 右键启动,
1 :dos 命令也可以net start mysql来启动,默认自带一个客户端,直接输入密码 也可操作数据库
doc命令,mysql-uroot-p 输入密码 也可链接
或 mysql -h 输入IP地址 -uroot-p 输入密码 也可链接
2:使用MySQL Command Line Client 登录
修改root 密码的语句:
1 alter user root@localhost identified with mysql_native_password by '654321';
2 mysqladmin -uroot -p123456 password 不用进入mysql内部
查看所有的进程:
ps - ef
并筛选出MYSQL:
ps - ef | grep mysql (筛选 mysql)
可看到 mysql进程号
删掉mysql进程:
kill 进程号
如果没有启动:
mysqld_safe& 可以启动
想关闭 mysql服务器:
mysqladmin -u root -p shutdown
添加用户:
use mysql ;进入数据库,
查看已有用户:
select 字段 from 表名;
插入用户:
grant all on test .* to 'xxx'@'%' identified by '密码xxx';
#授权 所有 在 test数据库下 .*所有的表 ‘xxx用户’ @从 %所有机器访问 给它的密码 by ‘设置的密码’
/*
grant 授权
all 所有
on 在哪里
test = 要设置的数据库名
. * 数据库里所有的表
‘ 用户 ’ 添加的用户
@ 从哪访问
% 所有
identified 密码
by'xxx' 设置的密码
*/
MySQL数据类型:
数值类型:
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
TINYINT | 1 字节 | (-128,127) | (0,255) | (非常小的数据)小整数值 |
SMALLINT | 2 字节 | (-32 768,32 767) | (0,65 535) | (较小的数据)大整数值 |
MEDIUMINT | 3 字节 | (-8 388 608,8 388 607) | (0,16 777 215) | (中等大小的数据)大整数值 |
INT或INTEGER | 4 字节 | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | (标准整数)大整数值 |
BIGINT | 8 字节 | (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | (较大的整数)极大整数值 |
FLOAT | 4 字节 | (-3.402 823 466 E+38,1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度浮点数值 |
DOUBLE | 8 字节 | (1.797 693 134 862 315 7 E+308,2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度浮点数值 |
DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 依赖于M和D的值 | 依赖于M和D的值 | (字符串形式的浮点数)小数值 |
UNSIGNED属性: 表示为无符号数 没有负数,有符号的是有正数有负数
ZEROFILL属性:宽度(位数)不足以0填充 宽度:以几位去显示
若某数值字段指定了ZEROFILL属性,将自动添加UNSIGNED属性(不会有负数)
小数类区别:
1 float,2 double
表示不太精准的小数,位数越多越不精准,
1比较短的时候开始不精准
2长度更长的时候开始不精准
decimal(可以2个参数):精准的小数( 小数点前和后的总位数,小数点后最多的位数)
字符串类型:
类型 | 大小 | 用途 |
CHAR | 0-255字节 | 定长字符串 |
VARCHAR | 0-65535 字节 | 变长字符串 |
TINYBLOB | 0-255字节 | 不超过 255 个字符的二进制字符串 |
TINYTEXT | 0-255字节 | 短文本字符串 |
BLOB | 0-65 535字节 | 二进制形式的长文本数据 |
TEXT | 0-65 535字节 | 长文本数据 |
MEDIUMBLOB | 0-16 777 215字节 | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215字节 | 中等长度文本数据 |
LONGBLOB | 0-4 294 967 295字节 | 二进制形式的极大文本数据 |
LONGTEXT | 0-4 294 967 295字节 | 极大文本数据 |
区别:
CHAR(M) 固定长度 ,定义多长就是多长,不足会以空格填充,速度快(固定长度可以直接跳过长度找到)
VARCHAR(M) 不确定长度,根据内容决定长度,节省空间,(需要遍历去查找)
创建数据库表时,定长往列前放,变长往列最后放,有益于数据库优化
存储图片,视频,大文本,可以存到服务器硬盘上,把文件路径存到数据库
日期类型:
类型 | 大小 (字节) | 范围 | 格式 | 用途 |
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD年月日 | 日期值 |
TIME | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS时分秒 | 时间值或持续时间 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS 年月日时间秒 | 混合日期和时间值 |
TIMESTAMP | 4 | 1970-01-01 00:00:00/2037 年某时刻精度为1秒 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
若某日期字段默认值为当前日期,一般设置为TIMESTAMP时间戳 类型
枚举类型: enum,当设置枚举类型时,要设置固定的类型值,插入数据时只能选择固定的值
例: aaa enum(1,2,3,4)
insert into xxx(aaa)values(3) /只能插入1234中某一个
set集合类型: 当设置set类型时,要设置固定的类型值, 插入数据时只能选择固定值或组合
例: bbb set(1,2,3,4)
insert into xxx(bbb)values(1,2) /只能插入1234中某一个或组合
字段的约束和属性:
非空约束 NOT NULL 字段不允许为空
默认约束 DEFAULT 赋予某字段默认值
唯一约束 UNIQUE KEY(UK) 设置字段的值是唯一的,(不可以重复,允许为空) 但只能有一个空值,
唯一索引 UNIQUE 索引名(xx1,xx2);索引列的值必须唯一,但允许有空值
主键约束 PRIMARY KEY(PK) 设置该字段为表的主键 可唯一表示该表记录/一张表只能有一个主键,(不能重复,不能为空)
外键约束 FOREIGN KEY(FK) 用于在两表之间建立关系,需要指定引用主表的哪一字段
外键变种:一对一:关联外键字段并且值是唯一不可以重复时,外键+唯一索引
多对多:第三张表两个字段引用两个表的外键并且两个字段不能重复时,外键+联合唯一索引
自动增长 AUTO_INCREMENT 默认该列表为自增字段 默认每条自增1 通常用于设置主键
注释:COMMENT
唯一索引 unique 索引名(xx1,xx2)
常用函数:聚合函数,所有数据库都有这五个函数
函数名 | 作用 |
AVG() | 返回某字段的平均值 |
COUNT() | 返回某字段的行数 |
MAX() | 返回某字段的最大值 |
MIN() | 返回某字段的最小值 |
SUM() | 返回某字段的和 |
select AVG(求哪个字段) from 表 AS MAX求最大值, AS MIN 求最小值 ,AS SUM 求和
count(*)查找所有行数,
count(字段) 统计字段中不为null的行数
count(数字) 默认也会查出所有行数,速度比 * 快
字符串函数:
函数名 | 作用 | 举例 |
CONCAT(str1, str1...strn) | 字符串连接 | SELECT CONCAT('My','S','QL'); 返回:MySQL |
INSERT(str, pos,len, newstr) | 字符串替换 | SELECT INSERT( '这是SQL Server数据库', 3,10,'MySQL'); 返回:这是MySQL数据库 |
LOWER(str) | 将字符串转为小写 | SELECT LOWER('MySQL'); 返回:mysql |
UPPER(str) | 将字符串转为大写 | SELECT UPPER('MySQL'); 返回:MYSQL |
SUBSTRING (str,num,len) | 字符串截取 | SELECT SUBSTRING( 'JavaMySQLOracle',5,5); 返回:MySQL |
字符串函数还有很多可查询
concat(字段1,字段2) 链接 等同于+,可以是一个或多个字符串,若其中任意一个字符是NULL,则
返回的结果为NULL.
concat_ws(分隔符,字段1,字段2)表示用分隔符将字符串连接,是一种特殊形式的连接函数。第一
个参数表示分隔符,如果分隔符为NULL,那么返回的结果也是NULL.
insert( 原字符串,从几开始,长度,‘要替换的字符串) 数据库下标从1开始,长度写0 可以用作插
入
ELT(N,str1,str2,str3)函数是指返回一个字符串List的第N个元素,如果N=1,返回str1;如果
N=2,返回str2. 如果N小于1或大于字符串元素的个数,则返回NULL.
FIELD(N,str1,str2,str3,)函数是指返回某字符串在字符串List的位置,如果字符串List未找
到指定的字符串,则返回0.如果字符串为NULL,则返回的值为0,因为NULL和所
有值比较都不相等。
substring(字段,下标,长度)截取,可以用where 条件判断 设定要截取的内容
length(字段) 得到长度,一个汉字3个字节
char_length(字段)得到字符数 查看字符大小参数
left(字符串)
index()
substring_index()
trim()去掉字符
replace(字段中,要替换的,原有的)替换,内容替换
elt()
locate(截取的位置,字段,位置) 截取的字段,在字段里面的位置,从哪个位置开始
数学函数:
CEIL(x) | 返回大于或等于数值x的最小整数 | SELECT CEIL(2.3)返回:3 |
FLOOR(x) | 返回小于或等于数值x的最大整数 | SELECT FLOOR(2.3) 返回:2 |
RAND() | 返回0~1间的随机数 | SELECT RAND()返回:0.5525468583708134 |
可查
时间日期函数:
函数名 | 作用 | 举例,结果与当前日期相关 |
CURDATE() CURDATE() | 获取当前日期 获取当前日期 | SELECT SELECTCURDATE(); 返回:2016-08-08 |
CURTIME() | 获取当前时间 | SELECT CURTIME(); 返回:19:19:26 |
NOW() | 获取当前日期和时间 | SELECT NOW(); 返回:2016-08-08 19:19:26 |
WEEK(date) | 返回日期date为一年中的第几周 | SELECT WEEK(NOW()); 返回:26 |
YEAR(date) | 返回日期date的年份 | SELECT YEAR(NOW()); 返回:2016 |
HOUR(time) | 返回时间time的小时值 | SELECT HOUR(NOW()); 返回:9 |
MINUTE(time) | 返回时间time的分钟值 | SELECT MINUTE(NOW()); 返回:43 |
DATEDIFF(date1,date2) | 返回日期参数date1和date2之间相隔的天数 | SELECT DATEDIFF(NOW(), '2008-8-8'); 返回:2881 |
ADDDATE(date,n) | 计算日期参数date加上n天后的日期 | SELECT ADDDATE(NOW(),5); 返回:2016-09-02 09:37:07 |
日期函数还有很多,可查询
算法:解决问题的方法和步骤
GIL全局解释器锁
Global
Interpreter
Lock
域名:
.com
.net
.cn 中国
,org 组织 orgnization
.gov 政府 govenment
网站:
浏览器-页面地址-web服务器
动态页面:
web服务器-查询--数据库
应用服务器:
把业务的请求通过程序描述的逻辑来完成,
阅读文章:
数据库表:存放文章
范式:目前有8种
3NF:三范式
为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。
1.第一范式(确保每列保持原子性)
如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。
比如需要用到多次查询某一字段地址栏里的多个数据信息时,可以拆分为几个单独的字段存储,有益于快速查询,属于满足了第一范式。
2.第二范式(确保表中的每列都和主键相关)
第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
比如可以把商品信息和订单信息尽享拆分为两个表,一个表引用另一个表的主键就可以了,这样在很大程度上减小了数据库的冗余。如果要获取订单的商品信息,使用商品编号到商品信息表中查询即可。
3.第三范式(确保每列都和主键列直接相关,而不是间接相关)
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
比如订单表和客户信息表,可以将客户编号作为外键和订单表建立相应关系,这样可以使用客户信息编号来查询客户信息,减少数据冗余
数据库的理论基础,
主键是被引用的 外键是引用别人的
I/O输入/输出(Input/Output),分为IO设备和IO接口两个部分。由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘、网络等,就需要IO接口。
浏览器首先会发送数据给新浪服务器,告诉它我想要首页的HTML,这个动作是往外发数据,叫Output,随后新浪服务器把网页发过来,这个动作是从外面接收数据,叫Input。所以,通常,程序完成IO操作会有Input和Output两个数据流。当然也有只用一个的情况,比如,从磁盘读取文件到内存,就只有Input操作,反过来,把数据写到磁盘文件里,就只是一个Output操作。
IO编程中,Stream(流)是一个很重要的概念,可以把流想象成一个水管,数据就是水管里的水,但是只能单向流动。Input Stream就是数据从外面(磁盘、网络)流进内存,Output Stream就是数据从内存流到外面去。对于浏览网页来说,浏览器和新浪服务器之间至少需要建立两根水管,才可以既能发数据,又能收数据。
由于CPU和内存的速度远远高于外设的速度,所以,在IO编程中,就存在速度严重不匹配的问题。举个例子来说,比如要把100M的数据写入磁盘,CPU输出100M的数据只需要0.01秒,可是磁盘要接收这100M数据可能需要10秒,怎么办呢?有两种办法:
第一种是CPU等着,也就是程序暂停执行后续代码,等100M的数据在10秒后写入磁盘,再接着往下执行,这种模式称为同步IO;
另一种方法是CPU不等待,只是告诉磁盘,“您老慢慢写,不着急,我接着干别的事去了”,于是,后续代码可以立刻接着执行,这种模式称为异步IO。
同步和异步的区别就在于是否等待IO执行的结果。
使用异步IO来编写程序性能会远远高于同步IO,但是异步IO的缺点是编程模型复杂。想想看,你得知道什么时候通知你“汉堡做好了”,而通知你的方法也各不相同。如果是服务员跑过来找到你,这是回调模式,如果服务员发短信通知你,你就得不停地检查手机,这是轮询模式。
er图:
Entity 实体(具有属性Attribute ,Property
Relationship 关系
trun
utf-8 可以识别出有几个字节,变长度编码
MVT 3层结构思想
M=MODEL模型
V=VIEW 视图 程序的界面
C=CONTROL
链接池spooling 可以开启多个链接,保持链接,不用等待链接,可以快速用游标获取,