MySQL数据库

87 阅读4分钟

本文正在参加「技术专题19期 漫谈数据库技术」活动。

本篇博客用于mysql数据库知识点的讲解以及关于mysql使用的实操记录,避免踩坑记录!!!

1.数据查询(连接查询)

不像关系代数中“连接”是用一个特殊符号来表达的,在SQL中“连接”是用“连接条件”来表达的。 连接条件或连接谓词:用来连接两个表的条件一般格式:

image.png

连接字段:连接谓词中的列名称 连接条件中的各连接字段类型必须是可比的,但名字不必相同

1.等值与非等值连接查询 连接运算符 “=”

例如:

image.png

查询结果:

image.png

自然连接:采用在SELECT中去掉重复字段的方式实施

image.png

嵌套循环法(NESTED-LOOP) 1)首先在表1中找到第一个元组,然后从头开始扫描表2,逐一查找满足连接件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。 2)表2全部查找完后,再找表1中第二个元组,然后再从头开始扫描表2,逐一查找满足连接条件的元组,找到后就将表1中的第二个元组与该元组拼接起来,形成结果表中一个元组。 3)重复上述操作,直到表1中的全部元组都处理完毕

排序合并法(SORT-MERGE)

1)常用于等值连接首先按连接属性对表1和表2排序。设置指针,分别指向表1和表2的第一个元组。如果这两个元组满足 2)连接条件,则进行元组拼接(如果有多个连续元组满足连接条件,则需要一一拼接),并将两指针分别后移一个原则。否则,将具有较小值的指针后移一个元组 3)重复上述操作,直到表1或表2中的全部元组都处理完毕为止.

索引连接(INDEX-JOIN) 1)对表按连接字段建立索引 2)对表中的每个元组,依次根据其连接字段值查询表2的索引,从中找到满足条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组

image.png

2.自然连接

自身连接:一个表与其自己进行连接,是一种特殊的连接,需要给表起别名以示区别,由于所有属性名都是同名属性,因此必须使用别名前缀。

例:查询每一门课的直接先修课的名称 SELECT FIRST.Cname , SECOND.Cname FROM Course FIRST, Course SECOND WHERE FIRST.Cpno = SECOND.Cno;

image.png

查询结果:

image.png

3.外连接

外连接与普通连接的区别 普通连接操作只输出满足连接条件的元组; 外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出; 左外连接:列出左边关系中所有的元组; 右外连接:列出右边关系中所有的元组;

image.png

执行结果:

image.png

4.多表连接

image.png

2.Mysql视图权限设置的踩坑经历

在某个数据库下创建两个视图,要求指定帐号有只读权限。
image.png 但是这样写却出现了错误??? image.png

但是一直不知道为社么会报错,结果突然点到设计视图的高级页面,看到了安全性‘Definer’这个点。

image.png

主要原因如下: 当视图的安全性为DEFINER时,数据库中存在DEFINER指定的用户,也就是图中的定义者所填写的。并且该用户拥有对应的权限,才能执行。与当前用户是否有权限无关。
当视图的安全性为INVOKER时,只要执行者有执行权限,就可以成功执行。
因为当时写的是‘root@192.168.%.%’且视图的安全性为DEFINER引起的。当然,如果开发不是指定帐号只读的话,也可以将安全性定义INVOKER,这样只要有对这个视图有权限的都可以查看了。

3.辨析一下definer和invoker的区别

在创建视图或者是存储过程的时候,是需要定义安全验证方式的(也就是安全性SQL SECURITY),其值可以为definer或invoker,表示在执行过程中,使用谁的权限来执行。 definer:由definer(定义者)指定的用户的权限来执行 invoker:由调用这个视图(存储过程)的用户的权限来执行


1)definer 当定义为DEFINER时,必须数据库中存在DEFINER指定的用户,并且该用户拥有对应的操作权限,才能成功执行。与当前用户是否有权限无关。 示例: CREATE DEFINER=dev@% PROCEDURE p_user_login(IN u_name VARCHAR(25), IN u_password VARCHAR(100))
BEGIN
SELECT u.id, u.name, u.tid, u.status, u.is_report FROM v_user u WHERE u.name=u_name AND u.password=u_password AND u.status=1;
END;


2)invoker 当定义为INVOKER时,只要执行者有执行权限,就可以成功执行。 示例: CREATE DEFINER=dev@% PROCEDURE p_user_login(IN u_name VARCHAR(25), IN u_password VARCHAR(100))
SQL SECURITY INVOKER
BEGIN
SELECT u.id, u.name, u.tid, u.status, u.is_report FROM v_user u WHERE u.name=u_name AND u.password=u_password AND u.status=1;
END;

本文正在参加「技术专题19期 漫谈数据库技术」活动。