数据库
第一章 数据库和SQL
一、数据库是什么
(1) 数据库是将大量数据保存起来,通过计算机加工而成的可以进行高效访问的数据集合
(2) 用来管理数据库的计算机系统成为数据库管理系统(DBMS)
二、数据库的结构
1. RDBMS的常见系统结构
客户端/服务器类型
2. 表的结构
列(字段)
行(记录)
单元格
三、SQL概要
1. DDL(数据定义语言)
creat:创建数据库和表等对象
drop:删除数据库和表等对象
alter:修改数据库和表等对象
2. DML:数据操纵语言
select:查询表中的数据
insert:向表中插入新数据
update:更新表中的数据
delete:删除表中的数据
3. DCL:数据控制语言
commit:确认对数据库中的数据进行的变更
rollback:取消对数据库中的数据进行的变更
grant:赋予用户操作权限
revoke:取消用户的操作权限
第二章 查询基础
一、SELECT 语句基础
1. 列的查询
select <列名称1>,<列名称2>,……
from <表名称>
2. 查询表中所有的列
select * from <表名>
3. 为列设定别名
select <列名称> as <别名> from <表名称>
4. 删除重复行
select distinct <列名称> from <表名称>
5. 使用where语句选择记录
select <列名称> from <表名称> where <条件>
6. 限制结果
select <列名称> from <表名称> limit <数字1> [offset <数字2>]
7. 拼接字段
select concatenate (<列名称1>, <列名称2>) from <表名称> where <条件>
二、运算符
1. 算术运算符
| 算术运算符 | |
|---|---|
| + | 加法运算 |
| - | 减法运算 |
| * | 乘法运算 |
| / | 除法运算,返回商 |
| % | 求余运算,返回余数 |
2. 比较运算符
| 比较运算符 | |
|---|---|
| = | 等于 |
| !=或<> | 不等于 |
| 大于 | |
| < | 小于 |
| >= | 大于或等于 |
| <= | 小于或等于 |
| (not) between … and … | 介于某个范围之内 |
| is (not) null | 空值判断符 |
| (not) in (项1,项2,…) | 在指定项内 |
| (not) like | 搜索匹配,常与模式匹配符配合使用 |
| regexp | 正则表达式匹配 |
3. 逻辑运算符
| 逻辑运算符 | |
|---|---|
| not | 否 |
| and | 并且 |
| or | 或 |
| xor | 异或 |
第三章 聚合与排序
一、对表进行聚合查询
| 聚合函数 | |
|---|---|
| avg() | 求某列的平均值 |
| count() | 返回某列的行数 |
| max() | 返回某列的最大值 |
| min() | 返回某列的最小值 |
| sum() | 返回某列值之和 |
二、对表进行分组
1. 创建分组
select <列名称> from <表名称> where <条件>
group by <分组列>
2. 过滤分组
select <列名称> from <表名称> where <条件>
group by <分组列>
having <分组列条件>
三、对查询结果进行排序
select <列名称> from <表名称> order by <列名称> [desc / asc]
第四章 数据更新
一、数据的插入
1. 插入对应的列中
insert into <表名称>
values <值1, 值2,…>
2. 插入指定的列中
insert into 表名称 <列名称1,列名称2,……>
values <值1,值2,…>
<值1,值2…>
……
3. 从其他表复制数据
insert into <表名称> (<列名称1>, <列名称2>,……)
select <列名称>
from <表名称>
二、数据的删除
1. 删除全部数据
delete from <表名称>
2. 删除指定对象
delete from <表名称> where <条件>
三、数据的更新
1. 更新某列数据
update <表名称> set <列名称> = <新值>
where <条件>
2. 删除某个列的值
update <表名称> set <列名称> = null
where <条件>
第五章 函数、谓词和case表达式
一、函数
| 函数 | 说明 |
|---|---|
| 文本处理函数 | |
| left(str,num),right | 返回串左边的字符 |
| length(str) | 返回串的长度 |
| locate(str1,str) | 返回参数str中字符串str1的开始位置 |
| lower(str),upper | 将串转换为小写 |
| trim(str),rtrim,ltrim | 去掉空格 |
| soundex(str) | 返回串的soundex值 |
| substring(str,num,len) | 返回字符串str中的第num个位置开始长度为len的子字符串 |
| 日期和时间处理函数 | |
| adddate(date,n),subdate | 该函数计算日期参数date加上n天后的日期 |
| addtime(time,n),subtime | 该函数计算日期参数time加上n后的时间 |
| curdate() | 返回当前日期 |
| curtime() | 返回当前时间 |
| date(date) | 返回日期时间的日期部分 |
| datediff(date1, date2) | 返回两个日期之差 |
| date_add(date,interval expr type) | 向日期添加指定的时间间隔 |
| date_format(date,format) | 返回一个格式化的时间或日期串 |
| day() | 返回一个日期的天数 |
| dayofweek() | 返回一个日期的星期数 |
| hour() | 返回一个时间的小时部分 |
| minute() | 返回一个时间的分钟部分 |
| month() | 返回一个日期的月份部分 |
| now() | 返回当前的日期和时间 |
| second() | 返回一个时间的秒部分 |
| time() | 返回日期时间的时间部分 |
| year() | 返回一个日期的年份部分 |
| 数值处理函数 | |
| abs() | 返回一个数的绝对值 |
| cos() | 返回一个角度的余弦 |
| exp() | 返回一个数的指数值 |
| mod() | 返回除操作的余数 |
| pi() | 返回圆周率 |
| rand() | 返回一个随机数 |
| sin() | 返回一个角度的正弦 |
| sqrt() | 返回一个数的平方根 |
| tan() | 返回一个角度的正切 |
二、谓词
1. LIKE
LIKE 操作符用于在 WHERE 子句中搜索匹配,常与模式匹配符配合使用。
2. BETWEEN
操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。
3. IS NULL
为NULL值
4. IN
IN 操作符允许我们在 WHERE 子句中规定多个值。
SELECT <列名称>
FROM <表名称>
WHERE <条件> IN (<值>,<值>,...)
5. EXISTS
EXISTS 运算符用于判断查询子句是否有记录,如果有一条或多条记录存在返回 True,否则返回 False。
SELECT <列名称>
FROM <表名称>
WHERE EXISTS
(SELECT <列名称> FROM <表名称> WHERE <条件>)
三、case
case表达式,是可以在sql中使用if ..then..else的逻辑判断。
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END
第六章 集合运算
一、case联结表
1.内部联结
select <列名称> from <表名称1>
inner join <表名称2>
on <表名称1>.<列名称1>, <表名称2>.<列名称2>
2.高级联结
--关键字会从左表(表1) 那里返回所有的行,即使在右表 (表2) 中没有匹配的行。
left outer join: left outer join
--关键字会右表(表2) 那里返回所有的行,即使在左表 (表1) 中没有匹配的行。
right outer join: right outer join
二、组合查询
select <列名称1> from <表名称1>
union(union all)
select <列名称1> from <表名称2>
第七章 创建和操纵表
一、创建数据库
create database <数据库名称>
二、创建表
create table <数据库名称>
(
<列名1> <数据类型> <该列所需的约束>,
<列名1> <数据类型> <该列所需的约束>,
……
<该表的约束1>,<该表的约束2>……
)
数据类型的指定
数字型:integer
字符型:char / varchar
日期型:date
约束的设置
null
not null
主键:primary key
--null/not null
create table 表名称
(
列名称1 数据类型 not null,
....
)
--primary key
create table表名称
(
列名称1 数据类型 not null,
……,
primary key (列名称1)
)
--auto increment
create table 表名称
(
列名称1 数据类型 not null auto_increment,
……,
primary key (列名称1)
)
--default
create table表名称
(
列名称1 数据类型 default 值,
……,
)
--unique:约束唯一标识
create table表名称
(
列名称1 数据类型 not null,
……,
unique (列名称1)
)
--foreign key
create table 表名称1
(
列名称1 数据类型 not null,
……,
primary key (列名称1),
foreign key (列名称1) references 表名称2(列名称2)
)
三、删除和更新表
1. 表的删除
drop table <表名>
2. 表定义的更新
1 添加列
alter table <表名> add <列的定义>
2 删除列
alter table <表名> drop <列名>
3 改变数据类型
alter table <表名称>
alter column <列名称> <数据类型>
4 表的别名
select <列名称> from <表名称> as <别名>
5 删除表
drop table <表名称>
6 重命名表
rename table 旧表名称 to 新表名称
第八章 相关概念
一、视图
视图是指计算机数据库中的视图,是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
(1) 重用SQL。
(2) 保护数据。可以给用户授予表的特定部分的访问权限而不是整个表的访问权限。
(3) 更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据。
二、子查询
当一个查询是另一个查询的条件时,称之为子查询。
三、存储过程
存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。
存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数来调用执行。
存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。
四、游标
游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标可以被看作是一个查询结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成的一个临时文件,提供了在查询结果集中向前或向后浏览数据、处理结果集中数据的能力。有了游标,用户就可以访问结果集中任意一行数据,在将游标放置到某行之后,可以在该行或从该位置的行块上执行操作。
五、触发器
触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。
触发器与存储过程的唯一区别是触发器不能执行EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发执行。
六、事务
比如,我们去银行转账,操作可以分为下面两个环节:
(1) 从第一个账户划出款项。
(2) 将款项存入第二个账户。
在这个过程中,两个环节是关联的。第一个账户划出款项必须保证正确的存入第二个账户,如果第二个环节没有完成,整个的过程都应该取消,否则就会发生丢失款项的问题。整个交易过程,可以看作是一个事物,成功则全部成功,失败则需要全部撤消,这样可以避免当操作的中间环节出现问题时,产生数据不一致的问题。
数据库事务是一个逻辑上的划分,有的时候并不是很明显,它可以是一个操作步骤也可以是多个操作步骤。我们可以这样理解数据库事物:对数据库所做的一系列修改,在修改过程中,暂时不写入数据库,而是缓存起来,用户在自己的终端可以预览变化,直到全部修改完成,并经过检查确认无误后,一次性提交并写入数据库,在提交之前,必要的话所做的修改都可以取消。提交之后,就不能撤销,提交成功后其他用户才可以通过查询浏览数据的变化。
第九章 非关系型数据库
非关系型数据库的优势:
(1) 性能NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL层的解析,所以性能非常高。
(2) 可扩展性同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展。
关系型数据库的优势:
(1) 复杂查询可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询。
(2) 事务支持使得对于安全性能很高的数据访问要求得以实现。
db.collection.insertOne()
db.collection.insertMany()
db.collection.deleteOne()
db.collection.deleteMany()
db.collection.updateOne()
db.collection.updateMany()
db.collection.replaceOne()
db.collection.find()
附录
一、SELECT 子句顺序
select >>> from >>> where >>> group by >>> having >>> order by >>> limit
二、操作符
| 位运算符 | |
|---|---|
| & | 位与 |
| 位异或 | |
| << | 位左移 |
| >> | 位右移 |
| ~ | 位取反,反转所有比特 |
| 通配符 | |
| % | 模式匹配符,表示任意字符串 |
| _ | 模式匹配符,表示任意单个字符 |