SQL快速复习

最近在准备考研的复试,花几天时间快速复习一下SQL
推荐一个快速学习网站:http://xuesql.cn/
上面可以在线编程练习,解析只要8.8,还会送一本《SQL必知必问》
(麻烦付一下广告费,啊!喂!!

事务的概念:事务是单个逻辑单元执行的一系列操作,要么全部成功,要么全部失败,一个事务可以是一条sql,也可以是一组sql
事务的四个特点:
ACID 分别是 原子性,一致性,隔离性,持久性

并发一致性问题
1.丢失修改
例子:thread1: write a=1;thread2:write a=2;覆盖掉了前面的修改
2.读脏数据
例子:thread1:read a=1;thread1:修改a=2;thread2:read a=2
3.不可重复读
例子:thread1:read a=1;thread2: 修改a;thread1 read a=2;
4.幻影读
例子:thread1:count(List)=100;thread2:List.add(“1”);thread1:count(List)=101
3和4有相似之处,3是中途修改数据,4是中途插入数据
参考很生动的博客
https://my.oschina.net/bigdataer/blog/1976010

不可重复读和幻读的区别
不可重复读是B修改了A的数据,此时A不知情
幻读是 B是旁观的读者,A自己修改了自己的数据,此时B不知情
MVCC多版本并发控制 Multi-Version Concurrency Control
可以实现提交读可重复读这两种隔离级别

sql基本板子:
最经典的六行

SELECT column_1,column_2... AS column_new_name1,column_new_name2
FROM TABLE1
INNER JOIN/LEFT JOIN/RIGHT JOIN/FULL JOIN TABLE2 ON blabla
WHERE TABLE1.column_x=TABLE2.column_y
ORDER BY... ASC/DESC
LIMIT ... OFFSET ...

通配符:
LIKE:为了能在搜索句子中使用通配符,必须使用LIKE
%:匹配0~n个字符
_:匹配1个字符

外连接:
左连接,右连接,内连接,全连接:很好理解,用韦恩图看A B关系

三个范式:
第一范式1NF:数据表每一列都是不可分割的原子数据项
第二范式2NF:每一列都必须和主键相关,不能和主键的部分相关
第三范式3NF:确保数据表每一列和主键直接相关,不能间接相关

四种隔离级别
1.未提交读:允许别的事务,去读这个事务未提交之前的数据
read uncommited可能出现脏读
2.提交读:一个事务所做的修改在提交之前对其他事务是不可见的
read commit解决了脏读,可能出现 不可重复读
3.可重复读:同一个事务在多次读取同一数据的结果是一样的
解决了 不可重复读,可能出现幻读
注:MySQL的默认隔离级别就是 Repeatable read
4.可串行化:逐个执行事务提交了之后才会继续执行下一个事务
事务顺序执行,可以避免幻读

最后写一下查询执行顺序
大的框架是 SELECT... FROM... WHERE...
之后是两个筛选 GROUP BY... HAVING...
最后是排序和查找的索引范围 ORDER BY ...LIMIT

SELECT DISTINCT column, AGG_FUNC(column_or_expression),FROM mytable
    JOIN another_table
      ON mytable.column = another_table.column
    WHERE constraint_expression
    GROUP BY column
    HAVING constraint_expression
    ORDER BY column ASC/DESC
    LIMIT count OFFSET COUNT;

where和having的区别
where后面跟的是数据表里面存在的字段
having是从已经筛选出来的字段中进行再筛选

SELECT选择多个列,列于列之间要加逗号(,)
多条SQL语句必须用分号(;)分隔
使用DISTINCT关键字,放在列前面,返回唯一值的列(筛取重复值)

LIMIT a,b的理解:跳过 a行,从第a+1行开始读,都取b行数据
limit a offset b的理解:隔开b行,从b+1行开始读取a行数据

猜你喜欢

转载自blog.csdn.net/weixin_39666736/article/details/104530984