MySQL数据库-多表连接查询

目录

一、练习1

1、素材

2、要求及解答

 二、练习2

1、素材

2、要求及解答

一、练习1

1、素材

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');
mysql> select * from emp3;
+-----+--------------+------+---------+
| eid | ename        | age  | dept_id |
+-----+--------------+------+---------+
| 1   | 乔峰         |   20 | 1001    |
| 10  | 丁春秋       |   71 | 1005    |
| 2   | 段誉         |   21 | 1001    |
| 3   | 虚竹         |   23 | 1001    |
| 4   | 阿紫         |   18 | 1001    |
| 5   | 扫地僧       |   85 | 1002    |
| 6   | 李秋水       |   33 | 1002    |
| 7   | 鸠摩智       |   50 | 1002    |
| 8   | 天山童姥     |   60 | 1003    |
| 9   | 慕容博       |   58 | 1003    |
+-----+--------------+------+---------+
10 rows in set (0.00 sec)

mysql> select * from dept3;
+--------+-----------+
| deptno | name      |
+--------+-----------+
| 1001   | 研发部    |
| 1002   | 销售部    |
| 1003   | 财务部    |
| 1004   | 人事部    |
+--------+-----------+
4 rows in set (0.00 sec)

2、要求及解答

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

mysql> select name,ename from dept3 a
    -> inner join emp3 b on a.deptno = b.dept_id;
+-----------+--------------+
| name      | ename        |
+-----------+--------------+
| 研发部    | 乔峰         |
| 研发部    | 段誉         |
| 研发部    | 虚竹         |
| 研发部    | 阿紫         |
| 销售部    | 扫地僧       |
| 销售部    | 李秋水       |
| 销售部    | 鸠摩智       |
| 财务部    | 天山童姥     |
| 财务部    | 慕容博       |
+-----------+--------------+
9 rows in set (0.00 sec)


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

mysql> select name,ename from dept3 d
    -> inner join emp3 e on d.deptno = e.dept_id
    -> where name = '研发部';
+-----------+--------+
| name      | ename  |
+-----------+--------+
| 研发部    | 乔峰   |
| 研发部    | 段誉   |
| 研发部    | 虚竹   |
| 研发部    | 阿紫   |
+-----------+--------+
4 rows in set (0.00 sec)


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

mysql> select name,ename from dept3 d
    -> inner join emp3 e on d.deptno = e.dept_id
    -> where name = '研发部' or name = '销售部';
+-----------+-----------+
| name      | ename     |
+-----------+-----------+
| 研发部    | 乔峰      |
| 研发部    | 段誉      |
| 研发部    | 虚竹      |
| 研发部    | 阿紫      |
| 销售部    | 扫地僧    |
| 销售部    | 李秋水    |
| 销售部    | 鸠摩智    |
+-----------+-----------+
7 rows in set (0.00 sec)


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

mysql> select name,count(*) from dept3 d
    -> inner join emp3 e on d.deptno=e.dept_id
    -> group by name
    -> order by count(*) asc; 
+-----------+--------------+
| name      | count(ename) |
+-----------+--------------+
| 财务部    |            2 |
| 销售部    |            3 |
| 研发部    |            4 |
+-----------+--------------+
3 rows in set (0.00 sec)

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

mysql> select name,count(*) from dept3 d                                                                    
    -> inner join emp3 e on d.deptno=e.dept_id
    -> group by name
    -> having count(*) >=3
    -> order by count(*) desc;
+-----------+----------+
| name      | count(*) |
+-----------+----------+
| 研发部    |        4 |
| 销售部    |        3 |
+-----------+----------+
2 rows in set (0.00 sec)

 二、练习2

1、素材

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);

2、要求及解答

3.查询 student 表的所有记录

mysql> select * from student;
+-----+-----------+------+-------+--------------+--------------------+
| id  | name      | sex  | birth | department   | address            |
+-----+-----------+------+-------+--------------+--------------------+
| 801 | 张老大    | 男   |  1985 | 计算机系     | 北京市海淀区       |
| 802 | 张老二    | 男   |  1986 | 中文系       | 北京市昌平区       |
| 803 | 张三      | 女   |  1990 | 中文系       | 湖南省永州市       |
| 804 | 李四      | 男   |  1990 | 英语系       | 辽宁省阜新市       |
| 805 | 王五      | 女   |  1991 | 英语系       | 福建省厦门市       |
| 806 | 王六      | 男   |  1988 | 计算机系     | 湖南省衡阳市       |
+-----+-----------+------+-------+--------------+--------------------+
6 rows in set (0.00 sec)


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

mysql> select * from student
    -> limit 1,3;
