-
首先创建一个测试的数据库
create database multi_table_query default character set utf8;
-
在创建两张测试表
mysql> use multi_table_query
Database changed
mysql> create table student(
id int primary key auto_increment,
name varchar(50));
Query OK, 0 rows affected (0.29 sec)
mysql> create table course(
id int primary key auto_increment,
name varchar(50),
stu_id int null);
Query OK, 0 rows affected (0.29 sec)
-
给两张表插入数据
一 多表连接查询
1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用','
SELECT * FROM table1 CROSS JOIN table2
SELECT * FROM table1 JOIN table2
SELECT * FROM table1,table2
如:
由于其返回的结果为被连接的两个数据表的乘积,因此当有WHERE, ON或USING条件的时候一般不建议使用,因为当数据表项目太多的时候,会非常慢。一般使用LEFT [OUTER] JOIN或者RIGHT [OUTER] JOIN.
2.内连接INNER JOIN 在MySQL中把INNER JOIN叫做等值连接,即需要指定等值连接条件在MySQL中CROSS和INNER JOIN被划分在一起。
例如:查询每个学生对应的课程
sql语句:
select
c.id,s.name,c.name
course from
student as s left join course as c
on s.id = c.stu_id;
二 表连接的约束条件
1. WHERE子句
SELECT * FROM table1,table2 WHERE table1.id=table2.id;
如:
2. ON
SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id;
SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id
LEFT JOIN table3 ON table2.id=table3.id;
如:
基本的JOIN用法
1.内连接
select s.name,c.name from student s,course c where s.id = c.id;
上面的这条语句和下面这两条语句等价:
select s.name,c.name from student s cross join course c on s.id = c.id;
select s.name,c.name from student s inner join course c on s.id = c.id;
2.外左联结与外右连接
select s.name,c.name from student s left join course c on s.id = c.id;
select s.name,c.name from student s right join course c on s.id = c.id;
所以从上面结果看出,因为course表中的后三条记记录的ID没有在student表中有对应ID,因此为空,但课程栏仍有后三条记录。
MySQL联结查询中的某些参数的作用
1.USING (column_list):其作用是为了方便书写联结的多对应关系,大部分情况下USING语句可以用ON语句来代替,如下面例子:
a LEFT JOIN b USING (c1,c2,c3);
其作用相当于下面语句
a LEFT JOIN b ON a.c1=b.c1 AND a.c2=b.c2 AND a.c3=b.c3;