SQL 练习(MySQL)

SQL

--APS_VERSION 修改column字段长度
SELECT  *  FROM EXPORT_PRODUCTFULLFILLMENT2;
alter table EXPORT_PRODUCTFULLFILLMENT2 modify APS_VERSION VARCHAR2(60);
--ALTER TABLE table_name MODIFY column_name new_data_type(new_length);

练习sql1

select * from hr.employees e;-- hr.employees,hr.departments -- count(*) 总数
select * from hr.departments d;
--练习-计算每个员工的日薪  hr.employees的salary字段表示月薪的意思
select round(e.salary / 30) as "员工日薪" from hr.employees e order by salary desc;
--使用 字符串连接符 || (这就把姓和名连接在一起,并且显示在同一个字段中)  
select first_name || last_name as "姓名" from hr.employees e;
--在姓和名之间加上空格 ''
select first_name || ' ' || last_name as "姓名" from hr.employees;
--消除重复的行 distinct 总数107 消除重复的job_id号
select distinct(job_id) from hr.employees;--19条数据

--条件限定 in 
select * from hr.employees e where e.salary in(3000,6000);
--名字里倒数第三个字母是u的员工
--%表示任意匹配,有或者没有都可以
--_表示有,并且只有一个
select * from hr.employees where first_name like '%u__';
--常用的逻辑判断 与 或 非 and or not
select salary from hr.employees where salary between 3000 and 5000;
select salary from hr.employees where salary>= 3000 and salary<=5000;

--练习
--1查询所有员工的姓名(last_name+' '+first_name),工资,年终奖金(工资的百分之八十 乘以 commission_pct 在加500)别名(年终奖)。
select last_name|| ' ' || first_name,
salary,
((salary * 0.8) * commission_pct + 500) as "年终奖"
from hr.employees;
--2查询所有有人员的部门编号,并且去掉重复行。
select distinct(department_id) as "部门编号"
from hr.employees e;
--3查询员工的姓名,工资,岗位(JOB_ID),要求工资为2000~3000并且JOB_ID以‘ERK’结束
select 
 first_name || last_name,
 salary,
 JOB_ID
 from hr.employees e
where salary between 2000 and 3000 and JOB_ID like '%ERK';
--4查询所有有人员的岗位编号,要求岗位(JOB_ID)中包含‘L’同时岗位(JOB_ID)名称以‘N’或‘K’结束,去掉重复行。
select distinct(job_id) as "job_id"
from hr.employees e
where job_id like '%L%' and job_id like '%N' or job_id like '%K';

--1313212
select * 
from hr.employees e left join hr.departments d 
on e.department_id = d.department_id;

select * from hr.employees e;-- hr.employees,hr.departments -- count(*) 总数
select * from hr.departments d;
--1.查询部门编号大于等于50小于等于90的部门中 工资小于5000的员工的编号、部门编号和工资
select e.employee_id,
e.department_id,
e.salary
from hr.employees e
where e.department_id >= 50 and e.department_id <= 90
and salary < 5000;
--2.显示员工姓名加起来一共15个字符的员工
select (first_name || '' || last_name) as "员工姓名"
from hr.employees
where length(first_name|| '' ||last_name)=15;
--3.显示不带有“ R ”的员工的姓名
select (e.first_name || '' || e.last_name) as "员工姓名"
from hr.employees e
where (e.first_name || '' || e.last_name) not like '%R%';
--4.查询所有员工的部门的平均工资,要求显示部门编号,部门名,部门所在地(需要多表关联查询: employees, department, location)
--常见查询 数据不全
select count(*) as "总数",
avg(e.salary) as "平均工资",
d.department_id,
d.department_name,
l.street_address
from hr.employees e,hr.departments d,hr.locations l
where e.department_id = d.department_id and l.location_id = d.location_id
group by d.department_id,d.department_name,l.street_address;

--用关联查询 数据更全
select avg(e.salary), e.department_id,d.department_name,l.street_address  from hr.employees e
left join hr.departments d
on e.department_id = d.department_id
left join hr.locations l
on d.location_id = l.location_id
group by e.department_id ,d.department_name,l.street_address;

--子查询


练习sql2

--子查询
--统计所有月薪高于Bruce的人数(看情况 写子查询)
--1.查询出Bruce的月薪 2.查询出所有高于Bruce月薪人数 
select e.salary from hr.employees e 
where e.first_name like 'Bruce';

select count(*) as "总计" from hr.employees ee
where ee.salary > (
  select e.salary from hr.employees e 
  where e.first_name like 'Bruce'
)

