MySQL(07-11至07-12)


/消除重复行/

select distinct job
from emp;

/查看表结构/

describe emp;
describe emp;
describe salgrade;

/where/

select *
from emp
where deptno = 10;
select ename, job, sal, deptno
from emp
where job = 'clerk'
  and deptno = 20;
select empno, job, hiredate
from emp
where job = 'SALESMAN';
select ename, hiredate
from emp
where hiredate < '1985-12-31';
select ename, empno, deptno
from emp
where empno <> 10;

/BETWEEN/

SELECT ename, sal
FROM emp
WHERE sal BETWEEN 1000 AND 1500;

/IN/

SELECT empno, ename, sal, mgr
FROM emp
WHERE mgr IN (7902, 7566, 7788);
select hiredate
from emp
where hiredate between '1982-01-01' and '1985-12-31';
select sal
from emp
where sal between 3000 and 5000;
select ename, deptno
from emp
where deptno in (10, 20);
select ename, deptno
from emp
where deptno = 10
   or deptno = 20;
select ename, mgr
from emp
where mgr in (7902, 7566, 7788);

/like/

select ename
from emp
where ename like 's%';
select ename
from emp
where ename like 's_';
select ename
from emp
where ename like '_l%';
select ename, job
from emp
where job like 'man@_%' escape '@';
select ename
from emp
where ename like 'w%';
select ename
from emp
where ename like '%t_';
select ename, comm
from emp
where comm is null;
select ename, job, sal
from emp
where sal > 2000
  and (job = 'manager' or job = 'salesman');
select ename, deptno, sal
from emp
where deptno in (10, 20)
  and sal between 3000 and 5000;
select ename, hiredate, job
from emp
where hiredate between '1981-01-01' and '1981-12-31'
  and job <> 'sales%';
select ename, job, deptno
from emp
where deptno in (10, 20)
  and job in ('manager', 'salesman')
  and ename like '%a%';
select ename, deptno, sal
from emp
where deptno in (20, 30)
order by sal;
select ename, deptno, sal
from emp
where sal between 2000 and 3000
  and deptno <> 10
order by deptno, sal desc;
select ename, hiredate, job
from emp
where hiredate between '1982-01-01' and '1983-12-31'
    and job like 'sales%'
   or 'man%'
order by hiredate desc;
select ename, hiredate
from emp
order by hiredate
limit 0,5;
select ename, hiredate, deptno
from emp
where deptno = 20
order by hiredate
limit 0,2;
select ename, hiredate, deptno
from emp
limit 0,5;
select ename, hiredate, deptno
from emp
limit 5,5;
select ename, hiredate, deptno
from emp
limit 10,5;

/查询入职时间在1982-7-9之后,并且不从事SALESMAN工作的员工姓名、入职时间、职位/

select ename, hiredate, job
from emp
where hiredate > '1982-07-09'
  and job <> 'salesman';

/查询员工姓名的第三个字母是a的员工姓名/

select ename
from emp
where ename like '__a%';

/查询除了10、20号部门以外的员工姓名、部门编号。/

select ename, deptno
from emp
where deptno not in (10, 20);

/查询部门号为30号员工的信息,先按工资降序排序,再按姓名升序排序/

select *
from emp
where deptno = 30
order by sal desc, ename;

/查询没有上级的员工(经理号为空)的员工姓名/

select ename
from emp
where mgr is null;

/查询工资大于等于4500并且部门为10或者20的员工的姓名、工资、部门编号/

select ename, deptno
from emp
where sal >= 4500
  and deptno in (10, 20);
select emp.ename, dept.dname, dept.loc
from emp,dept;
select emp.empno, emp.ename, emp.deptno, dept.deptno, dept.loc
from dept,emp
where emp.deptno = dept.deptno;
select emp.empno, emp.ename, emp.deptno, dept.deptno, dept.loc
from dept,emp
where emp.deptno = dept.deptno
  and dept.loc = 'new york';
select e.ename, e.deptno, d.deptno, d.dname
from emp e,dept d
where d.deptno = e.deptno;

