数据库练习三

一、作业

1. 建库建表

(1) 创建数据库 mydbll_stu 并使用数据库
CREATE DATABASE mydbll_stu;
USE mydbll_stu;
(2) 创建 student 表
CREATE TABLE student (
    id INT(10) NOT NULL UNIQUE PRIMARY KEY,
    name VARCHAR(20) NOT NULL,
    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,
    studid INT(10) NOT NULL,
    c_name VARCHAR(20),
    grade INT(10)
);

2. 插入数据

(1) 向 student 表插入记录
INSERT INTO student VALUES (901, '张三丰', '男', 2002, '计算机系', '北京市海淀区');
INSERT INTO student VALUES (902, '周全有', '男', 2000, '中文系', '北京市昌平区');
INSERT INTO student VALUES (903, '张思维', '女', 2003, '中文系', '湖南省永州市');
INSERT INTO student VALUES (904, '李广昌', '男', 1999, '英语系', '辽宁省泰新市');
INSERT INTO student VALUES (905, '王翰', '男', 2004, '英语系', '福建省厦门市');
INSERT INTO student VALUES (906, '王心凌', '女', 1998, '计算机系', '湖南省衡阳市');
(2) 向 score 表插入记录
INSERT INTO score VALUES (NULL, 901, '计算机', 98);
INSERT INTO score VALUES (NULL, 901, '英语', 80);
INSERT INTO score VALUES (NULL, 902, '计算机', 65);
INSERT INTO score VALUES (NULL, 902, '中文', 88);
INSERT INTO score VALUES (NULL, 903, '中文', 95);
INSERT INTO score VALUES (NULL, 904, '计算机', 70);
INSERT INTO score VALUES (NULL, 904, '英语', 92);
INSERT INTO score VALUES (NULL, 905, '英语', 94);
INSERT INTO score VALUES (NULL, 906, '计算机', 49);
INSERT INTO score VALUES (NULL, 906, '英语', 83);

 3. 查询操作

(1).分别查询student表和score表的所有记录

(2).查询student表的第2条到5条记录

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

(4).从student表中查询年龄小于22岁的学生信息

(5).从student表中查询每个院系有多少人

(6).从score表中查询每个科目的最高分

(7).查询李广昌的考试科目(c_name)和考试成绩(grade)

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

(9).计算每个学生的总成绩

(10).计算每个考试科目的平均成绩

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

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

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

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

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

二、练习

 1.建库建表并且插入数据

mysql> use mydb7_openlab;
 
mysql> create  table  emp_new(sid int, name varchar(11), age int, worktime_start date, incoming int, dept2 int );
 
mysql> insert into emp_new values (1789,'张三',35,'1980/1/1',4000,101), (1674,'李四',32,'1983/4/1',3500,101), (1776,'王五',24,'1990/7/1',2000,101), (1568,'赵六',57,'1970/10/11',7500,102), (1564,'荣七',64,'1963/10/11',8500,102), (1879,'牛八',55,'1971/10/20',7300,103);
 
mysql> select * from emp_new;
+------+--------+------+----------------+----------+-------+
| sid  | name   | age  | worktime_start | incoming | dept2 |
+------+--------+------+----------------+----------+-------+
| 1789 | 张三   |   35 | 1980-01-01     |     4000 |   101 |
| 1674 | 李四   |   32 | 1983-04-01     |     3500 |   101 |
| 1776 | 王五   |   24 | 1990-07-01     |     2000 |   101 |
| 1568 | 赵六   |   57 | 1970-10-11     |     7500 |   102 |
| 1564 | 荣七   |   64 | 1963-10-11     |     8500 |   102 |
| 1879 | 牛八   |   55 | 1971-10-20     |     7300 |   103 |
+------+--------+------+----------------+----------+-------+
 
mysql> create table dept(dept1 int, dept_name varchar(11));
 
mysql> insert into dept values(101,"财务"),(102,"销售"),(103,"运维"),(104,"行政");
mysql> select * from dept;
+-------+-----------+
| dept1 | dept_name |
+-------+-----------+
|   101 | 财务      |
|   102 | 销售      |
|   103 | 运维      |
|   104 | 行政      |
+-------+-----------+

2.查询

1.找出销售部门中年纪最大的员工的姓名
mysql> select a.name,a.age from emp_new a join dept b  on b.dept1 = a.dept2 where b.dept_name = '销售' order by age desc limit1;
+--------+------+
| name   | age  |
+--------+------+
| 荣七   |   64 |
+--------+------+

2.求财务部门最低工资的员工姓名
mysql> select name from  emp_new a join  dept b on a.dept2=b.dept1 where dept_name = '财务' order by incoming asc limit 1;
+--------+
| name   |
+--------+
| 王五   |
+--------+


3.列出每个部门收入总和高于9000的部门名称
mysql> SELECT b.dept_name 
    -> FROM emp_new a 
    -> JOIN dept b ON a.dept2 = b.dept1 
    -> GROUP BY b.dept_name 
    -> HAVING SUM(a.incoming) > 9000;
