1、数据库服务器:运行数据库管理软件的计算机
2、数据库管理软件:mysql,oracle
3、库:存放表的文件夹
4、表:文件
5、记录:比如说事物的一系列特征
6、数据:描述事物特征
mysql 8.0.23
show databases
表结构
枚举类型 enum
集合类型 set
约束条件:
not null,
default,
unique key(可以设置单列唯一,也可以设置联合唯一) ,
primary key(主键,包括not null 和 unique 功能),
auto_increment(约束字段为自动增长,被约束的字段必须同时被key约束)
foreign key( 外键, foreign key(column) references 关联表(column) )
表关系
多对一
多对多:左右两张表都能找到对应的一对多的关系
一对一
sql语法
单表查询语法
关键字的执行优先级:
select distinct 字段1,字段2,子段3, … from 库.表
where 条件
group by 分组
having 过滤
order by 排序
limit 限制数据条数
select执行顺序:1.from 2.on 3. join type 4.where 5.group by 6.having 7.select 8.distinct 9.order by 10.limit
group by 分组:
只能select group by 后的项
(mysql里如果select 非分组项依然可以查到,我们可以设置成严格模式:set global sql_mode=‘ONLY_FULL_GROUP_BY’)
通常分组可以搭配成:select 聚合函数、group_concat from TABLE group by TABLE.XX
having : 与where的区别,对分组结果再进行条件过滤
其他语法
1.case when:可以用于排序,根据case,when 新的sort字段
case
when …then
when … then
…
else …
end AS 列名
2.exists
可以理解为:将主查询的数据,放到子查询中做条件验证,根据验证结果(TRUE 或 FALSE)来决定主查询的数据结果是否得以保留
exists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当 exists里的条件语句能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真,返回当前loop到的这条记录,反之如果exists里的条 件语句不能返回记录行,则当前loop到的这条记录被丢弃,exists的条件就像一个bool条件,当能返回结果集则为true,不能返回结果集则为 false
article 文章表:
user 用户表:
我们要查出 article 表中的数据,但要求 uid 必须在 user 表中存在。SQL 语句如下:
SELECT * FROM article WHERE EXISTS (SELECT * FROM user WHERE article.uid = user.uid)
正则查询
like ‘xxxxx %’
regexp ‘∧xxxxx’
连表操作
(在笛卡尔积的基础之上,筛选出多表间有关系的那一部分)
mysql提供如下连表操作:
内连接(两表间的共同部分):inner join
左连接(内连接的基础上保留左表的记录):left join
右连接(内连接的基础上保留右表的记录):right join
全外连接(内连接的基础上保留左右两表没有对应关系的记录):union
子查询
常见几种子查询:
1.带IN
2.带比较运算符
3.带EXISTS
可以把查询结果括号起来作为表来使用:
(select …) as t1
join
(select …) as t2
on …
python 的 pymysql模块
.connect(host=’’,port=’’,db=’’,charset=’’) # 建立链接
con = pymysql.connect()
cursor = con.cursor() # 获得游标
cursor.execute(sql,,) # execute可以对参数进行字符串拼接,对sql语句进行非法字段的过滤,保证数据安全。当sql语句进行增删改的数据操作时,.execute并没有对数据库做直接操作,最后别忘记con.commit()提交
查询:
cur = cursor.execute(‘select * …’)
cur.fetchone() #获取一个查询结果
cur.fetchmany(int) #获取指定个数的查询结果
cur.fetchall() #获取所有查询结果
视图
一种虚拟表,是由多张通过关联的方式得到临时表,再把临时表摘出来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的sql了,直接去视图中查找即可。视图是存放在数据库中的(它是只有表结构没有表数据的一种区别于一般表的存在),如果我们程序中使用的sql过分依赖数据库中的视图,即强耦合,那就意味着扩展sql极为不便
语法:CREATE VIEW 视图名称 AS SQL语句
视图主要是用来查询的方便的,不要用视图修改数据
触发器
语法:
create trigger 触发器名称 before/after insert/delete/update on 表名 for each row
begin
…
end
delimiter
定义结束符:delimiter //
事务
SQL语句集,同时执行(全部执行或全部不执行)
索引的数据结构,B+树
在这里插入图片描述
图上树的高度是3,树的高度就是IO次数。查找数据要把磁盘IO次数控制在常量级上
(淡蓝色是磁盘,黄色P是指针,蓝色是数据项)
B+树的查找过程:指针P用来指向查找的下一个磁盘块,根据要查找的数和数据项(蓝色,比如17和35)比较,小于就走P1,介于数据项之间走 P2,大于就走 P3。每找到下一个磁盘树的高度就加一。只有叶子节点存储真实数据(3,5,9,10,…),非叶子节点存储的是指引搜索方向的数据项
b+树性质
1.索引字段要尽量的小
当前数据表的数据为N,每个磁盘块的数据项的数量是m,则有h=㏒(m+1)N,当数据量N一定的情况下,m越大,h越小;而m = 磁盘块的大小 / 数据项的大小,磁盘块的大小也就是一个数据页的大小,是固定的,如果数据项占的空间越小,数据项的数量越多,树的高度越低
2.索引的最左匹配特性:
当b+树的数据项是复合的数据结构,比如(name,age,sex)的时候,b+数是按照从左到右的顺序来建立搜索树的
聚集索引
InnoDB存储引擎