/写一个查询,显示所有工作在CHICAGO并且奖金不为空的员工姓名,工作地点,奖金/

select e.ename, d.loc, e.comm
from emp e,
     dept d
where d.loc = 'chicago'
  and e.comm is not null
  and e.deptno = d.deptno;

/写一个查询,显示所有姓名中含有A字符的员工姓名,工作地点。/

select e.ename, d.loc
from emp e,
     dept d
where e.ename like '%a%'
  and e.deptno = d.deptno;

describe salgrade;

/查询每个员工的姓名,工资,工资等级/

select e.ename, e.sal, s.grade
from emp e,
     salgrade s
where e.sal between s.losal and s.hisal;

/查询每个员工的编号,姓名,工资,工资等级,所在工作城市,按照工资等级和雇佣日期进行升序排序。/

select e.ename, e.empno, e.sal, s.grade, d.loc
from emp e,
     dept d,
     salgrade s
where e.deptno = d.deptno
  and e.sal between s.losal and s.hisal
order by e.hiredate, s.grade asc;

/查询每个员工的姓名和直接上级姓名?/

select worker.ename '员工姓名', manager.ename '直接上级'
from emp worker,
     emp manager
where worker.mgr = manager.empno;

/查询所有工作在NEW YORK和CHICAGO的员工姓名,员工编号,以及他们的经理姓名,经理编号/

select worker.ename  '员工姓名',
       manager.ename '经理姓名',
       worker.empno  '员工编号',
       manager.empno '经理编号',
       d.loc
from emp worker,
     emp manager,
     dept d
where d.loc in ('NEW YORK', 'CHICAGO')
  and worker.mgr = manager.empno
  and worker.deptno = d.deptno;

/交叉连接
得到的查询结果是两张表的笛卡尔积,
也就是用A表中的每条数据都去匹配B表中的所有数据,
获得的结果往往不是我们需要的,一般很少使用交叉连接。
/
/创建一个员工表和部门表的交叉连接。/

select *
from emp,
     dept;

/使用自然连接,显示入职日期在80年5月1日之后的员工姓名,部门名称,入职日期/

select e.ename, d.dname, e.hiredate
from emp e,
     dept d
where e.hiredate > '1980-05-01'
  and e.deptno = d.deptno;

/使用左连接,查询每个员工的姓名,经理姓名,没有经理的King也要显示出来。/

select worker.ename, manager.ename
from emp worker
         left outer join emp manager
                         on worker.mgr = manager.empno;

/使用右连接,查询每个员工的姓名,经理姓名,没有经理的King也要显示出来。/

select worker.ename, manager.ename
from emp manager
         right outer join emp worker
                          on manager.empno = worker.mgr;

/显示员工SMITH的姓名,部门名称,直接上级名称/

select worker.ename, d.dname, manager.ename
from emp worker,
     emp manager,
     dept d
where worker.ename = 'smith'
  and worker.mgr = manager.empno
  and worker.deptno = d.deptno;

/显示员工姓名,部门名称,工资,工资级别,要求工资级别大于4级。/

select e.ename, d.dname, e.sal, s.grade
from emp e,
     dept d,
     salgrade s
where e.deptno = d.deptno
  and e.sal between s.losal and s.hisal
  and s.grade > 4;

/显示员工KING和FORD管理的员工姓名及其经理姓名。/

select worker.ename, manager.ename
from emp worker
         left join emp manager
                   on worker.mgr = manager.empno
where manager.ename in ('king', 'ford');

select w.ename as 员工姓名, m.ename as 经理姓名
from emp w
         LEFT JOIN emp m on (w.mgr = m.empno)
where m.ename in ('KING', 'FORD');

select wname,mname
from(
select worker.ename wname, manager.ename mname
from emp worker
         left join emp manager
                   on worker.mgr = manager.empno
where worker.ename in ('king', 'ford')
union
select worker.ename, manager.ename
from emp worker
         left join emp manager
                   on worker.mgr = manager.empno
where manager.ename in ('king', 'ford')) t;

