1 数据库概述
1.1 为什么要使用数据库
- 持久化:把数据保存到可掉电式存储设备中以供之后使用。数据持久化意味着将内存中的数据保存到硬盘加以 “固化” 。
- 持久化的主要作用是将内存中的数据存储在关系型数据库中,当然也可以存储在磁盘文件、XML数据文件中
1.2 数据库与数据库管理系统
1.2.1 数据库的相关概念
DB:数据库(Database) |
---|
即存储数据的 “仓库” ,其本质是一个文件系统。它保存了一系列有组织的数据 |
DBMS:数据库管理系统(Database Management System) |
是一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制。用户通过数据库管理系统访问数据库中表内的数据 |
SQL:结构化查询语言(Structured Query Language) |
专门用来与数据库通信的语言 |
1.2.2 数据库与数据库管理系统的关系
总结:一个管理系统里面可以管理多个库,在一个库里面可以创建多个表,在表里可以保存实体信息
1.2.3 常见的数据库管理系统排名(DBMS)
目前互联网上常见的数据库管理软件有Oracle、MySQL、MS SQL Server、DB2、PostgreSQL、Access、Sybase、Informix这几种。
1.2.4 为什么选择MySQL
- 开发源代码,使用成本低。
- 性能卓越,服务稳定
- 软件体积小,使用简单,并且易于维护
- 历史悠久,社区用户非常活跃,遇到问题可以寻求帮助
- 许多互联网公司在用,经历了时间的验证
1.2.5 Oracle VS MySQL
Oracle 更适合大型跨国企业的使用,因为他们对费用不敏感,但是对性能要求以及安全性有更高的要求。
MySQL 由于体积小、速度快、总体拥有成本低,可处理上千万条记录的大型数据库,尤其是开放源码这一特点,使得很多互联网公司、中小型网站选择了MySQL作为网站数据库。
1.3 RDBMS 与 非RDBMS
从排名中我们可以知道,关系型数据库绝对是 DBMS 的主流,其中使用最多的 DBMS 分别是Oracle、MySQL 和 SQL Server。这些都是关系型数据库(RDBMS)。
###! 3.1 关系型数据库(RDBMS)
1.3.1.1 实质
- 这些类型的数据库是最古老的数据库类型,关系型数据库模型是把复杂的数据结构归结为简单的二元关系(即二维表格形式)。
- 关系型数据库以行(row)和列(column)的形式存储数据,以便用户理解。这一系列的行和列被称为表(table),一组表组成了一个库(database)。
- 表与表之间的数据有关系(relationship)。现实世界中的各个实体以及实体之间的各种联系均用关系模型来表示。关系型数据库,就是建立在关系模型基础上的数据库。
- SQL 就是关系型数据库的查询语言
1.3.1.2 优势
- 复杂查询
可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询 - 事务支持
使得对于安全性能很高的数据访问要求得以实现
1.3.2 非关系型数据库(非RDBMS)
1.3.2.1 介绍
非关系型数据库,可以看成传统关系型数据库的功能阉割版本,基于键值对存储数据,不需要经过SQL层的解析,性能非常高。同时,通过监视不常用的功能,进一步提高性能。
目前基本上大部分主流的非关系型数据库都是免费的。
1.3.2.2 有哪些非关系型数据库
相比于SQL,NoSQL 泛指非关系型数据库,包括了榜单上的键值型数据库、文档型数据库。搜索引擎和列存储等,除此以外还包括图形数据库。也只有NoSQL 一词才能将这些技术囊括进来
1.4 关系型数据库设计规则
- 关系型数据库的典型数据结构就是数据表,这些数据表的组成都是结构化的(Structured)。
- 将数据放到表中,表再放到库中。
- 一个数据库中可以有多个表,每个表都有一个名字,用来标识自己。表名具有唯一性。
- 表具有一些特性,这些特性定义了数据在表中如何存储,类型Java 和 Python 中 “类”
的设计。
1.4.1 表、记录、字段
- E-R(entity-relationship,实体-联系)模型中有三个主要概念是:实体集、属性、联系集。
- 一个实体集(class)对应于数据库中的一个表(table),一个实体(instance)则对应于数据库表中的一行(row),也称为一条记录(record)。一个属性(attribute)对应于数据库表中的一列(column),也称为一个字段(field)。
ORM思想(Object Relational Mapping)体现:
数据库中的一个表 <----->Java 或 Python 中的一个类
表中的一条数据 <----->类中的一个对象(或实体)
表中的一个列<----->类中的一个字段、属性(field)
1.4.2 表的关联关系
- 表与表之间的数据记录有关系(relationship)。现实世界中的各个实体以及实体之间的各种联系均用关系模型来表示。
- 四种:一对一关联、一对多关联、多对多关联、自我引用
1.4.2.1 一对一关联(one-to-one)
- 在实际的开发中应用不多,因为一对一可以创建成一张表。
- 举例:设计学生表:学号、姓名、手机号码、班级、级别、身份证号码、家庭住址、籍贯、紧急联系人、…
- 拆为两个表:两个表的记录是一一对应关系
- 基础信息表(常用信息):学号、姓名、手机号码、班级、级别
- 档案信息表(不常用信息):学号、身份证号码、家庭住址、籍贯、紧急联系人、…
- 两种建表原则:
- 外键唯一:主表的主键和从表文档外键(唯一),形成主外键关系,外键唯一。
- 外键是主键:主表的主键和从表的主键,形成主外键关系
1.4.2.2 一对多关系(one-to-many)
- 常见实例场景:客户表和订单表,分类表和商品表,部门表和员工表
- 举例:
- 员工表:编号、姓名、…、所属部门
- 部门表:编号、名称、简介
- 一对多原则:在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键
1.4.3.3 多对多(many-to-many)
要表示多对多关系,必须创建第三个表,该表通称为联接表,它将多对多关系划分为两个一对多关系。将这两个表的主键都插入第三个表中。
- 举例
- 产品表:"产品"表中的每条记录表示一个产品
- 订单表:"订单"表中的每条记录表示一个订单
- 订单明细表:每个产品可以与 “订单” 表中的多条记录对应,即出现在多个订单中。一个订单可以与 “产品” 表中的多条记录对应,即包含多个产品
1.4.3.4 自我引用
2 基本的SELECT语句
2.1 SQL分类
- DDL(Data Definition Languages、数据定义语言),这些语句定义了不同的数据库、表、视图、索引等数据库对象,还可以用来创建、删除、修改数据库和数据表的结构。
- 主要的关键字包括CREATE、DROP、ALTER等
- DML(Data Manipulation Language、数据操作语言),用于添加、删除、更新和查询数据库记录,并检查数据完整性。
- 主要的语句关键字包括INSERT、DELETE、UPDATE、SELECT等
- SELECT是SQL语言的基础,最为重要。
- DCL(Data Control Language、数据控制语言),用于定义数据库、表、字段、用户的访问权限和安全级别。
- 主要的语句关键字包括GRANT、REVOKE、COMMIT、ROLLBACK、SAVEPOINT等。
2.2 SQL语言的规则与规范
2.2.1 基本规则
- SQL可以写在一行或者多行。为了提高可读性,各子句分行写,必要时使用缩进
- 每条命令以;或\g或\G结束
- 关键字不能被缩写也不能分行
- 关于标点符号
- 必须保证所有的()、单引号、双引号是成对结束的
- 必须使用英文状态下的半角输入方式
- 字符串型和日期时间类型的数据可以使用 (’ ') 表示
- 列的别名,尽量使用双引号 (" ") ,而且不建议省略as
2.2.2 SQL大小写规范
- MySQL 在 Windows 环境下是大小写不敏感的
- MySQL 在 Linux 环境下是大小写敏感的
- 数据库名、表名、表的别名、变量名是严格区分大小写的
- 关键字、函数名、列名(或字段名)、列的别名(字段的别名)是忽略大小写的
- 推荐采用统一的书写规范
- 数据库名、表名、表别名、字段名、字段别名等都小写
- SQL关键字、函数名、绑定变量等都大写
2.2.3 注释
单行注释:#注释文字(MySQL特有的方式)
单行注释:– 注释文字 (–后面必须包含一个空格。)
多行注释:/* 注释文字 */
2.2.4 命名规则
- 数据库、表名不得超过30个字符,变量名限制为29个
- 必须只能包含A-Z,a-z,0-9,_共63个字符
- 数据库名。表名、字段名等对象中间不要包含空格
- 同一个MySQL软件中,数据库不能同名,同一个数据库中,表名不能重名;同一个表名中,字段不能重名。
- 必须保证你的字段没有和保留字段、数据库系统或常用方法冲突。如果坚持使用,请在SQL语句中使用 ` (着重号)引起来
- 保持字段名和类型的一致性,在命名字段并为其指定数据类型的时候一定要保证一致性。假如数据类型在一个表里是整数,那在另一个表里可就别变成字符型了
2.2.5 数据导入指令
在命令行客户端登录mysql,使用source指令导入
mysql -u root -p
password: ***
CREATE DATABASE my_db;
USE my_db;
SOURCE E:/girls.sql;
2.3 基本SELECT语句
2.3.0 SELECT
SELECT 1; #没有任何子句
SELECT 9/2; #没有任何子句
2.3.1 SELECT … FROM
- 语法
SELECT 标识选择哪些列
FROM 标识从哪个表中选择
- 选择全部列:
SELECT *
FROM 表名;
- 选择特定的列
SELECT id,name,sex
FROM beauty;
MySQL中SQL语句不区分大小写,但是许多开发人员习惯将关键字大写、数据列和表名小写。
2.3.2 列的别名
- 重命名一个列
- 便于计算
- 紧跟列名,也可以在列名和别名之间加入关键字AS,别名使用双引号,以便在别名中包含空格或特殊的字符区分大小写。
- AS 可以省略
- 建议别名简短,见名知意
- 举例
SELECT name AS '姓名',sex AS '性别'
FROM beauty;
2.3.3 去除重复的行
默认情况下,查询会返回全部行,包括重复行
SELECT DISTINCT boyfriend_id
FROM beauty;
针对于:
SELECT DISTINCT name,boyfriend_id
FROM beauty;
这里有两点需要注意:
1. DINSTINCT 需要放到所有列名的前面,如果写成 SELECT name,DISTINCT boyfriend_id FROM beauty会报错
2. DISTINCT 其实是对后面所有列名的组合进行去重,你能看到最后的结果是12条,因为这12个人姓名不同,都有name这个属性值。如果你想要看都有哪些不同的男朋友(boyfriend_id),只需要写DISTINCT boyfriend_id即可,后面不需要再加其他列名了。
2.3.4 空参参与运算
- 所有运算符或列值遇到null值,运算结果都为null
- 注意:在MySQL里面,空值不等于空字符串。一个字符串的长度是0,而一个空值的长度是空。而且,在MySQL里面,空值是占空间的。
2.3.5 着重号
- 我们需要保证表中的字段、表名等没有和保留字、数据库系统或常用方法冲突。如果真的相同,请在SQL语句中使用一对
2.3.6 查询常数
SELECT 查询还可以对常数进行查询。就是在SELECT 查询结果中增加一列固定的常数列。这列的取值是我们指定的,而不是从数据列表中动态取出来的。
SELECT 'wedu' as corporation,name FROM beauty;
2.4 显示表的结构
DESCRIBE beauty;
或
DESC beauty;
其中,各字段的含义如下
- Filed:字段名
- Type:字段类型
- Null:是否可以存储空值
- Key:说否已编制索引。PRI表示该列是表主键的一部分;UIN表示该列是UNIQUE索引的一部分;MUL表示在列中某个给定值允许出现多次
- Default:表示该列是否有默认值,如果有,给多少
- Extra:表示可以获取的与给定列有关的附加信息
2.5 过滤数据
- 语法
SELECT 字段1,字段2
FROM 表名
WHERE 过滤条件
- 使用WHERE 子句,将不满足条件的行过滤掉
- WHERE子句紧随 FROM 子句
- 举例
3 运算符
3.1 算术运算符
算术运算符主要用于数学运算,其可以连接运算符前后两个数值或表达式,对数值或表达式进行加(+)、减(-)、乘(*)、除(/)和取模(%)运算。
运算符 | 名称 | 作用 | 示例 |
---|---|---|---|
+ | 加法运算符 | 计算两个值或表达式的和 | SELECT A+B |
- | 减法运算符 | 计算两个值或表达式的差 | SELECT A-B |
* | 乘法运算符 | 计算两个值或表达式的乘积 | SELECT A*B |
/ 或DIV | 除法运算符 | 计算两个值或表达式的和商 | SELECT A/B 或者 SELECT A DIV B |
%或MOD | 求模(求余)运算符 | 计算两个值或表达式的余数 | SELECT A%B 或者 SELECT A MOD B |
3.1.1 加法与减法运算符
由运算结果可以得出如下结论:
- 一个整数类型的值对整数进行加法和减法操作,结果还是一个整数
- 一个整数类型的值对浮点数进行加法和减法操作,结果是一个浮点数
- 加法和减法的优先级相同,进行先加后减操作与进行先减后加的操作结果是一样的
- 在Java中,+ 的左右两边如果有字符串,那么表示字符串的拼接。但是在MySQL中 + 只表示数值相加。如果遇到非数值类型,先尝试转成数值,如果转失败,就按0计算。(补充:MySQL 中字符串拼接要使用字符串函数CONCAT()实现)
3.1.2乘法与除法运算符
由运算结果可以得出如下结论:
- 一个数乘以整数1和初一整数1后仍得原数
- 一个数乘以浮点数1和除以浮点数1后变成浮点数,数值与原数相等
- 一个数除以整数后,不管是否能除尽,结果都为浮点数
- 一个数除以另一个数,除不尽时,结果为一个浮点数,并保留到小数点后4位
- 乘法和除法优先级相同,进行先乘后除操作与先除后乘操作,得出的结果相同
- 在数学运算中,0不能用作除数,在MySQL中,一个数除以0为NULL
3.1.3 求模(求余)运算符
3.2 比较运算符
运算符 | 名称 | 作用 | 示例 |
---|---|---|---|
= | 等于运算符 | 判断两个值、字符串或表达式是否相等 | SELECT C FROM TABLE WHERE A = B |
<=> | 安全等于运算符 | 安全地判断两个值、字符串或表达式是否相等 | SELECT C FROM TABLE WHERE A <=> B |
<>(!=) | 不等于运算符 | 判断两个值、字符串或表达式是否不相等 | SELECT C FROM TABLE WHERE A <> B 或 SELECT C FROM TABLE WHERE A != B |
< | 小于运算符 | 判断前面的值、字符串或表达式是否小于后面的值、字符串或表达式 | SELECT C FROM TABLE WHERE A < B |
<= | 小于等于运算符 | 判断前面的值、字符串或表达式是否小于等于后面的值、字符串或表达式 | SELECT C FROM TABLE WHERE A <= B |
> | 小于运算符 | 判断前面的值、字符串或表达式是否大于后面的值、字符串或表达式 | SELECT C FROM TABLE WHERE A > B |
>= | 小于等于运算符 | 判断前面的值、字符串或表达式是否大于等于后面的值、字符串或表达式 | SELECT C FROM TABLE WHERE A >= B |
此外,还有非符号类型的运算符 |
空运算符
空运算符(IS NULL 或 ISNULL)判断一个值是否为NULL,如果为NULL则返回1,否则返回0
非空运算符
非空运算符(IS NOT NULL)判断一个值是否不为NULL,如果不为NULL则返回1,否则返回0.
最小运算符
语法格式为:LEAST(值1,值2,…,值n)。其中,“值n” 表示参数列表中有n个值。在有两个或多个参数的情况下,返回最小值
比较值中有NULL 时,不能判断大小,返回值为NULL
最大运算符
语法格式为:GREATEST(值1,值2,…,值n)。其中,n 表示参数列表中有n个值。当有两个或多个参数时,返回值为最大。假如任意一个自变量为NULL,则 GREATEST()的返回值为NULL。
比较值中有NULL 时,不能判断大小,返回值为NULL
BETWEEN AND运算符
BETWEEN AND运算符使用的格式通常为SELECT D FROM TABLE WHERE C BETWEEN A AND B,此时,当C大于或等于A,并且小于或等于B时,结果为1,否则结果为0
IN运算符
IN运算符用于判断给定的值是否是IN列表中的一个值,如果是则返回1,否则返回0.如果给定的值为NULL,或者IN列表中存在NULL,则结果为NULL
NOT IN 运算符
NOT IN 运算符用于判断给定的值是否不是IN列表中的一个值,如果不是IN列表中的一个值,则返回1,否则返回0.
LIKE运算符
LIKE 运算符主要用来匹配字符串,通常用于模糊匹配,如果条件满足则返回1,否则返回0。
如果给定的值或者匹配条件为NULL,则返回结果为NULL。
LIKE 运算符通常使用如下通配符
- %:匹配0个或多个字符
- _:只能匹配一个字符
3.3 逻辑运算符
逻辑运算符主要用来判断表达式真假,在MySQL中,逻辑运算符的返回结果为1、0或者NULL
运算符 | 作用 | 示例 |
---|---|---|
NOT 或 ! | 逻辑非 | SELECT NOT A |
AND 或 && | 逻辑与 | SELECT A AND B |
OR 或 II | 逻辑或 | SELECT A OR B |
XOR | 逻辑异或 | SELECT A XOR B |