mysql多表连接查询

  • 首先创建一个测试的数据库
 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)
  • 给两张表插入数据

mysql多表连接查询_第1张图片

一 多表连接查询

1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用','

SELECT * FROM table1 CROSS JOIN table2  
SELECT * FROM table1 JOIN table2  
SELECT * FROM table1,table2 

如:

mysql多表连接查询_第2张图片

由于其返回的结果为被连接的两个数据表的乘积,因此当有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;
mysql多表连接查询_第3张图片
查询结果

二 表连接的约束条件

1. WHERE子句

SELECT * FROM table1,table2 WHERE table1.id=table2.id; 

如:

mysql多表连接查询_第4张图片

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; 

如:

mysql多表连接查询_第5张图片

基本的JOIN用法

1.内连接

select s.name,c.name from student s,course c where s.id = c.id;
mysql多表连接查询_第6张图片

上面的这条语句和下面这两条语句等价:

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;
mysql多表连接查询_第7张图片

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;
mysql多表连接查询_第8张图片

所以从上面结果看出,因为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;

2.NATURAL [LEFT] JOIN:这个句子的作用相当于INNER JOIN,或者是在USING子句中包含了联结的表中所有字段的Left JOIN(左联结)。

3.STRAIGHT_JOIN:由于默认情况下MySQL在进行表的联结的时候会先读入左表,当使用了这个参数后MySQL将会先读入右表,这是个MySQL的内置优化参数,大家应该在特定情况下使用,譬如已经确认右表中的记录数量少,在筛选后能大大提高查询速度。

你可能感兴趣的:(mysql多表连接查询)