sql语句学习教程13_select_select查询_sql查询语句_sql连接查询
sql语句学习教程13_select_select查询_sql查询语句_sql连接查询
当需要对多个表或视图进行查询的时,需要使用连接查询,SQL的连接查询分为三大类:
自然连接
内连接
外边接:左外连接、右外连接、全外连接(MYSQL暂时不支持全外连接)
1.自然连接(natural join)
按照两个表之间,将具有相同的列名进行匹配,只有各列的值完全匹配的记录才会显示(如果有的列值为NULL,那么是会被认为不匹配)
fgedu.net@ mysql> select * from itpux11 natural join itpux12;
2.内连接(inner join)
最常见的查询连接方式,只有两个表之间指定条件且两边都匹配的记录才会显示,有三种实现方法:
1)on
fgedu.net@ mysql> select itpux11.name, itpux11.sex, itpux12.age
from itpux11 inner join itpux12 on itpux11.name=itpux12.name;
2)where
fgedu.net@ mysql> select itpux11.name, itpux11.sex, itpux12.age
from itpux11, itpux12
where join itpux12 on itpux11.name=itpux12.name;
3)using(用的比较少)
fgedu.net@ mysql> select itpux11.name, itpux11.sex, itpux12.age
from itpux11 inner join itpux12 using(name);
3.外连接-左外连接(left join/left outer join)
列出左边表全部的记录+右边表符合条件的,不符合条件的以空值代替。
fgedu.net@ mysql> select itpux11. name, itpuxl2. name, itpux11. sex, itpuxl2. age
from itpux11
left outer join itpux12 on itpux11.name=itpux12.name;
4.外连接-右外连接(right join/left outer join)
列出右边表全部的记录+左边表符合条件的,不符合条件的以空值代替。
fgedu.net@ mysql> select itpux11. name, itpuxl2. name, itpux11. sex, itpuxl2. age
from itpux11
right outer join itpux12 on itpux11.name=itpux12.name;
5.笛卡尔乘积(交叉连接,crosss join)
这是表与表之间没有限制关联条件,这种写法会导致返回一个A表记录数*B表记录数的一个结果集,逻辑上是有问题的,当然,用这种方式可以快速批量生成大量的测试数据。
fgedu.net@ mysql> select * from itpux11, itpux12;
6.半连接(semi join)
A匹配B,找到记录后返回A的第一条记录,B不返回记录,通常使用IN或exists使用。
fgedu.net@ mysql> select * from itpux11 natural join itpuxl2;
fgedu.net@ mysql> select * from itpuxll where exists(
select * from itpuxl2
where itpux11.name=itpux12.name and itpux12.ager>20)
order by name;
7.反连接(anti join)
多用于!=,not in等查询,条件满足不返回,条件不满足则返回。
fgedu.net@ mysql> select * from itpux12 where itpuxl2.age>20;
fgedu.net@ mysql> select * from itpux11 where name not in(select name from itpux12 where itpux12.age>20);
8.自连接(self join)
同一张表自己和自己连接,常见于子节点、父节点的连接操作。
fgedu.net@ mysql> select * from yg yl, yg y2
where y1.manager_id=y2.EMPLOYEE_ID and y1.last_name like 'R%';