数据库SQL查询(二)之连接查询

本文介绍SQL查询,如何在海量数据中筛选想要数据;

数据库管理系统选择:关系型数据库mysql

数据库管理工具选择:navicat

本文中查询语句和查询案例参考自:https://edu.csdn.net/course/detail/27673?ops_request_misc=&request_id=&biz_id=105&utm_term=SQL&utm_medium=distribute.pc_search_result.none-task-course-2~course~sobaiduweb~default-3-27673.pc_edu_default&spm=1018.2226.3001.4453
 

目录

连接查询

认识几种连接类型

内连接 (Inner Join)

外连接--左外连接 (Left Outer Join)

外连接--右外连接 (Right Outer Join)

交叉连接(CROSS JOIN)

示例

示例一(Inner Join)

示例二(Left Outer Join)

示例三(CROSS JOIN)


连接查询

将多张表(至少两张)按照某个连接条件连接成一张大表,在大表中执行查询;

本文为SQL99标准的写法

认识几种连接类型

准备2张表

数据库SQL查询(二)之连接查询_第1张图片

数据库SQL查询(二)之连接查询_第2张图片 

内连接 (Inner Join)

按照连接条件进行连接,满足条件的显示在大表中,不满足的隐藏;

大部分查询都是内连接;

SELECT
	* 
FROM
	Table1
	INNER JOIN Table2 ON Table1.SNo = Table2.SNo

数据库SQL查询(二)之连接查询_第3张图片 

外连接--左外连接 (Left Outer Join)

Left左边的表为主表,按照连接条件在右边的表中匹配数据,匹配上的直接显示在大表中,匹配不上的显示null;

SELECT
	* 
FROM
	Table1
	LEFT OUTER JOIN Table2 ON Table1.SNo = Table2.SNo

数据库SQL查询(二)之连接查询_第4张图片

外连接--右外连接 (Right Outer Join)

Right右边的表为主表,按照连接条件在左边的表中匹配数据,匹配上的直接显示在大表中,匹配不上的显示null;

SELECT
	* 
FROM
	Table1
	RIGHT OUTER JOIN Table2 ON Table1.SNo = Table2.SNo

数据库SQL查询(二)之连接查询_第5张图片

交叉连接(CROSS JOIN)

返回被连接的两个表所有数据行的笛卡尔积;

主要目的是为了组合数据;

SELECT
	* 
FROM
	Table1
	CROSS JOIN Table2

数据库SQL查询(二)之连接查询_第6张图片 

示例

示例一(Inner Join)

-- 查询陈鹏借了哪些书

(在数据库SQL查询(一)中,我们用嵌套查询实现了这个需求,在此处我们用连接查询实现这个需求,看看有什么不同;)

1、表关系如下图所示:

2、先把3张表连接为一张大表

SELECT
	* 
FROM
	Student
	INNER JOIN BorrowBook ON BorrowBook.SNO = Student.SNO
	INNER JOIN Book ON Book.BookID = BorrowBook.BookID

数据库SQL查询(二)之连接查询_第7张图片

 3、再从这张大表中筛选条件满足数据

SELECT
	BookName 
FROM
	Student
	INNER JOIN BorrowBook ON BorrowBook.SNO = Student.SNO
	INNER JOIN Book ON Book.BookID = BorrowBook.BookID 
WHERE
	sname = '陈鹏'

数据库SQL查询(二)之连接查询_第8张图片

示例二(Left Outer Join)

-- 统计出借书库存情况 
/*
     图书编号    图书名称    入库量    被借量
        -------------------------------------------------
       39001    Mysql数据库     15           6    
*/

1、表关系为:

数据库SQL查询(二)之连接查询_第9张图片

2、 这里表连接之前,分析:

book表中有3个值可以直接得到;

borrowbook表中想要得到被借量,需要分组查询,用分组后的新表 重命名(AS)后,与book表进行连接;

Left Outer Join中的outer可以省略;

SELECT
	* 
FROM
	Book
	LEFT JOIN ( SELECT BookID, COUNT(*) AS num FROM BorrowBook GROUP BY BookID ) AS nums ON nums.BookID = Book.BookID

 数据库SQL查询(二)之连接查询_第10张图片

 3、得到大表后,被借量num列,有null数据,代表这本书没有被借过,用0代替(用ifnull函数)

SELECT
	Book.BookID AS '图书编号',
	BookName AS '图书名称',
	BookIncoming AS '入库量',
	IFNULL( num, 0 ) AS '被借量' 
FROM
	Book
	LEFT JOIN ( SELECT BookID, COUNT(*) AS num FROM BorrowBook GROUP BY BookID ) AS nums ON nums.BookID = Book.BookID

 数据库SQL查询(二)之连接查询_第11张图片

示例三(CROSS JOIN)

-- 统计出哪些学生的哪些科目缺考

数据库SQL查询(二)之连接查询_第12张图片

 

SELECT
	* 
FROM
	( SELECT * FROM Stu CROSS JOIN Course ) AS T1
	LEFT JOIN Score ON T1.SNO = Score.SNo 
	AND T1.CNo = Score.CNo 
WHERE
	Result IS NULL

数据库SQL查询(二)之连接查询_第13张图片

你可能感兴趣的:(#,mysql,数据库,sql)