+-----------+
| dept_name |
+-----------+
| 财务      |
| 销售      |
+-----------+

                         
4.求工资在7500到8500元之间,年龄最大的人的姓名及部门
mysql> SELECT a.name, b.dept_name 
    -> FROM emp_new a 
    -> JOIN dept b ON a.dept2 = b.dept1 
    -> WHERE a.incoming BETWEEN 7500 AND 8500 
    -> ORDER BY a.age DESC 
    -> LIMIT 1;
+--------+-----------+
| name   | dept_name |
+--------+-----------+
| 荣七   | 销售      |
+--------+-----------+


5.找出销售部门收入最低的员工入职时间
mysql> select worktime_start FROM emp_new a  JOIN dept b ON a.dept2 = b.dept1 where dept_name ='销售' order by incoming asc limit 1;
+----------------+
| worktime_start |
+----------------+
| 1970-10-11     |
+----------------+


6.财务部门收入超过2000元的员工姓名
mysql> select name FROM emp_new a  JOIN dept b ON a.dept2 = b.dept1 where dept_name ='财务' and incoming > 2000;
+--------+
| name   |
+--------+
| 张三   |
| 李四   |
+--------+


7.列出每个部门的平均收入及部门名称
mysql> select avg(incoming) ,dept_name FROM emp_new a  JOIN dept b ON a.dept2 = b.dept1 group by dept_name;
+---------------+-----------+
| avg(incoming) | dept_name |
+---------------+-----------+
|     3166.6667 | 财务      |
|     8000.0000 | 销售      |
|     7300.0000 | 运维      |
+---------------+-----------+


8.运维部入职员工的员工号
mysql> select sid FROM emp_new a  JOIN dept b ON a.dept2 = b.dept1 where dept_name ='运维' ;
+------+
| sid  |
+------+
| 1879 |
+------+


9.财务部门的收入总和
mysql> select dept_name, sum(incoming)from emp_new a JOIN dept b ON a.dept2 = b.dept1 where dept_name ='财务' group by dept_name ;
+-----------+---------------+
| dept_name | sum(incoming) |
+-----------+---------------+
| 财务      |          9500 |
+-----------+---------------+


10.先按部门号大小排序,再依据入职时间由早到晚排序员工信息表
mysql> select * from emp_new   order by dept2 asc, worktime_start asc ;
+------+--------+------+----------------+----------+-------+
| sid  | name   | age  | worktime_start | incoming | dept2 |
+------+--------+------+----------------+----------+-------+
| 1789 | 张三   |   35 | 1980-01-01     |     4000 |   101 |
| 1674 | 李四   |   32 | 1983-04-01     |     3500 |   101 |
| 1776 | 王五   |   24 | 1990-07-01     |     2000 |   101 |
| 1564 | 荣七   |   64 | 1963-10-11     |     8500 |   102 |
| 1568 | 赵六   |   57 | 1970-10-11     |     7500 |   102 |
| 1879 | 牛八   |   55 | 1971-10-20     |     7300 |   103 |
+------+--------+------+----------------+----------+-------+

11.找出哪个部门还没有员工入职
mysql> select dept_name  from emp_new a right JOIN dept b ON a.dept2 = b.dept1 where sid is null;
+-----------+
| dept_name |
+-----------+
| 行政      |
+-----------+

12.列出部门员工收入大于7000的部门编号,部门名称
mysql> select dept2, dept_name from emp_new a right JOIN dept b ON a.dept2 = b.dept1 where incoming > 7000;
+-------+-----------+
| dept2 | dept_name |
+-------+-----------+
|   102 | 销售      |
|   102 | 销售      |
|   103 | 运维      |
+-------+-----------+

13.列出每一个部门的员工总收入及部门名称
mysql> select dept_name, sum(incoming)  from emp_new a right JOIN dept b ON a.dept2 = b.dept1 group by dept_name;
+-----------+---------------+
| dept_name | sum(incoming) |
+-----------+---------------+
| 财务      |          9500 |
| 销售      |         16000 |
| 运维      |          7300 |
| 行政      |          NULL |
+-----------+---------------+

14.列出每一个部门中年纪最大的员工姓名,部门名称
mysql> SELECT d.dept_name '部门名称', e.name '姓名' 
    -> FROM emp_new a 
    -> JOIN dept b ON a.dept2 = b.dept1 
    -> WHERE (a.dept2, a.age) IN (
    ->     SELECT dept2, MAX(age) 
    ->     FROM emp_new 
    ->     GROUP BY dept2
    -> );
+--------------+--------+
| 部门名称     | 姓名   |
+--------------+--------+
| 财务         | 张三   |
| 销售         | 荣七   |
| 运维         | 牛八   |
+--------------+--------+

15.求李四的收入及部门名称
mysql> select dept_name ,incoming from emp_new e join dept d on e.dept2 = d.dept1 where name ='李四' ;
+-----------+----------+
| dept_name | incoming |
+-----------+----------+
| 财务      |     3500 |
+-----------+----------+

16.列出部门员工数大于1个的部门名称

mysql> select d.dept_name from emp_new a join dept d on a.dept2 = d.dept1 group by d.dept_name having count(a.sid) > 1;
+-----------+
| dept_name |
+-----------+
| 财务      |
| 销售      |
+-----------+


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值