MySQL基础

目录

1、数据查询语言(DQL)

1.1、基础查询(SELECT)

1.2、进阶查询

1.2.1、条件查询

1.2.2、排序与分页

1.2.3、聚合函数与分组

1.2.4、多表查询

2、数据控制语言(DCL)

2.1、用户管理

2.1.1、创建用户

2.1.2、删除用户

2.1.3、修改用户密码

2.2、权限管理

2.2.1、授权给用户

2.2.2、回收权限

2.2.3、刷新权限

3、事务控制语言(TCL)

3.1、事务的概念及特性

3.1.1、事务的概念

3.1.2、ACID特性

3.2、隔离级别

3.2.1、查看隔离级别

3.2.2、设置隔离级别

3.2.3、隔离级别类型

3.3、并发问题

3.4、事务的操作

3.4.1、事务的开启

3.4.2、事务的提交

3.4.3、事务的回滚

3.4.4、设置保存点


1、数据查询语言(DQL)

1.1、基础查询(SELECT)

sql 复制代码
#全列查询
select * from students;

#指定列查询
select id ,name from students;

#查询字段为表达式
select id,name,chinese+math+english from students;

#为查询结果去别名
select id,name.chinese+math+english as(可以省略) 总分 from students;

#查询结果去重
select distinct math from students;

1.2、进阶查询

1.2.1、条件查询

比较运算符

逻辑运算符

sql 复制代码
#查询总分大于200的同学
#这是错误的写法,因为前面的select是挑选最终要显示哪些列(列级筛选),where是筛选数据(行级筛选),顺序是先筛选出来再选择要显示哪些列,所以不认识'总分'
select name,chinese+math+enlish 总分 from student where 总分>200;

#正确写法
select name,chinese+math+english 总分 from student where chinese+math+english>200;

1.2.2、排序与分页

排序(ORDER BY)

sql 复制代码
#ASC 为升序排序
#DESC 为降序排序
#默认是ASC

SELECT ... FROM table_name [WHERE ...]  
ORDER BY column [ASC|DESC], [...]; 

实例:
select name,math from students order by math;

#注意排序时,如果涉及到NULL,认为NULL比任何值都要小

#查询学生的总分,由高到低显示
#这里的顺序是数据先选择要显示哪些列,再对选择的数据按指定列排序,所以认识'总分'
select name,chinese+math,english 总分 from students order by 总分 desc;

分页(LIMIT)

sql 复制代码
#起始下标为0

#从0开始,筛选n条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;

#从s开始,筛选n条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n;
或
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s; 

1.2.3、聚合函数与分组

聚合函数

只使用聚合函数查询时,指定查询的列不能出现没有参与聚合函数运算过程的列

