首先要建两张有外键关系的表
-- 学生表
CREATE TABLE IF NOT EXISTS `student`(
`id` INT (4) NOT NULL AUTO_INCREMENT COMMENT'学号',
`name` VARCHAR (10) COMMENT '姓名',
`sex` VARCHAR(2) NOT NULL DEFAULT'男' COMMENT'性别',
PRIMARY KEY (`id`)
) ENGINE = INNODB DEFAULT CHARSET = utf8
-- 成绩表
CREATE TABLE IF NOT EXISTS `score`(
`s_id` INT(4) NOT NULL AUTO_INCREMENT REFERENCES student(`id`) ,
`s_name` VARCHAR (10) COMMENT'班级号',
`sco` VARCHAR(4) NOT NULL DEFAULT'未录入' COMMENT'分数',
PRIMARY KEY (`s_id`)
)ENGINE = INNODB DEFAULT CHARSET = utf8
首先看一下我这两张表,有助于理解下面的查询
score表
student表
可以看到这两张表的数据量是不同的
对两张表进行7种方式的联表查询
第一种:INNER JOIN 内连接
光看这个单词也知道 (inner 中心的 )查的应该是两张表共有的
sql指令
SELECT *FROM student st INNER JOIN score sc ON st.`id` = sc.`s_id`
查询结果
有些人可能看这张查询结果图不明白为什么 说 inner join查询 是两张表共有的,详细解释一下
ON st.`id` = sc.`s_id`
看sql指令 是在这两张表种查询 st.id
= sc.s_id
的数据,只要是满足这个条件,也就是说两张表种都有这个数字编号的都会被查出来,不满足则不显示,而不是说 只能查出两张表共有的字段列
第二种: RIGHT JOIN 右外连接
sql指令
SELECT *FROM student st RIGHT JOIN score sc ON st.`id` = sc.`s_id`
查询结果
通俗来讲 就是以右边的表为主(right join 后面跟的那张表)进行查询 ,左边没有的 就是显示为空
同样的 left join查询 也是如此
第三种:LEFT JOIN 左外连接
sql 指令
SELECT *FROM score sc LEFT JOIN student st ON st.`id` = sc.`s_id`
这里我只是把两张表的前后顺序换了换,right join 换成left join
查询结果
第四种:左连接
SELECT *FROM score sc LEFT JOIN student st ON st.`id` = sc.`s_id` WHERE st.`id` IS NULL
查询结果
表示score表独有的部分
第五种 右连接
sql指令
SELECT *FROM score sc RIGHT JOIN student st ON st.`id` = sc.`s_id` WHERE sc.`s_id` IS NULL
查询结果
因为student 表只有7个数据,所以查询结果没有任何东西
第六种 :全连接
sql指令
SELECT *FROM score sc RIGHT JOIN student st ON st.`id` = sc.`s_id`
UNION
SELECT *FROM score sc LEFT JOIN student st ON st.`id` = sc.`s_id`
查询结果
这个也就 可以算是把两张表结合到一张表上
第七种 相当于把左外连接和右外连接结合
sql指令
SELECT *FROM score sc RIGHT JOIN student st ON st.`id` = sc.`s_id` WHERE sc.`s_id` IS NULL
UNION
SELECT *FROM score sc LEFT JOIN student st ON st.`id` = sc.`s_id` WHERE st.`id` IS NULL
查询结果
这种查询相当于两张表各自特有部分的并集了。