SELECT worker.ename 'ENAME', e.ename, manager.ename 'LNAME'
 FROM emp worker
 JOIN emp e
 ON worker.mgr=e.empno
 LEFT OUTER JOIN emp manager
 ON e.mgr=manager.empno
 WHERE e.ename in ('KING','FORD');

/显示员工姓名,参加工作时间,经理名,参加工作时间,要求参加时间比经理早。/

select worker.ename,
       worker.hiredate,
       manager.ename,
       manager.hiredate
from emp worker,
     emp manager
where worker.mgr = manager.empno
  and worker.hiredate < manager.hiredate;

/查询职位以SALES开头的所有员工平均工资、最低工资、最高工资、工资和、人数。/

select avg(sal) '平均工资'
     , min(sal) '最低工资'
     , max(sal) '最高工资'
     , sum(sal) '工资和'
     , count(*) '人数'
from emp
where job like 'sales%';

/分组关键字:group by/

select deptno, avg(sal)
from emp
group by deptno
order by avg(sal);

/查询每个部门,每个岗位的部门编号,部门名称,岗位名称,
部门人数,最高工资,最低工资,工资总和,平均工资。
/

select d.deptno '部门编号',
       dname    '部门名称',
       job      '岗位名称',
       count(*) '部门人数',
       max(sal) '最高工资',
       min(sal) '最低工资',
       sum(sal) '工资总和',
       avg(sal) '平均工资'
from emp e,
     dept d
group by d.deptno, e.job;

/查询每个经理所管理的人数,经理编号,经理姓名,要求包括没有经理的人员信息。/

select manager.empno '经理编号', manager.ename '经理姓名', count(*)
from emp worker
         left join emp manager
                   on worker.mgr = manager.empno
group by manager.empno;

/查询部门人数大于2的部门编号,部门名称,部门人数。/

select e.deptno, d.dname, count(*)
from emp e,
     dept d
where e.deptno = d.deptno
group by d.deptno
having count(*) > 2;

/查询部门平均工资大于2000,且人数大于2的部门编号,部门名称,
部门人数,部门平均工资,并按照部门人数升序排序
/

select d.deptno, dname, count(*), avg(sal)
from emp e,
     dept d
where e.deptno = d.deptno
group by d.deptno
having avg(sal) > 2000
   and count(*) > 2
order by count(*);

/查询出比JONES为雇员工资高的其他雇员/

select ename
from emp
where sal >
      (select sal from emp where ename = 'jones');

/显示和雇员7369从事相同工作并且工资大于雇员7876的雇员的姓名和工作/

select ename, job, sal
from emp
where job =
      (select job from emp where empno = 7369)
  and sal >
      (select sal from emp where empno = 7876);

/查询工资最低的员工姓名,岗位及工资/

select ename, job, sal
from emp
where sal =
      (select min(sal) from emp);

/*查询部门最低工资比20部门最低工资高的部门编号及最低工资
*/

select deptno, min(sal)
from emp
group by deptno
having min(sal) >
       (select min(sal) from emp where deptno = 20);

/查询入职日期最早的员工姓名,入职日期/

select ename,hiredate
from emp
where hiredate =
      (select min(hiredate) from emp);

/查询工资比SMITH工资高并且工作地点在CHICAGO的员工姓名,工资,部门名称/

select ename, sal, dname
from emp e,
     dept d
where e.deptno = d.deptno
  and sal >
      (select sal from emp where ename = 'smith')
  and loc = 'chicago';

/查询入职日期比20部门入职日期最早的员工还要早的员工姓名,入职日期/

select min(hiredate),ename,deptno
from emp
group by deptno
having min(hiredate)<
(select min(hiredate)
from emp
where deptno = 10);

/* 查询部门编号不为10,
且工资比10部门任意一名员工工资高的员工编号,姓名,职位,工资。*/

select empno, ename, job, sal
from emp
where deptno <> 10
  and sal > any (select sal from emp where deptno = 10);

/查询入职日期比10部门任意一个员工晚的员工姓名、入职日期,不包括10部门员工/

select ename, hiredate
from emp
where hiredate > any (select hiredate from emp where deptno = 10)
  and deptno <> 10;

