數據庫查詢練習


在oracle中的用戶中scott的幾個表進行查詢

這里是oracle的建表語句

 1 CONNECT SCOTT/tiger  
 2 CREATE TABLE DEPT  
 3        (DEPTNO NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY,  
 4         DNAME VARCHAR2(14) ,  
 5         LOC VARCHAR2(13) ) ;  
 6   
 7 CREATE TABLE EMP  
 8        (EMPNO NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY,  
 9         ENAME VARCHAR2(10),  
10         JOB VARCHAR2(9),  
11         MGR NUMBER(4),  
12         HIREDATE DATE,  
13         SAL NUMBER(7,2),  
14         COMM NUMBER(7,2),  
15         DEPTNO NUMBER(2) CONSTRAINT FK_DEPTNO REFERENCES DEPT);  
16 INSERT INTO DEPT VALUES  
17         (10,'ACCOUNTING','NEW YORK');  
18 INSERT INTO DEPT VALUES (20,'RESEARCH','DALLAS');  
19 INSERT INTO DEPT VALUES  
20         (30,'SALES','CHICAGO');  
21 INSERT INTO DEPT VALUES  
22         (40,'OPERATIONS','BOSTON');  
23 INSERT INTO EMP VALUES  
24 (7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20);  
25 INSERT INTO EMP VALUES  
26 (7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30);  
27 INSERT INTO EMP VALUES  
28 (7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30);  
29 INSERT INTO EMP VALUES  
30 (7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20);  
31 INSERT INTO EMP VALUES  
32 (7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30);  
33 INSERT INTO EMP VALUES  
34 (7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30);  
35 INSERT INTO EMP VALUES  
36 (7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10);  
37 INSERT INTO EMP VALUES  
38 (7788,'SCOTT','ANALYST',7566,to_date('13-JUL-87','dd-mm-rr')-85,3000,NULL,20);  
39 INSERT INTO EMP VALUES  
40 (7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10);  
41 INSERT INTO EMP VALUES  
42 (7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30);  
43 INSERT INTO EMP VALUES  
44 (7876,'ADAMS','CLERK',7788,to_date('13-JUL-87', 'dd-mm-rr')-51,1100,NULL,20);  
45 INSERT INTO EMP VALUES  
46 (7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30);  
47 INSERT INTO EMP VALUES  
48 (7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20);  
49 INSERT INTO EMP VALUES  
50 (7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10);  
51   
52 CREATE TABLE BONUS  
53         (  
54         ENAME VARCHAR2(10)      ,  
55         JOB VARCHAR2(9)  ,  
56         SAL NUMBER,  
57         COMM NUMBER  
58         ) ;  
59 CREATE TABLE SALGRADE  
60       ( GRADE NUMBER,  
61         LOSAL NUMBER,  
62         HISAL NUMBER );  
63   
64 INSERT INTO SALGRADE VALUES (1,700,1200);  
65 INSERT INTO SALGRADE VALUES (2,1201,1400);  
66 INSERT INTO SALGRADE VALUES (3,1401,2000);  
67 INSERT INTO SALGRADE VALUES (4,2001,3000);  
68 INSERT INTO SALGRADE VALUES (5,3001,9999);  
69 COMMIT;  
70 EXIT  
oracle

與之對應的是mysql

MySQL 腳本:
[sql] view plaincopyprint?
use prod;  
CREATE TABLE dept  
       (deptNO int(2),   
        DNAME VARCHAR(14) ,  
        LOC VARCHAR(13),  
        primary key(deptNO) ) ;  
  
CREATE TABLE emp  
       (empNO int(4) ,  
        ENAME VARCHAR(10),  
        JOB VARCHAR(9),  
        MGR int(4),  
        HIREDATE DATE,  
        SAL int(7),  
        COMM int(7),  
        deptNO int(2),  
        primary key(empno),   
        foreign key(deptno) REFERENCES dept(deptno));  
  
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');  