+-----+-----------+------+-------+------------+--------------------+
| id  | name      | sex  | birth | department | address            |
+-----+-----------+------+-------+------------+--------------------+
| 802 | 张老二    | 男   |  1986 | 中文系     | 北京市昌平区       |
| 803 | 张三      | 女   |  1990 | 中文系     | 湖南省永州市       |
| 804 | 李四      | 男   |  1990 | 英语系     | 辽宁省阜新市       |
+-----+-----------+------+-------+------------+--------------------+
3 rows in set (0.00 sec)


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

mysql> select id 学号,name 姓名,department 院系 from student;
+--------+-----------+--------------+
| 学号   | 姓名      | 院系         |
+--------+-----------+--------------+
|    801 | 张老大    | 计算机系     |
|    802 | 张老二    | 中文系       |
|    803 | 张三      | 中文系       |
|    804 | 李四      | 英语系       |
|    805 | 王五      | 英语系       |
|    806 | 王六      | 计算机系     |
+--------+-----------+--------------+
6 rows in set (0.00 sec)


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

mysql> select * from student
    -> where department = '计算机系' or department = '英语系';
+-----+-----------+------+-------+--------------+--------------------+
| id  | name      | sex  | birth | department   | address            |
+-----+-----------+------+-------+--------------+--------------------+
| 801 | 张老大    | 男   |  1985 | 计算机系     | 北京市海淀区       |
| 804 | 李四      | 男   |  1990 | 英语系       | 辽宁省阜新市       |
| 805 | 王五      | 女   |  1991 | 英语系       | 福建省厦门市       |
| 806 | 王六      | 男   |  1988 | 计算机系     | 湖南省衡阳市       |
+-----+-----------+------+-------+--------------+--------------------+
4 rows in set (0.00 sec)


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

mysql> select * from student 
    -> where (year(now())-birth) between 28 and 32;
+-----+--------+------+-------+------------+--------------------+
| id  | name   | sex  | birth | department | address            |
+-----+--------+------+-------+------------+--------------------+
| 805 | 王五   | 女   |  1991 | 英语系     | 福建省厦门市       |
+-----+--------+------+-------+------------+--------------------+
1 row in set (0.00 sec)


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

mysql> select department,count(*) from student
    -> group by department;
+--------------+-------------------+
| department   | count(*)          |
+--------------+-------------------+
| 中文系       |                 2 |
| 英语系       |                 2 |
| 计算机系     |                 2 |
+--------------+-------------------+
3 rows in set (0.00 sec)


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

mysql> select c_name,count(c_name) from score group by c_name;
+-----------+---------------+
| c_name    | count(c_name) |
+-----------+---------------+
| 中文      |             2 |
| 英语      |             4 |
| 计算机    |             4 |
+-----------+---------------+
3 rows in set (0.00 sec)


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

mysql> select c_name,max(grade) from score
    -> group by c_name;
+-----------+------------+
| c_name    | max(grade) |
+-----------+------------+
| 中文      |         95 |
| 英语      |         94 |
| 计算机    |         98 |
+-----------+------------+
3 rows in set (0.00 sec)


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

mysql> select name,c_name,grade from student a inner join score b on a.id = b.stu_id
    -> where name = '李四';
+--------+-----------+-------+
| name   | c_name    | grade |
+--------+-----------+-------+
| 李四   | 计算机    |    70 |
| 李四   | 英语      |    92 |
+--------+-----------+-------+
2 rows in set (0.00 sec)


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

mysql> select * from student a ient a inner join score b on a.id=b.stu_id;
+-----+-----------+------+-------+--------------+--------------------+----+--------+-----------+-------+
| id  | name      | sex  | birth | department   | address            | id | stu_id | c_name    | grade |
+-----+-----------+------+-------+--------------+--------------------+----+--------+-----------+-------+
| 801 | 张老大    | 男   |  1985 | 计算机系     | 北京市海淀区       |  1 |    801 | 计算机    |    98 |
| 801 | 张老大    | 男   |  1985 | 计算机系     | 北京市海淀区       |  2 |    801 | 英语      |    80 |
| 802 | 张老二    | 男   |  1986 | 中文系       | 北京市昌平区       |  3 |    802 | 计算机    |    65 |
| 802 | 张老二    | 男   |  1986 | 中文系       | 北京市昌平区       |  4 |    802 | 中文      |    88 |
| 803 | 张三      | 女   |  1990 | 中文系       | 湖南省永州市       |  5 |    803 | 中文      |    95 |
| 804 | 李四      | 男   |  1990 | 英语系       | 辽宁省阜新市       |  6 |    804 | 计算机    |    70 |
| 804 | 李四      | 男   |  1990 | 英语系       | 辽宁省阜新市       |  7 |    804 | 英语      |    92 |
| 805 | 王五      | 女   |  1991 | 英语系       | 福建省厦门市       |  8 |    805 | 英语      |    94 |
| 805 | 王五      | 女   |  1991 | 英语系       | 福建省厦门市       |  9 |    805 | 计算机    |    90 |
| 806 | 王六      | 男   |  1988 | 计算机系     | 湖南省衡阳市       | 10 |    806 | 英语      |    85 |
+-----+-----------+------+-------+--------------+--------------------+----+--------+-----------+-------+
10 rows in set (0.00 sec)


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