--使用rownum进行 分页查询
--查出薪水最高的5-10条数据
select * from --3.
(
   select ee.salary,rownum r from --2. ****
  (
    select * from hr.employees e order by e.salary desc --1.
  )ee
)eee where r >= 5 and r <= 10;

 select ee.salary,rownum r from --2. ****
  (
    select * from hr.employees e order by e.salary desc --1.
  )ee
where ee.r >= 5 and ee.r <= 10;  
--select * from hr.employees where rownum <= 5;
--select rownum r, e1.* from e1 // rownum是oracle的伪列,rounum不能查询>=的数据,而且rownum默认就是从1开始排序的,所以不能直接写
--select rownum r ,e1.* from e1 where r > 5 and r< 10,因为这样r>5会报错的
--那么办呢,将select rownum r, e1.* from e1的结果当做一张表,这样就行了,而且多了一列rownum此时就可以按rownum来分页了。
/*
为什么不是
select rownum r, e1.* from
  (
   select e.* from hr.employees e  order by e.salary desc
  ) e1
 where e1.r >=5 and e1.r<=10

因为rownum得运行机制问题,所以呢,你当前查得是当前生成得e1的rownum,所以查看出来的第一条数据其给它附的id为1,
然后你后面有执行e1.r的判断,所以那个e1的第一条数据(id为1)不符合大于等于5小于等于10,
第一条不符合,那么它就会执行销毁,所以本来的第二条也会成为id为1,然后继续执行,
所以第二条也不符合,如果想使它符合,那么只能让e1.r大于0即可,否则其它条件都是不可以的,
如果你想让其大于1或者及以上,就必须多包涵一层,让其变成一个数据集,再从数据集里面取就可以取到(这就是为什么要多取一层的原因),
不然你执行这个语句,一条数据都没有而且还会报错
*/

/*
查询所在部门所在城市为'South San Francisco'的员工
查找和143在同一个部门和同一个岗位的比他工资高的员工。
查询总工资最多的部门,显示部门编号,部门名
*/
select * from hr.employees;
select * from hr.departments;
select * from hr.locations;
--查询所在部门所在城市为'South San Francisco'的员工
select first_name || '' || last_name as "员工"
from hr.employees e
left join hr.departments d on e.department_id = d.department_id
left join hr.locations l on l.location_id = d.location_id
where l.city like '%South San Francisco%';
--查找和143在同一个部门和同一个岗位的比他工资高的员工
/*
select first_name || '' || last_name as "员工"
from hr.employees e
where e.salary >
(
 --查出薪资 2600
 select ee.salary
 from hr.employees ee
 left join hr.departments d on ee.department_id = d.department_id
 and ee.manager_id = d.manager_id
 where ee.employee_id = '143'
)
*/
select *
  from hr.employees e2
 where e2.job_id =
       (select e.job_id from hr.employees e where e.employee_id = 143)
   and e2.salary >
       (select e.salary from hr.employees e where e.employee_id = 143)
--select e.salary from hr.employees e where first_name || '' || last_name like '%DanielFaviet%'

--查询总工资最多的部门,显示部门编号,部门名
select d.department_id,d.department_name 
from hr.departments d 
where d.department_id in
(
 --第三层求出外层条件 department_id **
  select xx.department_id from
  (
    --第二层求出rownum 所有的数据 ***
    select rownum r,aa.* from
      (
        --先求和 求出总工资 第一层
        select e.department_id,sum(e.salary) as totalSalary from hr.employees e 
        left join hr.departments dd on e.department_id = dd.department_id
        group by e.department_id 
        order by totalSalary desc  
      )aa
  )xx where xx.r = 1
)     
--order by d.department_id desc
select d.department_id, d.department_name
  from hr.departments d
 where d.department_id =
       (select x2.department_id
          from (select rownum r, x.*
                  from (select sum(e.salary) as sumSalary, e.department_id
                          from hr.employees e
                         group by e.department_id
                         order by sumSalary desc) x) x2
         where x2.r = 1)
/*
select sum(e.salary) from hr.employees e 
  left join hr.departments dd on e.department_id = dd.department_id
where dd.department_id = '30'
*/
/*
--SUBSTR(string,start, [length])
select first_name || '' || last_name as "姓名",substr('sundar',1,3) as "截取str"
 from hr.employees ee
*/

select * from 
(
  select sum_salary, e.department_id, d.department_name from
        (
            select sum(salary) sum_salary , department_id from hr.employees group by department_id
        ) e 
        left join hr.departments d on e.department_id = d.department_id order by sum_salary desc
) 
where rownum = 1

