多表链接测试

表一:product(商品表)
pidpnamepprice
1手机2300
2电脑5600
3照相机1200
4投影仪2500
表二:user(用户表)
uidunameuage
1李三20
2张四23
3赵五25
4孙六18
5孙悟空24
表三:order(订单表)
opidouidonumber(点单号)
11123123
12112233
21234567
25787878
34343421
35909090
42212112
41343421
1:查询孙姓用户的个数
2:查询年纪最大的2个用户名
3:查询李三买的商品名
4:查询购买过电脑的用户名
5:查询订单是909090对应的用户名和商品名
6:查询商品表中的最高价格的前两条数据

1:查询孙姓用户的个数

 SELECT COUNT(*) FROM `user` WHERE user.uname LIKE "孙%"

2:查询年纪最大的2个用户名

SELECT u.uname FROM user u ORDER BY u.uage DESC LIMIT 0,2

3:查询李三买的商品名

select p.pname from product p,`user` u,`order` o where u.uid = o.ouid AND p.pid = o.opid and u.uname = "李三"

 4:查询购买过电脑的用户名

select u.uname from product p,`user` u,`order` o where u.uid = o.ouid AND p.pid = o.opid and p.pname = "电脑"

5:查询订单是909090对应的用户名和商品名

select u.uname,p.pname from product p,`user` u,`order` o where u.uid = o.ouid AND p.pid = o.opid and o.onumber = 321312212

6:查询商品表中的最高价格的前两条数据

SELECT * FROM product ORDER BY product.pprice DESC LIMIT 0,2

celebrity(名人)
sidsname(作者)sagessex
1李白34
2杜甫24
3白居易31
4李商隐40
5苏轼26
6辛弃疾22

     

summary(总结)
sidwidsassess(名句)
11天生我材必有用
12危乎高哉!
68明月几时有
36乱花渐欲迷人眼
43却话巴山夜雨时
57大江东去
25一览众山小
14举头望明月
works(代表)
widwwork(作品)wdynasty(朝代)
1将进酒唐代
2蜀道难唐代
3夜雨寄北唐代
4静夜思唐代
5望岳唐代
6钱塘湖春行南宋
7念奴娇赤壁怀古北宋
8水调歌头唐代

1:查询名人表中性别是男的作者

SELECT c.sname from celebrity c WHERE c.ssex ="男"
2:查询静夜思的作者

SELECT celebrity.sname FROM celebrity INNER JOIN summary on celebrity.sid = summary.sid INNER JOIN works on works.wid = summary.sid WHERE works.wwork = "静夜思"
3:查询李白和杜甫的年纪

SELECT c.sname ,c.sage FROM celebrity c WHERE c.sname in ("李白","杜甫")
4:查询名人表中的男女人数

SELECT c.ssex, COUNT(*) FROM celebrity c GROUP BY c.ssex
5:查询白居易写的作品名称和对应的名句

SELECT celebrity.sname,summary.sassess FROM celebrity INNER JOIN summary on celebrity.sid = summary.sid INNER JOIN works on works.wid = summary.sid WHERE celebrity.sname = "白居易"
6:查询年纪在25到30岁之间的个数

SELECT COUNT(*) FROM celebrity c WHERE c.sage<=30 AND c.sage>=25
7:查询名人表中年纪最小两条的数据信息

SELECT * FROM celebrity ORDER BY sage LIMIT 0,2
8:查询李白的作品名称,名句和年纪

SELECT celebrity.sname,summary.sassess,works.wwork FROM celebrity INNER JOIN summary on celebrity.sid = summary.sid INNER JOIN works on works.wid = summary.sid WHERE celebrity.sname = "李白"
9:将作品为望岳的朝代修改为北宋

UPDATE works SET wdynasty="北宋" WHERE wwork = "望岳"
10:新增名人表中的一个作者王维,年纪25,性别男

INSERT INTO celebrity VALUES(7,"王维",25,"男")

学生信息表S(sno,sname,age,sex),
属性为:学号,学生姓名,年龄和性别
snosnameagesex
1张三18
2李四20
3王五23
4赵六22

选课信息表SC(sno,cno,scgrade),
属性为学号,课程号和成绩
snocnoscgrade
1150
2166
3190
1255
2268
3261
4244
1390
2378
3322
4355

课程信息表C(cno,cname,cteacher),
属性为课程号,课程名称和任课老师
CnoCnameCteacher
1java何昊
2php李美军
3android王超
1:查询SC表中对应何昊老师所授课程的女生的信息

SELECT ss.sname,ss.age,ss.sex from studentcourse s LEFT JOIN course c on s.cno = c.Cno LEFT JOIN student ss on ss.sno = s.sno WHERE c.Cteacher = "何昊" AND ss.sex= "女"

找出没有选修过何老师的课程的所有学生的姓名

SELECT * FROM ( SELECT * FROM student r LEFT JOIN (SELECT DISTINCT(ss.sname) name from studentcourse s LEFT JOIN course c on s.cno = c.Cno LEFT JOIN student ss on ss.sno = s.sno WHERE c.Cteacher = "何昊") e ON r.sname = e.name ) q WHERE q.`name` = null