INSERT INTO emp VALUES  
(7369,'SMITH','CLERK',7902,date_format('1980-12-17','%Y-%m-%d'),800,NULL,20);  
INSERT INTO emp VALUES  
(7499,'ALLEN','SALESMAN',7698,date_format('1981-2-20','%Y-%m-%d'),1600,300,30);  
INSERT INTO emp VALUES  
(7521,'WARD','SALESMAN',7698,date_format('1981-2-22','%Y-%m-%d'),1250,500,30);  
INSERT INTO emp VALUES  
(7566,'JONES','MANAGER',7839,date_format('1981-4-2','%Y-%m-%d'),2975,NULL,20);  
INSERT INTO emp VALUES  
(7654,'MARTIN','SALESMAN',7698,date_format('1981-9-28','%Y-%m-%d'),1250,1400,30);  
INSERT INTO emp VALUES  
(7698,'BLAKE','MANAGER',7839,date_format('1981-5-1','%Y-%m-%d'),2850,NULL,30);  
INSERT INTO emp VALUES  
(7782,'CLARK','MANAGER',7839,date_format('1981-6-9','%Y-%m-%d'),2450,NULL,10);  
INSERT INTO emp VALUES  
(7788,'SCOTT','ANALYST',7566,date_format('1987-7-13','%Y-%m-%d'),3000,NULL,20);  
INSERT INTO emp VALUES  
(7839,'KING','PRESIDENT',NULL,date_format('1981-11-17','%Y-%m-%d'),5000,NULL,10);  
INSERT INTO emp VALUES  
(7844,'TURNER','SALESMAN',7698,date_format('1981-9-8','%Y-%m-%d'),1500,0,30);  
INSERT INTO emp VALUES  
(7876,'ADAMS','CLERK',7788,date_format('1987-6-13', '%Y-%m-%d'),1100,NULL,20);  
INSERT INTO emp VALUES  
(7900,'JAMES','CLERK',7698,date_format('1981-12-3','%Y-%m-%d'),950,NULL,30);  
INSERT INTO emp VALUES  
(7902,'FORD','ANALYST',7566,date_format('1981-12-3','%Y-%m-%d'),3000,NULL,20);  
INSERT INTO emp VALUES  
(7934,'MILLER','CLERK',7782,date_format('1982-1-23','%Y-%m-%d'),1300,NULL,10);  

CREATE TABLE BONUS  
        (  
        ENAME VARCHAR(10)      ,  
        JOB VARCHAR(9)  ,  
        SAL int,  
        COMM int  
        ) ;  
  
CREATE TABLE SALGRADE  
      ( GRADE int,  
        LOSAL int,  
        HISAL int );  
  
INSERT INTO SALGRADE VALUES (1,700,1200);  
INSERT INTO SALGRADE VALUES (2,1201,1400);  
INSERT INTO SALGRADE VALUES (3,1401,2000);  
INSERT INTO SALGRADE VALUES (4,2001,3000);  
INSERT INTO SALGRADE VALUES (5,3001,9999);  
COMMIT;  

SELECT deptno,ename,sal
  FROM emp outer
  WHERE sal>(SELECT avg(sal)
                FROM emp )
  ORDER BY deptno;
mysql

表的屬性

在這里用的是mysql環境,mysql和oracle在進行sql查詢時基本都是相同的

emp表

dept表

SALGRADE表

相關的查詢語句

單表查--------- 單表查詢

1.查找職位是職員(Clerk)或分析員(Analyst)的雇員信息 select *from emp where job like 'CLERK' or job like 'ANALYST'; 2.查找以“S”開頭的雇員姓名和所在部門 select ename, deptno from emp where ename like 'S%'; 3.查詢每個雇員的年工資 select ename, 12*(sal+ifnull(comm, 0)) from emp;    -- ifnul 對應nvl 
4.按工資升序排列20號部門的雇員 select * from emp where deptno=20 order by sal; 5.查詢工資的最高值 select max(sal) from emp; 6.查詢工資最高的員工的信息 select * from emp where sal = (select max(sal) from emp); 7.查詢每個部門的人數 select deptno ,count(*) from emp group by deptno; 8.查詢雇員人數在4人以上的部門的部門號 select deptno from emp group by deptno having count(deptno)>4; 9.查找部門工資總和超過9000的部門,並按工資總和升序排列。 select deptno ,sum(sal) from emp group by deptno having sum(sal)>9000 order by sum(sal); 10.查找平均工資低於2000的部門號和平均工資。 select deptno, avg(sal) from emp group by deptno having  avg(sal)<2000; 11.統計有獎金的員工人數。
select ename, dname,comm from emp, dept where comm >0;
12.按照部門號升序,部門號相同的再按雇員的工資降序排列,顯示雇員的信息。 select * from emp order by deptno , sal desc; 13.查詢沒有獎金的員工的信息。(comm字段為獎金字段) select * from emp where comm is null; -- 查詢字段為null用is不能用= 14.顯示在2000到3000的員工姓名和工資 select ename, sal from emp where sal >= 2000 and sal <= 3000; 15.查詢每個部門的編號以及工種(job字段)信息 select distinct deptno,job from emp ;

 

