数据库

1, 数据库的安装和配置

1.1 数据库的概念

数据库的定义: 了解

1, DatabaseA database is an organized collection of data,stored and accessed electronically.

2, 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。

3, 数据库(Database)是一种结构化信息或数据的有组织的集合。

4, 在现实中,数据以及[数据库管理系统 (DBMS)](Database Management System) 一起被称为数据库系统,通常简称为数据库。

数据库的历史: 了解

自 20 世纪 60 年代初诞生至今,数据库已经发生了翻天覆地的变化。最初,人们使用分层数据库(树形模型/一对多)和网络数据库(图模型/多对多)这样的导航数据库来存储和操作数据。这些早期系统是很简单的,同时也缺乏灵活性。

20 世纪 80 年代,关系数据库开始兴起.

20 世纪 90 年代,面向对象的数据库开始成为主流。

最近,随着互联网的快速发展,为了更快速地处理非结构化数据,NoSQL 数据库应运而生。

1.2 数据库的分类

数据库分类

注: 数据库热度 数据库市场份额

  • 关系型数据库:关系数据库在 20 世纪 80 年代成为主流。关系数据库中的数据项被组织为一系列具有列和行的表。关系数据库为访问结构化信息提供了有效和灵活的方法.

  • 非关系型数据库:又被称为NoSQL数据库,它支持存储和操作非结构化半结构化数据。而且随着 Web 应用的日益普及和复杂化,NoSQL 数据库得到了越来越广泛的应用.

  • 等...

注: 区别 注意

SQL标准/SQL语言: 1986年定义了一个SQL标准: SQL标准语言 (SQL语言操作数据, 是以数据和数据之前的关系去操作数据的)

SQL语句: select * from user; 从user表中查出所有信息

关系型数据库和非关系型数据库, 虽然区别很多, 但是最本质的区别是: 关系型数据库以数据和数据之间存在的关系维护数据, 而非关系型数据库是指存储数据的时候数据和数据之前没有什么特定关系.

大家要注意的是, 虽然数据库有种类的区别,但是这是一个无关孰优孰劣的问题(没有谁好谁差之分),主要取决于企业希望如何使用数据.从本质上讲, 他们都是用来存储数据的. (而对于我们一个Java后端开发来讲, 我们在实际工作中基本上是以关系型数据库为主, 非关系型数据库为辅的用法)

注: 关于NoSQL的SQL解释

SQL:结构化查询语言(Structured Query Language)简称SQL,是一种专门用来和数据库通信的标准语言,用于向数据库存取数据以及查询、更新和管理关系数据库系统. 每个关系型数据库都支持SQL语言/SQL标准.

一些数据库: 了解

MySQL

是一个由瑞典MySQLAB公司开发,属于Oracle旗下产品。MySQL是最流行的关系型数据库管理系统之一

Oracle

又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小微机环境。它是一种高效率的、可靠性好的、适应高吞吐量的数据库方案.

SQLServer

SQLServer是由微软公司开发的一种关系型据库管理系统,它已广泛用于电子商务、银行、保险、电力等行业。SQLServer提供了对XML和Internet标准的支持,具有强大的、灵活的、基于Web的应用程序管理功能。而且界面友好、易于操作,深受广大用户的喜爱,但它只能在Windows平台上运行(2017年开始支持Linux系统),并对操作系统的稳定性要求较高,因此很难处理日益增长的用户数量。

DB2数据库

DB2数据库是由IBM公司研制的一种关系型数据库管理系统,主要应用于OS/2、Windows等平台下,具有较好的可伸缩性,可支持从大型计算机到单用户环境。

DB2支持标准的SQL,并且提供了高层次的数据利用性、完整性、安全性和可恢复性,以及从小规模到大规模应用程序的执行能力,适合于海量数据的存储,但相对于其他数据库管理系统而言,DB2的操作比较复杂。

MariaDB

MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。在存储引擎方面,使用XtraDB来代替MySQL的InnoDB。 MariaDB由MySQL的创始人Michael Widenius主导开发,他早前曾以10亿美元的价格,将自己创建的公司MySQL AB卖给了SUN,此后,随着SUN被甲骨文收购,MySQL的所有权也落入Oracle的手中。MariaDB名称来自Michael Widenius的女儿Maria的名字。

MariaDB基于事务的Maria存储引擎,替换了MySQLMyISAM存储引擎,它使用了Percona的 XtraDB,InnoDB的变体,分支的开发者希望提供访问即将到来的MySQL 5.4 InnoDB性能。这个版本还包括了 PrimeBase XT (PBXT) 和 FederatedX存储引擎

PostgreSQL

是以加州大学伯克利分校计算机系开发的 Postgres 版本 4.2 为基础的对象关系型数据库管理系统(ORDBMS)。和MySQL一样是开源数据库。POSTGRES 领先的许多概念只是在非常迟的时候才出现在商业数据库中。

MongoDB数据库

MongoDB是由10gen公司开发的一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似JSON的bjson格式,因此可以存储比较复杂的数据类型。

Mongo数据库管理系统最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。不仅如此,它还是一个开源数据库,并且具有高性能、易部署、易使用、存储数据非常方便等特点。对于大数据量、高并发、弱事务的互联网应用,MongoDB完全可以满足Web2.0和移动互联网的数据存储需求。

Redis

Remote Dictionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。 Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。

1.3 数据库的安装

1.数据库安装

安装数据库: 安装的是一个具有监听端口/分析SQL语句/存储数据/组织数据/响应数据为一体的数据库服务器

2.客户端连接数据库

3.Navicat连接数据库

1.4 数据库构成

客户端和服务器

在互联网的网络交互和数据访问中,一般常见两种网络架构模式: B/S结构或者C/S结构.

B/S: Browser-Server即浏览器和服务器, 即通过浏览器和服务器发起网络交互的数据请求.

C/S: Client-Server即客户端和服务器, 即通过客户端和服务器发起网络交互的数据请求.

而我们上面安装的Navicat以及MySQL, 这两者的关系是一个标准的C/S结构.

 

MySQL的内部数据组织方式

在MySQL中, 我们对数据的组织逻辑上是按照//数据 这种三级结构组织的.

数据库: 表示一份完整的数据仓库, 在这个数据仓库中分为多张不同的表.

表: 表示某种特定类型数据的的结构化清单, 里面包含多条数据.

数据: 表中数据的基本单元.

2, SQL语法

2.1 SQL语言

SQL语言

SQL:结构化查询语言(Structured Query Language)简称SQL,是一种专门用来和关系型数据库通信的标准语言,用于向数据库存取数据以及查询、更新和管理关系数据库系统

与其他语言(Java, C++...)不同的是, SQL由很少的词构成, 这是希望从数据库读写数据时能以更简单有效的方法进行.

SQL有如下优点

SQL语言不是某个特定的数据库提供的语言, 它是一种数据库标准语言.(最初由美国国家标准局 ANSI于1986年完成第一版SQL标准的定义,即SQL-86).这也就意味着每个关系型数据库都支持SQL语言.

SQL简单易学, 是由多个描述性很强的单词构成, 并且这些单词数量不多.

SQL尽管看上去很简单, 但是非常强有力; 灵活的使用SQL, 可以进行比较复杂的和高级的数据库操作.

SQL不区分大小写(除非在某些数据库使用的时候做了特殊设置-不建议这种行为).

2.2 SQL的基本操作

2.2.1 登录数据库

mysql -u root -p [回车]

输入密码

注1 : 注释

注意:

在数据库语句中如果我们需要注释某些内容, 一般有三种方式

-- 注释符(要注意的是--之后要有一个空格再接着书写注释内容)

# 注释符 (之后不需要空格)

/* */ 注释符 (一般用于多行注释)

