[玩转SQL]:02 条件语句与排序

SELECT 更高的用法可以使用WHERE提供查询条件.


WHERE语句


语法:

SELECT * | {[DISTINCT] column|expression [alias]...}
FROM   table
[WHERE condition(s)];

通过WHERE后边子句的表达返回True or False来判断是否满足条件.

WHERE子句不可以使用别名.

WHERE通常跟在FROM后边.


--查询deparment_id为90的列
SELECT employee_id,last_name, job_id, department_id
FROM   employees
WHERE  department_id = 90;

   


如果WHERE里边判断字符串或日期的条件需要使用单引号‘.

SELECT last_name,job_id, department_id
FROM   employees
WHERE  last_name = ‘Whalen‘;

   


条件中字符串型大小写敏感.

SELECT last_name,job_id, department_id
FROM   employees
WHERE  last_name = ‘WHALEN‘;

   


若不知道大小写可以使用upper或者lower函数

SELECT last_name,job_id, department_id
FROM   employees
WHERE  UPPER(last_name) = ‘WHALEN‘;
SELECT last_name,job_id, department_id
FROM   employees
WHERE  LOWER(last_name) = ‘whalen‘;

   

UPPER函数将需要查询的列全部转化为大写.

LOWER函数将需要查询的列全部转化为小写.


SQL比较表达式

=
等于

大于
>=
大于等于
<小于
<= 小于等于

<>

不等于 也可以写成 != ^= 推荐使用!=

BETWEEN … AND …    

大于等于某个值,小于等于某个值

IN(set) 

判断是否在集合里边

LIKE  

模糊查询

IS NULL 

判断是否是NULL


--查询月薪小于等于3000美金的员工
SELECT last_name,salary
FROM   employees
WHERE  salary <= 3000;

   


--查询大于等于2500美金或者小于等于3500美金的员工
SELECT last_name,salary
FROM   employees
WHERE  salary BETWEEN 2500 AND 3500;

   


--查询manager_id 等于 100 或者 101 或者 201的员工
SELECT employee_id,last_name, salary, manager_id
FROM   employees
WHERE  manager_id IN (100, 101, 201);

   

manager_id IN (100, 101, 201)

等同于

manager_id = 100 OR manager_id= 101 OR manager_id = 201

 

若使用IN方式在运行时数据库自动转换为OR方式.

若注重可读性使用IN.

若注重速度使用OR.


匹配查询


% 匹配 0-N个字符

_ 匹配 1个字符

--查找first_name S开头的员工
SELECT first_name
FROM   employees
WHERE  first_name like ‘S%‘;

   


若要匹配的字符中包含特殊字符%或者_ 要进行ESCAPE指定的转义符转义.


--查找JOB_Id包含SA_的员工
SELECT employee_id,last_name, job_id
FROM   employees
WHERE  job_id LIKE ‘%SA\_%‘ ESCAPE ‘\‘;

   


--查找manager_id为null的员工
SELECT last_name,manager_id
FROM   employees
WHERE  manager_id IS NULL;

   


--查找manager_id不为null的员工
SELECT last_name,manager_id
FROM   employees
WHERE  manager_id IS NOT NULL;

   



逻辑运算符

 

AND OR NOT 与计算机"与或非"逻辑相同.

--查询职位为manager并且薪水大于等于10000美金的员工
SELECT employee_id,last_name, job_id, salary
FROM   employees
WHERE  salary >= 10000
AND    job_id LIKE ‘%MAN%‘;

   


--查询职位不是IT_PROG、ST_CLERK、SA_REP的员工
SELECT last_name,job_id
FROM   employees
WHERE  job_id
NOT IN (‘IT_PROG‘,‘ST_CLERK‘, ‘SA_REP‘);

   


运算符优先级


算数表达式 

链接表达式 

比较表达式 

IS [NOT] NULL, LIKE, [NOT] IN 

[NOT] BETWEEN 

!= <> ^= 

NOT 

AND 

OR 

如果不确定优先级可以使用小括号来提高优先级.


ORDER BY排序


相同SQL查询的结果有时会返回的相同数据不同顺序的情况.

 

ASC  升序 (默认是此选项)

DESC 降序

 

ORDER BY 是放在SQL语句的最后边.

--查询入职时间并以升序排序
SELECT last_name,job_id, department_id,hire_date
FROM   employees
ORDER  BY hire_date;

   


ORDER BY 可以使用列别名

--查询所有员工的年终奖并以从高到底排列
SELECT employee_id,last_name, salary*12 lol
FROM   employees
ORDER BY lol DESC;

可简写为

SELECT employee_id,last_name, salary*12 lol
FROM   employees
ORDER BY 3 DESC;

数字对应colums出现的位置

   



ORDER BY可对应多个排序

--department_id升序排序,salary降序排列
SELECT last_name,department_id, salary
FROM   employees
ORDER  BY department_id, salary DESC;

   

若排序时出现NULL

ASC  NULL放在最后

DESC NULL放在最开始

可通过NULLS FIRST 或者 NULLS LAST指定NULL值的位置.


引用变量


变量字符 & 或者 &&

SELECT employee_id,last_name, salary, department_id
FROM   employees
WHERE  employee_id = &employee_num;

每次执行会提示输入变量&employee_num的值.

   



若变量内容是字符串或者日期需要加上单引号

SELECT last_name,department_id, salary*12
FROM   employees
WHERE  job_id = ‘&job_title‘


一条SQL中可使用多个变量.

SELECT employee_id,last_name, job_id, &column_name
FROM   employees
ORDER  BY &column_name;

   


相同变量提示输入两次.

第一次出现用两个&&以后出现使用一个&即可.

SELECT employee_id,last_name, job_id, &&column_name
FROM   employees
ORDER  BY &column_name;

   


使用DEFINE定义变量可直接运行变量SQL语句.


设定verify OFF可以去除提示信息

   


本文出自 “会飞的唐老鸭” 博客,请务必保留此出处http://softomg.blog.51cto.com/9068693/1435037

[玩转SQL]:02 条件语句与排序,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。