数据库查询语句sql
SELECT * FROM dept;
--数据库语句中分号是分隔符,系统遇到分号才会执行语句
多行注释
*/
select 列1,列2 ,……列n --定义查询数据所在的列
from 表1,表2 ,……表n --定义查询数据所在的表
where 限定条件1 and/or 限定条件2 …… 限定条件n --定义查询数据的限定条件
group by 列 1,列 2 ,……列 n --定义查询数据的分组方式
having 分组函数条件 1 and/or 分组函数条件2 …… --定义查询数据分组函数的限定条件
order by 列1 [asc/desc] ,列2 [asc/desc] ,…… 列n [asc/desc] --定义查询结果的排序方式
*/
SELECT * FROM emp;
--* 会降低查询效率,尽量避免使用
SELECT ename,job,sal,deptno FROM emp;
SELECT ename,job,sal,12*sal FROM emp;
SELECT ename,hiredate,hiredate+365 FROM emp;
--sysdate 表示当前系统时间
SELECT ename,hiredate,(SYSDATE-hiredate)/365,SYSDATE-30 FROM emp;
--当空值参与运算时,得到的结果也是空值
SELECT ename,sal,comm,12*(sal+comm) FROM emp;
/*
select 列名1 别名,列名2 别名 ……
select 列名1 as 别名,列名2 as 别名 ……
select 列名1 “别名”,列名2 “别名” ……
*/
SELECT ename xingming,job zhiwei,deptno FROM emp;
SELECT ename,sal,comm,12*(sal+comm) nianxin FROM emp;
--双引号只出现在列的别名中,在 sql 语句中其他任何地方都不会再出现双引号
SELECT ename||job FROM emp;
SELECT 50,SYSDATE,'I am the king' FROM emp;
--字符串必须加单引号
SELECT 'ename',job FROM emp;
SELECT deptno FROM emp;
SELECT DISTINCT deptno FROM emp;
SELECT DISTINCT job FROM emp;
--SELECT ename,DISTINCT job FROM emp;
SELECT DISTINCT deptno,job FROM emp;
第三章 限定和排序
SELECT ename,job,sal,deptno FROM emp
WHERE deptno = 10;
WHERE sal > 2000;
WHERE job = 'CLERK';
--字符串加单引号,区分大小写
SELECT ename,job,sal,12*sal nianxin FROM emp
WHERE 12*sal > 30000;
SELECT ename,job,deptno FROM emp
WHERE deptno = 30;
SELECT ename,job,sal,deptno FROM emp
WHERE sal BETWEEN 1500 AND 3000;
SELECT ename,job,sal,deptno FROM emp
WHERE job IN ('CLERK','SALESMAN','PRESIDENT');
--_ 表示任意1个字符
--% 表示任意个任意字符
SELECT * FROM emp
WHERE ename LIKE 'S%'; --开头为S
WHERE ename LIKE '%S'; --结尾为S
WHERE ename LIKE '%S%'; --包含S
WHERE ename LIKE '_A%'; -- 第二个字符为A
SELECT ename,job,sal,comm FROM emp
WHERE comm IS NULL;
SELECT ename,job,sal,deptno FROM emp
WHERE deptno = 20
AND sal > 2500;
SELECT ename,job,sal,deptno FROM emp
WHERE deptno = 20
OR sal > 2500;
SELECT ename,job,sal,deptno FROM emp
WHERE job NOT IN('SALESMAN','MANAGER');
SELECT * FROM emp
WHERE job IN ('SALESMAN','CLERK')
OR sal > 2000
AND deptno = 20;
WHERE (job IN ('SALESMAN','CLERK')
OR sal > 2000)
AND deptno = 20;
--order by 子句永远在查询语句的最后
--asc 升序,默认可以不写
--desc 降序
SELECT * FROM emp
ORDER BY sal;
WHERE deptno = 30
ORDER BY sal DESC;
SELECT * FROM emp
ORDER BY hiredate;
ORDER BY ename DESC;
SELECT ename,job,sal,deptno FROM emp
ORDER BY deptno,sal DESC;
SELECT ename,job,sal FROM emp
ORDER BY deptno;
SELECT ename,job,sal,12*sal nianxin FROM emp
ORDER BY nianxin DESC;
SELECT * FROM emp
WHERE sal > 2000
AND job = 'MANAGER';
SELECT ename,job,sal,12*sal nianxin FROM emp
WHERE 12*sal > 30000
AND job <> 'MANAGER';
SELECT * FROM emp
WHERE sal BETWEEN 1500 AND 3000
AND job LIKE 'M%';
SELECT ename,job,sal,comm,sal+comm yongjin,deptno FROM emp
WHERE sal+comm IS NULL
AND deptno IN (20,30);
SELECT ename,sal,comm,sal+comm yongjin,deptno FROM emp
WHERE sal+comm IS NOT NULL
OR deptno = 20
ORDER BY sal DESC;
且部门号不是10或40的雇员信息,要求按照雇员姓名进行排列
SELECT ename,job,sal,12*sal nianxin,deptno FROM emp
WHERE 12*sal > 30000
AND job <> 'MANAGER'
AND deptno NOT IN (10,40)
ORDER BY ename;
第四章 单行函数
f(x)=3x+4
f(2)=10
f1(3,4)=23
SELECT UPPER('abcdefg') FROM emp;
--dual 是系统默认的一张空表,用来做辅助的查询和运算
SELECT UPPER('abcdefg') FROM dual;
WHERE UPPER(job) = UPPER('clerk');
SELECT LOWER('ABCDEFG') FROM dual;
SELECT LOWER(ename),LOWER(job) FROM emp;
SELECT * FROM emp
WHERE LOWER(job) = 'salesman';
SELECT INITCAP('abcdEFG') FROM dual;
SELECT INITCAP(ename),INITCAP(job) FROM emp;
SELECT LENGTH('abcdefg') FROM dual;
SELECT ename,LENGTH(ename) FROM emp;
SELECT * FROM emp
WHERE LENGTH(ename) = 5;
SELECT ename,sal,comm,12*(sal+NVL(comm,0)) FROM emp;
--SELECT ename,job,NVL(mgr,'BOSS') FROM emp;
SELECT ename,sal,comm,12*(sal+NVL2(comm,comm,0)) FROM emp;
--y 和 z 数据类型必须一致
SELECT REPLACE('abcdefg','cd','xyz') FROM dual;
SELECT ename,REPLACE(ename,'A','wwwwwww') FROM emp;
SELECT SUBSTR('abcdefg',2,3) FROM dual;
SELECT ename,SUBSTR(ename,2,2) FROM emp;
SELECT ename,SUBSTR(ename,3) FROM emp;
SELECT ename,SUBSTR(ename,LENGTH(ename)-1) FROM emp;
SELECT ename,SUBSTR(ename,-2) FROM emp;
SELECT LPAD('abcdefg',15,'w') FROM dual;
SELECT LPAD(ename,10,'name') FROM emp;
SELECT LPAD('abcdefg',15) FROM dual;
SELECT LPAD(ename,10) FROM emp;
SELECT LPAD(ename,4) FROM emp;
SELECT RPAD('abcdefg',15,'w') FROM dual;
SELECT RPAD(ename,10,'name') FROM emp;
SELECT RPAD('abcdefg',15) rp FROM dual;
SELECT RPAD(ename,10) rp FROM emp;
SELECT RPAD(ename,4) FROM emp;
SELECT LTRIM('abcbcxbacbacbdefg','abc') FROM dual;
--y 中的字符串没有先后顺序,只要 x 的左边有 y 中的任意字符都会被去掉
SELECT ename,LTRIM(ename,'AD') FROM emp;
SELECT LTRIM(' abcdefg ') FROM dual;
SELECT RTRIM('abcbcxbacbacbdefgabcbac','abc') FROM dual;
--y 中的字符串没有先后顺序,只要 x 的左边有 y 中的任意字符都会被去掉
SELECT ename,RTRIM(ename,'AD') FROM emp;
SELECT RTRIM(' abcdefg ') FROM dual;
--leading 左边,trailing 右边
--both 两边,默认可以不写
SELECT ename,TRIM('S' FROM ename) FROM emp;
SELECT ename,RTRIM(LTRIM(ename,'S'),'S') FROM emp;
--y 可以不写,如果不写默认去掉空格
SELECT TRIM(' abcdefg ') tr FROM dual;
--concat 只允许 2 个参数
SELECT CONCAT(ename,job) FROM emp;
SELECT CONCAT(CONCAT(ename,' is a '),job) FROM emp;
SELECT INSTR('abcabcfdfdsfdsbfb','d',3,3) FROM dual;
SELECT ename,INSTR(ename,'A',1,1) FROM emp;
SELECT ename,INSTR(ename,'A',2) FROM emp;
SELECT ename,INSTR(ename,'A') FROM emp;
WHERE ename LIKE '%A%';
WHERE INSTR(ename,'A') > 0;
SELECT FLOOR(123),FLOOR(123.456),FLOOR(-123.456) FROM dual;
SELECT MOD(8,3),MOD(7.5,2.3),MOD(-9,-2) FROM dual;
--n 可以为 0 ,n 为 0 返回 m
SELECT ROUND(123.456,1),ROUND(123.456,2),ROUND(123.456,0) FROM dual;
SELECT ROUND(127.456,-1),ROUND(183.456,-2),ROUND(623.456,-3) FROM dual;
SELECT ROUND(123.456) FROM dual;
SELECT TRUNC(123.456,1),TRUNC(123.456,2),TRUNC(123.456,0) FROM dual;
SELECT TRUNC(127.456,-1),TRUNC(183.456,-2),TRUNC(623.456,-3) FROM dual;
SELECT TRUNC(123.456) FROM dual;
SELECT * FROM emp;
SELECT SYSDATE FROM dual;
SELECT ADD_MONTHS(SYSDATE,5) FROM dual;
SELECT ename,hiredate,ADD_MONTHS(hiredate,3) FROM emp;
SELECT ADD_MONTHS(SYSDATE,-5) FROM dual;
SELECT LAST_DAY(SYSDATE) FROM dual;
SELECT ename,hiredate,LAST_DAY(hiredate) FROM emp;
SELECT NEXT_DAY(SYSDATE,'SATURDAY') FROM dual;
SELECT ename,hiredate,NEXT_DAY(hiredate,'FRIDAY') FROM emp;
SELECT * FROM emp
WHERE deptno = '10';
--YYYY 表示四位年份数字,YEAR 表示年份的拼写
--MM 表示两位月份数字,MONTH 表示月份的拼写
--DD 表示两位日期数字,DAY 表示日期的拼写(星期)
--可以使用分隔符将年月日隔开,可以是,:;-_空格
SELECT SYSDATE,TO_CHAR(SYSDATE,'YYYYMMDD') FROM dual;
SELECT ename,hiredate,TO_CHAR(hiredate,'YYYY:MM:DD') FROM emp;
SELECT ename,hiredate,TO_CHAR(hiredate,'YEAR MONTH DAY') FROM emp;
SELECT ename,hiredate,TO_CHAR(hiredate,'YYYY MONTH DD') FROM emp;
SELECT ename,hiredate,TO_CHAR(hiredate,'MONTHDD-YYYY') FROM emp;
SELECT ename,hiredate,TO_CHAR(hiredate,'fmMONTH-DD-YYYY') FROM emp;
SELECT ename,hiredate,TO_CHAR(hiredate,'YYYY') FROM emp;
SELECT ename,hiredate,TO_CHAR(hiredate,'MM') FROM emp;
SELECT ename,hiredate,TO_CHAR(hiredate,'MM-DD') FROM emp;
--9 代表一位数字
--0 代表一位数字,如果位数不足用 0 补齐
--, 代表分隔符,位置可以自定义
--. 代表小数点,只能出现一次,不能在开头和结尾
--$ 代表货币,L 代表本地货币
SELECT ename,TO_CHAR(sal,'999,999.99') FROM emp;
SELECT ename,TO_CHAR(sal,'000,000.00') FROM emp;
SELECT ename,TO_CHAR(sal,'99,99,99.99') FROM emp;
SELECT ename,TO_CHAR(sal,'$999,999.99') FROM emp;
SELECT TO_DATE('1997-07-01','YYYY-MM-DD') FROM dual;
SELECT TO_DATE('19970701','YYYYMMDD') FROM dual;
SELECT TO_DATE('19970701','YYYYDDMM') FROM dual;
SELECT TO_DATE('1997','YYYY') FROM dual;
--如果只转换年份,会用当前系统所在月份的第一天来补齐日期
--如果只转换月份,会用当前系统所在年份和当月的第一天来补齐
--如果只转换日期,会用当前系统所在月份来补齐
/*
decode(x,value1,result1,
value2,result2,
...
valueN,resultN,
default)
判断 x 的值,如果 x=value1 ,返回 result1,
如果 x=value2 ,返回 result2 ,
……
如果 x=valueN ,返回 resultN ,
如果 x 不等于以上任何值,返回 default
*/
SELECT ename,job,sal,deptno,
DECODE(deptno,10,sal+200,
20,sal+300,
30,sal+500,
sal+100) addsal
FROM emp;
回*****hello*****(用三种方法实现)
SELECT '*****'||'hello'||'*****' FROM dual;
SELECT CONCAT('*****',CONCAT('hello','*****')) FROM dual;
SELECT RPAD(LPAD('hello',10,'*'),15,'*') FROM dual;
SELECT UPPER(SUBSTR('abcdefg',5)) FROM dual;
SELECT UPPER(LTRIM('abcdefg','abcd')) FROM dual;
SELECT ename,SUBSTR(ename,2) FROM emp;
SELECT ename,LTRIM(ename,SUBSTR(ename,1,1)) FROM emp;
SELECT * FROM emp
WHERE ename NOT LIKE '%A%';
WHERE INSTR(ename,'A') = 0;
SELECT ename,LPAD(ename,10,SUBSTR(ename,1,1)) FROM emp;
SELECT ename,hiredate,TO_CHAR(hiredate,'MM') FROM emp
WHERE TO_CHAR(hiredate,'MM') = 6;
SELECT * FROM emp
WHERE hiredate = LAST_DAY(hiredate)-2;
要求当员工在10号部门时,显示’财务部’,20号部门时显示’研发部’,
30号部门时显示’销售部’,其余部门显示’未知部门’
SELECT empno,ename,sal,deptno,
DECODE(deptno,10,'Finance',
20,'Research',
30,'Sales',
'Unknown') deptname
FROM emp;
第五章 多表查询
SELECT ename,job,sal,dname,loc FROM emp,dept;
SELECT * FROM dept;
--多表查询时,必须使用表名对列名进行限定
--如果不限定列名,会在所有的表中去查找该列,会降低查询效率
--多表查询时,from 换行
SELECT emp.ename,emp.job,emp.sal,emp.deptno,dept.deptno,dept.dname,dept.loc
FROM emp,dept;
--外键和主键的等值对应
SELECT emp.ename,emp.job,emp.sal,emp.deptno empdno,dept.deptno deptdno,dept.dname,dept.loc
FROM emp,dept
WHERE emp.deptno = dept.deptno;
--使用别名来区别同名的列
SELECT e.ename,e.job,e.sal,e.deptno eno,d.deptno dno,d.dname,d.loc
FROM emp e,dept d
WHERE e.deptno = d.deptno;
FROM emp e,dept d
WHERE e.deptno = d.deptno
AND e.sal > 2000;
SELECT * FROM salgrade;
SELECT e.ename,e.sal,s.grade,s.losal,s.hisal
FROM emp e,salgrade s
WHERE e.sal BETWEEN s.losal AND s.hisal;
SELECT * FROM emp;
FROM emp w,emp m
WHERE w.mgr = m.empno;
--查询员工信息和他所在部门的信息,没有员工的部门也显示
SELECT * FROM emp;
SELECT * FROM dept;
--如果要显示某张表的所有数据,把 (+) 放在连接条件的另一侧
SELECT e.*,d.*
FROM emp e,dept d
WHERE e.deptno(+) = d.deptno;
SELECT w.ename,w.mgr,m.empno,m.ename
FROM emp w,emp m
WHERE w.mgr = m.empno(+);
--查询员工信息和他所在部门的信息,没有员工的部门也显示,没有部门的员工也显示
SELECT e.*,d.*
FROM emp e FULL OUTER JOIN dept d
ON e.deptno = d.deptno;
SELECT e.ename,e.sal,e.deptno,d.dname,d.loc
FROM emp e,dept d
WHERE e.deptno = d.deptno;
SELECT e.ename,e.sal,s.grade
FROM emp e,salgrade s
WHERE e.sal BETWEEN s.losal AND s.hisal
AND s.grade >= 3;
SELECT e.ename,e.sal,s.grade,d.dname
FROM emp e,dept d,salgrade s
WHERE e.deptno = d.deptno
AND e.sal BETWEEN s.losal AND s.hisal
AND e.deptno = 10;
SELECT w.ename,m.ename
FROM emp w,emp m
WHERE w.mgr = m.empno(+);
SELECT d.dname,e.*
FROM emp e,dept d
WHERE e.deptno(+) = d.deptno;
第六章 分组函数
SELECT AVG(sal) FROM emp;
SELECT SUM(sal) FROM emp;
SELECT COUNT(empno) FROM emp;
SELECT COUNT(*) FROM emp;
SELECT MAX(sal),MIN(sal) FROM emp;
SELECT MAX(ename),MIN(ename) FROM emp;
SELECT MAX(hiredate),MIN(hiredate) FROM emp;
SELECT AVG(comm),COUNT(comm) FROM emp;
SELECT SUM(comm)/COUNT(empno),SUM(comm)/COUNT(comm) FROM emp;
SELECT AVG(NVL(comm,0)),COUNT(NVL(comm,0)) FROM emp;
SELECT AVG(sal),COUNT(empno) FROM emp
WHERE deptno = 10;
WHERE job = 'SALESMAN';
WHERE sal > 1500;
--SELECT deptno,AVG(sal) FROM emp;
--group by 跟列名,当该列的数值想等时看作为一组
--group by 后面的普通列可以出现在 select 后面,让分组函数的结果可读性更高
SELECT deptno,AVG(sal),COUNT(empno) FROM emp
GROUP BY deptno;
--select 后面既有普通列又有分组函数时,普通列必须出现在 group by 子句
SELECT job,COUNT(empno),SUM(sal) FROM emp
GROUP BY job;
SELECT deptno,job,MAX(sal),MIN(sal),COUNT(empno) FROM emp
GROUP BY deptno,job
ORDER BY deptno;
/*
SELECT deptno,AVG(sal) FROM emp
WHERE AVG(sal) > 2500
GROUP BY deptno;
*/
SELECT deptno,AVG(sal) FROM emp
GROUP BY deptno
HAVING AVG(sal) > 2500;
SELECT deptno FROM emp
GROUP BY deptno
HAVING SUM(sal) > 10000;
SELECT AVG(AVG(sal)) FROM emp
GROUP BY deptno;
SELECT job,AVG(sal) FROM emp
GROUP BY job
ORDER BY AVG(sal);
SELECT deptno,job,AVG(sal) FROM emp
GROUP BY deptno,job
ORDER BY deptno,AVG(sal) DESC;
------------ ------------ ------------
4 4 6
GROUP BY deptno;
SUM(DECODE(deptno,20,1,0)) dept20,
SUM(DECODE(deptno,30,1,0)) dept30
FROM emp;
shopping:
-----------------------------------------
u_id goods num
------------------------------------------
1 苹果 2
2 梨子 5
1 西瓜 4
3 葡萄 1
3 香蕉 1
1 橘子 3
=======================
想要的结果为:
--------------------------------
u_id goods_sum
____________________
1 苹果,西瓜,橘子
2 梨子
3 葡萄,香蕉
---------------------------------
- select u_id, wmsys.wm_concat(goods) goods_sum
- from shopping
- group by u_id
想要的结果2:
--------------------------------
u_id goods_sum
____________________
1 苹果(2斤),西瓜(4斤),橘子(3斤)
2 梨子(5斤)
3 葡萄(1斤),香蕉(1斤)
---------------------------------
使用oracle wm_concat(column)函数实现:
- select u_id, wmsys.wm_concat(goods || '(' || num || '斤)' ) goods_sum
- from shopping
- group by u_id