mysql> select name,sum(grade) from student a
    -> inner join score b on a.id=b.stu_id
    -> group by name;
+-----------+------------+
| name      | sum(grade) |
+-----------+------------+
| 张三      |         95 |
| 张老二    |        153 |
| 张老大    |        178 |
| 李四      |        162 |
| 王五      |        184 |
| 王六      |         85 |
+-----------+------------+
6 rows in set (0.00 sec)


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

mysql> select c_name,avg(grade) from score
    -> group by c_name;
+-----------+------------+
| c_name    | avg(grade) |
+-----------+------------+
| 中文      |    91.5000 |
| 英语      |    87.7500 |
| 计算机    |    80.7500 |
+-----------+------------+
3 rows in set (0.00 sec)


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

mysql> select a.* from student a
    -> inner join score b on a.id=b.stu_id
    -> where c_name = '计算机' and grade < 95;
+-----+-----------+------+-------+------------+--------------------+
| id  | name      | sex  | birth | department | address            |
+-----+-----------+------+-------+------------+--------------------+
| 802 | 张老二    | 男   |  1986 | 中文系     | 北京市昌平区       |
| 804 | 李四      | 男   |  1990 | 英语系     | 辽宁省阜新市       |
| 805 | 王五      | 女   |  1991 | 英语系     | 福建省厦门市       |
+-----+-----------+------+-------+------------+--------------------+
3 rows in set (0.00 sec)


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

mysql> select a.* from (select c.* from student c
    -> inner join score b on c.id=b.stu_id
    -> where c_name = '计算机') a
    -> inner join score b on a.id = b.stu_id
    -> where c_name = '英语';
+-----+-----------+------+-------+--------------+--------------------+
| id  | name      | sex  | birth | department   | address            |
+-----+-----------+------+-------+--------------+--------------------+
| 801 | 张老大    | 男   |  1985 | 计算机系     | 北京市海淀区       |
| 804 | 李四      | 男   |  1990 | 英语系       | 辽宁省阜新市       |
| 805 | 王五      | 女   |  1991 | 英语系       | 福建省厦门市       |
+-----+-----------+------+-------+--------------+--------------------+
3 rows in set (0.00 sec)

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

mysql> select name,grade from student a
    -> inner join score b on a.id =b.stu_id
    -> where c_name = '计算机'
    -> order by grade desc;
+-----------+-------+
| name      | grade |
+-----------+-------+
| 张老大    |    98 |
| 王五      |    90 |
| 李四      |    70 |
| 张老二    |    65 |
+-----------+-------+
4 rows in set (0.00 sec)


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

mysql> select distinct a.id from student a 
    -> inner join score b on a.id = b.stu_id;
+-----+
| id  |
+-----+
| 801 |
| 802 |
| 803 |
| 804 |
| 805 |
| 806 |
+-----+
6 rows in set (0.00 sec)


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

mysql> select name 姓名,department 院系,c_name 考试科目,grade 成绩 from student a
    -> inner join score b on a.id=b.stu_id
    -> where name like '张%' or name like '王%';
+-----------+--------------+--------------+--------+
| 姓名      | 院系         | 考试科目     | 成绩   |
+-----------+--------------+--------------+--------+
| 张老大    | 计算机系     | 计算机       |     98 |
| 张老大    | 计算机系     | 英语         |     80 |
| 张老二    | 中文系       | 计算机       |     65 |
| 张老二    | 中文系       | 中文         |     88 |
| 张三      | 中文系       | 中文         |     95 |
| 王五      | 英语系       | 英语         |     94 |
| 王五      | 英语系       | 计算机       |     90 |
| 王六      | 计算机系     | 英语         |     85 |
+-----------+--------------+--------------+--------+
8 rows in set (0.01 sec)


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

mysql> select name 姓名,2023-birth 年龄,department 院系, c_name 考试科目,grade 成绩 from student a          
    -> inner join score b on a.id=b.stu_id                                                                  
    -> where address like '湖南%';                                                                           
+--------+--------+--------------+--------------+--------+
| 姓名   | 年龄   | 院系         | 考试科目     | 成绩   |
+--------+--------+--------------+--------------+--------+
| 张三   |     33 | 中文系       | 中文         |     95 |
| 王六   |     35 | 计算机系     | 英语         |     85 |
+--------+--------+--------------+--------------+--------+
2 rows in set (0.00 sec)

猜你喜欢

转载自blog.csdn.net/shenql_/article/details/131624096