MySQL的结构
一共分四层,分别是:
1. 连接层:主要是一些客户端和链接服务,包含本地sock通信和大多数基于客户端/服务端工具实现的类似于tcp/ip的通信. 主要完成一些类似于链接处理.授权认证.及相关的安全方案.
2. 服务层(可优化):第二层架构主要完成大的核心服务功能,如SQL缓存的查询,SQL的分析和优化和内置函数的执行.
3. 引擎层(可优化):它真正的负责了Mysql中数据的存储和提取,服务器通过API与存储引擎进行通信,不同的存储引擎具有的功能不同,这样我们可以根据自己的实际需要进行选取.
4. 存储层:它主要是将数据存储再运行于设备的文件系统之上,并完成于存储引擎的交互.
MySQL的常用数据库引擎
共有十多个,但常用的有两个: MyISAM和InnoDB
MyISAM: 偏读,侧重点是性能
InnoDB: 偏事务 下面这张图是两者的
两者的对比
MySQL的特点
1. MySQL把数据存储在表格中,使用标准的结构化查询语言-SQL访问数据库
2. MySQL是完全免费的,在网上可以任意下载,并且可以查看到它的源文件,进行必要的修改
3. MySQL服务器的功能齐全,运行速度很快,十分可靠,有很好的安全感
4. MySQL服务器在客户机,服务器嵌入系统中使用,是一个客户机/服务器系统,能够支持多线程,支持多个不同的客户程序和管理工具
MySQL的对象
表(table) / 视图(view) / 索引(index) / 序列(squence) / 存储函数(function) / 存储过程(procedure) / 触发器(trigger)
#{} 与 ${}的区别
在MyBatis中:
#{}:#{}使用的是,会有类型转换,比较安全,也是官网推荐使用的
${}:使用字符串拼接,会有sql注入,不安全,不推荐使用
MySQL对库表的操作
linux中进入到MySQL的安装目录下, mysql -uroot -p 再输入密码 OK,已经进入
select database(): 查看当前使用的数据库 show databases:查看所有的数据库
use database_name:切换数据库 create database 数据库名:创建数据库
drop database database-name:删除数据库 show tables:查看数据库中所有的表
drop table table_name:删除表 create table 表名: 创建表
MySQL的增(insert)
insert into user values (NULL,'x','h'); //不能省略可空字段
inser into user values (NULL,'x','h'),(NULL,'x','h'); //多插入,逗号隔开
MySQL的删(delete)
delete from user where id=1; 记得价格过滤条件,不然会删除所有..
MySQL的改(update)
updata employees set 要更改的列
MySQL的查(select)
MySQL的查询大致可以分为5个部分: 基本的select语句 / 过滤和排序数据 / 多表查询 / 单行函数 / 分组函数
基本的selcet语句: select id , name from employees
过滤和排序数据: select id , name from employees where id != 2 =(等于) >(大于) >=(大于/等于) <(小于) <=(小于等于) !=(不等于)
select id from employees where id > 5 and id < 7 and为并且 为字符串的话,就是字典顺序来查询
select id from employees where id in (5,6,7) ...
like为模糊查询: "%a%" "_a%" and为并且 in(集合) \为转义字符 or或者 not否
order by排序 数值型/字符型/日期型都可以排序 ,asc为升序,desc为降序,可以多级嵌套排序
select * from employees order by id asc; //升序排序 一定要写在where后面!!!
多表查询
多表查询,第一步,你得多各张表的字段及联系足够熟悉,本质就是一张表放不下这么多字段.把原本同一张表的字段放到其他的表里面,两张表之间一定又相同的唯一字段作为桥接,联系
select id , name from employees departments where employees.'id' = departments.'id' //就是from的时候写多张表就OK了,然后过滤条件,也就是连接的条件, 可以优化, 在select那里,直接写上每一个字段是来自哪里 如employees.name
等值连接和非等值连接: 前者就是上面演示的那种,两者的关系是相等的,后者就是在一个区间,通常用and来表示
自连接和非自连接: 前者连接的是本身的这张表,比如查自己的上司是谁,后者连接的是其他的表
内链接和外连接:前者是只查询两者相匹配的行,比如之上的例子就是查询相等的
外连接:使用join和on,意思就是除了两表中向同的数据外,还把左表中或右表中的数据也查询出来,于是就有了左外连接,右外连接.,不支持满连接. 使用的outer join和on函数
select e.id,d.name from emp e left outer join dep d on e.'id' = d.'id'; 这是左外连接,因为是left outer join on ,改成右外连接就是right outer join on
单行函数
单行函数就是一个个的函数,具体的函数有: concat("11","22") //它将两个字符串连接起来 sunstr("hello",1,2) //截取1到2的字符串,得到he length("111111") //得到这个字符串的长度 instr("hello","e") //返回这个字符的索引 trim("h" from "hello") //返回除去h之外的所有字符串 replace("abcd","b","m") 将字符串中的b转换成m,再输出字符串
分组函数
avg(salary) //表示平均 sum(salary) //表示总共 max(salary) //最高的 min(salary) //最低的 count(salary) //计数
子查询
子查询的本质就是查询的嵌套,可以嵌套很多层,也是属于查询也因为子查询而变得千变万化
MySQL的运行顺序
运行顺序基本如下:
1. from 2. on 3. join 4. where 5. group by
6. avg,sum 7. select 8. distinct 9. order by 10. limit
MySQL中的join查询
上图中分别是: 左外链接,右外链接,内连接
1. 左外连接: select * from tablea a left join table b on a.key = b.key
2. 右外连接: select * from tablea a right join table b on a.key = b.key
3. 内连接: select * from tablea a inner join tableb b on a.key = b.key
上图中分别是: 左链接,右链接,全连接,外连接
左连接: select * from tablea a left join tableb b on a.key = b.key where b.key is null
右连接: select * from tablea a right join tableb b on a.key = b.key where a.key is null
全链接:
select * from tablea a left join tableb b on a.key = b.key union select
* from tablea a right join tableb b on a.key = b.key
外连接: select * from tablea a full outeb join tableb b on a.key = b.key where a.key is null or b.key is nul