嵌套查詢

1.查詢獲得獎金的雇員的姓名和所在部門名稱。 
select ename, deptno from emp,dept where comm > 0 ;

2.查詢財務部門的員工的姓名、入職日期 、工資。
select ename,hiredate,sal from emp,dept where emp.deptno=dept.deptno and dname='ACCOUNTING';

3.查詢1981年以后入職的雇員的姓名及所在的部門名稱,並按入職時間升序排序。
select ename,dname
from emp,dept
where emp.deptno=dept.deptno and hiredate >= '1981-01-01' order by hiredate;

4.查詢每個部門的員工人數及其部門名稱。 
select dname, count(emp.empno)
from emp, dept 
where emp.deptno=dept.deptno group by dname;

5.查詢每個部門的雇員姓名、員工工資、工資級別和部門名稱。
select ename, sal, GRADE, dname from emp, SALGRADE, dept  
where (emp.deptno=dept.deptno) and (emp.sal between SALGRADE.losal and SALGRADE.hisal);
-- 這兩個一樣
select ename, sal, GRADE, dname from emp e, SALGRADE s, dept d  
where (e.deptno=d.deptno) and (e.sal between s.losal and s.hisal);

6.查詢部門人數超過5人的部門名稱。   -- 並且統計部門的個數如何寫
select dname  from emp, dept
where emp.deptno=dept.deptno 
group by dname having count(emp.empno)>3;

7.1 查詢SMITH的上級領導的名字;
select e.ename emp_ename, b.ename mgr_ename from emp e, emp b where e.empno=b.mgr; 
7.查詢SMITH的上級領導的姓名及其職位和部門名稱。 
select ename, job, dname from emp e, dept d
where  empno = (select mgr from emp where ename='SMITH') and e.deptno=d.deptno;


8.查詢大於員工平均工資的員工的姓名和工資
select ename, sal from emp where sal > (select avg(sal) from emp);

9.查詢大於本工種的平均工資的員工的姓名和工資
-- 不一定對

select ename,sal, job, (select avg(sal) from emp e2 where e2.deptno=e1.deptno) 
from emp e1 where sal>(select avg(sal) from emp e2 where e2.deptno=e1.deptno);

10.查詢與smith在同一部門,且工作崗位相同的員工的信息(多列子查詢)
-- 先查詢同一部門的,然后查詢同一個崗位
select * from emp where deptno = (select deptno from emp where ename='SMITH')
and job = (select job from emp where ename='SMITH');

select *from emp where (deptno, job)=(select deptno,job from emp where ename='SMITH');

 

 

綜合查詢

前面的有幾個是oracle中的操作,但是后面的查詢語句都是一樣的.

1.啟動服務的方法
管理,打開服務
sqlplus system/sias

2.使用scott用戶登錄

sqlplus system/sias
alter user scott account  unlock;
alter user scott identified by sias;
conn scott/sias

3.設置環境變量 linesize為150
set linesize  150
4.顯示當前連接用戶名
show user;

5.查看系統擁有哪些用戶
select * from db_users;

6.用@ 或start命令將指定命令文件調入緩沖區並執行。
@d:\文件名.sql

7.顯示當前用戶下某個表的表結構
desc 表名

8.創建student表(sno char4),sanme varchar20),sex char(2),birthday date,sal number(6,2))

drop table student cascade constraints;  -- 刪除約束
create table student(
sno char(4),
sname varchar(20),
sex char(2),
birthday date,
sal double(6,2)  ---- 在 oracle中用number
)

