什么是数据库?
 数据–描述事物的符号
 –多种表现形式:文本,图形,音频,视频
 类型:(数据存储角度)字符数据,字节数据
 结构化的数据,和非结构化的数据。
 数据库:是存放数据的仓库。
 DBS数据库系统=DBMS+DBAS+DBA+最终用户【据库管理系统+数据库应用程序+数据库管理员+0】
 集群:mysql的mycat集群。
 mycat实际是数据库中间件,用mycat+多个mysql形成了个集群,写数据,会自动分配到mysql。
 数据库分为:关系型数据库:SQLite、MySQL(Maria DB)、SQL Server 、Oracle、DB2
 非关系型数据库:MongoDB、Redis
 对象关系型数据库:PostgreSQL
 数据库发展史:
 网状,层次,关系。
 数据库的分类:
 关系型数据库是目前主流数据库,采用关系(二维表)的方式存储,SQL标准结构化查询语作为server和client之前的沟通桥梁。非关系型数据库(not only sql):关系型数据库在大规模和高并发纯动态的web2.0面前显得力不从心,具有很大的缺点,not only sql 的出现就是为了解决大规模的数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
对象关系型数据库:是将编程中的面向对象和关系数据库结合起来,可以使数据库的设计、分析,最大程度贴近人们对客观世界的认知。
mysql简介:
 mysql是瑞典MySQL AB 公司创建的,现属oracle公司,主流,在WEB应用方面是最好的RDMS(关系数据库管理系统)应用软件。
MySQL是一种开源的关系型数据库管理系统
分为:社区办,企业版,体积小速度快总体拥有成本低。
MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL中的数据类型
 数据类型:是数据的一种属性,用于决定数据的存储格式代表了不同数据的信息类型。整型:tinyint(1个字节) -27~27-1 unsigned 28-1,smallint(2个字节)-215~2^15-1 unsigned 2^16-1,
 mediumint(3个字节) -223~223-1 unsigned 2^24-1,int(4个字节) -231~231-1 unsigned 2^32-1,
 bigint(8个字节) -263~263-1 unsigned 2^64-1
 浮点:float,double,real,decimal。
 格式 decimal(m,n) 整数位就是m-n位,小数位就是n位,不写的话根据计算机硬件自动,保留精度大概7位
 日期:year(1个字节),time(3个字节),date(3个字节),datetime(8),timestamp(4个字节)1980-2038范围
 字符串:char,varchar。
 文本:tinytext(28),text(216),mediumtext(224),longtext(232)
 二进制:tinyblob,blob,mediumblob,longblob,binary,varbinary,bit文件类别:
 bin可执行文件,
 data存储数据的文件,
 docs目录,文档
 include目录,存储包含的头文件
 lib目录,存储库文件
 share目录,错误消息和字符集文件
 my.ini 配置文件解决中文乱码:
 临时设置:
 1.set character_set_client=gbk;set character_set_results=gbk;
 2.set names gbk;
 永久性:[配置my.ini]
 [client]
 default-character-set=utf8
 port=3306[mysql]
	default-character-set=gbk


	[mysqld]
	port=3306
	character-set-server=utf8collation-server=utf8_general_ci
