表达查询是数据库中最常用的操作,最基本的语句为 SELECT <列名、值、函数> FROM <表名>
当在 SELECT 后使用 * 即表示所查询表中的所有列,如SELECT * FROM emp 就会查出emp表中的所有数据
如果不想要输出所有列,需要在 SELECT 后面加上想要获得的列名,如 SELECT ename, eno FROM emp 就会查出emp表中所有数据的ename值和eno值
如果不想输出所行,需要在表名后加上 WHERE <条件> ,如 SELECT * FROM emp WHERE eno < 50 就会输出eno小于50的所有数据
有时候我们可能需要同时查询多个表中的数据,这时候就需要用到表的连接
表的连接可以分为以下几种:
1、笛卡尔积:没有连接条件,是多个表中数据所有可能组合的集合
SELECT * FROM emp e, dept d
2、内连接:通过标间相同的字段来进行连接,如可以通过部门编号把员工信息与部门信息连接起来
SELECT * FROM emp e, dept d WHERE e.deptno = d.deptno
3、外连接:也是通过相同的字段来连接,但会输出不满足连接条件的数据,如查看考试成绩信息但有些人没有参加考试
SELECT * FROM emp e LEFT JOIN(左外链接,右外连接为RIGHT JOIN) dept d ON e.deptno = d.deptno
4、自连接:本表与本表进行连接
SELECT * FROM emp e1, emp e2 WHERE e1.deptno = e2.deptno
5、自然连接:不同表中相同列名的数据进行等值连接
有些时候我们可能要用到其他表中的一些值作为条件,就需要用到子查询
SELECT * FROM emp WHERE e.deptno = (SELECT deptno FROM dept WHERE dname='财务部')
就可以查到所有财务部的员工信息类
当我们需要统计一些数据时,如总分、平均分、成绩,就需要用到 聚合函数 和 GROUP BY
SELECT deptno, avg(sal) FROM emp GROUP BY deptno
可以查询到每个部门的平均工资
当需要在条件中使用聚合函数时,需要用到 HAVING 而不是 WHERE
SELECT deptno FROM emp GROUP BY deptno HAVING avg(sal) > 3000
可以查询到评价工资大于3000的部门编号
当我们需要进行分页查询时,就需要对数据进行排列和截取
ORDER BY <列名> [ASC | DESC] 可以根据列进行升序(ASC 默认)和降序(DESC)排序,如果GROUP BY 后有多个列名,那会从左到右依次排序,如 ORDER BY score DESC, id 就会先根据score降序,如果 score 有相同数值再根据 id 在score相同的情况下升序
如果要进行分页截取,那么就得先获得列的列数,可以用 ROWNUM 来获得
SELECT ROWNUM, ename FROM emp