宝安22班-周卫杰 发表于 2022-3-14 22:28:17

3月14号 周卫杰

本帖最后由 宝安22班-周卫杰 于 2022-3-15 02:35 编辑

下面是一个学生与课程的数据库,三个关系表为:
学生表A(Sid,SNAME,AGE,SEX)
成绩表B(Sid,Cid,GRADE)
课程表C(Cid,CNAME,TEACHER)
其中Sid为学号,SNAME为学生名字,AGE为年龄,SEX为性别,
Cid为课程号,GRADE为成绩,CNAME为课程名字,TEACHER为教师姓名。
SQL脚本如下:
#学生表
#create table A(Sid int(1),SNAME char(20),AGE int(1),SEX int(1));
#成绩表
#create table B(Sid int(1),Cid char(5),GRADE char(20)) ;
#课程表
#create table C(Cid char(5),CNAME char(20),TEACHER char(20));

学生表A(Sid,SNAME,AGE,SEX)
成绩表B(Sid,Cid,GRADE)
课程表C(Cid,CNAME,TEACHER)
create table A(Sid int(1),SNAME char(20),AGE int(1),SEX int(1));
create table B(Sid int(1),Cid char(5),GRADE char(20));
create table C(Cid char(5),CNAME char(20),TEACHER char(20));
insert into A(Sid,SNAME,AGE,SEX)values(1111,'David',28,1),(1112,'Dany',23,0),(1113,'TOM',38,1),(1114,'Lily',20,0);
insert into B(Sid,Cid,GRADE)values(1113,'C1','38'),(1112,'C2','80'),(1112,'C3','67'),(1111,'C4','88'),(1114,'C4','66');
insert into C(Cid,CNAME,TEACHER)values('C4','Maths','zhangsan'),('C3','English','lisi'),('C2','Chinese','wangwu'),('C1','Computer','zhaoliu');
select * from A;
select * from B;
select * from C;

请用SQL完成以下的操作:
1.查询出学习成绩及格以上的学生姓名与成绩;
select sname,grade
from a,(select sid,grade from b where grade >60)t
where t.sid=a.sid;

2.查询姓名以ny结尾的学生姓名及其任课老师姓名;
select sname,teacher
from (select * from a where sname like '%ny')t
left join b on t.sid=b.sid
left join c on b.cid=c.cid;

3.选修课名为Maths的学生学号与姓名;
select a.sid,sname
FROM c
right join b on c.cid=b.cid
right join a on a.sid=b.sid
where cname='maths';

4.选修课号为C2和C4的学生学号;
select * from c where cid in('c2','c4');
select sid
from (select * from c where cid in('c2','c4'))t
left join b on b.cid=t.cid;

5.请问没的学生的姓名及其学号;
select * from b where grade is null;
select sname,a.sid
from (select sid from b where grade is null)t
left join a on t.sid=a.sid;

6.请问总分在80分以上的学生姓名;
select * from b where grade >80;
select sname
from (select * from b where grade >80)t
left join a on t.sid=a.sid;


7.请问考试不及格的考生姓名以及科目名称;
select * from b where grade <60;
select sname,cname
from (select * from b where grade <60)t
left join a on t.sid=a.sid
left join c on t.cid=c.cid;

8.找出Dany的所有考试后成绩中最高的科目的任课老师姓名;
select grade,teacher from a
left join b on a.sid=b.sid
left join c on b.cid=c.cid
where sname='dany';
select max(grade),teacher from (select grade,teacher from a
left join b on a.sid=b.sid
left join c on b.cid=c.cid
where a.sname='dany')t;

9.各个科目的平均成绩各是多少;
select * from b;
select * from b left join c on b.cid=c.cid;
select avg(grade),cname
from (select grade,cname from b left join c on b.cid=c.cid)t
group by cname;

10.由于录入员的失误,导致TOM同学有成绩不及格的科目,请帮忙将其合理修正;
select * from a left join b on a.sid=b.sid where sname='tom';
update b set grade=60
where sid=(select sid from a where sname='tom');

11.显示出参加考试的学生的学号和姓名:
select * from a left join b on a.sid=b.sid;
select sname,sid
from (select a.sid,sname,grade from a left join b on a.sid=b.sid)t
where grade is not null;

12.请问TOM一共参加了几门科目的考试;
select count(*) from (select a.sid,sname,grade from a left join b on a.sid=b.sid)t
where sname='tom';

13.期末,DBA发现学生表中没有班级字段,请帮忙将其合理修正;
alter table A add (class varchar(10));
desc a;

14.学校新招了1位美术老师叫“白雪”,请在课程表中增加一条相应的记录,课程编号为C5;
select * from c;
insert into c values('C5','the art','baixue');