9.創建class表(classid number2),classname varchar(20))
drop table class cascade constraints;
create table class(
class int(2),  -- 在oracle中用number
classname varchar(20)  
)

10.顯示表結構,給student表增加一個字段classid;
desc student;
alter table student add classid char(10);

11.為表dept增加一列All_emp 用來存放部門人數 
alter table dept all_emp char(10);

12.向dept表中表中插入一條記錄,每個字段都有具體值
insert into dept values (1,'a','b');
13.向student表中插入記錄,記錄來自一個查詢結果
insert into student(sno, sname) select empno,ename from emp where empno='7369'; 

14.新建一個表dept1,結構與dept相同,並將dept表中插入到dept1中
create table dept1 select *from dept;

15.將 Martin 提升為經理,工資加1000 。
update emp set job='MANAGER', sal=sal+1000 where ename='Martin';

16.查找職位是職員(Clerk)或分析員(Analyst)的雇員姓名和工種
select ename, job from emp where job='CLERK' or job='ANALYST';

17.查找以“S”開頭的雇員姓名和所在部門 
select ename, deptno from emp where ename like 'S%';

18.查所工資大於所有20部門的雇員的信息 
select * from emp  where  sal > (select max(sal) from emp where deptno=20);

19.查詢1982年入職的員工的信息
select *from emp where hiredate like '%82';  -- 在Oracle中
select *from emp where hiredate like '1982%'; -- 在mysql中, 主要是數據不同,如果數據相同都一樣

20.查詢每個雇員的年工資
select ename, 12*(sal+ifnull(comm, 0)) from emp;    -- ifnul 對應nvl 

21.按工資升序排列20號部門的雇員
select *from emp where deptno='20' order by sal ;
----------------------------- 重新對比較
22.查詢工資的最高值
select max(sal) from emp;
23.查詢工資最高的員工的信息
select * from emp where sal=(select max(sal) from emp);
24.查詢員工的平均工資
select avg(sal) from emp;
25.查詢工資低於平均工資的員工的信息
select *from emp where sal < (select avg(sal) from emp);

26.將工資低於平均工資的員工工資增加10%
update emp set sal=sal*1.1 where sal < (select avg(sal) from emp);

27.查詢每個部門的人數  ---第二次還沒寫出來
select deptno, count(*) from emp group by deptno;
28.查詢雇員人數在4人以上的部門的部門號  -- 不會
select deptno from emp group by deptno having count(*)>4;

29.部門工資總和超過9000的部門,並按工資總和升序排列。
select deptno, sum(sal) from emp 
group by deptno having  sum(sal) > 9000 order by deptno desc;

30.查詢工資高於7698號雇員,並且工種與他相同的雇員情況。
select *from emp where 
sal >(select sal from emp where empno='7698')
and job=(select job from emp where empno='7698');

31.查詢工資高於或等於20號部門工資額最高的雇員情況 。
select *from emp where sal >= (select max(sal) from emp where deptno='20');

32.查詢20號部門的雇員工資、獎金情況 。
select sal, comm from emp where deptno='20';

33.查詢與smith部門及崗位相同的員工的信息。
select *from emp where (deptno, job)=
(select deptno, job from emp where ename='SMITH'); 

34.查看工資高於3000的雇員及所在部門情況 。
select * from emp, dept where emp.deptno=dept.deptno and sal>3000;

35.查詢部門號為10的員工的名字,工資和部門號並按工資降序排
select ename, sal, deptno from emp where deptno='10' order by sal desc;
36.查詢每位員工的員工號和工資級別。
select empno, GRADE from emp, SALGRADE where sal >= losal AND sal <= hisal;


37.查詢與smith在同一部門,且工作崗位相同的員工的信息(多列子查詢)
select * from emp where deptno=(select deptno from emp where ename='SMITH')
and job = (select job from emp where ename='SMITH');

--- 另一種寫法
select *from emp where 
(deptno, job) = (select deptno, job from emp where ename='SMITH');

38.查詢工資低於本部門的平均工資的員工的信息   --- 不會寫 
select *from emp a
where sal < (select avg(sal) from emp where emp.deptno=a.deptno group by deptno);

 

 

其他的查詢語句

http://www.voidcn.com/article/p-qnzwvljd-hx.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM