多表之间的关系

多表之间的联系:多表之间通过外键约束
注意:外键可以为null,如果非空它的值一定存在于主表中
主键约束:默认不为空,值唯一。
主键可以作为外键的指向。一个表只能有一个
唯一约束:值唯一,可以为空。
唯一约束不可作为其他表的外键。一个表可以有多个。

给一个已存在的的字段添加外键约束
格式:alter table 表名 add foreign key(字段名) references 表名(字段名)

建库原则

通常情况下,一个项目或应用建一个数据库

多表建表原则

一对多:

在n的一方添加一个外键指向1的一方。

多对多:

多建一张中间表,将多对多的关系拆成一对多的关系,该中间表至少有两个字段作为外键分别指向两张表的主键。

一对一

  1. 合并为同一张表
  2. 主键对应
  3. 外键唯一

一对一的用途:
不常用:一般用于拆表操作:例子将常用信息和不常用信息分开,建立成两张表。

建表时加入外键约束
create table orders(
oid int primary key auto_increment,
sum int not null,
otime timestamp,
address varchar(100),
uno int,
foreign key(uno) references user(uid)
);

多表查询

  1. 交叉连接:得到的结果称为笛卡尔积,是将二个表的所有内容连接起来,其中包含大量无意义信息。
格式:select * from1,表2;
例子:select * from product,category;
  1. 内连接:在交叉连接的基础上添加过滤条件
隐式内连接:
    格式:select * from1,表2 where 条件
    例子:select * from product,category where cno=cid;
    select * from product,category where product.cno=category.cid;
    加入别名的
    select * from product as p,category as c where p.cno=c.cid;
显示内连接(inner join    on):
    格式:select * from1 inner join2 on 条件
    例子:select * from product inner join category on cno=cid;
    select * from product p inner join category c on p.cno=c.cid;

显示内连接和隐式内连接的区别:

  1. 隐式内连接:是在查询出笛卡尔积的基础上,通过where条件过滤的。
  2. 显示内连接:是带着条件去查询的,效率更高。

外链接

(left outer join     on)
左外连接:查询左表所有数据,如果右表没有对应的数据用null代替。
    格式:select * from1 left outer join2 on 条件;
    例子:select * from product as p left outer join category as c on p.cno=c.cid;
(right outer join    on)
右外连接:查询右表所有数据,如果左表没有对应数据用null代替。
    格式:select * from1 right outer join2 on 条件;
    例子:select * from product as p right outer join category as c on p.cno=c.cid;

外连接与内连接区别:

  1. 内连接查询的是两个表的交集
  2. 左外连接查询的是左表的全部(与右表没有联系的部分和两个表的交集)
  3. 右外连接查询的是右表的全部(与左表没有联系的部分和两个表的交集)

分页查询(limit)

格式:select * from 表 limit 起始角标,条数;
例子:select * from product limit 0,10;
表示从第一条记录开始查询10条记录

注意:
如果想查询从1开始的10条数据应该写成:limit 0,10;
如果想查询从11开始的10条数据应该写成:limit 10,10;

子查询

查询出(商品名称,商品分类名称)信息:
子查询:
 select pname,(select cname from category where p.cno=c.cid) as 商品分类名称 from product p;
左外连接:
select p.pname,c.cname from product p left outer join category c on p.cno=c.cid;
查询分类名称为手机数码的所有商品:
select * from product where cno=(select cid from category where cname='分类名称');

猜你喜欢

转载自blog.csdn.net/weixin_41481311/article/details/81663688
今日推荐