2021-07-05

oracle数据库查询总结

SELECT * from EMP --1、员工表
SELECT EMPNO 员工编号,ENAME 姓名,“JOB” 员工职位,HIREDATE 入职时间,SAL 资金,COMM 奖金,DEPTNO 部门编号 FROM EMP
WHERE ‘资金’ >1000

SELECT SAL FROM EMP
WHERE SAL BETWEEN 1000 AND 5000
ORDER BY SAL DESC;

—IN

SELECT * FROM EMP
WHERE EMPNO IN(7369,7499,7521);

SELECT LENGTH(ENAME) FROM EMP;

SELECT EMPNO,SAL FROM EMP
WHERE SAL =1600 AND EMPNO = 2;

–去除!
SELECT DISTINCT
DEPTNO,ENAME
from EMP;

SELECT * from Dept --2、部门表
SELECT DEPTNO 所属部门编号,DNAME 所属部门姓名,LOC 所属部门所在地
FROM Dept;

SELECT * from SALGRADE–3、薪资表
SELECT GRADE 薪资等级,LOSAL 工资,HISAL
FROM SALGRADE;

SELECT * from DEPT --4、职位表
SELECT DEPTNO 职位编号,DNAME 职位名称, LOC 所属部门所在地
FROM DEPT;

–子查询:在一条查询语句内部,包含另一个查询语句
–案例:查询emp表中工资高于平均工资的编号,姓名,工资
SELECT * FROM EMP
WHERE ENAME LIKE ‘%S’;

SELECT EMPNO as 客户编号,ENAME,SAL FROM EMP
WHERE SAL < (SELECT “AVG”(SAL) FROM EMP);

–查询工资高于30号部门最高工资员工的编号,姓名,职位,工资
SELECT EMPNO,ENAME,JOB,SAL FROM EMP;
WHERE SAL >
(SELECT “MAX”(SAL) FROM EMP
WHERE DEPTNO = 30);

SELECT * FROM EMP;
–查询高于平均身高的所有信息
SELECT AGE_NO 年龄编号,CLASS_PRESION 科目,HIGTH 身高 FROM AGE
WHERE higth >(SELECT “AVG”(higth) from age)

–ORDER BY 查询emp表中员工编号,姓名,职位,所属部门编号根据员工编号将序排列
SELECT EMPNO,ENAME,JOB,DEPTNO FROM EMP
ORDER BY EMPNO DESC;

SELECT DEPTNO,“COUNT”(),“SUM”(SAL),“AVG”(SAL) FROM EMP
GROUP BY DEPTNO
ORDER BY “SUM”(SAL) ASC, “COUNT”(
)DESC;

—查询emp表中工资高于工资高于2000的员工姓名,职位,工资,根据工资升序排列
SELECT EMPNO,JOB,SAL,DEPTNO FROM EMP
WHERE SAL > 2000
ORDER BY DEPTNO,DEPTNO DESC ;

/***GROUP BY/HAVING分组语句;
–1、select 列明/聚合函数 from 表 WHERE 条件group BY 列明
–ORDER BY 列明/别名/聚合函数 ASC/DESC,
–2、执行顺序,首先只想where,对所有数据进行过滤,然后执行group BY对列表中的数据进行分组,最后执行order BY 进行排序
**/
SELECT deptno,count(
),avg(sal),max(sal)FROM EMP
WHERE sal BETWEEN 1000 AND 3000
GROUP BY deptno
ORDER BY AVG(sal);

/***1、***HAVING 对分组后的数据再次进行过滤,经常与group BY一起使用
SELECT 列名/集合函数 FROM 表名
WHERE 条件
GROUP BY 列名
HAVING 子句
ORDER BY 列名/别名/集合函数 ASC/DESC;
***/
–2、先执行where条件进行过滤,然后执行group BY根据某个列,把表中的数据分成几个组,之后执行having子句,
–数据进行过滤,最后使用oeder BY 进行排序

–栗子:查询emp表中工资在1000-3000之间员工信息,要求每个部门的平均工资高于2000,查询每一个部门的编号,
–人数、平均工资,以及最高工资最后以平均工资进行升序排列
SELECT deptno,count(*),avg(sal),max(sal)FROM EMP
WHERE sal BETWEEN 1000 AND 3000
GROUP BY deptno
HAVING avg(sal) > 2000
ORDER BY AVG(sal);

SELECT empno,ename,job,sal fROM EMP
WHERE SAL > (SELECT AVG(SAL) FROM EMP )
ORDER BY SAL DESC,empno;

–序列格式
CREATE sequence tid_seq1;

—序列使用
–1、nextval每次使用都会生成一个数字(自增),第一次使用反悔的默认值是1:
SELECT 汗

–2、currval获取当前序列得值
SELECT tid_seq1.currval from dual;

