可以对字段加别名,当SELECT子句中出现了函数或者表达式时,结果集中就会用这个函数或者表达式作为字段名,
可读性差,这是我们通常会给该字段加别名,别名用双引号区分大小写
SELECT name,salary*12 "sal" FROM emp
SELECT * FROM emp
查询职位时CLERK的员工信息
SELECT * FROM emp WHERE job='CLERK'
SELECT * FROM emp WHERE salary<5001
SELECT * FROM emp WHERE salary<5000 OR job='teacher'
SELECT * FROM emp WHERE salary<5000 AND job='teacher'
AND 的优先级高于OR ,可以加括号来提高优先级
SELECT * FROM emp WHERE salary>5000 AND (job='teacher' OR job='CLERK')
使用LIKE条件(模糊查询)
LIKE 需要借助两个通配符:%:表示0到多个字符
_:表示单个字符
SELECT * FROM emp
WHERE name LIKE '_a_k%'
IN(list)和NOT IN(list)
判断是否在列表中会不在列表中,常在子查询中使用
SELECT name ,job FROM emp WHERE job IN('CLERK','teacher')
BETWEEN...AND...操作符用来查询符合某个值域范围内
查询工资5000-5500的员工
SELECT * FROM emp WHERE salary BETWEEN 5000 AND 5500
使用IS NULL ,IS NOT NULL
ANY和ALL条件
ANY 其中之一
ALL 所有
>ANY(list) ,大于列表中的最小 <ANY 小于最大
>ALL(list) 大于列表中的最大 <ALL 小于最小
后面的列表几乎不会使用确定值,常用于判断子查询的结果。
下面演示只要大于1000的即可
SELECT * FROM emp WHERE salary>ANY(1000,5100,5350);
过略条件也可以使用函数或者表达式
SELECT * FROM emp WHERE salary*12>60000;
DISTINCT 用于去除结果集中指定字段的重复值
SELECT DISTINCT job FROM emp
DISTINCT 必须紧跟在SELECT 关键字后,可以对多列去重,保证这些列的组合没有重复值
SELECT DISTINCT job,birth FROM emp
ORDER BY 子句,对数据按一定规则进行排序操作,ASC 升序,默认就是升序 |DESC 降序
ORDER BY只能定义在SELECT 语句的最后一个子句上,
查看工资排名
SELECT name,salary FROM emp ORDER BY salary DESC
多段排序
SELECT name,job,salary,birth FROM emp ORDER BY salary DESC,birth DESC
排序具有优先级,先按照第一个字段的排序方式排序结果集,当第一个字段有重复值,
再按第二个字段的排序方式排序
聚合函数:又称多行函数,用来统计结果
MAX,MIN,统计最大值,最小值
查看最高,最低工资
SELECT MAX(salary),MIN(salary) FROM emp
平均工资,总和
SELECT AVG(salary),SUM(salary) FROM emp
COUNT 统计的是记录的条数,不关注具体该字段的取值,
查看工资员工人数
SELECT COUNT(name) FROM emp
聚合函数忽略NULL值
用NVL保证NULL的也能取到,演示如下:
SELECT AVG(NVL(salary,0)),SUM(salary) FROM emp
统计表中记录数。常用COUNT(*)
SELECT COUNT(*) FROM emp
GROUP BY 子句语序将结果按照给定的字段值相同的记录看作一组,然后配合聚合函数每组记录进行统计。
SELECT job,MAX(salary) FROM emp GROUP BY job
当SELECT 中含有聚合函数时,凡不再聚合函数中的单独字段都必须出现在GROUP BY 子句中
查看每个职业的平均工资和总和,
SELECT job,SUM(salary),AVG(salary) FROM emp GROUP BY job
查看每个职业各多少人
SELECT job,COUNT(*) FROM emp GROUP BY job
WHERE中不允许使用聚合函数作为过滤条件,原因在于过滤时机不同。WHERE的过滤时机在第一次从
表中检索数据时添加过滤条件,用来确定哪些数据可以被查询出来,以确定结果集
查看每个部门的平均工资,前提时该部门平均工资高于2000
HAVING子句:过滤分组,必须跟在 GROUP BY 子句之后,可以使用聚合函数作为过滤条件使之可以对分组进行过滤
将满足条件的分组保留,不满足的去掉
SELECT job,AVG(salary) FROM emp
GROUP BY job HAVING AVG(salary)>1000
查询语句执行顺序:
1:FROM,执行顺序为从后往前,从右到左,数据量较少的表,尽量放在后面
2:WHERE 执行顺序为自下而上,从右到左,将能过滤掉最大数据记录的条件卸载WHERE子句的最右
3:GROUP BY 执行顺序从左往右分组,最好咋GROUP BY之前使用WHERE将不需要的记录在GROUP BY之前过滤掉
4.HAVING 子句:消耗资源,尽量避免使用,HAVING会在检索出所有记录后才对结果集进行过滤,需要排序操作
4.SELECT 子句,少用*号,尽量取字段名称,
4.ORDER BY 子句,执行顺序为从左到右排序,消耗资源,最后执行!
SELECT * FROM EMP
关联查询:
查询的结果集中字段来自多张表
联合多张表查询数据就是关联查询
在关联查询中需要过滤条件中添加两张表中记录之间的对应关系,这样的条件称为连接条件
N张彪联合查询至少要有N-1个连接条件,不添加连接条件或产生笛卡儿积,除特殊情况下,该
结果集通常时无意义的,并且由于数据量大,对系统资源消耗有巨大影响
查看每个员工的名字以及所在部门名字
SELECT name,dname FROM emp,dept
WHERE emp.depino=dept.depino
SELECT * FROM dept
在关联查询中的过滤条件应当与连接条件同时成立。
SELECT name ,dname FROM emp,dept
WHERE emp.depino=dept.depino AND dept.dname='SALES'
当查询过程中,出现字段在两张表中都有的情况时,必须明确该字段属于哪张表
SELECT emp.name,emp.depino,dept.dname
FROM emp,dept
WHERE emp.depino=dept.depino
当表名比较长的时候,取别名
SELECT e.name,e.depino,d.dname
FROM emp e,dept d
WHERE e.depino=d.depino
平均工资高于4000的部门
SELECT AVG(e.salary),d.dname
FROM emp e,dept d
WHERE e.depino=d.depino
GROUP BY d.dname
HAVING AVG(e.salary)>4000
内连接
关联查询的另一种写法
查询么个员工以及所在部门
SELECT e.name,d.dname
FROM emp e JOIN dept d
ON e.depino=d.depino
UPDATE emp SET depino=50 WHERE name='ward'
外连接
外连接在进行关联查询时,可以将不满足条件的记录也查询出来,
外连接分为:左外连接,右外连接,全外连接
左外连接:以JOIN 左侧表作为驱动表,该表中所有的记录全部会列出来,那么当某条记录不满足
连接条件时,该记录总来自右侧表中的字段的值为NULL
右外连接:RIGHT OUTER JOIN
全外连接 FULL OUTER JOIN
SELECT e.name,d.dname
FROM emp e LEFT OUTER JOIN dept d ON e.depino=d.depino
使用+ 来实现,左外,右外连接,+号在哪边,哪边补 NULL
SELECT e.name,d.dname
FROM emp e ,dept d WHERE e.depino=d.depino(+)
自连接:
指的是自己表中的记录对应自己表的多条记录,建立的关联查询就是自连接,
自连接设计用于解决数据相同,但是存在上下级关系的树状结构使用
SELECT e.name, m.name
FROM emp e,emp m
WHERE e.mgr(领导的编号)=m.empno(编号)
查看每个领导手下多少人
SELECT COUNT(*),m.name FROM emp e,emp m
WHERE e.mgr=m=empno
GROUP BY m.name