15.赵姓的老师很早就离职了,然而课程表中却还有其上课的记录,请帮忙删除;
delete from c where teacher='zhaoliu';

16.请求出TOM同学所有任课老师的名字及其所教的课程名;
select teacher,cname
from (select teacher,cname,sname
from a
left join b on a.sid=b.sid
left join c on c.cid=b.cid)t
where sname='tom';

17.求每个同学的各科(总分或者平均)成绩,并以每一个人的成绩的先大后小的顺序显示;
select avg(grade),cname,sname
from (select sname,grade,cname
from a
left join b on a.sid=b.sid
left join c on c.cid=b.cid)t
group by sname
order by grade desc;

18.请问张老师教什么课程,以及他班上所有学生的姓名;#
select cid,cname from c where teacher='zhangsan';
select cname,sname
from (select teacher,sname,cname
from a
left join b on a.sid=b.sid
left join c on c.cid=b.cid)t
where teacher='zhangsan';
CREATE TABLE DEPT(
    DEPTNO INT PRIMARY KEY comment '部门id',
    DNAME VARCHAR(14) comment '部门名称', -- 部门名称
    LOC VARCHAR(13) comment '部门地址' -- 部门地址
)DEFAULt CHARSET=UTF8 ;
INSERT INTO DEPT VALUES (10,'ACCOUNTING','NEW YORK');
INSERT INTO DEPT VALUES (20,'RESEARCH','DALLAS');
INSERT INTO DEPT VALUES (30,'SALES','CHICAGO');
INSERT INTO DEPT VALUES (40,'OPERATIONS','BOSTON');

SELECT * FROM DEPT

CREATE TABLE EMP(
    EMPNO INTPRIMARY KEY COMMENT '员工编号', -- 员工编号
    ENAME VARCHAR(10) comment '员工姓名', -- 员工姓名
    JOB VARCHAR(9) comment '员工工作', -- 员工工作
    MGR INT comment '员工领导编号', -- 员工直属领导编号
    HIREDATE DATE comment '入职时间', -- 入职时间
    SAL DOUBLE comment '员工工资', -- 工资
    COMM DOUBLE comment '奖金', -- 奖金
    DEPTNO INT comment '部门id',-- 所在部门
    FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO))DEFAULTcharset=utf8;-- 关联dept表

