数据库基础(三)
一、基本查询语句
FROM 子句后面添加查找的表
字段的别名
当我们在使用SELECT语句中查询内容时,若某个字段是一个函数或者表达式的时候,那么在查询结果集中对应的该字段的名字就是这个函数或者表达式,可读性差,这个时候我们可以为该函数或表达式起一个别名,这样结果集中会使用该别名作为该字段的名字。
使用语法是列的别名跟在列名后,中间可以加或不加 AS 关键字。
如果别名中有空格或者需要区分大小写,需要将别名加上双引号1
2SELECT id AS studentno FROM student;
SELECT id "Student NO" FROM student;
WHERE 子句
WHERE可以用在DML语句中,也可以用在SELECT语句中,作用是添加过滤条件,只选出满足条件的记录。
在SELECT中使用时,当数据库查询表中数据时,每查询一条记录,都会先查看该记录是否满足条件,并将满足条件的记录查询出来。
二、查询条件
使用>,<,>=,<=,<>,= 进行判断
ORACLE中也可以使用!=代替<>,推荐使用<>
AND,OR 关键字
如果希望返回的结果必须满足多个条件,应该使用AND逻辑操作符连接这些条件
如果希望返回的结果满足多个条件之一,应该使用OR逻辑操作符连接这些条件
AND的优先级高于OR
LIKE 条件,模糊查询
LIKE需要借助两个通配符:
% - 表示0到多个字符
_ - 标识单个任意字符
1 | SELECT name FROM student WHERE LIKE '_A%' //匹配A为第二个字母的任意字符串 |
IN(list)和NOT IN(list) 比较操作符
list表示值列表,当列或表达式匹配于列表中的任何一个值时,条件为true,该条记录则被显示出来
NOT IN取出不符合此列表中的数据记录
IN与NOT IN常用于子查询1
SELECT name FROM student WHERE IN('SMITH','JONES')
BETWEEN…AND…
用来查询符合某个值域范围条件的数据
最常见的是使用在数字类型的数据范围上,但对字符类型和日期类型数据也同样适用
ANY和ALL
ANY和ALL不能单独使用,需要配合当行比较操作符>、>=、<、<=一起使用
> ANY:大于最小
< ANY:小于最小
> ALL:大于最大
< ALL:小于最大
1 | SELECT id FROM student WHERE sal > ANY(3000,4000,5000) |
查询条件中使用条件和表达式
如UPPER,LOW
DISTINCT 关键字,可以取出指定字段值相同的记录行
DISTINCT必须紧跟在SELECT关键字之后
DISTINCT后面接多个字段会去除重复的组合1
SELECT DISTINCT name FROM student
三、排序
ORDER BY 子句
用于排序查询出来的结果集,可以对指定的字段按照升序或者降序排列
ORDER BY子句必须写在SELECT语句的最后面
ORDER BY 排序默认是按照升序进行,若在后面添加DESC则为降序1
SELECT name FROM student ORDER BY id DESC
ORDER BY 也可以对多个字段进行排序,多字段排序是有优先级,先按照第一个字段的方式排序,在第一个字段相同的那些记录中,再按照第二个字段的方式排序1
SELECT name FROM student ORDER BY id DESC,age DESC
四、聚合函数
聚合函数,又称多行函数,分组函数
聚合函数可以将多条记录的指定字段的值进行统计,然后得出一个结果
聚合函数均忽略NULL值
MAX和MIN 求最大值和最小值
可以用来统计任何数据类型,包括数字、字符和日期1
SELECT MAX(sal),MIN(sal) FROM student
AVG和SUM 用来统计表达式的平均值和和值
只能操作数字类型1
SELECT ACG(sal),SUM(sal) FROM student
如果希望不忽略NULL,可以使用NVL函数将NULL替换来解决1
SELECT AVG(NVL(comm,0)) FROM student
COUNT 用来计算表中的记录条数,即统计指定字段值不为NULL的记录的条数1
SELECT COUNT(comm) FROM student
若要统计总数,不忽略NULL则1
SELECT COUNT(*) FROM student
五、分组
GROUP BY 子句
GROUP BY 是为了配合聚合函数使用的,使用GROUP BY子句后,分组可以更细致,就可以不在将整张表所有记录看做一组再进行统计了,可以将表中指定的字段的值相同的记录看做一组,再进行分组统计。1
SELECT MAX(sal),MIN(sal),deptno from student GROUP BY deptno
当SELECT子句中出现了分组函数,那么凡不在聚合函数的单独字段必须出现在GROUP BY子句中,但是反过来没有强制要求。
GROUP BY子句后面也可以跟多个字段,当按照多个字段分组时,是按照记录中这些字段值的组合相同的看做一组1
SELECT COUNT(*),deptno,job from student GROUP BY deptno,job
HAVING 子句
HAVING 子句用来对分组后的结果进一步限制,必须跟在GROUP BY后面,不能单独存在
使用分组函数作为判断条件只能出现在 HAVING 中1
SELECT AVG(sal),deptno FROM student GROUP BY deptno HAVING AVG(sal) > 2000
WHERE是在第一次从表中查询数据的时候进行过滤,而HAVING是在查询出的数据中进行统计,然后使用统计结果再次进行过滤的。所以WHERE中不能使用分组函数。
六、查询语句执行顺序
1.FROM子句:执行顺序从后往前、从右到左
数据量较少的表尽量放在后面
2.WHERE子句:执行顺序自上而下、从右到左
将能过滤掉最大数量记录的条件放在WHERE子句的最后
3.GROUP BY:从左往右分组
- 最好在GROUP BY前使用WHERE将不需要的记录在GROUP BY之前过滤掉
4.HAVING子句:消耗资源
- 尽量避免使用,HAVING会在检索出所有记录之后才对结果集进行过滤,需要排序等操作
5.SELECT子句:少用 * 号,尽量取字段名称
- ORACLE在解析过程中,通过查询数据字典将*号依次转换成所有的列名,消耗时间
6.ORDER BY子句:执行顺序为从左到右排序,消耗资源
七、关联查询
查询的结果可能来自多张表,要从多张表中获取数据时,就要找到这几张表中记录的对应关系,然后建立联系后分别获取。所以,连接条件(指表之间记录的对应关系)在关联查询中是十分关键的。
N张表关联查询,至少要有N-1个连接条件,否则会出现笛卡尔积(这是一个无用的结果集,对系统资源开销大,甚至会导致系统瘫痪)。1
SELECT emp.ename,dept.dname FROM emp,dept WHERE emp.deptno = dept.deptno
表可以起别名1
SELECT e.ename,d.dname FROM amp e,dept d WHERE e.deptno = d.deptno
内连接
内连接返回所有满足链接条件的记录1
SELECT e.ename,d.dname FROM emp e JOIN dept d ON e.deptno=d.deptno
关联查询出现的一个问题是,不满足连接条件的数据将不会被显示到结果集中。
外连接
有些情况下,需要返回那些不满足连接条件的记录,这时需要使用外连接
外连接不仅返回满足连接条件的记录还返回不满足连接条件的记录
外连接分为:
1.左外连接:以左表为驱动表,其数据都要显示,来自右表记录中的字段在结果集中若不满足连接条件,则值为NULL.
2.右外连接:以右表位驱动表
3.全外连接:两张表的数据都要查询出来,哪边不满足哪边值为NULL1
2
3SELECT e.ename,d.dname FROM emp e LEFT OUTER JOIN dept d ON e.deptno=d.deptno
SELECT e.ename,d.dname FROM emp e RIGHT OUTER JOIN dept d ON e.deptno=d.deptno
SELECT e.ename,d.dname FROM emp e FULL OUTER
自连接
自连接是一种特殊的链接查询,数据来源是一个表,即关联关系来自于单表中的多个列
自连接设计的目的是为了解决相同类型数据之间存在父子级关系的数据结构(典型的是树状结构)
自连接是通过将表用别名虚拟成两个表的方式实现,可以是等值或不等值连接1
SELECT e.name,e2.name FROM emp e,emp e2 WHERE e2.empno=e.empno