语法:
SELECT [ DISTINCT ] * | 列名 | 表达式 [别名] [,...]
FROM 表名
[ WHERE 条件表达式 ] ;
说明:
1、条件查询使用WHERE子句来完成,WHERE子句必须紧跟在FROM子句后面。
2、条件表达式的格式为:列名 比较运算符 要比较的值 ,如 deptno = 10 表示部门编号为10号。
3、比较运算符包括 = 、>、>=、 <、 <=、 <>,含义分别是等于、大于、大等于、小于、小等于、不等于。
4、数值型、字符型、日期型数据都可以使用比较运算符进行比较。
5、字符型和日期型数据做为查询条件时,条件表达式右边的值,必须加单引号。
下面通过几个例子,体会不同数据类型的列做为查询条件的写法。
1、数值型列做为查询条件:
例:查询部门编号为20的员工编号、姓名、所在部门编号。
SELECT empno, ename, deptno
FROM emp
WHERE deptno=20;
查询结果如下:
EMPNO |
ENAME |
DEPTNO |
7369 |
SMITH |
20 |
7566 |
JONES |
20 |
7788 |
SCOTT |
20 |
7876 |
ADAMS |
20 |
7902 |
FORD |
20 |
2、字符型列做为查询条件:
例:查询职位为CLERK的员工编号、姓名、职位。
SELECT empno,ename,job
FROM emp
WHERE job='CLERK';
查询结果如下:
EMPNO |
ENAME |
JOB |
7369 |
SMITH |
CLERK |
7876 |
ADAMS |
CLERK |
7900 |
JAMES |
CLERK |
7934 |
MILLER |
CLERK |
3、日期型列做为查询条件:
例:查询入职日期在1985年1月1日之后的员工编号、姓名、入职日期。
SELECT empno,ename,hiredate
FROM emp
WHERE hiredate > '1985-01-01';
查询结果如下:
EMPNO |
ENAME |
HIREDATE |
7788 |
SCOTT |
1987-04-19 |
7876 |
ADAMS |
1987-05-23 |
接下来介绍4种常用的特殊比较运算符,分别是BETWEEN...AND...、IN、LIKE、IS NULL。
使用BETWEEN .. AND.. 可以查询出某列的值在某个范围内(包括边界值)的数据行。
语法:WHERE 列名 BETWEEN 值1 AND 值2;
例:查询工资在1000到1500之间的员工编号,姓名,工资。
SELECT empno,ename,sal
FROM emp
WHERE sal BETWEEN 1000 AND 1500;
通过结果可以看出,工资等于1000和1500的员工也被查出来了,所以BETWEEN..AND..是闭区间查询。
EMPNO |
ENAME |
SAL |
7521 |
WARD |
1000 |
7654 |
MARTIN |
1250 |
7844 |
TURNER |
1500 |
7876 |
ADAMS |
1100 |
7934 |
MILLER |
1300 |
使用IN运算符可以查询出某列的值是否和给定集合内的任意一个值相等。
语法:WHERE 列名 IN (值1, 值2, ....值n)
例:使用IN运算符,查询出部门为10号或者20号的员工编号,姓名,部门编号。
SELECT empno, ename, deptno
FROM emp
WHERE deptno IN (10 , 20)
通过结果可以看出,部门编号为10或20的员工都被查出来了。
EMPNO |
ENAME |
DEPTNO |
7369 |
SMITH |
20 |
7566 |
JONES |
10 |
7788 |
SCOTT |
20 |
7876 |
ADAMS |
10 |
7902 |
FORD |
20 |
使用LIKE运算符可以查询出某列的值是否满足关键字匹配,也叫模糊查询。如查询员工名字中含有字母S的员工,就可以使用LIKE运算符来解决。
先介绍两个通配符:
% : 百分号,代表匹配零个或任意个字符。
_ : 下划线,代表匹配1个任意字符。
例:查询员工姓名中以S开头的员工。
SELECT ename
FROM emp
WHERE ename LIKE 'S%';
结果如下:
ENAME |
SMITH |
SCOTT |
例:查询员工姓名中第二个字母是L的员工。
SELECT ename
FROM emp
WHERE ename LIKE '_L%';
结果如下:
ENAME |
ALLEN |
BLAKE |
CLARK |
如果想要在比较的时候区分大小写,可以在字符串前面添加关键字 BINARY
例:查询员工姓名中第二个字母是L的员工(值区分大小写)
select ename
from emp
where binary ename like '%L%';
select ename
from emp
where binary ename like '%l%';
如果要查询某列的值是否为NULL,使用 “列名 = NULL”是查询不出来的。只能使用 “列名 IS NULL”
例:查询上级为空的员工姓名、上级编号。
SELECT ename, mgr
FROM emp
WHERE mgr IS NULL;
结果如下:
ENAME |
MGR |
KING |
注意:查询某列不为空,使用 “列名 IS NOT NULL”
多条件查询是按照多个条件同时进行查询,查询出的结果集要同时满足多个条件。多个条件之间需要使用逻辑运算符进行连接。
语法:
SELECT [ DISTINCT ] * | 列名 | 表达式 [别名] [,...]
FROM 表名
[ WHERE 条件表达式1 逻辑运算符 条件表达式2 ] ;
说明:
逻辑运算符包含逻辑与 AND,逻辑或 OR,逻辑非 NOT。下表分别介绍3类逻辑运算符的含义。
运算符 |
含义 |
AND |
逻辑与,用来连接两个条件表达式。如果每个条件表达式的结果都为TRUE,整个表达式的结果才为TRUE。 |
OR |
逻辑或,用来连接两个条件表达式。只要有1个条件表达式的结果为TRUE,整个表达式的结果就为TRUE。 |
NOT |
逻辑非,用来对条件表达式取反。TRUE取反为FALSE,FALSE取反为TRUE。 |
例:查询工资大于1100且职位为‘CLERK’的员工编号、姓名、职位、工资。
分析:本题查询出的员工,需要同时满足两个条件,条件1:工资>1100,条件2:职位='CLERK',因此本题可以用逻辑与来解决,SQL语句为:
SELECT empno, ename, job, sal
FROM emp
WHERE sal>=1100
AND job='CLERK';
例:查询工资大于1100或职位为‘CLERK’的员工编号、姓名、职位、工资。
分析:本题查询出的员工,只需要满足‘工资>1100’ 或‘职位='CLERK' ’中的一个条件即可,因此本题可以用逻辑或来解决,SQL语句为:
SELECT empno, ename, job, sal
FROM emp
WHERE sal>=1100
OR job='CLERK';
例:查询职位不为CLERK的员工编号、姓名、职位、工资。
分析:本题查询出的员工,需要满足的条件“职位不是CLERK”。那如何用条件表达式表示职位不是CLERK呢? 我们可以先写出职位是CLERK的条件表达式 job = 'CLERK',然后加上逻辑非就可以,因此SQL语句为:
SELECT empno, ename, job, sal
FROM emp
WHERE NOT (job='CLERK');
当然,本题直接使用比较运算符解决更简单,如下:
SELECT empno, ename, job, sal
FROM emp
WHERE job <> 'CLERK';
NOT运算符还可以和BETWEEN…AND、IN、LIKE、IS NULL一起使用,表示的含义分别为:
NOT BETWEEN .. AND .. :不在某个区间
NOT IN (集合):不在某个集合内
NOT LIKE :不像.....
IS NOT NULL: 不是空
例:
1.查询工资不在3000到5000之间的员工姓名
SELECT ename
FROM emp
WHERE sal NOT BETWEEN 3000 AND 5000;
2.查询部门该编号不在10号或20号的员工姓名
SELECT ename
FROM emp
WHERE deptno NOT IN (10,20);
3.查询姓名不以字母D开头的员工姓名
SELECT ename
FROM emp
WHERE ename NOT LIKE 'D%';
4.查询有津贴的员工姓名
SELECT ename
FROM emp
WHERE comm IS NOT NULL;
至此,我们已经学习了算术运算符、比较运算符、特殊比较运算符、逻辑运算符,如果在一个WHERE子句中,这几种运算符同时出现,那么各种预算符的优先级如何呢?
运行如下SQL语句,分析查询结果。
SELECT ename, job, sal
FROM emp
WHERE job='SALESMAN'
OR job='PRESIDENT'
AND sal>1500;
ENAME |
JOB |
SAL |
ALLEN |
SALESMAN |
1600 |
WARD |
SALESMAN |
1250 |
MARTIN |
SALESMAN |
1250 |
KING |
PRESIDENT |
5000 |
TURNER |
SALESMAN |
1500 |
通过如上结果可以看出,该SQL语句,查询出:
职位是SALESMAN工资不限,或者职位是PRESIDENT同时工资大于1500的员工信息。
而我们实际想查询的可能是:
职位是SALESMAN工资高于1500,或者职位是PRESIDENT同时工资大于1500的员工信息
为什么会出现这种查询结果呢? 因为AND的优先级比OR高,上面WHERE子句的3个表达式,会优先完成AND条件表达式判断,然后再和第一个条件表达式做OR判断。
因此,如果想要查询出我们想要的结果,可以通过增加()来改变优先级,修改后的SQL如下:
SELECT ename, job, sal
FROM emp
WHERE ( job='SALESMAN'
OR job='PRESIDENT')
AND sal>1500;
该语句的查询结果如下。
ENAME |
JOB |
SAL |
KING |
PRESIDENT |
5000 |
ALLEN |
SALESMAN |
1600 |
各种运算符的优先级如下表。
优先级 |
运算分类 |
运算符举例 |
1 |
算术运算符 |
*, \, +, - |
2 |
比较运算符 |
=, <>, <, >, <=, >= |
3 |
特殊比较运算符 |
BETWEEN..AND.. ,IN,LIKE,IS NULL |
4 |
逻辑非 |
NOT |
5 |
逻辑与 |
AND |
6 |
逻辑或 |
OR |
SELECT [ DISTINCT ] * | 列名 | 表达式 [别名] [,...]
FROM 表名
[WHERE 条件]
[ORDER BY 列名1 | 列别名1 | 列序号1 [ ASC | DESC ], 列名2 | 列别名2 | 列序号2 [ ASC | DESC ];
说明:
1、ORDER BY子句前面的内容,已经讲过,不再赘述。
2、可以按照3种方式进行排序:分别是按列名排序、按列别名排序、按列序号排序。
3、ASC表示按升序排序(默认值), DESC表示按降序排序。
4、可以同时按照多个列名进行排序
5、ORDER BY 子句必须写在SELECT语句的最后
6、数字升序排列小值在前,大值在后。即按照数字大小顺序由小到大排列。
7、日期升序排列相对较早的日期在前,较晚的日期在后。
8、字符升序排列按照字母由小到大的顺序排列,即由A-Z排列。
9、空值在升序排列中排在最前面,在降序排列中排在最后。
例:查询所有员工姓名,职位,部门编号,入职日期,并把结果集按入职日期升序排序。
SELECT ename, job, deptno, hiredate
FROM emp
ORDER BY hiredate;
注意观察下面查询结果。
ENAME |
JOB |
DEPTNO |
HIREDATE |
SMITH |
CLERK |
20 |
1980-12-17 |
ALLEN |
SALESMAN |
30 |
1981-02-20 |
... |
例:查询所有员工姓名,职位,部门编号,入职日期,并把结果集按入职日期降序排序。
SELECT ename, job, deptno, hiredate
FROM emp
ORDER BY hiredate DESC;
注意观察下面查询结果。
ENAME |
JOB |
DEPTNO |
HIREDATE |
ADAMS |
CLERK |
20 |
1987-05-23 |
SCOTT |
ANALYST |
20 |
1987-04-19 |
MILLER |
CLERK |
10 |
1982-01-23 |
... |
例:查询所有员工编号,姓名,全年工资总和,并把结果集按全年工资总和升序排序,全年工资总和的别名是 annsal。
SELECT empno, ename, sal*12 annsal
FROM emp
ORDER BY annsal;
注意观察下面查询结果
EMPNO |
ENAME |
ANNSAL |
7369 |
SMITH |
9600 |
7900 |
JAMES |
11400 |
7876 |
ADAMS |
13200 |
7654 |
MARTIN |
15000 |
7521 |
WARD |
15000 |
7934 |
MILLER |
15600 |
7844 |
TURNER |
18000 |
... |
ORDER BY子句后的列名也可以写数字,该数字是SELECT语句后列的顺序号。
例:
SELECT ename, deptno, sal
FROM emp
ORDER BY 2 ;
此处的2代表的是deptno列。
ENAME |
DEPTNO |
SAL |
KING |
10 |
5000 |
CLARK |
10 |
2450 |
MILLER |
10 |
1300 |
FORD |
20 |
3000 |
.... |
ORDER BY子句后的排序列名也可以同时写多个。
例:
SELECT ename, deptno, sal
FROM emp
ORDER BY deptno ASC, sal DESC;
该SQL的作用是查询员工姓名,部门编号,工资,并把查询结果集先按照部门编号升序排序,如果有相同部门编号的数据再按照工资降序排序。
ENAME |
DEPTNO |
SAL |
KING |
10 |
5000 |
CLARK |
10 |
2450 |
MILLER |
10 |
1300 |
FORD |
20 |
3000 |
... |