一、参照完整性
1.一对多
(1).画出客户和订单的表格
(2).画出customer_id外键列,进行外键约束。
(3).代码实现
2.多对多
使用情况,两个及以上的表格存在共同数据时使用
3.一对一一般不使用。
二、多表查询
使用单个select语句从多个表格中取出相关的查询结果,多表连接通常是建立在有关系的父子表上。
1.交叉连接
第一个表格中所有的行乘以第二个表格中所有的行即是交叉查询的结果,又称为笛卡尔积。(搜索结果不正确,但是确实搜索的基础)
语法:
(1)隐式语法(不使用关键字):select * from customers,orders;
(2)显式语法(使用关键字):select * from customers CROSS JOIN orders;
2.内连接(没有购买商品的顾客不会被显示出来)
在交叉连接的基础上列出连接标准与连接条件相匹配的条件的数据,匹配不上的记录会不会被显示。
显式语法:
select * from customers,orders where customers.id=orders.customers_id;
隐士语法:
select * from customers c INNER JOIN orders o on c.id=o.customers_id;
3.外连接 (相对于内连接没有购买商品的顾客也会显示,拼接上之后无值会显式null)
3.1外连接分为左外连接和右外连接
3.2左外连接:以关键字左边的表作为基表进行拼接;
语法:select * from customers c LEFT JOIN orders o on c.id=o.customers_id;
3.3右外连接:以关键字右边的表作为基表进行拼接;
语法:
select * from orders o RIGHT JOIN customers c on o.customers_id=c.id;
4.子查询,何时使用:需要查询的时候,需要的条件是另一个select语句的结果。即子查询目的是给主查询提供数据而先执行的查询,分为嵌套子查询和相关子查询。
4.1嵌套子查询:内部的执行独立于外部查询,内部查询仅执行一次,查询结果作为外部查询的条件使用;
特点:可以拿出来单独执行
select * from students where id in(select s_id from teacher_student where t_id=1);
4.2 相关子查询:内部查询的执行依赖于外部查询的数据,外部查询每执行一次,内部查询也会执行一次。每一次都是外部查询先执行,取出外部查询表中的一个元组,将当前元组中的数据传递给内部查询,然后执行内部查询。根据内部查询执行的结果,判断当前元组是否满足外部查询中的where条件,若满足则当前元组是符合要求的记录,否则不符合要求。然后,外部查询继续取出下一个元组数据,执行上述的操作,直到全部元组均被处理完毕。
每一科考试成绩大于平均分的学生的分数。
select * from score as a where a.score>(select avg(b.score) from score as b where a.cou_id=b.cou_id);