数据库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张表

 

内连接 (Inner Join)

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

大部分查询都是内连接;

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

 

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

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

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

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

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

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

交叉连接(CROSS JOIN)

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

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

SELECT
	* 
FROM
	Table1
	CROSS JOIN Table2

 

示例

示例一(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

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

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

示例二(Left Outer Join)

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

1、表关系为:

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

 

 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

 

示例三(CROSS JOIN)

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

 

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

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值