多表之间的关系:
一对一:一张表中的一条数据对应另外一张表中的一条数据,比如一个人只有一张身份证,一张身份证对 应一个人。一对一关系比较少见,因为一对一这种关系的表可以合并成一张表
一对多:一张表中的一条数据可以和另外一张表中多条数据关联,拿学生表和成绩表举例,一个学生有多 个成绩
多对多:拿学生表和科目表举例,一个学生可以选择多门课程,一个课程也可以被很多学生选择;多对多 关系实现需要借助第三张中间表。中间表至少包含两个字段,将多对多的关系,拆成一对多的关系
最简单的多表查询(笛卡尔积)
笛卡尔积:笛卡尔乘积是指在数学中,两个集合A和B的所有组合情况。(在多表查询的时候,需要消除无效的笛卡尔积)。
创建表(前期准备工作)
1、准备所需要的库和表
(1)创建数据库mydb11_stu并使用数据库
create database mydb11_stu;
(2)创建student表
create table student(id int(10) not NuLL unique primary key, name varchar(20) notNULL, sex varchar(4),birth year, department varchar(20), address varchar(50));
(3)创建score表
create table score(id int(10) not null unique primary key auto_increment, stu_idint(10)not null,c_name varchar(20),grade int(10));
向各表中插入数据:
(1)向student表插入记录如下:
mysql>insert student values(901,'张三丰','男',2002,计算机系','北京市海淀区');mysql>insert student values(902,周全有',男',2000,'中文系''北京市昌平区');
mysql> insert student values(903,张思维','女',2003,中文系','湖南省永州市');
mysql> insert student values(904,李广昌','男',1999,英语系''辽宁省皋新市');
mysql>insertstudent values(905,王翰'男',2004,英语系''福建省厦门市');
mysql> insertstudent values(906,王心凌','女',1998,计算机系','湖南省衡阳市');
(2)向score表插入记录如下:
mysql> insert into score values(null,901,'计算机',98);
mysql> insert into score values(null,901,'英语',80);
mysql> insert into score values(null,902,'计算机',65);
mysql> insert into score values(null,902,'中文',88);
mysql> insert into score values(null,903,'中文',95);
mysql> insert into score values(null,904,'计算机',70);
mysql> insert into score values(null,904,'英语',92);
mysql> insert into score values(null,905,'英语',94);
mysql> insert into score values(null,906,'计算机',49);
mysql> insert into score values(null,906,'英语',83);
多表查询实例:
根据这两个表完成查询:
1.分别查询student表和score表的所有记录
SELECT * FROM student;
SELECT * FROM score;
2.查询student表的第2条到5条记录
select * from student limit 2,4;3.从student表中查询计算机系和英语系的学生的信息
select * from student where department='英语系' or department='计算机系';4.从student表中查询年龄小于22岁的学生信息
select * from student where year(now())-birth>22;
5.从student表中查询每个院系有多少人
SELECT department,count(id) FROM student GROUP BY department;6.从score表中查询每个科目的最高分
SELECT c_name '科目',MAX( grade ) '最高分' FROM score GROUP BY c_name;7.查询李广昌的考试科目(c_name)和考试成绩(grade)
SELECT c_name,grade FROM score JOIN student ON student.id = score.stu_id WHERE NAME = '李广昌';8.用连接的方式查询所有学生的信息和考试信息
SELECT student.*,c_name,grade FROM student student LEFT JOIN score ON student.id = score.stu_id;9.计算每个学生的总成绩
SELECT NAME,SUM( grade ) '总成绩' FROM student JOIN score ON student.id = score.stu_id GROUP BY NAME;10.计算每个考试科目的平均成绩
SELECT c_name '科目',ROUND( AVG( grade ), 2 ) '平均成绩' FROM student JOIN score ON score.stu_id = student.id GROUP BY c_name;11.查询计算机成绩低于95的学生信息
SELECT DISTINCT * FROM student JOIN score ON student.id = score.stu_id WHERE grade < 95 AND c_name = '计算机';12.将计算机考试成绩按从高到低进行排序
SELECT stu_id,NAME,grade FROM score JOIN student ON student.id = score.stu_id WHERE c_name = '计算机' ORDER BY grade DESC;13.从student表和score表中查询出学生的学号,然后合并查询结果
SELECT id FROM student UNION SELECT stu_id FROM score;14.查询姓张或者姓王的同学的姓名、院系和考试科目及成绩
SELECT NAME,departmentc_name,,grade FROM student JOIN score ON student.id = score.stu_id WHERE NAME LIKE '张%' OR NAME LIKE '王%';15.查询都是湖南的学生的姓名、年龄、院系和考试科目及成绩
SELECT student.NAME,YEAR (NOW())- birth,department,c_name,grade FROM student JOIN score ON student.id = score.stu_id WHERE address LIKE '%湖南%';
本次多表查询结束,本次实验一定需要细心,找好两张表的关系认真分析,才可以掌握,
相信大家多练习一定能掌握这门技术,我们下期再见!!!