mysql的7种join理论

一、复习:

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


你可能感兴趣的:(数据库,mysql)