/查询入职日期比10部门所有员工晚的员工姓名、入职日期,不包括10部门员工/

select ename, hiredate
from emp
where hiredate > all (select hiredate from emp where deptno = 10)
  and deptno <> 10;

/查询职位和10部门任意一个员工职位相同的员工姓名,职位,不包括10部门员工/

select ename, job
from emp
where job in (select job from emp where deptno = 10)
  and deptno <> 10;

/查询比自己部门平均工资高的员工姓名,工资,部门编号,部门平均工资/

select ename, sal, a.deptno, a.avgSal
from emp e,
     (select deptno, avg(sal) avgSal from emp group by deptno) a
where e.deptno = a.deptno
  and e.sal > a.avgSal;

/查询部门平均工资在2500元以上的部门名称及平均工资/

select dname,avg(sal)
from emp e,dept d
where e.deptno = d.deptno
group by d.deptno
having avg(sal) > 2500;
select dname,avg(sal)
from emp e join dept d
GROUP BY e.deptno
having  avg(sal) > 2500;

/查询员工岗位中不是以“SA”开头并且平均工资在2500元以上的岗位及平均工资,
并按平均工资降序排序。
/

select job,avg(sal)
from emp
group by job
having job not like 'sa%' and avg(sal) > 2500
order by avg(sal) desc ;

/查询部门人数在2人以上的部门名称、最低工资、最高工资。/

select dname,min(sal),max(sal),count(*)
from emp e,dept d
where e.deptno = d.deptno
group by d.deptno
having count(*) > 2;

/查询岗位不为SALESMAN,工资和大于等于2500的岗位及每种岗位的工资和。/

select job,sum(sal)
from emp
group by job
having job <> 'salesman' and sum(sal) > 2500;

/显示经理号码和经理姓名,这个经理所管理员工的最低工资,
没有经理的KING也要显示,不包括最低工资小于3000的,
按最低工资由高到低排序
/

select manager.empno, manager.ename, min(worker.sal)
from emp worker
         left join emp manager on worker.mgr = manager.empno
group by manager.empno
having min(worker.sal) >= 3000
order by min(worker.sal) desc;

SELECT e.mgr, m.ename, min(e.sal)
from emp e
         LEFT JOIN emp m
                   on e.mgr = m.empno
GROUP BY e.mgr
HAVING min(e.sal) >= 3000
ORDER BY min(e.sal) desc;

/查询工资高于编号为7782的员工工资,
并且和7369号员工从事相同工作的员工的编号、姓名及工资。
/

select empno, ename, sal
from emp
where sal >
      (select sal from emp where empno = 7782)
  and job =
      (select job from emp where empno = 7369);

/查询工资最高的员工姓名和工资。/

select ename,sal
from emp
where sal = (select max(sal) from emp);

/查询部门最低工资高于10号部门最低工资的部门的编号、名称及部门最低工资/

select min(sal), e.deptno, d.dname
from emp e,
     dept d
where e.deptno = d.deptno
group by e.deptno
having min(sal) >
       (select min(sal)
        from emp
        where deptno = 10);
SELECT e.deptno, dname, min(sal)
from emp e
         join dept d
              on e.deptno = d.deptno
GROUP BY e.deptno
having min(sal) >
       (SELECT min(sal)
        from emp
        where deptno = 10);

/查询员工工资为其部门最低工资的员工的编号和姓名及工资。/

select empno, ename, sal
from emp,
     (select deptno,min(sal) minSal
      from emp
      group by deptno) a
where emp.deptno = a.deptno and sal = minSal;

/显示经理是KING的员工姓名,工资/

select worker.ename, worker.sal
from emp worker,
     emp manager
where worker.mgr = manager.empno
  and manager.ename = 'king';
SELECT ename, sal
from emp e
where e.mgr =
      (select empno
       from emp
       where ename = 'king');

/显示比员工SMITH参加工作时间晚的员工姓名,工资,参加工作时间。/

select ename, sal, hiredate
from emp
where hiredate >
      (select hiredate from emp where ename = 'smith');

