一、复习:
1、创建索引的格式:
表名》user 列名》id,name,sex,email
单列索引:create index idx_user_name on user(name);
组合索引:create index idx_user_nameEmail on user(name,email);
2、select查询顺序
from>on>join/where>group by>having>select>distinct>order by>limit
3、SQL解析过程:
二、SQL执行慢(执行时间长,等待时间长)的原因
- 查询语句写的烂
- 索引失效
- 关联查询太多的join(数据表设计缺陷or需求要求)
- 服务器调优及各个参数设置(缓冲、线程数等)
三、JOIN查询
1、select 查询顺序(见 复习部分)
2、join关系图
3、7种join关系SQL(见图)
3.1 左连接 (
left join)
3.1.1 一般情况下的左连接
sql: select * from A
left join
B on A.
key
=B.
key;
说明:A是主表,保留所有信息,当B表中的数据跟A表无关时,B表相关的显示列补NULL
3.1.2 特殊的左连接
sql: select * from A
left join
B on A.
key
=B.
key
where B.
key
is NULL;
说明:查询A表中跟B表无关联关系的数据,即A独占,且B表的显示列补NULL
3.2 右连接
(
right join)
3.2.1 一般情况下的右连接
sql: select * from A
right join
B on A.
key
=B.
key;
说明:B是主表,保留所有信息,当A表中的数据跟B表无关时,A表相关的显示列显示内容为NULL
3.2.2 特殊情况下的右连接
sql: select * from A
right join
B on A.
key
=B.i
key
where A.key is null;
说明:B是主表,表示查询B表中跟A表无关联关系的数据
3.3 内连接 (
inner join)
sql:select * from A
inner join
B on A.key = B.key;
说明:查询A表中跟B表有关联关系的数据(跟B表无关的数据不显示)
3.4 外连接(
full outer join),注:mysql
用union关键字(合并去重复)
3.4.1 一般情况下的外连接
sql: select * from A
full
outer join
B on A.key=B.key;
说明:mysql不支持这种语法,oracle支持。那么在mysql中的sql如何写呢?
A独有+AB共有+B独有,
用union关键字(合并去重复)
mysql 的实现:
select * from A left join B on A.key = B.key;
union
select * from A right join B on A.key = B.key;
3.4.2 特殊情况下的外连接
sql: select * from A outer join B on A.key = B.key where A.key is NULL or B.key is NULL ;
说明:感觉条件中的or有点问题,当A.key=1,但B表中并没有B.key=1的时候,这条数据是要显示出来的吧?这里应该用的是and吧?
表示A独占,加上 B独占部分的内容
mysql 的实现:
select * from A left join B on A.key = B.key where B.key is NULL;
union
select * from A right join B on A.key = B.key where A.key is NULL;
4