关系型数据库基础及应用(三)——SQL查询(以Oracle为主)
SQL(基础查询)
基本查询语句
from子句
SELECT * FROM DUAL;
· SELECT用于指定要查询的列;FROM指定要从那个表中查询;
· 如果查询所有字节用*;如果只查询特定的,可以直接在SELECT后面指定列名,用逗号隔开;
使用别名
· 在SQL语句中可以通过使用列的别名改变标题的显示样式,或者表示计算结果的含义;
· 使用语法是列的别名跟在列名后,中间可以加或者不加一个“AS”关键字;
· 如果希望别名中区分大小写字符,或者别名中包含字符或空格,则必须使用双引号引起来;
SELECT empno AS id,ename "Name",sal*12 "Salary" FROM emp;
where子句
--查询部门10下的员工信息
SELECT * FROM emp WHERE deptno=10;
· 在SELECT语句中,可以在WHERE子句中使用比较操作符限制查询结果;
· 如果和数字比较,可以使用单引号引起,也可以不用;
· 如果和字符及日期类型的数据比较,则必须用单引号;
查询条件(常用的)
使用>、<、>=、<=、!=、<>、=等条件加入到where语句中查询
--查询职员表中薪水低于2000元的职员信息
SELECT ename,sal FROM emp where sal < 2000;
使用LIKE条件(模糊查询)
SELECT ename,job FROM emp WHERE ename LIKE'_A%';
· 比较操作符LIKE用来做模糊查询;
· 当用户在执行查询时,不能完全确定某些信息的查询条件,或者只知道信息的一部分,可以借助LIKE来实现
· LIKE需要借助两个通配符;这两个通配符可以配合使用,构造灵活匹配条件;
%:表示0到多个字符;
_:表示单个字符
使用IN和NOT IN
--查询职位是MANAGER或者CLERK的员工
SELECT ename,job FROM emp WHERE job IN('MANAGER','CLERK');
· 比较操作符IN(list)用来取出符合列表范围中的数据;
· list表示值列表,当列或表达式匹配与列表中的任何一个值时,条件为TRUE,该条记录则被显示出来;
· IN也可以理解为一个范围比较操作符,只不过这个范围是一个指定的值列表;
· NOT IN(list)取出不符合此列表中的数据记录
BETWEEN...AND...
--查询薪水在1500-3000之间的职员信息
SELECT ename,sal FROM emp WHERE sal BETWEEN 1500 AND 3000;
使用IS NULL和IS NOT NULL
· 空值NULL是一个特殊的值,比较的时候不能使用“=”号,必须使用IS NULL,否则不能得到正确的结果;
使用ANY和ALL条件
SELECT empno,ename,sal FROM emp WHERE sal>ANY(3500,4000,4500);
· ALL和ANY不能单独使用,需要配合单行比较操作符>、>=、<、<=一起使用;>ANY:大于最小;<ANY:小于最大
>ALL:大于最大;<ALL:小于最小
查询条件中使用表达式和函数
· 当查询需要对选出的字段进行进一步计算,可以在数字列上使用算术表达式(+、-、*、/);
· 表达式符合四则运算的默认优先级,如果要改变优先级可以使用括号;
· 算术运算主要是针对数字类型的数据,对日期类型的数据可以做加减操作,表示在一个日期值上加或减一个天数;
使用DISTINCT过滤重复
--查询员工部门编码,去掉重复值
SELECT DISTINCT deptno FROM emp;
排序
使用ORDER BY子句
SELECT ename,deptno FROM emp ORDER BY deptno;
· 必须出现在SELECT中最后一个子句;
ASC和DESC
--不写ASC或DESC,默认是ASC,升序排列
SELECT ename,mgr from emp where deptno=10 ORDER BY mgr;
--降序排列,必须指明
SELECT ename,sal FROM emp ORDER BY sal DESC;
· ASC用来指定升序排列(默认选项),DESC用来指定降序排序;
· NULL值视作最大,则升序排列时,排在最后,降序排列时,排在最前面;
多个列排序
--对职员表中的职员排序,先按照部门编码正序排列,再按照薪水降序排列
SELECT ename,deptno,sal FROM emp ORDER BY deptno ASC ,sal DESC;
· 当以多列作为排序标准时,首先按照第一列进行排序,如果第一列数据相同,再以第二列进行排序,以此类推;
· 多列排序时,不管正序还是倒序,每个列需要单独设置排序方式;
聚合函数
什么是聚合函数
· 将表的全部数据划分为几组数据,每组数据统一一个结果;
· 因为是多行数据参与运算返回一行结果,也称作分组函数、多行函数、集合函数;
MAX和MIN
· 用来获取列或表达式的最大、最小值;
· 可以用来统计任何数据类型,包括数字、字符和日期;
AVG和SUM
· 用来统计列或表达式的平均值和和值;
· 只能操作数字类型;忽略NULL值;
COUNT
· 用来计算表中的记录数;忽略NULL值;
分组查询
GROUP BY子句
select * from emp group by deptno oeder by deptno;
HAVING子句
select * from emp group by deptno HAVING SAL>400 oeder by deptno;
· HAVING子句用来对分组后的结果进一步限制,比如按部门分组后,得到每个部门的最高薪水,可以继续限制输出结果
· 必须跟在GROUP BY后面,不能单独使用;
查询语句执行顺序
· 查询语句的执行顺序依下列子句次序:
1、from子句:执行顺序为从后往前,从右到左;
- 数据量较少的表尽量放在后面;
2、where子句:执行顺序自上而下,从右到做;
- 将能过滤掉最大数量记录的条件写在where子句的最右;
3、group by--执行顺序从左往右分组;
- 最好在GROUP BY前使用WHERE 将不需要的记录在GROUP BY之前过滤掉;
4、having子句:消耗资源;
- 尽量避免使用,HAVING会在检索出所有记录之后才对结果集进行过滤,需要排序等操作;
5、select子句:少用*号,尽量取字段名称;
- ORACLE在解析的过程中,通过查询数据字典将*号依次转换成所有的列名,消耗时间;
6、order by子句:执行顺序为从左到右排序,消耗资源;
7、where -> group by -> having -> order by
SQL(关联查询)
关联基础
关联的概念
select table1.cloumn as t1,table2.cloumn as t2 from table1,table2 where t1=t2;
· 这种查询两个或两个以上数据表或试图的查询叫做连接查询;
· 连接查询通常建立在存在相互关系的父子表之间;
笛卡尔积
select count(*) from emp;--14条
select count(*) from dept;--4条
select emp.ename,dept.dname from emp,dept;--56条
· 笛卡尔积指做关联操作的每一个的每一行和其他表的每一行做组合,假设两个表的记录数分别是X和Y,笛卡尔积将返回X*Y条记录;
· 关联查询时不指定连接条件就会出现笛卡尔积,实际开发要避免这种情况,通常笛卡尔积是没有意义的;
等值连接
· 连接查询中最常见的一种,通常是在有主外键关联关系的表间建立,并将连接条件设定为有关系的列,使用“=”连接相关的表;
select e.ename,e.job,d.dname,d.loc from emp e,dept d where e.deptno = d.deptno
关联查询
1、内连接:返回满足条件的数据
select e.ename,e.job,d.dname,d.loc from emp e,dept d where e.deptno = d.deptno
select e.ename,e.job,d.dname,d.loc from emp e JOIN dept d ON(e.deptno = d.deptno);
2、外连接
· 内连接返回满足连接条件的数据记录;
· 有些情况下,需要返回那些不满足连接条件的记录,需要使用外连接;
· 外联接不仅返回满足连接条件的记录,还将返回不满足连接条件的记录;
· 驱动表概念;
select table1.column,table2.column from
table LEFT|RIGHT|FULL [OUTER] JOIN table2 ON table1.column = table2.column;
(1)左外链接:以左边的表作为驱动表,即emp为驱动表
select e.ename,d.dname from emp e LEFT OUTER JOIN dept d ON e.deptno = d.deptno;
(2)右外连接:以右边的表作为驱动表,即以dept作为驱动表
select e.ename,d.dname from emp e RIGHT OUTER JOIN dept d ON e.deptno = d.deptno;
3、全外连接
· 全外连接是指,除了返回满足连接条件的记录,还会返回不满足连接条件的所有其他行;
· 是左外连接和右外连接查询结果的总和;
select e.ename,d.dname from emp e FULL OUTER JOIN dept d ON e.deptno = d.deptno;
4、自连接
· 自连接是一种特殊的连接查询,数据的来源是一个表,即关联关系来自与表单中的多个列;
· 表中的列表参照同一个表中的其他列的情况称作自参照表;
· 自连接是通过将表用别名虚拟成两个表的方式实现,可以是等值或不等值连接;
· 举例:
--查询每个职员的经理名字,以及他们的职员编号
select worker.empno w_empno,worker.ename w_ename,manager.empno m_empno,maneger.ename m_ename
From emp worker join emp manager ON worker.mgr = manager.empno
下一篇: asp.net 冒泡算法的理解