/创建t_user表/

create table t_user(
    id int(11) primary key auto_increment,
    uname varchar(10) unique ,
    password varchar(10),
    realname varchar(10),
    age int(11),
    height decimal(3,2),
    birthdate date
);

/插入一条数据/

insert into t_user (uname, password, realname, age, height, birthdate)
values ('tom','123','张三',20,1.83,'2022-07-12');

/查询是否插入成功/

select *
from t_user;

/非空约束/

create table test01(
    uname varchar(10) not null , /*非空*/
    gender char(1)
);
insert into test01 values ('tom',null); /*ok*/
insert into test01 values (null,null); /*error*/
insert into test01 values ('',null); /*ok*/
insert into test01 values (123,null); /*ok*/

/建表时提供默认值,可以在插入数据时忽略非空约束/

create table test02(
    uname varchar(10) not null  default '默认姓名', /*非空*/
    gender char(1)
);
insert into test02(gender) values (null);
select * from test02;

/唯一约束/

create table test03(
    uname varchar(10) unique
);
insert into test03 values('aa');
insert into test03 values('aa'); #error,值重复了
insert into test03 values (null);
insert into test03 values (null); #ok
select * from test03;

设置主键

create table classes(
  classes_id int primary key ,
  classes_name varchar(10) unique ,
  classes_dept varchar(10)
);
insert into classes values (1001,'java01','计算机');
# error 主键值不能重复
insert into classes values (1001,'java01','电子信息');

设置外键

create table teacher(
    teacher_id int primary key auto_increment,
    teacher_name varchar(20),
    cid int,
    # 表级约束
    foreign key (cid) references classes(classes_id)
);

外键列的值,必须在主表的主键值范围内

# 当前表的主键设置自增了,所以传入null值时,数据库会使用自增对象给主键提供值
insert into teacher values (null,'tom',1001);
# error,在主表中没有1002这个主键值
insert into teacher values (null,'tom2',1002);

/*

  1. 学校想做一个选课系统,其中涉及到课程表,学生表,请分别创建这两个表,自己思考表中应有的列及数据类型。
  2. 学校有一个选课系统,其中包括如下关系模式:
    ○ 系(系编号: 主键,系名称: 唯一键,系主任: 非空约束,系所在校去:默认为浑南区)
    ○ 班级(班级编号: 主键,班级名称: 唯一键,所属系: 外键)
  3. 创建学生表,包含如下属性:
    ○ 学号 定长字符型 10位 主键
    ○ 姓名 变长字符型 20位 非空
    ○ 性别 定长字符型 2位
    ○ 出生日期 日期型
    ○ 所在班级*/
# 课程表
create table work_course(
    course_id int primary key auto_increment,
    course_name varchar(10) not null ,
    course_credits int not null
);
insert into work_course values (1,'java全栈',4);
select *
from work_course;

# 班级表
create table work_classes(
    classes_id int primary key auto_increment,
    classes_name varchar(20) unique ,
    system_id int,
    foreign key (system_id) references work_system(system_id)
);
insert into work_classes values (319,'java精英班',1);
select *
from work_classes;


# 系表
create table work_system(
    system_id int primary key auto_increment,
    system_name varchar(20) unique ,
    system_manager varchar(20) not null ,
    system_region varchar(20) default '浑南区'
);
insert into work_system values (1,'计算机科学与技术','柳传志','北京');
select *
from work_system;

# 学生表
create table work_student(
    student_id char(10) primary key ,
    student_name varchar(20) not null ,
    student_sex char(2) ,
    birthdate date ,
    course_id int ,
    classes_id int,
    foreign key (course_id) references work_course(course_id) ,
    foreign key (classes_id) references work_classes(classes_id)
);
insert into work_student values (1,'张三','男','2001-09-27',1,319);
select *
from work_student;

复制表:使用like,约束也会复制过来

create table dept2 like dept;
select *
from dept2;

复制表:使用子查询,主外键约束不会复制,记录会复制

create table dept3 select * from dept;
select *
from dept3;

通过alter命令给表增加列

