Skip to content

SQL

SQL是一个结构化的查询语言,是一种特殊的编程语言,它可以用来执行数据库操作。并不是MySQL的专属语言,但是它是MySQL的基本语法。

SQL的分类

  • DQL:数据查询语言;是SQL语言中负责进行查询但是不会对数据本身修改的语句,这是最基本的SQL语句(查寻)
  • DDL:数据定义语言;是SQL语言集中负责数据结构定义与数据库对象定义的语句(创建、删除)
  • DML:数据操纵语言;是SQL语言中负责对数据库对象运行运行数据访问工作的指令集(增、删、改)
  • DCL:数据控制语言;是SQL语言中对数据访问权限进行控制的指令,它可以控制特定账户对数据库的访问权限
  • CCL:指针控制语言;它的语句能够确保被DML语句影响的表的所有行即时更新
  • TPL:数据事务管理语句

SQL执行顺序

格式:SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ... LIMIT ...

执行顺序:FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY -> LIMIT

数据库

可以使用以下命令登录数据库:

sql
mysql -u(账号) [-h主机] -p

本地可以直接使用root账户登录,但是在远程登录的时候不可以直接使用root账户登录数据库。需要开启远程权限

可开启远程权限:

  1. 先在本地使用root账户登录MySQL
  2. use mysql;
  3. update user set host='%' where user='root';
  4. flush privileges;

基本命令

  • select version();:查看MySQL版本
  • source 文件地址:执行SQL脚本文件
  • show status like 'Threads%';:查看线程数

数据库

  • show databases:查看所有数据库
  • create database 数据库名:创建数据库
  • use 数据库名:切换数据库
  • drop database 数据库名:删除数据库
  • select database():查看当前使用的数据库
  • show create database 数据库名:查看数据库创建语句

  • show tables:查看所有表
  • create table 表名(...):创建表
  • drop table 表名:删除表
  • truncate table 表名:删除表数据
  • desc 表名:查看表结构
  • show create table 表名:查看表创建语句

简单操作

  • select * from 表名:查看表所有数据
  • insert into 表名 values(值1,值2,...):插入数据
  • update 表名 set 列名=值 where 条件:更新数据
  • delete from 表名 where 条件:删除数据

SQL语句的注意事项:

  1. 每条SQL语句都要以;结尾
  2. SQL语句不区分大小写

数据库三范式

  • 第一范式(1NF):每一个字段不可再拆分,具有原子性
  • 第二范式(2NF):一张表只描述一个关系
  • 第三范式(3NF):一张表中的其他字段都必须依赖主键,字段之间不能传递依赖,不能存才a-->b-->c

ACID - 事务四大特性

原子性(Atomicity):一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

一致性(Consistency):一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。一致性与原子性是密切相关的。以转账举例:假设张三和李四两者的钱加起来一共是100,那么不管张三和李四之间如何转账,转几次账,事务结束后两个用户的钱相加起来都应该还是100,这就是事务的一致性。

隔离性(Isolation):一个事务的执行不能被其他事务干扰。比如多个用户对同一张表进行操作时,数据库为每一个用户开启一个事务,不能被其他事务干扰,多个并发事务之间是相互隔离的。

持久性(Durability):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

并发事务不隔离产生的问题

脏读:指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据

不可重复读:不可重复读是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务在修改同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,导致第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读

幻读:幻读是指当事务不是独立执行时发生的一种现象。第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样

事务的四大隔离级别

级别名字隔离级别脏读不可重复读幻读
1读未提交read uncommitted
2读已提交read committed
3可重复读repeatable read
4串行化serializable

MySQL默认是第 3 级别

说明:

  • 读未提交:脏读、不可重复读、幻读问题都没有解决,一般不设置
  • 读已提交:可以解决脏读问题,不可重复读和幻读问题没有解决,Oracle和SQL Server默认隔离级别就是读已提交
  • 可重复读:可以解决脏读和不可重复读问题,没有解决幻读问题,MySQL默认隔离级别就是可重复读
  • 串行化:可以解决脏读、不可重复读和幻读问题,如果设置了串行化隔离级别,一个事务操作时,别的事务就无法操作,需要等待当前事务执行完,才能继续操作

从事务安全性角度考虑:串行化 > 可重复读 > 读已提交 > 读未提交

从事务执行效率角度考虑:读未提交 > 读已提交 > 可重复读 > 串行化

设置隔离级别

SQL语句描述
show variables like '%isolation%';查看当前数据库隔离级别
set session transaction isolation level 级别字符串;临时修改隔离级别