本文介绍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