SQL 99的连接查询与SQL 92 的连接查询原理基本相似,不同的是SQL 99 连接查询的可读性更强——查询用的多个数据表显式使用xxx join连接,而不是直接依次排列在from之后,from后只需要放一个数据表;连接条件不再放在where之后,而是提供了专门的连接条件子句。
创建两个表:
drop database if exists select_test;
create database select_test;
use select_test;
# 为了保证从表参照的主表存在,通常应该先建主表。
create table teacher_table
(
# auto_increment:实际上代表所有数据库的自动编号策略,通常用作数据表的逻辑主键。
teacher_id int auto_increment,
teacher_name varchar(255),
primary key(teacher_id)
);
create table student_table
(
# 为本表建立主键约束
student_id int auto_increment primary key,
student_name varchar(255),
# 指定java_teacher参照到teacher_table的teacher_id列
java_teacher int,
foreign key(java_teacher) references teacher_table(teacher_id)
);
insert into teacher_table
values
(null , 'AAA');
insert into teacher_table
values
(null , 'BBB');
insert into teacher_table
values
(null , 'CCC');
insert into student_table
values
(null , '张三' , 1);
insert into student_table
values
(null , '张三' , 1);
insert into student_table
values
(null , '李四' , 1);
insert into student_table
values
(null , '王五' , 2);
insert into student_table
values
(null , '_王五' , 2);
insert into student_table
values
(null , null , 2);
insert into student_table
values
(null , '赵六' , null);
teacher_table表:
student_table表:
1、交叉连接(cross join):交叉连接效果是SQL92中的广义笛卡尔积,所以交叉连接无须任何连接条件,如下SQL语句所示:(广义笛卡尔积的结果会有n*m条记录)
2、自然连接(natural join):自然连接表面上看起来也是无须指定连接条件,但自然连接是有连接条件的,自然连接会以两个表中的同名列作为连接条件;如果两个表中没有同名列,则自然连接与交叉连接效果完全一样——因为没有连接条件。如下SQL语句所示:
由于teacher_table与student_table没有同名列,所以与交叉连接的结果一样。
3、using 子句连接:using子句可以指定一列或多列,用于显式指定两个表中的同名列作为连接条件。假设两个表中有超过一列的同名列,如果使用natural join,则会把所有的同名列当成连接条件:使用using子句,就可显式指定使用哪些同名列作为连接条件。如下SQL语句所示:
运行上面语句将出现一个错误,因为student_table表中不存在名为teacher_id的列。也就是说,如果使用using子句来指定连接条件,则两个表中必须有同名列,否则就会出现错误。
4、on子句连接:这是最常用的连接方式,SQL 99语句的连接条件放在on子句中指定,而且每个on子句只指定一个连接条件。这意味着:如果需要进行N表连接,则需要有N-1个join...on对。如下SQL语句所示:
使用on子句的连接完全可以代替SQL 92 中的等值连接、非等值连接,因为on子句的连接条件除了等值条件之外,也可以是非等值条件。如下SQL语句就是SQL 语句就是SQL 99的非等值连接。
5、左、右、全外连接:这三个外连接分别使用left[outer]join、right[outer]join和full[outer]join,这三种外连接的连接条件一样通过on子句来指定,既可以是等值连接条件,也可以是非等值连接条件。
下面使用右连接,连接是非等值连接。
下面使用左外连接,连接条件是非等值连接
运行上面两条外连接语句并查看他们的运行结果,不难发现SQL 99 外连接与SQL 92外连接恰好相反,SQL 99左外连接会把左边表中所有不满足连接条件的记录列出;SQL 99 右外连接将会把右边表中所有不满足连接条件的记录全部列出。下面的SQL语句使用全外连接,连接条件是等值连接。
SQL 99的全外连接将会把两个表中所有不满足连接条件的记录全部列出。
注意:运行上面查询语句时会出现错误,这是因为MySQL并不是全外连接。
6、内连接:
(典型的连接运算,使用像 = 或 <> 之类的比较运算符)。包括相等连接和自然连接。
内连接使用比较运算符根据每个表共有的列的值匹配两个表中的行如下面的SQL语句: