语法:
SELECT 查询语句 FROM 表名 WHERE 筛选条件
查询顺序:
1、表名,查询来自哪张表
2、筛选条件,在选定表中按条件来筛选
3、查询语句,查询筛选后的字段
分类:
一、按条件表达式筛选
条件运算符:
> 、< 、 = 、!=、<>、>=、<=
二、按逻辑表达式筛选
逻辑运算符:
&& =and、||=or、!=not
三、模糊查询
like、between、 and、in、is null
一、按条件表达式筛选
案例1:查询工资>15000的员工信息
SELECT
*
FROM
employees
WHERE salary > 15000;
案例2:查询部门编号不等于90号的员工名和部门
方式1: !=
select
last_name,
department_id
from
employees
where department_id != 90;
方式2: <>
(数据库一般用<>)
select
last_name,
department_id
from
employees
where department_id <> 90 ;
二、按逻辑表达式筛选
案例1:查询工资在15000到20000之间的员工表、工资以及奖金
select
last_name,
salary,
commission_pct
from
employees
where salary >= 15000
and salary <= 20000 ;
案例2:查询部门编号不是在90到110之间,或者工资高于15000的员工信息
SELECT
*
FROM
employees
WHERE
(department_id>=90 AND department_id<=99) OR salary<1000
案例3:查询部门编号是在90到99之间,或者工资高于1000的员工信息
select
*
from
employees
where
(department_id>=90 and department_id<=100) or salary<1000;
三、模糊查询
1)、like
特点:一般和通配符搭配使用
通配符:
%
: 任意多个字符包括零个字符
_
: 任意单个字符
案例1:查询员工中包含字符z的员工信息
SELECT
*
FROM
employees
WHERE
last_name LIKE '%z%';
案例2:查询员工名中第三个字符为n,第五个字符为l的员工名和工资
SELECT
last_name,
salary
FROM
employees
WHERE last_name LIKE '__n_l%' ;
案例3:查询员工名中第二个字符为 _
的员工名
方式1:在第二个 '_'
字符前要加上转义字符
SELECT
last_name
FROM
employees
WHERE last_name LIKE '_\_%' ;
方式2:在第二个 '_'
字符前加上任意字符/字母,用escape表明,该字符/字母是一个转义字符。
SELECT
last_name
FROM
employees
WHERE last_name LIKE '_$_%' ESCAPE '$' ;
2)、between and
注意:
1、使用between and可以提高语句的简洁度
2、包含临近值
3、两个临界值不要调换顺序
案例:查询员工编号在100在105之间的员工信息
方式1:可用比较运算符
SELECT
*
FROM
employees
WHERE employee_id >= 100
AND employee_id <= 105 ;
方式2:between and
SELECT
*
FROM
employees
WHERE employee_id BETWEEN 100
AND 105 ;
3)、in
含义:判断某字段的值是否属于in列表中的某一项
1)、使用in提高语句的简洁度
2)、in列表的值类型必须一致或兼容
案例:查询员工的工种编号IT_PROG、AD_VP、AD_PRES中的一个员工名和工种编号
方式1:用or语句较为繁琐
select
last_name,
job_id
from
employees
where
job_id = 'IT_PROT'
or job_id = 'AD_VP'
or job_id = 'AD_PRES';
方式2:in语句较为简洁
select
'last_name',
'job_id'
from
employees
where job_id in (
'IT_PROT',
'AD_VP',
'AD_PRES'
) ;
4)、is null
= 或 <> 不能判断null值
IS NULL 和 IS NOT NULL 可以判断null值
案例1:查询没有奖金的员工名和奖金率
SELECT
last_name,
commission_pct
FROM
employees
WHERE commission_pct IS NULL ;
案例2:查询有奖金的员工名和奖金率
SELECT
last_name,
commission_pct
FROM
employees
WHERE commission_pct IS NOT NULL ;
安全等于 ( <=>
)
案例:查询没有奖金的员工名和奖金率
SELECT
'last_name',
'commission_pct'
FROM
'employees'
WHERE
'commission_pct' <=> NULL;
案例二:工资为12000的员工信息
SELECT
last_name,
salary,
commission_pct
FROM
employees
WHERE salary <=> 12000 ;
is null PK <==>
IS NULL:仅仅可以判断NULL 可读性较高,建议使用
<=>:既可以判断NULL值也可以判断普通数值,可读性较低
练习题
1、查询没有奖金且工资小于2500的salary,last_name
SELECT
salary,
last_name
FROM
employees
WHERE commission_pct IS NULL
AND salary < 2500 ;
2、查询employees表中,job_id不为‘ST_CLERK’或者工资为25000的员工信息
SELECT
*
FROM
employees
WHERE job_id <> 'ST_CLERK'
OR salary = 25000 ;
3、查看部门departments表的结构
DESC departments;
4、查询部门departments表中设计到了那些位置编号
SELECT DISTINCT
location_id
FROM
departments ;
5、经典面试题目,试问:
SELECT * FROM employees
和
SELECT
*
FROM
employees
WHERE
commission_pct LIKE '%%' AND last_name LIKE '%%';
结果是否一样,说明以下原因?
答:不一样,如果判断的字段有null值,结果不一样,没有null,结果一样。
查出来的结果分别如下:
若将and改为or?
SELECT * FROM employees
和
SELECT
*
FROM
employees
WHERE commission_pct LIKE '%%'
OR last_name LIKE '%%'
OR employee_id LIKE '%%' ;
结果一样,or连接的字段只要有一方不为空均可。