本文主要讲解了SQL语言的数据查询的相关语法,并且给出了详实的例子供读者参考
SQL设计了
S
E
L
E
C
T
−
F
R
O
M
−
W
H
E
R
E
SELECT-FROM-WHERE
SELECT−FROM−WHERE的句型结构:
S
E
L
E
C
T
A
1
,
.
.
.
,
A
n
F
R
O
M
R
1
,
.
.
.
,
R
m
W
H
E
R
E
F
这里
R
1
.
.
.
是关系,
F
是公式,
A
1
,
.
.
.
是属性
SELECT \ A_1,...,A_n\\ FROM \ R_1,...,R_m\\ WHERE \ F\\ 这里R_1...是关系,F是公式,A_1,...是属性\\
SELECT A1,...,AnFROM R1,...,RmWHERE F这里R1...是关系,F是公式,A1,...是属性
简单的理解
在WHERE子句的条件表达式F中可使用下列运算符

完整语法如下:
SELECT 目标表的列名或列表达式序列
FROM 基本表名和(或)视图序列
[WHERE 行条件表达式]
[GROUP BY 列名序列[HAVING 组条件表达式]]
[ORDER BY 列名[ASC|DESC],...]
简单的可以理解为:
单表查询仅涉及一个表,是一种最简单的查询操作。
它有如下的诸多用途:
1.选择表中的若干列
2.选择表中的若干元组
3.对查询结果排序
4.使用聚合函数
5.对查询结果分组
查询每个人需要交税的金额,假设800以上薪水需要交税,税率为10%

代码:
SELECT ENAME,(SAL-800)*0.1 FROM EMP;
结果:


代码:
SELECT ENAME 姓名,SAL 薪水(SAL-800)*0.1 税金 FROM EMP;

使用DISTINCT关键词可以达到取消重复的行的效果
SELECT DEPTNO FROM EMP;
缺省时默认为ALL
SELECT ALL DEPTNO FROM EMP;

SELECT DISTINCT DEPTNO FROM EMP;

SELECT ENAME ,SAL FROM EMP WHERE SAL BETWEEN 1500 AND 2000;
``````sql
SELECT ENAME ,SAL FROM EMP WHERE SAL>=1500 AND SAL<=2000;
两个代码的效果一样,即BETWEEN AND等价于>=AND<=。

下面提供了两种方法,都是可以找出特定集合元素的值
其中 * 表示全部列都显示,是一种缺省
SELECT * FROM EMP WHERE JOB IN('SALESMAN','CLERK');

SELECT * FROM EMP WHERE JOB='SALESMAN' OR JOB='CLERK';

谓词: [NOT] LIKE ‘<匹配串>’ [ESCAPE ‘ <换码字符>’]
<匹配串>可以是一个完整的字符串,也可以含有通配符%和 _
查询名字以S开头,第三个字母是O的员工姓名
SELECT ENAME FROM EMP WHERE ENAME LIKE 'S_O%';

可以按一个或多个属性列排序
升序:ASC;降序:DESC;缺省值为升序
当排序列含空值时
ASC:排序列为空值的元组最后显示
DESC:排序列为空值的元组最先显示
SELECT * FROM EMP ORDER BY COMM ASC;

SELECT * FROM EMP ORDER BY COMM DESC;

聚合函数是涉及整个关系的另一类运算操作,通过聚合函数,可以把某一列中的值形成单个值。
5类主要聚合函数:
SELECT count(*) FROM EMP;

SELECT SUM(SAL) FROM EMP;

SELECT AVG(SAL) FROM EMP;

SELECT MAX(SAL) FROM EMP;

SELECT MIN(SAL) FROM EMP;

细化集函数的作用对象
SELECT DEPTNO,AVG(SAL) AS 平均工资 FROM EMP GROUP BY DEPTNO;

注意:
WHERE子句中是不能用聚集函数作为条件表达式,因此需要用HAVING短语
只有满足HAVING短语指定条件的组才输出。
HAVING短语与WHERE子句的区别:作用对象不同
查平均工资大于2200元的部门
SELECT DEPTNO ,AVG(SAL) AS 员工工资 FROM EMP GROUP BY DEPTNO HAVING AVG(SAL)>2200;

连接查询:同时涉及两个以上的表的查询
连接条件或连接谓词:用来连接两个表的条件
一般格式:
[<表 名1>.]<列名1> <比较运算符> [<表名2>.]<列名2>
[<表名1>.]<列名1> BETWEEN [<表名2>.]<列名2> AND [<表名2>.]<列名3>
连接字段:连接谓词中的列名称
连接条件中的各连接字段类型必须是可比的,但名字不必相同
根据医生的薪水,查看医生和其对应的职称
(DOCTOR_INFORMATION)

(DOCTOR_LEVEL)

SELECT DOCTOR_INFORMATION.*,DOCTOR_LEVEL.*
FROM DOCTOR_INFORMATION,DOCTOR_LEVEL
WHERE DOCTOR_INFORMATION.DOCTORSAL=DOCTOR_LEVEL.DLEVELSAL;
结果:

根据医生的薪水,查看医生和其对应的职称
(DOCTOR_INFORMATION)

(DOCTOR_LEVEL)

