1.1 需求分析
需求 : 根据需求查询商品类别表和商品表的数据
表结构如下 :
1.2 初始化数据
向商品类别表中添加数据
向商品表中添加数据
1.3 多表查询
1.3.1 交叉连接查询(基本不会使用-得到的是两个表的乘积) [了解]
语法:select * from A,B;
代码:
结果 :
笛卡尔积 :
笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尓积(Cartesian product),又称直积,表示为X×Y, 第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员[3] 。 假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。
数据库表连接数据行匹配时所遵循的算法就是以上提到的笛卡尔积,表与表之间的连接可以看成是在做 乘法运算。
笛卡尔积的危害 :
以前五条数据为例,这五条关联数据中只有第一条是有用的,其他几条都是没有用的,所以在交 叉查询中,数据库会浪费非常多的性能来查询这些没有用的数据,这种情况使我们不愿意见到 的;
解决笛卡尔积:
精确关联条件,去掉不必要的数据!
1.3.2 内连接查询(使用的关键字 inner join -- inner可以省略)
隐式内连接:select * from A,B where 条件;
显示内连接:select * from A inner join B on 条件; (推荐写法)
内连接原理 : 内连接根据我们连接条件大大的缩小的笛卡尔积的范围;在内连接中只有主外 键能够关联上的数据才能被查询出来!
内连接问题 :
向商品类别表插入一条数据
现在商品类别表中有6个类别
但是当我关联查询的时候
只能查询出5个类别,这是为什么呢?
这是因为商品表中就就只有五个类别能和商品类别表匹配,所以内连接把能匹配的数据都查 询出来了,那么有没有什么办法可以解决这个问题呢?
1.3.3 外连接查询(使用的关键字 outer join -- outer可以省略)
外连接可以把关联查询的两张表的一张表作为主表,另外一张作为从表,而外链接使用保证主 表的数据完整;
左外连接:left outer join
select * from A left outer join B on 条件;
代码 :
效果 :
查询原理 : 左外连接查询是以left关键字左边的表为基准表,保证左表数据完整,如果右表没有 与左表数据匹配的记录,那么右表将以一条null数据填充查询结果,保证左表的完整
左外链接正好能解决我们上面的问题
代码
1.3.4 右外连接:right outer join(了解)
右外链接与左外链接正好相反,它是保证右表数据完整;
此处需要注意一个问题就是所有的右外链接都能转为左外链接,所以右外链接应用并不广泛, 了解即可
语法 :
select * from A right outer join B on 条件;
1.3.5 各种连接查询区别总结
1.3 多表查询综合案例
1.3.1 查询价格在一万以内名字中包含 '想' 的商品
隐式内连接
隐式内连接是借助where条件来设定关联关系,所以这样如果一旦where条件变多整体关联 关系就很难把控,并且表越多,隐式内连接关联就越乱,所以这种方案我们并不采纳
显式内连接
1.3.2 查询所有分类商品的个数
左外连接 :
结果 :
此处不能写 count() 如果写count() 手机/运营商/数码将会是1 因为确实有一条记录与之对 应虽然记录里的数据都是null
但是如果你统计外检表的任意一个列 count() 会忽略null值所以就是0了
1.3 子查询
定义 :一条select语句结果作为另一条select语法一部分(查询条件,查询结果,表等)。
语法 :
案例 : 查询和海尔洗衣机同样价格的商品
连接查询 : ...................!@#$%^&*()_+................搞不了,搞不了...........
没法连接呀,发生在一张表的查询,关联字段也找不到,你叫我怎么连接?啊?怎么连接?
子查询 :
上面的案例是把一条SQL语句的查询结果当做条件值传入到另一条SQL语句中,而且大家注 意此时海尔洗衣机这条SQL返回一个结果,这种叫单行单列子查询
接下来再演示个多行子查询
比如查询所有商品的商品类别名称
上面这条SQL语句子查询部分返回了多条记录,这种子查询叫做单行多列子查询;
还有的时候会把查询结果当成临时表存储起来然后在查询结果基础上再进行查询
上面这条语句就是把一个查询结果直接封装为一个虚拟表a表 然后在封装的虚拟表a表的基 础上又做查询 这种子查询叫做 多行多列子查询;