一、基础语法
5.select distinct id,name
1.from student as s join teacher as t on s.id=t.id
2.where name is not null and name like '%王'
3.group by id,sex
4.having count(*)>0
6.order by id desc
7.limit 0,5
二、关联查询
1.笛卡尔积
select * from student s,teacher t where s.id=t.id
2.内连接
select * from student s join teacher t on s.id=t.id
3.外连接
select * from student s left join teacher t on s.id=t.id
三、子查询
1.运算符in和exists对比
in是要结果集中存在就为true
exists判断某个子查询是否有结果集
2.all和any
all表示所有都满足 返回true
any表示任意一个满足 返回true
-- 表示含义是:age>all(子查询),表示age大于all子查询结果集中的所有成绩
select * from student s1
where s1.age>all(
select yuwen from student s2 where s2.best_friend=s1.id
)
四、SQL优化
SQL优化主要是针对查询语句,目的是提供查询效率。
除了SELECT语句之外,查询的调优技术也适用于诸如CREATE TABLE ..... AS SELECT
、INSERT INTO......SELECT
、和DELETE.....WHERE
语句中
主要理念有:
- 首先检查是否可以添加索引,提高查询效率
- 隔离和调优查询的任何部分,比如函数的应用次数
- 最小化全表扫描的数量
- 优化锁的问题
- 调整MySQL用于缓存的内存区域
- 多使用EXPLAIN
where条件优化
- 删除多余小括号
- 优化查询条件
- 简单条件写前面
五、索引
-
概述
索引是建立在表的一列或多列上的辅助对象。可以加快对表的访问速率。
-
作用
提高查询效率。但降低了增删改的效率。
-
索引的创建和删除
CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX 索引名称 USING {BTREE | HASH} on 表(哪些列) DROP INDEX 索引名称 ON 表名;
适用索引情况
-
主键自动建立唯一索引;
-
经常作为查询条件在WHERE或者ORDER BY 语句中出现的列要建立索引;
-
作为排序的列要建立索引;
-
查询中与其他表关联的字段,外键关系建立索引;
-
高并发条件下倾向组合索引;
不适用索引情况
- 经常增删改的列不要建立索引;
- 有大量重复的列不建立索引;
- 表记录太少不要建立索引;
-
六、事务
四大特征
-
原子性(Atomicity)
事务中的SQL要么都执行,要么就都不执行。不可分割。
-
一致性(Consistency)
SQL执行完后,事务提交前和提交后效果应该一致。如保证事务提交后,数据不会违反约束。
-
隔离性(Isolation)
多个事务之间应该相互不影响。
-
持久性(Durability)
一个事务一旦提交,它对数据库中数据的改变就应该是永久性的
四种事务隔离级别
-
读未提交
发生
脏读
-
读已提交(oracle、SqlServer等默认隔离级别)
解决
脏读
;发生不可重复读
-
可重复读
解决
不可重复读
;发生幻影读
-
可串行化
解决
幻影读