SELECT DOCTOR_INFORMATION.*,DOCTOR_LEVEL.*
FROM DOCTOR_INFORMATION
INSERT JOIN DOCTOR_LEVEL
ON (DOCTOR_INFORMATION.DOCTORSAL=DOCTOR_LEVEL.DLEVELSAL);
自然连接是指在检索多个表时,Oracle会将第一个表中的列与第二个表中具有相同名称的列进行自动连接。在自然连接中,用户不需要明确指定进行连接的列,这个任务由Oracle系统自动完成,自然连接使用**“NATURAL JOIN”关键字。**
在emp表中检索工资(sal字段)大于2000的记录,并实现emp表与dept表的自然连接。
emp:

dept:

SELECT EMPNO,ENAME,JOB,DNAME
FROM EMP NATURAL JOIN DEPT
WHERE SAL>2000;

自身连接:一个表与其自己进行连接
需要给表起别名以示区别
由于所有属性名都是同名属性,因此必须使用别名前缀
查看每个职称的上级职称

SELECT FIRST.DLEVELID,FIRST.DLEVELNAME,FIRST.FATHERLEVEL,
SECOND.DLEVELID,SECOND.DLEVELNAME
FROM DOCTOR_LEVEL FIRST,DOCTOR_LEVEL SECOND
WHERE FIRST.FATHERLEVEL=SECOND.DLEVELID
结果:

外连接与普通连接的区别
1.普通连接操作只输出满足连接条件的元组
2.外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出
3.左外连接:列出左边关系中所有的元组
4.右外连接:列出右边关系中所有的元组
外连接通常有以下三种:
DOCTOR_INFORMATION

DOCTOR_LEVEL

SELECT DOCTOR_INFORMATION.*,DOCTOR_LEVEL.*
FROM DOCTOR_INFORMATION
LEFT JOIN DOCTOR_LEVEL
ON (DOCTOR_INFORMATION.DOCTORSAL=DOCTOR_LEVEL.DLEVELSAL);
结果:

SELECT DOCTOR_INFORMATION.*,DOCTOR_LEVEL.*
FROM DOCTOR_INFORMATION
RIGHT JOIN DOCTOR_LEVEL
ON (DOCTOR_INFORMATION.DOCTORSAL=DOCTOR_LEVEL.DLEVELSAL);
结果:

SELECT DOCTOR_INFORMATION.*,DOCTOR_LEVEL.*
FROM DOCTOR_INFORMATION
FULL JOIN DOCTOR_LEVEL
ON (DOCTOR_INFORMATION.DOCTORSAL=DOCTOR_LEVEL.DLEVELSAL);
结果:

一个SELECT-FROM-WHERE语句称为一个查询块,将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询
SELECT select_list
FROM tablename
WHERE expr_operator
(SELECT select_list
FROM table);
SELECT ENAME,DEPTNO,SAL
FROM EMP
WHERE SAL IN (
SELECT MAX(SAL)
FROM EMP
GROUP BY DEPTNO);
SELECT ENAME,SAL
FROM EMP
WHERE SAL>(
SELECT SAL
FROM EMP
WHERE ENAME='JONES');
语义为:
1.> ANY 大于子查询结果中的某个值
2.> ALL 大于子查询结果中的所有值
3.< ANY 小于子查询结果中的某个值
4.< ALL 小于子查询结果中的所有值
5.>= ANY 大于等于子查询结果中的某个值
6.>= ALL 大于等于子查询结果中的所有值
7.<= ANY 小于等于子查询结果中的某个值
8.<= ALL 小于等于子查询结果中的所有值
9.= ANY 等于子查询结果中的某个值
10.=ALL 等于子查询结果中的所有值(通常没有实际意义)
11.!=(或<>)ANY 不等于子查询结果中的某个值
12.!=(或<>)ALL 不等于子查询结果中的任何一个值
总结:

例:查找工资低于任何工种为‘CLERK’,且不是‘CLERK’的员工姓名
已知有如下查询结果:


SELECT ENAME ,DEPTNO, JOB,SAL
FROM EMP
WHERE SAL< ANY (
SELECT SAL
FROM EMP
WHERE JOB ='CLERK')
AND JOB<>'CLERK';
结果为:

带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。
由EXISTS引出的子查询,其目标列表达式通常都用 * ,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义
NOT EXISTS谓词
查询所有有职称的医生
SELECT DOCTORNAME,DOCTORSEX,DOCTORSAL
FROM DOCTOR_INFORMATION
WHERE EXITS(
SELECT *
FROM DOCTOR_LEVEL
WHERE DOCTOR_INFORMATION.DOCTORSAL=DOCTOR_LEVEL.DLEVELSAL);
结果:

集合操作的种类
参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同
先有如下已经得到的查询结果:


SELECT *
FROM EMP
WHERE JOB='MANAGER'
UNION
SELECT *
FROM EMP
WHERE DEPTNO='30';

SELECT *
FROM EMP
WHERE JOB='MANAGER'
INTERSECT
SELECT *
FROM EMP
WHERE DEPTNO='30';

SELECT *
FROM EMP
WHERE JOB='MANAGER'
MINUS
SELECT *
FROM EMP
WHERE DEPTNO='30';

文章不妥之处请大家包涵指正
对于基础概念想要了解的读者,以下文章可以供大家参考:
SQL语言概述与SQL语言的数据定义