alter table dept2 add column col int not null;
desc dept2;
# 通过alter命令删除列
alter table dept2 drop column col;
desc dept2;

/创建与dept表相同表结构的表dtest,
将dept表中部门编号在40之前的信息插入该表
/

create table dtest select * from dept where deptno < 40;
select * from dtest;
drop table dtest;

/创建与emp表结构相同的表empl,
并将其部门编号为前30号的员工信息复制到empl表。
/

create table empl select * from emp where deptno <=30;
select *
from empl;
drop table empl;

/插入日期值:使用MySQL的函数sysdate()、使用字符串/

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
    values (1001,'张三','经理',null,sysdate(),1000,null,30);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
    values (1002,'张三','经理',null,'2019-01-10',1000,null,30);

/一次插入多条数据/

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
    VALUES (1005,'张三','经理',null,'2019-01-10',1000,null,30),
           (1003,'张三','经理',null,'2019-01-10',1000,null,30),
           (1004,'张三','经理',null,'2019-01-10',1000,null,30);

/使用子查询插入数据/
insert into emp select * from emp where deptno = 10;

/插入数据时要考虑外键约束/

/修改emp表中7782员工的领导编号、雇佣日期、工资、奖金/

update emp
set mgr = 1001,hiredate = sysdate(),sal = 1202,comm = 200
where empno = 7782;

/修改工作地点在new york或者Chicago的员工工资,工资加500/

update emp
set sal = sal + 500
where deptno
          in (select dept.deptno from dept where loc in ('new york','chicago'));

/删除数据/

delete from emp
where ename = '张三';

delete、truncate、drop 三者的区别:
drop:删除内容和定义,释放空间。(表结构和数据一同删除)
【drop语句将删除表的结构,被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。】
truncate:删除内容,释放空间,但不删除定义。(表结构还在,数据删除)
【truncate table 权限默认授予表所有者、sysadmin 固定服务器角色成员、db_owner 和 db_ddladmin 固定数据库角色成员且不可转让。】
delete:删除内容,不删除定义,也不释放空间。

/删除工资大于所在部门平均工资的员工记录/

delete
from emp
where empno in (select empno
                from emp e,
                     (select deptno, avg(sal) avgSal from emp group by deptno) a
                where e.deptno = a.deptno
                  and e.sal > a.avgSal); /*error,MySQL中不允许where中直接出现被更新的表*/

/修改/

delete
from emp
where empno in (select *
                from (select empno
                      from emp e,
                           (select deptno, avg(sal) avgSal from emp group by deptno) a
                      where e.deptno = a.deptno
                        and e.sal > a.avgSal) b);

事务:由一个或者多个SQL语句组成,其中的SQL语句要么全部执行成功,要么全部失败,在数据库中,通过事务来保证数据的一致性
事务的特征:

  • 原子性:不可分割,组成事务的DML语言要么全部成功要么全部失败,不可出现部分成功部分失败的情况
  • 一致性:一旦事务完成,不管是成功的还是失败的,整个系统处于数据一致的状态
  • 隔离性:一个事务的执行不会被另外一个事务干扰
  • 持久性:也称为永久性,指事务一旦提交,对数据的改变就是永久的,不可以再被回滚

07-12作业
/1. 创建与dept表相同表结构的表dtest,将dept表中部门编号在40之前的信息插入该表。/

create table if not exists dtest as
select *
from dept
where deptno < 40;

/2. 创建与emp表结构相同的表empl,并将其部门编号为前30号的员工信息复制到empl表。/

create table empl select * from emp where deptno <=30;
select *
from empl;
drop table empl;

/3. 向员工表中新增一个员工,员工编号为8888,姓名为BOB,岗位为CLERK,经理为号7788,入职日期为1985-03-03,薪资3000,奖金和部门为空。/

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (8888,'BOB','CLERK',7788,'1985-03-03',3000,null,null);

/4. 使用CREATE TABLE emp_back as SELECT – FROM EMP WHERE 1=0,创建emp_back表,拷贝下来即可。
把emp表中入职日期大于1982年1月1日之前的员工信息复制到emp_back表中。
/