注2: 分号

SQL语句应该要以分号作为结束

2.2.2 库操作

查看数据库

show databases; # 查看所有数据库

show databases like '%数据库名%'; # 查看和期望命名相匹配的数据库

show create database 数据库名; # 查看数据库创建信息

注: 了解(不需要专门记忆)

  • information_schema:主要存储了系统中的一些数据库对象信息,比如用户表信息、列信息、权限信息、字符集信息和分区信息等。

  • mysql:MySQL 的核心数据库,主要负责存储数据库用户、用户访问权限等 MySQL 自己需要使用的控制和管理信息。常用的比如在 mysql 数据库的 user 表中修改 root 用户密码。

    update mysql.user set authentication_string=password('123456') where user='root';

    flush privileges;

  • performance_schema:主要用于收集数据库服务器性能参数

  • sys:sys 数据库主要提供了一些视图,数据都来自于 performation_schema,主要是让开发者和使用者更方便地查看性能问题。

创建数据库

  • [ ] 可选。

  • <数据库名>:创建数据库的名称。

  • IF NOT EXISTS:在创建数据库之前进行判断,只有该数据库目前尚不存在时才能执行操作; 如果这个数据库存在, 就不创建/不执行这个sql。

  • [DEFAULT] CHARACTER SET:指定数据库的字符集。

  • [DEFAULT] COLLATE:指定字符集的默认校对规则。

注:一些注意事项

  • 注意我们MySQL创建数据库的时候, 如果没有指明编码格式, 那么创建出了数据库在存储字符串的时候, 很多系统默认使用latin1的编码格式 (latin1存储一个字符的时候一个字符占用1个字节, 并且不能存储中文, 中文没有办法用一个字节表示: 所以在实际工作的时候, 我们更应该使用utf8 or utf8mb4)

  • MySQL中字符集: UTF8 和UTF8MB4的区别

  • MySQL中几个了解的校对规则: 了解(不用记具体的排序规则, 只需要知道排序规则是干什么,是对谁起效果的)

删除数据库

在工作中不要删除数据库, 哪怕这个数据库已经没有任何用处了 ( 任何数据都是有价值的, 哪怕是错的数据)

修改数据库

在工作中不要修改数据库, 因为没有任何意义

数据库中只提供了对数据库使用的字符集和校对规则修改操作。

选择数据库

一个MySQL系统中, 管理多个数据库。 我们只有进入对应的数据库中, 才能进一步操作数据库中的表和数据。

2.2.3 表操作

常见的数据类型

数据类型(DATA_TYPE)是指数据库所允许的数据的类型。

MySQL是一个数据存储容器, 数据类型定义了可以存储什么类型数据的规则。

数据库是由多张表构成。其中每个表中对应的数据列, 都应该有适当的数据类型,用于限制或允许该列中存储的数据。

(1) 整数
MySQL的整数类型占用字节有符号无符号说明
TINYINT(M)1-128 ~ 1270 ~ 255很小的整数
INT/INTEGER(M)4-231 ~ 231-10 ~ 232-1普通整数
BIGINT(M)8-263 ~ 263-10 ~ 264-1大整数

注意1:

INT和INTEGER在MySQL中并无区别, 仅是缩略写法.link

注意2: 关于整数设置'长度/宽度'问题。

第一原则:无论给整数设置什么长度都不违背上述'有/无符号'表示的存储范围(上述范围表示是一切基本标准)。

第二原则: 设置长度之后, 如果存储的整数长度小于指定长度, 会默认在数字位前自动补空格, 以满足指定长度(但是补的空格这是不可见的), 也可以选择经过设置使用0填充; 设置长度之后, 如果存储的整数长度大于指定长度, 如果在表示范围内, 不做切割/不做处理(不补0, 也不补空格), 直接存储。