修改root密码
 1、进入到所安装的mysql目录的bin下打开cmd命令提示符
 2、输入mysqld --skip-grant-tables
 3、再次打开一个cmd命令提示符,之前的不要关(现在所做的还是bin下)输入mysql进入mysql
 4、进入mysql 库
 5、输入 update user set password=password(“密码”) where user=“root”;#password()这个函数是加密密码
 6、flush privileges刷新退出,重新开启ok
 bin 可执行文件,data 数据文件 docs 文档 include 头文件 lib 库文件 share 错误信息和字符串采集
 my.ini 配置文件允许远程连接:
 初始化安全设置:mysql_secure_installation
 grant all on . root@’%’ identified by ‘密码’source 文件路径 导入库数据
 登录客户端:
 net start mysql:启动 ;net stop mysql:关闭;开关服务
 mysql -u root -p,输入面登录:select version();查看当前版本
 select now();当前日期
 select users();当前用户
 \s 查看mysql状态
 \c 终止输入SQL语句:
 sql结构化查询语句,是一种特殊目的的编程语言,一种数据库查询和修改的程序设计语言。【SQL89,SQL92】
 分类DQL、DML、DDL、DCL、TCL
 sql语句格式:
 关键字与函数名称全部大写 
 数据库名称,表名称,字段名称全部小写
 SQL语句必须要";"结尾
 –DQL(数据查询语言)
 select–DML(数据操作语言)
 insert、update、delete–DDL(数据定义语言)
 create、alter、drop–DCL(数据控制语言)
 grant、revoke–TCL(事务控制语言)
 SAVEPOINT 、 ROLLBACK、SET TRANSACTION ,COMMIT
 数据库操作(ddl)
 创建数据库
 create database 数据库名 charset=utf8;删除数据库
 drop database 数据库名;切换数据库
 use 数据库名;查看当前选择的数据库
 select database();表操作(ddl)
 数据表(二维表)是数据库的重要组成部分,是其他对象的基础
 查看当前数据库中所有表
 show tables;创建表
 auto_increment表示自动增长
 create table 表名(列及类型);
 如:
 create table students(
 id int auto_increment primary key,
 sname varchar(10) not null
 );修改表
 alter table 表名 add|change|drop|modify 列名 类型;
 如:
 alter table students add birthday datetime;删除表
 drop table 表名;查看表结构
 desc 表名;更改表名称
 rename table 原表名 to 新表名;查看表的创建语句
 show create table ‘表名’;数据操作(DML ,DQL)
 查询
 select * from 表名增加
 全列插入:insert into 表名 values(…)
 缺省插入:insert into 表名(列1,…) values(值1,…)
 同时插入多条数据:insert into 表名 values(…),(…)…;
 或insert into 表名(列1,…) values(值1,…),(值1,…)…;主键列是自动增长,但是在全列插入时需要占位,通常使用0,插入成功后以实际数据为准
 修改
 update 表名 set 列1=值1,… where 条件删除
 delete from 表名 where 条件逻辑删除,本质就是修改操作update
 alter table students add isdelete bit default 0;
 如果需要删除则
 update students isdelete=1 where …;备份与恢复
 数据备份
 进入超级管理员
 sudo -s进入mysql库目录
 cd /var/lib/mysql运行mysqldump命令
 mysqldump –uroot –p 数据库名 > ~/Desktop/备份文件.sql;
 按提示输入mysql的密码数据恢复
 连接mysql,创建数据库
 退出连接,执行如下命令
 mysql -uroot –p 数据库名 < ~/Desktop/备份文件.sql
 根据提示输入mysql密码
 编码:
 字符--------(翻译过程)------->数字(01010111)
 这个翻译标准,称之为字符编码。-- ASCII美国信息交换标准代码 (一个字符占1字节)一个字节能表示所有的英文符号,却不能表示全世界所有的字符。
		-- GB2312( 1980年 )
		-- GBK( 1995年 )(一个字符2字节)
		-- GB18030 (2000年)
		-- Unicode万国码(一个字符2字节)   unicode:简单粗暴,所有字符都是2Bytes,对于纯英文来说,1T的硬盘,用ASCII比unicode存1倍的内容。
		-- UTF-8可变长编码(英文一个字符占1个,中国一个字符占3个)

		-- Python2 ASCII    python3 utf-8的字符集

		-- python2 和字符串相关的类型有 str(assii gbk utf-8)和unicode聚合函数:
 获取一共有多少数量
 select count(*) from 表名;
 语法:select count(1) from 表名;
 select count(字段) from获得该字段最大数
 select max(id) from 表名;获得该字段最小数
 select min(id) from 表名;获得该字段的总和
 select sum(id) from 表名;获得该字段的平均值
 select avg(id) from 表名select concat(字段,‘自定义’,字段) from 表名 字符串连接
select substring(str from pos for len)字符串截取(从1开始截)
 select substring(‘abcdef’,1,3) 结果 abc[oracle是必须加from,必须是完整的from,oracle 中有个虚表 daul]select trim('abcd ');
 ltrim 去掉左边的空格,rtrim去掉右边的空格,trim去掉所有空格select replace(‘abc123’,‘123’,‘def’)将123替换成def