CREATE TABLE emp_back as SELECT * FROM EMP WHERE 1=0;
insert into emp_back
select *
from emp
where hiredate > '1982-01-01';

/*使用如下语句,创建学生表student和班级表class

CREATE TABLE student (
         xh char(4),
         xm varchar(10),
         sex char(2),
         birthday date,
         sal double(7,2),
         studentcid int(2)
)
CREATE TABLE class (
         classid in(2),
         cname varchar(20),
           ccount  int(3)
)

2.基于上述学生表和班级表,完成如下问题
(1)添加三个班级信息为:
1,JAVA1班,null
2,JAVA2班,null
3,JAVA3班,null
(2)添加学生信息如下:‘A001’,‘张三’,‘男’,‘01-5月-05’,100,1
(3)添加学生信息如下:’A002′,’MIKE’,’男’,’1905-05-06′,10
(4)插入部分学生信息: ‘A003′,’JOHN’,’女’
(5)将A001学生性别修改为’女‘
(6)将A001学生信息修改如下:性别为男,生日设置为1980-04-01
(7)将生日为空的学生班级修改为Java3班
(8)请使用一条SQL语句,使用子查询,更新班级表中每个班级的人数字段
3.使用如下语句,建立以下表

CREATE TABLE copy_emp   (
    empno int(4),
    ename varchar(20),
    hiredate date,
    deptno int(2),
    sal double(8,2)
)

4.在第三题表的基础上,完成下列问题:
(1)在表copy_emp中插入数据,要求sal字段插入空值,部门号50,参加工作时间为2000年1月1日,其他字段随意
(2)在表copy_emp中插入数据,要求把emp表中部门号为10号部门的员工信息插入
(3)修改copy_emp表中数据,要求10号部门所有员工涨20%的工资
(4)修改copy_emp表中sal为空的记录,工资修改为平均工资
(5)把工资为平均工资的员工,工资修改为空
(6)另外打开窗口2查看以上修改
(7)执行commit,窗口2中再次查看以上信息
(8)删除工资为空的员工信息
(9)执行rollback*/

CREATE TABLE student (
         xh char(4),
         xm varchar(10),
         sex char(2),
         birthday date,
         sal double(7,2),
         studentcid int(2)
);
CREATE TABLE class (
         classid int(2),
         cname varchar(20),
           ccount  int(3)
);
insert into class
values (1, 'Java1班', null),
       (2, 'Java2班', null),
       (3, 'Java3班', null);
insert into student
values ('A001','张三','男','2001-05-05',100,1 );

insert into student
values ('A002','MIKE','男','1905-05-06',10,null);

insert into student
values ('A003','JOHN','女',null,null,null);

update student
set sex = '女'
where xh = 'A001';

update student
set sex = '男' , birthday = '1980-04-01'
where xh = 'A001';

update student
set studentcid = 3
where birthday is null;


UPDATE class c
SET ccount=(SELECT COUNT(*) FROM student s WHERE c.classid= s.studentcid)
where 1 = 1;

CREATE TABLE copy_emp   (
		empno int(4),
		ename varchar(20),
		hiredate date,
		deptno int(2),
		sal double(8,2)
);

insert into copy_emp
values (1001,'test','2001-01-01',50,null);

insert into copy_emp(empno, ename, hiredate, deptno, sal)
select empno, ename, hiredate, deptno, sal
from emp
where deptno = 10;

update copy_emp
set sal = sal * 1.2
where deptno = 10;

update copy_emp
set sal = (select * from (select avg(sal) from copy_emp) a)
where sal is null ;

update copy_emp
set sal = null
where sal = (select * from (select avg(sal) from copy_emp) a);

select *
from copy_emp;

begin ;
delete  from copy_emp
where sal is null;
select *
from copy_emp;
commit ;
rollback ;

原创文章,作者:254126420,如若转载,请注明出处:https://blog.ytso.com/tech/database/274024.html

(0)
上一篇 2022年7月13日 11:52
下一篇 2022年7月13日 12:08

相关推荐

发表回复

登录后才能评论