目录
MySQL基础篇
一、MySQL概述
1.1 概念
1.2 MySQL的安装与启动
1.安装
2.启动
3.连接数据库
二、SQL
2.1 SQL通用语法
2.2 SQL分类
2.3 DDL
1.数据库操作
2 表操作
3 数据类型
2.4 DML
1 添加数据
2 修改数据
3 删除数据
2.5 DQL
1 DQL的语法前后顺序
2 DQL关键字执行的前后顺序
编辑
3 基本查询
4 条件查询
5 聚合函数
6 分组查询
7 排序查询
8 分页查询
2.6 DCL
1 用户管理
2 权限控制
三 函数
3.1 字符串函数
3.2 数值函数
3.3 日期函数
3.4 流程函数
四、约束
4.1 概述
4.2 约束演示
4.3 外键约束
五、多表查询
5.1 多表关系
5.2 多表查询概述
5.3 内连接
5.4 外连接
5.5 自连接
5.6 联合查询、子查询
1 联合查询
2 子查询
六、事务
6.1 事务操作
6.2 事务的四大特性
6.3 并发事务问题
6.4 事务隔离级别
特点:使用表存储数据,格式统一,便于维护
使用SQL语言操作,标准统一,使用方便,学习成本低
①进入Mysql官网:MySQL
②点击downloads
③下滑选择社区免费版
④选择对应操作系统的版本
安装完毕后默认是开机自动启动
也可以在cmd窗口进行命令行控制
# 启动
net start mysql80
# 停止
net start mysql80
在cmd窗口使用系统自带的命令行工具执行命令
如果想随处使用及得配置环境变量
环境变量配置完毕后 输入mysql [-h 127.0.0.1] [-p 3306] -u root -p \
分类 | 全称 | 说明 |
DDL | Data Definition Lauguage | 数据定义语言,用来定义数据库对象(数据库,表,字段) |
DML | Data Manipulation Lauguage | 数据操作语言,用来对数据库表中的数据进行增删改 |
DQL | Data Query Lauguage | 数据查询语言,用来查询数据库中表的记录 |
DCL | Data Control Lauguage | 数据控制语言,用来创建数据库用户、控制数据库的访问权限 |
1.1 查询
查询所有数据库
show databases;
查询当前数据库名称
select database();
1.2 创建
create database [if not exists] 数据库名 [default char set 字符集] [collate 排序规则];
create database if not exists mysql_test default char set 'utf8mb4';
1.3 删除
drop database if exists 数据库名;
1.4 使用数据库
use 数据库
2.1 查询当前数据库中所以表
show tables;
2.2 查询表结构
desc 表名;
2.3 查询制定本IAO的建表语句
show create table 表名;
2.4 表结构创建
CREATE TABLE 表名 (
字段1 字段1类型 [COMMENT 字段1注释],
字段2 字段2类型 [COMMENT 字段2注释],
字段3 字段3类型 [COMMENT 字段3注释]
)[COMMENT 表注释];
CREATE TABLE `drug` (
`id` int primary key auto_increment,
`schedule_id` varchar(255) ,
`create_time` timestamp COMMENT '创建时间',
`update_time` timestamp COMMENT '更新时间'
); COMMENT '数据字典'
2.5 修改表字段,表名
-- 添加字段
alter table 表名 add 字段名称 类型 [comment 注释] [约束];
-- 修改字段类型
alter table 表名 modify 字段名 新数据类型;
--修改字段名称和字段类型
alter table 表名 change 旧字段名 新字段名 新数据类型 [comment 注释] [约束];
-- 修改表名
alter table 表名 rename to 新表名;
2.6 删除表字段和表
-- 删除表字段
alter table 表名 drop 字段名;
-- 删除表
drop table if exists 表名
-- 删除指定表,并重新创建该表 即清空数据
truncate table 表名;
3.1 数值类型
3.2 字符串类型
数据操作语言,用来对数据库表中的数据进行增删改
给指定字段添加数据
insert info 表名(字段1,字段2,...) values(值1,值2,.....);
给全部字段添加数据
insert into 表名 values(值1,值2,....)
批量添加数据
insert info 表名(字段1,字段2,...) values(值1,值2,.....),values(值1,值2,.....);
insert into 表名 values(值1,值2,....),values(值1,值2,....)
例如:
INSERT INTO drug VALUES(1,1,1,'张三','李四','www','ww',1,'2023-2-12','2023-2-12',1);
注意:
update 表名 set 字段1 = 值1 ,字段2 = 值2 ,。。。[where 条件];
注意:修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表的所有数据
delete form 表名 [where 条件]
注意:delete语句的条件可以有,也可以么有,如果没有条件,则会删除整张表的所有数据。
delete语句不能删除某一字段的值,只能删除一列或者多列
数据查询语言,用来查询数据库中表的记录
查询多个字段
select 字段1,字段2,字段3,....from 表名;
select * from 表名; 一般尽量不使用* 效率不高,可读性也不高
设置别名
select 字段1 [as 别名],字段2 [as 别名] ...from 表名;
as可以省略 写成字段1 别名的格式
去除重复记录
select distinct 字段列表 from 表名
select 字段1,字段2 from 表名 where 条件列表
这里注意: _点任意单个字符 %匹配任意个字符
例如 匹配身份证号为最后一个为x _的表示就是 infoNO = ——————x(前面是17个_)
%的表示就是infoNo=%x
将一列数据作为一个整体,进行纵向计算。
常见的聚合函数:
注意:所有的null不参与聚合函数的运算
select 字段列表 form 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件]
where和having的区别:
执行时机不同:where是分组之前进行过滤,不满足where条件不进行分组;having是分组之后对结果进行过滤
判断条件不同:where不能对聚合条件进行判断,having可以
select 字段列表 form 表名 order by 字段1 排列方式1 ,字段2 排列方式2
排列方式:ASC升序排列(默认) DESC降序排列
注意:如果是多字段排序,当第一个字段相同的时候,才会根据第二个字段进行排序
select 字段列表 form 表名 limit 起始索引,查询记录数;
注意:
举例: 查一个每页显示10条 limit 0,10 或者 limit 10
查第二页每页显示10条 limit 10 ,10
数据控制语言,用来创建数据库用户、控制数据库的访问权限
查询用户
use mysql;
select * from user
创建用户
create user '用户名'@'主机名' identified by '密码'
如果只能是当前主机 主机名写localhost
如果是任意主机 主机名写%
修改用户密码
alter user '用户名'@'主机名' identified with mysql_native_password by '密码';
删除用户
drop user '用户名'@'主机名';
权限列表:
2.1 查询权限
show grants for '用户名'@'主机名';
2.2 收授予权限
grant 权限列表 on 数据库名.表名 TO '用户名'@'主机名'
2.3 撤销权限
revoke 权限列表 on 数据库名.表名 from '用户名'@主机名';
注意:多个权限之间,使用逗号分隔
授权时,数据库名和表名可以使用*进行通配,代表所有
是指一段可以直接被另一段程序调用的程序或代码。
select concat('ww','tt'); -- wwtt
select lower('Hello'); -- hello
select upper('Hello'); -- HELLO
select lpad('1',5,'0'); -- 00001
select rpad('1',5,'0'); -- 10000
select trim(' mysql test '); -- mysql test
select substring('hello test', 1, 5); -- hello
select ceil(1.1); -- 2
select floor(1.6); -- 1
select mod(3,4); -- 3
select rand(); -- [0,1)
select round(2.345,2); -- 2.35
select curdate(); -- 2023-02-13
select curtime(); -- 6:21:33
select now();-- 2023-02-13 06:22:29
select year(now()); -- 2023
select month(now()); -- 2
select day(now()); -- 13
select date_add(now(),INTERVAL 70 DAY ); -- 2023-04-24 06:25:00
select date_add(now(),INTERVAL 70 MONTH ); -- 2028-12-13 06:25:38
select datediff('2020-09-01','2018-05-12'); -- 843天
select if(true,'ok','error'); -- ok
select ifnull('ok','default'); -- ok
select ifnull('','default'); -- ''
select ifnull(null,'default'); -- default
select
id,
name,
(case when math >= 85 then '优秀' when math >= 60 then'及格' else '不及格' end) '数学'
(case when english >= 85 then '优秀' when english >= 60 then '及格' else '不及格' end) '英语'
(case when chinese >= 85 then '优秀' when chinese >= 60 then '及格' else '不及格' end) '语文'
rom score;
-- case when then else end
-- 需求:查询mp表的员工姓名和工作地址(北京/上海--->一线城市,其他-->二线城市)
select
name,
(case workaddress when '北京' then '一线城市' when '上海' then '二线城市' else '三线城市
end) as '工作地址'
from emp;
1 概念
约束是作用于表中字段上的规则,用于限制存储在表中的数据
2 目的
保证数据库中数据的正确、有效性和完整性。
3 分类
注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。
CREATE TABLE user_test (
id int PRIMARY KEY AUTO_INCREMENT COMMENT 'id唯一标识',
name varchar(10) NOT NULL UNIQUE COMMENT '姓名',
age int CHECK ( age > 0 and age <= 120) COMMENT '年龄',
status char(1) DEFAULT '1' COMMENT '状态',
gender char(1) COMMENT '性别'
)
阿里开发规约:强制不得使用外键与级联,一切外键概念必须在应用层解决。
因此这里不记录笔记
项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:
一对多 、多对多、一对一
1 概述
指从多张表中查询数据
2 笛卡尔积
笛卡尔积是指在数学中,两个集合A集合和B集合的所有组合情况(在多表查询中,需要消除无效的笛卡尔集)
3 多表查询的分类
连接查询
内连接:相当于查询A、B交集部分数据
外连接:
左外连接:查询左表所有数据,以及两张表中交集部分数据
右外连接:查询右表所有数据,以及两张表中交集部分数据
自连接:当前表与自身的连接查询,连接必须使用表别名
子查询
1 隐式内连接
SELECT 字段列表 FROM 表1,表2 WHERE 条件;
举例:
SELECT emp.name,dept.name FROM emp,dept WHERE emp.dept_id = dept.id; 或者 SELECT e.name,d.name FROM emp e,dept d WHERE e.dept_id = d.id;
2 显示内连接
SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 on 连接条件;
举例:
SELECT emp.name,dept.name FROM emp INNER JOIN dept on emp.dept_id = dept.id 或者 SELECT e.name,d.name FROM emp e INNER JOIN dept d on e.dept_id = d.id;
1 左外连接
SELECT 字段列表 FROM 表1 LEFT JOIN 表2 ON 条件
相当于查询左表和两个表交集部门的数据
2 右外连接
SELECT 字段列表 FROM 表1 RIGHT JOIN 表2 ON 条件
为什么使用外连接:
当没有关联数据的时候(条件不符合为null的时候),使用内连接的时候不会显示这条数据,为了保持数据的全面性,这时候使用外连接
SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件
自连接查询可以是内连接也可以是外连接。
当出现这种查询员工所属领导信息的时候, 领导也是员工涉及的表结构就是一个表,我们使用自连接
案例:
-- 1。查询员工及其所属领导的名字
-- 表结构:emp a,emp b
select a.name,b.name from emp a,emp b where a.managerid= b.id;
-- 2。查询所有员工的名字及其领导的名字,如果员工没有领导,也需要查询出来
-- 表结构:emp a,emp b
select a.name '员工',b.name '领导' from emp a left join emp b on a.managerid=b.id;
对于union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集。
SELECT 字段列表 FROM 表A UNION SELECT 字段列表 FROM 表B
举例:
注意: 多张表的列数必须保持一致,字段类型也需要保持一致
UNION ALL 会将全部的数据直接合并在一起,union会对合并之后的数据去重。
①语法
SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询。
SELECT * FROM t1 WHERE count =(SELECT count FROM t2);
子查询外部的语句可以是INSERT,UPDATE,DELETE,SELECT的任何一个。
②子查询分类
子查询结果不同分为:
标量子查询(子查询为单个值)
列子查询(子查询为一列)
行子查询(自查询为一行)
表子查询(子查询结果为多行多列)
根据子查询的位置分为:
WHERE之后
FROM之后
SELECT之后
③标量子查询
子查询返回结果是单个值(数字、字符串、日期),最简单的形式,这种 子查询称为标量子查询
常见的操作符:= <> >= < <=
SELECT * FROM emp WHERE dept_id = (SELECT id FROM dept where name = '销售部')
④列子查询
子查询返回的结构是一列(可以是多行),这种子查询称为列子查询
常用操作符: IN,NOT IN , ANY,SOME,ALL
SELECT * FORM emp WHERE dept_id IN (SELECT id FROM dept WHERE name = '销售部' OR name = "营销部");
⑤行子查询
子查询返回的结果是一行(可以是多列),这种子查询成为行子查询
常用操作符: =,<> ,IN,NOT IN
SELECT * FROM emp WHERE (salary,managerid) = (SELECT salary,managerid FROM emp WHERE name = '张无忌')
⑥表子查询
子查询返回的结果是多行多列,这种子查询称为表子查询
常用的操作符 IN
SELECT * FROM emp WHERE (job,salary) in (SELECT job,salary FROM emp WHERE name = '鹿杖客' or name = '宋远桥') 或者是 SELECT e.*,d.* FROM (SELECT * FROM emp WHERE entrydate > '2006-01-01') e LEFT JOIN dept d ON e.dept_id = d.id;
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
查看/设置事务提交方式
# 1代表自动提交 0代表手动提交 SELECT @@autocommit; SET @@autocommit = 0;
提交事务
COMMIT;
回滚事务
ROLLBACK
开启事务
START TRANSACTION 或者 BEGIN;
提交事务
COMMIT
回滚事务
ROLLBACK
1. 原子性:事务是不可分割的最小单元,要么全部成功,要么全部失败
2. 一致性:事务完成时,必须使所有数据都保持一致状态
3.隔离性:数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
4.持久性:事务一旦提交或回滚,它对数据库中的数据的改变是永久的
脏读:一个事务读取到另一个事务还没有提交的数据。
为什么一个事务可以读取到另一个事务还没有提交的数据? 目前主流的关系型数据库例如mysql、oracle都是基于文件系统进行数据存储的,即数据是持久化到文件系统的,但是基于文件系统的随机IO读写是非常慢的,故数据库都会引入内存池,完成对磁盘数据的缓存,提高读写效率 内存池是对所有线程共享的,也就是对所有数据库事务是共享的,所谓的未提交,指的是事务未提交,但此时数据已经存储在共享内存中,数据已经进入数据库服务器,所有是可见的。 脏读,是指的最终效果,其实是在数据库中对应读到未提交的数据。
当事务1,2需要访问同一条数据,事务2从数据库读取的数据是事务1未提交的数据,但当事务1回滚,导致事务2读到的数据并不是最终存储在数据库中的数据,导致所谓的脏读发生 这个是最低级别的隔离机制,此隔离级别基本不会在实际生产过程中使用
隔离界别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read uncommitted 读未提交 | 无法解决 | 无法解决 | 无法解决 |
Read committed 读已提交 | 解决 | 无法解决 | 无法解决 |
Repeatable Read (MySQL默认) 可重复读 | 解决 | 解决 | 无法解决 |
Serializable 串行化 | 解决 | 解决 | 解决 |
-- 查看事务的隔离级别 SELECT @@TRANSACTION_ISOLATION; -- 设置事务隔离级别 SET TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE} SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
注意:事务隔离级别越高,数据越安全,但是性能越低。