/*
–表的连接查询
–SELECT 别名.
SELECT a.EMPNO,a.ENAME,d.deptno,d.dname FROM EMP a,DEPT d;–d笛卡尔积,重复查询查询数*条数 68

SELECT a.EMPNO,a.ENAME,d.deptno,d.dname FROM EMP a,DEPT d
WHERE a.DEPTNO = d.deptno; --去除笛卡尔积 17

–查询emp中员工编号、姓名、工资、以及该员工所属部门的所有信息,最后根据员工的编号降序排列
SELECT e.empno,e.ename,e.sal,d.*
FROM EMP e,DEPT d
WHERE e.DEPTNO = d.deptno
ORDER BY e.empno DESC;

–emp 表中的工资,在salgrade等级表中,losal和hisal之间,
–栗子:姓名,职位,工资,以及改工资的等级
SELECT a.ename,a.JOB,a.SAL,b.grade
FROM EMP a,SALGRADE b
WHERE a.sal BETWEEN b.LOSAL AND b.HISAL;

–自连接一张表查询,把一张表根据相同的信息分别看成两张表进行查询,找出关联条件
–e.mgr = m.empno
–查询emp表中的客户编号,名称以及上级领导的编号,姓名
SELECT e.empno,e.ename,e.sal,e.mgr,m.ename,m.job,m.sal
FROM emp e,EMP m
WHERE e.mgr= m.empno
ORDER BY e.empno;

–查询emp表中的客户编号,名称,工作,上级编号,姓名职位,工资按员工工资进行升序排列
SELECT e.empno,e.ename,e.JOB,m.empno,m.ename,m.JOB,m.sal
FROM emp e, emp m
WHERE m.empno = e.mgr
ORDER BY m.sal;
*/

–内连接:只查询有关联关系的数据,不查询无关联数据
–标准SQL内连接,只查询两张表中有关系的数据

/***
–SELECT 别名1.’/’'列名,别名2./列名
–FROM 表1 别名 INNER JOIN 表2 别名2
–ON 关联条件;
–栗子:查询额emp表中,客户编号,姓名\职位以及该员工所属的部门、地址
/***
–方法一
SELECT e.deptno,e.ename,e.job,d.dname,d.loc
FROM emp e,dept d
WHERE e.deptno = d.deptno;
–方法二
SELECT e.deptno,e.ename,e.job,d.dname,d.loc
FROM emp e INNER JOIN dept d
ON e.deptno = d.deptno;

**/

–栗子:查询emp表中客户工资,姓名,入职时间以及该员工的工资等级
SELECT e.ename,e.sal,e.hiredate,s.grade
FROM EMP e INNER JOIN salgrade s
ON e.sal BETWEEN s.losal AND s.hisal;

SELECT * FROM DEPT–worker; 4条
SELECT * FROM EMP – 17条
SELECT * from SALGRADE --薪资表
SELECT * from salgrade

–内连接:以某一张表为主表 ,查询该表中所有数据与管理另一张表中的数据
–栗子1、:查询emp表中所有员工的编号,名称、职位以及所属部门的的编号,姓名
SELECT e.ename,e.empno,e.job,d.deptno,d.dname
FROM EMP e,dept d
WHERE e.deptno= d.deptno(+) ;

–栗子2、\:查询dept表中的所有部门的所有信息以及该部门下的编号、姓名、职位、工资,根据工资降序排列
SELECT d.*,e.EMPNO,e.ename,e.JOB,e.sal
FROM emp e,dept d
where e.deptno = d.deptno(+)
ORDER BY e.sal desc;

—外链接:标准SQL的外链接(可以用来查询一张表或者所有表中的所有数据)
–左链接查询:以左表为主,查询左表中的所有数据以与之关联以右表中的数据,左表几(2)条数据,查询数据为(2)几条
–格式:
/*
select 别名1.列名,别名2.列名
FROM 表1 别名
LEFT OUTER JOIN 表2 别名
ON 关联条件
WHERE 条件;
*/
–栗子:查询emp表中所有员工的编号、姓名、职位以及该员工所属的部门编号‘地址
/*SELECT e.empno,e.ename,e.job,d.deptno,d.loc
FROM EMP e LEFT OUTER JOIN dept d
ON e.deptno = d.deptno;

SELECT e.empno,e.ename,e.job,d.deptno,d.loc
FROM EMP e LEFT JOIN dept d
ON e.deptno = d.deptno;

SELECT s.id,s.name,s.age,a.age_no,a.class_presion,a.higth
FROM STUDENTS s LEFT JOIN age a
ON s.AGE = a.AGE_NO;
*/

–右外链接:以右表为主表,查询右表中的所有数据以及与之关联的左表中的数据,右表几(2)条数据,查询数据为(2)几条
–格式:
/*
SELECT 别名1.*列名,别名2.*列名
FROM 左表1 别名 RIGHT JOIN 右表2 别名
ON 条件;

SELECT e.empno,e.ename,e.job,d.deptno,d.loc
FROM EMP e RIGHT JOIN dept d
ON e.deptno = d.deptno;

–栗子:查询emp表中所有员工的编号、姓名、职位以及所有部门的信息
SELECT e.empno,e.ename,e.job,d.*
FROM emp e RIGHT JOIN dept d
ON e.deptno = d.deptno;

SELECT s.id,s.name,s.age,a.age_no,a.class_presion,a.higth
FROM STUDENTS s RIGHT JOIN age a
ON s.AGE = a.AGE_NO;
*/

