前言-------数据库知识比较多,背的东西也比较多,多以要多加练习,加油
目标:掌握数据库对多表的创建和查询的操作
掌握分析表与表之间的关系,并能够正确的建表
SQL创建多表与多表的关系
需求:分析分类表和商品表之间的关系
要求在商品表product中,每一个商品的分类在分类表category中都能找到,如果找不到,这个商品的数据就没有意义。
怎么样在商品表中增加一个商品,如果商品的分类在分类表中没有就会插入失败?
外键约束:foreign key
在product商品表中的cno类添加一个外键约束
alter table product add foreign key(cno) references category(cid);
从分类表中删除分类5的信息,必须先在商品表中删除分类5的所有商品,才能在分类表中删除分类5
主键约束:
默认情况下不能为空
外键都是指向另一张表的主键
一张表只能有一个主键
唯一约束:
列面的内容, 必须是唯一, 不能出现重复情况, 可以为空
唯一约束不可以作为其它表的外键
可以有多个唯一约束
分析表与表之间的关系:
一对多、多对多、一对一
建数据库原则:
一个项目或一个工程建一个数据库
建立多表之间的建表原则:
一对多:商品和商品的分类
在多的一方添加一个外键,指向一的一方的主键
多对多:老师和学生、学生和课程
建立一个中间表,将多对多的关系拆分成一对多的关系,中间表至少有两个外键,并且分别指向原来的两张表。
一对一:班级和班长,公民和身份证,国家和国旗
1、将一对一看成一对多的情况,随便找出其中的一张表作为多并添加一个外键使这个外键要唯一并且指向另一张表
2、直接合并成为一张表
3、将两张表的主键连接起来,使着两个主键相等
用途:相亲网站:
个人信息 : 姓名,性别,年龄,身高,体重,三围,兴趣爱好,(年收入, 特长,学历, 职业, 择偶目标,要求)
拆表操作 : 将个人的信息拆分成常用信息和不常用信息,减少表的臃肿。
网上商城表实例分析和创建:网上购物流程:
用户表 (用户的ID,用户名,密码,手机)
create table user(
uid int primary key auto_increment,
username varchar(31),
password varchar(31),
phone varchar(11)
);
insert into user values(1,'zhangsan','123','13811118888');
订单表 (订单编号,总价,订单时间 ,地址,外键用户的ID)
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)
);
insert into orders values(1,200,null,'黑马前台旁边小黑屋',1);
insert into orders values(2,250,null,'黑马后台旁边1702',1);
商品表 (商品ID, 商品名称,商品价格,外键cno)
create table product(
pid int primary key auto_increment,
pname varchar(10),
price double,
cno int,
foreign key(cno) references category(cid)
);
insert into product values(null,'小米mix4',998,1);
insert into product values(null,'锤子',2888,1);
insert into product values(null,'阿迪王',99,2);
insert into product values(null,'老村长',88,3);
insert into product values(null,'劲酒',35,3);
insert into product values(null,'小熊饼干',1,4);
insert into product values(null,'卫龙辣条',1,5);
insert into product values(null,'旺旺大饼',1,5);
订单项: 中间表(订单ID,商品ID,商品数量,订单项总价)
create table orderitem(
ono int,
pno int,
foreign key(ono) references orders(oid),
foreign key(pno) references product(pid),
ocount int,
subsum double
);
--给1号订单添加商品 200块钱的商品
insert into orderitem values(1,7,100,100);
insert into orderitem values(1,8,101,100);
--给2号订单添加商品 250块钱的商品 ()
insert into orderitem values(2,5,1,35);
insert into orderitem values(2,3,3,99);
商品分类表(分类ID,分类名称,分类描述)
create table category(
cid int primary key auto_increment,
cname varchar(15),
cdesc varchar(100)
);
insert into category values(null,'手机数码','电子产品,黑马生产');
insert into category values(null,'鞋靴箱包','江南皮鞋厂倾情打造');
insert into category values(null,'香烟酒水','黄鹤楼,茅台,二锅头');
insert into category values(null,'酸奶饼干','娃哈哈,蒙牛酸酸乳');
insert into category values(null,'馋嘴零食','瓜子花生,八宝粥,辣条');
使用商城表完成对多表信息的多表查询
需求分析:
在我们的商城案例中,我的订单包含很多信息,打开我的订单需要去查询表。
多表查询:
交叉连接查询(笛卡尔积):
查询出两张表的所有项,相当于两张表的乘机
select * from product, category;
但是查询出的数据有些是没有意义的,所以要对查询出的数据进行筛选,使用where
select * from product,category where cno=cid; 或者
select * from product as p,category as c where p.con=c.cid; 或者
select * from product p,category c where p.con=c.cid;
内连接查询:
隐式查询
select * from product,category where cno=cid;
显示查询
select * from product inner join category on cno=cid;
隐式查询与显示查询的区别
隐式查询是先查出笛卡尔积之后再筛选数据
显示查询是直接根据条件进行查询,效率高,速度快
左外连接查询
查询出左表的所有数据,如果相对应的右表没有的话,使用null代替
select * from product left outer join category on cno=cid;
右外连接查询
查出右表中所有的数据,如果左表没有相对应的数据,就直接用null代替
select * from product right outer join category on cno=cid;
分页查询
第一个参数0:起始页index从1开始 stateindex=(index-1)*3
第二个参数3:表示一页几个数据
select * from product limit 0,3;
子查询
查询分类名称为手机数码的所有商品
select * from product cno=(select cid from category where cname='手机数码');
查询出(商品名称,商品分类名称)信息
使用左查询
select pname,cname from product left outer join category on cno=cid;
使用嵌套查询
select pname,(select cid from category,product where cno=cid) from product;