mysql 连接
内连接
关键字:inner join
含义:内连接需要区分左表和右表,出现在join关键字左边的就是左表,反之就是右表!
数据在左表中存在,同时在右表中又有对应的匹配的结果才会被保存!如果没有匹配上,我们就认为数据没有意义,也就不会保存
语法规则:
select *|字段列表 from 左表 inner join 右表 on 左表.字段=右表.字段;
注意:1.内连接的本质还是在做交叉连接,只不过是在交叉连接的基础之上加上一定的连接条件!符合连接条件的才会被显示,不符合的就不显示
2.内连接中的inner join可以写成join,inner可以省略,默认的就是内连接
3.当左表和右表进行匹配的字段名相同的时候,字段名的前面必须加上表名
4.表名一般都很长,可以用别名来代替
5.on是指定条件的关键字,所以也可以使用where代替,但是使用on的效率更高
外连接
外连接又可以分成左外连接和右外连接!
左外连接
关键字:left outer join
跟内连接一样,也是拿左表的每一条记录按照on后面的条件去匹配右表,如果匹配成功,那么就保留两张表的所有的记录,如果匹配失败(也就是左表的一条记录无法匹配右表的所有的记录),此时,只保留左表的记录,右表的记录全部用null代替,此时左表也叫作主表!
右外连接
关键字:right outer join
跟内连接一样,也是拿左表的每一条记录按照on后面的条件去匹配右表,如果匹配成功,那么就保留两张表的所有的记录,如果匹配失败(也就是右表的一条记录无法匹配左表的所有的记录),此时,只保留右表的记录,左表的记录全部用null代替,此时右表也叫作主表!
注意:
1,left outer join和right outer join中的outer是可以省略的!所以左外连接也叫作左连接,右外连接也叫作右连接!
2,这里的关键字on就不能用where来代替了!
自然连接
关键字:natural join
含义:所谓的自然连接,其实就是“自动连接”,指的是两个或多个表之间在进行连接查询的时候,系统会自动的去匹配连接条件,而不需要人为的指定,从形式上看,也是没有on关键字了!
自动匹配的规则如下:
只要两张表中具有相同的字段名,系统就认为是一个连接条件,就会主动的去匹配这两个相同的字段名的值是否相同,如果两个表的相同的字段名的值相同,就认为匹配成功;如果两张表中有多个字段名相同,则所有相同的字段名的值都要相同才算是匹配成功!
所以,自然连接的本质跟前面的内连接和外连接没有太大区别,只是这里的连接条件不是由用户来指定,而是由系统来指定罢了!
既然连接查询可以分成内连接和外连接,所以,自然连接也可以分成自然内连接和自然外连接!
自然内连接
语法:
左表 natural inner join 右表
自然内连接其实就是内连接,只是这里的条件是由系统自动指定的
查询的记录其实是一样的,因为此时,内连接中用户指定的匹配条件跟自然内连接中由系统指定的条件刚好一样,只是自然内连接会主动的删除重复的那一列而且将重复的那一列放在最前面!
自然外连接
语法形式:
左表 natural left|right join 右表
自然外连接其实就是外连接,只是这里匹配条件也是由系统自动指定罢了!
子查询(标量子查询)
方法1:
select * from 表名 order by 字段列表 desc limit 值
方法2:
select * from 表名 where 字段列表= (select max(分数字段列表) as 别名 from 表名)
分类:
单一值:也就是返回单行单列的子查询,也叫作标量子查询!
一列:也就是返回单列的子查询,也叫作列子查询!
一行:返回一行的子查询就叫作行子查询!
多行多列:其实也叫作表子查询!
列子查询
方法1:
select 字段列表 from 表名 where 字段列表 is not null;
方法2:
select * from 表名 where 字段列表 in (select 字段列表 from 表名 where 字段列表 is not null);
行子查询
语法形式:
select * |字段列表 from 表名 where (字段1,字段2....)=(行子查询结果)
表子查询
语法形式:
select *|字段列表 from 子查询结果 as 别名 where 字句.....
exists子查询
exists主要是用来做判断的,返回的结果是一个布尔值!
判断依据:
如果子查询可以返回数据,那么exists的结果就是true,否则就是false!
exists的主要作用就是判断后面的select语句有没有查询到数据!