单表查询
列的选取-投影
1
select empno, ename, deptno from emp;
开发中一般不使用 *
数据库中:列名大小写不敏感,内容大小写敏感
列别名
-
方法1:列名+” “+别名
-
方法2:列名 as 别名
1 2
select empno 员工编号, ename 员工姓名 from emp; select empno as 员工编号, ename as 员工姓名 from emp;
列的算数表达式(+,-,*,/)
1
2
-- 显示年收入
select empno, ename, sal*12 年收入 from emp;
-
处理空值得函数 nvl() : null value
nvl(para1, para2):
para1:可能为空的值
para2:当para1为空时,则该位置的值为para2
且两个参数的 字段类型 必须相同
1 2
select * from emp; select empno, ename, sal, comm, sal+nvl(comm,0) from emp;
-
连接字符串 ** ** ,与 + 不同 1
select empno, ename, empno||ename from emp;
-
技巧:
- 想在看到所有字段的情况下,添加一个查询字段,可以给表加一个别名
1
select e.*, empno||ename from emp e;
- 修改表中的数据(Oracle特有!!!)
1 2
--1.for update select * from emp for update;
1 2
--2.rowid select rowid, e.* from emp e;
一般不用 * ,在开发时会将 * 改为需要的字段
对行选取
-
1 2
-- 选取部门号为10的所有员工 select * from emp wheree deptno=10
-
1 2
-- 查询所有岗位是 MANAGER 的员工 select * from emp where job='MANAGER';
在SQL中对于字符串的引用只能是单引号,且大小写敏感
distinct关键字
-
关键字用途:将不同的显示出,相同的过滤掉
1 2
-- 查询所有员工的岗位名称列表 select distinct job from emp; -- 查询出所有岗位种类
1 2
-- 显示部门号与岗位的名称列表对应关系 select distinct deptno, job from emp; -- 过滤掉重复的"行"
between,in,like,is NULL 关键字
-
**Betwwen **
1 2 3 4
-- 查询所有薪水(sal)在[1600,3000]的人员信息 select * from emp where sal between 1600 and 3000; select * from emp where sal >= 1600 and sal <= 3000; -- 两个语句结果相同
1 2
-- 查询部门号为10或20的员工 select * from emp where deptno = 10 or deptno = 20
-
Like
1 2 3 4 5
-- "_" 表示任何字符 -- "%" 表示任何多个字符 -- eg.查找名字中带有A的员工 select * from emp where ename like '_A%'; -- 不常用 select * from emp where ename like '%A%'; -- 很重要
-
逃逸字符 @
Like 短语中特殊字符的处理:escape*
1 2 3
-- 笔试可能会出 select ename from emp where ename like '%@%%' escape '@'; select ename from emp where ename like '%/%%' escape '/';
escape后定义的那个字符才是转义字符
-
is NULL
“很重要”
1 2
-- 查询所有comm为null的员工 select t.*, comm from emp t where comm is null;
1 2
-- 查询公司谁是最大boss select * from emp where mgr id null;
逻辑运算:not,and,or,in
1
2
3
4
5
6
7
8
9
10
11
12
13
-- 所在部门编号为10、20的员工
select empno, ename, sal, deptno from emp
where deptno = 10 or deptno = 20;
select empno, ename, sal, deptno from emp
where deptno in (10,20);
-- 不在10,20的员工
select empno, ename, sal, deptno from emp
where not(deptno = 10 0or deptno = 20); -- not表示非
select empno, ename, sal, deptno from emp
where deptno <> 10 and deptno <> 20; -- <> 表示不等于
select empno, ename, sal, deptno from emp
where deptno not in (10,20);
排序 Order by
-
ASC 升序 acend
-
DESC 降序 descend
-
如果同时执行了两个排序方式,先执行前者,再在前者的基础上执行后者
1 2 3
-- **将员工姓名升序排列,或降序排列** select ename, job from emp order by ename ASC; select ename, job from emp order by ename ASC, job DESC;
单行函数
-
字符函数
1 2 3
select upper('sql course') from dual; -- dual 为虚表(Oracle特有) select lower(ename), t.* from emp t; ...
1 2
-- 姓名中含有'a'的人员信息 select * from emp where lower(ename) like '%a%';
ps:开发中like后 ‘ ‘ 里所跟字符串的大小写由后端代码负责,而字段名所匹配的数据大小写由SQL负责
1 2
-- 子串:SUBSTR('String', 1, 3) => str select substr('string', 1, 3) from dual; -- 截取字符串
-
日期函数
取系统时间:sysdate Oracle特有函数
1
select sysdate from dual;
日期 +/- n = n 天之后/前
1
select sysdate-5 from dual; -- 系统时间五天之前
to_char: 日期,格式话字符串,是转换函数,将日期转换为字符类型
1 2
select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual; select to_char(sysdate, 'yyyy"年"mm"月"dd"日"') from dual;
ps: to_char不要在字段上使用,否则可能会导致时间数据不准
-
组函数(聚合函数)
1 2 3
-- 计算机员工分布在哪几个部门 select distinct deptno from emp; -- 有人的部门由哪些 select count(distinct deptno) from emp; -- 有几个部门有人
Ps:
-
组函数忽略空值 null
-
select 的列如果使用了聚合函数,则后面的其他列要么放在聚合函数中,要么放在 Group By 后面
-
-
Group By
1 2 3 4 5 6 7 8
-- 按部门分组,计算每个部门的薪水总和 select deptno, sum(sal) from emp group by deptno; -- 计算每个职位的平均薪水 select job, avg(sal) from emp group by job; -- 计算每个部门每个职位的平均薪水 select deptno, job, avg(sal) from emp group by deptno, job order by deptno; -- group by deptno, job 表示先按部门排,再按职位排
-
Having: 表示在Group By 分组之后进一步筛选
1 2 3 4 5 6 7 8 9 10 11 12
-- 平均薪水大于1500元的部门号 select deptno, avg(sal) from emp group by deptno having avg(sal) > 1500; -- 部门工资总和大于7000元的部门号 select deptno, sum(sal) from emp group by deptno having avg(sal) > 7000; -- 按本公司岗位平均薪水大于1500元的岗位信息 select job, avg(sal) from emp group by job having avg(asl) > 1500;
结论:只要是对group by的结果进行筛选,则必用having
-