列出有不及格课程(成绩小于60)的学生的姓名

SELECT DISTINCT(s.sname) FROM student s,studentcourse ss WHERE s.sno=ss.sno AND ss.scgrade<60

多表设计

1. 一对一

一张表的一条记录一定只能与另外一张表的一条记录进行对应,反之亦然。

有时候,为了业务,或者避免一张表中数据量过大,过复杂,在开发中会进行一对一方式来设计表。

2一对多(1方建主表(id为主键字段), 多方建外键字段)7.

指的是一个实体的某个数据与另外一个实体的多个数据有关联关系, 一对多的关系在设计的时候,需要设计表的外键

1.1.    班级表和学生表设计

部门表和员工表设计

1.2.    创建数据库表

constraint 约束 

foreign key就是表与表之间的某种约定的关系,由于这种关系的存在,能够让表与表之间的数据,更加的完整,关连性更强。

foreign key语句的式例:FOREIGN KEY(Sno) REFERENCES Student(Sno)

附:表的外键必须是另一张表的主键

create table class(id int primary key auto_increment,name varchar(20));

create table student(id int primary key auto_increment,name varchar(20),sex varchar(20),class_id int,constraint  foreign key(class_id) references class(id));

 insert into class values(1,'ceshiban');

 insert into class values(2,'kaifa');

 insert into student values(1,'zhangsan','nan',1);

 insert into student values(2,'lisi','nan',2);

insert into student values(3,'jingjing','nan',2);

select * from student where class_id=(select id from class where id=2);

补一个外键的概念(默认是约束): 删除主键信息时,当该主键字段值在外键表中存在时,该记录是不能删除的。---要把外键表是的相关信息删除之后,才能删除。

3、多对多( 3个表= 2个实体表 + 1个关系表 )

一个实体的数据对应另外一个实体的多个数据,另外实体的数据也同样对应当前实体的多个数据。

一个学生可以有多个老师,一个老师可以教多个学生

解决方案:创建一个中间表,专门用来维护多表之间的对应关系,通常是能够唯一标识出数据的字段(主键)

create table teacher(id int primary key,name varchar(100));

create table student (id int primary key,name varchar(100));

create table teacher_student(teacher_id int,student_id int,constraint foreign key(teacher_id) references teacher(id),constraint foreign key(student_id) references student(id));

 insert into teacher values(1,'梁老师');

 insert into teacher values(2,'李老师');

insert into student values(1,”张三”);

insert into student values(2,”李四”);

insert into teacher_student values(1,1);

insert into teacher_student values(1,2);

insert into teacher_student values(2,1);

insert into teacher_student values(2,2);

查询李老师所教的学生

select id from teacher where name=’李老师’

select student_id from teacher_student where teacher_id=id

select * from student where id in(select student_id from teacher_student where teacher_id =(select id from teacher where name='李老师'));

查询张三的所有老师

select * from teacher where id in(select teacher_id from teacher_student where student_id=(select id from student where name='张三'));

4. 连接查询

1.    初始定义表结构

create table customer(id int primary key auto_increment,name varchar(20),city varchar(20));

create table orders(id int primary key auto_increment,good_name varchar(20),price float(8,2),customer_id int);

insert into customer (name,city) values('李老师','东北');

insert into customer (name,city) values('崔老师','山西');

insert into customer (name,city) values('张老师','内蒙');

insert into customer (name,city) values('闫老师','天津');

 insert into orders(good_name,price,customer_id) values('电脑',59,1);

 insert into orders(good_name,price,customer_id) values('笔记本',88,2);

 insert into orders(good_name,price,customer_id) values('吹风机',99,1);

 insert into orders(good_name,price,customer_id) values('香水',300,3);

 insert into orders(good_name,price,customer_id) values('牛奶',100,6);

2.    交叉查询

交叉查询,又叫笛卡尔积查询,会将左表和右表的信息,做一个乘积将所有信息查询出来,会产生临时表,比较占用内存,生成的记录数=表1 X表2

select * from customer,orders;

select * from customer cross join orders;

3.    内连接查询

内连接,inner join on 查询两张表,设定条件,将两张表中对应的数据查询出来

不会产生笛卡尔积,不会产生临时表,性能高

select * from customer c inner join orders o on c.id=o.customer_id;

select * from customer,orders where customer.id=orders.customer_id;

select * from customer c,orders o where c.id=o.customer_id;

4.    左外连接

左外连接  left join   on 设定条件,将两张表对应的数据查询出来,同时将左表自己没有关联的数据也查询出来

注意:join前面是左,后面是右

select * from customer c left join orders o on c.id=o.customer_id;

5.    右外连接

右外连接 right join  on 设定条件,将两张表对应的数据查询出来,同时将右表自己没有关联的所有数据查询出来

select * from customer c right join orders o on c.id=o.customer_id;

6.    联合查询

select * from customer left join orders on customer.id=orders.customer_id

 having price>20;

 区别

left join (左边为主表,右边有则填充,没有用null)

right join(右边为主表,左边有则填充,没有用null)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值