MySQL之多表的创建以及查询

多表之间的关系:

一对一:一张表中的一条数据对应另外一张表中的一条数据,比如一个人只有一张身份证,一张身份证对 应一个人。一对一关系比较少见,因为一对一这种关系的表可以合并成一张表

一对多:一张表中的一条数据可以和另外一张表中多条数据关联,拿学生表和成绩表举例,一个学生有多 个成绩

多对多:拿学生表和科目表举例,一个学生可以选择多门课程,一个课程也可以被很多学生选择;多对多 关系实现需要借助第三张中间表。中间表至少包含两个字段,将多对多的关系,拆成一对多的关系

最简单的多表查询(笛卡尔积)

笛卡尔积:笛卡尔乘积是指在数学中,两个集合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 '%湖南%';

本次多表查询结束,本次实验一定需要细心,找好两张表的关系认真分析,才可以掌握,

相信大家多练习一定能掌握这门技术,我们下期再见!!! 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值