(2) 浮点数
MySQL的浮点数占用字节说明
FLOAT(M, D)4单精度
DOUBLE(M, D)8双精度
  • M: 精度, 表示总数据位数。 取值范围为(1~255)。

  • D: 标度, 表示小数位的位数。 取值范围为(1~30,且不能大于 M-2)。

  • 需要注意的是: int类型设置宽度只是要不要填充空格和0的问题, 在float double中这个设置参数超过总位数会报错, 超过小数位限制舍弃

  • FLOAT 和 DOUBLE 在不指定精度时,默认会按照实际的精度(由计算机硬件和操作系统决定)。

(3) 日期
MySQL日期字节日期格式表示范围
YEAR1YYYY1901 ~ 2155
TIME3HH:MM:SS-838:59:59 ~ 838:59:59
DATE3YYYY-MM-DD1000-01-01 ~ 9999-12-31
DATETIME8YYYY-MM-DD HH:MM:SS1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
TIMESTAMP4YYYY-MM-DD HH:MM:SS1970-01-01 00:00:01 ~ 2038-01-19 03:14:07
  • year/YEAR范围: 1901~ 2155包含255个年份, 对应一个字节表示范围。

  • time/TIME范围: 11111111111111111111111(23位剩余一位符号位)--> 8388607(十进制)

8388607: 838(小时位) xx(描述分钟) xx(描述秒)。 (计算方式不用记)

  • timestamp/TIMESTAMP范围: (时间戳) (一般用于一些计时, 倒计时, 数据传输 ......) (秒数1)

1970年1月1日作为UNIX TIME的纪元时间(开始时间)。

(4) 字符串
MySQL字符串内存占用说明
CHAR(M)(M * 单个字符占用字节)固定长度字符串
VARCHAR(M)L+1字节 or L+2字节 。变长字符串
TEXT(M)L+2字节 。 L: 0~216变长文本字符串
LONGTEXT(M)L+4字节 。 L: 0~232变长大文本字符串

L: 存储字符的实际长度。

M: 列的指定长度。

  • CHAR (M不设置默认为1) 范围可以设置最大255 。

  • VARCHAR(M不设置会报错) 最大长度为 65,535字节

  • TEXT 最大长度为 65535字符

  • LONGTEXT 最大长度长度为 4294967295 字符。

1, 数据库中的char可以正常存储字符串: eg: "zs", "我爱学习" ....; (但是一般我们用到的char的时候, 更多是为了存储类似性别这种具有固定长度和格式的短字符串)

2, 创建表的时候, 如果使用char类型, 不加宽度/长度, 长度默认为1; 如果使用varchar不加长度/宽度, 创建的时候会报错, text/longtext同样建议指明长度(有些版本中不指明会报错)

3, 在数据库中, 只要是字符串, 都有长度限制, 在字符串列存储数据的时候, 不能超出既定的长度限制 (字符串的长度限制是一个严格限定).

4, 如果使用char类型(定长字符串), 它是一个固定长度字符串: 如果我们常见char的时候指明的宽度为m, 每一个这个char列的数据, 最终开辟的内存空间为: 单个字符占用空间 * M; 和实际存储了几个字符无关

5, 我们使用varchar这种变长字符串存储数据的的时候, 字符串实际占用的内存空间和我们给varchar设置的宽度/长度没有任何关系, 只和这个varchar列实际存储的字符个数有关.

查看表

创建表

主键和自增问题

主键(PRIMARY KEY)又被称为''主键约束'',是 MySQL中使用非常频繁的约束。它有诸多作用(唯一标识, 查找效率...)。

注意1:

主键分类:

注意2: 唯一键: 仅了解

注意3: 自增问题 AUTO_INCREMENT

修改表

表的修改操作:不允许在工作直接修改表

删除表

不允许在工作直接删除表

更不建议: 任何数据都是有意义的

2.2.4 数据操作