select abs(-32)->32求绝对值
select round(1.5)->2 四舍五入。
 日期时间函数
 (datefrom(将一个时间转化成字符串的))
 用法:
 select date_format(current_date(),’%Y年%m月%d日’);
 获取子值,语法如下
 year(date)返回date的年份(范围在1000到9999)
 month(date)返回date中的月份数值
 day(date)返回date中的日期数值
 hour(time)返回time的小时数(范围是0到23)
 minute(time)返回time的分钟数(范围是0到59)
 second(time)返回time的秒数(范围是0到59)
 select year(‘2016-12-21’);日期计算,使用±运算符,数字后面的关键字为year、month、day、hour、minute、second
 select ‘2016-12-21’+interval 1 day;日期格式化date_format(date,format),format参数可用的值如下
 获取年%Y,返回4位的整数
 * 获取年%y,返回2位的整数
 * 获取月%m,值为1-12的整数
 获取日%d,返回整数
 * 获取时%H,值为0-23的整数
 * 获取时%h,值为1-12的整数
 * 获取分%i,值为0-59的整数
 * 获取秒%s,值为0-59的整数
 select date_format(‘2016-12-21’,’%Y %m %d’);当前日期current_date()
 select current_date();当前时间current_time()
 select current_time();当前日期时间now()
 select now();分组
 show engines查看所有引擎
 GROUP BY子句将表中数据分成若干小组
 语法:
 -select 字段 from 表名 where group by 字段 order by 字段;having过滤:
 和where类似对分组进行过滤,要使用having从句,支持where的所有操作,只能出现在group by 之后。表的约束:
 约束类型 说明
 primary key(主键约束) 要求主键列数据唯一,且不允许为空,主键可以包含表的一列或者多列,如果包含多列就需要在表级定义
 unsigned 非负数约束
 auto_increment(自增) 要求该列每次加一行数据就加1
 not null(非空) 某列内容不为空
 unique(唯一约束) 要就该列数据唯一
 check()(检查约束) 某列的取值范围、格式限制
 foreign key()(外键约束) 用于两表间建立关系或者一张中两个字段建立关系,需要指定引用主表的那列。外键通常用来约束两个表之间的数据关系,定义外键的那张表称为子表,另一张表称为主表。 在表的创建过程中,应该先创建主表,后创建子表。•主键约束
 –主键约束是数据库中最重要的一种约束。在关系中,主键值不可为空,也不允许出现重复,即关系要满足实体完整性规则。
 –
 –主键从功能上看相当于非空且唯一
 –一个表中只允许一个主键
 一个表可能是由两个或者两个以上的字段组成主键 – 联合主键。
 –主键是表中能够唯一确定一个行数据的字段
 –主键字段可以是单字段或者是多字段的组合•唯一性约束
 –唯一性约束条件确保所在的字段或者字段组合不出现重复值
 –唯一性约束条件的字段允许出现空值,且可以多个空值
 –Oracle将为唯一性约束条件创建对应的唯一性索引•非空约束
 –确保字段值不允许为空
 –只能在字段级定义•Check约束
 –Check约束用于对一个属性的值加以限制
 –在check中定义检查的条件表达式,数据需要符合设置的条件
 –在这种约束下,插入记录或修改记录时,系统要测试新的记录的值是否满足条件•外键约束
 –外键是表中的一个列,其值必须在另一表的主键或者唯一键中列出
 –作为主键的表称为“主表”,作为外键的关系称为“依赖表”
 –外键参照的是主表的主键或者唯一键
 –对于主表的删除和修改主键值的操作,会对依赖关系产生影响,以删除为例:当要删除主表的某个记录(即删除一个主键值,那么对依赖的影响可采取下列3种做法:
 RESTRICT方式:只有当依赖表中没有一个外键值与要删除的主表中主键值相对应时,才可执行删除操作。
 CASCADE方式:将依赖表中所有外键值与主表中要删除的主键值相对应的记录一起删除
 SET NULL方式:将依赖表中所有与主表中被删除的主键值相对应的外键值设为空值
 –FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO)
 –[ON DELETE [CASCADE|SET NULL]] 如省略on短语,缺省为第一中处理方式。•添加约束
 –ALTER TABLE 表名
 • ADD CONSTRAINT 约束名 约束类型 具体的约束说明
 •
 •删除约束
 –ALTER TABLE 表名
 • DROP FOREIGN KEY 约束名
 •
 •可增加或删除约束,但不能直接修改
 可以用 alter table 表名 modify 列名 类型 约束 【这个方法虽然可以修改但是他重写了】索引和视图
 索引索引就是建立类似目录的数据库对象,实现数据快速查询。
作用:加速对表的查询,通过使用快速路径(二叉树)访问方法快速定位数据,减少了磁盘的i/o
注:建立时会使用索引名,之后除销毁不会再使用,因为他会自动起作用
索引分类:自动创建:主键和唯一约束,都会自动创建一个索引
 手动创建:当然也可以手动创建索引虽然会增加查找的速度,但不宜过多的使用,它会影响增删改的速度,因为他就好像字典中的目录一样,会占用内存,且在增删改操作时会对索引产生影响(变动)。
用法:
 create index 索引名 on 表名(字段,…);为这个字段加一个索引
 drop index 索引名; 删除索引注:1.要占用大量的存储空间
 2.提高了查询的速度,但降低了增删改的性能
 3.限制表中的索引数目
 4.并非数据都适合索引
 5.索引用于数据过滤和数据的排序
 6.可以在索引中定义多个列视图
是从若干基本表或从其他视图构造出来的虚表
作用:可以限制对数据的访问(隐藏数据),简化查询语句,提供了数据的不同显示
创建视图
 create view 视图名 as 查询语句;删除视图
 drop view 视图名;-总结
 –他可以使用表的所有语句
 –视图不存储任何数据
 –视图可与基于表的一行一列也可以基于多行多列也可以基于一张、多张表,甚至基于其他视图
 –提高了数据的安全性只显示指定的行列数据
 –使用视图可以降低查询的难度,定制数据显示
 –他的所有数据操作,都在创建它的表内操作
 –可以使用 with red only 创建只读视图事务(Transaction)
 是操作序列,是一个不可分割的工作单位。
 当一个业务逻辑需要多个sql完成时,如果其中某条sql语句出错,则希望整个操作都退回
 使用事务可以完成退回的功能,保证业务逻辑的正确性•事务是为了保证数据库的完整性
事务语句:
 begin;开启
 commit;提交
 rollback;回滚•提交或回滚前数据的状态
 –以前的数据可恢复
 –当前的用户可以看到DML操作的结果
 –其他用户不能看到DML操作的结果
 –被操作的数据被锁住,其他用户不能修改这些数据
 •提交后数据的状态
 –数据的修改被永久写在数据库中.
 –数据以前的状态永久性丢失.
 –所有的用户都能看到操作后的结果.
 –记录锁被释放,其他用户可操作这些记录.
 •回滚后数据的状态
 –语句将放弃所有的数据修改
 •修改的数据被回退.
 •恢复数据以前的状态.
 •行级锁被释放.表的关系
 总体来说有三类:一对一,一对多,多对多,但关系型数据库没有直接表示多对多的关系,而是将多对多拆分成两个一对多的关系。
 如下图:学生和成绩是一对多的关系,而科目与成绩也是一对多的关系形成了学生和科目是多对多的关系
 下面建表
 – 建立学生表
 create table t_student(
 id int primary key,
 name varchar(20),
 age int
 );– 建立成绩表
 create table t_subject(
 id int primary key,
 stitle varchar(20)
 );– 建立成绩表
 create table t_score(
 id int primary key,
 stu_id int,
 sub_id int,
 score int,
 foreign key(stu_id) references t_student(id),
 foreign key(sub_id) references t_subject(id)
 );– 学生和成绩之间一对多的关系,
 – 科目和成绩一对多的关系
 – 学生和科目就是一对多的关系 因为一个学生可一有多门课程,而一门课程可以有多个学生身份证和人表:
 one
 – 建立身份证和人(一对一方法)create database relation charset=utf8;
 use relation;– 人
 create table t_person2(
 id int primary key,-- 人的ID
 name varchar(20),
 age int
 );– 身份证表
 – 子表外键要和父表主键相关联
 create table t_idcard2(
 card_num varchar(19) primary key,
 create_date date,
 p_id int unique,-- 创建一个外键ID要唯一约束因为是一对一的关系
 foreign key(p_id) references t_person(id) – 用外键和人的ID相关联 外键唯一,主键唯一达到一对一的关系
 );tow
 – 第二种一对一方法
 – 人
 create table t_person2(
 id int primary key,-- 人的ID
 name varchar(20),
 age int
 );– 身份证表
 – 子表外键要和父表主键相关联
 create table t_idcard2(
 id int primary key,-- 身份证的ID
 card_num varchar(19) unique,
 create_date date,
 foreign key(id) references t_person2(id) – 身份证的ID和人的ID关联 都是唯一达到唯一约束
 );– 一对一的关联关系,只需要想办法让外键字段同时有唯一约束。外键字段在任意的表中。