/*–全外链接查询:查询所有表中的所有数据(有关联的查,无关联的也差)
–相同ID数据合并,总数为两表和减去ID重复数
SELECT s.id,s.name,s.age,a.age_no,a.class_presion,a.higth
FROM STUDENTS s full JOIN age a
ON s.AGE = a.AGE_NO;

–左表查询–6条数据
SELECT s.id,s.name,s.age,a.*
FROM STUDENTS s left JOIN age a
ON s.AGE = a.AGE_NO;

–右表查询–5条数据
SELECT s.id,s.name,s.age,a.*
FROM STUDENTS s RIGHT JOIN age a
ON s.AGE = a.AGE_NO;

–栗子(全外链接表查询,合并相同信息,总数为11,相同数以为一条,查询结果为10-1=9条):查询emp表中所有员工的编号、姓名、职位以及所有部门的信息
SELECT e.,d.
FROM STUDENTS e full join age d
ON e.age = d.age_no(+)
ORDER BY HIGTH,age_no DESC;
*/
UPDATE AGE SET higth

/*
–index 索引
–创建索引格式;CREATE INDEX 索引名称 ON 表名;
–在worker表中设置一个woeker_name索引
CREATE INDEX worker_name ON WORKER(name);
CREATE INDEX emp_empno on emp(empno);

SELECT * FROM worker;

INSERT INTO WORKER VALUES(1,‘张杰’);
INSERT INTO WORKER VALUES(2,‘张从’);
INSERT INTO WORKER VALUES(3,‘张妖尾’);
commit;
–1、索引查询格式:SELECT 字段名表 FROM 表名表 (INDEX(索引名)) WHERE
SELECT ID,name FROM WORKER WHERE name=‘张从’;

SELECT * from STUDENTS;
SELECT * FROM EMP;
WHERE empno = 1;
SELECT * FROM worker;

–删除索引
–格式:
–DROP INDEX 索引名
DROP INDEX worker_name;
*/

/*
–试图:数据均来自于基础表,删除基础表数据不改变
–创建视图格式:
–create VIEW 视图名称
–AS
–查询语句;
–栗子:
CREATE VIEW view_emp
AS
SELECT * FROM sTUDENTS;

CREATE OR replace VIEW VIEW_STUDENTS1
AS
SELECT * FROM STUDENTS;
SELECT * FROM VIEW_STUDENTS1;
WITH read only;

INSERT INTO VIEW_STUDENTS1 VALUES(2,‘云中君’,123)

create or replace view view_emp2
as
SELECT d.*,e.EMPNO,e.ename,e.JOB,e.sal
FROM emp e,dept d
where e.deptno = d.deptno(+)
ORDER BY e.sal desc;
select * from view_emp2;
WITH read only;

–删除视图
–格式:DROP VIEW 视图名称、
–栗子:
drop VIEW VIEW_EMP;
drop VIEW VIEW_EMP2;

*/\

–事物的管理:
DELETE WORKER;
SELECT * FROM WORKER1;
CREATE table worker2(
id NUMBER(4) primary key,
name VARCHAR2(50)
);

INSERT INTO worker2 VALUES(1,‘张杰’);
INSERT INTO worker2 VALUES(2,‘刘备’);
INSERT INTO worker2 VALUES(3,‘孙权’);
INSERT INTO worker2 VALUES(4,‘貂蝉’);
commit;
SELECT * FROM worker1;
–1、提交commit;真是入库

INSERT INTO WORKER1 VALUES(5,‘李元霸’);
INSERT INTO WORKER1 VALUES(6,‘李世民’);
SELECT * FROM worker1;
–2、回滚 rollback;取消未提交,不做commit
SELECT * FROM worker1;

–为什么使用事物?
/*栗子:
银行表:
编号 姓名 余额
1 胡歌 100000000
2 徐璐 50000

账户1的账户转给账户200
第一个操作 账户1先减去200
UPDATE 银行表 SET 余额表 = 余额 - 5000 WHERE 编号 = 1;
–commit;

账户2的账户转入200
第二个操作 账户增加5000
UPDATE 银行表 SET 余额表 = 余额 + 5000 WHERE 编号 = 2;
commit;
*/

/*白盒测试
1、内存泄漏
hibernate:用来操作一个数据库框架(ssh)
SESSION:通过session对数据库进行操作
session.save(对象),把数据保存到数据库中。把对象在数据中保存一份,在内存中保存一份
session.SAVE(EMP);
session.clear(),清空缓存空间
*/
UPDATE chery_clm.order_process a
SET a.cust_no = ‘100120000183’
WHERE a.cust_no = ‘1001200000183’;

上一篇:串联多列的值,如mysql中concat的用法。


下一篇:TwoDay_MySQL 多表连接查询