添加数据

  • 如果values中包含数据和表列数据一一对应(无省略), 那么在插入语句中可以省略表名之后表列的一一列举。eg: insert into 表名 values (值1, … 值n);

  • values中的内容应该要与对应插入字段对应。

  • 数据中字符串和日期应该包含在引号中。

查询数据

  • 查询的结果是一个新的临时表。

  • 在MySQL中 select * from 表名 where 1; 表示查询所有数据。

修改数据

  • 注意如果没有where子句指明条件, 那么修改就是对所有行的修改。

  • 修改一行数据的多个列值时,SET 子句的每个值用逗号分开即可。

删除数据

在工作中删除数据, 一般是逻辑删除

  • 如果没有where以及条件, 默认删除是表中所有数据。

  • delete不能单独只删除某一列数据, delete删除数据的最小单元为行。

  • delete语句仅删除数据记录, 删除的不是表, 如果要删除表需要使用drop table语句。

2.3 特殊关键字

数据基础

2.3.1 Where

使用 WHERE 关键字并指定查询/删除/修改的条件, 让操作在满足条件的情况下执行 数据操作.

在构建Where的条件的过程中, 我们可能需要了解到一些重要的SQL运算符

1, 算术运算符: 可以用在条件中, 也可以用在结果集中

运算符作用
+
-
*
/
%取余

2, 比较和逻辑运算符

运算符作用运算符作用
=等于<=>等于(可比较null)
!=不等于<>不等于
<小于>大于
<=小于等于>=大于等于
is null是否为nullis not null是否不为null
between and在闭区间内in是否在列表内
not in不在列表内like通配符匹配(%:通配, _占位)
and&&
or||

2.3.2 Distinct

使用DISTINCT对数据表中一个或多个字段重复的数据进行过滤,重复的数据只返回其一条数据给用户.

注意:

2.3.3 Limit

使用LIMIT对数据表查询结果集大小进行限定.

LIMIT 记录数目: 从第一条开始, 限定记录数目

LIMIT 初始位置,记录数目: 从起始位置开始, 限定记录数目

LIMIT 记录数目 OFFSET 初始位置: 从起始位置开始, 限定记录数目

注意: 数据(默认下标从0开始)

2.3.4 As

AS 关键字用来为表和字段指定别名.

2.3.5 Order By

ORDER BY对查询数据结果集进行排序.

不加排序模式: 升序排序.

ASC: 升序排序.

DESC: 降序排序.

注意: 如上查询, 当我们进行多字段排序的时候, 会先满足第一个列的排序要求, 如果第一列一致的话, 再按照第二列进行排序, 以此类推.

2.3.6 Group By

使用 GROUP BY 关键字,对数据进行分组

GROUP_CONCAT()函数会把每个分组的字段值都显示出来.

HAVING 可以让我们对分组后的各组数据过滤。(一般和分组+聚合函数配合使用)

2.3.7 聚合函数

聚合函数一般用来计算列相关的指定值. 通常分组一起使用

函数作用函数作用
COUNT计数SUM
AVG平均值MAX最大值
MIN最小值  

2.4 SQL执行顺序

  • 小括号中的数字代表执行顺序

  • having和select的执行顺序收到优化器的影响,可能会改变执行顺序

2.5 数据完整性

为了在实际工程环境中更好的使用和维护数据库数据, 在我们设计和使用数据库的库/表/数据的时候, 一般要遵循数据完整性规则; 数据完整保证在数据库设计数据存储过程中, 对数据的存储/处理是做到尽可能正确; 做到降低用户在实际使用的时候出错的可能性, 尽可能提高数据库的使用效率.

ps: 所谓数据完整性: 是在数据库中表和数据的设计的时候定制的一些约定俗成的参考规范. 是站在组织数据的角度, 目的是希望在数据库中数据存储更规整,以及希望操作数据的时候效率更高

数据完整性又包含: 实体完整性; 域完整性; 参照完整性

2.5.1 实体完整性

保证中的每一行数据都是中唯一的实体.(即:一个表中每一条数据都应该是唯一的)

实体完整性是为了保证表中数据唯一, 实体完全可由主键实现(通过一个主键的设置, 保证一个表中每一条信息都是唯一的).

2.5.2 域完整性

域完整性表示保证表中数据的字段取值有效范围之内或者符合特定的数据类型约束

1, 含义: 某一列的数据存储的类型要设计合适 (float, varchar,NULL, NOT NULL...)

2, 在某一列存储数据的时候, 存储的数据的内容, 应该要符合对这个列的类型以及大小限定

2.5.3 参照完整性

参照完整性用于确保相关联的表间的数据应该要保持一致.

避免因为一个表的数据/记录修改, 造成另一个表的内容变为无效的值. 一般来讲, 参照完整性是通过外键和主键来维护的.

外键是参照完整性的一种强有力的维护手段.

参照完整性 != 外键

主键的设置和取消: (了解)

外键优缺点: 重要

在公司中是否使用外键呢: 重要

3, SQL和多表问题

数据基础

3.1 多表设计/多表理论

3.1.1 一对一

指两个表(或多个表之间)的数据存在一一对应的关系。

3.1.2 一对多

指两个表(或多个表之间)的数据,存在表A中的一条数据对应表B中的多条数据,表B中的一条数据对应表A中的一条数据.

3.1.3 多对多

存在两个表表A和表B,存在表A中的一条数据对应表B中的多条数据,表B中的一条数据对应表A中的多条数据。

3.1.4 数据库设计范式

面试有可能问道

和数据完整性不同: 数据库的设计范式更偏向于表设计的维度来看待数据的存储. 其存在的目的也是为了, 在维护或者操作数据库中数据: 1, 希望在数据库中数据存储更规整 2, 希望操作数据的时候效率更高

第一范式: 原子性

在设计表的时候, 应该每列保持原子性。 如果数据库中的所有字段都是不可分割的原子值,则说明该数据库满足第一范式,比如:地址。

第一范式:我们在设计表的时候,应该考虑之后业务的变化,来尽量让每一列的数据保持原子性。

第二范式: 唯一性

数据的唯一性。 要求表中数据有唯一标识,不存在部分依赖

eg: 通过主键来唯一标识一个用户(满足唯一性)

注意: 通过name+nickname+province+city+county组合标识一个用户(不满足唯一性)

第三范式: 不冗余

字段不要冗余。(消除表中非主键字段间的依赖: 即:要求每个非主键字段只依赖于主键,而不依赖于其他非主键字段)

如: 如下昵称

students表中存储了昵称

students_detail表中也存储了昵称

3.2 多表查询

查询的结果是一个新的临时表。

数据基础

3.2.1 链接/连接查询

交叉链接

交叉连接其实就是求多个表的笛卡尔积

交叉连接的结果没有太多实际的使用意义。

自然连接

自然连接: 没什么用

内连接

内连接: 比较常用

外连接: 左右外连接

外连接

注: 主副表的问题

假设A和B表进行连接,AB两张表一个表示主表,另一个是副表; 查询数据的时候, 以主表中的数据为基准,匹配副表对应的数据; 当副表中的数据没有能和主表对应数据相互匹配的数据,副表匹配位置自动填充null。

自连接

自连接

3.2.2 子查询

子查询也叫嵌套查询.( 在某个操作中(删除/修改/查找), 用到了另外一个查询的结果. )

是指在WHERE子句或FROM子句中又嵌入SELECT查询语句.

3.2.3 联合查询

联合查询合并两条查询语句的查询结果.

联合查询去掉两条查询语句中的重复数据行,然后返合并后没有重复数据行的查询结果。

 

4, 数据库备份和恢复

4.1 命令行操

通过命令行操作

备份:

恢复:

4.2 图形化界面

以Navicat为例

备份:

导入:

 

5, 上课sql

7月2号的sql

 

7月3号是sql