今天回到家有点晚了,本来是想一篇把几个常用的JOIN全部写出来,但怕影响睡觉的质量,就分开来写了。连接是关系型数据库的主要特点,连接查询是关系型数据库中最主要的查询,主要包括内连接、外连接。通过连接运算符可以实现多个表查询。主要就是介绍下面这三个语句的用法,这一篇介绍INNERJOIN。
-INNERJOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录
-LEFTJOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录
-RIGHTJOIN(右连接):与LEFTJOIN相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
关系型数据库就是对表的连接、筛选和投影三个操作,筛选出满足条件的数据。然后对数据进行聚合、运算等操作。所以连接是第一步,而很多连接都是存在于逻辑当中,因为不需要展示出来所有的连接结果,也没有必要,但是我们大脑中一定要有一张完整的大表,后面的操作才不会乱。所以这里还是先介绍一下笛卡尔积,可以通过这一篇看一下介绍和Python的实现方式(Python_笛卡尔积)。下面是MYSQL中实现笛卡尔积,就是不加任何条件形成一张大表,数据是下面这两张,一个9行学生表,一个5行班级表,生成一张9*5=45的笛卡尔积表。
SELECT
*
FROM
student,
class;
INNERJOIN内连接的语法格式如下:
SELECT字段名FROM表1INNERJOIN表2[ON子句]
-字段名:需要查询的字段名称。
-表1表2:需要内连接的表名。
-INNERJOIN:内连接中可以省略INNER关键字,只用关键字JOIN。
-ON子句:用来设置内连接的连接条件。
上面的笛卡尔积也可以通过INNERJION实现,语法如下↓
SELECT
*
FROM
student
INNERJOINclass;
一般情况下我们会筛选出符合条件,有意义的字段。可以发现,因为Jack是班,而班级表里面没有班,所以加了条件之后,Jack的信息就没有被筛选出来。
SELECT
*
FROM
studentass
INNERJOINclassasc
WHERE
s.s_class_id=c.c_id;
INNERJOIN可以使用WHERE子句指定连接条件,但是INNERJOIN...ON语法是官方的标准写法,而且WHERE子句在某些时候会影响查询的性能。所以上面的语句可以这么写↓
SELECT
*
FROM
studentass
INNERJOINclassascONs.s_class_id=c.c_id;
也可以指定查询的列,如果只需要查询姓名、班级名称和教室地址,就可以这么写↓
SELECT
s.s_nameAS学生姓名,
c.c_nameAS班级,
c.c_addAS教室
FROM
studentass
INNERJOINclassascONs.s_class_id=c.c_id;
多张表查询,这里使用三张表进行查询,再加一个课程表格。
SELECT
*
FROM
studentass
INNERJOINclassascONs.s_class_id=c.c_id
INNERJOINcourseascoONco.c_id=c.c_id
End