SQL语法练习
https://blog.csdn.net/qq_30764991/article/details/81952197
员工表建表语句:
CREATE TABLE EMP (
ENAME VARCHAR2(30),
EMPNO NUMBER(5),
DEPTNO NUMBER(5),
JOB VARCHAR2(20),
HIREDATE DATE,
COMM NUMBER(6,2),
SAL NUMBER(6,2)
);
部门表建表语句:
CREATE TABLE DEPT (
DNAME VARCHAR2(30),
DEPTNO NUMBER(5),
LOC VARCHAR2(50)
);
员工表插入数据:
INSERT INTO EMP VALUES (‘Zhou润发’, 10001, 10, ‘办事员’, TO_DATE(‘20161130131322’, ‘YYYYMMDDHH24MISS’), 2500, 2400);
INSERT INTO EMP VALUES (‘Liu德华’, 10002, 10, ‘办事员’, TO_DATE(‘20170105131334’, ‘YYYYMMDDHH24MISS’), 1800, 2250);
INSERT INTO EMP VALUES (‘Li连杰’, 20001, 20, ‘办事员’, TO_DATE(‘20170313131339’, ‘YYYYMMDDHH24MISS’), 2200, 2350);
INSERT INTO EMP VALUES (‘xiang华强’, 20000, 20, ‘经理’, TO_DATE(‘20160130131343’, ‘YYYYMMDDHH24MISS’), 3980, 3500);
INSERT INTO EMP VALUES (‘Zhang柏芝’, 30001, 30, ‘办事员’, TO_DATE(‘20170314131346’, ‘YYYYMMDDHH24MISS’), 1300, 2200);
INSERT INTO EMP VALUES (‘成long’, 10000, 10, ‘经理’, TO_DATE(‘20151031133724’, ‘YYYYMMDDHH24MISS’), 4800, 4000);
INSERT INTO EMP VALUES (‘zhang子怡’, 30000, 30, ‘经理’, TO_DATE(‘20161011133915’, ‘YYYYMMDDHH24MISS’), 3500, 3480);
INSERT INTO EMP VALUES (‘zhang家辉’, 20002, 20, ‘办事员’, TO_DATE(‘20170330134519’, ‘YYYYMMDDHH24MISS’), 1600, 2000);
INSERT INTO EMP VALUES (‘Liu亦菲’, 30002, 30, ‘驾驶员’, TO_DATE(‘20170330135457’, ‘YYYYMMDDHH24MISS’), NULL, 2500);
INSERT INTO EMP VALUES (‘peng于晏’, 20003, 20, ‘驾驶员’, TO_DATE(‘20170411135625’, ‘YYYYMMDDHH24MISS’), NULL, 2500);
INSERT INTO EMP VALUES (‘Zhang涵予’, 10003, 10, ‘驾驶员’, TO_DATE(‘20170408135706’, ‘YYYYMMDDHH24MISS’), NULL, 2500);
部门表插入数据:
INSERT INTO DEPT VALUES (‘市场部’, 10, ‘北京’);
INSERT INTO DEPT VALUES (‘公关部’, 20, ‘上海’);
INSERT INTO DEPT VALUES (‘研发部’, 30, ‘南京’);
表结构数据图如下:
两张表已全部建好,自己用查询语句查看一下表结构和数据是否没问题.
Select * From EMP Select * From DEPT
下面是题目:可以复制下来做, 做完再和我做答案对照一下, 当然, 有的题目可以用多种方法去做, 看你自己选择了.
还有一点需要注意的是:我是用的可视化界面输入的语句,别名中文不需要加引号,一开始我加引号老是报错,后来无意间去掉反而好了,不知道为什么.我开始学的时候,别名使用中文是需要加引号的,看你实际的情况吧!!
题目:
–1.选择30部门的职员
–2.列出所有办事员的姓名、编号和部门
–3.找出奖金高于薪资的雇员
–4.找出佣金高于薪金60%的雇员
–5.找出部门10中所有经理和部门20中的所有办事员的详细资料
–6.找出既不是经理又不是办事员但其薪金>=2000的所有雇员的详细资料
–7.找出收取佣金的雇员的不同工作
–8.找出不收取佣金或收取的佣金低于2000的雇员
–9.找出各月最后一天受雇的所有雇员
–10.找出早于1年之前受雇的雇员
–11.显示只有首字母大写的所有雇员的姓名
–12.显示正好为7个字符的雇员姓名
–13.显示不带有’Z’的雇员姓名
–14.显示所有雇员的姓名的前三个字符
–15.显示所有雇员的姓名,用小写 z 替换所有大写 Z .
–16.显示所有雇员的姓名以及满1年服务年限的日期
–17.显示雇员的详细资料,按姓名排序
–18.显示雇员姓名,根据其服务年限,将最老的雇员排在最前面
–19.显示所有雇员的姓名、工作和薪金,按工作的降序顺序排序,而工作相同时按薪金升序
–20.显示所有雇员的姓名和加入公司的年份和月份,按雇员受雇日所在月排序,将最早年份的项目排在最前面
–21.显示在一个月为30天的情况下所有雇员的日薪金
–22.找出在(任何年份的)1月受聘的所有雇员
–23.对于每个雇员,显示其加入公司的天数
–24.显示姓名字段的任何位置,包含 “i” 的所有雇员的姓名
–25.以年、月和日显示所有雇员的服务年限
答案:
1–
select ename,deptno from emp where deptno=30;
2–
select e.ename,e.empno,d.dname,e.job from emp e,dept d where e.deptno=d.deptno and e.job=‘办事员’;
3–
select * from emp where comm>sal order by comm desc;
4–
select * from emp where comm>sal*0.6;
5.1–
select * from emp e,dept d where e.deptno=10 and e.job=‘经理’ and e.deptno=d.deptno
union all
select * from emp e,dept d where e.deptno=20 and e.job=‘办事员’ and e.deptno=d.deptno;
5.2–
select * from emp e,dept d where (e.deptno=10 and e.job=‘经理’ and e.deptno=d.deptno)
or (e.deptno=20 and e.job=‘办事员’ and e.deptno=d.deptno);
6–
select * from emp e,dept d where e.sal>=2000 and e.job<>‘办事员’ and e.job<>‘经理’ and e.deptno=d.deptno;
7–
select distinct job from emp where comm>0;
8–
select ename,nvl(comm,0) comms from emp where nvl(comm,0)<2000;
9–
select * from emp where hiredate=last_day(hiredate);
10.1–
select * from emp where months_between(sysdate,hiredate)>12;
10.2–
select * from emp where hiredate 11–
select * from emp where ename=initcap(ename);
12–
select * from emp where length(ename)=7;
13–
select * from emp where instr(ename,‘Z’)=0;
14–
select substr(ename,0,3) from emp
15–
select replace(ename,‘Z’,‘z’) from emp
16–
select ename,add_months(hiredate,12) from emp
17–
select * from emp e,dept d where e.deptno=d.deptno order by e.ename
18.1–
select ename,trunc(months_between(sysdate,hiredate)/12,0) 服务年限 from emp order by 服务年限 desc
18.2–
select ename,hiredate from emp order by hiredate
19–
select ename,job,sal from emp order by job desc,sal asc
20.1–
select ename,extract(year from hiredate) 年份,extract(month from hiredate) 月份 from emp order by 年份,月份
20.2–
select ename,to_char(hiredate,‘yyyy’) 年份,to_char(hiredate,‘mm’) 月份 from emp order by hiredate
21–
select ename,sal/30,trunc(sal/30,1),floor(sal/30),ceil(sal/30) from emp
22.1–
select * from emp where extract(month from hiredate)=1
22.2–
select * from emp where to_char(hiredate,‘mm’)=‘01’
23–
select ename,floor(sysdate-hiredate) 入职天数 from emp order by 入职天数 desc
24.1–
select ename from emp where ename like ‘%i%’;
24.2–
select ename from emp where instr(ename,‘i’)>0
25–
select ename,floor(months_between(sysdate,hiredate)/12) 服务总年数,
floor(months_between(sysdate,hiredate)) 服务总月数,
floor(sysdate-hiredate) 服务总天数 from emp order by 服务总天数;