MySQL多表查询(补充题目)

前言

前篇文章是写了几个单表查询的表练习,本来想把多表查询写在一起的,但是想想还是觉得应该把他们分开来,学习是一步一个脚印的来的,切忌操之过急,就弄了两个题目并给出了解题代码,虽然有些代码写的不是很标准,望大家海涵!

要参考前一篇文章的单表查询:
点击这里 Mysql的复杂单表查询


一、本章题目(一)

二、多表连接查询
use mydb3;
-- 创建部门表
create table if not exists dept3(
 deptno varchar(20) primary key , -- 部门号
 name varchar(20) -- 部门名字
);
-- 创建员工表
create table if not exists emp3(
 eid varchar(20) primary key , -- 员工编号
 ename varchar(20), -- 员工名字
 age int, -- 员工年龄
 dept_id varchar(20) -- 员工所属部门
);
-- 给dept3表添加数据
insert into dept3 values('1001','研发部');
insert into dept3 values('1002','销售部');
insert into dept3 values('1003','财务部');
insert into dept3 values('1004','人事部');
-- 给emp3表添加数据
insert into emp3 values('1','乔峰',20, '1001');
insert into emp3 values('2','段誉',21, '1001');
insert into emp3 values('3','虚竹',23, '1001');
insert into emp3 values('4','阿紫',18, '1001');
insert into emp3 values('5','扫地僧',85, '1002');
insert into emp3 values('6','李秋水',33, '1002');
insert into emp3 values('7','鸠摩智',50, '1002'); 
insert into emp3 values('8','天山童姥',60, '1003');
insert into emp3 values('9','慕容博',58, '1003');
insert into emp3 values('10','丁春秋',71, '1005');
1、查询每个部门的所属员工
2、查询研发部门的所属员工
3、查询研发部和销售部的所属员工
4、查询每个部门的员工数,并升序排序
5、查询人数大于等于3的部门,并按照人数降序排序

二、答题步骤

1、查询每个部门的所属员工

mysql> select name,group_contact(name) from emp3 inner join dept3 on dept_id =deptno group by deptno;
可能这里那个1005编号的丁春秋可能录入错误了,可以自己修改一下或者是增加一个新部门,编号就叫1005,这样解决了。

2、查询研发部门的所属员工

mysql> select deptno,name,ename from emp3 inner join dept3 on dept_id =1001 and deptno =1001;

3、查询研发部和销售部的所属员工

mysql> select deptno,name,ename from emp3 inner join dept3 on dept_id =1001 and deptno =1001 or deptno=1002 and dept_id=1002;

4、查询每个部门的员工数,并升序排序

mysql> select dept_id as '部门编号',name as '部门名称',count(1) as '部门人数' from emp33 inner join dept3 on deptno=dept_id group by dept_id desc;
熟悉as的用法和count函数的用法是很有必要的,其次呢 还要学会读懂题目给的条件,哪些的前提条件,哪些是查询条件,哪些收是必要条件。

5、查询人数大于等于3的部门,并按照人数降序排序

mysql> select name,count(dept_id) from emp3 inner join dept3 on deptno=dept_id group by dept_id having count(dept_id) > 2; 
group by 后面继续加上选择条件,选择条件为统计出来的部门人数量的基础上,在选贼人数大于等于3的部门,使用having加上。

三、本章题目(二)

Sutdent 表的定义
字段名 字段描述 数据类型 (主键 外键 非空 唯一 自增)
Id 学号 INT(10) 是否是是是
Name 姓名 VARCHAR(20) 否否是否否
Sex 性别 VARCHAR(4) 否否否否否
Birth 出生年份 YEAR 否否否否否
Department 院系 VARCHAR(20) 否否是否否
Address 家庭住址 VARCHAR(50) 否否否否否

MariaDB [db1]> desc student;
+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| id         | int(10)     | NO   | PRI | NULL    | auto_increment |
| name       | varchar(20) | NO   |     | NULL    |                |
| sex        | varchar(4)  | YES  |     | NULL    |                |
| birth      | year(4)     | YES  |     | NULL    |                |
| department | varchar(20) | NO   |     | NULL    |                |
| address    | varchar(50) | YES  |     | NULL    |                |
+------------+-------------+------+-----+---------+----------------+
6 rows in set (0.001 sec)

Score 表的定义
字段名 字段描述 数据类型 (主键 外键 非空 唯一 自增)
Id 编号 INT(10) 是否是是是
Stu_id 学号 INT(10) 否否是否否
C_name 课程名 VARCHAR(20) 否否否否否
Grade 分数 INT(10) 否否否否否

MariaDB [db1]> desc score;
+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| id     | int(10)     | NO   | PRI | NULL    | auto_increment |
| stu_id | int(10)     | NO   |     | NULL    |                |
| c_name | varchar(20) | YES  |     | NULL    |                |
| grade  | int(10)     | YES  |     | NULL    |                |
+--------+-------------+------+-----+---------+----------------+
4 rows in set (0.001 sec)


1.写出创建 student 和 score 表的 SQL 语句,并在自己数据库上执行

create table student (id int(10) primary key not null unique auto_increment, name varchar(20) not null,sex varchar(4),birth year,department varchar(20) not null,address varchar(50));

create table score (id int(10) primary key not null unique auto_increment,stu_id int(10) not null,c_name varchar(20),grade int(10));

 

