題目:企業SQL面試複習與測試
- SQL複習
1.常見的資料庫物件有哪些?
表(table) 檢視(view) 序列(sequence) 索引(index) 同義詞(synonym)
儲存過程(procedure) 儲存函式(function) 觸發器(trigger)
2.表:資料的主要儲存方式,由行和列組成。後面重點說
檢視:儲存起來的select語句。
對檢視中資料的DML操作,會導致建立檢視使用的表中的資料的修改。
create view emp_vu
as
select department_id,avg(salary) dept_avg_sal
from employees
group by department_id;
--with read only
select * from emp_vu;
序列:提供了一系列有規律的數值,常用來作為表的主鍵的值
create sequence emp_id_seq
start with 1001
increment by 1
maxvalue 10000
--minvalue
--cycle/nocycle
--cache/nocache
1)nextval / currval
select emp_id_seq.currval from dual;
select emp_id_seq.nextval from dual;
create table emp(
id number(10),
name varchar2(15)
)
insert into emp
values(emp_id_seq.nextval,'BB');
select * from emp;
裂縫:①多個表共用一個序列②出現回滾③出現異常
索引(index):當使用索引作用的列作為查詢條件進行查詢時,可以提高查詢的效率。
--如何建立索引:①自動建立(宣告為主鍵或唯一性約束的列) ②手動建立
create index emp_sal
on employees(salary);
3.重點:表
DDL:CREATE TABLE;ALTER TABLE;TRUNCATE TABLE;DROP TABLE;RENAME .. TO ..
不可回滾,即意味著:自動提交
--1.建立表
--1.1“白手起家”
create table dept(
dept_id number(10),
dept_name varchar2(15),
location_id varchar2(10),
birth Date
)
select * from dept;
--1.2基於現有的表,建立
create table emp1
as
select employee_id id,last_name name,hire_date,salary
from employees
--where department_id = 80;
where 1=2;
select * from emp1;
--1)對現有的表的複製/空表
create table emp_copy
as
select * from employees
--where 1=2;
select * from emp_copy;
--2.修改表
--2.1增加一個列
ALTER table emp
add(salary number(10,2) default 2000);
select * from emp;
--2.2修改現有的列
alter table emp
modify(salary number(15,2));
insert into emp(id,name)
values(1004,'CC');
--2.3重新命名現有的列
alter table emp
rename column salary to sal;
--2.4刪除現有的列
alter table emp
drop column sal;
--3.重新命名現有的表
rename emp to employee;
select * from employee;
--4.清空表
truncate table employee;
rollback;
--5.刪除表
drop table employee;
DML:增、刪、改、查
--增insert into ...
--1.一條一條的新增
select * from dept;
insert into dept
values(,,,);
insert into dept(dept_id,location_id,dept_name)
values(,,);
--2.匯入資料
insert into dept(dept_id,location_id,dept_name)
select department_id,location_id,department_name
from departments;
alter table dept
modify(dept_name varchar2(20));
--刪
delete from dept
where dept_id < 40;
--改
update dept
set location_id = 1700
where dept_id = 20;
commit;
--查詢(重中之重)
select .... --分組函式(count / max / min / avg / sum)
from ...,....--多表連線
where ...--過濾條件和 多表的連線條件(若不寫,會出現笛卡爾積的錯誤)
group by ...--凡是在select中出新了分組函式,則沒有使用分組函式的列要作為group by的條件
having avg(..) ...--分組函式作為過濾條件,要使用having
order by ... asc/desc;
二、企業SQL考核真題
資料表:
dept:
deptno(primary key), dname, loc
emp:
empno(primary key), ename, job, mgr(references emp(empno)), sal,
deptno(references dept(deptno))
DEPT dname loc |
EMP empno(primary key) ename job mgr(references emp(empno)) sal deptno(references dept(deptno)) |
1 列出emp表中各部門的部門號,最高工資,最低工資
select max(sal) as 最高工資,min(sal) as 最低工資,deptno from emp group by deptno;
2 列出emp表中各部門job 含’REP’的員工的部門號,最低工資,最高工資
select max(sal) as 最高工資,min(sal) as 最低工資,deptno as 部門號 from emp where job like '%REP%' group by deptno;
3 對於emp中最低工資小於7000的部門中job為'SA_REP'的員工的部門號,最低工資,最高工資
select max(sal) as 最高工資,min(sal) as 最低工資,deptno as 部門號 from emp b
where job='SA_REP' and 7000>(select min(sal) from emp a where a.deptno=b.deptno) group by b.deptno
4寫出對上題的另一解決方法
(請補充)
select deptno,min(sal),max(sal)
from emp
where job = 'SA_REP' and deptno in (
select deptno
from emp
--group by deptno
having min(sal) < 7000
)
group by deptno
5根據部門號由高而低,工資由低而高列出每個員工的姓名,部門號,工資
select deptno as 部門號,ename as 姓名,sal as 工資 from emp order by deptno desc,sal asc
6 列出'Abel'所在部門中每個員工的姓名與部門號
select ename,deptno from emp where deptno = (select deptno from emp where ename = 'Abel')
(法二)
select ename,deptno
from emp e1
where exists (
select 'x'
from emp e2
where e1.deptno = e2.deptno
and e2.ename = 'Abel'
)
7 列出每個員工的姓名,工作,部門號,部門名
select ename,job,emp.deptno,dept.dname from emp,dept where emp.deptno=dept.deptno
8 列出emp中工作為'SH_CLERK'的員工的姓名,工作,部門號,部門名
select ename,job,dept.deptno,dname from emp,dept where dept.deptno=emp.deptno and job='SH_CLERK'
9 對於emp中有管理者的員工,列出姓名,管理者姓名(管理者外來鍵為mgr)
select a.ename as 姓名,b.ename as 管理者 from emp a,emp b where a.mgr is not null and a.mgr=b.empno
10 對於dept表中,列出所有部門名,部門號,同時列出各部門工作為'SH_CLERK'的員工名與工作
select dname as 部門名,dept.deptno as 部門號,ename as 員工名,job as 工作 from dept,emp
where dept.deptno = emp.deptno(+) and job = 'SH_CLERK'
11 對於工資高於本部門平均水平的員工,列出部門號,姓名,工資,按部門號排序
select a.deptno as 部門號,a.ename as 姓名,a.sal as 工資 from emp a
where a.sal>(select avg(sal) from emp b where a.deptno=b.deptno) order by a.deptno
(法二)select e.deptno,ename,sal
from emp e,(select deptno,avg(sal) avg_sal from emp group by deptno) b
where e.sal > b.avg_sal and e.deptno = b.deptno
12 對於emp,列出各個部門中工資高於本部門平均水平的員工數和部門號,按部門號排序
select count(a.sal) as 員工數,a.deptno 部門號 from emp a
where a.sal>(select avg(sal) from emp b where a.deptno=b.deptno) group by a.deptno order by a.deptno
13. 對於emp中工資高於本部門平均水平,人數多於1人的,列出部門號,高於部門平均工資的人數,按部門號排序
select *
from(
select deptno,count(*) count_num
from emp e
where sal > (
select avg(sal)
from emp e1
where e.deptno = e1.deptno
)
group by deptno
) e1
where e1.count_num > 1
order by e1.deptno
14 對於emp中工資高於本部門平均水平,且其人數多於3人的,列出部門號,部門人數,按部門號排序
select count(a.empno) as 員工數,a.deptno as 部門號,avg(sal) as 平均工資 from emp a
where (select count(c.empno) from emp c where c.deptno=a.deptno and c.sal>(select avg(sal) from emp b where c.deptno=b.deptno))>3
group by a.deptno order by a.deptno
(法二)
select m.deptno,count(ee1.empno)
from(
select e1.deptno,count(empno) count_num
from emp e1
where e1.sal >
(select avg(sal) from emp e2 where e1.deptno = e2.deptno)
group by e1.deptno
) m,emp ee1
where m.count_num > 3 and m.deptno = ee1.deptno
group by m.deptno
15 對於emp中低於自己工資至少5人的員工,列出其部門號,姓名,工資,以及工資少於自己的人數
select a.deptno,a.ename,a.sal,(select count(b.ename) from emp as b where b.sal<a.sal) as 人數 from emp as a
where (select count(b.ename) from emp as b where b.sal<a.sal)>5
本教程由尚矽谷教育大資料研究院出品,如需轉載請註明來源。