-- ALTER TABLE EMP ADD FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO);
INSERT INTO EMP VALUES(7369,'SMITH','职员',7566,"1980-12-17",800,NULL,20);
INSERT INTO EMP VALUES(7499,'ALLEN','销售员',7698,'1981-02-20',1600,300,30);
INSERT INTO EMP VALUES(7521,'WARD','销售员',7698,'1981-02-22',1250,500,30);
INSERT INTO EMP VALUES(7566,'JONES','经理',7839,'1981-04-02',2975,NULL,20);
INSERT INTO EMP VALUES(7654,'MARTIN','销售员',7698,'1981-09-28',1250,1400,30);
INSERT INTO EMP VALUES(7698,'BLAKE','经理',7839,'1981-05-01',2850,NULL,30);
INSERT INTO EMP VALUES(7782,'CLARK','经理',7839,'1981-06-09',2450,NULL,10);
INSERT INTO EMP VALUES(7788,'SCOTT','职员',7566,'1987-07-03',3000,2000,20);
INSERT INTO EMP VALUES(7839,'KING','董事长',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO EMP VALUES(7844,'TURNERS','销售员',7698,'1981-09-08',1500,50,30);
INSERT INTO EMP VALUES(7876,'ADAMS','职员',7566,'1987-07-13',1100,NULL,20);
INSERT INTO EMP VALUES(7900,'JAMES','职员',7698,'1981-12-03',1250,NULL,30);
INSERT INTO EMP VALUES(7902,'FORD','销售员',7566,'1981-12-03',3000,NULL,20);
INSERT INTO EMP VALUES(7934,'MILLER','职员',7782,'1981-01-23',1300,NULL,10);

select *
from emp;

drop table SAVEPOINT;

CREATE TABLE SALGRADE(
    GRADE INT comment '员工等级',-- 等级
    LOSAL DOUBLE comment '最低工资', -- 最低工资
    HISAL DOUBLE comment '最高工资' )DEFAULT CHARSET=UTF8; -- 最高工资

INSERT INTO SALGRADE VALUES (1,500,1000);
INSERT INTO SALGRADE VALUES (2,1001,1500);
INSERT INTO SALGRADE VALUES (3,1501,2000);
INSERT INTO SALGRADE VALUES (4,2001,3000);
INSERT INTO SALGRADE VALUES (5,3001,9999);

select * from salgrade;
select *from emp;
SELECT * FROM DEPT;
单表题目:
1、查找部门30中员工的详细信息。
select * from emp where deptno=30;

2、找出从事职员工作的员工的编号、姓名、部门号。(clerk职员,办事员)
select empno,ename,deptno from emp where job='职员';

3、检索出奖金多于基本工资的员工信息。
select * from emp where sal<comm;

4、检索出奖金多于基本工资60%的员工信息。
select * from emp where comm >sal*0.6;

5、找出10部门的经理、20部门的职员 的员工信息。(manager经理;管理
select * from emp where (deptno=10 and job='经理') or (deptno=20 and job='职员');

6、找出10部门的经理、20部门的职员 或者既不是经理也不是职员但是工资高于2000元的员工信息。(sal 工资)
select * from emp
where (deptno=10 and job='经理')
or (deptno=20 and job='职员')
or (sal>2000 and job!='经理' and job!='职员');

7、找出获得奖金的员工的工作。(comm奖金)
select job,ename,comm from emp where comm is not null;

8、找出奖金少于100或者没有获得奖金的员工的信息。
select * from emp where (comm is null) or (comm <100);

9、找出姓名以A、B、S开始的员工信息.
select * from emp where ename like ('a%')
or ename like ('b%')
or ename like ('s%');

10、找到名字长度为6个字符的员工信息。
select * from emp where char_length(ename)>6;

11、名字中不包含R字符的员工信息。
select * from emp where ename not like '%R%';

12、查找员工的详细信息并按姓名排序。
select * from emp order by ename asc;

13、返回员工的信息并按工作降序工资升序排列。(升序的规则)
select * from emp order by sal desc;

14、计算员工的日薪(按30天)。
select ename,sal/30 as'日薪' from emp;

15、找出姓名中包含A的员工信息。
select * from emp where ename like '%a'
or ename like '%a%'
or ename like 'a%';

多表题目
多表查询答案
1、返回拥有员工的部门名、部门号。
select dept.deptno,dept.dname
from emp left join dept on dept.deptno=emp.deptno
where dname is not null group by deptno;

2、工资水平多于smith的员工信息。
select * from emp
where sal>(select sal from emp where ename='smith');

3、返回员工和所属经理的姓名。
select a.ename,b.ename
from (select * from emp where job='经理')b
left join (select * from emp where job!='经理')a
on a.deptno=b.deptno;

4、返回雇员的雇佣日期早于其经理雇佣日期的员工及其经理姓名。
select a.ename,b.ename
from (select ename,hiredate,deptno from emp where job='经理')b
left join (select ename,hiredate,deptno from emp where job!='经理')a
on a.deptno=b.deptno
where b.hiredate>a.hiredate;

5、返回员工姓名及其所在的部门名称。
select emp.ename,dept.dname
from emp left join dept on emp.deptno=dept.deptno;

6、返回从事clerk工作的员工姓名和所在部门名称。(CLERK销售)
select emp.ename,dept.dname,job
from emp left join dept on emp.deptno=dept.deptno
where job='销售员';

7、返回部门号及其本部门的最低工资。
select min(sal),deptno from emp
group by deptno;

8、返回销售部(sales)所有员工的姓名。
select emp.ename
from emp left join dept on emp.deptno=dept.deptno
where dept.dname='sales';

9、返回工资水平多于平均工资的员工。
select ename from emp
where (select avg(sal) from emp)<sal

10、返回与SCOTT从事相同工作的员工。(职员)
select ename
from emp
where job=(select job from emp where ename='scott');

11、返回与30部门员工工资水平相同的员工姓名与工资。
select ename,sal
from emp
where sal in (select sal from emp where deptno=30);

12、返回工资高于30部门所有员工工资水平的员工信息。
select *
from emp
where sal > (select max(sal) from emp where deptno=30);

13、返回部门号、部门名、部门所在位置及其每个部门的工员总数。
select dept.deptno,dname,loc,count(emp.empno)
from emp left join dept on emp.deptno=dept.deptno
group by emp.deptno;

14、返回员工的姓名、所在部门名及其工资。
select ename,dname,sal
from emp left join dept on emp.deptno=dept.deptno;

15、返回员工的详细信息。(包括部门名)
select emp.*,dname
from emp left join dept on emp.deptno=dept.deptno;


16、返回员工工作及其从事此工作的最低工资。
select job,min(sal) from emp group by job;

17、计算出员工的年薪,并且以年薪排序。
select ename,sal*12
from emp
order by sal*12 desc;

18、返回工资处于第四级别的员工的姓名。
select ename from emp
where sal>(select losal from salgrade where grade=4)
and sal<(select hisal from salgrade where grade=4);
19、返回工资为二等级的职员名字、部门所在地、和二等级的最低工资和最高工资

20.工资等级多于smith的员工信息。



页: [1]
查看完整版本: 3月14号 周卫杰