– 一对多 关联关系,只需要在多的那张表中增加一个外键字段
– 多对多关系 需要找一个中间表转化成两个多对一的关系。
– 大学环境:班主任,任课老师,班级,学生,宿舍,电表。 习题
-总结:当外键有唯一约束时,是一对一,没有唯一约束,是一对多或者多对一
表连接和子查询
 内连接语法
 select * from 表1 inner join 表二 on 连接条件;
 select * from 表1,表二 where 连接条件;
 注:非外键约束使用第二种连接方法
 外连接: 就是将连接条件之外的也返回
 左外连接:select * from 表1 left join 表二 on 连接条件; 返回除了左表中连接条件之外的数据
 右外连接:select * from 表1 right join 表二 on 连接条件; 返回除了右表中连接条件之外的数据
 全外连接:select * from 表1 full join 表二 on 连接条件; 返回除了全部表中连接条件之外的数据
 注:连接条件 on 后面也可以跟where子查询
 –语法格式:
 •select 字段列表 from table
 where 表达式 operator (select 字段列表 from table);–特点
 •子查询在主查询前执行一次
 •主查询使用子查询的结果单行子查询
单行子查询只返回一行记录
 对单行子查询可使用单行记录比较运算符
 < 、 > 、 = 、 >=、 <= 、 <>、!=•举例:
 –select * from emp
 –where sal > (select sal from emp where empno = 7566);•思考:查询工资最高的雇员名字和工资。
多行子查询
–多行子查询返回多行记录
 –对多行子查询只能使用多行记录比较运算符
 ALL 和子查询返回的所有值比较
 ANY 和子查询返回的任意一个值比较
 IN 等于列表中的任何一个
 面试真题:delete from a where id not in (select c.id from (select * from a) as c group by c.snum,c.name,c.cc,c.cname,c.score);
 数据库设计
 三范式:(数据库设计一般要遵守3范式,但不是必须要遵守)-- 第一范式(1NF):  强调的是列的原子性,即列不能够再分成其他几列。
        (姓名,性别,电话)
        (姓名,性别,家庭电话,公司电话)


    -- 第二范式(2NF):  首先是 1NF,另外包含两部分内容,一是表必须
                    -- 有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能
                    -- 只依赖于主键的一部分。
        【OrderDetail】(OrderID,ProductID,UnitPrice,Discount,Quantity,ProductName)

        【OrderDetail】(OrderID,ProductID,Discount,Quantity)
        【Product】(ProductID,UnitPrice,ProductName)


    -- 第三范式(3NF):  首先是 2NF,另外非主键列必须直接依赖于主 
                    -- 键,不能存在传递依赖。即不能存在:非主键列A依赖于非主键列B,
                    -- 非主键列B依赖于主键的情况。
        【Order】(OrderID,OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity)   
        
        【Order】(OrderID,OrderDate,CustomerID)
        【Customer】(CustomerID,CustomerName,CustomerAddr,CustomerCity)


	看看别人家设计的规范:
    -- 58到家数据库30条军规解读
    https://mp.weixin.qq.com/s/Yjh_fPgrjuhhOZyVtRQ-SA