2.为 student 表和 score 表增加记录,写出 SQL 语句以及在自己的数据库上执行
向 student 表插入记录的 INSERT 语句如下:
'张老大', '男',1985,'计算机系', '北京市海淀区'
'张老二', '男',1986,'中文系', '北京市昌平区'
'张三', '女',1990,'中文系', '湖南省永州市');
李四', '男',1990,'英语系', '辽宁省阜新市');
王五', '女',1991,'英语系', '福建省厦门市');
王六', '男',1988,'计算机系', '湖南省衡阳市');

insert into student(id,name,sex,birth,department,address)values('801','张老大', '男',1985,'计算机系', '北京市海淀区'),
('802','张老二', '男',1986,'中文系', '北京市昌平区'),
('803','张三', '女',1990,'中文系', '湖南省永州市'),
('804','李四', '男',1990,'英语系', '辽宁省阜新市'),
('805','王五', '女',1991,'英语系', '福建省厦门市'),
('806','王六', '男',1988,'计算机系', '湖南省衡阳市');
向 score 表插入记录的 INSERT 语句如下:
张老大,'计算机',98);
张老大,'英语', 80);
张老二, '计算机',65);
张老二, '中文',88);
张三, '中文',95);
李四, '计算机',70);
李四, '英语',92);
王五, '英语',94);
王五, '计算机',90);
王六, '英语',85);
insert into score (stu_id,c_name,grade)values(801,'计算机',98),
(801,'英语', 80),
(802, '计算机',65),
(802, '中文',88),
(803, '中文',95),
(804, '计算机',70),
(804, '英语',92),
(805, '英语',94),
(805, '计算机',90),
(806, '英语',85);

解题步骤

1.查询 student 表的所有记录

  mysql->select * from student;

2.查询 student 表的第 2 条到 4 条记录

mysql> select * from student limit 1,3;  跳过一行获取三行 limit用法重要的,可以省去很多事情

3.从 student 表查询所有学生的学号(id)、姓名(name)和院系(department)的信息

mysql> select id,name,department from student;

4.从 student 表中查询计算机系和英语系的学生的信息

mysql> select * from student where department='计算机系' or department='英语系';

5.从 student 表中查询年龄 28~32 岁的学生信息

mysql> select * from student where year(now())-birth in (28,29,30,31,32);

mysql> select * from student where 2023-birth in (28,29,30,31,32);

6.从 student 表中查询每个院系有多少人

mysql> select department,count(1) from student group by department;

7.巩固练习:查询score表学习每个课程的人数

mysql> select c_name,count(1) from score group by c_name;

8.从 score 表中查询每个科目的最高分

mysql> select c_name,max(grade) from score group by c_name;

9.查询李四的考试科目(c_name)和考试成绩(grade)

mysql> select name,c_name,grade 
       from student inner join score 
       on name='李四' and stu_id=804;

10.用连接的方式查询所有学生的信息和考试信息

mysql> select student.*,c_name,grade
       from student inner join score 
       on student.id=stu_id or department=c_name;

11.计算每个学生的总成绩

mysql> select student.id,name,sum(grade) 
       from student inner join score 
       on student.id=stu_id or department=c_name group by name,student.id;

12.计算每个考试科目的平均成绩

mysql> select student.id,name,avg(grade) 
       from student inner join score  
       on student.id=stu_id or department=c_name group by name,student.id;

13.查询计算机成绩低于 95 的学生信息

mysql> select score.id,stu_id,name,c_name,grade,sex,department,birth  
       from student inner join scoore 
       on grade<95 and c_name = '计算机' and student.id=stu_id;

14.查询同时参加计算机和英语考试的学生的信息

mysql> select a*,grade from student as a,score as b,score as c 
       where a.id=b.stu_id and b.c_name='计算机' 
       and a.id=c.stu_id and c.c_name='英语';

15.将计算机考试成绩按从高到低进行排序

mysql> select name,score.* 
       from score inner join student 
       on c_name='计算机' and studenrt.id=stu_id order by grade desc ;

16.从 student 表和 score 表中查询出学生的学号,然后合并查询结果

mysql> select score.id,name,stu_id,c_name
       from score inner join student 
       on student.id=sstu_id;

17.查询姓张或者姓王的同学的姓名、院系和考试科目及成绩

mysql> select name as '姓名',department as '学院',c_name as '考试科目',grade as '成绩' 
    -> from score left join student
    -> on student.id=stu_id
    -> where name like '张%' or name like '王%';

18.查询都是湖南的学生的姓名、年龄、院系和考试科目及成绩

mysql> select name as '姓名',department as '学院',c_name as '考试科目',address as '地 区',grade as '成绩' , address as '地区' 
       from student inner join score
       on student.id=stu_id where address like '%湖南%';

总结

以上就是今天的补充内容,对于多表查询,还是基于在单表查询的基础上进行操作的,单表查询操作过多,但是太局限了,万一以后各位小伙伴进入大公司,面对的公司数据库不可能只在单表进行操作,所以多表连接查询对于以后还是自己在大学的计算机上面都有着很多很多的好处,多表查询应该从哪些方面进行训练呢?
1、熟悉集中表与表的连接方式,外连接,内连接,左连接以及右连接;
2、掌握基本函数的使用,以及和语法的搭配;
3、group by having 语句的精通掌握,where语句,case语句等等都是必要的基础,就像学习c语言和java语言一样的循环一样重要;
4、多看多练习,可以参考其他小伙伴的,想要提高自己要主动去寻求解决方法;
5、文章小白,哪里错误或则哪里欠缺的欢迎各位评论区交流!

你可能感兴趣的:(mysql,数据库)