用户对表或视图最常进行的操做就是检索数据,检索数据能够经过 select 语句来实现,该语句由多个子句组成,经过这些子句完成筛选、投影和链接等各类数据操做,最终获得想要的结果。算法
语法:express
select { [ distinct | all ] columns | * }函数
[ into table_name ]测试
from { tables | views | other select }spa
[ where conditions]code
[ group by columns ]orm
[ having conditions ]排序
[ order by columns ]开发
只包含select 子句和 from 子句的查询就是简单查询,同时也是select语句的必选项。字符串
select 子句用于选择想要在查询结果中显示的列,这些列能够用列名来表示,也可使用星号(*)来表示。查询数据时,数据将按照select 子句后面指定的列名顺序来显示;若是使用星号,则表示查询全部的列,这时候按照表结构的天然顺序来显示。
若是想要检索知道数据表的全部列,在select 子句后面加星号来实现。
语法: select * from table_name;
注意:a、检索数据表须要注意是否属于该模式,若是是模式内部检索数据,直接使用表名;
b、若是不在指定表所属的模式内部检索数据,不只要查看当前模式是否具备查询的权限,并且还要在表名前面驾驶所属的模式名称
c、 form 后面能够跟多个表名,每一个表名直接用逗号隔开便可
若是想要显示指定的列而不是所有的列,而且被指定列的顺序不受限制,指定部分列也称为投影操做。须要把所显示的列紧跟在select 关键字后面,每一个列名用逗号隔开。
语法:select column_name1,column_name2,column_name3... from table_name;
在使用select 语句时,对于数字数据和日期数据均可以使用算数表达式,可使用算数运算法,包括加、减、乘、除和括号操做。不只能够执行单独数学运算,还能够执行单独的日期运算以及与列名关联的运算。
语法:select salary*(1+0.1,sal from emp;
为了方便查看查询结果,能够为须要的列名指定别名。在 Oracle 系统中,可使用as 关键字来指定别名,也能够什么也不用直接指定。
语法: select empno as "员工编号",ename "员工名称" from emp;
在默认状况下,结果集中包含全部符合查询条件的数据行,这样就可能出现重复的数据。在实际应用中,重复的数据可能不会带来太多的价值,须要去掉重复的记录,保留惟一记录便可。使用 distinct 便可实现。
语法: select distince job from emp;
在 select 语句中使用where 子句能够实现对数据行的筛选操做,只有知足where 子句中的判断条件才会显示在结果集中。
语法:
select columns_list from table_name where conditional_expression;
经常使用的集中筛选状况:
能够在 where 子句中使用比较运算符来筛选数据,这样只有知足条件的数据行才会被查询到,主要由下面6中状况:
a、A=B : 比较 A 与 B 是否相等
b、A!B 或 A <>B : 比较 A 与 B 是否不相等
c、A > B : 比较 A 是否大于 B
d、A < B :比较 A 是否小于 B
e、A >= B : 比较 A 是否大于或等于 B
f、A <= B : 比较 A 是否小于或等于 B
除了上面的6种,还有两个特殊的“比较筛选”操做
g、A { operator }ANY (B) :表示 A 与 B 中的任何一个元素进行operator 运算符的比较,只要有一个比较值为true,就返回数据行
h、A { operator } ALL (B):表示 A 与 B 中的全部元素都进行 operator 运算符的比较,只有与全部元素比较值都为 true,才返回数据行
下面看一个例子:
SQL > select empno,ename,sal from emp where sal <> all (3000,950,800);
表示从emp 表中使用 all 关键字过滤工资(sal) 同时不等于300、950和800的数据行。
SQL 语言提供了 like、in、between 和 isnull 等关键字来筛选匹配的数据,下面一项项来看:
(1)Like 关键字
在 where 子句中使用 like 关键字查询数据的方式也称为字符串模式匹配或字符串模糊查询。like 关键字须要使用通配符在字符串内查找指定的模式,经常使用的通配符有下划线 “_”,表明任意一个字符;百分号 “%”,表明任 意数量的字符。
EG: SQL> select name,job from emp where name like "S%" and job like "K_";
表示从emp表中查询 名字以 “S” 开头且任意长度的字符串,而且 job 是以 “K” 开头长度为 2 的字符串
注意:能够在 like 关键字前面加上 not,表示否认的判断,固然也能够在 in ,between ,isnull 和 isNAN 等关键字前面加上 not 来表示否认的判断。
(2)IN 关键字
当测试一个数据值是否匹配一组目标中的一个时,一般用 IN 关键字来指定列表搜索条件。
格式: value in (value1,value2,value3......)
EG : SQL > select name from job where name in ("Tom", "Emma","Tony");
表示从emp 表中查询 名字在列表中的数据行 。
(3)Between 关键字
须要返回某一个数据值是否位于两个给定的值之间,可使用范围条件进行查询。一般使用 between... and 和 not between...and 来指定范围条件。
使用 between ....and 的条件时,指定的第一个值必须小于第二个值。其实等价于比较运算符(>= ... <=).
EG: SQL > select sal from emp where sal between 2000 and 3000;
表示从emp 表中查询工资大于等于2000而且小于等于3000的数据行。
(4)ISNULL关键字
空值(NUll)从技术上来讲就是位置的、不肯定的值,但空值与空字符串不一样,空值是不存在的值,而空字符串是长度为 0 的字符串。
空值表明的是未知的值,可是并不能用空值来互相比较,这点须要特别注意。
EG: SQL > select address from student where address is null;
表示从 student 表中查询住址目前为空值的数据行
使用逻辑运算符 AND、OR、NOT能够进行逻辑筛选,能够把多个筛选条件组合起来,这样便于获取更加准确的数据记录。
AND 表示两个表达式之间 “逻辑与” 的关系,须要知足多个两个或者多个表达式才能成立。
OR 表示两个表达式“逻辑或” 的关系,两个表达式中有一个为 true,则这个逻辑表达式的值就为 true。
NOt 表示对表达式执行“逻辑非” 的运算。
数据分组的目的是用来汇总数据或为整个分组显示单行的汇总信息,一般在查询结果集中使用 group by 子句对记录进行分组。
语法:
select columns_list from table_name [ where conditional_expression ] group by columns_list [ having contion_expression] ;
group by 子句能够基于指定某一列的值讲数据集合划分为多个分组,同一组内全部记录在分组属性上具备相同值,也能够基于指定多列的值将数据集合划分为多个分组。
EG:SQL > select deptno,job from emp group by deptno,job order by deptno;
表示按照部门编号(deptno) 和职务(job)列进行分组。
group by子句常常和聚合函数一块儿使用。
EG:SQL > select deptno as 部门编号,avg(sal) as 平均工资 from emp group by deptno;
表示按照部门进行分类,而后计算每个部门的平均工资。
having子句能够进行再次筛选
EG:SQL > select deptno as 部门编号,avg(sal) as 平均工资 from emp group by deptno having avg(sal) > 200;
表示按照部门进行分组查询,而后经过having子句直接过滤出平均工资大于200的部门信息。
查询数据时,查询结果将按照默认的顺序排列,每每并不能知足咱们的需求。咱们可使用order by 子句对检索的结果进行排序。
语法:
select columns_list from table_name [ where conditional_expression ] [ group by columns_list ] [ order by { order_by_expression [ ASC| DESC ] } ] [,...n]
order by 子句能够根据查询结果中的一个列或多个列对查询结果进行排序,而且第一个排序项是最主要的排序依据,剩下的是次要的排序依据。
EG:SQL > select deptno,empno from emp order by deptno ,empno;
表示先按照部门编号进行升序排序,若是有相同项,按照员工编号进行升序排序。
在实际应用中查询数据可能会涉及多个数据表,每一个表不是独立存在的,而是若干个表之间的信息存在必定的关系,当查询一个表的信息时,极可能须要查询关联数据表的信息,这就是多表关联查询。
在进行多表查询时,若是多个表之间存在同名的列,则必须使用表名来限定列的引用。SQL 语言提供了设定表别名的机制,使用简短的表别名就能够替代原有较长的表名称,能够大大缩短语句的长度。
EG:SQL > select e.empno as 员工编号,e.ename as 员工名称, d.dname as 部门 from emp e,dept d where e.deptno = d.deptno and e.job ="Manager";
表示经过部门号(deptno)来管理emp表和dept表,并查询这两个表中相关字段的信息。
注意:一旦在from 子句中为表指定了列名,则必须在剩余的子句中都使用表别名。
内链接是经常使用的多表关联查询,使用关键字inner join来实现,其中,inner 关键字能够省略,使用 join 即表明内联接。使用内联接查询多个表时,必须在 from 子句以后定义一个 on 子句,用来指定两个表实现内联接的“链接 条件”。
使用内联接进行多表查询时,返回的查询结果是只包含查询条件和链接条件的行,消除了与另外一个表中任何行不匹配的行。
注意:在内联接的查询结果中,全部记录行都是知足链接条件的。
语法:
select column_list
from table_name1 [ innter ] join table_name2
on join_condition;
EG: SQL > select e.empno as 员工编号, e.ename as 员工名称,d.dname as 部门 from emp e inner join dept d on e.deptno = d.deptno;
表示经过 deptno 字段来链接emp 表和 dept表,并查询两个表中相关的字段。
多表之间进行外链接时,除了返回全部匹配的行外,还会返回一部分或所有不匹配的行,这主要取决于外链接的种类,主要由如下3种:
(1)、左外链接:关键字为left Outer join 或 left join
左外联接的结果集包括 LEFT OUTER子句中指定的左表的全部行,而不只仅是联接列所匹配的行。若是左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的全部选择列表列均为空值。
EG:select e.empon,e.ename,e.job,d.deptno,d.dname from emp e left join dept d on e.deptno = d.deptno;
表示从员工表(emp)表中查询出来全部的记录并查询部门表(dept)中两个deptno值相等的记录,若是没有相匹配的行,均为空值。
(2)右外链接:关键字为 right outer join 或 right join
右向外联接是左向外联接的反向联接。将返回右表的全部行。若是右表的某行在左表中没有匹配行,则将为左表返回空值。
EG:select e.empno,e.ename,e.job,d.deptno,d.name from emp e right join dept d on e.deptno = d.deptno;
表示从部门表(dept)中查询出来全部的记录,并查询员工表(emp)表中与之deptno 对应的记录,若是没有匹配的行,均为空值。
(3) 彻底外链接:关键字为 full outer join 或 full join
完整外部联接返回左表和右表中的全部行。当某行在另外一个表中没有匹配行时,则另外一个表的选择列表列包含空值。若是表之间有匹配行,则整个结果集行包含基表的数据值。
EG:select e.empno,e.ename,e.job,d.deptno,d.dname from emp e full join dept d on e.deptno = d.deptno;
表示查询两个表中全部的deptno的记录,若是对方的表中没有匹配的行,置为空值。
天然链接是指在查询多个表时,Oracle 会将第一个表中的列与第二表中具备相同名称的列进行自动链接。天然链接中,用户不须要指定进行连续的列,这个任务由 Oracle 系统西段完成,天然链接使用“Natural join”关键字。
EG: select empno,ename,job,dname from emp natural join dept where sal > 200;
表示在emp表中查询工资(sal)大于2000的记录,并实现emp表与dept 表的天然链接。
注意:天然链接强制要求表之间必须具备相同的列名称,可是在实际开发中不多用到。在使用天然链接时,不能为列指定限定词(即表名或表的别名),不然Oracle 会报错。
在开发中,用户可能会拥有“自引用式”的外键,是指表中的一个列能够是该表主键的一个外键。
EG:
交叉链接实际上就是不须要任何链接条件的链接,它使用 cross join 关键字来实现。
语法: select colums_list from table_name1 cross join table_name2;
交叉链接的执行结果是一个笛卡尔积,这种查询很是冗余,但能够经过where 子句来过滤出有用的记录。
图解:
------------------------------------------------------------------------------------------------------------------------------------------------
表A Id name 表B ID job p_id
1 张三 1 25 1
2 李四 2 36 2
3 王五 3 36 4
a.id与b.p_id存在关系
-----------------------------------------------------------------------------------------------------------------------------------------------
(1)内链接
SQL > select a.*,b.* from a inner join b where a.id=b.p_id;
---------------------------------------------------------------------------------
a.Id a. name b.id b.job b.p_id
1 张三 1 25 1
2 李四 2 36 2
----------------------------------------------------------------------------------
(2)左外链接
SQL > select a.*,b.* from a left join b where a.id=b.p_id;
---------------------------------------------------------------------------------
a.Id a. name b.id b.job b.p_id
1 张三 1 25 1
2 李四 2 36 2
3 王五 null null null
----------------------------------------------------------------------------------
(3)右外链接
SQL > select a.*,b.* from a right join b where a.id=b.p_id;
---------------------------------------------------------------------------------
a.Id a. name b.id b.job b.p_id
1 张三 1 25 1
2 李四 2 36 2
null null 3 36 4
----------------------------------------------------------------------------------
(4)彻底链接
SQL > select a.*,b.* from a full join b on a.id=b.p_id
---------------------------------------------------------------------------------
a.Id a. name b.id b.job b.p_id
1 张三 1 25 1
2 李四 2 36 2
null null 3 36 4
3 王五 null null null
----------------------------------------------------------------------------------