目录一、增删查改1.添加数据2.修改数据3.删除数据4.查询数据4.1 条件查询4.2 聚合函数4.3 分组查询4.4 排序查询4.5 分页查询二、多表查询1.笛卡尔积2.内连接3.外连接4.自连接5.联合查询6.子查询6.1 列子查询6.2 行子查询6.3 表子查询三、SQL执行顺序四、分表一、增删查改1.添加数据insert into 表名(字段名1,字段名2...)values(值1,值2...);2.修改数据update 表名 set 字段名1值1,字段名2值2where...;3.删除数据delete from 表名 where...4.查询数据4.1 条件查询select[distinct]字段名1,字段名2from 表名 where...4.2 聚合函数select 聚合函数(字段列表)from 表名4.3 分组查询select 字段列表 from 表名[where 条件]group by 分组字段[having 分组后过滤条件]其中having是分组之后进行过滤的所以相较于where在分组之前进行过滤having可以对聚合函数过滤。select gender,avg(age)from emp where age18group by gender havingavg(age)204.4 排序查询select 字段列表 from 表名[where 条件]order by 字段1排序方式1,字段2排序方式2;ASC升序默认值DESC降序多字段排序时先对第一个字段排序第一个字段相同时再对第二个字段排序。4.5 分页查询select 字段列表 from 表名[where 条件]limit 起始索引,查询行数;起始索引从0开始起始索引(查询页码-1)×每页的行数如果查询的是第一页数据起始索引可以省略简写为limit 查询行数二、多表查询1.笛卡尔积多表查询时如果没有指定条件那么查询结果就是笛卡尔积。例如A表有2条数据B表有4条数据那么笛卡尔积就是2×48条数据。select*from a,b;2.内连接内连接查询的是两张表的交集部分。也就是说当表A/表B中的数据在表B/表A中没有匹配项时不会输出。隐式内连接select a.name, b.name from a, b where a.b_nameb.name;显式内连接select a.name, b.name from a inner join b on a.b_nameb.name;3.外连接左外连接查询的是左表所有数据两张表的交集。右外连接查询的是右表所有数据两张表的交集。也就是说当表A中的数据在表B中没有匹配项时使用左外连接也会输出当表B中的数据在表A中没有匹配项时使用右外连接也会输出。左外连接select a.name, b.name from a left join b on a.b_nameb.name;右外连接select a.name, b.name from a right join b on a.b_nameb.name;在实际开发中想要哪张表的所有信息就以该表作为主表。4.自连接自连接查询的是同一张表例如同一张表记录了id和领导id那么查询所有员工的信息及其领导信息就需要用自连接。自连接可以用内连接也可以用外连接具体看需求。自连接需要对表起别名因为需要看成两张表。select*from emp a,emp b left join on a.manager_idb.id;5.联合查询联合查询可以把多次查询的结果在行上合并起来形成一个新的结果集。select*from emp where salary5000unionall select*from emp where age50union还会将查询结果合并之后去重。6.子查询6.1 列子查询子查询返回的是1列n行数据常用操作符in在子查询集合内满足其一not inany: 在子查询集合内满足其一一般配合号使用all子查询集合内满足所有一般配合号使用6.2 行子查询子查询返回的是1行n列数据常用操作符不等于in在子查询集合内满足其一not in6.3 表子查询子查询返回的是n行n列数据常用操作符in在子查询集合内满足其一select * from emp where (job, salary) in (子查询select job, salary from …)三、SQL执行顺序建立连接-语法解析-判断字段是否存在-调整SQL例如调成联合查询为最左前缀生成SQL最佳执行路径-根据最佳执行路径操作存储引擎先查缓冲池查不到再磁盘I/O查对应索引。from-join-on-where-group by-having-select-distinct(条件函数)-limit四、分表单表行数超过500w或单表空间超过2GB就要进行分表。