select *
from (select d.department_id,d.department_name,sum(e.salary) as salary
from hr.employees e,hr.departments d
where e.department_id=d.department_id
group by d.department_id,d.department_name
order by salary desc)
where rownum=1

练习sql3

create table hero(
  id number,
  name varchar2(30),
  hp number,
  mp number,
  damage number,
  armor number,
  speed number
)

select * from hero;
insert into hero(id,name,hp,mp,damage,armor,speed) values(1,'盖伦',1000,20,2000,2000,10);
insert into hero(id,name,hp,mp,damage,armor,speed) values(2,'石头人',1000,20,2000,2000,10);
insert into hero(name,hp,mp,damage,armor,speed) values('剑圣',1000,20,2000,2000,10);
commit;
--序列即sequence通常被用来作为id插入到表中
--创建sequence
create sequence hero_seq
  increment by 1 
  start with 1 
  maxvalue 9999999

--使用sequence 
select hero_seq.nextval from dual
--获取hero_seq的下一个值
select hero_seq.currval from dual
--获取hero_seq的当前值 

--作为id插入到表中
insert into hero (id,name,hp,mp,damage,armor,speed) values(hero_seq.nextval,'炸弹人',450,200,45,3,300);
--执行上述代码多次,再执行查询语句
select * from hero
--可以看到后面再增加的数据的id就是自动增加的

delete from hero;
truncate table hero;

--增加新的一列
alter table hero add(kill number)

--修改列
alter table hero modify(kill varchar2(255))

--删除列 管理员赋予权限
alter table hero drop column kill;

------------------------------------------------
/*
40为hr方案创建表“USERS”,要求有列:USER_ID,USER_NAME,BIRTHDATE,AGE,SALARY,photo,USER_COMMENT(个人履历)。

41为“USERS” 表添加一列 “DEPARTMENT_ID”;

42删除表“USERS”中的age列

43删除表“users”
*/
create table users(
  USER_ID number,
  USER_NAME varchar2(255),
  BIRTHDATE date,
  AGE number,
  SALARY number,
  photo varchar2(255),
  USER_COMMENT varchar2(255)
  --constraint uk_hero_photo unique
);
select * from users;
alter table users add(DEPARTMENT_ID number);
alter table users drop column age;
drop table users;

insert into users(USER_ID,USER_NAME,BIRTHDATE,AGE,SALARY,photo,USER_COMMENT)values(1,'kaka',TO_DATE ('2022-01-01','YYYY-MM-DD'),20,2800,1,2);
insert into users(USER_ID,USER_NAME,BIRTHDATE,AGE,SALARY,photo,USER_COMMENT)values(1,'kaka',TO_DATE ('2022-01-01','YYYY-MM-DD'),20,2800,1,2);

--给已经存在的表增加约束
alter table users add constraint pk_hero_ID primary key(user_ID);

alter table users drop constraint fk_killer_hero;

--外键约束
create table kill_record(
   id number,
   killerid number,
   killedid number,
   number_ number,
   constraint fk_killer_hero foreign key(killerid) references hero(id),
   constraint fk_killed_hero foreign key(killedid) references hero(id)
)

alter table kill_record add constraint pk_kill_record_ID primary key(id);
alter table kill_record add constraint uk_kill_killer unique(id);
alter table kill_record add constraint uk_kill_killed unique(id);

drop table kill_record;
select * from kill_record;
update hero set name = 'kakaka' where id = '16';
--创建视图
create view herosimpleView as(
  select id,name from hero
)

select * from herosimpleView;
update herosimpleView set name = 'kakaka111' where id = '17';
select * from hero;

-------------------------------------------------------------------
/*
为hr.users表的user_id添加主键约束。

为hr.users表的user_name添加非空和唯一约束。

创建一个表hr.department( department_id, department_name)

为hr.users表的DEPARTMENT_ID添加外键约束

删除表hr.users后重新创建它,并在一条SQL语句中一并添加上述的约束条件。
*/
select * from users for update;

drop table users;
alter table users add constraint pk_users_userId primary key(user_id);
alter table users drop constraint constraint_users_username;

ALTER TABLE users MODIFY (user_name NOT NULL); 

alter table users add constraint username_unique unique(user_name);

select * from departments;
create table departments(
  department_id number,
  department_name varchar2(255)
);

insert into departments(department_id,department_name)values(1,'IT');
alter table departments add constraint department_id_unique unique(department_id);



select * from users;
select * from departments for update;

alter table users add constraint fk_users_department foreign key (department_id) references departments(department_id)

练习sql4

alter user bigsword quota unlimited on users

[mysql系列教材 (一)- 安装mysql-server (how2j.cn)](

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潇潇_码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值