分组(GROUP BY + HAVING

分组和聚合函数同时使用时,指定查询的列可以出现分组的列

sql 复制代码
select column1, column2, .. from table group by column;

#若在分组之后,还有筛选数据的条件,则搭配having使用,where不行
实例:查询员工表中,平均工资低于2000的部门和其平均工资
select deptno,avg(sal) mysal from emp group by deptno having mysal<2000;

1.2.4、多表查询

连接查询:

1.内连接:内连接实际上就是利用where子句对两种表形成的笛卡尔积进行筛选

sql 复制代码
select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件

2.左外连接:左外连接:如果联合查询时,左侧的表完全显示我们就说是左外连接

sql 复制代码
select 字段 from 表1 left join 表2 on 连接条件

3.右外连接:如果联合查询时,右侧的表完全显示我们就说是右外连接

sql 复制代码
select 字段 from 表1 right join 表2 on 连接条件

4.子查询:嵌套在另一个sql语句中的SELECT语句

单行子查询

sql 复制代码
SELECT name FROM user WHERE id = (SELECT MAX(id) FROM user);

多行子查询

·in关键字

sql 复制代码
#查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自己的
select ename,job,sal,deptno from emp 
    where job in (select distinct job from emp where deptno=10) and deptno<>10;

·all关键字

sql 复制代码
#显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
select ename, sal, deptno from EMP 
    where sal > all(select sal from EMP where deptno=30);

·any关键字

sql 复制代码
#显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门的员工)
select ename, sal, deptno from EMP 
    where sal > any(select sal from EMP where deptno=30);

多列子查询

sql 复制代码
#查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人
 select ename from EMP where (deptno, job)=
    (select deptno, job from EMP where ename='SMITH') and ename <> 'SMITH';

1.2.5、合并查询

union:用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。

sql 复制代码
#将工资大于2500或职位是MANAGER的人找出来
select ename, sal, job from EMP where sal>2500 union 
     select ename, sal, job from EMP where job='MANAGER';

union all:与union的唯一区别时,不会去掉结果集中的重复行

MySQL中查询各个关键字的执行顺序

from>on>join>where>group by>with>having>select>distinct>order by>limit

2、数据控制语言(DCL)

2.1、用户管理

MySQL中的用户,都存储在系统数据库mysql的user表中

可以通过SELECT来查询用户相关信息,包括host、user、authentication_string、*_priv

字段解释:

host:表示这个用户可以从哪个主机登陆,如果是localhost,表示只能从本机登陆

user:用户名

authentication_string:用户密码通过password函数加密后的

*_priv:用户拥有的权限

2.1.1、创建用户

sql 复制代码
create user '用户名'@'登录主机/ip' identified by '密码'

2.1.2、删除用户

sql 复制代码
drop user '用户名'@'主机名'

2.1.3、修改用户密码

sql 复制代码
#修改自己的密码
set password=password('新密码')

#root用户修改指定用户的密码
set password for '用户名'@'主机名'=password('新密码')

2.2、权限管理

2.2.1、授权给用户

sql 复制代码
#权限列表,多个权限之间用逗号隔开
grant 权限列表 on 库.对象名 to '用户名'@'主机名' [identified by '密码'];

#查看指定用户的现有权限
show grants for '用户名'@'主机名';

2.2.2、回收权限

sql 复制代码
revoke 权限列表 on 库.对象名 from '用户名'@'主机名'

2.2.3、刷新权限

sql 复制代码
#修改权限后执行
flush privileges;

3、事务控制语言(TCL)

3.1、事务的概念及特性

3.1.1、事务的概念

事务的概念:事务就是一组DML语句组成,这些语句在逻辑上存在相关性,这一组DML语句要么全部成功,要么全部 失败,是一个整体。事务可以是多条sql语句,也可以是一条。

在MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务。

3.1.2、ACID特性

1.原子性:事务要么全执行,要么全不执行

2.一致性:事务执行前后数据状态合法

3.隔离性:多个事务并发执行时互不干扰

4.持久性:事务提交后,修改用久保存到磁盘

3.2、隔离级别

MySQL服务可能会同时被多个客户端进程(线程)访问,访问方式以事务的方式进行。为了保证事务执行过程中尽量不受到干扰,就有了一个重要特征:隔离性。同时为了允许事务受到不同程度的干扰,就有了隔离级别。

3.2.1、查看隔离级别

sql 复制代码
#查看全局隔离级别
select @@global.transaction_isolation;

#查看会话(当前)隔离级别
select @@session.transaction_isolation;

select @@transaction_isolation;

3.2.2、设置隔离级别

sql 复制代码
#设置全局的隔离级别 当前会话不会立即生效,需要退出重新登录才会生效
SET GLOBAL TRANSACTION ISOLATION LEVEL 隔离级别;

#设置会话的隔离级别,仅当前连接生效,关闭连接后失效
SET SESSION TRANSACTION ISOLATION LEVEL 隔离级别;

3.2.3、隔离级别类型

1.读未提交(READ UNCOMMITED)

在该隔离级别,所有的事务都可以看到其他事务没有提交的执行结果。会有脏读、幻读、不可重复读等问题,同时不会加锁读。

2.读提交(READ COMMITED)

在该隔离级别,一个事务只能看到其他的已经提交的事务所做的改变。会有不可重复读、幻读问题,同时不会加锁读。

3.可重复读(REPEATABLE READ)

这是MySQL的默认隔离级别,它确保同一事务,在执行中多次读取操作数据时,会看到同样的数据行。会有幻读问题(insert的时候),同时不会加锁读。

4.串行化(SERIALIZABLE)

通过强制事务排序,使之不可能相互冲突。会加锁读,同时会产生超时和锁竞争问题。

3.3、并发问题

1.脏读:读取到其他事务未提交的修改

2.不可重复读:同一事务内多次查询同一数据,结果不同(其他事务修改并提交)

3.幻读:同一事务内多次执行统一查询,结果行数不同(其他事务插入/撒谎从删除并提交)

3.4、事务的操作

3.4.1、事务的开启

sql 复制代码
START TRANSACTION(或 BEGIN)

3.4.2、事务的提交

事务的提交方式分为:自动提交、手动提交

1.查看事务的提交方式以及修改事务的提交方式

sql 复制代码
#查看事务的提交方式
show variables like 'autocommit';

#修改事务的提交方式
set autocommit=值 (0表示禁止自动提交,1表示开启自动提交)

#若禁止自动提交,则需要commit方式手动提交
commit;

3.4.3、事务的回滚

sql 复制代码
#回滚到指定的保存点
rollback to '保存点'

#回滚到最初的状态
rollback

3.4.4、设置保存点

sql 复制代码
savepoint 保存点名字;

结论:

只要输入begin或者start transaction,事务便必须要通过commit提交,才会持久化,与是否设置set autocommit无关。

事务InnoDB每一条SQL语言都默认封装成事务,自动提交。

事务可以手动回滚,同时,当操作异常,MySQL会自动回滚。
事务操作注意事项:

如果没有设置保存点,也可以回滚,用rollback回滚到事务的开始。

如果一个事务被提交了,则不可以回退。

可以选择回退到哪个保存点。

相关推荐
JAVA+C语言4 小时前
MySQL 9.0 最新版本从安装到使用
mysql
龙亘川4 小时前
【课程5.1】城管住建核心功能需求分析:市政设施、市容秩序等场景痛点拆解
数据库·oracle·智慧城市·城管住建
飞鸟真人5 小时前
Redis面试常见问题详解
数据库·redis·面试
fanruitian5 小时前
Springboot项目父子工程
java·数据库·spring boot
super_lzb5 小时前
mybatis拦截器ParameterHandler详解
java·数据库·spring boot·spring·mybatis
吊睛白额鼠6 小时前
从Hive函数collect到MySQL函数group_concat
mysql
CV工程师的自我修养6 小时前
数据库出现死锁了。还不知道什么原因引起的?快来看看吧!
数据库
码界奇点6 小时前
灵活性与高性能兼得KingbaseES 对 JSON 数据的全面支持深度解析
数据库·json·es
2501_941871456 小时前
面向微服务链路追踪与全局上下文管理的互联网系统可观测性设计与多语言工程实践分享
大数据·数据库·python
luoluoal6 小时前
基于python的语音和背景音乐分离算法及系统(源码+文档)
python·mysql·django·毕业设计·源码