数据库基础回顾
数据库(Database)是按照数据结构来组织、存储和管理数据的建立在计算机存储设备上的仓库。数据库是长期储存在计算机内、有组织的、可共享的数据集合。类似于图书馆,各种各样的书按照某个特定的规律存放在指定的书架上。
分类
SQLite
小型数据库,接触最多,常见于智能手机操作系统中储存如短信、电话号码、浏览器的浏览记录等个人信息
MYSQL、MSSQLServer
中型数据库,常用于存储论坛、中小企业网站、学校网站等。
Oracle
数据库中的王者,由甲骨文公司开发,常用于银行系统、医院系统等
Access、Mongodb、DB2、Sybase、Informix
基本知识
基本数据类型
int 存储用户IP,集体编号等
double 存储银行系统中的钱,游戏中的属性值
char(固定长度字符) 存储非中文的短字符串(如英文+数字的用户名、密码等,但存储unicode的字符时会出现乱码)
varchar(可变长度字符) 对unicode的自如支持良好,但效率不如char
text(文本型) 用于存储长度大于255的大文本
blog(二进制大对象) 用于存储大型的二进制数据对象,如图片、用户模型等
基本名词解释
查询
第一层意思是在数据库中检索想要的数据,第二层意思是执行一段SQL代码
表、字段、记录
![image-20201204110612618](https://i-blog.csdnimg.cn/blog_migrate/310532803d99c8ee762f9ab83b5163c3.png)
字段指的是表中的列,通常情况下将字段看成是某个对象的一个属性。
库
表的集合
常见问题
乱码(编码问题)
现象:
某个用户提交了一个文本给服务器,当这个用户再次查看此文本时出现乱码
原因:
有可能是数据库中的编码与提交的编码不一致
解决策略:
保证数据库编码、表编码、字段编码保持一致
注:utf8在Linux和浏览器中会正常显示,而在Windows命令控制台中依然会乱码,这时需要将字符编码设置为GBK就可解决乱码问题。
不同国家和地区的标准
ANSI 在简体中文windows中表示GBK(GB2312),繁体windows表示Big5,日文windows中表示Shift_JIS。
(表示英文字符时用一个字节,表示中文时用两个或四个字节)UNICODE 国际通用编码
UTF-8 是UNICODE编码在网络(主要是网页)之间传输的“桥梁”编码。传输时可以节约数据量。
报错
常见的有程序逻辑问题、语法错误等
如果使用控制台操作MySql,那么出错的原因大部分是语法错误;若在开发过程中由程序连接MySql,操作时报错的原因一般有MySql服务未开启、配置连接错误、语法错误。
Mysql基本语法
传送门:
![image-20201204173955008](https://i-blog.csdnimg.cn/blog_migrate/753c1c1c340cd1ec775a3186b072d9ee.png)
union联合查询
- 无重复 (有重复数据时去重)
select * from 表1 union select * from 表2;
- 有重复(查询两张表中所有数据,不去重)
select * from 表1 union all select * from 表2;
注意:两次查询的列数(字段数必须一致),因为union会将两次查询结果的值合并到一张表格中
子查询
就是将一个查询语句的结果当作另一个查询语句的条件。
![image-20201204180622282](https://i-blog.csdnimg.cn/blog_migrate/35564bb2ca024ca4c48df4055df0987e.png)
区别:返回的结果集数量不同。
注意:条件的个数必须和子查询的列数相同
- 标量子查询
select * from 表1 where 表1.id=(select id from 表2 where 条件 limit 0,1)
- 行子查询
select * from 表1 where (列1,列2)=(select 列1,列2 from 表2 where 条件 Limit 0,1)
- 列子查询
select * from 表1 where 表1.id in (select id from 表2 where 条件)
注:in 表示表1的条件在子查询的返回结果中存在
- 表子查询
select * from 表1 where (列1,列2) in (select 列1,列2 from 表2 where 条件)
子查询的几个关键字
- any, in, some
对于子查询返回的列中的任何一个数值,如果比较结果为TRUE,就返回TRUE
in与any效果等同,some是any的别名用的比较少,也就是说这三个是一个东西
- all
与any效果相反,查询的条件必须与子查询的条件完全相同
- exists
子查询是否有结果,若返回0行则表示FALSE,否则为TRUE。
常用函数
- 聚合函数
聚合函数会将每一个分组中的数据合并成一条
![image-20201204183655856](https://i-blog.csdnimg.cn/blog_migrate/ecdb57853dbaba42c8d08a92873f8433.png)
- 数学函数
![image-20201204183747388](https://i-blog.csdnimg.cn/blog_migrate/9ee7a079687d20fd6d8826784acf2bed.png)
![image-20201204183959607](https://i-blog.csdnimg.cn/blog_migrate/1524fd1b03a328cf2f94a52bcc772bca.png)
也可在虚拟表中查询,就是一个计算器作用
- 字符串处理函数
在sql注入中用的比较多
![image-20201204184054629](https://i-blog.csdnimg.cn/blog_migrate/0653d687f5ade3add97794aec37eaae8.png)
- 日期和时间函数
![image-20201204184234878](https://i-blog.csdnimg.cn/blog_migrate/ab22f062d4e6f8fd2b98d30e13cf9431.png)
- 加密函数
用于加密数据
![image-20201204184321961](https://i-blog.csdnimg.cn/blog_migrate/6f7fa98290b73727e48c5bdfc3043d6b.png)
- 系统信息函数
在sql注入中用的比较多
![image-20201204184411327](https://i-blog.csdnimg.cn/blog_migrate/247f37f436eda4e7a95906ca1d45354a.png)